Skip to content

Commit 7959441

Browse files
recuu-pfegclaude
andcommitted
fix: Reviewer result not overwritten by Builder's COMPLETION_JSON
- update_task skips review_comment/commits when Reviewer already saved structured review via review-report API - Stream result fallback now parses COMPLETION_JSON: prefix from result text instead of storing it raw Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1 parent 0b70e94 commit 7959441

2 files changed

Lines changed: 22 additions & 4 deletions

File tree

src/agent-templates.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -384,6 +384,12 @@ export async function executeActions(
384384
switch (action.type) {
385385
case "update_task": {
386386
const updates = { ...(action.params ?? {}) } as Record<string, unknown>;
387+
// If Reviewer already saved a structured review via review-report API,
388+
// don't overwrite with Builder's COMPLETION_JSON text
389+
if (ctx.reviewVerdict && updates.review_comment && updates.status === "review") {
390+
delete updates.review_comment;
391+
delete updates.commits;
392+
}
387393
// If review verdict is NEEDS_CHANGES, check retry count
388394
if (updates.status === "review" && ctx.reviewVerdict === "NEEDS_CHANGES") {
389395
const MAX_RETRIES = 3;

src/cli.ts

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -465,10 +465,22 @@ async function runLoop(cliArgs: CliArgs, runner: AgentRunner): Promise<void> {
465465
try {
466466
const ev = JSON.parse(l);
467467
if (ev.type === "result" && ev.subtype === "success" && typeof ev.result === "string") {
468-
// Agent completed successfully but didn't output COMPLETION_JSON
469-
// Use the result text as review_comment
470-
const resultText = ev.result.slice(0, 2000);
471-
actionCtx.completionJson = { review_comment: resultText, commits: "" };
468+
// Try to extract COMPLETION_JSON from result text
469+
const cjMatch = ev.result.match(/COMPLETION_JSON:(\{[\s\S]*\})/);
470+
let resultText: string;
471+
if (cjMatch) {
472+
try {
473+
const cj = JSON.parse(cjMatch[1]);
474+
actionCtx.completionJson = { review_comment: cj.review_comment, commits: cj.commits };
475+
resultText = cj.review_comment || ev.result.slice(0, 2000);
476+
} catch {
477+
resultText = ev.result.slice(0, 2000);
478+
actionCtx.completionJson = { review_comment: resultText, commits: "" };
479+
}
480+
} else {
481+
resultText = ev.result.slice(0, 2000);
482+
actionCtx.completionJson = { review_comment: resultText, commits: "" };
483+
}
472484
for (const action of agentTemplate.post_actions) {
473485
if (action.type === "update_task" && action.when === "success" && action.params?.status === "review") {
474486
action.params = { ...action.params, review_comment: resultText, commits: "" };

0 commit comments

Comments
 (0)