From 9c81efa9f22d47d7b4eeeaff5bf243088308ffb1 Mon Sep 17 00:00:00 2001 From: deseltrus <101901449+deseltrus@users.noreply.github.com> Date: Thu, 26 Mar 2026 16:36:39 +0100 Subject: [PATCH] feat(validate): extract followUps and knownLimitations in parseSummary (#2622) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Slice summaries capture Follow-ups and Known Limitations sections during completion, but parseSummary() never extracts them. This makes the data write-only — no downstream code can access it programmatically. Add followUps and knownLimitations fields to the Summary interface, extract them via extractSection() in parseSummary(), and aggregate outstanding items from all slices into the validate-milestone prompt context so the validator can assess unresolved work. Co-authored-by: Claude Opus 4.6 (1M context) --- src/resources/extensions/gsd/auto-prompts.ts | 15 +++++++++++++++ src/resources/extensions/gsd/files.ts | 7 ++++++- src/resources/extensions/gsd/types.ts | 2 ++ 3 files changed, 23 insertions(+), 1 deletion(-) diff --git a/src/resources/extensions/gsd/auto-prompts.ts b/src/resources/extensions/gsd/auto-prompts.ts index c507035f5..5e1984c56 100644 --- a/src/resources/extensions/gsd/auto-prompts.ts +++ b/src/resources/extensions/gsd/auto-prompts.ts @@ -1392,6 +1392,21 @@ export async function buildValidateMilestonePrompt( if (uatInline) inlined.push(uatInline); } + // Aggregate unresolved follow-ups and known limitations across slices + const outstandingItems: string[] = []; + for (const sid of valSliceIds) { + const summaryPath = resolveSliceFile(base, mid, sid, "SUMMARY"); + if (!summaryPath) continue; + const content = await loadFile(summaryPath); + if (!content) continue; + const summary = parseSummary(content); + if (summary.followUps) outstandingItems.push(`- **${sid} Follow-ups:** ${summary.followUps.trim()}`); + if (summary.knownLimitations) outstandingItems.push(`- **${sid} Known Limitations:** ${summary.knownLimitations.trim()}`); + } + if (outstandingItems.length > 0) { + inlined.push(`### Outstanding Items (aggregated from slice summaries)\n\nThese follow-ups and known limitations were documented during slice completion but have not been resolved.\n\n${outstandingItems.join('\n')}`); + } + // Inline existing VALIDATION file if this is a re-validation round const validationPath = resolveMilestoneFile(base, mid, "VALIDATION"); const validationRel = relMilestoneFile(base, mid, "VALIDATION"); diff --git a/src/resources/extensions/gsd/files.ts b/src/resources/extensions/gsd/files.ts index c2095ab70..9bd194604 100644 --- a/src/resources/extensions/gsd/files.ts +++ b/src/resources/extensions/gsd/files.ts @@ -269,6 +269,8 @@ function _parseSummaryImpl(content: string): Summary { whatHappened: nativeResult.whatHappened, deviations: nativeResult.deviations, filesModified: nativeResult.filesModified, + followUps: extractSection(content, 'Follow-ups') ?? '', + knownLimitations: extractSection(content, 'Known Limitations') ?? '', }; } @@ -330,7 +332,10 @@ function _parseSummaryImpl(content: string): Summary { } } - return { frontmatter, title, oneLiner, whatHappened, deviations, filesModified }; + const followUps = extractSection(body, 'Follow-ups') ?? ''; + const knownLimitations = extractSection(body, 'Known Limitations') ?? ''; + + return { frontmatter, title, oneLiner, whatHappened, deviations, filesModified, followUps, knownLimitations }; } // ─── Continue Parser ─────────────────────────────────────────────────────── diff --git a/src/resources/extensions/gsd/types.ts b/src/resources/extensions/gsd/types.ts index e56093f6a..ffecfc75e 100644 --- a/src/resources/extensions/gsd/types.ts +++ b/src/resources/extensions/gsd/types.ts @@ -157,6 +157,8 @@ export interface Summary { whatHappened: string; deviations: string; filesModified: FileModified[]; + followUps: string; + knownLimitations: string; } // ─── Continue-Here ─────────────────────────────────────────────────────────