fix: pass verificationBudget to execute-task prompt template

buildExecuteTaskPrompt() was missing the verificationBudget variable
that the execute-task.md template expects. The prompt-loader's strict
placeholder validator threw on every auto-mode task dispatch, blocking
all execution entirely.

Compute the budget from the executor's context window using the existing
computeBudgets() engine and pass it as ~NNK chars format string.

Fixes #707
This commit is contained in:
Jeremy McSpadden 2026-03-16 16:07:53 -05:00
parent 2b0c0064cd
commit b8e6294e6b
2 changed files with 20 additions and 0 deletions

View file

@ -716,6 +716,12 @@ export async function buildExecuteTaskPrompt(
const activeOverrides = await loadActiveOverrides(base);
const overridesSection = formatOverridesSection(activeOverrides);
// Compute verification budget for the executor's context window (issue #707)
const prefs = loadEffectiveGSDPreferences();
const contextWindow = resolveExecutorContextWindow(undefined, prefs?.preferences);
const budgets = computeBudgets(contextWindow);
const verificationBudget = `~${Math.round(budgets.verificationBudgetChars / 1000)}K chars`;
return loadPrompt("execute-task", {
overridesSection,
workingDirectory: base,
@ -730,6 +736,7 @@ export async function buildExecuteTaskPrompt(
priorTaskLines: priorLines,
taskSummaryPath,
inlinedTemplates,
verificationBudget,
});
}

View file

@ -74,6 +74,19 @@ test("compression: buildExecuteTaskPrompt minimal truncates prior summaries", ()
);
});
test("compression: buildExecuteTaskPrompt passes verificationBudget to loadPrompt (#707)", () => {
// The execute-task template declares {{verificationBudget}} — the builder must supply it
assert.ok(
promptsSrc.includes("verificationBudget"),
"buildExecuteTaskPrompt should pass verificationBudget in the loadPrompt vars object",
);
// Verify it computes the budget from computeBudgets
assert.ok(
promptsSrc.includes("computeBudgets(contextWindow)"),
"buildExecuteTaskPrompt should compute budgets from the executor context window",
);
});
test("compression: buildPlanMilestonePrompt minimal drops project/requirements/decisions files", () => {
// The plan-milestone builder should gate root file inlining on inlineLevel
assert.ok(