From 59348930dd92954c1008fddeb0c117ccc3d97356 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 17 Mar 2026 00:04:25 +0000 Subject: [PATCH 1/2] Initial plan From 18967d4ee7c89902a51fc52685117b0c95e2e814 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 17 Mar 2026 00:10:31 +0000 Subject: [PATCH 2/2] Make parseGraderSelection permissive; keep validateEvalYAML strict Co-authored-by: LarryOsterman <8220172+LarryOsterman@users.noreply.github.com> --- internal/suggest/suggest.go | 11 +++++------ internal/suggest/suggest_test.go | 8 ++++++++ 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/internal/suggest/suggest.go b/internal/suggest/suggest.go index ac36bd88..c3d930f0 100644 --- a/internal/suggest/suggest.go +++ b/internal/suggest/suggest.go @@ -136,20 +136,19 @@ func parseGraderSelection(raw string) []string { } // Try structured YAML: { graders: [code, keyword, ...] } + // Use permissive decoding (no KnownFields) so that LLM responses with extra + // fields alongside "graders" are still accepted here. Unknown-field validation + // happens later in validateEvalYAML, not during grader-type selection. var structured struct { Graders []string `yaml:"graders"` } - decoder := yaml.NewDecoder(strings.NewReader(normalized)) - decoder.KnownFields(true) - if err := decoder.Decode(&structured); err == nil && len(structured.Graders) > 0 { + if err := yaml.NewDecoder(strings.NewReader(normalized)).Decode(&structured); err == nil && len(structured.Graders) > 0 { return filterValidGraderTypes(structured.Graders) } // Try bare YAML list: [code, keyword, ...] var bare []string - decoder = yaml.NewDecoder(strings.NewReader(normalized)) - decoder.KnownFields(true) - if err := decoder.Decode(&bare); err == nil && len(bare) > 0 { + if err := yaml.NewDecoder(strings.NewReader(normalized)).Decode(&bare); err == nil && len(bare) > 0 { return filterValidGraderTypes(bare) } diff --git a/internal/suggest/suggest_test.go b/internal/suggest/suggest_test.go index 34316112..44464188 100644 --- a/internal/suggest/suggest_test.go +++ b/internal/suggest/suggest_test.go @@ -106,6 +106,14 @@ func TestParseGraderSelectionEmpty(t *testing.T) { require.Nil(t, result) } +// TestParseGraderSelectionExtraFields verifies that extra keys alongside "graders" +// (common in LLM responses) do not prevent grader-type extraction. +func TestParseGraderSelectionExtraFields(t *testing.T) { + input := "graders:\n - code\n - text\nreason: these graders cover the task\n" + result := parseGraderSelection(input) + require.Equal(t, []string{"code", "text"}, result) +} + func TestGraderSummariesListsAllTypes(t *testing.T) { summaries := GraderSummaries() for _, graderType := range AvailableGraderTypes() {