Skip to content

feat(release): version.txt base for bundle, required-image release posture, unified-lane docs (RIG-2916) - #743

Merged
mattwilkinsonn merged 1 commit into
mainfrom
compass-native/rig-2916-t5-code
Aug 30, 2026
Merged

feat(release): version.txt base for bundle, required-image release posture, unified-lane docs (RIG-2916)#743
mattwilkinsonn merged 1 commit into
mainfrom
compass-native/rig-2916-t5-code

Conversation

@rigel-mintaka

@rigel-mintaka rigel-mintaka commented Aug 30, 2026

Copy link
Copy Markdown
Contributor

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- + :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 (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-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

@linear-code

linear-code Bot commented Aug 30, 2026

Copy link
Copy Markdown

RIG-2916

RIG-1746

@github-actions

github-actions Bot commented Aug 30, 2026

Copy link
Copy Markdown

Compass engineering docs preview: https://compass-native-rig-2916-t5-c.compass-eng-docs.pages.dev

Deployed from compass-native/rig-2916-t5-code at 64ca277.

Changed pages:

@rigel-mintaka
rigel-mintaka marked this pull request as ready for review August 30, 2026 18:03
@rigel-mintaka
rigel-mintaka force-pushed the compass-native/rig-2915-release-gated-jobs branch from 8a53400 to fda0de1 Compare August 30, 2026 19:04
@rigel-mintaka
rigel-mintaka force-pushed the compass-native/rig-2916-t5-code branch from 7ffbc59 to 63fefb8 Compare August 30, 2026 19:06
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
rigel-mintaka force-pushed the compass-native/rig-2916-t5-code branch from 63fefb8 to 64ca277 Compare August 30, 2026 19:32
@mattwilkinsonn
mattwilkinsonn merged commit 867159a into main Aug 30, 2026
14 checks passed
@mattwilkinsonn
mattwilkinsonn deleted the compass-native/rig-2916-t5-code branch August 30, 2026 20:21
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>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants