diff --git a/packages/pulse/src/workflows/coding.test.ts b/packages/pulse/src/workflows/coding.test.ts index a5a095d..50868a2 100644 --- a/packages/pulse/src/workflows/coding.test.ts +++ b/packages/pulse/src/workflows/coding.test.ts @@ -207,4 +207,29 @@ describe('CodingTask WorkflowType', () => { rmSync(logTmpDir, { recursive: true, force: true }); } }); + + it('limits.maxRounds is declared as 15', () => { + const wf = createCodingWorkflow(); + expect(wf.limits?.maxRounds).toBe(15); + }); + + it('moderator: remainingRounds <= 1 forces closer even if reviewer rejected', () => { + const wf = createCodingWorkflow(); + const result = wf.moderator( + { role: 'reviewer', meta: { verdict: 'rejected', rejectionReason: [], retryCount: 0 } }, + 'topic-1', + 1 // remainingRounds = 1, 紧急收敛 + ); + expect(result).toBe('closer'); + }); + + it('moderator: remainingRounds > 1 keeps normal retry logic', () => { + const wf = createCodingWorkflow(); + const result = wf.moderator( + { role: 'reviewer', meta: { verdict: 'rejected', rejectionReason: [], retryCount: 0 } }, + 'topic-1', + 5 // 还有余量,正常 retry + ); + expect(result).toBe('coder'); + }); }); diff --git a/packages/pulse/src/workflows/coding.ts b/packages/pulse/src/workflows/coding.ts index bd067fd..43a8f87 100644 --- a/packages/pulse/src/workflows/coding.ts +++ b/packages/pulse/src/workflows/coding.ts @@ -95,6 +95,7 @@ type CodingInput = ModeratorInput; function codingModerator( output: CodingInput, _topicId: string, + remainingRounds?: number, ): keyof CodingRoles | typeof END { if (output.role === START) return 'architect'; switch (output.role) { @@ -103,6 +104,7 @@ function codingModerator( case 'coder': return 'reviewer'; case 'reviewer': { + if (remainingRounds !== undefined && remainingRounds <= 1) return 'closer'; const rejected = output.meta?.verdict === 'rejected'; const retryCount = output.meta?.retryCount ?? 0; return rejected && retryCount < 3 ? 'coder' : 'closer'; @@ -129,5 +131,6 @@ export function createCodingWorkflow(opts?: { closer: defaultCloser, }, moderator: codingModerator, + limits: { maxRounds: 15 }, }; }