From 9c82a1b79fe4403ddaa3f5d62ec791b454c6c15e Mon Sep 17 00:00:00 2001 From: Lex Christopherson Date: Sat, 14 Mar 2026 17:02:32 -0600 Subject: [PATCH] fix(auto): clear parse and path caches alongside state cache MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Ensures auto-mode reads fresh file data after unit completion, slice merges, and self-healing — prevents stale cached parses from the memoized deriveState pipeline. Co-Authored-By: Claude Opus 4.6 (1M context) --- src/resources/extensions/gsd/auto.ts | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/resources/extensions/gsd/auto.ts b/src/resources/extensions/gsd/auto.ts index 4fd9f2dad..24794ae0a 100644 --- a/src/resources/extensions/gsd/auto.ts +++ b/src/resources/extensions/gsd/auto.ts @@ -18,7 +18,7 @@ import type { import { deriveState, invalidateStateCache } from "./state.js"; import type { GSDState } from "./types.js"; -import { loadFile, parseContinue, parsePlan, parseRoadmap, parseSummary, extractUatType, inlinePriorMilestoneSummary, getManifestStatus } from "./files.js"; +import { loadFile, parseContinue, parsePlan, parseRoadmap, parseSummary, extractUatType, inlinePriorMilestoneSummary, getManifestStatus, clearParseCache } from "./files.js"; export { inlinePriorMilestoneSummary }; import type { UatType } from "./files.js"; import { collectSecretsFromManifest } from "../get-secrets-from-user.js"; @@ -29,6 +29,7 @@ import { relMilestoneFile, relSliceFile, relTaskFile, relSlicePath, relMilestonePath, milestonesDir, resolveGsdRootFile, relGsdRootFile, buildMilestoneFileName, buildSliceFileName, buildTaskFileName, + clearPathCache, } from "./paths.js"; import { saveActivityLog } from "./activity-log.js"; import { synthesizeCrashRecovery, getDeepDiagnostic } from "./session-forensics.js"; @@ -575,6 +576,8 @@ export async function startAuto( // Self-heal: clear stale runtime records where artifacts already exist await selfHealRuntimeRecords(base, ctx); invalidateStateCache(); + clearParseCache(); + clearPathCache(); await dispatchNextUnit(ctx, pi); return; } @@ -767,6 +770,8 @@ export async function handleAgentEnd( // Invalidate deriveState() cache — the unit just completed and may have // written planning files (task summaries, roadmap checkboxes, etc.) invalidateStateCache(); + clearParseCache(); + clearPathCache(); // Small delay to let files settle (git commits, file writes) await new Promise(r => setTimeout(r, 500)); @@ -1338,6 +1343,8 @@ async function dispatchNextUnit( } // Re-derive state from the now-merged working tree invalidateStateCache(); + clearParseCache(); + clearPathCache(); state = await deriveState(basePath); mid = state.activeMilestone?.id; midTitle = state.activeMilestone?.title; @@ -1403,6 +1410,8 @@ async function dispatchNextUnit( ); // Re-derive state from main so downstream logic sees merged state invalidateStateCache(); + clearParseCache(); + clearPathCache(); state = await deriveState(basePath); mid = state.activeMilestone?.id; midTitle = state.activeMilestone?.title;