Skip to content

Add golden end-to-end test generation scenarios - #997

Open
Evangelink wants to merge 7 commits into
mainfrom
dev/amauryleve/golden-test-scenarios
Open

Add golden end-to-end test generation scenarios#997
Evangelink wants to merge 7 commits into
mainfrom
dev/amauryleve/golden-test-scenarios

Conversation

@Evangelink

@Evangelink Evangelink commented Aug 7, 2026

Copy link
Copy Markdown
Member

Why

The test plugin needs stable end-to-end scenarios for three workflows: creating and wiring the first .NET test project, empirically finding and closing gaps in an existing suite, and safely testing public static APIs that depend on ambient state.

What changed

  • Add public scaffold-dotnet-test-project for central packages, bounded project references, .sln/.slnf/.slnx registration, no-op reuse, and missing CI wiring.
  • Extend test-gap-analysis so it can add focused tests only for empirically survived mutations. Its implementation scenario replays concrete mutations after generation.
  • Add public testability-obstacle for nested, async-safe ambient overrides across time, filesystem, environment, and identity, plus built-in fake-time delays and a Python dormancy guard.
  • Extend the testability migration agent through deterministic test generation when requested.
  • Incorporate review fixes for SDK-style solution GUIDs, decimal literals, and unambiguous regex graders.

Evaluation history and response

Early consumer-oriented revisions mostly tied and then regressed code-testing-agent; they also pulled stable sibling skills into evaluation. Those changes were removed. code-testing-agent, its generator, generate-testability-wrappers, and migrate-static-to-wrapper remain byte-for-byte identical to main.

Specialized runs then established repeatable signal:

  • Run 31178542305: gap analysis 3W/4T/0L; testability 3W/9T/0L.
  • Same-commit runs 31185716948 and 31188608506 showed substantial judge variance, but also stable decisions.
  • Run 31185716948: testability passed 9W/7T/0L; scaffold was one p-value step short at 8W/4T/2L.
  • Run 31188608506: gap analysis passed 9W/4T/1L; testability was one win short at 6W/9T/1L.

This revision removes only stable negative/inert signal and adds independent proven-family evidence:

  • Remove project-oriented/no-solution scaffolding, which lost 4/4 because both arms succeeded and judges rewarded extra unrequested tests.
  • Add SDK .slnx project registration, complementing the repeatedly winning .sln/.slnf CI-wiring scenarios.
  • Add a retry-policy guard/exception mutation scenario to the diverse gap-analysis eval.
  • Remove machine identity (net-neutral with the only testability loss) and coupon randomness (4/4 ties). Historical records without them would pass in both same-commit runs.

Validation

  • skill-validator check --plugin ./plugins/dotnet-test
  • python eng/eval-quality/check_eval_quality.py
  • Built the new .slnx and retry-policy fixtures
  • Built all retained .NET fixtures and ran populated xUnit suites

Add reusable scaffolding and testability skills plus eval fixtures for zero-to-one, partial-suite gap, and ambient-dependency workflows.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

Copilot-Session: d71b84f3-c114-48c5-9da0-59dd981916c7
Use the SDK-style project type GUID in the solution fixture and keep the discount lower bound explicitly decimal.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

Copilot-Session: d71b84f3-c114-48c5-9da0-59dd981916c7
Copilot AI review requested due to automatic review settings August 7, 2026 09:03
@Evangelink

Copy link
Copy Markdown
Member Author

/evaluate ca8f82d

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR adds “golden” end-to-end evaluation scenarios and fixtures for the dotnet-test plugin so test generation and testability workflows are exercised against realistic starting states (zero-to-one scaffolding, partial suites, and ambient time/filesystem dependencies), and extends skill/agent guidance to route those scenarios through the intended helpers.

Changes:

  • Introduces a new testability-obstacle skill plus corresponding eval/fixtures covering time + filesystem seams, existing seams, and static-API clock overrides.
  • Adds new C# fixture solutions and expands code-testing-agent eval coverage for zero-to-one scaffolding and gap-filling in an existing suite.
  • Updates agent/skill docs and plugin README to reflect the new orchestration behavior and helper skills.
Show a summary per file
File Description
tests/dotnet-test/testability-obstacle/fixtures/static-receipt-namer/tests/ReceiptNamer.Tests.csproj New MTP/xUnit v3 test project fixture for static clock-seam scenario.
tests/dotnet-test/testability-obstacle/fixtures/static-receipt-namer/src/ReceiptNamer.csproj New production project fixture for static receipt naming utility.
tests/dotnet-test/testability-obstacle/fixtures/static-receipt-namer/src/ReceiptNamer.cs Static API using UTC time to force a scoped, async-safe clock seam.
tests/dotnet-test/testability-obstacle/fixtures/python-report-writer/report_writer.py Non-.NET fixture used as a dormancy/off-target routing guard.
tests/dotnet-test/testability-obstacle/fixtures/expiration-policy/tests/ExpirationPolicy.Tests.csproj New test project fixture for TimeProvider migration boundary testing.
tests/dotnet-test/testability-obstacle/fixtures/expiration-policy/src/ExpirationPolicy.csproj New production project fixture for expiration policy.
tests/dotnet-test/testability-obstacle/fixtures/expiration-policy/src/ExpirationPolicy.cs Production code using DateTime.UtcNow to motivate a TimeProvider seam.
tests/dotnet-test/testability-obstacle/fixtures/config-loader/tests/ConfigLoader.Tests.csproj New test project fixture for filesystem seam request.
tests/dotnet-test/testability-obstacle/fixtures/config-loader/src/ConfigLoader.csproj New production project fixture for config loader.
tests/dotnet-test/testability-obstacle/fixtures/config-loader/src/ConfigLoader.cs Production code using File.* to motivate a minimal filesystem seam.
tests/dotnet-test/testability-obstacle/fixtures/archive-writer/tests/ArchiveWriter.Tests.csproj New test project fixture for combined time+filesystem deterministic testing.
tests/dotnet-test/testability-obstacle/fixtures/archive-writer/src/ArchiveWriter.csproj New production project fixture for archive writer.
tests/dotnet-test/testability-obstacle/fixtures/archive-writer/src/ArchiveWriter.cs Production code combining UTC timestamp + filesystem write.
tests/dotnet-test/testability-obstacle/fixtures/already-seamed/tests/SnapshotExporter.Tests.csproj New test project fixture verifying reuse of existing seams.
tests/dotnet-test/testability-obstacle/fixtures/already-seamed/src/SnapshotExporter.csproj New production project fixture for already-seamed exporter.
tests/dotnet-test/testability-obstacle/fixtures/already-seamed/src/SnapshotExporter.cs Production code already taking TimeProvider + storage seam.
tests/dotnet-test/testability-obstacle/eval.yaml New eval spec for the testability-obstacle skill across multiple seam types.
tests/dotnet-test/code-testing-agent/fixtures/csharp-zero-to-one-scaffolding/src/Commerce.Pricing/PriceCalculator.cs New production behavior used to validate zero-to-one scaffolding + useful tests.
tests/dotnet-test/code-testing-agent/fixtures/csharp-zero-to-one-scaffolding/src/Commerce.Pricing/Commerce.Pricing.csproj New pricing project fixture referenced by generated tests.
tests/dotnet-test/code-testing-agent/fixtures/csharp-zero-to-one-scaffolding/src/Commerce.Domain/Money.cs New domain value type used by pricing behavior.
tests/dotnet-test/code-testing-agent/fixtures/csharp-zero-to-one-scaffolding/src/Commerce.Domain/Commerce.Domain.csproj New domain project fixture in the solution.
tests/dotnet-test/code-testing-agent/fixtures/csharp-zero-to-one-scaffolding/README.md Fixture README encoding scaffolding conventions (tests dir, CPM, xUnit v3).
tests/dotnet-test/code-testing-agent/fixtures/csharp-zero-to-one-scaffolding/Directory.Packages.props Central package management for the fixture (xUnit v3 version).
tests/dotnet-test/code-testing-agent/fixtures/csharp-zero-to-one-scaffolding/Directory.Build.props Shared fixture build defaults (net10.0, nullable, implicit usings).
tests/dotnet-test/code-testing-agent/fixtures/csharp-zero-to-one-scaffolding/Commerce.sln New solution used to validate dotnet test discovery at solution level.
tests/dotnet-test/code-testing-agent/fixtures/csharp-partial-discount-suite/tests/DiscountRulesTests.cs Baseline partial suite used to validate gap discovery without duplication.
tests/dotnet-test/code-testing-agent/fixtures/csharp-partial-discount-suite/tests/DiscountRules.Tests.csproj New test project fixture for partial-suite gap discovery scenario.
tests/dotnet-test/code-testing-agent/fixtures/csharp-partial-discount-suite/src/DiscountRules.csproj New production project fixture for discount rules.
tests/dotnet-test/code-testing-agent/fixtures/csharp-partial-discount-suite/src/DiscountRules.cs Production logic with edge cases intended to be discovered by the agent.
tests/dotnet-test/code-testing-agent/eval.yaml Adds new scenarios and adjusts runs to keep the eval verdict reachable.
tests/dotnet-test/agent.testability-migration/eval.yaml Updates eval shape to defaults: and refines prompts toward bounded planning/implementation intent.
plugins/dotnet-test/skills/testability-obstacle/SKILL.md New public skill guidance for minimal seams + deterministic tests.
plugins/dotnet-test/skills/scaffold-dotnet-test-project/SKILL.md New internal helper skill for zero-to-one .NET test-project scaffolding.
plugins/dotnet-test/skills/code-testing-agent/SKILL.md Updates code-testing workflow to invoke scaffolding/gap-analysis/testability-obstacle as prerequisites.
plugins/dotnet-test/README.md Documents new skill and internal helper; updates entry-point agent description.
plugins/dotnet-test/agents/testability-migration.agent.md Extends orchestration pipeline to include deterministic test writing when requested.
plugins/dotnet-test/agents/code-testing-generator.agent.md Adds explicit prerequisites for .NET scaffolding and testability-obstacle routing.

Copilot's findings

Tip

Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Suppressed comments (2)

tests/dotnet-test/testability-obstacle/eval.yaml:32

  • This grep alternation is double-escaped (\\|) inside single quotes, so it won't behave as an OR. That makes the grader much weaker (and it can pass even if tests don't introduce any fake/in-memory implementation naming signal). Use a single \| for alternation.
          command: sh -c "grep -R 'TimeProvider' fixtures/archive-writer/tests --include='*.cs' | grep -q . && grep -R 'Fake\\|Stub\\|InMemory\\|Recording' fixtures/archive-writer/tests --include='*.cs' | grep -q ."

tests/dotnet-test/testability-obstacle/eval.yaml:89

  • Both grep alternations are double-escaped (\\|) inside single quotes, so the negative checks won't reliably detect File.ReadAllText/File.Exists or IServiceCollection/ServiceCollection. This can let the scenario pass even when the production code still uses System.IO directly or a DI container was added. Use a single \| for alternation.
          command: sh -c "! grep -q 'File.ReadAllText\\|File.Exists' fixtures/config-loader/src/ConfigLoader.cs && ! grep -R 'IServiceCollection\\|ServiceCollection' fixtures/config-loader --include='*.cs'"
  • Files reviewed: 37/37 changed files
  • Comments generated: 1

Comment thread tests/dotnet-test/testability-obstacle/eval.yaml Outdated
@github-actions

github-actions Bot commented Aug 7, 2026

Copy link
Copy Markdown
Contributor

📊 Skill Evaluation Results

2 skill(s) evaluated — ✅ 0 improved, ❌ 2 no credible change, 🔻 0 regressed.

A skill passes only on a credible net win over baseline: more wins than losses, by an exact one-sided sign test at p ≤ 0.05.

Skill Result Net win p Δ Pref W/T/L Quality Baseline Overfit Skills Loaded
code-testing-agent +42.9% 0.125 +25.7% 3/4/0 4.0/5 3.8/5 🟡 0.20 ⚠️ 1/6 · 1/6 (plugin)
testability-obstacle -16.7% 0.500 -6.7% 0/5/1 3.6/5 3.6/5 ✅ 0.13 ⚠️ 3/5 · 1/5 (plugin)
ℹ️ Column legend
  • Net win(wins − losses) / trials for skilled vs baseline, judged head-to-head by vally compare. This is the effect the gate decides on.
  • p — one-sided exact sign test over the discordant (non-tie) trials. A skill passes only at p ≤ 0.05, which needs at least 5 winning trials.
  • Δ Pref — the same comparison weighted by how decisive each win was (much-better ±100%, slightly-better ±40%). Reported for triage only: weighting the statistic by magnitude made a skill fail for winning harder, which is why the gate deliberately ignores this column.
  • W/T/L — wins / ties / losses across trials.
  • ⚠️ — the gate withheld a verdict. Either the eval has fewer trials than any result needs to reach p ≤ 0.05 (underpowered — the skill was never actually measured, so this is not a regression; add scenarios or raise defaults.runs), or the comparison didn't complete.
  • 🔻 — a credible regression: the losses themselves clear the same bar the gate uses for wins.
  • Quality / Baseline — mean absolute judge score 0–5 (skilled isolated vs skill-free control).
  • Overfit — overfitting-judge severity (✅ Low, 🟡 Moderate, 🔴 High, — none) with its score.
  • Skills Loaded — of the scenarios that expect activation, how many actually activated / that total (plugin run shown when present); ⚠️ marks a scenario that expected activation but didn't activate.
❌ code-testing-agent — details

Reason: Net win +42.9% (3W/4T/0L over 7 trial(s), sign test p=0.125), mean preference +25.7% — not credible — 4 of 7 trial(s) tied, leaving only 3 discordant trial(s). The sign test conditions on non-tie trials 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 trials to clear the ties (more scenarios or defaults.runs)

Scenario Net win Δ Pref Trials (W/T/L)
▲ Create and wire the first test project for a Csharp solution +100.0% +40.0% 1/0/0
▲ Diagnose failing tests without generating a new suite +100.0% +100.0% 1/0/0
= Discover and close edge gaps in a partial suite +0.0% +0.0% 0/1/0
= Does not revert a gutted-looking workspace (workspace integrity) +0.0% +0.0% 0/1/0
= Extend an existing suite to the untested method only +0.0% +0.0% 0/1/0
▲ Generate Vitest tests for the shopping-cart library (TypeScript polyglot) +100.0% +40.0% 1/0/0
= Keep a single-function request proportional +0.0% +0.0% 0/1/0
❌ testability-obstacle — details

Reason: Net win -16.7% (0W/5T/1L over 6 trial(s), sign test p=0.500), mean preference -6.7% — no improvement

Scenario Net win Δ Pref Trials (W/T/L)
= Add only the filesystem seam requested +0.0% +0.0% 0/1/0
= Keep a static API while making its clock override parallel-safe +0.0% +0.0% 0/1/0
= Leave a non-dotnet testability request to its language workflow +0.0% +0.0% 0/1/0
= Make time and filesystem behavior deterministic end to end +0.0% +0.0% 0/1/0
= Preserve UTC DateTime semantics when replacing the clock +0.0% +0.0% 0/1/0
▼ Reuse a seam that already exists -100.0% -40.0% 0/0/1

🔍 Full Results - additional metrics and failure investigation steps

To investigate failures, paste this to your AI coding agent:

For PR 997 in dotnet/skills, download eval artifacts with gh run download 31164332476 --repo dotnet/skills --pattern "vally-results-*" --dir ./eval-results, then fetch https://raw.githubusercontent.com/dotnet/skills/ca8f82d8e7ee6bc62341350545b4804a155dfd92/eng/vally-adapter/InvestigatingResults.md and follow it to analyze the results.json files. Diagnose each failure, suggest fixes to the eval.yaml and skill content, and tell me what to fix first.

▶ Sessions Visualisation -- interactive replay of all evaluation sessions
📊 Session Analytics (preview) -- aggregated metrics across evaluation sessions

@github-actions github-actions Bot added the waiting-on-author PR state label label Aug 7, 2026
@github-actions

github-actions Bot commented Aug 7, 2026

Copy link
Copy Markdown
Contributor

👋 @Evangelink — this PR has 1 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 no-stale label to silence further pings.)

Use extended regular expressions so forbidden-call and fake-name graders reliably match each alternative without YAML escape ambiguity.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

Copilot-Session: d71b84f3-c114-48c5-9da0-59dd981916c7
Copilot AI review requested due to automatic review settings August 7, 2026 09:54
@Evangelink

Copy link
Copy Markdown
Member Author

/evaluate b3e6b17

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot's findings

Suppressed comments (1)

tests/dotnet-test/code-testing-agent/eval.yaml:15

  • The stimulus name uses "Csharp" rather than the conventional "C#" (or "CSharp"), which makes the scenario title look like a typo in reports/logs. Consider updating it for clarity and consistency with other .NET references in this repo.
  - name: Create and wire the first test project for a Csharp solution
  • Files reviewed: 37/37 changed files
  • Comments generated: 0 new

@github-actions

github-actions Bot commented Aug 7, 2026

Copy link
Copy Markdown
Contributor

📊 Skill Evaluation Results

2 skill(s) evaluated — ✅ 0 improved, ❌ 2 no credible change, 🔻 0 regressed.

A skill passes only on a credible net win over baseline: more wins than losses, by an exact one-sided sign test at p ≤ 0.05.

Skill Result Net win p Δ Pref W/T/L Quality Baseline Overfit Skills Loaded
code-testing-agent +14.3% 0.500 +5.7% 1/6/0 4.2/5 4.0/5 ✅ 0.19 ⚠️ 2/6 · 1/6 (plugin)
testability-obstacle +16.7% 0.500 +6.7% 1/5/0 3.7/5 3.7/5 ✅ 0.19 ⚠️ 4/5 · 0/5 (plugin)
ℹ️ Column legend
  • Net win(wins − losses) / trials for skilled vs baseline, judged head-to-head by vally compare. This is the effect the gate decides on.
  • p — one-sided exact sign test over the discordant (non-tie) trials. A skill passes only at p ≤ 0.05, which needs at least 5 winning trials.
  • Δ Pref — the same comparison weighted by how decisive each win was (much-better ±100%, slightly-better ±40%). Reported for triage only: weighting the statistic by magnitude made a skill fail for winning harder, which is why the gate deliberately ignores this column.
  • W/T/L — wins / ties / losses across trials.
  • ⚠️ — the gate withheld a verdict. Either the eval has fewer trials than any result needs to reach p ≤ 0.05 (underpowered — the skill was never actually measured, so this is not a regression; add scenarios or raise defaults.runs), or the comparison didn't complete.
  • 🔻 — a credible regression: the losses themselves clear the same bar the gate uses for wins.
  • Quality / Baseline — mean absolute judge score 0–5 (skilled isolated vs skill-free control).
  • Overfit — overfitting-judge severity (✅ Low, 🟡 Moderate, 🔴 High, — none) with its score.
  • Skills Loaded — of the scenarios that expect activation, how many actually activated / that total (plugin run shown when present); ⚠️ marks a scenario that expected activation but didn't activate.
❌ code-testing-agent — details

Reason: Net win +14.3% (1W/6T/0L over 7 trial(s), sign test p=0.500), mean preference +5.7% — not credible — 6 of 7 trial(s) tied, leaving only 1 discordant trial(s). The sign test conditions on non-tie trials 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 trials to clear the ties (more scenarios or defaults.runs)

Scenario Net win Δ Pref Trials (W/T/L)
= Create and wire the first test project for a Csharp solution +0.0% +0.0% 0/1/0
= Diagnose failing tests without generating a new suite +0.0% +0.0% 0/1/0
= Discover and close edge gaps in a partial suite +0.0% +0.0% 0/1/0
= Does not revert a gutted-looking workspace (workspace integrity) +0.0% +0.0% 0/1/0
= Extend an existing suite to the untested method only +0.0% +0.0% 0/1/0
= Generate Vitest tests for the shopping-cart library (TypeScript polyglot) +0.0% +0.0% 0/1/0
▲ Keep a single-function request proportional +100.0% +40.0% 1/0/0
❌ testability-obstacle — details

Reason: Net win +16.7% (1W/5T/0L over 6 trial(s), sign test p=0.500), mean preference +6.7% — not credible — 5 of 6 trial(s) tied, leaving only 1 discordant trial(s). The sign test conditions on non-tie trials 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 trials to clear the ties (more scenarios or defaults.runs)

Scenario Net win Δ Pref Trials (W/T/L)
= Add only the filesystem seam requested +0.0% +0.0% 0/1/0
= Keep a static API while making its clock override parallel-safe +0.0% +0.0% 0/1/0
= Leave a non-dotnet testability request to its language workflow +0.0% +0.0% 0/1/0
= Make time and filesystem behavior deterministic end to end +0.0% +0.0% 0/1/0
= Preserve UTC DateTime semantics when replacing the clock +0.0% +0.0% 0/1/0
▲ Reuse a seam that already exists +100.0% +40.0% 1/0/0

🔍 Full Results - additional metrics and failure investigation steps

To investigate failures, paste this to your AI coding agent:

For PR 997 in dotnet/skills, download eval artifacts with gh run download 31167899496 --repo dotnet/skills --pattern "vally-results-*" --dir ./eval-results, then fetch https://raw.githubusercontent.com/dotnet/skills/b3e6b175775921a704f5becce9ff51ebe30e8c1a/eng/vally-adapter/InvestigatingResults.md and follow it to analyze the results.json files. Diagnose each failure, suggest fixes to the eval.yaml and skill content, and tell me what to fix first.

▶ Sessions Visualisation -- interactive replay of all evaluation sessions
📊 Session Analytics (preview) -- aggregated metrics across evaluation sessions

@github-actions github-actions Bot added waiting-on-review PR state label and removed waiting-on-author PR state label labels Aug 7, 2026
@github-actions

github-actions Bot commented Aug 7, 2026

Copy link
Copy Markdown
Contributor

✅ Evaluation passed for b3e6b17. cc @dotnet/dotnet-testing — please review.

Bundle isolated-run guidance, sharpen plugin routing, and add solution-filter, nested-scope, and fake-time delay decisions. Repeat the expensive end-to-end scenarios twice to clear the observed tie rate.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

Copilot-Session: d71b84f3-c114-48c5-9da0-59dd981916c7
Copilot AI review requested due to automatic review settings August 7, 2026 10:42
@Evangelink

Copy link
Copy Markdown
Member Author

/evaluate 32f01da

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot's findings

Suppressed comments (1)

tests/dotnet-test/code-testing-agent/eval.yaml:15

  • Scenario name uses "Csharp" which reads like a typo/inconsistent casing for C#; this shows up in logs/reports and is easy to misread. Consider spelling it as "C#" (or "CSharp") for clarity.
  - name: Create and wire the first test project for a Csharp solution
  • Files reviewed: 45/45 changed files
  • Comments generated: 0 new

@github-actions github-actions Bot added pr-state/ready-for-eval PR is mergeable and awaiting evaluation and removed waiting-on-review PR state label labels Aug 7, 2026
@github-actions

github-actions Bot commented Aug 7, 2026

Copy link
Copy Markdown
Contributor

📊 Skill Evaluation Results

4 skill(s) evaluated — ✅ 0 improved, ❌ 4 no credible change, 🔻 0 regressed.

A skill passes only on a credible net win over baseline: more wins than losses, by an exact one-sided sign test at p ≤ 0.05.

Skill Result Net win p Δ Pref W/T/L Quality Baseline Overfit Skills Loaded
code-testing-agent -18.8% 0.188 -7.5% 1/11/4 4.0/5 4.1/5 ✅ 0.16 ⚠️ 1/7 · 1/7 (plugin)
generate-testability-wrappers +26.7% 0.194 +10.7% 8/3/4 3.5/5 2.7/5 ✅ 0.15 4/4 · 4/4 (plugin)
migrate-static-to-wrapper +16.7% 0.500 -3.3% 3/1/2 4.7/5 4.2/5 ✅ 0.09 ⚠️ 3/6 · 3/6 (plugin)
testability-obstacle +14.3% 0.312 +5.7% 3/10/1 4.5/5 4.1/5 🟡 0.32 ⚠️ 4/6 · 3/6 (plugin)
ℹ️ Column legend
  • Net win(wins − losses) / trials for skilled vs baseline, judged head-to-head by vally compare. This is the effect the gate decides on.
  • p — one-sided exact sign test over the discordant (non-tie) trials. A skill passes only at p ≤ 0.05, which needs at least 5 winning trials.
  • Δ Pref — the same comparison weighted by how decisive each win was (much-better ±100%, slightly-better ±40%). Reported for triage only: weighting the statistic by magnitude made a skill fail for winning harder, which is why the gate deliberately ignores this column.
  • W/T/L — wins / ties / losses across trials.
  • ⚠️ — the gate withheld a verdict. Either the eval has fewer trials than any result needs to reach p ≤ 0.05 (underpowered — the skill was never actually measured, so this is not a regression; add scenarios or raise defaults.runs), or the comparison didn't complete.
  • 🔻 — a credible regression: the losses themselves clear the same bar the gate uses for wins.
  • Quality / Baseline — mean absolute judge score 0–5 (skilled isolated vs skill-free control).
  • Overfit — overfitting-judge severity (✅ Low, 🟡 Moderate, 🔴 High, — none) with its score.
  • Skills Loaded — of the scenarios that expect activation, how many actually activated / that total (plugin run shown when present); ⚠️ marks a scenario that expected activation but didn't activate.
❌ code-testing-agent — details

Reason: Net win -18.8% (1W/11T/4L over 16 trial(s), sign test p=0.188), mean preference -7.5% — no improvement

Scenario Net win Δ Pref Trials (W/T/L)
= Create and wire the first test project for a Csharp solution +0.0% +0.0% 0/2/0
= Diagnose failing tests without generating a new suite +0.0% +0.0% 0/2/0
▼ Discover and close edge gaps in a partial suite -100.0% -40.0% 0/0/2
▼ Does not revert a gutted-looking workspace (workspace integrity) -50.0% -20.0% 0/1/1
= Extend an existing suite to the untested method only +0.0% +0.0% 0/2/0
▲ Generate Vitest tests for the shopping-cart library (TypeScript polyglot) +50.0% +20.0% 1/1/0
= Keep a single-function request proportional +0.0% +0.0% 0/2/0
▼ Register the first tests in the solution filter used by CI -50.0% -20.0% 0/1/1
❌ generate-testability-wrappers — details

Reason: Net win +26.7% (8W/3T/4L over 15 trial(s), sign test p=0.194), mean preference +10.7% — not credible (sign test p=0.194 > 0.05)

Scenario Net win Δ Pref Trials (W/T/L)
▲ Decline wrapper generation for already-abstracted code +100.0% +60.0% 3/0/0
▼ Generate TimeProvider adoption for DateTime.UtcNow -66.7% -46.7% 0/1/2
▲ Generate custom Environment wrapper +66.7% +26.7% 2/1/0
= Make time controllable in a library that has no DI container +0.0% +0.0% 1/1/1
▲ Recommend System.IO.Abstractions for file system calls +33.3% +13.3% 2/0/1
❌ migrate-static-to-wrapper — details

Reason: Net win +16.7% (3W/1T/2L over 6 trial(s), sign test p=0.500), mean preference -3.3% — not credible (sign test p=0.500 > 0.05)

Scenario Net win Δ Pref Trials (W/T/L)
= Add the required using directive and update tests with a test double +0.0% +0.0% 0/1/0
▲ Decline migration when wrapper does not exist yet +100.0% +40.0% 1/0/0
▲ Migrate DateTime.UtcNow to TimeProvider in a service class +100.0% +40.0% 1/0/0
▼ Migrate a static helper class without breaking its callers -100.0% -100.0% 0/0/1
▲ Migrate only in scoped files, leaving others untouched +100.0% +40.0% 1/0/0
▼ Preserve DateTimeKind when migrating to TimeProvider -100.0% -40.0% 0/0/1
❌ testability-obstacle — details

Reason: Net win +14.3% (3W/10T/1L over 14 trial(s), sign test p=0.312), mean preference +5.7% — not credible — 10 of 14 trial(s) tied, leaving only 4 discordant trial(s). The sign test conditions on non-tie trials 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 trials to clear the ties (more scenarios or defaults.runs)

Scenario Net win Δ Pref Trials (W/T/L)
= Add only the filesystem seam requested +0.0% +0.0% 0/2/0
▲ Keep a static API while making its clock override parallel-safe +100.0% +40.0% 2/0/0
▲ Leave a non-dotnet testability request to its language workflow +50.0% +20.0% 1/1/0
= Make delayed renewal testable without an IDelay wrapper +0.0% +0.0% 0/2/0
= Make time and filesystem behavior deterministic end to end +0.0% +0.0% 0/2/0
= Preserve UTC DateTime semantics when replacing the clock +0.0% +0.0% 0/2/0
▼ Reuse a seam that already exists -50.0% -20.0% 0/1/1

🔍 Full Results - additional metrics and failure investigation steps

To investigate failures, paste this to your AI coding agent:

For PR 997 in dotnet/skills, download eval artifacts with gh run download 31171174783 --repo dotnet/skills --pattern "vally-results-*" --dir ./eval-results, then fetch https://raw.githubusercontent.com/dotnet/skills/32f01dad0baef8de7f8e30b4e50319b1a0b81e2b/eng/vally-adapter/InvestigatingResults.md and follow it to analyze the results.json files. Diagnose each failure, suggest fixes to the eval.yaml and skill content, and tell me what to fix first.

▶ Sessions Visualisation -- interactive replay of all evaluation sessions
📊 Session Analytics (preview) -- aggregated metrics across evaluation sessions

Restore code-testing and migration skills to main, promote zero-to-one scaffolding to its own skill, extend verified gap analysis through focused test additions, and concentrate testability evaluation on nested ambient-scope behavior.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

Copilot-Session: d71b84f3-c114-48c5-9da0-59dd981916c7
Copilot AI review requested due to automatic review settings August 7, 2026 12:29
@github-actions

github-actions Bot commented Aug 7, 2026

Copy link
Copy Markdown
Contributor

Skill Coverage Report

Plugin Skill Covered Coverage
dotnet-test assertion-quality 22/22 100%
dotnet-test code-testing-agent 4/4 100%
dotnet-test crap-score 6/6 100%
dotnet-test detect-static-dependencies 22/22 100%
dotnet-test filter-syntax 1/1 100%
dotnet-test generate-testability-wrappers 24/24 100%
dotnet-test grade-tests 29/29 100%
dotnet-test migrate-static-to-wrapper 26/26 100%
dotnet-test mtp-hot-reload 16/16 100%
dotnet-test run-tests 16/16 100%
dotnet-test scaffold-dotnet-test-project 18/21 85.7%
dotnet-test test-anti-patterns 25/25 100%
dotnet-test test-gap-analysis 31/31 100%
dotnet-test test-smell-detection 26/26 100%
dotnet-test test-tagging 28/28 100%
⚠️ dotnet-test testability-obstacle 14/21 66.7%
dotnet-test writing-mstest-tests 45/45 100%
Uncovered: dotnet-test/scaffold-dotnet-test-project
  • [Validation] Framework, runner, target framework, and package style match the repository. (line 164)
  • [Validation] Template sample tests were removed. (line 167)
  • [Pitfall] Picking a favorite framework (line 177)
Uncovered: dotnet-test/testability-obstacle
  • [Validation] The original obstacle was concrete and in the requested path. (line 175)
  • [Validation] An existing seam was reused when available. (line 176)
  • [Validation] The new abstraction exposes only members required by the target behavior. (line 177)
  • [Validation] Time conversions preserve local/UTC and DateTime.Kind semantics. (line 179)
  • [Pitfall] Wrapping an entire static API (line 189)
  • [Pitfall] Converting UtcNow with .DateTime (line 190)
  • [Pitfall] Adding DI to a library with no container (line 192)

@Evangelink
Evangelink temporarily deployed to copilot-pat-pool August 7, 2026 13:43 — with GitHub Actions Inactive
@github-actions

github-actions Bot commented Aug 7, 2026

Copy link
Copy Markdown
Contributor

⏳ Commit b62f6f0 is already being evaluated — follow it here: https://github.com/dotnet/skills/actions/runs/31183988399. Not starting a duplicate run.

@github-actions github-actions Bot added waiting-on-review PR state label and removed pr-state/ready-for-eval PR is mergeable and awaiting evaluation labels Aug 7, 2026
Fix xUnit v3 discovery and no-op scaffolding, constrain smoke-test scope, double the clean gap-analysis evidence, and add two deterministic static-identity scenarios matching the strongest testability delta.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

Copilot-Session: d71b84f3-c114-48c5-9da0-59dd981916c7
Copilot AI review requested due to automatic review settings August 7, 2026 14:03
@Evangelink

Copy link
Copy Markdown
Member Author

/evaluate 3159000

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot's findings

Suppressed comments (6)

tests/dotnet-test/testability-obstacle/eval.yaml:63

  • This grader requires AsyncLocal to appear in LegacyConfig.cs specifically. If the implementation introduces a separate in-memory filesystem provider helper under src/ (while keeping LegacyConfig static), this check would fail even though the behavior is correct. Grep the src directory instead of the single file.
    tests/dotnet-test/testability-obstacle/eval.yaml:129
  • This check hard-codes CorrelationIds.cs as the only acceptable location for AsyncLocal. If the seam is factored into another file under src/, the grader will fail a correct solution. Consider grepping across fixtures/static-correlation-ids/src instead.
    tests/dotnet-test/testability-obstacle/eval.yaml:162
  • This grader forces both AsyncLocal and Random.Shared to appear in CouponCodes.cs. A correct implementation could keep CouponCodes static but place the AsyncLocal random provider into a helper file. Grepping across src keeps the intent while avoiding false negatives.
    tests/dotnet-test/testability-obstacle/eval.yaml:196
  • This grader requires AsyncLocal to be in MachineLabels.cs specifically, which can reject equivalent solutions that factor the ambient seam into a helper file. Grep across src for the seam markers, and use -q for the negative SetEnvironmentVariable check to avoid dumping output on failure.
    tests/dotnet-test/testability-obstacle/eval.yaml:96
  • Like the earlier scenarios, this assumes AsyncLocal must be implemented inside FeatureFlags.cs. A helper-file based seam would be rejected even if the public static API stays intact. Grep recursively under src to make the grader accept equivalent implementations.
    tests/dotnet-test/testability-obstacle/eval.yaml:30
  • These graders assume the seam’s AsyncLocal (and even the static class declaration) must live in a specific source file. A valid implementation could keep the public static API but move the AsyncLocal-backed provider into a separate internal helper file, which would incorrectly fail this check. Consider grepping across the whole src directory instead of a single .cs file.

This issue also appears in the following locations of the same file:

  • line 63
  • line 96
  • line 129
  • line 162
  • line 196
  • Files reviewed: 59/59 changed files
  • Comments generated: 0 new

@github-actions github-actions Bot added pr-state/ready-for-eval PR is mergeable and awaiting evaluation and removed waiting-on-review PR state label labels Aug 7, 2026
@github-actions

github-actions Bot commented Aug 7, 2026

Copy link
Copy Markdown
Contributor

📊 Skill Evaluation Results

4 skill(s) evaluated — ✅ 0 improved, ❌ 4 no credible change, 🔻 0 regressed.

A skill passes only on a credible net win over baseline: more wins than losses, by an exact one-sided sign test at p ≤ 0.05.

Skill Result Net win p Δ Pref W/T/L Quality Baseline Overfit Skills Loaded
code-testing-agent -6.3% 0.500 -2.5% 2/11/3 3.9/5 4.0/5 ✅ 0.17 ⚠️ 1/7 · 1/7 (plugin)
generate-testability-wrappers +20.0% 0.274 +20.0% 7/4/4 3.8/5 2.8/5 ✅ 0.16 4/4 · 4/4 (plugin)
migrate-static-to-wrapper +16.7% 0.500 +16.7% 2/3/1 4.8/5 4.1/5 ✅ 0.09 ⚠️ 3/6 · 3/6 (plugin)
testability-obstacle +7.1% 0.500 +2.9% 1/13/0 4.4/5 4.2/5 🟡 0.32 ⚠️ 4/6 · 1/6 (plugin)
ℹ️ Column legend
  • Net win(wins − losses) / trials for skilled vs baseline, judged head-to-head by vally compare. This is the effect the gate decides on.
  • p — one-sided exact sign test over the discordant (non-tie) trials. A skill passes only at p ≤ 0.05, which needs at least 5 winning trials.
  • Δ Pref — the same comparison weighted by how decisive each win was (much-better ±100%, slightly-better ±40%). Reported for triage only: weighting the statistic by magnitude made a skill fail for winning harder, which is why the gate deliberately ignores this column.
  • W/T/L — wins / ties / losses across trials.
  • ⚠️ — the gate withheld a verdict. Either the eval has fewer trials than any result needs to reach p ≤ 0.05 (underpowered — the skill was never actually measured, so this is not a regression; add scenarios or raise defaults.runs), or the comparison didn't complete.
  • 🔻 — a credible regression: the losses themselves clear the same bar the gate uses for wins.
  • Quality / Baseline — mean absolute judge score 0–5 (skilled isolated vs skill-free control).
  • Overfit — overfitting-judge severity (✅ Low, 🟡 Moderate, 🔴 High, — none) with its score.
  • Skills Loaded — of the scenarios that expect activation, how many actually activated / that total (plugin run shown when present); ⚠️ marks a scenario that expected activation but didn't activate.
❌ code-testing-agent — details

Reason: Net win -6.3% (2W/11T/3L over 16 trial(s), sign test p=0.500), mean preference -2.5% — no improvement

Scenario Net win Δ Pref Trials (W/T/L)
▲ Create and wire the first test project for a Csharp solution +50.0% +20.0% 1/1/0
▼ Diagnose failing tests without generating a new suite -50.0% -20.0% 0/1/1
▼ Discover and close edge gaps in a partial suite -50.0% -20.0% 0/1/1
= Does not revert a gutted-looking workspace (workspace integrity) +0.0% +0.0% 0/2/0
= Extend an existing suite to the untested method only +0.0% +0.0% 0/2/0
▲ Generate Vitest tests for the shopping-cart library (TypeScript polyglot) +50.0% +20.0% 1/1/0
= Keep a single-function request proportional +0.0% +0.0% 0/2/0
▼ Register the first tests in the solution filter used by CI -50.0% -20.0% 0/1/1
❌ generate-testability-wrappers — details

Reason: Net win +20.0% (7W/4T/4L over 15 trial(s), sign test p=0.274), mean preference +20.0% — not credible (sign test p=0.274 > 0.05)

Scenario Net win Δ Pref Trials (W/T/L)
▲ Decline wrapper generation for already-abstracted code +66.7% +66.7% 2/1/0
▼ Generate TimeProvider adoption for DateTime.UtcNow -66.7% -26.7% 0/1/2
▲ Generate custom Environment wrapper +100.0% +40.0% 3/0/0
▲ Make time controllable in a library that has no DI container +33.3% +13.3% 1/2/0
▼ Recommend System.IO.Abstractions for file system calls -33.3% +6.7% 1/0/2
❌ migrate-static-to-wrapper — details

Reason: Net win +16.7% (2W/3T/1L over 6 trial(s), sign test p=0.500), mean preference +16.7% — not credible — 3 of 6 trial(s) tied, leaving only 3 discordant trial(s). The sign test conditions on non-tie trials 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 trials to clear the ties (more scenarios or defaults.runs)

Scenario Net win Δ Pref Trials (W/T/L)
= Add the required using directive and update tests with a test double +0.0% +0.0% 0/1/0
▲ Decline migration when wrapper does not exist yet +100.0% +100.0% 1/0/0
▲ Migrate DateTime.UtcNow to TimeProvider in a service class +100.0% +40.0% 1/0/0
= Migrate a static helper class without breaking its callers +0.0% +0.0% 0/1/0
= Migrate only in scoped files, leaving others untouched +0.0% +0.0% 0/1/0
▼ Preserve DateTimeKind when migrating to TimeProvider -100.0% -40.0% 0/0/1
❌ testability-obstacle — details

Reason: Net win +7.1% (1W/13T/0L over 14 trial(s), sign test p=0.500), mean preference +2.9% — not credible — 13 of 14 trial(s) tied, leaving only 1 discordant trial(s). The sign test conditions on non-tie trials 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 trials to clear the ties (more scenarios or defaults.runs)

Scenario Net win Δ Pref Trials (W/T/L)
= Add only the filesystem seam requested +0.0% +0.0% 0/2/0
▲ Keep a static API while making its clock override parallel-safe +50.0% +20.0% 1/1/0
= Leave a non-dotnet testability request to its language workflow +0.0% +0.0% 0/2/0
= Make delayed renewal testable without an IDelay wrapper +0.0% +0.0% 0/2/0
= Make time and filesystem behavior deterministic end to end +0.0% +0.0% 0/2/0
= Preserve UTC DateTime semantics when replacing the clock +0.0% +0.0% 0/2/0
= Reuse a seam that already exists +0.0% +0.0% 0/2/0

🔍 Full Results - additional metrics and failure investigation steps

To investigate failures, paste this to your AI coding agent:

For PR 997 in dotnet/skills, download eval artifacts with gh run download 31183988399 --repo dotnet/skills --pattern "vally-results-*" --dir ./eval-results, then fetch https://raw.githubusercontent.com/dotnet/skills/32f01dad0baef8de7f8e30b4e50319b1a0b81e2b/eng/vally-adapter/InvestigatingResults.md and follow it to analyze the results.json files. Diagnose each failure, suggest fixes to the eval.yaml and skill content, and tell me what to fix first.

@github-actions

github-actions Bot commented Aug 7, 2026

Copy link
Copy Markdown
Contributor

📊 Skill Evaluation Results

3 skill(s) evaluated — ✅ 1 improved, ❌ 2 no credible change, 🔻 0 regressed.

A skill passes only on a credible net win over baseline: more wins than losses, by an exact one-sided sign test at p ≤ 0.05.

Skill Result Net win p Δ Pref W/T/L Quality Baseline Overfit Skills Loaded
scaffold-dotnet-test-project +42.9% 0.055 +17.1% 8/4/2 4.4/5 3.7/5 ✅ 0.09 ⚠️ 4/6 · 3/6 (plugin)
test-gap-analysis +28.6% 0.194 +2.9% 8/2/4 4.3/5 4.7/5 ✅ 0.11 ⚠️ 4/6 · 4/6 (plugin)
testability-obstacle +56.3% 0.002 +22.5% 9/7/0 5.0/5 3.9/5 ✅ 0.14 ⚠️ 6/7 · 3/7 (plugin)
ℹ️ Column legend
  • Net win(wins − losses) / trials for skilled vs baseline, judged head-to-head by vally compare. This is the effect the gate decides on.
  • p — one-sided exact sign test over the discordant (non-tie) trials. A skill passes only at p ≤ 0.05, which needs at least 5 winning trials.
  • Δ Pref — the same comparison weighted by how decisive each win was (much-better ±100%, slightly-better ±40%). Reported for triage only: weighting the statistic by magnitude made a skill fail for winning harder, which is why the gate deliberately ignores this column.
  • W/T/L — wins / ties / losses across trials.
  • ⚠️ — the gate withheld a verdict. Either the eval has fewer trials than any result needs to reach p ≤ 0.05 (underpowered — the skill was never actually measured, so this is not a regression; add scenarios or raise defaults.runs), or the comparison didn't complete.
  • 🔻 — a credible regression: the losses themselves clear the same bar the gate uses for wins.
  • Quality / Baseline — mean absolute judge score 0–5 (skilled isolated vs skill-free control).
  • Overfit — overfitting-judge severity (✅ Low, 🟡 Moderate, 🔴 High, — none) with its score.
  • Skills Loaded — of the scenarios that expect activation, how many actually activated / that total (plugin run shown when present); ⚠️ marks a scenario that expected activation but didn't activate.
❌ scaffold-dotnet-test-project — details

Reason: Net win +42.9% (8W/4T/2L over 14 trial(s), sign test p=0.055), mean preference +17.1% — not credible (sign test p=0.055 > 0.05)

Scenario Net win Δ Pref Trials (W/T/L)
= Add an existing test project to the CI solution filter +0.0% +0.0% 0/2/0
▲ Create the first pricing test project with central packages +100.0% +40.0% 2/0/0
▲ Include new tests in the solution filter used by CI +100.0% +40.0% 2/0/0
▲ Keep a domain-only request bounded +100.0% +40.0% 2/0/0
▼ Preserve a project-oriented repository with no solution -100.0% -40.0% 0/0/2
▲ Register an existing test project omitted from the solution +50.0% +20.0% 1/1/0
▲ Reuse an existing suitable test project +50.0% +20.0% 1/1/0
❌ test-gap-analysis — details

Reason: Net win +28.6% (8W/2T/4L over 14 trial(s), sign test p=0.194), mean preference +2.9% — not credible (sign test p=0.194 > 0.05)

Scenario Net win Δ Pref Trials (W/T/L)
= Acknowledge well-tested code with few surviving mutations +0.0% +0.0% 1/0/1
▲ Analyse error propagation gaps in a Rust crate +50.0% +20.0% 1/1/0
▼ Decline request to write new tests from scratch -100.0% -100.0% 0/0/2
▲ Find boundary mutation gaps in tiered discount and shipping logic +100.0% +40.0% 2/0/0
▲ Find logic and null-check mutation gaps in access control code +50.0% +20.0% 1/1/0
= Skip trivial and generated code while tracing private call chains +0.0% +0.0% 1/0/1
▲ Verify and close only the surviving gaps in a partial suite +100.0% +40.0% 2/0/0

Per-scenario details for 1 skill(s) were omitted to keep this comment under GitHub's 65,536-character limit — open the job's step summary or Full Results for the complete breakdown.

🔍 Full Results - additional metrics and failure investigation steps

To investigate failures, paste this to your AI coding agent:

For PR 997 in dotnet/skills, download eval artifacts with gh run download 31185716948 --repo dotnet/skills --pattern "vally-results-*" --dir ./eval-results, then fetch https://raw.githubusercontent.com/dotnet/skills/3159000c328fb59acb1d1a84cb2d9703cf927a14/eng/vally-adapter/InvestigatingResults.md and follow it to analyze the results.json files. Diagnose each failure, suggest fixes to the eval.yaml and skill content, and tell me what to fix first.

▶ Sessions Visualisation -- interactive replay of all evaluation sessions
📊 Session Analytics (preview) -- aggregated metrics across evaluation sessions

@github-actions

github-actions Bot commented Aug 7, 2026

Copy link
Copy Markdown
Contributor

📊 Skill Evaluation Results

3 skill(s) evaluated — ✅ 1 improved, ❌ 2 no credible change, 🔻 0 regressed.

A skill passes only on a credible net win over baseline: more wins than losses, by an exact one-sided sign test at p ≤ 0.05.

Skill Result Net win p Δ Pref W/T/L Quality Baseline Overfit Skills Loaded
scaffold-dotnet-test-project +14.3% 0.363 +5.7% 5/6/3 4.0/5 3.5/5 ✅ 0.09 ⚠️ 4/6 · 0/6 (plugin)
test-gap-analysis +57.1% 0.011 +22.9% 9/4/1 4.6/5 4.6/5 ✅ 0.10 ⚠️ 5/6 · 5/6 (plugin)
testability-obstacle +31.3% 0.063 +12.5% 6/9/1 4.9/5 4.3/5 ✅ 0.15 ⚠️ 6/7 · 5/7 (plugin)
ℹ️ Column legend
  • Net win(wins − losses) / trials for skilled vs baseline, judged head-to-head by vally compare. This is the effect the gate decides on.
  • p — one-sided exact sign test over the discordant (non-tie) trials. A skill passes only at p ≤ 0.05, which needs at least 5 winning trials.
  • Δ Pref — the same comparison weighted by how decisive each win was (much-better ±100%, slightly-better ±40%). Reported for triage only: weighting the statistic by magnitude made a skill fail for winning harder, which is why the gate deliberately ignores this column.
  • W/T/L — wins / ties / losses across trials.
  • ⚠️ — the gate withheld a verdict. Either the eval has fewer trials than any result needs to reach p ≤ 0.05 (underpowered — the skill was never actually measured, so this is not a regression; add scenarios or raise defaults.runs), or the comparison didn't complete.
  • 🔻 — a credible regression: the losses themselves clear the same bar the gate uses for wins.
  • Quality / Baseline — mean absolute judge score 0–5 (skilled isolated vs skill-free control).
  • Overfit — overfitting-judge severity (✅ Low, 🟡 Moderate, 🔴 High, — none) with its score.
  • Skills Loaded — of the scenarios that expect activation, how many actually activated / that total (plugin run shown when present); ⚠️ marks a scenario that expected activation but didn't activate.
❌ scaffold-dotnet-test-project — details

Reason: Net win +14.3% (5W/6T/3L over 14 trial(s), sign test p=0.363), mean preference +5.7% — not credible (sign test p=0.363 > 0.05)

Scenario Net win Δ Pref Trials (W/T/L)
= Add an existing test project to the CI solution filter +0.0% +0.0% 0/2/0
▲ Create the first pricing test project with central packages +50.0% +20.0% 1/1/0
▲ Include new tests in the solution filter used by CI +50.0% +20.0% 1/1/0
▲ Keep a domain-only request bounded +100.0% +40.0% 2/0/0
▼ Preserve a project-oriented repository with no solution -100.0% -40.0% 0/0/2
= Register an existing test project omitted from the solution +0.0% +0.0% 1/0/1
= Reuse an existing suitable test project +0.0% +0.0% 0/2/0
❌ testability-obstacle — details

Reason: Net win +31.3% (6W/9T/1L over 16 trial(s), sign test p=0.063), mean preference +12.5% — not credible (sign test p=0.063 > 0.05)

Scenario Net win Δ Pref Trials (W/T/L)
▲ Leave a Python seam request to its language workflow +50.0% +20.0% 1/1/0
= Make delayed renewal testable with built-in fake time +0.0% +0.0% 0/2/0
▲ Preserve a static clock API with nested and parallel scopes +50.0% +20.0% 1/1/0
▲ Preserve a static filesystem API with nested fake stores +100.0% +40.0% 2/0/0
= Restore environment overrides after exceptions and nesting +0.0% +0.0% 0/2/0
▲ Scope deterministic identity generation without breaking callers +100.0% +40.0% 2/0/0
▼ Scope machine identity without mutating the process environment -50.0% -20.0% 0/1/1
= Scope random coupon generation while preserving the static API +0.0% +0.0% 0/2/0

Per-scenario details for 1 skill(s) were omitted to keep this comment under GitHub's 65,536-character limit — open the job's step summary or Full Results for the complete breakdown.

🔍 Full Results - additional metrics and failure investigation steps

To investigate failures, paste this to your AI coding agent:

For PR 997 in dotnet/skills, download eval artifacts with gh run download 31188608506 --repo dotnet/skills --pattern "vally-results-*" --dir ./eval-results, then fetch https://raw.githubusercontent.com/dotnet/skills/3159000c328fb59acb1d1a84cb2d9703cf927a14/eng/vally-adapter/InvestigatingResults.md and follow it to analyze the results.json files. Diagnose each failure, suggest fixes to the eval.yaml and skill content, and tell me what to fix first.

▶ Sessions Visualisation -- interactive replay of all evaluation sessions
📊 Session Analytics (preview) -- aggregated metrics across evaluation sessions

@github-actions github-actions Bot added waiting-on-review PR state label and removed pr-state/ready-for-eval PR is mergeable and awaiting evaluation labels Aug 7, 2026
Drop consistently losing or inert scenarios, add SDK solution registration and empirical retry-policy mutation coverage, and sharpen activation for specialized workflows.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

Copilot-Session: d71b84f3-c114-48c5-9da0-59dd981916c7
Copilot AI review requested due to automatic review settings August 7, 2026 16:21
@Evangelink

Copy link
Copy Markdown
Member Author

/evaluate 757f99e

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot's findings

  • Files reviewed: 58/58 changed files
  • Comments generated: 0 new

@github-actions github-actions Bot added pr-state/ready-for-eval PR is mergeable and awaiting evaluation and removed waiting-on-review PR state label labels Aug 7, 2026
@github-actions

github-actions Bot commented Aug 7, 2026

Copy link
Copy Markdown
Contributor

📊 Skill Evaluation Results

3 skill(s) evaluated — ✅ 2 improved, ❌ 1 no credible change, 🔻 0 regressed.

A skill passes only on a credible net win over baseline: more wins than losses, by an exact one-sided sign test at p ≤ 0.05.

Skill Result Net win p Δ Pref W/T/L Quality Baseline Overfit Skills Loaded
scaffold-dotnet-test-project +57.1% 0.004 +22.9% 8/6/0 4.4/5 3.9/5 ✅ 0.08 ⚠️ 4/6 · 3/6 (plugin)
test-gap-analysis +25.0% 0.194 +2.5% 8/4/4 4.1/5 4.3/5 🟡 0.22 ⚠️ 5/7 · 5/7 (plugin)
testability-obstacle +41.7% 0.031 +16.7% 5/7/0 4.9/5 4.1/5 🟡 0.28 ⚠️ 4/5 · 2/5 (plugin)
ℹ️ Column legend
  • Net win(wins − losses) / trials for skilled vs baseline, judged head-to-head by vally compare. This is the effect the gate decides on.
  • p — one-sided exact sign test over the discordant (non-tie) trials. A skill passes only at p ≤ 0.05, which needs at least 5 winning trials.
  • Δ Pref — the same comparison weighted by how decisive each win was (much-better ±100%, slightly-better ±40%). Reported for triage only: weighting the statistic by magnitude made a skill fail for winning harder, which is why the gate deliberately ignores this column.
  • W/T/L — wins / ties / losses across trials.
  • ⚠️ — the gate withheld a verdict. Either the eval has fewer trials than any result needs to reach p ≤ 0.05 (underpowered — the skill was never actually measured, so this is not a regression; add scenarios or raise defaults.runs), or the comparison didn't complete.
  • 🔻 — a credible regression: the losses themselves clear the same bar the gate uses for wins.
  • Quality / Baseline — mean absolute judge score 0–5 (skilled isolated vs skill-free control).
  • Overfit — overfitting-judge severity (✅ Low, 🟡 Moderate, 🔴 High, — none) with its score.
  • Skills Loaded — of the scenarios that expect activation, how many actually activated / that total (plugin run shown when present); ⚠️ marks a scenario that expected activation but didn't activate.
❌ test-gap-analysis — details

Reason: Net win +25.0% (8W/4T/4L over 16 trial(s), sign test p=0.194), mean preference +2.5% — not credible (sign test p=0.194 > 0.05)

Scenario Net win Δ Pref Trials (W/T/L)
▲ Acknowledge well-tested code with few surviving mutations +100.0% +40.0% 2/0/0
▼ Analyse error propagation gaps in a Rust crate -50.0% -20.0% 0/1/1
▼ Decline request to write new tests from scratch -100.0% -100.0% 0/0/2
▲ Find boundary mutation gaps in tiered discount and shipping logic +50.0% +20.0% 1/1/0
▲ Find logic and null-check mutation gaps in access control code +100.0% +40.0% 2/0/0
▲ Skip trivial and generated code while tracing private call chains +50.0% +20.0% 1/1/0
▲ Verify and close only the surviving gaps in a partial suite +100.0% +40.0% 2/0/0
▼ Verify guard and exception-type gaps in retry policy tests -50.0% -20.0% 0/1/1

Per-scenario details for 2 skill(s) were omitted to keep this comment under GitHub's 65,536-character limit — open the job's step summary or Full Results for the complete breakdown.

🔍 Full Results - additional metrics and failure investigation steps

To investigate failures, paste this to your AI coding agent:

For PR 997 in dotnet/skills, download eval artifacts with gh run download 31198340539 --repo dotnet/skills --pattern "vally-results-*" --dir ./eval-results, then fetch https://raw.githubusercontent.com/dotnet/skills/757f99ec073c06ed18ed3aeff75da58c1efa203a/eng/vally-adapter/InvestigatingResults.md and follow it to analyze the results.json files. Diagnose each failure, suggest fixes to the eval.yaml and skill content, and tell me what to fix first.

▶ Sessions Visualisation -- interactive replay of all evaluation sessions
📊 Session Analytics (preview) -- aggregated metrics across evaluation sessions

@github-actions

github-actions Bot commented Aug 7, 2026

Copy link
Copy Markdown
Contributor

📊 Skill Evaluation Results

3 skill(s) evaluated — ✅ 2 improved, ❌ 1 no credible change, 🔻 0 regressed.

A skill passes only on a credible net win over baseline: more wins than losses, by an exact one-sided sign test at p ≤ 0.05.

Skill Result Net win p Δ Pref W/T/L Quality Baseline Overfit Skills Loaded
scaffold-dotnet-test-project +21.4% 0.188 +8.6% 4/9/1 4.0/5 3.6/5 ✅ 0.06 ⚠️ 3/6 · 0/6 (plugin)
test-gap-analysis +43.8% 0.033 +17.5% 9/5/2 4.4/5 4.2/5 🟡 0.22 ⚠️ 5/7 · 4/7 (plugin)
testability-obstacle +50.0% 0.016 +20.0% 6/6/0 4.9/5 3.8/5 🟡 0.25 ⚠️ 4/5 · 3/5 (plugin)
ℹ️ Column legend
  • Net win(wins − losses) / trials for skilled vs baseline, judged head-to-head by vally compare. This is the effect the gate decides on.
  • p — one-sided exact sign test over the discordant (non-tie) trials. A skill passes only at p ≤ 0.05, which needs at least 5 winning trials.
  • Δ Pref — the same comparison weighted by how decisive each win was (much-better ±100%, slightly-better ±40%). Reported for triage only: weighting the statistic by magnitude made a skill fail for winning harder, which is why the gate deliberately ignores this column.
  • W/T/L — wins / ties / losses across trials.
  • ⚠️ — the gate withheld a verdict. Either the eval has fewer trials than any result needs to reach p ≤ 0.05 (underpowered — the skill was never actually measured, so this is not a regression; add scenarios or raise defaults.runs), or the comparison didn't complete.
  • 🔻 — a credible regression: the losses themselves clear the same bar the gate uses for wins.
  • Quality / Baseline — mean absolute judge score 0–5 (skilled isolated vs skill-free control).
  • Overfit — overfitting-judge severity (✅ Low, 🟡 Moderate, 🔴 High, — none) with its score.
  • Skills Loaded — of the scenarios that expect activation, how many actually activated / that total (plugin run shown when present); ⚠️ marks a scenario that expected activation but didn't activate.
❌ scaffold-dotnet-test-project — details

Reason: Net win +21.4% (4W/9T/1L over 14 trial(s), sign test p=0.188), mean preference +8.6% — not credible (sign test p=0.188 > 0.05)

Scenario Net win Δ Pref Trials (W/T/L)
= Add an existing test project to the CI solution filter +0.0% +0.0% 0/2/0
= Create the first pricing test project with central packages +0.0% +0.0% 0/2/0
▲ Include new tests in the solution filter used by CI +100.0% +40.0% 2/0/0
▲ Keep a domain-only request bounded +100.0% +40.0% 2/0/0
▼ Register an existing test project omitted from the solution -50.0% -20.0% 0/1/1
= Register the first tests in an SDK solution file +0.0% +0.0% 0/2/0
= Reuse an existing suitable test project +0.0% +0.0% 0/2/0

Per-scenario details for 2 skill(s) were omitted to keep this comment under GitHub's 65,536-character limit — open the job's step summary or Full Results for the complete breakdown.

🔍 Full Results - additional metrics and failure investigation steps

To investigate failures, paste this to your AI coding agent:

For PR 997 in dotnet/skills, download eval artifacts with gh run download 31197233935 --repo dotnet/skills --pattern "vally-results-*" --dir ./eval-results, then fetch https://raw.githubusercontent.com/dotnet/skills/757f99ec073c06ed18ed3aeff75da58c1efa203a/eng/vally-adapter/InvestigatingResults.md and follow it to analyze the results.json files. Diagnose each failure, suggest fixes to the eval.yaml and skill content, and tell me what to fix first.

▶ Sessions Visualisation -- interactive replay of all evaluation sessions
📊 Session Analytics (preview) -- aggregated metrics across evaluation sessions

@github-actions github-actions Bot added waiting-on-review PR state label and removed pr-state/ready-for-eval PR is mergeable and awaiting evaluation labels Aug 7, 2026

@AbhitejJohn AbhitejJohn left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I rechecked the latest PR head. The four inline findings still apply.

(Copilot, commenting on Abhitej's behalf.)

Create the first .NET test project. USE FOR: "solution has no tests", first
xUnit tests, Tests.csproj/ProjectReference, add an omitted test project to
.sln/.slnx/.slnf, central packages, or tests missing from CI. DO NOT USE FOR:
a suitable existing project (stop; use code-testing-agent) or migration.

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for adding the omitted-wiring scenarios. Could we narrow this exclusion to a suitable project that is already registered in the requested build entry point? As written, the routing text says to stop for any suitable existing project, but the eval at lines 129-187 expects this skill to activate when an existing project is missing from Catalog.sln or TextTools.slnf. The body already has the correct narrower stop condition at lines 62-65, but the runtime routes from this frontmatter.

(Copilot, commenting on Abhitej's behalf.)

### Phase 4: Test

When the request includes tests, use `testability-obstacle` or
`code-testing-agent` to:

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Could we split these two paths? After Phase 3, the seam is already injected, while testability-obstacle explicitly says not to use it when a dependency is already injected and to use code-testing-agent instead. Would it work to use only code-testing-agent here, and treat testability-obstacle as an alternative targeted path that skips Generate/Migrate rather than as the final phase after them?

(Copilot, commenting on Abhitej's behalf.)


### Phase 4: Test

When the request includes tests, use `testability-obstacle` or

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Could we add one agent-level scenario that requests migration and deterministic tests? This PR adds the full Phase 4 path and removes the old inter-phase confirmation behavior, but tests/dotnet-test/agent.testability-migration/eval.yaml still has only an analysis-only scenario and a targeted TimeProvider migration scenario. Neither exercises this new path, so the stated agent capability can regress without an eval noticing.

(Copilot, commenting on Abhitej's behalf.)

---
name: testability-obstacle
description: >-
Make a static C# API testable and add tests. USE FOR: deterministic Guid,

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Small routing consistency question: could this lead describe C# behavior with ambient dependencies rather than only a static API? The body supports constructor injection for instance classes, and the eval at lines 144-177 expects this skill for the instance LeaseRenewer/TimeProvider case. USE FOR: time may still route correctly, so I see this as an ambiguity rather than a proven activation failure.

(Copilot, commenting on Abhitej's behalf.)

@github-actions github-actions Bot added waiting-on-author PR state label and removed waiting-on-review PR state label labels Aug 7, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

waiting-on-author PR state label

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants