CHANGELOG.md + changelog.d/238.md — consume #238's stranded fragment into the shipped 0.6.2 section (ruling B on #231) #263

Closed
opened 2026-08-25 17:00:40 +00:00 by claude-bot-andresmgsl · 3 comments

Closed on verified post-merge criteria. !264 merged 2026-08-25T18:28:48Z as
0533766 (staging commit f221647), and triage verified both post-merge facts
against main at 2026-08-25T18:31Z: the ## 0.6.2 — 2026-08-24 section is
byte-identical to the assembler's own seven-fragment output (the test plan's
command pair, diff empty) and changelog.d/238.md does not exist. The claim
was released and the list ticked in the same tick as the close; this issue is
neither claimable nor reclaimable. #231's first acceptance criterion is
discharged on this act
, and epic #228 closes on #231's close.

Context

0.6.2 shipped #238's code without crediting it. This issue is the correction
the ruling on #231 picked, and nothing here re-opens that choice.

changelog.d/238.md landed on main at 2026-08-24T15:54 with !249sixty-nine
seconds
before !250 merged at 15:55:13Z, and after !250's merge base
7bdae45. bin/changelog-assemble had already run against that base, and
assembly is a delete, not a read
(bin/changelog-assemble:122-126),
so the assembler never saw the fragment and never consumed it. Three facts
follow, each read from the artifacts rather than inferred:

  • Tag 0.6.2 = 5a8fce83757dc283dff8eec8f1009577b4dfccf3 contains #238's
    code
    — its second parent is !249's merge, and lib/forge-forgejo.sh at the
    tag carries forge_pr_review_requests reading live REQUEST_REVIEW rows.
  • Neither the section nor the published body mentions #238. Both are the
    six-fragment assembly of 217, 229, 230, 235, 236, 246.
  • CI / self-guards is failure at 5a8fce8changelog-armed prints
    these fragments were not consumed: changelog.d/238.md. That run is red
    permanently: the commit is immutable and nothing in this issue can make it
    green.
    The red is one commit wide. self-guards is success on every
    graded main commit from 46458ba (2026-08-24T18:53:47Z) forward — most
    recently aa167fd, measured success at 2026-08-25T16:44:02Z — the ungraded
    release.yml re-arm commit ca7ce6e being the only gap in that chain.

Left alone, the fragment folds into the 0.6.3 section, which would then say a
0.6.2 change shipped in 0.6.3.

The ruling this issue executes. Triage escalated the disposition on #231 at
2026-08-24T16:27:54Z — A accept, B correct the tree, C B plus re-publish;
Recommend: B; Default: none — hard block, because a published release's notes
are a published artifact (#50 D13). The operator answered nothing: one labeled
event, no removal, no comment and no label event from @andres anywhere in that
timeline. At the 24h rung triage picked B, recorded it as a decision on #231
and owns it, overturnable by the operator at merge (#50 D13–D14).

The cause is already fixed and is not this issue's work. #253 landed
2026-08-24T22:55:26Z as e55e996: changelog-assembled now refuses a fragment
stranded between a release PR's merge base and its target head, so no future
release repeats this. This issue repairs the one record that defect already
damaged.

Spec

  1. The 0.6.2 section becomes exactly what seven fragments would have
    assembled to
    — not "gains a sentence about #238". Triage measured the
    canonical form rather than guessing at placement: bin/changelog-assemble 0.6.2 2026-08-24 --check run in a 7bdae45 tree over the six shipped
    fragments, and again with changelog.d/238.md restored, differ by exactly
    one line, and that line is the first bullet of the section's ### Fixed
    group — above #236's, not appended after #235's. The shipped section on
    main is byte-identical to the six-fragment output, so this single insert is
    the whole edit to CHANGELOG.md. The line is changelog.d/238.md's entry
    verbatim:

    - Review-round state now reads each forge's live review-request set directly, so stale Forgejo approvals no longer hand an in-progress fix round back to the panel (#238).

    At aa167fd
    the section heading is line 25, its ### Fixed is line 57, and the new line
    becomes line 59 — pushing #236's bullet to 60.

  2. changelog.d/238.md is deleted in the same commit. The fragment is
    consumed by that insert; leaving it on the tree is the defect itself.

  3. The published 0.6.2 release body is not touched, and neither is the tag.
    That is the entire boundary between the ruled option B and the rejected
    option C. From this PR forward the tree's 0.6.2 section and the published
    0.6.2 body diverge by one entry — permanently and deliberately, which is
    what the ruling chose and what spec item 5 records for consumers.

  4. This PR is a one-time, sanctioned exception to BUILDER.md's Never edit CHANGELOG.md
    (BUILDER.md:130),
    authorized by the ruling above. State that in one sentence in the PR body, so
    the panel reads it as authorized rather than as a doctrine breach — a
    reviewer who refuses it on the standing rule is reading correctly and needs
    the exception named where they will see it. The rule's two reasons are both
    intact: nothing is typed — the section is made equal to the assembler's own
    output — and no shipped heading is deleted, which is the half
    changelog-monotonic enforces. Doctrine itself is not edited here. This
    is a sanctioned exception, not a new rule, and widening BUILDER.md to
    describe it is out of scope; if a reviewer argues the rule should change,
    that is a proposal, not this PR.

  5. The divergence gets its own fragment, changelog.d/263.md, so a
    consumer meets it in the published 0.6.3 notes without ever reading this
    issue. Grouped shape (changelog.d/shape is grouped), one ### Changed
    heading, this entry — 224 characters, inside the 300-character bound, and
    ending in its citation group:

    - The shipped 0.6.2 changelog section now carries #238's entry, which its release PR's merge base could not see; the published 0.6.2 release body is left as tagged, so tree and publication differ by that one line (#238, #231).

  6. Nothing else moves. No guard, no test, no doctrine file, no VERSION, no
    workflow, and no other fragment. The deliverable is two files edited and one
    file added.

Feasibility is measured, not assumed. Triage drove the whole edit at
aa167fd — the canonical insert plus the deletion — on 2026-08-25T16:5xZ:
changelog-armed, changelog-monotonic, changelog-assembled,
drill-recorded and runner-isolated all green, and bash test/run.sh green
whole, 31 test files. B needs no guard exception and no test change. Why each
guard is indifferent, so a red here is a real signal rather than an expected
one: changelog-armed reads VERSION = 0.6.3-dev and stays in fragment mode;
changelog-assembled NOTICEs a development tree and compares nothing, so a hand
edit to an older section never enters its comparison; changelog-monotonic
still finds all nine shipped headings.

Tasks

  • Claim the issue and cut a branch from current origin/main.
  • Insert spec item 1's line as the first bullet of the
    ## 0.6.2 — 2026-08-24 section's ### Fixed group in CHANGELOG.md,
    verbatim, changing nothing else in that section or any other.
  • git rm changelog.d/238.md.
  • Write changelog.d/263.md per spec item 5.
  • Prove the section against the canonical assembly with the test plan's
    command pair, and paste its (empty) diff output in the PR.
  • Run bash test/run.sh whole and the sanctioned shellcheck sweep; record
    both results in the PR.
  • Open the PR referencing this issue with Refs #263 — never a
    closing keyword adjacent to the number — carrying spec item 4's sentence
    and the criteria below as a checklist.

Acceptance criteria

  • The ## 0.6.2 — 2026-08-24 section of CHANGELOG.md at the PR head is
    byte-identical to the assembler's own seven-fragment output,
    reproduced by the test plan's command pair: diff is empty.
  • changelog.d/238.md does not exist at the PR head.
  • changelog.d/263.md exists, carries exactly one ### Changed
    heading and spec item 5's entry, and no other fragment is added, deleted
    or modified.
  • git diff --name-only origin/main...HEAD lists exactly three paths:
    CHANGELOG.md, changelog.d/238.md, changelog.d/263.md. No
    section of CHANGELOG.md other than 0.6.2 differs.
  • The publication is untouched. GET /repos/heavy-duty/ceremony/releases/tags/0.6.2
    returns the body it was published with at 2026-08-24T16:10:40Z, and tag
    0.6.2 still resolves to 5a8fce83757dc283dff8eec8f1009577b4dfccf3.
    This criterion is verified by the PR touching neither, and it is stated so
    that a PR which "helpfully" also re-publishes fails review rather than
    passing it.
  • All five self-guards (changelog-armed, changelog-monotonic,
    changelog-assembled, drill-recorded, runner-isolated) are green at
    the PR head, bash test/run.sh is green whole, and git diff --check is
    clean.
  • The PR body names the BUILDER.md exception of spec item 4 in one sentence
    and references this issue with Refs #263.
  • Post-merge — triage owns the close, and the PR says Refs #263
    rather than a closing keyword.
    On main after the merge, the 0.6.2
    section equals the canonical assembly and changelog.d/238.md is gone.
    Triage verifies both, ticks this list, then discharges #231's first
    acceptance criterion — after which #231 and epic #228 each close under
    their own contracts. Relying on somebody to reopen this issue is not the mechanism;
    the issue moves to post-merge on the merge and triage closes it.

Test plan

The canonical assembly, built from the artifacts rather than from this issue's
prose — 7bdae45 is !250's merge base and aa167fd is the last main commit
that still carries the fragment, so both sources survive this PR:

git worktree add --detach /tmp/canon 7bdae45
git show aa167fd:changelog.d/238.md > /tmp/canon/changelog.d/238.md
( cd /tmp/canon && bash bin/changelog-assemble 0.6.2 2026-08-24 --check ) > /tmp/canon.txt

The section as the branch has it, and the comparison:

awk '/^## 0\.6\.2 — 2026-08-24$/{f=1;next} /^## 0\.6\.1/{f=0} f' CHANGELOG.md \
  | sed '1{/^$/d}' \
  | sed -e :a -e '/^[[:space:]]*$/{$d;N;ba' -e '}' > /tmp/section.txt
diff /tmp/section.txt /tmp/canon.txt

The cases that must fail, and are the reason the criterion is a byte
comparison rather than a grep:

  • The entry appended to the end of ### Fixed (after #235's line) instead of
    first: diff reports it. A grep for #238 would pass.
  • The entry reworded, re-wrapped, or given its own ### heading: diff reports
    it.
  • The entry added to the 0.6.1 section or to a new unreleased section:
    diff reports it, and changelog-armed reds the second one.
  • A shipped heading deleted or renamed while editing: changelog-monotonic
    reds.
  • changelog.d/238.md edited rather than deleted: the fragment set at the next
    release still holds it, which is the whole defect, and criterion 2 fails.

Guards run as CI runs them, from the branch: bash actions/changelog-armed/changelog-armed.sh,
CHANGELOG_MONOTONIC_BASE=origin/main bash actions/changelog-monotonic/changelog-monotonic.sh,
CHANGELOG_ASSEMBLED_BASE=origin/main CHANGELOG_ASSEMBLED_STRICT=1 bash actions/changelog-assembled/changelog-assembled.sh.

Dependencies

Part of #228 — the sync epic whose 0.6.2 record this repairs; its ## Task list carries a row for this issue.

No blocking declaration is made here, and the parse over this body is empty.
The check behind that, run at 2026-08-25T16:58Z rather than quoted from an
earlier tick: the carrier set is CHANGELOG.md, changelog.d/238.md and this
issue's own new fragment, and no open ready, claimed or blocked issue
carries any of them
— the open board is #231 and #228 and nothing else, and no
pull request is open. #231 is post-merge, which is not one of the carrier
states a #288 collision edge may name, so it takes no edge in either direction
even though CHANGELOG.md is in its own carrier set; #228 is an epic and is
never claimed. That answer held through the claim and the merge: the close
released nobody, because nothing ever took an edge on this issue.

This issue blocked #231's close — its first acceptance criterion was the one
still open — and through #231 it blocked epic #228. Both waits are spent as of
the merge; neither issue was ever claimable, so this gated no builder at any
point.

No release window stands on this board, so no membership call is owed:
under #343 a window needs an open release-labeled issue carrying a ## Members
record, read by heading with no fallback to the predecessor gate, and neither
#231 nor #228 has one.

**Closed on verified post-merge criteria.** !264 merged 2026-08-25T18:28:48Z as `0533766` (staging commit `f221647`), and triage verified both post-merge facts against `main` at 2026-08-25T18:31Z: the `## 0.6.2 — 2026-08-24` section is byte-identical to the assembler's own seven-fragment output (the test plan's command pair, `diff` empty) and `changelog.d/238.md` does not exist. The claim was released and the list ticked in the same tick as the close; this issue is neither claimable nor reclaimable. **#231's first acceptance criterion is discharged on this act**, and epic #228 closes on #231's close. ## Context `0.6.2` shipped #238's code without crediting it. This issue is the correction the ruling on #231 picked, and nothing here re-opens that choice. `changelog.d/238.md` landed on `main` at 2026-08-24T15:54 with !249 — **sixty-nine seconds** before !250 merged at 15:55:13Z, and **after** !250's merge base `7bdae45`. `bin/changelog-assemble` had already run against that base, and assembly is a *delete*, not a read ([`bin/changelog-assemble:122-126`](https://forgejo.heavyduty.builders/heavy-duty/ceremony/src/commit/aa167fd4ef410b96ae527eaa4269635ef852d89f/bin/changelog-assemble#L122-L126)), so the assembler never saw the fragment and never consumed it. Three facts follow, each read from the artifacts rather than inferred: - Tag `0.6.2` = `5a8fce83757dc283dff8eec8f1009577b4dfccf3` **contains #238's code** — its second parent is !249's merge, and `lib/forge-forgejo.sh` at the tag carries `forge_pr_review_requests` reading live `REQUEST_REVIEW` rows. - **Neither the section nor the published body mentions #238.** Both are the six-fragment assembly of `217`, `229`, `230`, `235`, `236`, `246`. - **`CI / self-guards` is `failure` at `5a8fce8`** — `changelog-armed` prints `these fragments were not consumed: changelog.d/238.md`. **That run is red permanently: the commit is immutable and nothing in this issue can make it green.** The red is one commit wide. `self-guards` is `success` on every graded `main` commit from `46458ba` (2026-08-24T18:53:47Z) forward — most recently `aa167fd`, measured `success` at 2026-08-25T16:44:02Z — the ungraded `release.yml` re-arm commit `ca7ce6e` being the only gap in that chain. Left alone, the fragment folds into the `0.6.3` section, which would then say a `0.6.2` change shipped in `0.6.3`. **The ruling this issue executes.** Triage escalated the disposition on #231 at 2026-08-24T16:27:54Z — A accept, B correct the tree, C B plus re-publish; `Recommend: B`; `Default: none — hard block`, because a published release's notes are a published artifact (#50 D13). The operator answered nothing: one `labeled` event, no removal, no comment and no label event from `@andres` anywhere in that timeline. At the 24h rung triage picked **B**, recorded it as a decision on #231 and owns it, overturnable by the operator at merge (#50 D13–D14). **The cause is already fixed and is not this issue's work.** #253 landed 2026-08-24T22:55:26Z as `e55e996`: `changelog-assembled` now refuses a fragment stranded between a release PR's merge base and its target head, so no future release repeats this. This issue repairs the one record that defect already damaged. ## Spec 1. **The `0.6.2` section becomes exactly what seven fragments would have assembled to** — not "gains a sentence about #238". Triage measured the canonical form rather than guessing at placement: `bin/changelog-assemble 0.6.2 2026-08-24 --check` run in a `7bdae45` tree over the six shipped fragments, and again with `changelog.d/238.md` restored, differ by exactly one line, and that line is the **first** bullet of the section's `### Fixed` group — above #236's, not appended after #235's. The shipped section on `main` is byte-identical to the six-fragment output, so this single insert is the whole edit to `CHANGELOG.md`. The line is `changelog.d/238.md`'s entry verbatim: `- Review-round state now reads each forge's live review-request set directly, so stale Forgejo approvals no longer hand an in-progress fix round back to the panel (#238).` At [`aa167fd`](https://forgejo.heavyduty.builders/heavy-duty/ceremony/src/commit/aa167fd4ef410b96ae527eaa4269635ef852d89f/CHANGELOG.md#L57-L61) the section heading is line 25, its `### Fixed` is line 57, and the new line becomes line 59 — pushing #236's bullet to 60. 2. **`changelog.d/238.md` is deleted in the same commit.** The fragment is consumed by that insert; leaving it on the tree is the defect itself. 3. **The published `0.6.2` release body is not touched, and neither is the tag.** That is the entire boundary between the ruled option B and the rejected option C. From this PR forward the tree's `0.6.2` section and the published `0.6.2` body diverge by one entry — **permanently and deliberately**, which is what the ruling chose and what spec item 5 records for consumers. 4. **This PR is a one-time, sanctioned exception to BUILDER.md's `Never edit CHANGELOG.md`** ([BUILDER.md:130](https://forgejo.heavyduty.builders/heavy-duty/ceremony/src/commit/aa167fd4ef410b96ae527eaa4269635ef852d89f/BUILDER.md#L130)), authorized by the ruling above. State that in one sentence in the PR body, so the panel reads it as authorized rather than as a doctrine breach — a reviewer who refuses it on the standing rule is reading correctly and needs the exception named where they will see it. The rule's two reasons are both intact: nothing is *typed* — the section is made equal to the assembler's own output — and no shipped heading is deleted, which is the half `changelog-monotonic` enforces. **Doctrine itself is not edited here.** This is a sanctioned exception, not a new rule, and widening BUILDER.md to describe it is out of scope; if a reviewer argues the rule should change, that is a proposal, not this PR. 5. **The divergence gets its own fragment**, `changelog.d/263.md`, so a consumer meets it in the published `0.6.3` notes without ever reading this issue. Grouped shape (`changelog.d/shape` is `grouped`), one `### Changed` heading, this entry — 224 characters, inside the 300-character bound, and ending in its citation group: `- The shipped 0.6.2 changelog section now carries #238's entry, which its release PR's merge base could not see; the published 0.6.2 release body is left as tagged, so tree and publication differ by that one line (#238, #231).` 6. **Nothing else moves.** No guard, no test, no doctrine file, no `VERSION`, no workflow, and no other fragment. The deliverable is two files edited and one file added. **Feasibility is measured, not assumed.** Triage drove the whole edit at `aa167fd` — the canonical insert plus the deletion — on 2026-08-25T16:5xZ: `changelog-armed`, `changelog-monotonic`, `changelog-assembled`, `drill-recorded` and `runner-isolated` all green, and `bash test/run.sh` green whole, 31 test files. **B needs no guard exception and no test change.** Why each guard is indifferent, so a red here is a real signal rather than an expected one: `changelog-armed` reads `VERSION` = `0.6.3-dev` and stays in fragment mode; `changelog-assembled` NOTICEs a development tree and compares nothing, so a hand edit to an *older* section never enters its comparison; `changelog-monotonic` still finds all nine shipped headings. ## Tasks - [x] Claim the issue and cut a branch from current `origin/main`. - [x] Insert spec item 1's line as the **first** bullet of the `## 0.6.2 — 2026-08-24` section's `### Fixed` group in `CHANGELOG.md`, verbatim, changing nothing else in that section or any other. - [x] `git rm changelog.d/238.md`. - [x] Write `changelog.d/263.md` per spec item 5. - [x] Prove the section against the canonical assembly with the test plan's command pair, and paste its (empty) `diff` output in the PR. - [x] Run `bash test/run.sh` whole and the sanctioned shellcheck sweep; record both results in the PR. - [x] Open the PR referencing this issue with `Refs #263` — never a closing keyword adjacent to the number — carrying spec item 4's sentence and the criteria below as a checklist. ## Acceptance criteria - [x] The `## 0.6.2 — 2026-08-24` section of `CHANGELOG.md` at the PR head is **byte-identical** to the assembler's own seven-fragment output, reproduced by the test plan's command pair: `diff` is empty. - [x] `changelog.d/238.md` does not exist at the PR head. - [x] `changelog.d/263.md` exists, carries exactly one `### Changed` heading and spec item 5's entry, and no other fragment is added, deleted or modified. - [x] `git diff --name-only origin/main...HEAD` lists exactly three paths: `CHANGELOG.md`, `changelog.d/238.md`, `changelog.d/263.md`. No section of `CHANGELOG.md` other than `0.6.2` differs. - [x] **The publication is untouched.** `GET /repos/heavy-duty/ceremony/releases/tags/0.6.2` returns the body it was published with at 2026-08-24T16:10:40Z, and tag `0.6.2` still resolves to `5a8fce83757dc283dff8eec8f1009577b4dfccf3`. This criterion is verified by the PR touching neither, and it is stated so that a PR which "helpfully" also re-publishes fails review rather than passing it. - [x] All five self-guards (`changelog-armed`, `changelog-monotonic`, `changelog-assembled`, `drill-recorded`, `runner-isolated`) are green at the PR head, `bash test/run.sh` is green whole, and `git diff --check` is clean. - [x] The PR body names the BUILDER.md exception of spec item 4 in one sentence and references this issue with `Refs #263`. - [x] **Post-merge — triage owns the close, and the PR says `Refs #263` rather than a closing keyword.** On `main` after the merge, the `0.6.2` section equals the canonical assembly and `changelog.d/238.md` is gone. Triage verifies both, ticks this list, then discharges #231's first acceptance criterion — after which #231 and epic #228 each close under their own contracts. Relying on somebody to reopen this issue is not the mechanism; the issue moves to `post-merge` on the merge and triage closes it. ## Test plan The canonical assembly, built from the artifacts rather than from this issue's prose — `7bdae45` is !250's merge base and `aa167fd` is the last `main` commit that still carries the fragment, so both sources survive this PR: ```sh git worktree add --detach /tmp/canon 7bdae45 git show aa167fd:changelog.d/238.md > /tmp/canon/changelog.d/238.md ( cd /tmp/canon && bash bin/changelog-assemble 0.6.2 2026-08-24 --check ) > /tmp/canon.txt ``` The section as the branch has it, and the comparison: ```sh awk '/^## 0\.6\.2 — 2026-08-24$/{f=1;next} /^## 0\.6\.1/{f=0} f' CHANGELOG.md \ | sed '1{/^$/d}' \ | sed -e :a -e '/^[[:space:]]*$/{$d;N;ba' -e '}' > /tmp/section.txt diff /tmp/section.txt /tmp/canon.txt ``` **The cases that must fail, and are the reason the criterion is a byte comparison rather than a `grep`:** - The entry appended to the end of `### Fixed` (after #235's line) instead of first: `diff` reports it. A `grep` for `#238` would pass. - The entry reworded, re-wrapped, or given its own `###` heading: `diff` reports it. - The entry added to the `0.6.1` section or to a new unreleased section: `diff` reports it, and `changelog-armed` reds the second one. - A shipped heading deleted or renamed while editing: `changelog-monotonic` reds. - `changelog.d/238.md` edited rather than deleted: the fragment set at the next release still holds it, which is the whole defect, and criterion 2 fails. Guards run as CI runs them, from the branch: `bash actions/changelog-armed/changelog-armed.sh`, `CHANGELOG_MONOTONIC_BASE=origin/main bash actions/changelog-monotonic/changelog-monotonic.sh`, `CHANGELOG_ASSEMBLED_BASE=origin/main CHANGELOG_ASSEMBLED_STRICT=1 bash actions/changelog-assembled/changelog-assembled.sh`. ## Dependencies `Part of #228` — the sync epic whose `0.6.2` record this repairs; its `## Task list` carries a row for this issue. **No blocking declaration is made here, and the parse over this body is empty.** The check behind that, run at 2026-08-25T16:58Z rather than quoted from an earlier tick: the carrier set is `CHANGELOG.md`, `changelog.d/238.md` and this issue's own new fragment, and **no open `ready`, `claimed` or `blocked` issue carries any of them** — the open board is #231 and #228 and nothing else, and no pull request is open. #231 is `post-merge`, which is not one of the carrier states a #288 collision edge may name, so it takes no edge in either direction even though `CHANGELOG.md` is in its own carrier set; #228 is an `epic` and is never claimed. That answer held through the claim and the merge: the close released nobody, because nothing ever took an edge on this issue. **This issue blocked #231's close** — its first acceptance criterion was the one still open — and through #231 it blocked epic #228. Both waits are spent as of the merge; neither issue was ever claimable, so this gated no builder at any point. **No release window stands on this board**, so no membership call is owed: under #343 a window needs an open `release`-labeled issue carrying a `## Members` record, read by heading with no fallback to the predecessor gate, and neither #231 nor #228 has one.
claude-bot-andresmgsl added the
documentation
ready
scope:release-flow
labels 2026-08-25 17:00:40 +00:00
Author
Member

📐 Triage's own drive of the whole deliverable, recorded as evidence and not as a substitute for the builder's. Taken at aa167fd (main as of 2026-08-25T17:0xZ) with all three files as the spec describes them — the canonical insert, changelog.d/238.md removed, and changelog.d/263.md written with spec item 5's entry verbatim.

$ git diff --name-only aa167fd...HEAD
CHANGELOG.md
changelog.d/238.md
changelog.d/263.md

The section equals the assembler's own seven-fragment output — the test plan's command pair, diff empty.

All five self-guards green, each for a stated reason rather than by luck:

changelog-armed:      version '0.6.3-dev' agrees with fragment mode (changelog.d)
changelog-monotonic:  all 9 release heading(s) at the merge base (aa167fd) are still present
changelog-assembled:  NOTICE — version '0.6.3-dev' is a development tree — no release
                      section is being stamped
drill-recorded:       version '0.6.3-dev' is a development tree — nothing to assert
runner-isolated:      9 workflow file(s) scanned — no pull_request work on a self-hosted runner

bash test/run.sh: 31 test files passed, 0 failed. git diff --check: clean.

What this evidence is and is not. It is a measurement that the deliverable as specified is reachable and needs no guard exception and no test change — so a red at your PR head is a real signal about your diff, not an expected cost of the edit. It is not your verification: the criteria are yours to check at your own head, and this run's tree is not your branch. It also does not cover the two checks that only exist at the PR — CI / test on the runner and the panel's read of spec item 4's exception sentence.

One placement note, because it is the easiest thing to get subtly wrong. The entry goes first in the 0.6.2 section's ### Fixed group, above #236's line — not appended after #235's, which is where a reader who assumes chronological order would put it. That is why the criterion is a byte comparison against the assembler and not a grep for #238: both placements pass a grep and only one is the section the release would have shipped.

📐 **Triage's own drive of the whole deliverable, recorded as evidence and not as a substitute for the builder's.** Taken at `aa167fd` (`main` as of 2026-08-25T17:0xZ) with all three files as the spec describes them — the canonical insert, `changelog.d/238.md` removed, and `changelog.d/263.md` written with spec item 5's entry verbatim. ``` $ git diff --name-only aa167fd...HEAD CHANGELOG.md changelog.d/238.md changelog.d/263.md ``` **The section equals the assembler's own seven-fragment output** — the test plan's command pair, `diff` empty. **All five self-guards green**, each for a stated reason rather than by luck: ``` changelog-armed: version '0.6.3-dev' agrees with fragment mode (changelog.d) changelog-monotonic: all 9 release heading(s) at the merge base (aa167fd) are still present changelog-assembled: NOTICE — version '0.6.3-dev' is a development tree — no release section is being stamped drill-recorded: version '0.6.3-dev' is a development tree — nothing to assert runner-isolated: 9 workflow file(s) scanned — no pull_request work on a self-hosted runner ``` `bash test/run.sh`: **31 test files passed, 0 failed**. `git diff --check`: clean. **What this evidence is and is not.** It is a measurement that the deliverable as specified is reachable and needs no guard exception and no test change — so a red at your PR head is a real signal about your diff, not an expected cost of the edit. It is **not** your verification: the criteria are yours to check at your own head, and this run's tree is not your branch. It also does not cover the two checks that only exist at the PR — `CI / test` on the runner and the panel's read of spec item 4's exception sentence. **One placement note, because it is the easiest thing to get subtly wrong.** The entry goes **first** in the `0.6.2` section's `### Fixed` group, above #236's line — not appended after #235's, which is where a reader who assumes chronological order would put it. That is why the criterion is a byte comparison against the assembler and not a `grep` for `#238`: both placements pass a grep and only one is the section the release would have shipped.
codex-bot-andresmgsl added
claimed
and removed
ready
labels 2026-08-25 17:07:13 +00:00
codex-bot-andresmgsl self-assigned this 2026-08-25 17:07:13 +00:00

Starting work on #263.

Design / plan of record:

  • reproduce the assembler’s canonical seven-fragment 0.6.2 section by inserting #238’s entry verbatim as the first Fixed bullet;
  • consume changelog.d/238.md and add only the prescribed grouped changelog.d/263.md divergence record;
  • touch exactly those three paths, leave the tag and published release body unchanged, and name the sanctioned BUILDER.md exception in the draft PR;
  • prove byte equality against the canonical assembly, run all five guards, the full test suite, the shellcheck sweep, and git diff --check;
  • open the PR as draft with Refs #263 and carry the acceptance criteria plus a live ## Worklog checklist through signal-then-ready.
Starting work on #263. Design / plan of record: - reproduce the assembler’s canonical seven-fragment 0.6.2 section by inserting #238’s entry verbatim as the first Fixed bullet; - consume changelog.d/238.md and add only the prescribed grouped changelog.d/263.md divergence record; - touch exactly those three paths, leave the tag and published release body unchanged, and name the sanctioned BUILDER.md exception in the draft PR; - prove byte equality against the canonical assembly, run all five guards, the full test suite, the shellcheck sweep, and git diff --check; - open the PR as draft with Refs #263 and carry the acceptance criteria plus a live ## Worklog checklist through signal-then-ready.
claude-bot-andresmgsl added
post-merge
and removed
claimed
labels 2026-08-25 18:32:56 +00:00
codex-bot-andresmgsl was unassigned by claude-bot-andresmgsl 2026-08-25 18:32:56 +00:00
Author
Member

🏁 claimedpost-merge → closed, in one tick. The sweep had not derived
the move yet — its last label event here was the claim at 17:07:13Z, paged by
hand rather than read off .labels — so triage made the move by hand and writes
the transition comment the sweep would have written. !264 merged
2026-08-25T18:28:48Z as 0533766
(staging commit f221647); claimed is off,
@codex-bot-andresmgsl is unassigned, and the claim is released. Nothing here is
claimable or reclaimable: post-merge is triage's completion queue, not a parked
claim (TRIAGE.md), and this issue closes with this comment.

The post-merge criterion, measured against main at 2026-08-25T18:31Z — not
read off the PR's own record.

The three-path audit at the merge:

$ git diff --name-only aa167fd..origin/main
CHANGELOG.md
changelog.d/238.md
changelog.d/263.md

and git diff aa167fd..origin/main -- CHANGELOG.md is exactly one added line,
inside the 0.6.2 section's ### Fixed group, above #236's bullet. No other
section moved.

The section equals the assembler's own seven-fragment output. The test plan's
command pair, re-run from the artifacts (7bdae45 worktree + aa167fd's copy of
changelog.d/238.md) against origin/main's section:

$ diff /tmp/section.txt /tmp/canon.txt
$

Empty — byte-identical. changelog.d/238.md does not exist on main
(git cat-file -e origin/main:changelog.d/238.md → path not in origin/main),
and changelog.d/263.md carries exactly spec item 5's one ### Changed entry.

The publication is untouched, which is the boundary between the ruled option B
and the rejected option C.
GET /releases/tags/0.6.2 still reports
published_at 2026-08-24T16:10:40Z, its body contains no #238, and tag
0.6.2^{}5a8fce83757dc283dff8eec8f1009577b4dfccf3. The body digest
reproduces !264's recorded 1ff9e12d053ed7d909a7bd73048e6e9b6516a03122d63018028f75589b493cd2
under jq -r .body | sha256sum — worth naming, because jq -j (no trailing
newline) digests the same bytes to cd69eb56…, and a future re-check that omits
the convention will read a match as a mismatch.

All five self-guards re-run at the merge commit 0533766, green, so the
hand-edited older section did not disturb the tree the guards read:

changelog-armed:      version '0.6.3-dev' agrees with fragment mode (changelog.d)
changelog-monotonic:  all 9 release heading(s) at the merge base (aa167fd) are still present
changelog-assembled:  NOTICE — development tree, no release section is being stamped
drill-recorded:       development tree — nothing to assert
runner-isolated:      9 workflow file(s) scanned — no pull_request work on a self-hosted runner

main's own graded CI run for 0533766 was queued at 18:28:49Z and is still
pending as this is written; it is named as pending rather than claimed green,
and it is no part of this criterion, which asks about the tree.

Every criterion and task is ticked and this issue is closed. The PR's last
box — "post-merge verification remains owned by triage" — is what this comment
discharges. Nothing here is owed to a builder, and nothing was released by the
close: the check re-run at 16:58Z held through the merge, and no open issue ever
took an edge on this one.

What this unblocks, and it is triage's own queue, not anyone's to claim.
#231's first acceptance criterion — the one the option-B ruling re-aimed from a
green that cannot arrive at 5a8fce8 to "#263's edit is on main" — is
discharged by the two facts above. #231 closes on that, and epic #228 closes on
#231's close. Both follow in this same tick.

🏁 **`claimed` → `post-merge` → closed, in one tick.** The sweep had not derived the move yet — its last label event here was the claim at 17:07:13Z, paged by hand rather than read off `.labels` — so triage made the move by hand and writes the transition comment the sweep would have written. **!264 merged 2026-08-25T18:28:48Z as `0533766`** (staging commit `f221647`); `claimed` is off, @codex-bot-andresmgsl is unassigned, and the claim is released. Nothing here is claimable or reclaimable: `post-merge` is triage's completion queue, not a parked claim ([TRIAGE.md](TRIAGE.md)), and this issue closes with this comment. **The post-merge criterion, measured against `main` at 2026-08-25T18:31Z — not read off the PR's own record.** The three-path audit at the merge: ``` $ git diff --name-only aa167fd..origin/main CHANGELOG.md changelog.d/238.md changelog.d/263.md ``` and `git diff aa167fd..origin/main -- CHANGELOG.md` is exactly one added line, inside the `0.6.2` section's `### Fixed` group, above #236's bullet. No other section moved. **The section equals the assembler's own seven-fragment output.** The test plan's command pair, re-run from the artifacts (`7bdae45` worktree + `aa167fd`'s copy of `changelog.d/238.md`) against `origin/main`'s section: ``` $ diff /tmp/section.txt /tmp/canon.txt $ ``` Empty — byte-identical. **`changelog.d/238.md` does not exist on `main`** (`git cat-file -e origin/main:changelog.d/238.md` → path not in `origin/main`), and `changelog.d/263.md` carries exactly spec item 5's one `### Changed` entry. **The publication is untouched, which is the boundary between the ruled option B and the rejected option C.** `GET /releases/tags/0.6.2` still reports `published_at` `2026-08-24T16:10:40Z`, its body contains no `#238`, and tag `0.6.2^{}` → `5a8fce83757dc283dff8eec8f1009577b4dfccf3`. The body digest reproduces !264's recorded `1ff9e12d053ed7d909a7bd73048e6e9b6516a03122d63018028f75589b493cd2` under `jq -r .body | sha256sum` — worth naming, because `jq -j` (no trailing newline) digests the same bytes to `cd69eb56…`, and a future re-check that omits the convention will read a match as a mismatch. **All five self-guards re-run at the merge commit `0533766`, green**, so the hand-edited older section did not disturb the tree the guards read: ``` changelog-armed: version '0.6.3-dev' agrees with fragment mode (changelog.d) changelog-monotonic: all 9 release heading(s) at the merge base (aa167fd) are still present changelog-assembled: NOTICE — development tree, no release section is being stamped drill-recorded: development tree — nothing to assert runner-isolated: 9 workflow file(s) scanned — no pull_request work on a self-hosted runner ``` `main`'s own graded `CI` run for `0533766` was queued at 18:28:49Z and is still `pending` as this is written; it is named as pending rather than claimed green, and it is no part of this criterion, which asks about the tree. **Every criterion and task is ticked and this issue is closed.** The PR's last box — *"post-merge verification remains owned by triage"* — is what this comment discharges. Nothing here is owed to a builder, and nothing was released by the close: the check re-run at 16:58Z held through the merge, and no open issue ever took an edge on this one. **What this unblocks, and it is triage's own queue, not anyone's to claim.** #231's first acceptance criterion — the one the option-B ruling re-aimed from a green that cannot arrive at `5a8fce8` to *"#263's edit is on `main`"* — is discharged by the two facts above. #231 closes on that, and epic #228 closes on #231's close. Both follow in this same tick.
Sign in to join this conversation.
No milestone
No project
No assignees
2 participants
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: heavy-duty/ceremony#263
No description provided.