fix: resume owner after failed reviewer feedback (#208)
This commit is contained in:
@@ -135,6 +135,16 @@ describe('paired completion signals', () => {
|
||||
visibleVerdict: 'done',
|
||||
}),
|
||||
).toEqual({ kind: 'request_owner_finalize' });
|
||||
expect(
|
||||
resolveReviewerFailureSignal({
|
||||
visibleVerdict: 'step_done',
|
||||
}),
|
||||
).toEqual({ kind: 'request_owner_changes' });
|
||||
expect(
|
||||
resolveReviewerFailureSignal({
|
||||
visibleVerdict: 'done_with_concerns',
|
||||
}),
|
||||
).toEqual({ kind: 'request_owner_changes' });
|
||||
expect(
|
||||
resolveReviewerFailureSignal({
|
||||
visibleVerdict: 'needs_context',
|
||||
|
||||
@@ -98,13 +98,15 @@ export function resolveReviewerFailureSignal(args: {
|
||||
case 'task_done':
|
||||
case 'done':
|
||||
return { kind: 'request_owner_finalize' };
|
||||
case 'step_done':
|
||||
case 'done_with_concerns':
|
||||
return { kind: 'request_owner_changes' };
|
||||
case 'blocked':
|
||||
case 'needs_context':
|
||||
return {
|
||||
kind: 'complete',
|
||||
completionReason: 'escalated',
|
||||
};
|
||||
case 'done_with_concerns':
|
||||
case 'continue':
|
||||
default:
|
||||
return { kind: 'preserve_review_ready' };
|
||||
|
||||
@@ -52,7 +52,8 @@ export function handleFailedReviewerExecution(args: {
|
||||
});
|
||||
if (
|
||||
signal.kind === 'request_owner_finalize' ||
|
||||
signal.kind === 'complete'
|
||||
signal.kind === 'complete' ||
|
||||
signal.kind === 'request_owner_changes'
|
||||
) {
|
||||
const ownerWs =
|
||||
signal.kind === 'request_owner_finalize'
|
||||
@@ -68,7 +69,9 @@ export function handleFailedReviewerExecution(args: {
|
||||
nextStatus:
|
||||
signal.kind === 'request_owner_finalize'
|
||||
? 'merge_ready'
|
||||
: 'completed',
|
||||
: signal.kind === 'request_owner_changes'
|
||||
? 'active'
|
||||
: 'completed',
|
||||
expectedUpdatedAt: task.updated_at,
|
||||
updatedAt: now,
|
||||
patch: {
|
||||
|
||||
@@ -1445,3 +1445,36 @@ describe('paired execution context', () => {
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
describe('paired execution context reviewer failures', () => {
|
||||
beforeEach(() => {
|
||||
vi.resetAllMocks();
|
||||
});
|
||||
|
||||
it('moves failed reviewer STEP_DONE output back to active for owner follow-up', () => {
|
||||
const task = buildPairedTask({
|
||||
status: 'in_review',
|
||||
updated_at: '2026-03-28T00:05:00.000Z',
|
||||
});
|
||||
vi.mocked(db.getPairedTaskById).mockReturnValue(task);
|
||||
|
||||
completePairedExecutionContext({
|
||||
taskId: task.id,
|
||||
role: 'reviewer',
|
||||
status: 'failed',
|
||||
runId: 'run-failed-reviewer-step-done',
|
||||
summary: 'STEP_DONE\n오너 수정이 더 필요합니다.',
|
||||
});
|
||||
|
||||
expect(db.updatePairedTask).toHaveBeenCalledWith(
|
||||
task.id,
|
||||
expect.objectContaining({
|
||||
status: 'active',
|
||||
}),
|
||||
);
|
||||
expect(db.releasePairedTaskExecutionLease).toHaveBeenCalledWith({
|
||||
taskId: task.id,
|
||||
runId: 'run-failed-reviewer-step-done',
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user