Skip to content

The panel's filing rule has no recovery path: withdraw-don't-patch, redesigned after PR #230 failed review #231

Description

@topij

PR #230 attempted this and was closed unmerged under its own pre-declared
withdrawal threshold. Three independent reviewers — both panel lenses and
CodeRabbit — returned five HIGH and three Major findings, all inside the 59
lines added
. The intent is sound and the gap is real; the design is not ready.

The gap it was trying to close

The doctrine already carries the prevention, in "Re-running, and when to stop":

a new mechanism gets filed, however squarely a finding prompted it

What it has no answer for is recovery: once the mechanism is already in the
diff and drawing HIGHs, the default is to patch it again. PR #225 measured the
cost of that — five rounds, of which only round 1 reviewed the actual change.
Rounds 2–4 each found a HIGH inside a shell source scanner that the filing rule
said to file rather than build; round 5 reviewed its removal and found nothing.

The filing rule predates #225 (commit 238de25, 2026-07-28) — so it already
required the right thing and was not followed.

Why the attempt failed review

1. The trigger is an unguarded author-drawn bound — the weakness this file
documents as fatal.
(Both lenses, HIGH.) The rule asked the author to judge
mid-round whether this HIGH is "the same mechanism" as the last. fallback-review-panel.md
names this exact shape in "Keep the record small": "Three attempts to bound that
have each opened a hole, and their shared shape: each bound is settable by the
author of the change under review… What the shipped gate adds is that the choice
is stated in the PR, where a reviewer can dispute it."
Five sibling bounds in
that file all carry that mitigation. The withdrawal rule reproduced the weakness
and omitted the mitigation.

2. "Twice" is contradicted by its own evidence. (Correctness HIGH; CodeRabbit
Major.) The case shows HIGHs in rounds 2, 3 and 4 — three — and #228 says
"removed it after three review rounds". Meanwhile the threshold actually declared
and honoured in #225 was one HIGH. The counting unit is also undefined: two
HIGHs in one fix, or HIGHs in two successive rounds? Does the originating finding
count?

3. "Let the round that removes it be the last" reads as skipping step 6.
(CodeRabbit Major — missed by both lenses.) Step 6's re-run is not optional for a
delta containing executable code or executed prose, and #225's round 5 did
review the withdrawal. The wording described the opposite of what was done.
Removal is the last fix round, never the last review round.

4. "Mechanism" is the operative unit and is undefined, with no fail-closed
default.
(Both lenses.) Contrast executed prose, which this file gives both an
enumerated list and "when in doubt, the text is executed prose". Two readers could
disagree on #225's own evidence: is the widened-anchor fix the same mechanism as
the heredoc tracker fixed in the same commit, or two?

5. Wrongly conditional on the filing rule having been violated. (CodeRabbit
Major.) A pre-existing mechanism whose fixes keep drawing HIGHs deserves the same
treatment; the drafted rule only fired when a round-1 finding had prompted a newly
built mechanism.

6. An explicit count sits under a paragraph that rejects round-count.
(Adversarial, MED.) The host section opens with "the stopping criterion is blast
radius, not round count"
. A narrow exception may be defensible — it governs
whether to keep patching one mechanism, not whether to keep reviewing — but the
text never reconciled the two.

Errors in the evidence, for whoever writes it next

The round-2 bullet was wrong. (Adversarial HIGH.) It attributed "its
exit-code test was confounded by its own fixture"
to round 2. That was round
1's
finding — it is in the round-1 fix commit 63d9b5b — and it lived in the
required_by/missing-required feature, not in the scanner. The error also left
round 2's real second HIGH (the heredoc-unaware false positive) unmentioned, which
matters because it is half of the false-negative/false-positive asymmetry the
whole argument rests on.

The counterfactual overstates. (Adversarial MED.) "Two rounds rather than
five"
presents an unwritten, unreviewed hypothetical as a count. What the
evidence supports is narrower: rounds 2–4 traced entirely to defects inside the
scanner, and round 5 reviewing its removal found nothing.

A paraphrase was quoted as verbatim. (Adversarial LOW.) The companion quoted
"a HIGH means the scanner comes out"; bd32625 says "a HIGH means the shell
scan comes out of this PR"
.

Verified accurate, and reusable as-is: the round-and-HIGH table (2, 2, 2, 1, 0),
the 90-insertions/560-deletions figure for round 5's delta, the four bash
constructs mapping 1:1 onto #228's acceptance bar, and the filing rule predating
#225.

One finding about the process itself

The withdrawal threshold declared for PR #230 — "a HIGH in the rule being added
means file it and drop it" — was stricter than the rule it was protecting.
The drafted rule triggers on a fix drawing a HIGH twice; the hatch triggered on
one HIGH at round 1, before any fix existed. Honouring it cost the PR. That is a
real observation about declaring thresholds in advance: an over-strict one is
still binding, and the cost of setting it badly is paid in full.

Whether that argues for calibrating thresholds more carefully, or is simply the
price of a mechanism that only works if it is never renegotiated, is the open
question — and it belongs in whatever ships here.

What a next attempt needs

  • The invocation stated in the PR, where a reviewer can dispute it — matching
    the file's five existing author-drawn bounds.
  • A defined counting unit, supported by the evidence rather than chosen.
  • A boundary test for "same mechanism", with a fail-closed default.
  • Explicit that removal is the last fix round and step 6 still applies.
  • No dependency on the filing rule having been violated.
  • Reconciliation with "blast radius, not round count" directly above it.
  • Rationale routed to the companion — fallback-review-panel.md is 598 lines and must be read in full before every panel — split what executes from what explains #213 stays open on this file's length, and
    roughly half the drafted 16 lines were history rather than instruction.

Related: #213, #228, #163. All stay open. The full drafted text and both lens
reports are on PR #230.

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions