fix: Judge-Urteil auch mit Markdown erkennen („## Urteil: **PASS**“)

parseVerdict und das SHIP-Urteil erwarteten „Urteil: PASS“ ohne Markup.
Der Judge schrieb „## Urteil: **PASS WITH CONCERNS**“; jede Runde galt als
unklar, --approve-concerns griff nie. Neu: parseShipVerdict, Tests.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Dieter Schlüter 2026-10-15 03:16:30 +02:00
commit 65555b25f1

View file

@ -664,10 +664,17 @@ function normalizeForComparison(s: string): string {
}
function parseVerdict(text: string): string {
const m = text.match(/Urteil:\s*(PASS WITH CONCERNS|PASS|FAIL)/i);
// Markdown zwischen „Urteil“ und dem Wort ist erlaubt: „## Urteil: **PASS**“, „**Urteil:** FAIL“.
const m = text.match(/Urteil[\s*_`:]*(PASS WITH CONCERNS|PASS|FAIL)/i);
return m ? m[1].toUpperCase() : "UNREADABLE";
}
// SHIP-Urteil der Freigabe-Runde; Markdown wie bei parseVerdict erlaubt. "" wenn nicht erkennbar.
function parseShipVerdict(text: string): string {
const m = text.match(/Urteil[\s*_`:]*(NO-SHIP|SHIP)/i);
return m ? m[1].toUpperCase() : "";
}
// Extrahiert den Blocker-Abschnitt für die Loop-Erkennung.
// Erkennt Bullet-Listen (- / – / *), Bold (**Blocker**) und Headings (## Blocker).
function parseBlockers(text: string): string {
@ -1226,7 +1233,7 @@ export default function (pi: ExtensionAPI) {
currentActivity = "Judge: finale Freigabe…";
await sendAndWait(pi, ctx, shipitPrompt(args || ""));
const shipText = getLastAssistantText(ctx);
const shipVerdict = shipText.match(/Urteil:\s*(SHIP|NO-SHIP)/i)?.[1]?.toUpperCase() ?? "";
const shipVerdict = parseShipVerdict(shipText);
if (shipVerdict === "SHIP") {
await autoCommitIfDirty(pi, ctx);
notifyShipSuccess(ctx);