Repository navigation
feat: configure Copilot reasoning effort for evaluations and judges - #573
Shayne Boyer (spboyer) merged 10 commits into
Conversation
Co-authored-by: spboyer <7681382+spboyer@users.noreply.github.com>
Co-authored-by: spboyer <7681382+spboyer@users.noreply.github.com>
There was a problem hiding this comment.
Review details
Suppressed comments (3)
Previously missed (2) — in code that hasn't changed since the last review.
internal/cache/cache.go:57
- CacheKey now includes reasoning_effort fields but still omits config.judge_model. Changing judge_model can change prompt-grader results, so the cache key should include judge_model as well to avoid reusing cached outcomes graded by a different judge model.
if err := writeString(h, spec.Config.ModelID); err != nil {
return "", err
}
if err := writeString(h, spec.Config.ReasoningEffort); err != nil {
return "", err
README.md:1164
- This sentence says a prompt grader overrides the judge default with
config.reasoning_effort, which is ambiguous with the eval-levelconfig.reasoning_effort. The override isgraders[].config.reasoning_effort(prompt grader config).
Pin `reasoning_effort` and `judge_reasoning_effort` to `low`, `medium`, `high`, `xhigh`, or `max` when benchmarking model-and-effort combinations. Omit either setting to preserve the Copilot SDK/model default. A `prompt` grader can override the judge default with `config.reasoning_effort`.
README.md:1071
- The example comment suggests using the mock executor when not pinning reasoning effort, but copilot-sdk is still valid without reasoning_effort/judge_reasoning_effort. This reads like an incorrect requirement and may confuse readers.
executor: copilot-sdk # use mock when not pinning reasoning effort
- Files reviewed: 23/23 changed files
- Comments generated: 0 new
- Review effort level: Lite
Shayne Boyer (spboyer)
left a comment
There was a problem hiding this comment.
Owner review: requesting changes because the existing reasoning-effort blockers remain unresolved. Do not apply judge_reasoning_effort to continue_session graders, reject prompt-grader reasoning_effort under non-copilot-sdk executors, include judge_model in the relevant cache contract, and correct the misleading README executor guidance. This PR is also still draft and currently has only the CLA check.
Co-authored-by: spboyer <7681382+spboyer@users.noreply.github.com>
Addressed in fe6e7ae:
Tests added for each: grader default skip, executor rejection (Go + schema), and judge-model cache separation. |
Co-authored-by: spboyer <7681382+spboyer@users.noreply.github.com>
There was a problem hiding this comment.
🟡 Changes recommended
Unresolved issues affect regrade metadata, continued-session defaults, task-level validation, runtime error coverage, and generated dashboard references.
Get a fresh assessment by requesting another Copilot review.
Review details
Suppressed comments (2)
internal/execution/copilot.go:380
- The new execution tests use mocked SDK clients and only verify that the effort field is copied into create/resume configs. They do not cover the required runtime behavior for an unsupported model/effort combination, so an SDK rejection could regress without detection. Add a gated live Copilot test (matching the existing live-test convention) that asserts the surfaced error is actionable.
ReasoningEffort: req.ReasoningEffort,
internal/models/grader_params.go:204
PromptGraderParametersis shared with taskValidatorInlines, andRunAllapplies this field to those validators, butValidatorInline.Validatenever checksValidReasoningEffortandschemas/task.schema.jsonstill rejects the field viaadditionalProperties: false. A valid task-level override is therefore rejected by schema validation, while an invalid value can reach the runtime when the task is loaded directly (also bypassing the executor restriction). Either add matching task-level support and validation, or reject the field consistently.
ReasoningEffort string `yaml:"reasoning_effort,omitempty" json:"reasoning_effort,omitempty"`
- Files reviewed: 23/24 changed files
- Comments generated: 2
- Review effort level: Lite
Shayne Boyer (spboyer)
left a comment
There was a problem hiding this comment.
Reviewed reasoning-effort configuration and follow-up fixes at d71e561f with two independent review passes.
No new, non-duplicate findings. Previously reported blockers remain at this head, so changes are still requested. See the existing review; no duplicate inline comments are added.
…rade Co-authored-by: spboyer <7681382+spboyer@users.noreply.github.com>
Co-authored-by: spboyer <7681382+spboyer@users.noreply.github.com>
There was a problem hiding this comment.
🔵 Needs a closer look
Unresolved validation/schema gaps and inaccurate regrade metadata block approval.
Review details
Suppressed comments (4)
Previously missed (2) — in code that hasn't changed since the last review.
internal/models/spec.go:373
- This validation only runs for
GraderConfig(eval-level graders). Task-level and checkpoint prompt graders useValidatorInline, whose validation has no correspondingValidReasoningEffortor non-Copilot check; becauseLoadTestCasedoes not apply the eval schema, an invalid effort or an effort paired withexecutor: mockcan reachRunAlland be forwarded instead of rejected. Share this validation withValidatorInlineand perform the executor-aware check when tasks are attached to an eval.
schemas/eval.schema.json:1291 - The new field is added only to the eval schema's prompt config, but the same
PromptGraderParametersis used by task-level and checkpoint graders andRunAllapplies judge defaults on those paths.schemas/task.schema.jsonstill hasadditionalProperties: falsewithoutreasoning_effort, so schema validation rejects a task/checkpoint override even forcopilot-sdk, creating a mismatch between the supported execution path and the schema.
internal/orchestration/outcome.go:297
runGradealways passes the current spec'sJudgeReasoningEffort, including an empty string when the setting is omitted. If an older results file contains a non-empty effort, this conditional preserves that stale value even though the regrade ran with the SDK/model default, so the saved metadata is inaccurate; overwrite the field unconditionally for regrades (or explicitly clear it when the effective setting is empty).
if judgeReasoningEffort != "" {
setup.JudgeReasoningEffort = judgeReasoningEffort
}
site/src/content/docs/guides/eval-yaml.mdx:125
- The public site grader reference remains stale: its Prompt grader table omits
reasoning_effort, and its schema reference omits both new eval-level effort fields. Since these pages are the user-facing references for grader options and eval configuration, update them alongside this new configuration documented here.
| `judge_reasoning_effort` | string | judge default | Copilot SDK default effort for `prompt` graders, including `continue_session` graders; the grader can override it |
- Files reviewed: 25/26 changed files
- Comments generated: 0 new
- Review effort level: Lite
There was a problem hiding this comment.
🔵 Needs a closer look
Unresolved schema validation, nested-grader validation, documentation, and generated-asset issues remain.
Review details
Suppressed comments (4)
Previously missed (2) — in code that hasn't changed since the last review.
internal/models/spec.go:480
- This validation only iterates over
s.Graders, but task prompt graders useTestCase.Validatorsand checkpoint prompt graders useTestCase.Checkpoints[].Graders; neither path has an equivalent reasoning-effort or executor check. Consequently task/checkpoint YAML can pass Go loading with an invalid effort or with an effort under themockexecutor, andRunAllwill still forward it. Validate these nested graders with the same rules and executor context.
schemas/eval.schema.json:1291 - This adds
reasoning_effortonly to the eval schema's prompt-grader definition. Task-level graders are validated against the separateschemas/task.schema.jsondefinition, whosepromptGraderConfigstill hasadditionalProperties: falsewithout this property, so the documented override is rejected as an unknown field whenever it is placed in a task YAML. Add the matching property there (and cover it with a task-schema validation test).
docs/graders/prompt.md:24
- The public prompt-grader guide at
site/src/content/docs/guides/graders.mdxstill has noreasoning_effortrow or example, while this change documents the override in the local reference. Update the published guide too so users see the new grader configuration and supported values.
| `reasoning_effort` | string | Override the eval's `judge_reasoning_effort` (`low`, `medium`, `high`, `xhigh`, or `max`); requires `executor: copilot-sdk` |
internal/models/grader_params.go:204
- This field is also used by
ValidatorInlineandgraders.RunAllfor task and checkpoint prompt graders, butschemas/task.schema.jsonstill omitsreasoning_effortfrompromptGraderConfig(which hasadditionalProperties: false). A task can therefore decode this new field in Go whilewaza check/JSON-RPC schema validation rejects the same YAML; update the task schema and add matching validation coverage.
ReasoningEffort string `yaml:"reasoning_effort,omitempty" json:"reasoning_effort,omitempty"`
- Files reviewed: 25/26 changed files
- Comments generated: 0 new
- Review effort level: Lite
…ning-effort-configuration
Address prior schema, executor validation, regrade metadata, docs and lint feedback. Check hosted runtime model capabilities before forwarding explicit effort to prevent silent downgrade; preserve custom-provider forwarding. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Shayne Boyer (spboyer)
left a comment
There was a problem hiding this comment.
Reviewed the reasoning-effort implementation and follow-up fixes with independent Opus 4.7 and GPT 5.5 passes, deduplicated against all prior feedback. No remaining findings. The fixes cover nested judge validation, accurate regrade metadata, published references, and hosted-model capability checks; resumed-session forwarding follows #571 and the SDK contract. Go vet, full/short tests, lint, docs build, and the gated live unsupported-effort check passed. This supersedes my earlier change requests after verifying the fixes; repository latest-push and codeowner approval rules still apply.
There was a problem hiding this comment.
Copilot review overview
🟡 Changes recommended
Address catalog preflight reuse, expose effort metadata through the run API, and add runner-level propagation coverage.
Get a fresh assessment by requesting another Copilot review.
Review effort: Lite
Findings: 1
Open (1)
Resolved since last review (1)
Shayne Boyer (spboyer)
left a comment
There was a problem hiding this comment.
Reviewed the current diff, CI, repository compatibility, and existing feedback. No new issues found.

Evaluations could select task and judge models but not their reasoning effort, preventing reproducible model-and-effort comparisons. This adds validated effort configuration for Copilot SDK task, responder, and LLM-as-judge sessions.
Configuration
config.reasoning_effortfor task and responder sessions.config.judge_reasoning_effortas the prompt-grader default.config.reasoning_effort; agent effort remains eval-level.low,medium,high,xhigh, andmax.copilot-sdkexecutors in Go loading and eval/task schema checking.Execution
gpt-5-mini/maxdespite advertising onlylow,medium,high; the metadata guard prevents that silent mismatch.Reproducibility
Coverage and docs
Resumed-session effort remains enabled as required by #571 and supported by
ResumeSessionConfig.ReasoningEffort; it supersedes the earlier proposal to exclude continued-session graders.Fixes #571