From 536a27592c3d4288d5456b785bd8640fcbcd4b4f Mon Sep 17 00:00:00 2001 From: Madhura68 Date: Tue, 5 May 2026 13:25:32 +0200 Subject: [PATCH] =?UTF-8?q?fix:=20idea-jobs=20cannot=20mark=20done=20?= =?UTF-8?q?=E2=80=94=20skip=20verify-gate=20(v0.6.2)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit T-505 in v0.6.0 wired the idea-failure side-effects but missed the 'skip verify-gate for IDEA_*-kinds on done' branch from the M12 plan. Reproduced live on IDEA-002: agent answered 5 questions, called update_idea_grill_md (status → GRILLED, grill_md persisted), but update_job_status('done') was rejected by the verify-gate because idea-jobs have no task → no plan_snapshot → verify_task_against_plan cannot run. Job got marked FAILED + idea reverted to GRILL_FAILED even though the grill itself succeeded. Fix: in update_job_status, when status='done' AND kind in [IDEA_GRILL, IDEA_MAKE_PLAN]: skip checkVerifyGate AND prepareDoneUpdate (no git push, no branch). The idea-status was already moved to GRILLED/PLAN_READY by update_idea_*_md; the job just needs to flip to DONE. Tests: 153/153 still green. Bump 0.6.1 → 0.6.2. Co-Authored-By: Claude Opus 4.7 (1M context) --- package.json | 2 +- src/tools/update-job-status.ts | 36 ++++++++++++++++++++++------------ 2 files changed, 24 insertions(+), 14 deletions(-) diff --git a/package.json b/package.json index e8c3a78..c34156c 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "scrum4me-mcp", - "version": "0.6.1", + "version": "0.6.2", "description": "MCP server for Scrum4Me — exposes dev-flow tools and prompts via the Model Context Protocol", "type": "module", "bin": { diff --git a/src/tools/update-job-status.ts b/src/tools/update-job-status.ts index 82ad6cc..b979df6 100644 --- a/src/tools/update-job-status.ts +++ b/src/tools/update-job-status.ts @@ -306,20 +306,30 @@ export function registerUpdateJobStatusTool(server: McpServer) { let skipWorktreeCleanup = false if (status === 'done') { - const gate = checkVerifyGate( - job.verify_result ?? null, - job.task?.verify_only ?? false, - (job.task?.verify_required ?? 'ALIGNED_OR_PARTIAL') as VerifyRequired, - summary, - ) - if (!gate.allowed) return toolError(gate.error) + // M12: idea-jobs hebben geen task/plan_snapshot/branch — skip de + // verify-gate én de prepareDoneUpdate (die doet git push). Voor + // idea-jobs is `done` direct geldig: de bijhorende update_idea_*_md + // heeft de idea-status al naar GRILLED/PLAN_READY gezet. + if (job.kind === 'IDEA_GRILL' || job.kind === 'IDEA_MAKE_PLAN') { + actualStatus = 'done' + // pushedAt blijft undefined, branch/error overrides ook + skipWorktreeCleanup = true + } else { + const gate = checkVerifyGate( + job.verify_result ?? null, + job.task?.verify_only ?? false, + (job.task?.verify_required ?? 'ALIGNED_OR_PARTIAL') as VerifyRequired, + summary, + ) + if (!gate.allowed) return toolError(gate.error) - const plan = await prepareDoneUpdate(job_id, branch) - actualStatus = plan.dbStatus === 'DONE' ? 'done' : 'failed' - pushedAt = plan.pushedAt - if (plan.branchOverride !== undefined) branchToWrite = plan.branchOverride - if (plan.errorOverride !== undefined) errorToWrite = plan.errorOverride - skipWorktreeCleanup = plan.skipWorktreeCleanup + const plan = await prepareDoneUpdate(job_id, branch) + actualStatus = plan.dbStatus === 'DONE' ? 'done' : 'failed' + pushedAt = plan.pushedAt + if (plan.branchOverride !== undefined) branchToWrite = plan.branchOverride + if (plan.errorOverride !== undefined) errorToWrite = plan.errorOverride + skipWorktreeCleanup = plan.skipWorktreeCleanup + } } // Auto-PR: best-effort, only when push actually happened.