changelog_fragment_problem — entries are bounded at 300 characters #169
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
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference: heavy-duty/ceremony#169
Loading…
Reference in a new issue
No description provided.
Delete branch "build/167-fragment-entry-bound"
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?
Closes #167.
One definition of the bound, in
changelog_fragment_problem(D2):changelog-armedreds the PR that writes the fragment andbin/changelog-assemblerefuses at release, both by inheritance — neither grows a copy. The entry is measured normalized per D1 (continuation lines joined, whitespace collapsed, marker stripped, citation included), so wrapping alone can never red an entry. Doctrine names the number in BUILDER.md's fragment bullet and CHANGELOG.md's header (D5); published sections gain no rule (D4).Acceptance criteria
changelog-armed, naming the fragment, the length, the bound, and the split fix; an entry of exactly 300 passes.###headings count toward no entry and bullets under them are bounded the same.bash test/run.shgreen (18 files, 0 failed, under mawk 1.3.4 — the CI awk).Worklog
changelog_fragment_probleminlib/changelog.sh, mawk-compatible, with the D3 refusal message.test/changelog.test.sh(10 new cases) andtest/changelog-armed.test.sh(action path, 2 cases).changelog.d/167.md, flat — passing its own rule.bash test/run.sh+ CI'sshellcheck-all.shgreen locally.🤖 Generated with Claude Code
🔎 reviewing head
6c746364af🔎 reviewing head
6c746364afAll acceptance criteria are satisfied at
6c746364af173ec517e96924ea3752391c3dfe0e. The 300-character limit is defined only inchangelog_fragment_problem, measures normalized entry text without the bullet marker, preserves wrapping semantics, applies equally to flat and grouped fragments, and is inherited by both the PR-time armed guard and release-time assembler without extending validation to published sections. The refusal includes the fragment, measured length, bound, entry prefix, and split remedy, and both doctrine locations state the enforced bound and remedy.Verified locally:
bash test/run.sh(18 files, 0 failed),bash .github/scripts/shellcheck-all.sh(39 tracked scripts), andbash .github/scripts/actionlint-all.sh(6 files) all pass. GitHub's test, action-exercise, release-exercise, docs-sync-exercise, and self-guards checks are green for this head.Verdict: approve
Head
6c746364af173ec517e96924ea3752391c3dfe0eagainst issue #167.Acceptance criteria
changelog-armedwith fragment, length, bound, split fix; 300 passes###headings count toward no entry; bullets bounded the samechangelog_fragment_problem;changelog_section_problemunchangedlib/changelog.sh;changelog-armed.sh:93andbin/changelog-assemble:71call it; no second copybash test/run.shgreenDoctrine and the guard enforce the same number; fragment
changelog.d/167.mditself is within the bound (normalized entries ~186 / ~133).What I ran
bash test/run.sh— 18 files, 0 failed (mawk 1.3.4, same family as CI).bash .github/scripts/shellcheck-all.sh— clean.test,self-guards, release-exercise jobs green.Spec / code notes (non-blocking)
Normalization matches D1 (join continuations, collapse whitespace, strip marker, keep citation). Bound is exclusive (
len > max), so exactly 300 passes. Refusal names fragment, length, ~60-char preview, bound, and split fix. No request-changes.No gaps I could not verify; environment had mawk + shellcheck.
🔎 reviewing head
6c746364afApprove head
6c746364afagainst #167.Verified in a detached worktree at the head, under mawk 1.3.4 (the CI awk):
test/changelog.test.sh— 301 red / 300 pass at the boundary, several within-bound entries pass with a >300-char file, a ~250-char entry wrapped over continuation lines passes,###headings count toward no entry, and grouped bullets are bounded the same.test/changelog.test.sh: 65 passed, 0 failed. The two new action-path cases intest/changelog-armed.test.shalso pass — the refusal names the fragment, the measured length, the 300 bound, and the split fix (D3 message shape confirmed in the output).max=300exists only inchangelog_fragment_problem(lib/changelog.sh:161);actions/changelog-armed/changelog-armed.shandbin/changelog-assembleare untouched and inherit by call — no second copy.changelog_section_problemgains no length rule; the tests pin that 0.2.0/0.3.0's over-bound history reds nothing.changelog.d/167.mdpasses the new rule (ranchangelog_fragment_problemon it directly).-/*marker, and keeps the(#N)citation before measuring — read and traced by hand.Test-suite caveat:
bash test/run.shshows 63 FAILs on this box, but the run on baseorigin/main(9008e03) in a second worktree fails identically — all pre-existing environment gaps (no node/npm for the package-json backend cases, which also fail on base), none introduced by this PR. Every file this PR touches is green except the node-dependent package-json cases that red on base too.Could not verify locally: shellcheck/actionlint — neither is installed on this box; relying on CI for that gate. The new awk uses only mawk-safe constructs (no
\xescapes, no gawkisms) by inspection.Non-blocking nit: the awk accepts the
*marker per D1, but no test constructs a*-bulleted over-bound entry — worth one case at the builder's discretion.Round summary — converged, handing off
What shipped.
changelog_fragment_problem(lib/changelog.sh) now bounds each fragment entry at 300 characters, in exactly one function. The entry is measured normalized per D1 — continuation lines joined, whitespace collapsed, bullet marker stripped, citation included — so wrapping alone can never red an entry.changelog-armedreds the offending PR andbin/changelog-assemblerefuses at release, both by inheritance; neither grew a copy. In grouped fragments,###headings count toward no entry and bullets under them are bounded the same. Doctrine names the number in BUILDER.md's fragment bullet and CHANGELOG.md's header (D5); published sections gain no rule (D4). Tests: 10 new cases intest/changelog.test.sh(including the 300/301 boundary pair and the wrapped ~250-char entry), 2 action-path cases intest/changelog-armed.test.sh.changelog.d/167.mdrides along, flat, passing its own rule.Rounds. One. Head
6c74636is the first and only head; the panel (codex, grok, kimi) approved it unanimously with no changes requested — no addressing rounds.Verified.
bash test/run.shgreen locally (18 files, 0 failed, under mawk 1.3.4 — the CI awk) andshellcheck-all.shclean. CI green on the PR: all required checks pass. Three head-current approvals, noblocker:*, merges clean.Post-merge residue. None owed. The over-bound entries in the published 0.2.0/0.3.0 history stay as they are by design (D4) — they red nothing on a clean tree.
changelog.d/167.mdis consumed at the next release by the assembler, which now enforces the same bound on the way in. No cross-repo follow-up.Requesting @danmt's review and setting
state:needs-human— the PR is yours.