Escalation and round limits
- Max 3 fix passes in a Skeptic loop, 3 in a QA loop (hard cap): the conductor applies a maximum of 3 fix passes in a Skeptic loop (Phase 6 and any ad-hoc Skeptic loop) and 3 in the Phase 6b QA loop. At the cap, the conductor ships (accepted debt in the PR body) or escalates to the human - never silent continuation. An unresolved Critical always blocks; the cap never ships a Critical. The round count is mechanically enforced by
hooks/enforce-skeptic-round-cap.py (denies a 4th Skeptic spawn per unit unless the operator's own typed message in that session contains the skeptic-grant- token the deny prints for that unit and round) regardless of caller, when the spawn prompt's "Diff under review" line is present and unambiguous (fails open with no state written otherwise), and denies a spawn whose line does not lead with a stable unit key (<KEY> | <diff>, derived per Section 4.5) without charging a round; before persisting an allow, the hook also consults enforce-skeptic-neutrality.py, enforce-tier.py, enforce-background-spawn.py, and enforce-orchestrator-singularity.py's own deny decision on the identical payload, but only when that sibling's registration on the Task/Agent matcher is positively confirmed against the settings files Claude Code would load - an unconfirmed registration or a sibling import/call failure falls back to charging the round exactly as before this consultation existed; in each of those fallback cases the counter can still advance on a spawn rejected at the PreToolUse boundary, not only on a completed review, so a cap fire the conductor cannot match to that many returned reviews is spurious and is always escalate, never ship; known residual: a first pipe-separated path lacking a file-extension-shaped suffix (e.g. LICENSE | a.py) still passes the stable-key shape gate and becomes a wrong-but-stable key shared across units. The hook does not enforce Critical-never-ships.
- 2 re-route limit (per finding): same finding contested across 2+ rounds without resolution - escalate with both positions
- Simple changes: capped at 1 round - Critical/Major findings escalate directly
- Standard Elevated changes: the 2-re-route rule applies
- The primary agent tracks each finding by its text across all rounds
Loop-context override (inside /ds-implement-ticket Phase 6): the 2-re-route rule is replaced by a stricter contract - 1 re-raise of a Critical finding after a claimed fix triggers convergence failure escalation immediately. Outside a named loop, the 2-re-route rule is unchanged.
Prose-scoped re-check: when the round's only unresolved finding is a Blocking-minor:-routed prose-only finding (stale module manifest, doc-sync attestation, comment/count wording) and the fix diff has no code/test/behavior change, the next verification is narrowed to the changed prose lines plus a full end-to-end read of the enclosing manifest/section - not a full fresh round. The reviewer establishes the trigger itself by diffing the fix commit(s), never from engineer self-classification; any parsed/executed/byte-pinned hunk disqualifies the lever. The conductor names the mode and supplies the sha1..sha2 fix range at spawn; sign-off carries a mandatory Scope: line. A code/test/behavior finding found during the narrower pass still escalates normally. Verification-cost lever only; severity tiers are unchanged.
Round budget and value-per-round gate: the 3-round Skeptic cap decides when a loop must stop; the value-per-round gate decides whether round N+1 is worth spawning at all. Before spawning it, the conductor states one line of what shipped value that round buys ([round-value: ...]). If the honest answer is only "hardens infrastructure" or "improves a gate" with no behavior change reaching a user, defer the remaining findings to a follow-up instead. A unit whose sole output is enforcement must not block the change it enforces - ship behavior-changing units first, enforcement-only units in a later PR.
The 3-pass Skeptic cap and the per-finding 2-re-route rule are separate ceilings. Either can trigger escalation first. Inside a persistence loop, convergence failure escalates even faster.