The review re-arm cap has no new-information valve, but consult does #197

Closed
opened 2026-08-16 16:55:30 +00:00 by john · 1 comment
Owner

The asymmetry

Cadence's two second-opinion subsystems both have a bound, and only one of them
has a way past it.

Consult (cadence-core/references/consult.md, hard rule 4 and
offer_consult step 2) is bounded at one per dead-end, with an explicit release
valve: "unless genuinely new information appears." The bound is about not
paying twice for the same question, so new evidence legitimately reopens it.

A blocking review's re-arm (cadence-core/references/triage-gate.md) is
capped at ONE narrowed round and has no valve at all. Past it the rule is
"never fire that trigger again in this loop", and the only exit is a
stop-and-ask offering proceed-anyway or fix-by-hand. The round count persists as
a rearm outcome in trace.jsonl keyed to the run's correlation id, so a
/clear cannot reset it either. A genuinely new fact - the fix turned out to
touch a file nobody knew was in scope, the blocker was misdiagnosed and the real
defect is somewhere else - buys nothing.

Why the hard cap is right, and why it is still incomplete

The cap exists because a fix made to clear a blocking FAIL is itself reviewable
work, so unbounded re-arming is a loop with no terminal state. That reasoning is
sound and nothing here proposes weakening it.

But the cap currently answers "how many rounds" when the question it should
answer is "has anything changed". Those come apart in one specific case: the
second round FAILs on a DIFFERENT blocker than the first, which means the loop
is not thrashing, it is making progress on a moving target. Today that reads
identically to a loop stuck on the same finding, and both get the same stop.

The proposal

Give the review cap the same shape consult already has, and no more than that:

  • The cap stays at one round by default.
  • A second round is admissible ONLY on evidence the system can see, never on the
    model's own judgment that it is close. The candidate signal is the one the
    trace already carries: the surviving blocker set changed identity between
    rounds. Same findings surviving means thrashing, stop. A different blocker
    means the previous one closed and a new one surfaced, which is new
    information in exactly consult's sense.
  • Hard ceiling regardless: two rounds, never open-ended. The point is to admit
    one evidenced continuation, not to restore the unbounded loop v2.6.0's FRI-02
    closed.
  • The stop-and-ask arm is unchanged and stays the terminal state.

Why it might be wrong

Worth arguing before writing. Three objections that would kill it:

  1. A moving blocker set is also the signature of a fix that keeps breaking new
    things, which is the strongest case for stopping, not continuing.
  2. The user's stop-and-ask already permits exactly this - "proceed anyway" - so
    the valve may only be automating a decision the design deliberately keeps
    human.
  3. Every extra round is a paid cross-model review, and cost is priority 2.

If any of those hold, the right outcome is to close this and instead document
the asymmetry as deliberate, so the next reader does not re-derive it as a gap.

## The asymmetry Cadence's two second-opinion subsystems both have a bound, and only one of them has a way past it. **Consult** (`cadence-core/references/consult.md`, hard rule 4 and `offer_consult` step 2) is bounded at one per dead-end, with an explicit release valve: *"unless genuinely new information appears."* The bound is about not paying twice for the same question, so new evidence legitimately reopens it. **A blocking review's re-arm** (`cadence-core/references/triage-gate.md`) is capped at ONE narrowed round and has no valve at all. Past it the rule is "never fire that trigger again in this loop", and the only exit is a stop-and-ask offering proceed-anyway or fix-by-hand. The round count persists as a `rearm` outcome in `trace.jsonl` keyed to the run's correlation id, so a `/clear` cannot reset it either. A genuinely new fact - the fix turned out to touch a file nobody knew was in scope, the blocker was misdiagnosed and the real defect is somewhere else - buys nothing. ## Why the hard cap is right, and why it is still incomplete The cap exists because a fix made to clear a blocking FAIL is itself reviewable work, so unbounded re-arming is a loop with no terminal state. That reasoning is sound and nothing here proposes weakening it. But the cap currently answers "how many rounds" when the question it should answer is "has anything changed". Those come apart in one specific case: the second round FAILs on a DIFFERENT blocker than the first, which means the loop is not thrashing, it is making progress on a moving target. Today that reads identically to a loop stuck on the same finding, and both get the same stop. ## The proposal Give the review cap the same shape consult already has, and no more than that: - The cap stays at one round by default. - A second round is admissible ONLY on evidence the system can see, never on the model's own judgment that it is close. The candidate signal is the one the trace already carries: the surviving blocker set changed identity between rounds. Same findings surviving means thrashing, stop. A different blocker means the previous one closed and a new one surfaced, which is new information in exactly consult's sense. - Hard ceiling regardless: two rounds, never open-ended. The point is to admit one evidenced continuation, not to restore the unbounded loop v2.6.0's FRI-02 closed. - The stop-and-ask arm is unchanged and stays the terminal state. ## Why it might be wrong Worth arguing before writing. Three objections that would kill it: 1. A moving blocker set is also the signature of a fix that keeps breaking new things, which is the strongest case for stopping, not continuing. 2. The user's stop-and-ask already permits exactly this - "proceed anyway" - so the valve may only be automating a decision the design deliberately keeps human. 3. Every extra round is a paid cross-model review, and cost is priority 2. If any of those hold, the right outcome is to close this and instead document the asymmetry as deliberate, so the next reader does not re-derive it as a gap.
Author
Owner

Closing: refuted by the run record. The proposal adds a valve to permit MORE re-arm rounds on new information. The trace holds 14 rearm events and 2 override events, and both overrides are the opposite complaint - the cap was never reached against the user's wishes; the user DECLINED a round he was already entitled to, naming review turnaround as the phase bottleneck. One is verbatim: "commit with over-ride" (phase 3, corr 3-e1e6c0a, sha 6d0aab4). The asymmetry with consult is real and the case is well argued, but the failure mode it protects against has never occurred here, while the opposite one has, twice. Reopen if a re-arm ever stops a loop that was making progress on a different blocker.

Closing: refuted by the run record. The proposal adds a valve to permit MORE re-arm rounds on new information. The trace holds 14 `rearm` events and 2 `override` events, and both overrides are the opposite complaint - the cap was never reached against the user's wishes; the user DECLINED a round he was already entitled to, naming review turnaround as the phase bottleneck. One is verbatim: "commit with over-ride" (phase 3, corr 3-e1e6c0a, sha 6d0aab4). The asymmetry with consult is real and the case is well argued, but the failure mode it protects against has never occurred here, while the opposite one has, twice. Reopen if a re-arm ever stops a loop that was making progress on a different blocker.
john closed this issue 2026-08-18 00:29:36 +00:00
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: crenshawdev/cadence-archived#197
No description provided.