fix: parseVerdict matches leniently + earliest phrase wins
Build & push image / build-and-push (push) Successful in 8s

A section that led with '**Blocking issues**' (no 'found') fell through to
unknown, so the consolidated header wrongly read 'No material issues found'
(seen live on gpt-oss). Now matches 'blocking issue'/'minor issue'/'no material
issue' and picks the earliest-appearing phrase (the lead verdict). + tests.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Steve Dudenhoeffer
2026-06-25 21:28:19 -04:00
parent 92bf22a1be
commit b409dff4ed
2 changed files with 25 additions and 13 deletions
+18 -9
View File
@@ -32,16 +32,25 @@ func (v verdict) label() string {
// The base prompt tells each lens to lead with one of the three phrases.
func parseVerdict(out string) verdict {
l := strings.ToLower(out)
switch {
case strings.Contains(l, "blocking issues found"):
return verdictBlocking
case strings.Contains(l, "no material issues"):
return verdictClean
case strings.Contains(l, "minor issues"):
return verdictMinor
default:
return verdictUnknown
// Match the EARLIEST-appearing verdict phrase (the lead verdict), and match
// leniently — models write "Blocking issues found", "**Blocking issues**",
// "blocking issue", etc. (A strict "blocking issues found" check let a
// gpt-oss section that said "**Blocking issues**" fall through to unknown,
// so the overall header wrongly read "No material issues found".)
best, bestIdx := verdictUnknown, -1
for _, c := range []struct {
phrase string
v verdict
}{
{"blocking issue", verdictBlocking},
{"minor issue", verdictMinor},
{"no material issue", verdictClean},
} {
if i := strings.Index(l, c.phrase); i >= 0 && (bestIdx == -1 || i < bestIdx) {
best, bestIdx = c.v, i
}
}
return best
}
// specialistResult pairs a specialist with its rendered review and verdict.
+3
View File
@@ -114,6 +114,9 @@ func TestParseVerdictAndWorst(t *testing.T) {
"VERDICT: No material issues found.": verdictClean,
"Minor issues\n- nit": verdictMinor,
"**Blocking issues found**": verdictBlocking,
"**Blocking issues**\n- bug": verdictBlocking, // no "found" suffix
"VERDICT: Blocking issue\n- one": verdictBlocking, // singular
"No material issues found. There are no blocking issues.": verdictClean, // earliest phrase wins
"something unparseable": verdictUnknown,
}
for in, want := range cases {