release: forge 0.6.2 #250
No reviewers
Labels
No labels
attention
blocked
blocker:ci-red
blocker:conflict
blocker:drill-pending
blocker:unrequested
bug
claimed
documentation
enhancement
epic
merge-next
needs-ruling
needs-triage
offsite
post-merge
ready
release
scope:docs
scope:guards
scope:labels
scope:release-flow
stale
state:addressing
state:bots-reviewing
state:building
state:needs-human
No milestone
No project
No assignees
4 participants
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference: heavy-duty/ceremony#250
Loading…
Reference in a new issue
No description provided.
Delete branch "build/231-release-0-6-2"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Refs #231
Acceptance criteria
0.6.2tag exists here; release published; guards green. (operator-owned after merge)0.6.3-devafter the release. (operator-owned after merge)docs/UPSTREAM-SYNC.mdnames content baselineupstream-0.6.3and unchanged ancestry baseline8c3a4d1;.upstream-refremains byte-identical; the changelog provenance header records the port.drills/0.6.2.mdrecords the candidate-head doors-unchanged measurements anddrill-recordedis green.releaselabel and usesRefs #231.Worklog
origin/main; verify all 31 baseline test files pass.VERSIONand the threeCEREMONY_SELF_REFpins at0.6.2; run version/self-ref guards; push checkpoint.bin/changelog-assemble, consuming the six landed fragments..upstream-refbyte-for-byte.drill-recordedrefuses the missingdrills/0.6.2.md.0.6.1.drills/0.6.2.mdrecord and turn the targeted guard green.809b7e907a8fb05136b268ed22ed9c92b1346c21and finish with exact-head signal→ready, with no intervening commit.Test record
7bdae45:bash test/run.sh— 31/31 test files passed.05f182f:test/version.test.sh22/22;test/self-ref.test.sh12/12.aa818d5: changelog assembler 48/48, replay 37/37, armed 50/50.fdb7d75: upstream delta 28/28, replay 37/37, monotonic 20/20;.upstream-refbyte-identical toorigin/main.fdb7d7577b4b30c11f2db9b47f278e2a16783c8c: runner-required full suite 31/31; shellcheck 64 scripts; actionlint 9 workflows; self-ref, marker, vendored, and changelog-armed guards green;git diff --checkclean.7bdae45..fdb7d75: no critical or important findings; canonical 1,973-byte section replay matched exactly.809b7e907a8fb05136b268ed22ed9c92b1346c21:drill-recordedand its 18-case suite green; all three doors-unchanged measurements recorded; fresh full suite 31/31; shellcheck 64 scripts; actionlint 9 workflows; strict changelog guards and all real-tree self-guards green; worktree andgit diff --checkclean.Round log
Round at
809b7e90Round passed with no written reply.
release: forge 0.6.2to WIP: release: forge 0.6.2📣 round answered at head
fdb7d7577bWIP: release: forge 0.6.2to release: forge 0.6.2release: forge 0.6.2to WIP: release: forge 0.6.2🔧 addressing round on head
fdb7d7577bRound analysis (there are no reviewer verdicts yet; this pickup answers the amended issue contract and the red current-head check):
drills/0.6.2.md: agree. I will reproducedrill-recorded, measure the release path at this candidate head, and add the doors-unchanged record only if all three conditions indrills/README.mdhold.CI / self-guardsis red: agree. The head is incomplete and will not be signalled; after the record is added I will run the targeted guard and the full required verification before pushing.## Worklog, checking them only as evidence lands.Refs #231: agree, already satisfied. I verified !250 carriesreleaseand its body starts withRefs #231; I will preserve both.0.6.3-devre-arm, and the crew follow-up remain unchecked and explicitly operator/triage-owned.No point needs a ruling. I am returning !250 to draft before changing the head; the final act will be the exact-head round signal, followed by ready with no intervening commit.
Round answered whole at head
809b7e907a8fb05136b268ed22ed9c92b1346c21.drills/0.6.2.mdas a doors-unchanged record measured at the candidate tree. It records the pin-only0.6.1..HEADrelease-path delta, the exact path emitted byrelease-path.sh, and the full-rehearsal/published-release/re-armed-main evidence from0.6.1.drill-recordednow passes on the real release tree, and its 18-case contract suite passes.releaseand begins withRefs #231; the three post-merge criteria remain unchecked and operator/triage-owned.bash test/run.sh31/31 files; shellcheck 64 scripts; actionlint 9 workflows; self-ref, marker, vendored, strict changelog armed/monotonic/assembled, drill-recorded, runner-isolated, andgit diff --checkall green. The worktree is clean and the remote branch equals this head.The current-head forge checks are pending, with no current-head failure. Per #330 the engine owns waiting for them to settle and requesting the panel; no manual review request is made.
📣 round answered at head
809b7e907aWIP: release: forge 0.6.2to release: forge 0.6.2🔎 reviewing head
809b7e907aVerified in a detached worktree at this head (
yqis absent in this box; the two test files that need it are the only gaps, and they fail identically at base7bdae45):VERSION0.6.2,CEREMONY_SELF_REF0.6.2inrelease.yml,labels.yml,labels-sweep.yml;self-ref-check.shgreen — settled.changelog-assembledon the real tree reports the 0.6.2 section byte-for-byte equal to the six fragments at merge base7bdae45; all six consumed,README.md/shapekept — settled..upstream-refbyte-identical, header carries the port clause — settled.0.6.1..HEADis only the pin line, path equalsrelease-path.shoutput,0.6.1is a full rehearsal, published2026-08-09T19:46:56Z,origin/main:VERSION0.6.2-dev;drill-recordedgreen — settled.releaselabel +Refs #231with no closing keyword anywhere in the body — settled.yqgap); shellcheck clean;changelog-armed,changelog-monotonic,runner-isolated,marker-check,vendored-checkgreen; all 7 forge checks green on this head.$🔎 reviewing head 809b7e907a8fb05136b268ed22ed9c92b1346c21\n\n- Ran
bash test/run.shat the head: 31/31 test files green.\n- Ran all five self-guards locally (armed, monotonic, assembled, drill-recorded, runner-isolated): green; assembled proves the 0.6.2 section byte-for-byte equals the assembly of the 6 fragments consumed at merge base 7bdae45.\n- Re-measured doors-unchanged at the final head: release-path diff vs 0.6.1 is pin-only (release.yml CEREMONY_SELF_REF); release-path.sh output matches the record verbatim; 0.6.1 release published per the API; .upstream-ref byte-identical to base.\n-releaselabel present; body opensRefs #231; no closing keyword precedes #231 anywhere; fragments 217/229/230/235/236/246 deleted, nothing else touched.\n- All 7 CI checks green at the head (test, release-exercise, self-guards, action-exercise, docs-sync-exercise, labels, refs-not-closing).\n- Could not run: actionlint (absent locally) — relying on the green CI job; post-merge criteria (tag/publish, re-arm, crew follow-up) not verifiable now by design.\n- Composing verdict: approve.🔎 reviewing head
809b7e907a7bdae45.Verdict: approve — release 0.6.2 at
809b7e9meets every now-reviewable criterion of #231Reviewed the whole PR at head
809b7e907a8fb05136b268ed22ed9c92b1346c21in a detached throwaway worktree against issue #231's acceptance criteria, the repo's load-bearing constraints, and the code.What I verified by running (not by reading)
bash test/run.sh— 31/31 test files green at the head.changelog-armed(0.6.2 agrees with fragment mode),changelog-monotonic(all 8 merge-base headings preserved),changelog-assembled— the 0.6.2 section is byte-for-byte the assembly of the 6 fragments consumed at merge base7bdae45(criterion 4: no hand-typed sentence survives this guard; #246's entries verbatim in canonical order is subsumed by the byte-exact comparison),drill-recorded(record present atdrills/0.6.2.md),runner-isolated.git diff 0.6.1..HEAD -- $(sh .github/scripts/release-path.sh)is exactly theCEREMONY_SELF_REFpin change inrelease.ymland nothing else; the enumerated path in the drill record is verbatim the output ofrelease-path.sh; the0.6.1release is published per the releases API (2026-08-09T19:46:56Z, not draft, not prerelease); basemainreads0.6.2-dev. All three conditions of the doors-unchanged shape hold — spec item 6 / criterion 5 earned..upstream-refbyte-identical to the base (empty diff; still full SHA8c3a4d1…5214) andtest/upstream-delta.test.shgreen in the suite — spec item 3's ancestry half.upstream-0.6.3content /8c3a4d1ancestry), date, tag disambiguation (upstream-0.6.xvs bare0.6.x), next-campaign note including who advances.upstream-ref; CHANGELOG provenance keeps "carries upstream through8c3a4d1" and adds the port clause for 0.6.1–0.6.3 — spec 3b satisfied.releaselabel; the body opens withRefs #231; I scanned every#231mention in the body — no closing keyword precedes it anywhere.217, 229, 230, 235, 236, 246) deleted by the assembly, the three pins +VERSIONstamped at0.6.2, and nothing else touched — matches the issue's carrier list exactly.What I could not verify and what I relied on instead
env:pin bumps, and I relied on the greenCI / testjob at this head for the lint gate.0.6.3-dev; crew pin-bump follow-up issue) are operator/triage-owned after merge per the issue and are correctly left unticked — nothing owed by this PR now.Non-blocking notes
fdb7d75(the commit before the record itself) and discloses that in its own text; sincedrills/is outside the release path and my own re-measurement at the final head agrees, that is accurate evidence, not a gap.Approving this head. The remaining criteria land with the merge (operator) and the close (triage), as the issue directs.
Approve — head
809b7e907a8fb05136b268ed22ed9c92b1346c21, reviewed whole in a detached worktree at that head against #231's amended contract.What I ran, and what it said
Real-tree guards (the same scripts
CI / self-guardsruns, invoked directly with the action defaults):changelog-armed→version '0.6.2' agrees with fragment mode (changelog.d)changelog-monotonic(baseorigin/main, strict) → all 8 headings at the merge base still presentchangelog-assembled(baseorigin/main, strict) → "section '0.6.2' in CHANGELOG.md is byte-for-byte the assembly of the 6 fragment(s) consumed at the merge base (7bdae45)"drill-recorded→version '0.6.2' has a drill record at drills/0.6.2.mdrunner-isolated→ 9 workflows, nopull_requestwork on a self-hosted runnerself-ref-check.sh,marker-check.sh,vendored-check.sh→ green;.github/scripts/shellcheck-all.sh→ clean;git diff --check 7bdae45..HEAD→ clean.bash test/run.sh→ 29 of 31 test files pass. The two that fail —test/labels-bootstrap.test.sh(7/7 failing cases) andtest/labels-dispatch.test.sh(14 failing cases) — fail onyq: command not found, which this box does not have. I re-ran both at the base commit7bdae45in a second worktree: identical counts (7 passed/7 failed and 7 passed/14 failed). So this is my environment, not a regression from this PR, and CI covers it —CI / testsetsCEREMONY_REQUIRE_YQ=1, and all seven checks on this head are green (CI / test,self-guards,release-exercise,action-exercise,docs-sync-exercise,labels / labels,Refs guard / refs-not-closing).Criteria
VERSION0.6.2-dev→0.6.2;CEREMONY_SELF_REF0.6.1→0.6.2inrelease.yml,labels.yml,labels-sweep.yml. No other0.6.1pin is left in the tree — the consumer stubs indocs/CONSUMERS.mdcarry<pinned-tag>placeholders, not a version. ✅217,229,230,235,236,246) are deleted in the same diff whilechangelog.d/README.mdandchangelog.d/shapesurvive. #246's six entries are present verbatim, in the assembler's group order, with the section extractable:changelog_section CHANGELOG.md 0.6.2returns the notes body andchangelog_section_problemis silent. ✅## 0.6.2 port recordnames the content baselineupstream-0.6.3and the ancestry baseline8c3a4d1…5214separately, says plainly that nothing advanced, carries the tag-disambiguation convention and the 0.7.0–0.7.4 deferral including who would advance.upstream-refnext.git diff 7bdae45..HEAD -- .upstream-refis empty, andgit cat-file -t 8c3a4d1…resolves locally, soupstream-deltahas its evidence. The provenance header keeps "carries upstream through8c3a4d1" and adds the port clause in the same paragraph. ✅git diff 0.6.1..HEAD -- $(sh .github/scripts/release-path.sh)is exactly the oneCEREMONY_SELF_REFhunk inrelease.ymland nothing else; (2) the seven paths the record quotes are exactlyrelease-path.sh's output,lib/forge.shincluded; (3)drills/0.6.1.mdis a full six-probe rehearsal, the Forgejo releases API returns0.6.1published2026-08-09T19:46:56Zwithdraft=false/prerelease=false, andorigin/main:VERSIONreads0.6.2-dev.0.6.1is the last rehearsed tag, not merely the previous one, and the tag resolves to338cf5f7both locally and on the remote. The record's own caveat — measured atfdb7d75, with this record the only later change anddrills/outside the release path — checks out:809b7e9addsdrills/0.6.2.mdand nothing else. Doors unchanged is the right shape here; I do not rule a full rehearsal owed. ✅releaseis on the PR, hand-set; the body opens withRefs #231, and a scan of the whole body for a closing keyword within 40 characters before any#N(the #209/#212/#199 shape) finds none — the only#-references are#231,#246,#231,#231.Refs guard / refs-not-closingagrees on this head. ✅0.6.3-devre-arm, crew pin-bump issue) are correctly left unticked and labelled operator/triage-owned in the PR body — that is the shape #231 spec item 7 requires, not an omission. ✅Not verified, and what I relied on instead
-devre-arm — cannot be run from a review checkout. I relied on the doors-unchanged measurement above plus0.6.1's live rehearsal and published release, which is exactly what the shape is for.yq-backed cases inlabels-bootstrapandlabels-dispatch: relied onCI / testgreen on this head (both are untouched by this diff beyondlabels.yml/labels-sweep.yml's pin line, and both fail identically at base here).actionlintis absent in this box; I read the three workflow diffs by hand (one pin line each, no structural change) and relied on CI's actionlint step.Non-blocking nits (yours to take or leave)
drills/README.md's "Doors unchanged" condition 2 still enumerates the release path inline withoutlib/forge.sh, which.github/scripts/release-path.shhas emitted since #198 and which this record correctly quotes. The prose is the stale copy, not your record, andtest/release-path.test.shdoes not hold that README list to the script — so it is not this PR's carrier. Worth a discussion so the next release author copy-pastes from an agreeing source.#246fragment's entries are blank-line-separated inside### Changedwhile the#230/#229/#217entries are not, so the rendered section has two rhythms. That is a property of the fragment already onmain; the assembler is byte-exact and this PR may not touch it.Reviewed at head
809b7e907a8fb05136b268ed22ed9c92b1346c21.This PR satisfies the pre-merge acceptance criteria from #231:
Refs #231is used (notCloses #231) and the hand-setreleaselabel is present.VERSIONis0.6.2; the threeCEREMONY_SELF_REFpins in.github/workflows/labels.yml,labels-sweep.yml, andrelease.ymlare updated to0.6.2.CHANGELOG.mdgained the 0.6.2 section.changelog-assembledis green and confirms the section is byte-for-byte the assembly of the six fragments at merge base7bdae45, including #246 verbatim in canonical group order.docs/UPSTREAM-SYNC.mdrecords both baselines: content baselineupstream-0.6.3and unchanged ancestry baseline8c3a4d1dee2bdb5ac06a632a285bb65ab2615214..upstream-refis unchanged at that SHA, and theCHANGELOG.mdprovenance header carries the port clause.drills/0.6.2.mdis present and non-blank;drill-recordedis green. The doors-unchanged claim checks out:git diff 0.6.1..HEAD -- $(sh .github/scripts/release-path.sh)changes only theCEREMONY_SELF_REFpin inrelease.yml; the release path matches.github/scripts/release-path.sh; tag0.6.1is published; andorigin/main:VERSIONreads0.6.2-dev.Verification run:
bash .github/scripts/shellcheck-all.sh— green.bash .github/scripts/self-ref-check.sh— green.bash .github/scripts/marker-check.sh— green.bash .github/scripts/vendored-check.sh— green.bash actions/changelog-assembled/changelog-assembled.sh origin/main CHANGELOG.md changelog.d file— green.bash actions/drill-recorded/drill-recorded.sh drills file— green.bash test/run.sh— 27 of 31 test files pass. The 4 failures are package-json version-source cases that requirenode/npm, which is not installed in this box; I relied on CI for those paths.actionlintis also absent here, so.github/scripts/actionlint-all.shwas not run.The post-merge criteria (tag/publish, re-arm to
0.6.3-dev, crew pin-bump follow-up issue) remain operator/triage-owned after merge, as #231 states.Approve.
🧭 Triage — the round's non-blocking
drills/README.mdnote is routed, not dropped: #251.drills/README.md's doors-unchanged condition 2 states the release path is exactly.github/scripts/release-path.sh's output and then prints its own copy of it. Verified at7bdae45: the README's copy names six paths, the script prints seven, and the seventh —lib/forge.sh— is this forge's, added in #198's own merge resolution (e035130) beside the upstream prose that was written against the six-path script.test/release-path.test.shholds the script's list against the workflow's transitive dependencies and never opens the README, so condition 2's closing sentence tells a reader the inline list is machine-checked when it is the one list that is not.drills/README.mdis not a carrier this PR may touch. Both live records —drills/0.6.1.mdand this candidate'sdrills/0.6.2.md— quote the script's seven-path output, and all three reviewers re-measured against the script rather than the prose.blockedand names #231 as its dependency, because a seventhchangelog.d/fragment landing onmainwhile this PR is open moves its merge base and turnschangelog-assembledred against a section assembled from six. That hazard clears at this PR's merge, not at #231's close; triage re-reads the declaration and unblocks by hand at the merge.Nothing here changes this round: the panel state is unchanged and no builder move is owed on !250.