Skip to content

Contributing

Python 3.11–3.14 are supported, and CI runs the full matrix.

Setup

The project uses mise and Poetry.

$ mise install
$ poetry install

Checks

Tasks are defined in mise.toml; mise tasks lists them all.

$ mise run test:py      # the test suite
$ mise run lint:py      # ruff, mypy, pylint, import-linter, codespell, vulture
$ mise run format       # black, ruff --fix, taplo

tingle dogfoods its own CI gate — tingle check runs on every pull request, so a branch that takes on debt fails the build.

Docs

The documentation site is MkDocs + Material, built from docs/ and published to GitHub Pages from main.

$ mise run docs:serve   # live-reloading preview on localhost:8000
$ mise run docs:build   # strict build; fails on broken internal links

The docs dependency group is optional, so a plain poetry install does not pull in MkDocs. Both tasks install it on demand.

Architecture

The source follows the GLIMPSE layout, and the layer boundaries are enforced by import-linter contracts in pyproject.toml — a violating import fails CI.

Layer Responsibility
pacts contracts — depends on nothing
specs invariants — depends only on pacts
mills logic, no IO
links IO adapters
gates CLI
inits wiring

specs is imported only by mills; gates and inits reach it indirectly through mills, which is by design.