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
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