fix(paired): bound arbiter interventions to stop infinite arbiter loop

The owner↔reviewer↔arbiter loop could repeat forever: when the arbiter
ruled PROCEED/REVISE/RESET it reset round_trip_count to 0, and nothing
tracked how many times the arbiter had already intervened. A re-deadlock
re-invoked the arbiter without bound.

Add a persistent arbiter_intervention_count (new column + migration 020)
that survives the round-trip reset, and a configurable cap
ARBITER_MAX_INTERVENTIONS (default 1). Once the arbiter has intervened
that many times and the loop still deadlocks, requestArbiterOrEscalate
escalates straight to the user instead of re-invoking the arbiter.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
Codex
2026-06-09 02:15:21 +09:00
parent 5f06673ac6
commit de54f13469
15 changed files with 197 additions and 5 deletions

View File

@@ -145,6 +145,7 @@ function createActiveTaskForRoom(args: {
finalize_step_done_count: 0,
task_done_then_user_reopen_count: 0,
empty_step_done_streak: 0,
arbiter_intervention_count: 0,
status: 'active',
arbiter_verdict: null,
arbiter_requested_at: null,
@@ -494,6 +495,7 @@ export function preparePairedExecutionContext(args: {
owner_failure_count: 0,
owner_step_done_streak: 0,
empty_step_done_streak: 0,
arbiter_intervention_count: 0,
}
: {}),
},
@@ -510,6 +512,7 @@ export function preparePairedExecutionContext(args: {
owner_failure_count: 0,
owner_step_done_streak: 0,
empty_step_done_streak: 0,
arbiter_intervention_count: 0,
}
: {}),
},