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 ä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. 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 Die Umschaltung zwischen den Rollen erfolgt über unterschiedliche System-Prompts, die die
Extension automatisch vor jeder Inference einsetzt. Es läuft kein zweiter Server. Extension automatisch vor jeder Inference einsetzt. Es läuft kein zweiter Server.

View file

@ -70,6 +70,21 @@ function judgeVerdictSection(): string[] {
"- Fehlende Tests", "- Fehlende Tests",
"- Hinweise (ändern das Urteil nicht)", "- Hinweise (ändern das Urteil nicht)",
"- Konkrete Fix-Aufträge an den Coder (nur für Blocker, Major, Minor und fehlende Tests)", "- 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 nach den Fixes passende Tests aus.",
"Führe danach einen Commit durch: git add -A && git commit -m 'fix: ...'", "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.", "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", "- Was geändert wurde",
"- Welche Judge-Punkte geschlossen wurden", "- Welche Judge-Punkte geschlossen wurden",
"- Welche Punkte offen bleiben", "- Welche Punkte offen bleiben",
@ -150,7 +165,9 @@ function shipitPrompt(extra: string): string {
"- Urteil: SHIP | NO-SHIP", "- Urteil: SHIP | NO-SHIP",
"- Letzte Blocker", "- Letzte Blocker",
"- Restrisiken", "- Restrisiken",
"- Empfohlene Sofortmaßnahmen vor Deployment" "- Empfohlene Sofortmaßnahmen vor Deployment",
"",
...reportBrevityRules(),
].join("\n") + (extra?.trim() ? "\n\nZusätzlicher Fokus:\n" + extra.trim() : ""); ].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 // Judge-Prompts rufen judgeVerdictSection() auf; extractFn wertet jede Funktion einzeln aus, freie Namen landen
// im globalen Scope. // im globalen Scope.
globalThis.reportBrevityRules = extractFn("reportBrevityRules");
globalThis.judgeVerdictSection = extractFn("judgeVerdictSection"); globalThis.judgeVerdictSection = extractFn("judgeVerdictSection");
const judgePrompt = extractFn("judgePrompt"); const judgePrompt = extractFn("judgePrompt");
const judgeWithTestsPrompt = extractFn("judgeWithTestsPrompt"); 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", () => { test("fixPrompt: Hinweise sind kein Auftrag", () => {
assert.match(fixPrompt(""), /„Hinweise“ ist 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/);
});