feat(release): version.txt base for bundle, required-image release posture, unified-lane docs (RIG-2916) - #743
Merged
Conversation
This was referenced Aug 30, 2026
|
Compass engineering docs preview: https://compass-native-rig-2916-t5-c.compass-eng-docs.pages.dev Deployed from Changed pages: |
rigel-mintaka
marked this pull request as ready for review
August 30, 2026 18:03
rigel-mintaka
force-pushed
the
compass-native/rig-2915-release-gated-jobs
branch
from
August 30, 2026 19:04
8a53400 to
fda0de1
Compare
rigel-mintaka
force-pushed
the
compass-native/rig-2916-t5-code
branch
from
August 30, 2026 19:06
7ffbc59 to
63fefb8
Compare
Base automatically changed from
compass-native/rig-2915-release-gated-jobs
to
main
August 30, 2026 19:29
…sture, unified-lane docs (RIG-2916) The code half of T5 of the frozen compass-unified-release-lane design. The tag-ruleset repoint half of T5 is a GitHub settings surface handled in the T6 human-action issue, not here. - app-bundle/build.sh: retarget the version base from the hardcoded `0.1.0` to the root `version.txt` (release-please's source of truth), keeping the `+g<shortsha>` dev/bundle suffix (design §A2). After the first real bump a hardcoded base would silently report stale, and the SMOKE version-containment assert would keep passing against the wrong base. Read version.txt on its own line so `cat` is the sole (thus last) command substitution `set -e` inspects in the assignment — a composite `v="$(cat …)+g$(git …)"` swallows a failing `cat` because set -e only inspects the last substitution's status — plus a non-empty guard for a present-but-empty file. A missing/empty version.txt now fails loud (§A2 intent). - tools/release-notes/index.ts: at RELEASE time a null container image is a hard failure, not a degradation — a published vX.Y.Z with no resolvable image violates the one-version-spans-the-product invariant (§A2). New pure, exported, unit-tested helper `requireImageAtRelease` beside `classifyImageResult`; `main()` throws on a release-time null image after `gatherImage`, before the expensive nix-outputs gather. The release-time signal is `!dryRun` (no new CLI flag): the tool's only real-write invocation is the release-assets job; `--dry-run` is the preview path. The pure `assemble()` core and `classifyImageResult` are untouched — the dry-run path still degrades to IMAGE_ABSENT_LINE, preserving the T3/T5 boundary. The `--tag` input is opaque passthrough (nothing parses its shape; assemble() only prints it), so the new semver vX.Y.Z tag flows through unchanged — documented, no code change. - docs/architecture/build-and-ci.md: rewrite the "Publishing the agent image" section to the unified release.yml lane — the per-push publish-image job (:git-<sha> + :latest), the release-gated release-image job (digest-re-tags to :vX.Y.Z, same digest, no rebuild), and the release-please standing-Release-PR cadence. Points at the frozen record. The standalone publish-agent-image.yml still exists; its retirement is a separate follow-up (T4), so the prose does not claim it is deleted. The pre-merge-check inputs now correctly mirror the publish-image job's in-job changed-path gate closure set — release.yml carries no `paths:` trigger filter (release-pr needs every commit), so the job self-gates. - docs/designs/platform/compass-unified-release-lane.md: two frozen-record amendments folded here because the slice already owns the unified-lane docs and `platform` is not a design-ledger-governed bucket (no touch-coupling / ledger delta applies). (1) Flip the `Status:` header Draft -> Active: the design PR (#736) merged = freeze, so the in-force contract is Active per the design skill; the header is sanctioned lifecycle state, not frozen content. (2) Correct the OQ-N1 bump-semantics erratum per Matt's RIG-2997 ruling: the frozen prose read `feat:` -> MINOR, contradicting the config it cites (`bump-patch-for-minor-pre-major` damps `feat:` to PATCH) — the self-contradiction RIG-2997 flagged. Matt ruled both `feat:` and `fix:` bump PATCH, a MINOR is a deliberate manual `release-as` in a separate PR. Config-as-built (T1, both flags) is already correct; only the prose changes. Verified: bun test tools/release-notes/ = 22 pass / 0 fail (18 pre-existing + 4 new requireImageAtRelease cases); bash -n build.sh OK; red-green proof that a missing/empty version.txt now aborts; biome + markdownlint clean. Spec-impact: OQ-N1 prose erratum only (config-as-built unchanged); implements frozen §T5 code half; §A2 version.txt promise, previously unowned, now realized. Refs RIG-2916 Refs RIG-1746 Co-authored-by: Matt Wilkinson <matt@rigel.build>
rigel-mintaka
force-pushed
the
compass-native/rig-2916-t5-code
branch
from
August 30, 2026 19:32
63fefb8 to
64ca277
Compare
mattwilkinsonn
approved these changes
Aug 30, 2026
mattwilkinsonn
added a commit
that referenced
this pull request
Aug 30, 2026
…ane (RIG-2994) (#756) * ci: retire publish-agent-image.yml, folded into the unified release lane (RIG-2994) T4 of the unified-release-lane design (RIG-1746, DL-300): the standalone per-push GHCR publish workflow retires now that its duty runs in the unified release.yml `publish-image` job. - Delete `.github/workflows/publish-agent-image.yml`. The per-push `:git-<sha12>` + `:latest` publish duty (verbatim `agent-image/publish.sh`, same closure-paths gate, same serialize / immutability / two-copy-coherence / least-privilege / off-hot-path posture) now lives in the unified lane's `publish-image` job on RigelBuild/compass main. - Update the superseded-in-part note on `docs/designs/infra/ci/compass-agent-image-publish/design.md` to record the retirement as done (the RIG-1746 note already prescribed the two-PR staged delete; this completes it). Every other decision in that record — the `:git-<sha>` immutable tag contract, the build-once/push-each-tag skopeo mechanism, the auth pin, the linux/amd64 platform contract, the public-visibility ruling — stays live and is carried into the unified lane; the record remains the cited authority for the baked `:git-<sha>` pin. Two-PR staging satisfied before this delete: RIG-2914/2915/2916 landed release.yml on main (#743 mergeCommit 867159a), and three green per-push `publish-image` runs were observed on real main pushes (5219558 8m1s, 7eddb90 9m37s, 7188de6 8m20s) — the relocated duty is proven end-to-end. Per-push GHCR consumers (ci.yml dogfood DL-112, app-bundle SMOKE.md, the baked :git-<sha> pin) consume the published tags, which the unified lane still produces, so they are unaffected by removing the workflow file. Ledger-impact: none — the CI-placement supersession was already recorded by RIG-1746 (DL-298–301); this PR completes the prescribed file retirement and carries no new ledger decision. Co-authored-by: Matt Wilkinson <matt@rigel.build> * docs(build-and-ci): mark publish-agent-image.yml retirement done (RIG-2994) Review low on #756: the architecture doc still framed the standalone workflow retirement as a pending follow-up. It has happened in this PR, so update the prose to past tense (the file is retired, its per-push publish duty relocated into release.yml publish-image). Ledger-impact: none — doc-accuracy tense fix, no design decision. Co-authored-by: Matt Wilkinson <matt@rigel.build> * docs: sweep dangling publish-agent-image.yml citations (RIG-2994) Two live-surface comments still named the deleted workflow. Retarget them to the current source of truth so nothing dangles after the file retires: - ci.yml image-affected detector: the closure source of truth is now release.yml IMAGE_CLOSURE_PATHS, not publish-agent-image.yml on.push.paths. - tools/release-notes: the GHCR repo + digest-query citations point at release.yml's publish-image job, not the deleted file's line numbers. Comment-only; release-notes tests 22 pass. Frozen docs/designs/** citations are historical (pinned HEAD) and intentionally left. Ledger-impact: none — comment retargeting, no design decision. Co-authored-by: Matt Wilkinson <matt@rigel.build> --------- Co-authored-by: Matt Wilkinson <matt@rigel.build>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
The code half of T5 of the frozen compass-unified-release-lane design.
The tag-ruleset repoint half of T5 is a GitHub settings surface handled
in the T6 human-action issue, not here.
app-bundle/build.sh: retarget the version base from the hardcoded
0.1.0to the rootversion.txt(release-please's source of truth),keeping the
+g<shortsha>dev/bundle suffix (design §A2). After thefirst real bump a hardcoded base would silently report stale, and the
SMOKE version-containment assert would keep passing against the wrong
base. Read version.txt on its own line so
catis the sole (thuslast) command substitution
set -einspects in the assignment — acomposite
v="$(cat …)+g$(git …)"swallows a failingcatbecauseset -e only inspects the last substitution's status — plus a non-empty
guard for a present-but-empty file. A missing/empty version.txt now
fails loud (§A2 intent).
tools/release-notes/index.ts: at RELEASE time a null container image
is a hard failure, not a degradation — a published vX.Y.Z with no
resolvable image violates the one-version-spans-the-product invariant
(§A2). New pure, exported, unit-tested helper
requireImageAtReleasebeside
classifyImageResult;main()throws on a release-time nullimage after
gatherImage, before the expensive nix-outputs gather.The release-time signal is
!dryRun(no new CLI flag): the tool'sonly real-write invocation is the release-assets job;
--dry-runisthe preview path. The pure
assemble()core andclassifyImageResultare untouched — the dry-run path still degrades to IMAGE_ABSENT_LINE,
preserving the T3/T5 boundary. The
--taginput is opaque passthrough(nothing parses its shape; assemble() only prints it), so the new
semver vX.Y.Z tag flows through unchanged — documented, no code change.
docs/architecture/build-and-ci.md: rewrite the "Publishing the agent
image" section to the unified release.yml lane — the per-push
publish-image job (:git- + :latest), the release-gated
release-image job (digest-re-tags to :vX.Y.Z, same digest, no
rebuild), and the release-please standing-Release-PR cadence. Points
at the frozen record. The standalone publish-agent-image.yml still
exists; its retirement is a separate follow-up (T4), so the prose does
not claim it is deleted. The pre-merge-check inputs now correctly
mirror the publish-image job's in-job changed-path gate closure set —
release.yml carries no
paths:trigger filter (release-pr needs everycommit), so the job self-gates.
docs/designs/platform/compass-unified-release-lane.md: two frozen-record
amendments folded here because the slice already owns the unified-lane
docs and
platformis not a design-ledger-governed bucket (notouch-coupling / ledger delta applies). (1) Flip the
Status:headerDraft -> Active: the design PR (docs(platform): unified release lane — release-please + folded image publishing (RIG-1746) #736) merged = freeze, so the in-force
contract is Active per the design skill; the header is sanctioned
lifecycle state, not frozen content. (2) Correct the OQ-N1 bump-semantics
erratum per Matt's RIG-2997 ruling: the frozen prose read
feat:->MINOR, contradicting the config it cites (
bump-patch-for-minor-pre-majordamps
feat:to PATCH) — the self-contradiction RIG-2997 flagged. Mattruled both
feat:andfix:bump PATCH, a MINOR is a deliberate manualrelease-asin a separate PR. Config-as-built (T1, both flags) isalready correct; only the prose changes.
Verified: bun test tools/release-notes/ = 22 pass / 0 fail (18
pre-existing + 4 new requireImageAtRelease cases); bash -n build.sh OK;
red-green proof that a missing/empty version.txt now aborts; biome +
markdownlint clean.
Spec-impact: OQ-N1 prose erratum only (config-as-built unchanged);
implements frozen §T5 code half; §A2 version.txt promise, previously
unowned, now realized.
Refs RIG-2916
Refs RIG-1746
Co-authored-by: Matt Wilkinson matt@rigel.build