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
(the monthly canary.yml run exercises exactly this path against the newest
upstream release and opens an issue on failure). OpenRocketInstance.profile_exact
is False throughout — the canary does not assert the flag, it runs on it.
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.