feat: kurze Berichte für Judge und Freigabe (Blocker/Major vollständig, Rest begrenzt)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Dieter Schlüter 2026-10-16 04:19:53 +02:00
commit 9647b862c9
3 changed files with 36 additions and 2 deletions

View file

@ -43,6 +43,10 @@ Härtung über die Anforderungen hinaus, Skalierung, Stil und Wünsche schreibt
ändern das Urteil nicht, und der Coder bearbeitet sie bei `/fix` nicht. Ein Major ohne Reproduktion gilt als
Hinweis. Ohne diese Regeln urteilte der Judge mit Strata am 15.10.2026 in keiner Aufgabe PASS.
Judge und Freigabeprüfung berichten kurz: keine Tabelle bestandener Prüfungen, Blocker und Major vollständig mit
Fundstelle, Minor, fehlende Tests und Hinweise höchstens 5 Punkte je Abschnitt. Grund: Lange Berichte kosten
Rechenzeit und bleiben im Kontext jeder weiteren Runde (Messung im Repo `strata-betrieb`, FUNKTIONSWEISE).
Die Umschaltung zwischen den Rollen erfolgt über unterschiedliche System-Prompts, die die
Extension automatisch vor jeder Inference einsetzt. Es läuft kein zweiter Server.

View file

@ -70,6 +70,21 @@ function judgeVerdictSection(): string[] {
"- Fehlende Tests",
"- Hinweise (ändern das Urteil nicht)",
"- Konkrete Fix-Aufträge an den Coder (nur für Blocker, Major, Minor und fehlende Tests)",
"",
...reportBrevityRules(),
];
}
// Kurze Berichte für Judge und Freigabe. Am 15.10. (File Listing, Strata) erzeugte eine Sitzung 777 000 Tokens bei rund
// 100 tok/s; lange Prüfprotokolle und Tabellen machten einen großen Teil davon aus und landeten im Kontext jeder
// weiteren Runde.
function reportBrevityRules(): string[] {
return [
"Berichte kurz – der Bericht ist eine Arbeitsliste, kein Protokoll:",
"- Keine Liste oder Tabelle der bestandenen Prüfungen; nenne nur, was fehlschlug, und in einer Zeile, was geprüft wurde.",
"- Blocker und Major vollständig, je Punkt höchstens 3 Sätze plus Fundstelle (Datei:Zeile) oder Reproduktionsbefehl.",
"- Minor, fehlende Tests und Hinweise: höchstens 5 Punkte je Abschnitt, die wichtigsten zuerst, je Punkt eine Zeile.",
"- Leere Abschnitte mit „keine“. TASK.md nicht nacherzählen, keinen Code wiederholen, den der Coder schon kennt.",
];
}
@ -130,7 +145,7 @@ function fixPrompt(extra: string): string {
"Führe nach den Fixes passende Tests aus.",
"Führe danach einen Commit durch: git add -A && git commit -m 'fix: ...'",
"Wenn ein Punkt nicht sinnvoll umsetzbar ist, begründe das präzise.",
"Liefere am Ende nur:",
"Liefere am Ende nur, je Punkt eine Zeile:",
"- Was geändert wurde",
"- Welche Judge-Punkte geschlossen wurden",
"- Welche Punkte offen bleiben",
@ -150,7 +165,9 @@ function shipitPrompt(extra: string): string {
"- Urteil: SHIP | NO-SHIP",
"- Letzte Blocker",
"- Restrisiken",
"- Empfohlene Sofortmaßnahmen vor Deployment"
"- Empfohlene Sofortmaßnahmen vor Deployment",
"",
...reportBrevityRules(),
].join("\n") + (extra?.trim() ? "\n\nZusätzlicher Fokus:\n" + extra.trim() : "");
}

View file

@ -120,6 +120,7 @@ test("parseShipVerdict: SHIP, NO-SHIP, Markdown, unklar", () => {
// Judge-Prompts rufen judgeVerdictSection() auf; extractFn wertet jede Funktion einzeln aus, freie Namen landen
// im globalen Scope.
globalThis.reportBrevityRules = extractFn("reportBrevityRules");
globalThis.judgeVerdictSection = extractFn("judgeVerdictSection");
const judgePrompt = extractFn("judgePrompt");
const judgeWithTestsPrompt = extractFn("judgeWithTestsPrompt");
@ -140,3 +141,15 @@ test("Judge-Prompts: Urteilsregeln und Hinweise in beiden Varianten (Strata-Judg
test("fixPrompt: Hinweise sind kein Auftrag", () => {
assert.match(fixPrompt(""), /„Hinweise“ ist kein Auftrag/);
});
const shipitPrompt = extractFn("shipitPrompt");
test("Judge- und Freigabe-Prompts verlangen kurze Berichte, Blocker/Major bleiben vollständig", () => {
for (const p of [judgePrompt(""), judgeWithTestsPrompt("1 passed", ""), shipitPrompt("")]) {
assert.match(p, /Berichte kurz/);
assert.match(p, /Blocker und Major vollständig/);
assert.match(p, /höchstens 5 Punkte je Abschnitt/);
}
assert.match(shipitPrompt(""), /- Urteil: SHIP \| NO-SHIP/);
assert.match(fixPrompt(""), /Liefere am Ende nur, je Punkt eine Zeile/);
});