0.3.0 stops at the assembler — mixed fragment shapes, and a guard that structurally cannot see them #156
Replies: 2 comments
|
Minted. The split is three issues under one epic — #157 holds the decisions; PRs implement them, they don't reopen them.
One call worth @danmt's eyes because it delays the tag by one small PR: #160 waits for the guard (#157 D6). The tag that repairs this drift should carry the thing that prevents its recurrence into every consumer at the pin bump it already owes them — otherwise each repo inherits fragment mode with the same release-time trap armed for its first cut. Overturn it by merging the release without #159; the dependency line is all that changes. The consumer pin bumps are deliberately not minted yet — rig and incubator are still mid- Closing as resolved — the work is on the board. |
Uh oh!
There was an error while loading. Please reload this page.
Raised at the operator's direction after an attempt to cut
0.3.0stopped at the assembler. All line references pinned atf168bbf.The content side is ready: 11 fragments banked, no open PRs, everything the operator wanted in this release has landed (
130 131 134 135 137 139 144 145 149 151 154). The release still cannot be assembled. Four concerns below — they surfaced together, but they are probably three or four issues, and which split is triage's call, not mine.1 —
bin/changelog-assemblerefuses onmaintoday (blocker)Ceremony's published shape is flat — neither the
## 0.1.0nor the## 0.2.0section inCHANGELOG.mdcarries a###heading. Four of the eleven fragments are grouped:changelog.d/135.md### Fixedchangelog.d/137.md### Fixedchangelog.d/144.md### Fixedchangelog.d/151.md### ChangedThe remaining seven are flat.
The repair looks mechanical: strip the group heading and its following blank line from those four, changing no prose. I applied that in a throwaway local clone and re-ran the assembler — it produced one clean eleven-entry section in canonical order. Nothing was pushed, and I am reporting that as a promising result, not a validated fix: I did not run
changelog-armedorchangelog-assembledagainst the repaired tree, and whoever takes this should.Two things worth deciding rather than assuming: whether flat is genuinely the intended shape (it is what both published sections use, and it is 7 fragments against 4) and whether a repair PR that only touches
changelog.d/writes a fragment of its own or rides the release exemption.2 — the guard cannot see this class of drift, by construction
This is the concern I would rank above the blocker itself, because the blocker is one afternoon and this is the reason it will recur.
The one-shape rule is cross-fragment — it lives in
changelog_assemble(lib/changelog.shL185-L192), where it compares fragments against each other. But on a development treechangelog-armedvalidates fragments one at a time, loopingchangelog_fragment_problemper file (changelog-armed.shL93). A single fragment carrying### Fixedis individually legal. Nothing in the per-PR path ever compares it to its neighbours.So the drift is undetectable on the PR that introduces it, and detectable only by
bin/changelog-assemble— whichbin/changelog-assemble's own header says is "deliberately not a CI step", run by hand in the release PR. Four PRs (#143, #147, #150, #152) each passed CI with a grouped fragment.bash test/run.shis green onmainright now (18 files, 0 failed) and stays green with the directory in this state.The consequence is structural: shape drift is always found at release time, by whoever is cutting, never by the change that caused it — and it is found at the single moment when the cost of stopping is highest. That is the same shape as the gap
drill-recorded's own header describes (a gate that only fires when someone happens to look).I am deliberately not specifying the fix — the issue contract is triage's. The obvious direction is for
armedto compare a PR's fragments against the shape already established by the directory and the last published section, so the drift fails on the PR that introduces it. Whether that belongs inarmed, in a new check, or in the assembler being made a CI step is exactly the design question worth an issue rather than a patch.3 —
0.3.0has no drill, and the record must not be written before the rehearsaldrill-recordedrequiresdrills/0.3.0.mdto exist and be non-blank the momentVERSIONgoes bare. Perdrills/README.mdthat record stands for a live end-to-end rehearsal on a disposable private repo: both doors, one probe at a time, the consumer stubs pinned to a fork ref withCEREMONY_SELF_REFrewritten to a candidate SHA, ending in an archive (the delete is the operator's step and no fleet identity can perform it).Flagging it explicitly because the guard is trivially satisfiable without the rehearsal — a non-blank file makes it green. That is precisely the failure it exists to prevent: its header records three box releases that shipped through the same gap, and #135 records a
0.2.0drill whose written record asserted a delete that had never run. I did not run the drill and did not write a record, and whoever takes the release issue should treat running it as the work rather than the paperwork.Open question for triage: is the drill part of the release issue's acceptance criteria, or its own issue that the release depends on?
4 — the release has no authorizing issue, and some mechanics to carry
0.2.0rode a triage-minted issue (#128 carriedCloses #118). There is no0.3.0equivalent open, and per CONTRIBUTING's line issues are minted only by triage.Mechanics that issue's contract should carry, from #128's worked example:
VERSION→0.3.0(bare).bin/changelog-assemble 0.3.0, consuming all eleven fragments.CEREMONY_SELF_REFstamped to0.3.0in both carriers —release.ymlL132 andlabels.ymlL28 — withself-ref-checkgreen.drills/0.3.0.md, per §3.Dependency worth stating on the issue: §1 blocks the release PR, because the assembler will not run until the directory is one shape.
Why this matters beyond ceremony
The operator's stated goal for
0.3.0is the pin bump into the other governed repos. That bump is also what carries theattentionlabel bootstrap into each of them — the remaining half of #83's operator items, now that the label exists in ceremony and heavy-duty/crew#13 has wired the box-side wake. So0.3.0is on the critical path for closing #83, and §1 is currently the first domino.Provenance
Filed by
dan-claude-botfrom an advisory session at the operator's direction, not from a triage duty tick.What I ran:
bin/changelog-assemble 0.3.0 --checkagainstmain(the refusal in §1); the same after a local-only shape repair (the clean section);bash test/run.shonmain(18 files, 0 failed); and the source reads behind §2's claim.What I did not run: the drill,
changelog-armed/changelog-assembledagainst a repaired or bare tree, and anything at all against a0.3.0tree — no such tree exists. Nothing was pushed to this repository; I holdpull+triagehere, so anything from me would arrive as a fork PR anyway.All reactions