feat(validate): extract followUps and knownLimitations in parseSummary (#2622)

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) <noreply@anthropic.com>
This commit is contained in:
deseltrus 2026-03-26 16:36:39 +01:00 committed by GitHub
parent 0db5edd7fe
commit 9c81efa9f2
3 changed files with 23 additions and 1 deletions

View file

@ -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");

View file

@ -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 ───────────────────────────────────────────────────────

View file

@ -157,6 +157,8 @@ export interface Summary {
whatHappened: string;
deviations: string;
filesModified: FileModified[];
followUps: string;
knownLimitations: string;
}
// ─── Continue-Here ─────────────────────────────────────────────────────────