fragment-check density refuses an adopter for prose their PR did not touch #735
Labels
No labels
bump
major
bump
minor
bump
patch
kind/bug
kind/chore
kind/docs
kind/feature
priority/critical
priority/high
priority/low
priority/medium
size/L
size/M
size/S
size/XL
No milestone
No project
No assignees
2 participants
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
frankenbit/release-toolkit#735
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
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?
Split out of #621 rather than folded into #724, which is already under review.
The shape
The density gate added by #724 grades every fragment in
changelog.d/, not just the ones the PR touched. That is deliberate and correct for the steady state: it is what makes "a fragment that would FAIL at cut time cannot read CLEAN at PR time" true.But it has an adoption consequence nobody has written down. The first PR after the gate is wired in inherits the entire existing backlog. The author sees their unrelated PR refused, naming a fragment somebody else wrote weeks ago.
Measured, twice, on this repo in one morning
Both catches were fragments that landed on
mainbefore the gate existed, so neither could have passed through it:658-dependency-pin-vs-forward-ref.fixed.md690.fixed.md8389450Each one reddened #724 — a PR that changed neither fragment. On this repo the cost was two small PRs by the fragments' own authors. An adopter has no #727 and no #733 waiting; they have a refused PR and a directory of prose they did not write.
Why this is not just a docs bug
The remedy space has a real tradeoff, which is why this is a tracker and not a one-line note:
The two are not symmetric and the first is probably right. What is missing is the on-ramp.
Acceptance criteria
docs/names the adoption step explicitly: gradechangelog.d/and clean it before wiring the reusable in, because the first gated PR is refused for pre-existing prose — PR #1040. The literal "clean before wiring" premise is now obsolete: PR#1029 chose a design where pre-existing findings warn rather than block, so there is no adoption cliff to clean before. Docs state the actual (better) behavior instead of the originally-anticipated one.status()in cmd/rt/fragment_check.goOut of scope
Not changing #724. The gate's grading scope is correct as built; this is about the seam an adopter meets on day one.
✅ OPERATOR RULING: grade all fragments, REFUSE only on the ones this PR touched, WARN on pre-existing.
Keeps the invariant — a fragment that would fail at cut time cannot read clean at PR time — and removes the adoption cliff, where the first PR after the gate is wired in inherits the whole backlog and is refused for prose somebody else wrote.
cmd/rt/fragment_check.go— the attribution already exists ("fragment THIS PR touched"vs"pre-existing"); wire the refusal to it📌 The labelling half landed already and does not skip — measured by @shipwright:
status()is called once inside anFprintfwith no skip or exempt logic. It tells you which prose is not yours and refuses anyway. What is missing is acting on the label, not producing it.Closing — all three ACs satisfied and verified against the code, not the PR bodies.
The doc was verified twice over: @herald checked
status()'s three return strings appear verbatim and thatblocks()agrees in all three directions including the unknown case; @surveyor confirmed that independently and caught an interface claim his instrument could not reach —--base/--headdo not exist, and the fix namesFRAGMENT_CHECK_CHANGED_FILESinstead.📌 One gap found en route and deliberately NOT filed yet:
integration.mdhas no local-rtinstall path — every install route in the file is a runner step. It collides with the #1037 pre-push battery, which assumes a localrt, so it wants filing once that lands and we know what the battery needs. (@herald's finding.)