Commit graph

613 commits

Author SHA1 Message Date
9d816293ee Merge main into release/0.4.1 — carry #191's doors and #194's drill record
The section is re-assembled: main's merge base now carries two fragments
(188.md and 191.md), so 0.4.1 publishes with the door port it actually
ships, and neither fragment survives its own release.

drills/0.4.1.md takes main's two-run record, with run 1's disclosures
restored — the scratch repo it used, its candidate ref, and the ~8 minutes
it spent public to read job logs. A later success does not retire a
disclosed deviation.
2026-08-04 16:00:42 +00:00
1ddefe79d9 Merge pull request 'drills/0.4.1.md — the post-merge rehearsal passed; record both runs (#191)' (#194) from build/191-drill-record into main
Reviewed-on: heavy-duty/ceremony#194
Reviewed-by: grok-reviewer-andresmgsl <andres+3@heavyduty.builders>
Reviewed-by: codex-reviewer-andresmgsl <andres+2@heavyduty.builders>
Reviewed-by: kimi-reviewer-andresmgsl <andres+4@heavyduty.builders>
2026-08-04 15:58:46 +00:00
cndgrr
abe31a6d4a test(labels): assert each guard row alone, not bundled with its sibling
The D3 guard loop passed the action path and its test path to derives in
one call. derive_labels emits scope:guards when either matches, so any one
of the six rows could be deleted with the case still green — three
assertions standing in for six rows. Split into one assertion per path.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-04 15:56:55 +00:00
Andriujose
f3125631b9 docs: keep answer outcome explicit 2026-08-04 15:51:16 +00:00
Andriujose
de3ab517d7 docs: slim triage doctrine 2026-08-04 15:48:27 +00:00
Daniel Marin
fe45180616
Merge pull request #299 from andriujoseba/build/257-board-read
fix: abort on unreadable issue board
2026-08-04 16:43:32 +01:00
cndgrr
5356702817 docs(changelog): fragment for #267 2026-08-04 15:34:17 +00:00
cndgrr
0fe015da69 fix(labels): the scope map locates again
changelog.d/** matched every PR that changes behavior, so scope:release-flow
was a constant, not a locator (#267).
2026-08-04 15:33:39 +00:00
d089ab57b3 drill(0.4.1): probes 2 and 4 ran — all six probes now have live results (#191)
Codex (!194 #1588) is right on the text: #191's criterion is a drill that
runs all six probes with 1 and 5 passing, not two probes passing and four
recorded. Probe 2 (mislabeled ordinary PR) and probe 4 (a re-run of the
completed ceremony) were run on the same consumer, un-archived for them and
archived again after.

Probe 4 diverges in mechanism because Forgejo 8.0.3 has no run-rerun API:
the ceremony was re-run by reproducing its input rather than replaying the
run. The record says so, and says which assert refused.
2026-08-04 15:30:55 +00:00
Daniel Marin
5fd1c1b014
Merge pull request #295 from cndgrr/build/281-builder-slim
docs(builder): BUILDER.md slims to the rules — narratives become bare local cites
2026-08-04 16:27:06 +01:00
4057c59354 drill(0.4.1): the post-merge rehearsal passed — record both runs
#191's last acceptance criterion was a live drill against the MERGED tree,
not the candidate. Run against `fda5657`:

  probe 1  merge door   one release 0.4.1, changelog body, main re-armed
                        to 0.4.2-dev, both assets uploaded
  probe 3  no label     refused, nothing created
  probe 5  tag door     0.5.0 published, main VERSION untouched
  probe 6  bad tag      refused, nothing created

The fixture carried an artifact hook this time, dropping `drill asset.tgz`
and `a&b.tgz`. Both survived under those exact names — the encoding fix
proven end to end, in the place it would have failed: after the tag exists,
mid-publish.

The record keeps run 1 (the failure at 9a229ee) beside run 2, because the
failure is why #191 exists and a record that quietly replaced it would be
the kind of tidy history this repo refuses.

Refs #191

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-04 15:06:53 +00:00
Andriujose
353fa54ae1 fix: abort on unreadable issue board 2026-08-04 15:03:25 +00:00
fda5657285 Merge pull request 'lib/facts.sh + release.yml — the release doors speak the shim, and an unread fact refuses (#191)' (#193) from build/191-release-door-facts into main
Reviewed-on: heavy-duty/ceremony#193
Reviewed-by: grok-reviewer-andresmgsl <andres+3@heavyduty.builders>
Reviewed-by: codex-reviewer-andresmgsl <andres+2@heavyduty.builders>
Reviewed-by: kimi-reviewer-andresmgsl <andres+4@heavyduty.builders>
2026-08-04 14:58:29 +00:00
Daniel Marin
b7005ee9cd
Merge pull request #298 from andriujoseba/build/288-collision-edge
docs: declare collision-edge chains
2026-08-04 15:56:19 +01:00
cndgrr
b44f7ed6ee Merge branch 'main' into build/281-builder-slim 2026-08-04 14:47:38 +00:00
Andriujose
90961cad51 docs: declare collision-edge chains 2026-08-04 14:27:49 +00:00
Daniel Marin
1a9fdde8fc
Merge pull request #297 from andriujoseba/build/266-task-list-heading
docs: name the epic task-list heading
2026-08-04 15:20:56 +01:00
cndgrr
64e3af682f Merge branch 'main' into build/281-builder-slim 2026-08-04 14:13:38 +00:00
cndgrr
92c0e7c6f0 docs(builder): bind the red-head trigger to the round's ruled terms
The red-head rule in Picking carried its own trigger definition at the
pre-slim head; the squeeze took it, leaving 'failing check' and 'red
check' classified only forward in the review round. At an all-cancelled
head that let parked shape 2 read satisfied on its face, parking a claim
the rule says is never parked (#163, #276).

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-04 14:13:34 +00:00
Andriujose
08b817b814 docs: name the epic task-list heading 2026-08-04 13:42:24 +00:00
cndgrr
49e1fe2e6e docs(builder): give step 1 its paragraph breaks back; fix two doubled connectives 2026-08-04 13:40:51 +00:00
cndgrr
900963d653 docs(builder): name the subject in the staleness-sweep clause 2026-08-04 13:40:08 +00:00
Daniel Marin
f899bb5690
Merge pull request #296 from andriujoseba/build/264-flagging-unassigned
docs(triage): scope no-assignee bug to flagging
2026-08-04 14:39:59 +01:00
cndgrr
43d845575a docs(builder): state #276's collapse rule in full, not by allusion 2026-08-04 13:39:06 +00:00
cndgrr
4800aef363 docs(builder): restore the re-request deferral and three clauses the audit found 2026-08-04 13:36:41 +00:00
cndgrr
b4779bbc18 docs(builder): keep code spans unbroken across the wrap 2026-08-04 13:32:36 +00:00
cndgrr
46aeb02078 docs(builder): restore five rules the squeeze had compressed away 2026-08-04 13:31:48 +00:00
cndgrr
4100121c7a docs(builder): final squeeze — 272 lines, every D2 rule intact 2026-08-04 13:30:12 +00:00
cndgrr
cef7ea206b docs(builder): WIP — proposal biography and list scaffolding out 2026-08-04 13:27:52 +00:00
cndgrr
e1c3e3e9af docs(builder): WIP — terse register throughout 2026-08-04 13:23:56 +00:00
cndgrr
1b6143f4aa docs(builder): WIP — drop optional whys, classes as a list 2026-08-04 13:21:26 +00:00
cndgrr
92ff82c1c6 docs(builder): WIP — minimal-statement register 2026-08-04 13:18:31 +00:00
Andriujose
5ea59780b6 docs(triage): scope no-assignee bug to flagging 2026-08-04 13:16:58 +00:00
cndgrr
d25cbb04b7 docs(builder): WIP — further compression, ruling ladder tightened 2026-08-04 13:16:37 +00:00
cndgrr
e3ec95bb37 docs(builder): WIP — tighter register across every section 2026-08-04 13:14:35 +00:00
Daniel Marin
4e0c5c2568
Merge pull request #294 from andriujoseba/build/291-terminal-fragment-cites
docs: add terminal citations to 0.6.0 fragments
2026-08-04 14:14:23 +01:00
cndgrr
6ebdd2efd9 docs(builder): WIP — slim BUILDER.md to the rules, bare local cites 2026-08-04 13:11:32 +00:00
Daniel Marin
acf4125fd6
Merge branch 'main' into build/291-terminal-fragment-cites 2026-08-04 14:11:20 +01:00
Daniel Marin
2e11855839
Merge pull request #289 from cndgrr/build/262-fragment-cite
feat(changelog): the terminal issue cite joins the fragment guard
2026-08-04 13:58:32 +01:00
Andriujose
7af13eae73 docs: add terminal citations to release fragments 2026-08-04 12:53:38 +00:00
cndgrr
9f1f88de72 fix(changelog): #285's fragment carries a terminal cite
changelog.d/253.md landed on main after this branch's point with the
cite trailing the period — the crew#309 shape, the fifth fragment to
arrive with it since #262 measured two. The criterion is that
changelog.d/ is clean at the head, and the head CI reviews is the merge
with main, which is where this one surfaced.

Refs #262.
2026-08-04 12:40:55 +00:00
cndgrr
d13f61b6c5 merge: origin/main — #285's fragment lands under the rule
The self-guards job checks out the merge of this branch with main, so
changelog.d/253.md from #285 reaches changelog_fragment_problem there and
nowhere else; the branch alone is green. Merged rather than rebased
because the round's reviewers track head SHAs.

Refs #262.
2026-08-04 12:39:55 +00:00
cndgrr
75a5b68c8a fix(changelog): one fragment, one diagnosis, wherever the long entry sits
awk runs END on the way out of an exit from a main rule, so the length
row printed mid-file was followed by the citation row it outranks — the
internal protocol line landing inside the human-facing excerpt. Found by
claude-bot and kimi-bot in #262's first round, independently and with the
same reproduction.

The guard is the reported flag the empty-heading walk in this same
predicate already uses. The fixtures are the axis 57.md could not reach:
its over-bound entry is last, so only END's flush can print. 58.md puts
one before another bullet, 59.md before a heading and after a misplaced
cite. With lib/changelog.sh alone reverted they red, which is what the
green suite was hiding.

Refs #262.
2026-08-04 12:38:13 +00:00
Daniel Marin
d30b091872
Merge pull request #285 from andriujoseba/build/253-release-init-announce
feat: announce release initialization
2026-08-04 13:22:21 +01:00
cndgrr
84c73fe22e test(changelog): the precedence case runs in the order that can fail
Refs #262
2026-08-04 12:16:49 +00:00
cndgrr
175e082c1b test(release-exercise): the replay's fragment fixture carries a cite
The step-replay job builds a consumer tree and runs the REAL assembler
over it, so its changelog.d/42.md is a fragment fixture like every one in
test/ — and the only one living outside it. #262's diff-surface criterion
says no workflow file; the criterion and a green head cannot both hold
here, and the fixture is the smaller thing to move.

Refs #262
2026-08-04 12:15:04 +00:00
cndgrr
8aeea67d8d docs(changelog): the citation is guard-enforced, not house style
Closes #262
2026-08-04 12:12:52 +00:00
cndgrr
f4cb970097 test(changelog): the cite rule's own cases, both callers asserted
Refs #262
2026-08-04 12:11:09 +00:00
ca99182e80 fix(forge): percent-encode asset names, and stop the docs naming a client
Both findings are @codex's on !193 (#1583), and both are real.

The asset name travels as a QUERY VALUE, and the artifact-hook contract
permits any file the consumer drops in RELEASE_ASSETS_DIR. Raw
interpolation meant `release asset.tgz` made curl reject the URL outright
(exit 3), and '&', '#', '+', '%' silently changed the name or the query's
shape. `gh release create` handled all of those, so a 1:1 port had to.

Encoded through one boundary — jq's @uri, since jq is already a hard
dependency of this backend and a hand-rolled sed class is how the next
unescaped character gets through. Six backend cases cover it: the encoder
on a space and on the delimiters, uploads under both names, the created
release id in the path, and the multipart attachment. Mutation-checked:
dropping the encoder fails exactly the two name assertions.

docs/CONSUMERS.md's artifact-hook recovery still told operators to "run
`gh release create` by hand" and described the hook as running "before
`gh release create`" — on a Forgejo runner that is precisely the failure
this PR fixes. It now names the forge-neutral tag-door recovery first and
shows both clients for the manual path, without regressing the GitHub
guidance.

1035 assertions, 22 suites, shellcheck-all and actionlint clean.

Refs #191

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-04 12:11:06 +00:00
cndgrr
ef818001d0 test(changelog): every fragment fixture carries a terminal cite
Scoped to the fixtures the new rule actually binds: a fragment whose
predicate complaint is already its name, a smuggled heading, a dangling
heading or the 300-character bound is left alone, so the diagnosis it
tests is still the one it draws. The section-predicate fixtures are
untouched (D4).

The computed-length fixtures keep their measured lengths: the cite is
seven characters, so an entry that must measure exactly 300 builds 293
of the run and lets the cite carry the rest. 33.md's cite lands on the
last continuation line, which is the wrapped-citation case.

Refs #262
2026-08-04 12:08:54 +00:00