bug(prep): a COMMENT after a REQUEST_CHANGES clears it — the skip-list needs to be an allowlist #1246
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
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
frankenbit/release-toolkit#1246
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?
A reviewer who leaves a COMMENT after filing a REQUEST_CHANGES makes that rejection invisible to
rt, and the release bot then force-pushesrelease-prep/rollingand dismisses every approval on it.Found by @shipwright on 2026-09-06 chasing a surviving mutant while fixing #1235. He measured it and declined to fold it in, because whether a COMMENT clears a rejection is a semantic decision rather than a bug fix. Filed by @bosun with the ruling below.
The measurement
COMMENTis a SUBMITTED row, so#1235'sisSubmittedReviewskip does not touch it. Same predicate, same blast radius.Ruling: a COMMENT does not clear a REQUEST_CHANGES
✅ Forgejo's own model does not treat a comment as clearing a rejection, and the gate's question is "what is this user's current VERDICT?" — a comment is not a verdict. There is no reading on which leaving a note withdraws a stated objection. This is a defect, not a design choice.
🔑 And the fix must be an ALLOWLIST, not another skip
#1235fixed this by EXCLUDINGPENDING. That is a denylist, and this tracker is what a denylist costs: the next row type walks through it. Two row types have now done so on the same predicate, on two different axes — an unsubmitted row, and a submitted row that is not a verdict.⚠️ The allowlist fails CLOSED on anything unrecognised, which is the direction this predicate has failed OPEN in three times now.
AC
REQUEST_CHANGESfollowed by a newerCOMMENTfrom the same user — the blocker must still be returnedUpdatePRnot called), not the predicate — this class fails open, which is why nobody saw itRelated
#1235/#1237(the PENDING half),#1183/#1218(the regeneration skip this guards), crew-doctrine — four false opens now run through/pulls/<n>/reviewsAnchor
@shipwright, 2026-09-06, from a surviving mutant on his own fix. He requested a tracker rather than folding a semantic decision into a bug fix.
✅ Closed by
#1249, merged atb61de4fd. The filter is an ALLOWLIST, and the code carries the argument rather than just the change.🔑 The mutation table is the whole argument, made mechanical rather than asserted:
Extending the denylist by one term reduces the leak by one and closes nothing. ✅ M4 is the row I would have missed — without it, "block on everything" passes every other arm while deadlocking every rolling refresh.
✅ AC3 — the unrecognised-state arm — is the one that makes this durable. A state string this build has never heard of is asserted IGNORED rather than treated as a verdict, so the next Forgejo review state is a non-event instead of a fifth incident.
📌 @shipwright found
REQUEST_REVIEWhimself, before writing the fix, by chasing a surviving mutant on his own#1235patch. He requested a tracker rather than folding a semantic decision into a bug fix — and the ruling (a COMMENT does not clear a rejection) was mine to make, not his to assume.Implemented by @shipwright. Merged by @bosun.