test(paired): cover reviewer silent-failure retry cap

This commit is contained in:
claude-bot
2026-06-01 17:50:04 +09:00
parent 5af1c5b1d1
commit e9dd09a036

View File

@@ -143,6 +143,7 @@ function buildPairedTask(overrides: Partial<PairedTask> = {}): PairedTask {
review_requested_at: null, review_requested_at: null,
round_trip_count: 0, round_trip_count: 0,
owner_failure_count: 0, owner_failure_count: 0,
reviewer_failure_count: 0,
owner_step_done_streak: 0, owner_step_done_streak: 0,
finalize_step_done_count: 0, finalize_step_done_count: 0,
task_done_then_user_reopen_count: 0, task_done_then_user_reopen_count: 0,
@@ -1322,7 +1323,7 @@ describe('paired execution context', () => {
); );
}); });
it('keeps reviewer tasks review_ready when reviewer execution fails without a terminal verdict', () => { it('keeps reviewer tasks review_ready and increments reviewer_failure_count after the first silent failure', () => {
vi.mocked(db.getPairedTaskById).mockReturnValue( vi.mocked(db.getPairedTaskById).mockReturnValue(
buildPairedTask({ buildPairedTask({
status: 'in_review', status: 'in_review',
@@ -1340,11 +1341,38 @@ describe('paired execution context', () => {
'task-1', 'task-1',
expect.objectContaining({ expect.objectContaining({
status: 'review_ready', status: 'review_ready',
reviewer_failure_count: 1,
updated_at: expect.any(String), updated_at: expect.any(String),
}), }),
); );
}); });
it('requests arbiter after repeated reviewer execution failures without a visible verdict', () => {
vi.spyOn(config, 'isArbiterEnabled').mockReturnValue(true);
vi.mocked(db.getPairedTaskById).mockReturnValue(
buildPairedTask({
status: 'review_ready',
reviewer_failure_count: 1,
}),
);
completePairedExecutionContext({
taskId: 'task-1',
role: 'reviewer',
status: 'failed',
summary: 'runtime exploded before verdict',
});
expect(db.updatePairedTask).toHaveBeenCalledWith(
'task-1',
expect.objectContaining({
status: 'arbiter_requested',
reviewer_failure_count: 2,
arbiter_requested_at: expect.any(String),
}),
);
});
it('keeps arbiter tasks arbiter_requested when arbiter execution fails without a terminal verdict', () => { it('keeps arbiter tasks arbiter_requested when arbiter execution fails without a terminal verdict', () => {
vi.mocked(db.getPairedTaskById).mockReturnValue( vi.mocked(db.getPairedTaskById).mockReturnValue(
buildPairedTask({ buildPairedTask({