fix(KIND_DEFAULTS): permission_mode acceptEdits voor idea-kinds + PLAN_CHAT
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) <noreply@anthropic.com>
This commit is contained in:
parent
52c167c0b3
commit
e64ece3d41
2 changed files with 15 additions and 7 deletions
|
|
@ -2,9 +2,9 @@ import { describe, it, expect } from 'vitest'
|
||||||
import { getKindDefault, resolveJobConfig, mapBudgetToEffort } from '../src/lib/job-config.js'
|
import { getKindDefault, resolveJobConfig, mapBudgetToEffort } from '../src/lib/job-config.js'
|
||||||
|
|
||||||
const KIND_EXPECTED = {
|
const KIND_EXPECTED = {
|
||||||
IDEA_GRILL: { model: 'claude-sonnet-4-6', thinking_budget: 12000, permission_mode: 'plan', max_turns: 15 },
|
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: 'plan', max_turns: 20 },
|
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: 'plan', max_turns: 5 },
|
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 },
|
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 },
|
SPRINT_IMPLEMENTATION: { model: 'claude-sonnet-4-6', thinking_budget: 6000, permission_mode: 'bypassPermissions', max_turns: null },
|
||||||
} as const
|
} as const
|
||||||
|
|
|
||||||
|
|
@ -70,10 +70,15 @@ const TASK_TOOLS = [
|
||||||
]
|
]
|
||||||
|
|
||||||
const KIND_DEFAULTS: Record<string, JobConfig> = {
|
const KIND_DEFAULTS: Record<string, JobConfig> = {
|
||||||
|
// 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: {
|
IDEA_GRILL: {
|
||||||
model: 'claude-sonnet-4-6',
|
model: 'claude-sonnet-4-6',
|
||||||
thinking_budget: 12000,
|
thinking_budget: 12000,
|
||||||
permission_mode: 'plan',
|
permission_mode: 'acceptEdits',
|
||||||
max_turns: 15,
|
max_turns: 15,
|
||||||
allowed_tools: [
|
allowed_tools: [
|
||||||
'Read', 'Grep', 'Glob', 'WebSearch', 'AskUserQuestion',
|
'Read', 'Grep', 'Glob', 'WebSearch', 'AskUserQuestion',
|
||||||
|
|
@ -87,7 +92,7 @@ const KIND_DEFAULTS: Record<string, JobConfig> = {
|
||||||
IDEA_MAKE_PLAN: {
|
IDEA_MAKE_PLAN: {
|
||||||
model: 'claude-opus-4-7',
|
model: 'claude-opus-4-7',
|
||||||
thinking_budget: 24000,
|
thinking_budget: 24000,
|
||||||
permission_mode: 'plan',
|
permission_mode: 'acceptEdits',
|
||||||
max_turns: 20,
|
max_turns: 20,
|
||||||
allowed_tools: [
|
allowed_tools: [
|
||||||
'Read', 'Grep', 'Glob', 'WebSearch', 'AskUserQuestion', 'Write',
|
'Read', 'Grep', 'Glob', 'WebSearch', 'AskUserQuestion', 'Write',
|
||||||
|
|
@ -99,9 +104,12 @@ const KIND_DEFAULTS: Record<string, JobConfig> = {
|
||||||
PLAN_CHAT: {
|
PLAN_CHAT: {
|
||||||
model: 'claude-sonnet-4-6',
|
model: 'claude-sonnet-4-6',
|
||||||
thinking_budget: 6000,
|
thinking_budget: 6000,
|
||||||
permission_mode: 'plan',
|
permission_mode: 'acceptEdits',
|
||||||
max_turns: 5,
|
max_turns: 5,
|
||||||
allowed_tools: ['Read', 'Grep', 'AskUserQuestion'],
|
allowed_tools: [
|
||||||
|
'Read', 'Grep', 'AskUserQuestion',
|
||||||
|
'mcp__scrum4me__update_job_status',
|
||||||
|
],
|
||||||
},
|
},
|
||||||
TASK_IMPLEMENTATION: {
|
TASK_IMPLEMENTATION: {
|
||||||
model: 'claude-sonnet-4-6',
|
model: 'claude-sonnet-4-6',
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue