From 62d63f111eced118d5409caa370b92f3a2948e9a Mon Sep 17 00:00:00 2001 From: Mikael Hugo Date: Fri, 15 May 2026 20:14:30 +0200 Subject: [PATCH] fix(auto): bound solver iteration defaults --- src/resources/extensions/sf/autonomous-solver-eval.js | 2 +- src/resources/extensions/sf/autonomous-solver.js | 2 +- src/resources/extensions/sf/docs/preferences-reference.md | 2 +- src/resources/extensions/sf/preferences-models.js | 2 +- src/resources/extensions/sf/tests/auto-supervisor.test.mjs | 2 +- src/resources/extensions/sf/tests/autonomous-solver.test.mjs | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/resources/extensions/sf/autonomous-solver-eval.js b/src/resources/extensions/sf/autonomous-solver-eval.js index 8e3f73db1..23823f0d2 100644 --- a/src/resources/extensions/sf/autonomous-solver-eval.js +++ b/src/resources/extensions/sf/autonomous-solver-eval.js @@ -159,7 +159,7 @@ export function sampleAutonomousSolverEvalCases() { "const fs=require('node:fs');", "fs.mkdirSync('.sf/runtime/autonomous-solver',{recursive:true});", "fs.writeFileSync('target.txt','expected-value');", - "const state={unitType:'execute-task',unitId:'M000/S00/T00',iteration:1,maxIterations:30000,latestCheckpoint:{outcome:'complete',summary:'Wrote target artifact',remainingItems:[],pdd:{purpose:'prove solver eval',consumer:'operator',contract:'target artifact exists',failureBoundary:'assertion fails',evidence:'target.txt',nonGoals:'no model call',invariants:'same fixture',assumptions:'node works'}}};", + "const state={unitType:'execute-task',unitId:'M000/S00/T00',iteration:1,maxIterations:12,latestCheckpoint:{outcome:'complete',summary:'Wrote target artifact',remainingItems:[],pdd:{purpose:'prove solver eval',consumer:'operator',contract:'target artifact exists',failureBoundary:'assertion fails',evidence:'target.txt',nonGoals:'no model call',invariants:'same fixture',assumptions:'node works'}}};", "fs.writeFileSync('.sf/runtime/autonomous-solver/active.json',JSON.stringify(state,null,2));", "fs.writeFileSync('.sf/runtime/autonomous-solver/iterations.jsonl',JSON.stringify(state.latestCheckpoint)+'\\n');", ].join(""), diff --git a/src/resources/extensions/sf/autonomous-solver.js b/src/resources/extensions/sf/autonomous-solver.js index 2b84666ae..c66f45d2a 100644 --- a/src/resources/extensions/sf/autonomous-solver.js +++ b/src/resources/extensions/sf/autonomous-solver.js @@ -29,7 +29,7 @@ export const AUTONOMOUS_SOLVER_OUTCOMES = [ ]; const MAX_RENDERED_ITEMS = 12; -const DEFAULT_SOLVER_MAX_ITERATIONS = 30000; +const DEFAULT_SOLVER_MAX_ITERATIONS = 12; const MIN_SOLVER_MAX_ITERATIONS = 1; const MAX_SOLVER_MAX_ITERATIONS = 100000; const DEFAULT_MISSING_CHECKPOINT_REPAIR_ATTEMPTS = 4; diff --git a/src/resources/extensions/sf/docs/preferences-reference.md b/src/resources/extensions/sf/docs/preferences-reference.md index 5816059a1..a8f70a640 100644 --- a/src/resources/extensions/sf/docs/preferences-reference.md +++ b/src/resources/extensions/sf/docs/preferences-reference.md @@ -125,7 +125,7 @@ Setting `prefer_skills: []` does **not** disable skill discovery — it just mea - `soft_timeout_minutes`: minutes before the supervisor issues a soft warning (default: 20). - `idle_timeout_minutes`: minutes of inactivity before the supervisor intervenes (default: 10). - `hard_timeout_minutes`: minutes before the supervisor forces termination (default: 30). - - `solver_max_iterations`: maximum autonomous solver iterations for one unit before pausing (default: `30000`, min: `1`, max: `100000`). + - `solver_max_iterations`: maximum autonomous solver iterations for one unit before pausing (default: `12`, min: `1`, max: `100000`). - `solver_eval_on_autonomous_exit`: automatically run and record the built-in solver eval when `/autonomous` exits (default: `true`; set `false` only to disable lifecycle eval evidence). - `completion_nudge_after`: tool calls in a complete-slice unit before nudging the agent to call `complete_slice` (default: 10; set `0` to disable). - `runaway_guard_enabled`: enable active-loop diagnosis for long-running units (default: `true`). diff --git a/src/resources/extensions/sf/preferences-models.js b/src/resources/extensions/sf/preferences-models.js index 3009a463a..71cd69aaa 100644 --- a/src/resources/extensions/sf/preferences-models.js +++ b/src/resources/extensions/sf/preferences-models.js @@ -746,7 +746,7 @@ export function resolveAutoSupervisorConfig() { Number(configured.solver_max_iterations), ) ? Math.max(1, Math.min(100000, Number(configured.solver_max_iterations))) - : 30000, + : 12, solver_eval_on_autonomous_exit: configured.solver_eval_on_autonomous_exit !== false, completion_nudge_after: configured.completion_nudge_after ?? 10, diff --git a/src/resources/extensions/sf/tests/auto-supervisor.test.mjs b/src/resources/extensions/sf/tests/auto-supervisor.test.mjs index ddc3c6bdc..879e41f2b 100644 --- a/src/resources/extensions/sf/tests/auto-supervisor.test.mjs +++ b/src/resources/extensions/sf/tests/auto-supervisor.test.mjs @@ -14,7 +14,7 @@ test("resolveAutoSupervisorConfig provides safe timeout defaults", () => { assert.equal(supervisor.soft_timeout_minutes, 20); assert.equal(supervisor.idle_timeout_minutes, 10); assert.equal(supervisor.hard_timeout_minutes, 30); - assert.equal(supervisor.solver_max_iterations, 30000); + assert.equal(supervisor.solver_max_iterations, 12); }); test("writeUnitRuntimeRecord persists progress and recovery metadata defaults", () => { diff --git a/src/resources/extensions/sf/tests/autonomous-solver.test.mjs b/src/resources/extensions/sf/tests/autonomous-solver.test.mjs index a20b4e81b..bd5a73f91 100644 --- a/src/resources/extensions/sf/tests/autonomous-solver.test.mjs +++ b/src/resources/extensions/sf/tests/autonomous-solver.test.mjs @@ -480,7 +480,7 @@ describe("autonomous solver", () => { }); test("getConfiguredAutonomousSolverMaxIterations_clamps_preference", () => { - expect(getConfiguredAutonomousSolverMaxIterations()).toBe(30000); + expect(getConfiguredAutonomousSolverMaxIterations()).toBe(12); expect( getConfiguredAutonomousSolverMaxIterations({ auto_supervisor: { solver_max_iterations: 0 },