feat(FN-4367): finalize structured workflow verdict contract

Fusion-Task-Id: FN-4367
Fusion-Task-Lineage: adbfac60-5cfe-4ae9-9706-1094dfe7d676
This commit is contained in:
Fusion
2026-05-14 11:08:10 -07:00
committed by gsxdsm
parent 335079e0e3
commit f35edfbfb6
2 changed files with 19 additions and 27 deletions

View File

@@ -6631,33 +6631,30 @@ ${failureFeedback}
*/
private parseWorkflowStepOutput(rawOutput: string): {
output: string;
verdict?: "PASS" | "FAIL";
verdict?: "APPROVE" | "APPROVE_WITH_NOTES" | "REVISE";
notes?: string;
malformed?: boolean;
} {
const trimmed = rawOutput.trim();
// Try structured JSON block first
const jsonBlockMatch = trimmed.match(
/```json-workflow-verdict\s*\n([\s\S]*?)\n\s*```/,
);
if (jsonBlockMatch) {
try {
const parsed = JSON.parse(jsonBlockMatch[1].trim());
if (parsed.verdict === "PASS" || parsed.verdict === "FAIL") {
const proseBefore = trimmed.slice(0, trimmed.indexOf(jsonBlockMatch[0])).trim();
return {
output: proseBefore || parsed.notes || "",
verdict: parsed.verdict,
notes: parsed.notes,
};
}
} catch {
// Malformed JSON — fall through to prose parsing
}
const parsed = parseWorkflowStepVerdict(trimmed);
if (parsed) {
return {
output: parsed.notes || "",
verdict: parsed.verdict,
notes: parsed.notes,
};
}
// Fallback: no structured block found, return raw output
return { output: trimmed };
const inferred = inferWorkflowStepVerdictFromProse(trimmed);
if (inferred) {
return {
output: inferred.notes || trimmed,
verdict: inferred.verdict,
notes: inferred.notes,
};
}
return { output: trimmed, malformed: true };
}
/**