Parapet main is the stable release line after v1.0.0.
Operating Model
- Every merge to
mainmust keep the repo releasable. release_gateis the canonical merge-readiness signal formain, enforced via branch protection withenforce_admins: true— no bypass.- Version cuts happen through Release Please PRs generated from conventional commits on
main. - Patch and minor releases are published by letting the auto-merged Release Please PR land. The release workflow activates auto-merge as soon as the PR opens; GitHub merges it when
release_gateis green. No human merge action is required for routine release trains. - If
mainis green and release truth is coherent, the default stance is silence on the wire: no milestone churn, no release drama, no invented work.
Work Classes
- Stable-line work: small fixes, docs, CI hygiene, packaging truth, and maintenance that preserves the released line.
- Feature work: additive behavior or meaningful product-surface expansion. Serious feature work must begin in a dedicated PR branch and should be scoped before it becomes milestone work.
- Release work: handled automatically — Release Please opens the PR, the action activates auto-merge, CI gates the cut, the
publish-hexjob tags and publishes after merge.
Quiet Default
- No active milestone is required just because candidate work exists.
- Deferred maturity items stay parked until a concrete slice is worth opening.
- If there is no concrete release-affecting work, the correct answer is that there is nothing to do.
Release Truth (contract enforced by CI)
The release_gate status check is what guarantees release truth — it must be green before the release PR can merge. The check requires:
- Lint passes (formatting, credo, dialyzer, public-API gate, docs-with-warnings-as-errors).
- Test passes against a real Postgres.
- Demo smoke test passes.
- No one-off
release-aspin inrelease-please-config.json(unless a deliberate staged cut is in progress).
If any of those go red, the auto-merge sits unfilled and the cut blocks. No release publishes until the gate is green again.
Manual Intervention
Auto-merge does the routine work. A human steps in only for these cases:
- Deliberate staged cut — push a commit with a
Release-As: x.y.zfooter to override the version Release Please would compute (used during thev0.10.0→v1.0.0arc and thev1.0.0→v1.0.1cap). - Hold a cut — apply a
do-not-mergelabel to the Release Please PR (orgh pr edit <n> --add-label "do-not-merge"), or close the PR. Auto-merge will pause until the label is removed and CI passes again. .release-please-manifest.jsonrepair — the manifest is Release Please state, not a hand-edited operator control. Touching it manually is reserved for breaking out of a stuck train.- Co-maintainer joins — the
required_approving_review_count: 0setting on branch protection assumes a solo maintainer. The moment a second human maintainer joins, revisit the review requirement.
Non-Goals
- Parapet does not auto-publish on every merge to
main— only Release Please PR merges trigger publish. - Active milestones do not downgrade
mainto an unstable branch. .release-please-manifest.jsonis Release Please state, not a hand-edited operator control.- Serious feature work is not ambient background activity on
main; it belongs in explicit PR-shaped trains.