The build steps now declare 'runs-on: self-hosted' (default label
advertised by an act_runner registered with Docker mode). Previously
they used 'ubuntu-22.04' which would not match any default runner and
would leave every job in 'no runner available'.
ci.yml matrix extended to ['3.10','3.11','3.12','3.13'] for forward
coverage on Python 3.13 (current stable as of 2026).
docs/development.md 'CI/CD - Gitea Actions' section also corrected:
- the egress workaround now uses the actual Gitea 1.26 key
[actions].DEFAULT_ACTIONS_URL (not ENABLE_GITHUB_ACTIONS_MIRROR)
- the act_runner docker command uses --rm -it for the first run to
surface registration errors in the terminal before daemonization
- runner-scoping note clarifies global vs repo-scoped token URLs
Verified by ruff_exit=0 and pytest 66/66 still green locally.
The '## CI minima' section claimed CI was optional and pointed to a
sample YAML, which is now wrong: real workflows live in .gitea/workflows/
and the missing piece is the runner registration, not the YAML.
New section covers:
- inventory of ci.yml + release.yml (matrix, trigger, concurrency)
- step-by-step act_runner registration with docker command
- egress to github.com requirement + mirror workaround
- pip cache key behaviour for the matrix
- tag pattern + manual v0.2.0 badge update checklist
- .gitea/workflows/ci.yml: ruff + matrix pytest on 3.10/3.11/3.12
on push and PR to main; concurrency cancels superseded runs
- .gitea/workflows/release.yml: gate (ruff + pytest) + build sdist/wheel
on tag 'v*', uploads via actions/upload-artifact@v4
- README.md: add ci and version badges right under H1
- src/viandante/cli.py: drop unused prompt_toolkit.patch_stdout import
- tests/test_deadsouls.py: add missing RoomBlock import (F821)
- tests/test_logger.py: drop unused local 'raw' in unicode test
- tests/test_mapper.py: rename unused locals to _a/_b/_c (F841) to
preserve intent (B has 's' back-edge; C is orphan)
Position: between the intro paragraph and the Changelog section.
Tagline surfaces project identity (Italian for 'wanderer');
the tiny ASCII map mirrors the renderer's actual output.
The Changelog lives between the project title and the Requisiti
section. Records GMCP decoder, mapper BFS, EventLogger JSONL+MD,
slash commands, asyncio hardening, the progetto2 -> viandante
rename and the docs/ folder.