From e64ece3d41d8e0893929dff74cb60a8c0fbc9b00 Mon Sep 17 00:00:00 2001 From: Madhura68 Date: Sat, 9 May 2026 11:28:31 +0200 Subject: [PATCH] fix(KIND_DEFAULTS): permission_mode acceptEdits voor idea-kinds + PLAN_CHAT MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Symptoom: IDEA_GRILL job IDEA-047 werd 3x geclaimd, Claude liep telkens succesvol (exit 0 na 600-900s) maar deed nooit update_job_status('done'). Lease verliep, retry_count >= 2 → status FAILED met "agent did not complete job within 2 attempts". Root cause: KIND_DEFAULTS.permission_mode='plan' voor idea-kinds en PLAN_CHAT. In autonome batch-mode wacht plan-mode op een human "go" na elke planning-fase — er is geen mens in de loop om te approven, dus Claude blijft hangen en sluit netjes maar onvolledig af. Fix: - IDEA_GRILL.permission_mode: plan → acceptEdits - IDEA_MAKE_PLAN.permission_mode: plan → acceptEdits - PLAN_CHAT.permission_mode: plan → acceptEdits De allowed_tools-lijsten doen de echte sandboxing (geen Bash, geen Edit voor IDEA_GRILL/PLAN_CHAT, alleen Write voor IDEA_MAKE_PLAN). De "veiligheid" van plan-mode wordt dus al door tool-allowlists geleverd — acceptEdits is hier puur om Claude door zijn own update_job_status loop te laten lopen zonder approval-wachttijd. Plus: PLAN_CHAT.allowed_tools krijgt nu ook update_job_status (ontbrak, zou het kind ook in acceptEdits-mode niet kunnen afsluiten). Tests: KIND_EXPECTED in __tests__/job-config.test.ts bijgewerkt. 334 tests in 38 files passed. Co-Authored-By: Claude Opus 4.7 (1M context) --- __tests__/job-config.test.ts | 6 +++--- src/lib/job-config.ts | 16 ++++++++++++---- 2 files changed, 15 insertions(+), 7 deletions(-) diff --git a/__tests__/job-config.test.ts b/__tests__/job-config.test.ts index bef0de1..80ea72f 100644 --- a/__tests__/job-config.test.ts +++ b/__tests__/job-config.test.ts @@ -2,9 +2,9 @@ import { describe, it, expect } from 'vitest' import { getKindDefault, resolveJobConfig, mapBudgetToEffort } from '../src/lib/job-config.js' const KIND_EXPECTED = { - IDEA_GRILL: { model: 'claude-sonnet-4-6', thinking_budget: 12000, permission_mode: 'plan', max_turns: 15 }, - IDEA_MAKE_PLAN: { model: 'claude-opus-4-7', thinking_budget: 24000, permission_mode: 'plan', max_turns: 20 }, - PLAN_CHAT: { model: 'claude-sonnet-4-6', thinking_budget: 6000, permission_mode: 'plan', max_turns: 5 }, + IDEA_GRILL: { model: 'claude-sonnet-4-6', thinking_budget: 12000, permission_mode: 'acceptEdits', max_turns: 15 }, + IDEA_MAKE_PLAN: { model: 'claude-opus-4-7', thinking_budget: 24000, permission_mode: 'acceptEdits', max_turns: 20 }, + PLAN_CHAT: { model: 'claude-sonnet-4-6', thinking_budget: 6000, permission_mode: 'acceptEdits', max_turns: 5 }, TASK_IMPLEMENTATION: { model: 'claude-sonnet-4-6', thinking_budget: 6000, permission_mode: 'bypassPermissions', max_turns: 50 }, SPRINT_IMPLEMENTATION: { model: 'claude-sonnet-4-6', thinking_budget: 6000, permission_mode: 'bypassPermissions', max_turns: null }, } as const diff --git a/src/lib/job-config.ts b/src/lib/job-config.ts index 1c77915..811e365 100644 --- a/src/lib/job-config.ts +++ b/src/lib/job-config.ts @@ -70,10 +70,15 @@ const TASK_TOOLS = [ ] const KIND_DEFAULTS: Record = { + // Idea-kinds en PLAN_CHAT draaien in `acceptEdits` (niet `plan`): + // `plan`-mode wacht op human-approval na elke planning-fase, wat in een + // autonome runner-context betekent dat Claude geen `update_job_status` + // aanroept en de job na lease-expiry FAILED'd. De `allowed_tools`-lijst + // doet de echte sandboxing (geen Bash, geen Edit, alleen Read/Grep/etc). IDEA_GRILL: { model: 'claude-sonnet-4-6', thinking_budget: 12000, - permission_mode: 'plan', + permission_mode: 'acceptEdits', max_turns: 15, allowed_tools: [ 'Read', 'Grep', 'Glob', 'WebSearch', 'AskUserQuestion', @@ -87,7 +92,7 @@ const KIND_DEFAULTS: Record = { IDEA_MAKE_PLAN: { model: 'claude-opus-4-7', thinking_budget: 24000, - permission_mode: 'plan', + permission_mode: 'acceptEdits', max_turns: 20, allowed_tools: [ 'Read', 'Grep', 'Glob', 'WebSearch', 'AskUserQuestion', 'Write', @@ -99,9 +104,12 @@ const KIND_DEFAULTS: Record = { PLAN_CHAT: { model: 'claude-sonnet-4-6', thinking_budget: 6000, - permission_mode: 'plan', + permission_mode: 'acceptEdits', max_turns: 5, - allowed_tools: ['Read', 'Grep', 'AskUserQuestion'], + allowed_tools: [ + 'Read', 'Grep', 'AskUserQuestion', + 'mcp__scrum4me__update_job_status', + ], }, TASK_IMPLEMENTATION: { model: 'claude-sonnet-4-6',