Maintainer notes¶
Working agreements live in AGENTS.md; this page holds the procedures.
Releasing¶
Releases publish to PyPI via Trusted Publishing — no tokens.
- Stamp the version: set
versioninpyproject.toml(drop the.devsuffix) and retitle the[Unreleased]changelog section, onmain. gh release create vX.Y.Z --title "orlab X.Y.Z" --notes ...release.ymlgates onjust check && just test, builds withuv build, refuses a dist whose version doesn't match the tag (or any pre-release string), and publishes. Then bumpmainto the next.dev0.
Manual fallback: workflow_dispatch on any ref containing the workflow,
with the exact expected_version as input.
Supporting a new OpenRocket release¶
One PR:
uv run python tools/generate_profile.py <new jar>— reflects the jar and verifies the contract manifest (fails loudly, naming missing members, if the jar breaks anything orlab touches).uv run python tools/generate_enums.py— regenerates the union enums.- Register the new module in
src/orlab/profiles/__init__.pyand add the version + sha256 tosrc/orlab/_pins.pyand the CI matrix inci.yml(the integration suite andfetch_jarboth read the pins; changing_pins.pyalso rolls the CI jar caches). just test && just test-integration.
Until that PR lands, the new release runs on the nearest older profile with
a warning (the monthly canary.yml run checks exactly this and opens an
issue on failure).
Test tiers¶
just test— unit suite, jar-free, sub-second; runs on every push and PR (CI test matrix) and gates every release build.just test-integration— real simulations against every supported jar (sha256-pinned, cached in~/.cache/orlab-jarsor$ORLAB_JAR_CACHE);ORLAB_TEST_VERSION=24.12limits to one version, as the CI matrix does.