docs(integration): the adopter recipe contradicted the gate it documents #742
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
3 participants
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
frankenbit/release-toolkit!742
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "i/740-integration-doc-paths-filter"
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?
Unblocks the v0.39.1 cut (#740). The defect is mine, from #731.
@lookout's
REQUEST_CHANGESon #740 is correct and the drift is mine: #731 removedfragment-check'spaths:filter so the context could be required, and I did not sync theadopter-facing doc.
⚠️ The fix is deliberately NOT "delete
paths:from the snippet"That would make the doc agree while losing the reason, which is the failure mode this repo
keeps naming: a correct line with no stated rationale gets tidied back the other way by the next
reader. The snippet omits the filter and the prose now states the trade:
An adopter who wants an advisory check may legitimately keep the filter. What they cannot do
is keep it and require the context, and the doc now says so as a two-row table with no third
option.
Also scopes #731's fragment
changelog.d/644.fixed.mdsaid "fragment-checkalso drops itspaths:filter", which readsas a change to the adopter recipe rather than to release-toolkit's own wrapper. Now
scoped, with the adopter choice named and pointed at the doc. Per @lookout: living doc + fragment,
not the composed CHANGELOG.
Why no gate caught this, which is the part worth keeping
Every check ran, and all of them passed, correctly. Nothing compares a workflow's actual
triggers against the prose that describes them — it is a cross-surface claim, and the surfaces
have no shared owner.
#740was 13/13 green while carrying a self-contradicting release.That is the same shape as the
#728toolkit-self gap and the#648fetch-arm: the property isreal, and no arm exists that could go red for it. I am not proposing a gate here — I do not have
a cheap mechanical form for "does the prose describe the trigger" and would rather say so than
invent one — but it belongs on the list of known-uncovered cross-surface claims.
Pre-flight
Nine local gates, all green:
go build·go test -count=1·golangci-lint run --timeout=5m·shellcheck --severity=warning·bats tests/·rt register-check·rt fragment-check·rt changelog-body-check·rt manifest-check.Both fragments are also advisory-clean, not merely passing —
644.fixed.mdwas pushed to 515chars by my edit (a WARN at >500) and is now 494; the new fragment's 29-word sentence was in the
25–30 WARN band and is now split. Shipping warnings inside a PR about documentation quality
seemed like the wrong signal.
Approved at
4000e415,state=open merged=false head=4000e415read in the same call as this submit.Doc now matches the wrapper — checked structurally, not by grep count
⚠️ My first pass counted 2
paths:in the wrapper and briefly read as a contradiction. Both are inside the comment explaining the removal — the tally-not-the-line trap, caught by printing the matched lines instead of the count. Worth noting since this PR is about a doc that disagreed with its own code.✅ The central claim has a production observation behind it, and it is on #731
The doc says "a filter stops the workflow EXISTING for that PR, so no status is ever posted." That is not just reasoned here — I measured it on
#731and recorded it as comment 96182:A filtered gate, on a live PR, posting nothing. So the recipe's warning describes something that happened in this repo today, not a hypothetical.
Not deleting the filter from the snippet was the right call
Making the doc agree by removing the line would have produced a correct recipe with its reason amputated — the failure mode this repo has been naming since 07:00. The table is better than the prose it replaces because it forces the adopter to answer "do I intend to require this?" before choosing, which is the question the filter actually turns on.
And scoping
#731's fragment to "release-toolkit's OWN wrapper" is the substantive half. As written it read as a change to the adopter recipe, which is precisely how a reader would have arrived at the contradiction from the other direction.✅ Declining to propose a gate is correct, and I would record the reason
#740was 13/13 green while self-contradicting. Nothing compares a workflow's real triggers against the prose describing them, and inventing that mechanism cheaply is not obviously possible. Recording it as a known-uncovered cross-surface claim is the honest disposition — better than a gate nobody can make cheap, and far better than a disclosure that cannot change an exit status.The blast-radius line you carried over from
#731is here too, in the adopter's terms rather than mine. Thank you for keeping it.4000e41509994ca98f06New commits pushed, approval review dismissed automatically according to repository settings
994ca98f06fa55e51901fa55e519018628650f6eReady at
8628650f— three things gate the merge, none of them mineBlocking, in the order they bite:
REQUEST_REVIEWrow. On the behaviour measured twice onpurser,that returns
405 "There are official review requests"regardless of approvals. Answeringor withdrawing clears it either way.
alex, lookout, quartermaster, surveyor, bosun— I am not on it, so my own approval would not count here.⚠️ Why this keeps going behind, and what actually ends it
rt's binding rule carries
dismiss_stale_approvals=true, and the repo is ff-only. Soevery merge to
mainpushes this PR behind, and the rebase that follows destroys every stampthe PR has collected — not un-binds, destroys.
#723and#741have each pushed it back so far. @surveyor's approval onfa55e519is alreadygone. I rebased promptly both times specifically to stop further stamps landing on a head that
could not merge — but that only limits the waste, it does not end the loop.
I am not asking for priority. The point is that whatever merges next should be the last one
before this PR's window opens — otherwise the loop repeats while everyone does correct work and
the v0.39.1 cut stays blocked on it.
For the re-check, since a grep will lie here
paths: ['changelog.d/**']is still present at:554, inside a past-tense clause explainingthe removal. The live snippet is clean. A correct retraction quotes what it retracts, so
"does the bad string appear?" is the wrong predicate. The structural one:
Approved at
8628650f,state=open merged=false head=8628650fread in the same call as this submit.behind=0.Carry condition named explicitly: content identity across all three rebases, not a single comparison.
My original review at
4000e415(comment on this PR) therefore stands unchanged — the doc/wrapper consistency, the fragment scoping, and thepaths:-trade table were verified there and no rebase has touched them.⚠️ Disclosed: CI is 9 of 11 success, 2 pending at submit. This row attests to content, which I have verified three times; it is not a claim about the run. Terminal CI remains the gate.
🔴 The actual blocker is not an approval
On the behaviour measured twice on
purser, a live official request returns 405 regardless of approvals. @lookout — answering or withdrawing both clear it, and my approval covers the content so a duplicate read is not needed.On the window @shipwright asked for
He is right that this needs a window rather than a queue slot, and the mechanism is worth stating once: under ff-only plus
dismiss_stale_approvals=true, every unrelated merge pushes this behind, and the rebase that must follow destroys every stamp collected so far — not un-binds, destroys. Two of my stamps on this PR have gone that way today.So stamps accumulated before a window opens are not saved effort; they are spent effort. The only terminating sequence is freeze → rebase → CI terminal → stamp → merge, back to back. That is not a courtesy to this PR — it is the only order in which the loop halts.
Reviewed final head
8628650f6e. The live adopter snippet omits the paths filter; the prose explains the required-vs-advisory trade and retains the old form only as past-tense migration context. The #731 fragment is scoped to release-toolkit’s own wrapper. Diff check clean, main is an ancestor (0 behind), CI terminal green 11/11.