Repository navigation
Improve consolidated MSBuild guidance and correctness checks - #1348
YuliiaKovalova wants to merge 8 commits into
Conversation
Clarify required imports and controlled performance advice. Add executable hook, incremental-generation, and package-consumer contracts plus installed-reference diagnostics. Preserve main tooling and migrated dormancy metadata. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Skill Coverage Report
Uncovered:
|
There was a problem hiding this comment.
🟡 Changes recommended
The graders can accept build-time changes to protected inputs and deletion or corruption of the supplied package.
2 open issues
What changed in this PR
This PR strengthens the consolidated MSBuild skill’s import and performance guidance, adds executable correctness contracts, and introduces a smoke test for installed-reference access through the logged SDK evaluation path.
Changes:
- Clarifies required-import behavior and controlled, workload-specific performance comparisons.
- Adds hook, incremental-generation, and package-consumer fixtures, graders, and regression tests.
- Adds exact-path reference-read checks with retained execution evidence and troubleshooting guidance.
| File | Description |
|---|---|
| tests/dotnet/msbuild/references/incremental-membership.patch | Adds a golden input-membership repair. |
| tests/dotnet/msbuild/references/hook-composition.patch | Adds a golden optional/required import repair. |
| tests/dotnet/msbuild/graders/check-contracts.test.mjs | Tests golden repairs and broken mutations. |
| tests/dotnet/msbuild/graders/check-contracts.mjs | Implements executable correctness and preservation checks. |
| tests/dotnet/msbuild/fixtures/packed-import/src/Producer/Producer.csproj | Defines the package producer. |
| tests/dotnet/msbuild/fixtures/packed-import/src/Producer/Packaging.props | Configures external nuspec packaging. |
| tests/dotnet/msbuild/fixtures/packed-import/src/Producer/buildTransitive/common/Example.props | Supplies the package contract property. |
| tests/dotnet/msbuild/fixtures/packed-import/src/Producer/build/net8.0/Example.props | Imports the required packed asset. |
| tests/dotnet/msbuild/fixtures/packed-import/eng/packaging/Example.nuspec | Maps source assets to package paths. |
| tests/dotnet/msbuild/fixtures/packed-import/consumer/Consumer.proj | Exercises restored package imports. |
| tests/dotnet/msbuild/fixtures/incremental/Specs/beta.json | Supplies a removable generator input. |
| tests/dotnet/msbuild/fixtures/incremental/Specs/alpha.json | Supplies an editable generator input. |
| tests/dotnet/msbuild/fixtures/incremental/Generator.targets | Generates catalog content and records executions. |
| tests/dotnet/msbuild/fixtures/incremental/Build.proj | Reproduces stale input-membership behavior. |
| tests/dotnet/msbuild/fixtures/hooks/required.targets | Records required-hook import order. |
| tests/dotnet/msbuild/fixtures/hooks/optional.targets.example | Supplies the optional-hook definition. |
| tests/dotnet/msbuild/fixtures/hooks/Build.proj | Reproduces mixed-list import guarding. |
| tests/dotnet/msbuild/eval.yaml | Adds executable contracts and a controlled timing scenario. |
| plugins/dotnet/skills/msbuild/SKILL.md | Strengthens import, timing, and reference-reading guidance. |
| plugins/dotnet/skills/msbuild/references/extension-points.md | Clarifies optional versus required imports. |
| plugins/dotnet/skills/msbuild/references/build-perf-baseline.md | Clarifies fair comparisons and scoped conclusions. |
| plugins/dotnet/README.md | Documents contracts and reference-access qualification. |
| eng/vally-adapter/InvestigatingResults.md | Documents the logged reference-access smoke. |
| eng/evaluation-tools/smoke-skill-references.test.mjs | Tests reference-read acceptance and rejection. |
| eng/evaluation-tools/smoke-skill-references.mjs | Implements exact-path reads and evidence retention. |
Review effort: Balanced
|
👋 @YuliiaKovalova — this PR has 2 unresolved review thread(s). When you're ready, please address the feedback and push an update; the triage bot will pick up the next state automatically. (Add the |
Protect source inputs before and after each build, consume the exact supplied package, and stage trusted grader state only after agent execution. Add nonce-based hook checks, junction-safe entrypoints, and CI coverage for contract regressions. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
|
Addressed all six additional findings in 7a20ca5:
Local validation: 44 tests passed, all four production-oracle goldens passed (including the three executable graders), 111/111 eval specs validated, and the evaluation quality gate reported no errors. Remote CI is separate from these local results. |
Compare the entire submitted Specs tree with its trusted file/hash map before replay, with regressions for top-level and nested additions. Update the CI smoke assertion for the renamed combined tooling/MSBuild test step and verify the contract test selector. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
📊 Skill and Agent Evaluation Results2 model/target results across 1 target and 2 models — ✅ 0 improved, ➖ 2 results without a clear winner, Measurement identity: evaluated commit Measurement health: 2 expected / 2 observed / 2 written; 0 missing, 0 unexpected, 0 invalid; 0 recovered comparison error slots and 0 unresolved comparison error slots. Objective completion gate: not enabled. Aggregate completion transitions are telemetry only, so this report does not claim that zero objective regressions were proven. A result passes only when preference-eligible distinct-stimulus votes have aggregate net win of at least 20% and an exact one-sided sign-test result of
ℹ️ How to read this report
➖ Improvement signal, tie-limited — msbuild (claude-sonnet-5)Why: Net win +44.4% (4W/5T/0L over 9 preference-eligible stimulus vote(s), sign test p=0.063), mean preference +3.8% across 48 paired run(s), 7 dormancy stimulus/stimuli excluded from preference — not credible — 5 of 9 preference-eligible stimulus vote(s) tied, leaving only 4 discordant preference vote(s). The sign test conditions on non-tie stimulus votes and cannot reach 0.05 below 5, so no record could have passed here — this is not a measured null. Either the skill is inert on these scenarios (make them discriminate) or the eval needs more distinct stimuli to clear the ties Next action: The signal favors the target, but ties leave too few discordant tasks; inspect ties and predeclare more discriminating breadth. State: Gate evidence: n=9; 4W/5T/0L; d=4; p=0.063; net +44.4%; 7 dormancy excluded Overfit: Moderate (score 0.41) Repeated-run reliability (not used by the gate): 48 paired runs (15W/24T/9L). Weak or warning scenarios:
Illustrative judge evidence:
This is one example, not the aggregate verdict. Open Full Results for every judgment. ➖ Improvement signal, tie-limited — msbuild (gpt-5.6-luna)Why: Net win +22.2% (3W/5T/1L over 9 preference-eligible stimulus vote(s), sign test p=0.312), mean preference +1.3% across 48 paired run(s), 7 dormancy stimulus/stimuli excluded from preference — not credible — 5 of 9 preference-eligible stimulus vote(s) tied, leaving only 4 discordant preference vote(s). The sign test conditions on non-tie stimulus votes and cannot reach 0.05 below 5, so no record could have passed here — this is not a measured null. Either the skill is inert on these scenarios (make them discriminate) or the eval needs more distinct stimuli to clear the ties Next action: The signal favors the target, but ties leave too few discordant tasks; inspect ties and predeclare more discriminating breadth. State: Gate evidence: n=9; 3W/5T/1L; d=4; p=0.312; net +22.2%; 7 dormancy excluded Overfit: Moderate (score 0.47) Repeated-run reliability (not used by the gate): 48 paired runs (4W/40T/4L). Weak or warning scenarios:
Illustrative judge evidence:
This is one example, not the aggregate verdict. Open Full Results for every judgment. 🔍 Full Results - all metrics and investigation details
|
|
✅ Evaluation passed for |
Decouple executable fixtures from the repository preview authoring SDK. The retained evaluation failed all 54 new contract invocations before replay on SDK 10 hosts. Keep grading-only policy integrity and actual-SDK checks, use the same stable policy in CI, and verify goldens and regressions without the preview SDK. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Answer settled advisory questions without reference or workspace work. Make critical-path attribution and same-workload old/new setting comparisons explicit, and enforce the advisory work budget in the existing evaluation cases. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
📊 Skill and Agent Evaluation Results2 model/target results across 1 target and 2 models — ✅ 0 improved, ➖ 1 result without a clear winner, Measurement identity: evaluated commit Measurement health: 2 expected / 2 observed / 2 written; 0 missing, 0 unexpected, 0 invalid; 0 recovered comparison error slots and 0 unresolved comparison error slots. Objective completion gate: not enabled. Aggregate completion transitions are telemetry only, so this report does not claim that zero objective regressions were proven. A result passes only when preference-eligible distinct-stimulus votes have aggregate net win of at least 20% and an exact one-sided sign-test result of
ℹ️ How to read this report
⛔ Activation contract failed — msbuild (gpt-5.6-luna)Why: Net win +33.3% (4W/4T/1L over 9 preference-eligible stimulus vote(s), sign test p=0.188), mean preference +6.7% across 48 paired run(s), 7 dormancy stimulus/stimuli excluded from preference — activation contract failed (1 explicit dormancy scenario(s) activated the isolated target skill) Next action: Narrow skill routing so the listed off-target scenarios stay dormant. State: Gate evidence: n=9; 4W/4T/1L; d=5; p=0.188; net +33.3%; 7 dormancy excluded Warnings: Dormancy contract: 1 unexpected activation(s) Repeated-run reliability (not used by the gate): 48 paired runs (9W/38T/1L). Weak or warning scenarios:
Illustrative judge evidence:
This is one example, not the aggregate verdict. Open Full Results for every judgment. ➖ Improvement signal, unproven — msbuild (claude-sonnet-5)Why: Net win +44.4% (6W/1T/2L over 9 preference-eligible stimulus vote(s), sign test p=0.145), mean preference +14.6% across 48 paired run(s), 7 dormancy stimulus/stimuli excluded from preference — not credible (sign test p=0.145 > 0.05) Next action: The signal favors the target but is inconsistent; inspect tied or lost scenarios and fix weak behavior. State: Gate evidence: n=9; 6W/1T/2L; d=8; p=0.145; net +44.4%; 7 dormancy excluded Warnings: Activation: isolated 9/9; plugin 8/9 Repeated-run reliability (not used by the gate): 48 paired runs (21W/19T/8L). Weak or warning scenarios:
Illustrative judge evidence:
This is one example, not the aggregate verdict. Open Full Results for every judgment. 🔍 Full Results - all metrics and investigation details
|
The next hosted image had SDK 10.0.401 rather than 10.0.402. Use the stable 10.0.100 baseline with latestMajor roll-forward instead of a latest-patch floor. Reproduced the previous failure with an isolated 10.0.204 inventory, then verified all 47 contract tests and four production goldens on that older feature band. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Exclude failed assertions after successful builds before listing positive build cues. Keep genuine dotnet-test build failures in scope, and attribute wall time only after confirming task intervals and dependency resumption. Non-voting before/after checks preserve both routing boundaries on Sonnet and Luna. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
📊 Skill and Agent Evaluation Results2 model/target results across 1 target and 2 models — ✅ 0 improved, ➖ 2 results without a clear winner, Measurement identity: evaluated commit Measurement health: 2 expected / 2 observed / 2 written; 0 missing, 0 unexpected, 0 invalid; 0 recovered comparison error slots and 0 unresolved comparison error slots. Objective completion gate: not enabled. Aggregate completion transitions are telemetry only, so this report does not claim that zero objective regressions were proven. A result passes only when preference-eligible distinct-stimulus votes have aggregate net win of at least 20% and an exact one-sided sign-test result of
ℹ️ How to read this report
➖ Improvement signal, unproven — msbuild (claude-sonnet-5)Why: Net win +33.3% (5W/2T/2L over 9 preference-eligible stimulus vote(s), sign test p=0.227), mean preference +3.3% across 48 paired run(s), 7 dormancy stimulus/stimuli excluded from preference — not credible (sign test p=0.227 > 0.05) Next action: The signal favors the target but is inconsistent; inspect tied or lost scenarios and fix weak behavior. State: Gate evidence: n=9; 5W/2T/2L; d=7; p=0.227; net +33.3%; 7 dormancy excluded Repeated-run reliability (not used by the gate): 48 paired runs (13W/26T/9L). Weak or warning scenarios:
Illustrative judge evidence:
This is one example, not the aggregate verdict. Open Full Results for every judgment. ➖ Baseline signal, tie-limited — msbuild (gpt-5.6-luna)Why: Net win -11.1% (1W/6T/2L over 9 preference-eligible stimulus vote(s), sign test p=0.500), mean preference -1.7% across 48 paired run(s), 7 dormancy stimulus/stimuli excluded from preference — no improvement Next action: Inspect activation-only failed runs before rewriting skill content; the model stopped after loading a skill. State: Gate evidence: n=9; 1W/6T/2L; d=3; p=0.500; net -11.1%; 7 dormancy excluded Warnings: Activation-only stop: isolated 1 failed run; Activation-only stop: plugin 1 failed run Repeated-run reliability (not used by the gate): 48 paired runs (4W/38T/6L). Weak or warning scenarios:
Illustrative judge evidence:
This is one example, not the aggregate verdict. Open Full Results for every judgment. 🔍 Full Results - all metrics and investigation details
|
The corrected SDK exposed inherited PackageSourceMapping that rejected Example in every role. Give the disposable consumer an explicit local-feed config. The hostile-parent regression fails before the fix, all 48 tests and four goldens now pass, and all 18 unchanged recorded package submissions replay successfully without new model calls. Skill content and voting inputs remain unchanged. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
|
Further iteration is published through Baseline improvement is still unproven. The latest full skill-content run at All 54 hosted command graders selected SDK10.0.401; all 36 hook/incremental replays passed. The 18 package failures were instead inherited host NuGet source mapping. The final grader-only repair uses an explicit local-feed restore config. All 18 actual unchanged submissions now pass local Windows/SDK10.0.402 replay through production grading staging under reproduced hostile mapping, without new model calls or preference votes. The hosted Linux regression also passes. The two Luna activation-only warnings are not continuation stops here: both answers are substantive correct no-change explanations with passing prompt grades. The failed package code grader caused the misleading classification; no runtime workaround was added. Final-head |

Summary
Strengthen the consolidated
dotnet/msbuildskill against the concrete correctness and overhead problems identified in the evaluation report.Current evidence does not demonstrate a baseline win. The latest full skill-content comparison is valid but unproven on both model families; the final follow-up repairs package-grading isolation without changing that evaluated skill content or claiming a new preference result.
viewat each exact staged path, rejects recovery loops and alternate checkouts, and retains source hashes, events, trajectories, and runtime provenance.The motivating losing-trial judge explanations were:
Current
mainincludes the upstream reader/session-history repair through Vally 0.18 (#1309). This PR preserves that tooling and the migrated dormancy metadata rather than reintroducing the older Vally 0.14 workaround or changing dependency versions.The specialist plugin, worker budgets, concurrency, scoring thresholds, nine preference-eligible tasks, and seven dormancy cases are unchanged. The final routing clarification distinguishes failed test assertions from actual MSBuild failures without changing those tasks. This branch excludes the unrelated work in #1311.
Review hardening
Specs/before replay, so the empty-input check actually empties the catalog.Paired evidence and further iteration
The completed evaluation of
4001fb3produced valid, positive but tie-limited preference evidence:claude-sonnet-5gpt-5.6-lunaThe subsequent run at
2a43604was also valid but did not establish a baseline win:claude-sonnet-5gpt-5.6-lunaThe latest full skill-content run at
6042e75passed all seven dormancy contracts on both models, but still did not establish improvement:claude-sonnet-5gpt-5.6-lunaInspection of the raw artifacts exposed a separate measurement defect. At
4001fb3, all 54 command-grader executions for the three new contracts failed atdotnet --version, before replay: the rootglobal.jsonrequired unavailable SDK11.0.100-preview.3.26207.106. SDK installation is skipped on validator-cache hits.The first repair selected stable SDK
10.0.402, which the previous runner listed and which passed locally. The next hosted image instead carried10.0.401, so that patch floor still prevented all 54 contract replays in the second run. These absolute completion measurements are not evidence of contract correctness, despite valid preference accounting.The final repair uses a dedicated 10.0.100 minimum / latestMajor policy, preserved exactly by the trusted grader manifest. This accepts installed older SDK 10 patches and feature bands rather than requiring the newest patch. To verify that boundary rather than only the local newest SDK, an owned host view exposed only SDK 10.0.204: the old policy failed, and the corrected policy passed all 47 tests and all four production goldens. The shared SDK installation and repository authoring SDK were not changed.
The latest hosted run confirms SDK resolution in all 54 contract executions, selecting 10.0.401. All 36 hook/incremental replays passed. The remaining 18 package replays exposed a second host dependency: inherited
PackageSourceMappingrejectedExamplewithNU1100, despite its presence in the supplied local feed.The final grader-only commit
6d24709isolates restore with a temporary explicit local-feedNuGet.Config. A hostile-parent mapping regression failed before this fix and now passes. All 18 actual unchanged submitted package workspaces were reconstructed from their recorded zero-byte patches and replayed locally on Windows / SDK10.0.402 through production grading staging under the reproduced hostile mapping: 18/18 passed, without new model calls or preference votes.The report's two Luna "activation-only stop" warnings came from those failed package code graders, not missing answers: both trajectories contain substantive correct no-change explanations and passing prompt grades. No unrelated runtime retry or continuation workaround was added.
The content iteration addresses observed behavior:
dotnet testremain in scope. Critical-path attribution now explicitly follows task intervals, dependency completion, and dependent resumption.Non-voting development diagnostics
Three prompts were declared before model execution: a copying-dominated critical path, a source-edit-state confound, and a modest controlled improvement. They were run once per arm with eight workers, the same skill directory name, frozen
4001fb3skill content, and the default executor/judge pairings.Both skill arms activated on all three prompts in this initial matched run. The candidate used approximately 20% / 19% fewer executor tokens than the prior skill, not than the unskilled baseline. Token totals already include cached input accounting; judge usage is separate. The skill remains more expensive than no skill on these self-contained questions.
After tightening the same-input/output-state protocol, disclosed after-only development reruns passed all six grader sets. Sonnet activated on 3/3 prompts; Luna activated on 2/3, so the skipped Luna activation is not counted as evidence of guidance-driven savings. One initial Luna judge incorrectly rejected an advisory proposal for future builds as actual command execution; that verdict is not counted as a real quality regression of the old skill.
A separate non-voting routing replay used the existing assertion prompt and a genuine pre-test MSBuild import failure, three runs per case and model. Both Sonnet and Luna stayed dormant on all three assertion runs and activated on all three genuine build failures. Both the old and new descriptions passed this finite replay, so this is regression protection, not proof that the observed stochastic activation is eliminated.
These are development diagnostics, not extra independent votes, proof of significance, or a general efficiency claim. The completed default-profile run is bound to skill-content commit
6042e75ae40e51da6e54bef62af61e8cdf49f82d. Final head6d24709f1de6ad2ee3c9882f60a9274de6dddac6changes only the grader, its regression test, and README;SKILL.mdandeval.yamlare identical. No fourth model run was launched to chase significance, and deterministic replay does not replace the official preference verdict.Actual target-task cost
Totals below cover the same nine preference-eligible tasks times three repeats per arm in the latest full run. Dormancy and judge usage are excluded, and cached input is not counted twice.
These whole-task results do not support an overall token-efficiency win over baseline. The reduced reference-reading overhead in the development diagnostics is narrower evidence, not a substitute for this comparison.
Related issue
Follow-up to the consolidated MSBuild entry introduced in #1241. No issue is closed.
Validation
Validated on Windows with Node 22.23.4, stable .NET SDK 10.0.402, and unchanged Vally 0.18 / Copilot SDK 1.0.14 dependencies. The SDK-minimum repair was separately verified on 10.0.204 in an older-only host view; that view was removed without changing the shared SDK installation.
6d24709: all three jobs passed; 48/48 Node cases passed, including the new source-mapping regression, with no skips.Earlier installed-reference diagnostics with
gpt-5.6-lunaandclaude-sonnet-5.5each achieved 12/12 exact-path reference reads, without retries or recovery tools, and retained final source hashes and native session histories. Those reference files and reader dependencies are unchanged in this iteration.The bundled runtime reports
0.0.0in session-start events. The diagnostic retains that value rather than treating it as a confirmed released CLI version. Existing Vallyenvironment-alias deprecation and default-scoring warnings remain.Checklist