Skip to content

fix(release): the train's identity is derived — release scripts carried 0.68.2's V/MS/EPIC/LAST_TAG and an out-of-repo AP (PMAT-3618) - #3655

Closed
noahgift wants to merge 2 commits into
mainfrom
PMAT-3618-release-scripts-derive-params
Closed

noahgift wants to merge 2 commits into
mainfrom
PMAT-3618-release-scripts-derive-params

Conversation

@noahgift

Copy link
Copy Markdown
Contributor

Closes #3618. Refs #3592 #3459 #3617.

The in-tree release scripts (ported from the 0.68.2 bundle, #3599) still carried V=0.68.2, MS=12, EPIC=3477, LAST_TAG=v0.68.1 and an AP under the operator box's RAID mount, which check_hardcoded_paths.sh cannot see (#3592). Cutting 0.69 through them would have targeted the old version and an out-of-tree directory.

done_when, item by item

# Criterion How
1 V/T/MS/EPIC derived or passed The version is passed (first argument of all four scripts, refused unless X.Y.Z); T="v$V"; milestone = the one titled exactly V; epic = the one epic item in it titled EPIC: release train V …; last tag = highest v* below T. 0 or 2+ answers → rc 2, named. Checked against history: for 0.68.2 the derivations return milestone 12, epic #3477, last tag v0.68.1, which are exactly the literals they replace. For 0.69.0 they return milestone 6, epic #3080, last tag v0.68.2.
2 AP derived from the repository <main checkout>/target/release-train/<T>, where the main checkout is the parent of the repo's common git dir, so every worktree resolves the same AP (prepare_bump writes release_notes.md, autopilot reads it). RELEASE_AP overrides at run time and is never a literal.
3 /mnt blind spot closed or own assertion Own assertion: scripts/check_release_scripts_derive_identity.sh. R1 is no absolute path under /mnt /home /Users /opt /srv /media /root on any line (comments included). R2 is no literal assigned to V T MS EPIC LAST_TAG AP. It runs in guard-tree (--no-cargo dry-run lists it). #3592 stays open for the analyser.
4 Falsifier On a copy of the real scripts/release/, planting AP=/mnt/nvme-raid0/agent-wt/rel-0690-autopilot in autopilot.sh turns R1 and R2 RED (rc 1), and planting MS=0.69.0 in prepare_bump.sh turns R2 RED. The case table has 14 rows. Each of 5 mutants turns it RED. Its first real finding was this PR's own library comment quoting the old path.

Also fixed on the way

  • autopilot.sh ran python3 "$AP/ledger.py", a leftover of the bundle layout that would not exist in a derived AP. It now reads scripts/release/ledger.py.
  • publish_strict.sh read publish-order.txt from the bundle dir. It now reads it from the tag's own checkout, $WT/scripts/release/.
  • prepare_bump.sh: branch release-<V>, Pmat-Ticket from the derived epic. The /mnt fallback for arm_pr_automerge.sh is removed (the in-tree script is required). The launch line prints the in-tree autopilot with its version.
  • ledger_from_run.sh's "tag": "v0.68.1" is now the v* tag the tested sha carries.
  • 06x-release-schedule.md §4 now names the in-tree scripts and their one input.

Not changed: publish_strict.sh's crate count (74) is a 0.68.2-era constant of the same shape but outside #3618's five names. Its 4 bashrs errors are pre-existing false positives, identical on main.

Measured

Guard 14/14 + PASS on the tree · check_tag_step_gated PASS + self-test · check_t2_preflight_verdict PASS · t2_preflight --self-test OK · sourced-libs option-neutral (9) · bashrs-gate PASS · pipe-into-grep-q at ceiling · hardcoded-paths +0 · apr pinned · guards-are-wired · readme claims · roadmap aggregate + sorted/unique/additive · fmt · deny · aprender-contracts --lib 1666.

🤖 Generated with Claude Code

…ed 0.68.2's V/MS/EPIC/LAST_TAG and an out-of-repo AP; a guard now refuses both (#3618)

Refs #3618 #3592 #3459 #3617

The release scripts ported from the out-of-tree 0.68.2 bundle (#3599) kept
V=0.68.2, MS=12, EPIC=3477, LAST_TAG=v0.68.1, and AP pointing at an agent
worktree on the operator box's RAID mount. Cutting 0.69 through them would
have targeted the old version and a directory that may not exist, and the path
passed every gate: check_hardcoded_paths.sh does not match that mount (#3592).

scripts/release/lib_release_params.sh (new, sourced, option-neutral)
  ONE input, the version; everything else read from where it already lives.
  - release_params <X.Y.Z>: V, T, REPO, INFRA; a non-X.Y.Z version is rc 2
    (0.69, v0.69.0, 0.69.0.1, 1.2.3a, empty -- all refused).
  - AP = <main checkout>/target/release-train/<T>, where <main checkout> is the
    parent of the repo's COMMON git dir, so every worktree resolves the SAME AP
    (prepare_bump writes release_notes.md there, autopilot reads it). target/
    is ignored. RELEASE_AP overrides at run time; it is never a literal.
  - release_milestone_number: the one milestone titled exactly V.
  - release_epic_number: the one `epic` item in milestone V titled
    "EPIC: release train V ..." (RELEASE_EPIC overrides, digits only).
  - release_last_tag: the highest v* tag strictly below T.
  Each derivation that finds 0 or 2+ answers returns 2 and says why.
  Proof against history: for 0.68.2 the derivations return milestone 12, epic
  #3477, last tag v0.68.1 -- exactly the literals they replace. For 0.69.0:
  milestone 6, epic #3080, last tag v0.68.2.

The four scripts take the version as their first argument:
  autopilot.sh <version> <bump-pr> [from] [to]  (MS/EPIC derived once, logged
    as `PARAMS …` in STATUS; ledger.py read from the tree, not $AP -- it would
    not have existed in the new AP)
  prepare_bump.sh <version> [--ship]  (branch release-<V>, Pmat-Ticket from the
    derived epic, the /mnt fallback for arm_pr_automerge.sh removed -- the
    in-tree script is required; launch line prints the in-tree autopilot)
  publish_strict.sh <version> [--plan]  (publish-order.txt read from the tag's
    own checkout, $WT/scripts/release/, not the old bundle dir)
  t2_preflight.sh <version> | --self-test  (self-test needs no version)
  ledger_from_run.sh's "tag": "v0.68.1" is now the v* tag the tested sha carries.
Each refuses with a usage line (rc 2) when the version is missing.

scripts/check_release_scripts_derive_identity.sh (new; guard_tree --no-cargo
runs it) -- item 3's second branch; #3592 stays open for the analyser:
  R1 no absolute path under /mnt /home /Users /opt /srv /media /root on ANY
     line of scripts/release/, comments included.
  R2 no literal (no `$`) assigned to V T MS EPIC LAST_TAG AP on a non-comment
     line. Zero files scanned = ENV 2.
  14-row case table; its first real finding was this change's own library
  comment quoting the old path (reworded).
  FALSIFIER (item 4), on a copy of the real scripts/release/: planting
  `AP=/mnt/nvme-raid0/agent-wt/rel-0690-autopilot` in autopilot.sh -> R1+R2 RED,
  rc 1; planting `MS=0.69.0` in prepare_bump.sh -> R2 RED. Mutants, each RED:
  R1 without mnt (row 3), R2 reading comments (9, 14), R2 accepting any value
  (1, 14), zero files as a pass (12), R2 anchored at line start only (6).

docs/specifications/06x-release-schedule.md §4: the autopilot sentence now names
the in-tree scripts and their one input, not the 0.66 out-of-tree precedent.

Not changed, stated: publish_strict.sh's crate count (74) is a 0.68.2-era
constant of the same shape, outside #3618's five names; its 4 bashrs errors
are pre-existing false positives, identical on main.

Gates: guard self-test 14/14 + PASS on the tree; check_tag_step_gated PASS +
self-test; check_t2_preflight_verdict PASS; t2_preflight --self-test OK;
sourced-libs option-neutral (9 libs); bashrs-gate PASS; pipe-into-grep-q at
ceiling; hardcoded-paths +0; apr pinned; guards-are-wired PASS; readme claims;
roadmap aggregate idempotent + sorted/unique/additive; fmt, deny,
aprender-contracts --lib 1666.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@noahgift

Copy link
Copy Markdown
Contributor Author

quorum-review (AD-04): three PASS — agreed (auto_merge: checked=true was_armed=false disarmed=false)

{
 "ticket": "PMAT-3618",
 "head": "e9ca589997b042bb38572975c812fda8806be123",
 "width": 3,
 "executor": "agy",
 "agreed": true,
 "auto_merge": {
  "checked": true,
  "was_armed": false,
  "disarmed": false,
  "note": "auto-merge not armed"
 },
 "lanes": [
  {
   "lane": 1,
   "verdict": "PASS",
   "findings": 3
  },
  {
   "lane": 2,
   "verdict": "PASS",
   "findings": 3
  },
  {
   "lane": 3,
   "verdict": "PASS",
   "findings": 4
  }
 ]
}

Lanes gemini-3.1-pro-high / gemini-3.1-pro-low / gemini-3.6-flash-high at
e9ca589; commands 1/1/5; no transcript reads a sibling lane file.

Refs #3618

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@noahgift

Copy link
Copy Markdown
Contributor Author

Cross-inspection of docs/audits/quorum-PMAT-3618.json lanes (non-author: aprender-04, 06:13Z)

lane conversation status verdict findings refs to sibling lanes / $WORK duration
lane 1 d7c2f7c4 SUCCESS PASS (structured_output) 3 (3 cited, 0 with commands) 0 156 s
lane 2 bcaf70ba SUCCESS PASS (structured_output) 3 (2 cited, 0 with commands) 0 48 s
lane 3 3e46312b SUCCESS PASS (structured_output) 4 (0 cited, 4 with commands) 0 624 s

Distinct agy conversation ids: 3/3; no lane references a sibling lane or $WORK. Read from /mnt/nvme-raid0/agent-wt/rel-3618/docs/audits/quorum-PMAT-3618.json.lanes on this box. Note: release scripts take the version as their one input; milestone/epic/last tag derived (history proof: 0.68.2 → 12/#3477/v0.68.1, the exact literals replaced); AP derived from the repo; new guard plants the /mnt AP and goes RED; operator-facing change: autopilot.sh 0.69.0 .

Verdict line: 3/3 PASS, independent. Arming.

@noahgift
noahgift enabled auto-merge September 21, 2026 06:13
@github-actions

Copy link
Copy Markdown

§13.11 rung 1 — quorum shadow verdict

S13-SHADOW pr=3655 head=9ee985d416a1c71523c2ea31c56c705c2d947d13 verdict=REFUSE class=Q1 arm_rc=1

Shadow mode: this records a verdict and merges nothing. A refusal
to arm is not a block (§13 adds zero rows to §7) — the pull request is
exactly as green as it was.

@noahgift

Copy link
Copy Markdown
Contributor Author

Disarmed by the cop (07:35Z): this PR is integrated in the 0.69 release batch #3669 (one CI run, one queue slot, roadmap.yaml resolved once), at the operator's direction to batch. Its receipt is in the batch tree unchanged. It closes as landed-in-#3669 when the batch merges. Don't push here; changes go to release/0.69-batch.

noahgift added a commit that referenced this pull request Sep 21, 2026
…s SEC010)

#3655 derives AP from the repository instead of a /mnt literal, so the
$(cat "$AP/cleanroom-run-id") inside the epic comment is now flagged by the
bashrs gate as SEC010 (path traversal risk in cat). That redded #3655's own
guard-cargo and the batch's. The value is now read once with the read
builtin into cleanroom_run_id (falling back to 'unknown', as the cat's
2>/dev/null effectively did) and interpolated. bashrs-gate: PASS, 0
SEC/DET/IDEM over 360 files.

Refs #3618, #3669

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@noahgift

Copy link
Copy Markdown
Contributor Author

Landed in #3669 (squash a877fa056, merged 2026-09-21T10:50:29Z). This PR's receipt stands as the constituent review; the batch folded its commits verbatim. — cop

@noahgift noahgift closed this Sep 21, 2026
@noahgift noahgift mentioned this pull request Sep 21, 2026
@noahgift
noahgift deleted the PMAT-3618-release-scripts-derive-params branch September 23, 2026 16:15
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.

Release scripts still carry 0.68.2's V/T/MS/EPIC and AP=/mnt/... — and the hardcoded-path ratchet does not match /mnt, so nothing catches it

1 participant