test(dotnet-test): pin fixture SDK for P0 reliability skills (writing-mstest-tests, detect-static-dependencies) - #907
Conversation
…-tests and detect-static-dependencies P0 reliability hardening for the cross-family eval (#899). Adds a pinned global.json (rollForward: latestMajor) to every buildable fixture in both skills and wires it into the flat-copy scenarios so the executor arm no longer floats on the runner's ambient SDK. Note: the 3 errored trials in run 29228914412 were judge-side infra failures (CAPIError 400 'organization disabled' + 120s judge session.idle timeout), not fixture nondeterminism. These pins are defense-in-depth; the real fix (judge-error retry / token-pool pre-flight) is a harness follow-up. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: 5474f870-6be7-4b24-a5e1-a6e1e6de4ace
Skill Coverage Report
|
There was a problem hiding this comment.
Pull request overview
This PR improves reliability for dotnet-test skill evaluations by pinning a global.json (with rollForward: latestMajor) into buildable fixtures and ensuring evaluation scenarios copy it into the working directory.
Changes:
- Added
global.jsonpins to multiple buildable fixture folders forwriting-mstest-testsanddetect-static-dependencies. - Updated
writing-mstest-testseval.yamlandeval.vally.yamlscenarios to includeglobal.jsonin the scratch environment for build-capable scenarios.
Show a summary per file
| File | Description |
|---|---|
| tests/dotnet-test/writing-mstest-tests/fixtures/service-registry/global.json | Adds an SDK pin for the service-registry fixture. |
| tests/dotnet-test/writing-mstest-tests/fixtures/modern-mstest/global.json | Adds an SDK pin for the modern-mstest fixture. |
| tests/dotnet-test/writing-mstest-tests/fixtures/legacy-antipatterns/global.json | Adds an SDK pin for the legacy-antipatterns fixture. |
| tests/dotnet-test/writing-mstest-tests/eval.yaml | Copies global.json into relevant scenarios (one scenario currently embeds it inline). |
| tests/dotnet-test/writing-mstest-tests/eval.vally.yaml | Copies global.json into relevant Vally scenarios. |
| tests/dotnet-test/detect-static-dependencies/fixtures/static-heavy-project/global.json | Adds an SDK pin for the fixture. |
| tests/dotnet-test/detect-static-dependencies/fixtures/obj-exclusion-project/global.json | Adds an SDK pin for the fixture. |
| tests/dotnet-test/detect-static-dependencies/fixtures/lambda-statics-project/global.json | Adds an SDK pin for the fixture. |
Copilot's findings
Tip
Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
- Files reviewed: 8/8 changed files
- Comments generated: 1
…tead of inline pin Addresses PR review: the base eval.yaml scenario embedded global.json inline while the same pin exists at fixtures/service-registry/global.json, creating two sources of truth that could drift between the vally and skill-validator evals. Point the setup file at the fixture so the SDK pin has one source. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: 5474f870-6be7-4b24-a5e1-a6e1e6de4ace
|
/evaluate |
Skill Validation Results
[1] Model: claude-opus-4.6 | Judge: claude-opus-4.6 🔍 Full Results - additional metrics and failure investigation steps
▶ Sessions Visualisation -- interactive replay of all evaluation sessions |
…k-imperatives
Fixes skill activation for 4 scenarios where eager models answered the passive
advice-question prompts inline without invoking the skill (misses concentrated
on weaker models). Reframes 'Is there a better...?' / 'How should I...?' into
directive tasks ('Review and fix...', 'Modernize...', 'Rewrite...') so the
request clearly warrants the skill, matching its review/fix/modernize triggers.
Scenarios: Fix swapped Assert.AreEqual arguments, Replace ExpectedException with
Assert.Throws, Use proper type assertions instead of casts, Use DynamicData with
ValueTuples over object arrays. Code blocks, graders, and rubrics unchanged.
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 5474f870-6be7-4b24-a5e1-a6e1e6de4ace
Skill Validation Results
[1] Model: claude-opus-4.6 | Judge: claude-opus-4.6 🔍 Full Results - additional metrics and failure investigation steps
▶ Sessions Visualisation -- interactive replay of all evaluation sessions |
|
✅ Evaluation passed for |
Summary
Addresses the two P0 FIX-RELIABILITY items in #899 from the
dotnet-testcross-family skill evaluation:writing-mstest-tests— 2 errored trialsdetect-static-dependencies— 1 errored trialPer the InvestigatingResults guide, I downloaded the eval artifacts from run
29228914412and captured the actual stderr of every errored trial before changing anything.Root cause (what the stderr actually showed)
All three "errored" trials are judge-side infrastructure failures — not fixture nondeterminism:
Comparison judge failed: CAPIError: 400 This organization has been disabledComparison judge failed: Timeout after 120000ms waiting for session.idleComparison judge failed: Timeout after 120000ms waiting for session.idleEvidence the executor setup is already sound:
detect-static-dependenciesnever builds (0/30 trials randotnet build/test) — it is a pure source scan.writing-mstest-testsrandotnet testin 19/75 trials with no SDK-not-found or NuGet errors.Use comparison assertionsscenario that timed out hasreject_tools: [bash]and no fixtures at all — it cannot be a fixture/SDK problem.The
eval.vally.yamlschema exposes onlyconfig.timeout(executor); there is no per-eval judge timeout/retry knob, and the judge token pool is infra managed byvalidate-pat-pool.yml. So the report's generic "pin SDK/tool versions" prescription does not match these specific errors.What this PR changes (defense-in-depth determinism insurance)
Even though pinning wouldn't have prevented these judge-side flakes, the fixtures previously floated on the runner's ambient SDK (no
global.json), unlike reliable siblings such asmtp-hot-reloadandrun-tests. This PR closes that gap:global.json(rollForward: latestMajor) co-located with every buildable fixture:legacy-antipatterns(net8),modern-mstest(net9),service-registry(net9)static-heavy-project,lambda-statics-project,obj-exclusion-project(net10)eval.vally.yamlandeval.yaml(whole-./fixturesand whole-folder copies auto-inherit it).rollForward: latestMajorguarantees the pin never causes an "SDK not found" failure. Verified locally: all fixtures resolve their SDK cleanly with the pins in place.No skill content was changed — this is strictly reliability/determinism.
The real fix (tracked separately)
The observed errors are judge-side and belong in the harness, not the fixtures — tracked in #909:
CAPIError 4xx,session.idletimeout).COPILOT_PATentries before a run.Refs #899. Follow-up: #909.