You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
LAB (it cannot block a merge or a release: no workflow, Makefile target or script calls scripts/release/release_ready.sh).
What. On main @af58dfccff, bash scripts/release/release_ready.sh --root . exits 2:
unparsed call form at scripts/release/autopilot.sh:76
surface unreadable: scripts/release/autopilot.sh steps
release-ready: not_measured: a surface cannot be read
So every surface after autopilot's (preflight, cascade, strict, dogfood) goes unread, and the verdict is not_measured.
Cause.autopilot_found does not accept the subshell form ( . scripts/lib/release_policy.sh || exit 2 that #4910 (ad8fafc) added in ap_policy_applies. Measured with autopilot_found alone (RR_SOURCED=1): rc 2 on main's autopilot.sh, rc 0 on ad8fafc794~1:scripts/release/autopilot.sh.
Done when.release_ready.sh --root . reads every surface on main, and the selftest gains a row with this subshell form (must parse) next to a call form that must still be refused.
Fix committed on branch fix/4968-release-ready-subshell-form (70d0d5740a), not pushed yet. It waits for a PR slot.
autopilot_found reads a sourced script (. scripts/X.sh, source scripts/X.sh) as a call form and lists it as source scripts/X.sh. . "$R"/scripts/x.sh is still refused.
RR-T21 lists scripts/lib/release_policy.sh under the tag step.
With the surface readable, release_ready.sh --root . at main 845004a is rc 1, no longer rc 2. These findings were hidden behind not_measured, and this LAB check's red now names them:
ORPHANED RR-T12: no surface states tag:autopilot/readiness/bash scripts/release/release_readiness.sh --root any more
ORPHANED RR-T20: no surface states tag:autopilot/readiness/cargo metadata --no-deps --format-version any more
ORPHANED RR-P26: scripts/release/publish_strict.sh does not contain "no green clean-room run id recorded"
UNLISTED tag:autopilot/deep/bash scripts/release/deep_nodefault_verdict.sh (scripts/release/autopilot.sh:142)
UNLISTED tag:autopilot/commit/bash scripts/release/release_readiness.sh --root (scripts/release/autopilot.sh:280)
UNLISTED publish:strict/no-clean-room-run-id-recorded-for-t (scripts/release/publish_strict.sh:33)
UNLISTED publish:strict/cannot-write-crg (scripts/release/publish_strict.sh:34)
UNLISTED publish:strict/cannot-load-fn-from-scripts-cascade-publish-sh (scripts/release/publish_strict.sh:37)
UNLISTED publish:strict/cannot-load-the-clean-room-gate (scripts/release/publish_strict.sh:40)
UNLISTED publish:strict/clean-room-run-crid-does-not-prove-t (scripts/release/publish_strict.sh:41)
CONTRADICTION publish.executor: cascade-drain.sh @ scripts/release/autopilot.sh:535 | publish_strict.sh @ docs/specifications/APR-RELEASE-001-train-and-build-kaizen.md:246
release-ready: unlisted=7 orphaned=3 contradictions=1 listed=120 stated=124
These are list drift since the readiness step moved to commit, deep_nodefault_verdict and the publish_strict refusals were added, and the executor changed. They are next on this ticket.
Branch fix/4968-release-ready-subshell-form, three commits, not pushed yet (waiting for a PR slot):
commit
what
70d0d5740a
a sourced script (( . scripts/lib/x.sh || exit 2) is a call form. --root . rc 2 -> 1
166aa97e92
a step opened as if run_step X && <test>; then is read as step X. The readiness block was being taken for commit-time code, so RR-T12 and RR-T20 read ORPHANED. Any other if run_step opener is now not_measured
ed24619868
list drift: RR-P26 re-anchored on the #4869 message, RR-P38..41 (the one-door refusals), RR-T22 (the deep-nodefault verdict, #4874)
Measured in the worktree: --root . gives unlisted=0, orphaned=0, listed=125, stated=125. --selftest passes 76/76, including the subshell-form row and the refused call forms next to it. --mutants killed 50/50 with 0 errors. pv validate reports 0 errors. This meets the done-when.
One finding is left, rc 1: CONTRADICTION publish.executor. It is a real contradiction, not a parser artefact:
The cascade path runs its own clean_room_gate and check_publish_preflight.sh, but clean_room_gate judges the newest completed run on the tag, not the run id the train recorded. The cascade path does not run publish_strict.sh's other refusals: HEAD == tag on a detached checkout, a recorded B2-gpu run id, a committed dry-run receipt, and publish order == universe.
Which side moves is a release-path design decision under #4687, so it is not decided here. The contradiction-executor selftest row keeps it falsifiable. This check stays red on that one finding until #4687 settles the executor.
Folded into #4433 as a checklist row (TRIAGE-100, 2026-10-14): the open-ticket cap is 100, so this ticket is now tracked on that master and closed as not planned. Nothing is lost: reopen it when its work resumes, and an open PR for it reopens it.
Activity
noahgift commentedon Oct 9, 2026
Fix committed on branch
fix/4968-release-ready-subshell-form(70d0d5740a), not pushed yet. It waits for a PR slot.autopilot_foundreads a sourced script (. scripts/X.sh,source scripts/X.sh) as a call form and lists it assource scripts/X.sh.. "$R"/scripts/x.shis still refused.scripts/lib/release_policy.shunder the tag step.unlisted-dot-source-subshell(the release: standing CRUX-smoke release policy, read by autopilot, readiness and bump #4910 subshell form must parse) next tonm-unparsed-dot-quoted-root(must still be refused). Mutants M45-M47 are all killed.--selftest74/74;--mutantskilled=47 total=47 errors=0.With the surface readable,
release_ready.sh --root .at main 845004a is rc 1, no longer rc 2. These findings were hidden behind not_measured, and this LAB check's red now names them:These are list drift since the readiness step moved to commit, deep_nodefault_verdict and the publish_strict refusals were added, and the executor changed. They are next on this ticket.
noahgift commentedon Oct 9, 2026
Branch
fix/4968-release-ready-subshell-form, three commits, not pushed yet (waiting for a PR slot):( . scripts/lib/x.sh || exit 2) is a call form.--root .rc 2 -> 1if run_step X && <test>; thenis read as step X. The readiness block was being taken for commit-time code, so RR-T12 and RR-T20 read ORPHANED. Any otherif run_stepopener is now not_measuredMeasured in the worktree:
--root .gives unlisted=0, orphaned=0, listed=125, stated=125.--selftestpasses 76/76, including the subshell-form row and the refused call forms next to it.--mutantskilled 50/50 with 0 errors.pv validatereports 0 errors. This meets the done-when.One finding is left, rc 1:
CONTRADICTION publish.executor. It is a real contradiction, not a parser artefact:publish_strict.shas the publish executor, and 0.70.2 T10: BLD-002 R5b one door to cargo publish: publish_strict.sh refuses a missing, red or other-commit clean-room run #4687 makes it the one door tocargo publish.cascadestep runsscripts/cascade-drain.sh->scripts/cascade-publish.sh.git log -S publish_strict.sh -- scripts/release/autopilot.shis empty: no commit since the tag path moved into the repo (PMAT-3459 (part 2): port the tag path into the repo — autopilot.sh + 2, 14 declared deltas #3599) has calledpublish_strict.shfrom the autopilot.clean_room_gateandcheck_publish_preflight.sh, butclean_room_gatejudges the newest completed run on the tag, not the run id the train recorded. The cascade path does not runpublish_strict.sh's other refusals: HEAD == tag on a detached checkout, a recorded B2-gpu run id, a committed dry-run receipt, and publish order == universe.Which side moves is a release-path design decision under #4687, so it is not decided here. The
contradiction-executorselftest row keeps it falsifiable. This check stays red on that one finding until #4687 settles the executor.noahgift commentedon Oct 14, 2026
Folded into #4433 as a checklist row (TRIAGE-100, 2026-10-14): the open-ticket cap is 100, so this ticket is now tracked on that master and closed as not planned. Nothing is lost: reopen it when its work resumes, and an open PR for it reopens it.
Agent: aprender-clerk