Skip to content

Close the remaining dotnet-test eval follow-ups (#899) - #971

Merged
Evangelink merged 8 commits into
mainfrom
dev/amauryleve/dotnet-test-eval-followups-899
Jul 31, 2026
Merged

Close the remaining dotnet-test eval follow-ups (#899)#971
Evangelink merged 8 commits into
mainfrom
dev/amauryleve/dotnet-test-eval-followups-899

Conversation

@Evangelink

Copy link
Copy Markdown
Member

What & why

#899's scorecard has been worked down by #906, #907, #917, #945 and #949. The
2026-07-25 refresh
left four open items and no PR against any of them. This closes them.

Remaining item from #899 State here
Statistical power — 5 dotnet-test evals below the 5-trial floor Closed. Every non-agent.* dotnet-test eval now clears the floor and is off the ledger
P1 code-testing-agent cost (+4.6 turns / +11.0 tools) Addressed — pipeline is now proportional to scope, and there is a scenario that measures it
P2 → cost trim coverage-analysis (+263k tok / +6.7 turns / +8.9 tools) Addressed — 30 KB SKILL.md down to 15 KB behind gated references
Eval coverage for the 4 reference skills Recorded as a decision — a direct-activation eval for them is measurably noise; the gate now says so

1. Statistical power: every dotnet-test eval now clears the floor

Below five trials the pass gate cannot reach p ≤ 0.05 at any effect size
(eng/eval-quality/README.md check 8), so five dotnet-test skills could not have
passed however good they were. Each gained scenarios that measure something the
eval did not already cover — no runs: padding, which satisfies the arithmetic
without adding cross-scenario evidence.

Eval Trials New scenario What it discriminates
find-untested-sources 4 → 5 generated sources + an orphan test .Designer.cs / .g.cs must not enter the untested worklist; a test referencing no production type is an orphan, not a pairing
generate-testability-wrappers 4 → 5 no DI container anywhere Step 5's ambient-context seam: AsyncLocal<T> (not [ThreadStatic]), an IDisposable scope, and UTC semantics preserved — the DateTimeKind regression #906 fixed
grade-tests 4 → 5 C# with production code present First scenario where behaviour coverage is verifiable rather than Unverified, and the first to require a D grade (self-referential assertion)
coverage-analysis 3 → 5 gap spread over four members; CI report at a user-supplied path "Don't declare one method the entire gap" (the #945 fix) with arithmetic that only reconciles if all four are listed; and honouring an explicit path without re-running the suite or installing ReportGenerator
code-testing-agent 3 → 5 one-function request; failing-suite dormancy guard The cost P1 directly, plus a guard for two entries already in its When Not to Use list (running a suite, debugging test logic)

The two code-testing-agent additions are deliberately cheap — a tiny pytest
package and a four-test suite — because its existing three scenarios are the most
expensive in the plugin and bumping runs: would have tripled them.

2. coverage-analysis — the cost outlier, trimmed by progressive disclosure

SKILL.md was 30 KB, and roughly two thirds of it was PowerShell for paths the
common request never takes. Moved verbatim behind explicit read gates:

Reference Read when
references/setup-discovery.md Always (Phase 1 probes)
references/test-execution.md Only when Phase 1 found no Cobertura XML
references/report-generation.md Only when HTML/CSV was explicitly requested, after the Phase 4 summary

SKILL.md keeps the value-add — the phase map, the branch table, the mandatory
Phase 4 summary contract, validation and pitfalls — and is now 15 KB. The
"existing report, diagnose my plateau" path, which is what the evals and most
users exercise, no longer pays for the from-scratch execution and
ReportGenerator prose at all.

3. code-testing-agent — machinery sized to the request

The completion contract mandated .testagent/research.md, plan.md,
status.md and a test-gap-analysis + assertion-quality pass on every
request. That is the +4.6 turns / +11.0 tools. New Step 2 splits focused
(one function, class or file; "tests for X only") from broad (project,
package, coverage threshold across files): focused scopes keep the checklist
inline, read the target plus one neighbouring test, and review their own
assertions without spawning extra passes. Points 3–5 of the contract — tests
pass, every requirement backed by a concrete test, assertions reviewed — still
apply to both. The existing "extend an existing suite to QuoteAsync only"
scenario is itself a focused request, so it gets cheaper without any rubric or
grader change.

4. The four reference skills: a decision, not a to-do

filter-syntax, platform-detection, code-testing-extensions and
test-analysis-extensions set disable-model-invocation: true, which drops them
from the CLI's <available_skills> menu — deliberately, to free menu budget
(InvestigatingResults.md). The experiment's skilled variant loads exactly one
skill, so a direct-activation eval would load an arm the model can never invoke:
treatment equals control by construction, which is precisely the defect
failing check 7 exists to prevent. Adding four such evals would have made the
plugin's numbers worse while looking like coverage.

So the gate now reports them in their own bucket with that reasoning, and
eng/eval-quality/README.md plus the plugin README record how they are
exercised (through the consumers that load them, and in the plugin arm). Closing
this properly needs harness support for declaring a dependency in the skilled
variant — a change to the experiment and gen-experiment.mjs, not a per-skill
eval file.

5. Drive-bys

  • 4 orphaned mtp-hot-reload fixtures deleted. mtp-mstest-sdk9,
    mtp-mstest-sdk10, mtp-mstest-hotreload-installed and vstest-mstest are
    byte-equivalent (modulo blank lines) to the scenario-named fixtures beside
    them — rename leftovers. Wiring them up would have added duplicate scenarios,
    so they are removed instead.
  • 4 stale allowlist entries removed. The gate has been failing on main
    since Fix dotnet-maui skill regressions and sharpen decisiveness #947 merged: four dotnet-maui evals now meet the floor and the ledger
    errors on exemptions that are no longer needed. Removing them is what the gate
    asks for, and without it nothing else here can be verified green.

Checks

  • python eng/eval-quality/check_eval_quality.pyNo errors, both plain and
    with --base-ref origin/main (the mode CI uses on a PR). Zero dotnet-test
    entries remain in underpowered-allowlist.txt; the dotnet-test orphaned-fixture
    warnings are gone.
  • python eng/eval-quality/selftest_eval_quality.py — 20/20; the gate still fires
    on every bug class after the report_uncovered change.
  • markdownlint-cli2 over plugins/dotnet-test/** and eng/eval-quality/** — 0 errors.
  • All 18 dotnet-test eval specs parse; trial counts verified per eval.
  • New C# fixtures compile from a clean copy outside the repo:
    spread-gap, no-di-library, generated-and-orphan and
    dotnet-production-available all build with 0 warnings / 0 errors. The last one
    caught a real missing using System; before it shipped — the same defect class
    Close the dotnet-test skill-coverage gaps from the PR 945 report #949 had to repair after the fact.
  • New Cobertura fixture is self-consistent at every level (method, class,
    package, file summary): spread-gap declares 25/42 = 0.60 and every declared
    rate matches its <lines> payload within the gate's tolerance.
  • Python fixtures verified by running them: failing-suite gives exactly the two
    intended failures (both wrong expectations in the tests, not defects in
    ledger/balance.py), and slugify's five documented behaviours were checked
    against the implementation.
  • skill-validator check could not run — building it downloads
    @github/copilot-win32-x64 from npmjs and the sandbox blocks that TLS
    handshake (same as Close the dotnet-test skill-coverage gaps from the PR 945 report #949). No skill frontmatter or description changed, so its
    skill-menu budget and metadata checks are unaffected.

Refs #899.

Checklist

  • I searched existing issues and pull requests to avoid duplicates.
  • I kept this pull request focused and avoided unrelated refactors.
  • I added or updated tests, evals, or documentation when changing skill or agent behavior.
  • I updated CODEOWNERS when adding or moving owned content. (N/A — no owned content moved)
  • I updated all marketplace manifests when plugin metadata changed. (N/A — no plugin metadata changed)
  • I updated eng/known-domains.txt for any new external domains referenced by skill content. (N/A — no new external domains)

Every non-agent dotnet-test eval now clears the 5-trial floor, the two cost
P1s are addressed, and the reference-skill coverage gap is recorded as a
decision instead of a standing warning.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 024b3241-d7af-418a-b9cd-3bb9ee9bf0ee
@github-actions

github-actions Bot commented Jul 30, 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 test-anti-patterns 25/25 100%
dotnet-test test-gap-analysis 30/30 100%
dotnet-test test-smell-detection 26/26 100%
dotnet-test test-tagging 28/28 100%
dotnet-test writing-mstest-tests 45/45 100%

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 finishes the remaining follow-ups from #899 for the dotnet-test plugin by (1) raising underpowered evals above the minimum-trials floor via new discriminating scenarios/fixtures, (2) reducing coverage-analysis and code-testing-agent cost/verbosity (progressive disclosure + scoped pipeline), and (3) formalizing how “reference skills” (disable-model-invocation: true) are treated by the eval-quality gate and plugin docs.

Changes:

  • Added new eval scenarios and fixtures across multiple dotnet-test skills to increase statistical power without runs: padding.
  • Refactored coverage-analysis documentation into gated reference files and updated eval-quality reporting to bucket reference skills separately.
  • Deleted duplicated/orphaned mtp-hot-reload fixture trees and removed stale underpowered allowlist entries.
Show a summary per file
File Description
tests/dotnet-test/mtp-hot-reload/fixtures/vstest-mstest/ShippingCalculatorTests.cs Removes an orphaned/duplicated fixture file.
tests/dotnet-test/mtp-hot-reload/fixtures/mtp-mstest-sdk9/TestProject.csproj Removes an orphaned/duplicated fixture project.
tests/dotnet-test/mtp-hot-reload/fixtures/mtp-mstest-sdk9/PaymentProcessorTests.cs Removes an orphaned/duplicated fixture test file.
tests/dotnet-test/mtp-hot-reload/fixtures/mtp-mstest-sdk9/global.json Removes an orphaned/duplicated fixture SDK pin.
tests/dotnet-test/mtp-hot-reload/fixtures/mtp-mstest-sdk10/InventoryServiceTests.cs Removes an orphaned/duplicated fixture test + production sample.
tests/dotnet-test/mtp-hot-reload/fixtures/mtp-mstest-sdk10/global.json Removes an orphaned/duplicated fixture SDK pin.
tests/dotnet-test/mtp-hot-reload/fixtures/mtp-mstest-hotreload-installed/TestProject.csproj Removes an orphaned/duplicated HotReload fixture project.
tests/dotnet-test/mtp-hot-reload/fixtures/mtp-mstest-hotreload-installed/global.json Removes an orphaned/duplicated fixture SDK pin.
tests/dotnet-test/mtp-hot-reload/fixtures/mtp-mstest-hotreload-installed/EmailValidatorTests.cs Removes an orphaned/duplicated fixture test file.
tests/dotnet-test/grade-tests/fixtures/dotnet-production-available/Orders.Tests/Orders.Tests.csproj Adds nullable + references production project for “production available” grading scenario.
tests/dotnet-test/grade-tests/fixtures/dotnet-production-available/Orders.Tests/OrderCalculatorTests.cs Adds C# test fixture designed to exercise grading bands with production present.
tests/dotnet-test/grade-tests/fixtures/dotnet-production-available/Orders.Core/Orders.Core.csproj Adds production project for the new grading fixture.
tests/dotnet-test/grade-tests/fixtures/dotnet-production-available/Orders.Core/OrderCalculator.cs Adds production code-under-test for grading eval.
tests/dotnet-test/grade-tests/eval.yaml Adds new “production available” grading scenario (but currently has a YAML-structure defect).
tests/dotnet-test/generate-testability-wrappers/fixtures/no-di-library/AuditTrail.cs Adds no-DI fixture to force an ambient-context seam recommendation.
tests/dotnet-test/generate-testability-wrappers/fixtures/no-di-library/AuditLibrary.csproj Adds project wrapper for the no-DI fixture.
tests/dotnet-test/generate-testability-wrappers/eval.yaml Adds scenario covering ambient seam expectations when DI is explicitly disallowed.
tests/dotnet-test/find-untested-sources/fixtures/generated-and-orphan/tests/Billing.Tests/SmokeEnvironmentTests.cs Adds “orphan test” discriminator fixture.
tests/dotnet-test/find-untested-sources/fixtures/generated-and-orphan/tests/Billing.Tests/DiscountRulesTests.cs Adds a paired test to ensure it’s not reported untested.
tests/dotnet-test/find-untested-sources/fixtures/generated-and-orphan/tests/Billing.Tests/Billing.Tests.csproj Adjusts fixture wiring for src/tests split analysis.
tests/dotnet-test/find-untested-sources/fixtures/generated-and-orphan/src/Billing/TaxTable.Designer.cs Adds generated-source discriminator fixture (.Designer.cs).
tests/dotnet-test/find-untested-sources/fixtures/generated-and-orphan/src/Billing/Resources.g.cs Adds generated-source discriminator fixture (.g.cs).
tests/dotnet-test/find-untested-sources/fixtures/generated-and-orphan/src/Billing/InvoiceCalculator.cs Adds unpaired production file to be detected as needing tests.
tests/dotnet-test/find-untested-sources/fixtures/generated-and-orphan/src/Billing/DiscountRules.cs Adds paired production file (should not be reported untested).
tests/dotnet-test/find-untested-sources/fixtures/generated-and-orphan/src/Billing/Billing.csproj Adds production project for the generated/orphan fixture tree.
tests/dotnet-test/find-untested-sources/eval.yaml Adds scenario validating generated-file exclusion + orphan-test detection.
tests/dotnet-test/coverage-analysis/fixtures/spread-gap/coverage.cobertura.xml Adds Cobertura fixture where the gap is distributed across members.
tests/dotnet-test/coverage-analysis/fixtures/spread-gap/Contoso.Billing/TaxService.cs Adds fixture code matching the distributed-gap Cobertura report.
tests/dotnet-test/coverage-analysis/fixtures/spread-gap/Contoso.Billing/InvoiceService.cs Adds fixture code matching the distributed-gap Cobertura report.
tests/dotnet-test/coverage-analysis/fixtures/spread-gap/Contoso.Billing/Contoso.Billing.csproj Adds fixture project for the distributed-gap scenario.
tests/dotnet-test/coverage-analysis/eval.yaml Adds scenarios for distributed-gap arithmetic + honoring a user-supplied report path.
tests/dotnet-test/code-testing-agent/fixtures/python-single-function/textkit/slugify.py Adds a single-function Python target for proportional focused-scope testing.
tests/dotnet-test/code-testing-agent/fixtures/python-single-function/textkit/init.py Adds package marker for the Python single-function fixture.
tests/dotnet-test/code-testing-agent/fixtures/python-single-function/tests/.gitkeep Adds an empty tests dir placeholder for the fixture layout.
tests/dotnet-test/code-testing-agent/fixtures/python-single-function/pyproject.toml Adds minimal Python project config for pytest execution.
tests/dotnet-test/code-testing-agent/fixtures/failing-suite/tests/test_balance.py Adds intentionally-failing pytest suite for dormancy/decline behavior.
tests/dotnet-test/code-testing-agent/fixtures/failing-suite/pyproject.toml Adds minimal Python project config for the failing-suite fixture.
tests/dotnet-test/code-testing-agent/fixtures/failing-suite/ledger/balance.py Adds production code for failing-suite diagnosis.
tests/dotnet-test/code-testing-agent/fixtures/failing-suite/ledger/init.py Adds package marker for the failing-suite fixture.
tests/dotnet-test/code-testing-agent/eval.yaml Adds a focused-scope cost scenario + a dormancy guard scenario.
plugins/dotnet-test/skills/coverage-analysis/SKILL.md Trims and restructures coverage-analysis guidance with gated reference reads.
plugins/dotnet-test/skills/coverage-analysis/references/test-execution.md New Phase 2 reference content for provider detection + dotnet test commands.
plugins/dotnet-test/skills/coverage-analysis/references/setup-discovery.md New Phase 1 reference content (probes + output directory + report discovery).
plugins/dotnet-test/skills/coverage-analysis/references/report-generation.md New Phase 5 reference content (ReportGenerator install/invocation).
plugins/dotnet-test/skills/code-testing-agent/SKILL.md Introduces focused vs broad scope sizing to reduce unnecessary pipeline overhead.
plugins/dotnet-test/README.md Documents why reference skills intentionally have no direct-activation evals.
eng/eval-quality/underpowered-allowlist.txt Removes allowlist entries that are no longer needed after trial-count increases.
eng/eval-quality/README.md Documents reference-skill rationale in the eval-quality guidance.
eng/eval-quality/check_eval_quality.py Separates reference skills in uncovered-eval reporting via SKILL.md frontmatter probe.

Copilot's findings

Tip

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

Files not reviewed (1)
  • tests/dotnet-test/find-untested-sources/fixtures/generated-and-orphan/src/Billing/TaxTable.Designer.cs: Generated file
  • Files reviewed: 47/49 changed files
  • Comments generated: 1

Comment thread tests/dotnet-test/grade-tests/eval.yaml Outdated
@github-actions github-actions Bot added the waiting-on-author PR state label label Jul 30, 2026
@github-actions

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.)

…te it

The 'production code available' scenario carried a leftover tail from the
edit that moved the 'production code unavailable' one. YAML keeps the last
duplicate key, so every field of the new scenario was silently overwritten:
it shipped as a byte-identical rerun of its predecessor and never loaded the
dotnet-production-available fixture it was built around.

Parsing the spec and counting stimuli - which is what verified this PR -
returns the intended 5 names either way, so only the parser can see it. The
eval-quality gate now loads specs with a duplicate-key-strict loader
(failing check 9), with a self-test case and the incident recorded.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 024b3241-d7af-418a-b9cd-3bb9ee9bf0ee
Copilot AI review requested due to automatic review settings July 31, 2026 06:55

@Evangelink Evangelink left a comment

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

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

/evaluate

@Evangelink
Evangelink enabled auto-merge (squash) July 31, 2026 06:58
@Evangelink
Evangelink temporarily deployed to copilot-pat-pool July 31, 2026 06:58 — with GitHub Actions Inactive

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 not reviewed (1)
  • tests/dotnet-test/find-untested-sources/fixtures/generated-and-orphan/src/Billing/TaxTable.Designer.cs: Generated file
  • Files reviewed: 48/50 changed files
  • Comments generated: 0 new

@github-actions

Copy link
Copy Markdown
Contributor

❌ Evaluation ran but produced no results.

The evaluate job completed but no results.json verdicts were generated. This is usually a transient infrastructure failure — commonly an LLM-session auth error (Session was not created with authentication info or custom provider) — not a problem with your skill. Check the workflow run logs, then re-post /evaluate to try again.

@Evangelink Evangelink left a comment

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

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

/evaluate

@Evangelink
Evangelink temporarily deployed to copilot-pat-pool July 31, 2026 07:05 — with GitHub Actions Inactive
@github-actions github-actions Bot added pr-state/ready-for-eval PR is mergeable and awaiting evaluation and removed waiting-on-author PR state label labels Jul 31, 2026
@github-actions

Copy link
Copy Markdown
Contributor

📊 Skill Evaluation Results

5 skill(s) evaluated — ✅ 0 improved, ❌ 5 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 +20.0% 0.500 +8.0% 1/4/0 4.9/5 4.0/5 🟡 0.37 ⚠️ 4/4 · 3/4 (plugin)
coverage-analysis +80.0% 0.063 +44.0% 4/1/0 4.6/5 3.3/5 ✅ 0.10 5/5 · 5/5 (plugin)
find-untested-sources +60.0% 0.125 +24.0% 3/2/0 4.7/5 4.1/5 🟡 0.41 ⚠️ 5/5 · 3/5 (plugin)
generate-testability-wrappers +60.0% 0.188 +36.0% 4/0/1 4.3/5 3.3/5 ✅ 0.19 ⚠️ 3/5 · 3/5 (plugin)
grade-tests +80.0% 0.063 +32.0% 4/1/0 4.5/5 2.2/5 🟡 0.43 5/5 · 5/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 +20.0% (1W/4T/0L over 5 trial(s), sign test p=0.500), mean preference +8.0% — not credible (sign test p=0.500 > 0.05)

Scenario Net win Δ Pref Trials (W/T/L)
= Diagnose failing tests without generating a new 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
❌ coverage-analysis — details

Reason: Net win +80.0% (4W/1T/0L over 5 trial(s), sign test p=0.063), mean preference +44.0% — not credible (sign test p=0.063 > 0.05)

Scenario Net win Δ Pref Trials (W/T/L)
= Account for a gap spread across several members +0.0% +0.0% 0/1/0
▲ Analyse a CI Cobertura report without re-running tests or installing tools +100.0% +40.0% 1/0/0
▲ Coverage plateau diagnosis +100.0% +40.0% 1/0/0
▲ Project-wide coverage analysis with existing Cobertura data +100.0% +100.0% 1/0/0
▲ Run coverage from scratch without existing data +100.0% +40.0% 1/0/0
❌ find-untested-sources — details

Reason: Net win +60.0% (3W/2T/0L over 5 trial(s), sign test p=0.125), mean preference +24.0% — not credible (sign test p=0.125 > 0.05)

Scenario Net win Δ Pref Trials (W/T/L)
▲ Disambiguate duplicate C# type names by namespace +100.0% +40.0% 1/0/0
▲ Disambiguate duplicate C# types by nested test namespace +100.0% +40.0% 1/0/0
= Exclude generated sources and surface an orphan test +0.0% +0.0% 0/1/0
▲ Identify an unpaired TypeScript module +100.0% +40.0% 1/0/0
= Pair sources to tests across a src/tests directory split +0.0% +0.0% 0/1/0
❌ generate-testability-wrappers — details

Reason: Net win +60.0% (4W/0T/1L over 5 trial(s), sign test p=0.188), mean preference +36.0% — not credible (sign test p=0.188 > 0.05)

Scenario Net win Δ Pref Trials (W/T/L)
▲ Decline wrapper generation for already-abstracted code +100.0% +40.0% 1/0/0
▲ Generate TimeProvider adoption for DateTime.UtcNow +100.0% +40.0% 1/0/0
▲ Generate custom Environment wrapper +100.0% +40.0% 1/0/0
▼ Offer the ambient context seam when there is no DI container -100.0% -40.0% 0/0/1
▲ Recommend System.IO.Abstractions for file system calls +100.0% +100.0% 1/0/0
❌ grade-tests — details

Reason: Net win +80.0% (4W/1T/0L over 5 trial(s), sign test p=0.063), mean preference +32.0% — not credible (sign test p=0.063 > 0.05)

Scenario Net win Δ Pref Trials (W/T/L)
▲ Ask for a bounded list instead of grading the workspace +100.0% +40.0% 1/0/0
▲ Grade C# tests with the production code available +100.0% +40.0% 1/0/0
▲ Grade Go table-driven tests without misreading the loop as branching +100.0% +40.0% 1/0/0
▲ Grade pytest test methods using the same rubric +100.0% +40.0% 1/0/0
= Grade tests when the production code under test is unavailable +0.0% +0.0% 0/1/0

🔍 Full Results - additional metrics and failure investigation steps

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

For PR 971 in dotnet/skills, download eval artifacts with gh run download 30611635547 --repo dotnet/skills --pattern "vally-results-*" --dir ./eval-results, then fetch https://raw.githubusercontent.com/dotnet/skills/43c1bf731bd03296ed5b65f87070c88a1c796e67/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

…aint

Run 30611635547 reported 0 of 5 skills improved. The skills were not the
problem: across 25 trials they scored 16W/8T/1L, every skill winning and
none regressing. Four of the five could not have passed at any record.

The sign test conditions on discordant (non-tie) trials, so at exactly 5
trials the only passing record is a clean 5W/0T/0L sweep. One tie drops
the discordant count to 4, which is back below the floor. My previous
commit raised all five evals to exactly 5 - the eligibility floor, which
the README I wrote says is 'not a guarantee of adequate power'. At the
32% tie rate this run measured, a genuinely-helping skill parked there is
certified about one run in ten; at 15 trials it is about nine in ten.

- runs: 3 on the four evals whose scenarios discriminate (5 -> 15 trials).
- generate-testability-wrappers had a real self-contradiction: When Not to
  Use disclaimed the no-DI case while Step 5 IS the answer for it, so the
  ambient-seam scenario never activated and lost unassisted. Same defect
  #945 fixed in migrate-static-to-wrapper; fixed the same way.
- The already-abstracted scenario is a dormancy guard and now says so.
- code-testing-agent is left at 5 trials on purpose. The only grader its
  baseline ever fails is the Requirement|Evidence table regex - every
  functional grader passes identically in both arms - so it is inert on
  outcomes and more runs would only re-measure a tie at the highest cost
  in the plugin. Removed the skill trigger phrase the overfitting judge
  flagged from the one scenario this PR added.
- adapt.mjs said 'not credible (p=0.500)' for a 1W/4T/0L record, which
  describes a measured null rather than an unwinnable test. It now names
  the tie count and says no record could have passed.
- The gate warns on evals sitting at 5-7 trials; 21 across the repo do.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 024b3241-d7af-418a-b9cd-3bb9ee9bf0ee
Copilot AI review requested due to automatic review settings July 31, 2026 09:05
@Evangelink

Copy link
Copy Markdown
Member Author

Why every eval failed — and it was not the skills

Pulled the artifacts from run 30611635547. Across the five evals the trials were 16W / 8T / 1L — every skill winning, not one regressing — and the gate reported 0 improved, 5 no credible change.

Four of the five could not have passed at any record. The gate is an exact one-sided sign test, which conditions on the discordant (non-tie) trials. At exactly 5 trials the only record reaching p ≤ 0.05 is a clean 5W/0T/0L sweep; one tie leaves 4 discordant, which is back below the floor:

Skill Record Discordant Wins needed Verdict
code-testing-agent 1W/4T/0L 1 — impossible
coverage-analysis 4W/1T/0L 4 — impossible
find-untested-sources 3W/2T/0L 3 — impossible
grade-tests 4W/1T/0L 4 — impossible
generate-testability-wrappers 4W/0T/1L 5 5 of 5

This is my own regression from the previous commit: I raised all five evals to exactly 5 trials — the eligibility floor, which the README I edited in the same PR describes as "not a guarantee of adequate power for a realistic effect, which needs considerably more." At the 32% tie rate this run measured, a genuinely-helping skill parked at 5 trials is certified about one run in ten; at 15 it is about nine in ten.

Fixes

1. Power where scenarios discriminateruns: 3 on coverage-analysis, grade-tests, find-untested-sources and generate-testability-wrappers (5 → 15 trials). These already have five distinct scenarios, so the shortfall was repetition against judge noise, not task diversity — one trial was decided by a position-swap disagreement the judge itself reported.

2. A real skill bug the eval caught. generate-testability-wrappers When Not to Use said "The project does not use dependency injection and the user does not want to add it" — while Step 5 of the same skill is the ambient-context seam for exactly that case, and its Inputs table lists none (ambient context). So the new scenario never activated, ran unassisted, and lost. This is the identical self-contradiction #945 fixed in migrate-static-to-wrapper, and it is fixed the same way. Step 5 now also pins the three properties that broke real migrations: scoped IDisposable override, AsyncLocal<T> not [ThreadStatic], and preserved DateTimeKind.

3. A dormancy guard that wasn't declared. "Decline wrapper generation for already-abstracted code" correctly stays dormant — "the static is already behind an interface" is in the skill's own When Not to Use — but had no expect_activation: false, so correct behaviour was counted as an activation failure (the ⚠️ 3/5).

4. code-testing-agent is deliberately left at 5 trials. The artifacts settle it: the only grader its baseline ever fails is the Requirement | Evidence table regex. Every functional grader — tests compile, tests pass, coverage thresholds, scope containment, workspace integrity — passes identically in both arms. It is inert on outcomes, so more runs would re-measure a tie at the highest CI cost in the plugin, and weighting its rubric toward the skill's output format would just inflate an overfitting score the judge already puts at 🟡 0.37. I did remove the standard test-generation workflow trigger phrase from the one scenario this PR added, since the overfitting judge flagged it as handing the skilled arm an advantage the request doesn't contain.

5. The report said the wrong thing. adapt.mjs computes underpowered from counted trials, so a 1W/4T/0L record read as not credible (sign test p=0.500 > 0.05) — which describes a measured null, not a test that could not be run. It now names the tie count and states that no record could have passed. The verdict stays a failure (ties are evidence of inertness, not of a small eval), and there's a test pinning both wordings.

6. Prevention. The gate now warns on evals sitting at 5–7 trials, where only a flawless sweep passes. 21 evals across the repo are in that band — this is not just my five.

Checks

  • eval-quality gate: No errors, plain and --base-ref origin/main
  • gate self-test 21/21, adapter tests 21/21 (incl. the new wording test), markdownlint 0 errors
  • Recomputed the plugin skill-menu budget by hand since skill-validator can't build here — my first description edit pushed it to 15,139 / 15,000, over the CLI's SKILL_CHAR_BUDGET and past the 1024-char per-description spec limit, which would have silently truncated alphabetically-later skills. Trimmed back to 14,972, one char under where it started.

@Evangelink

Copy link
Copy Markdown
Member Author

/evaluate

@github-actions

Copy link
Copy Markdown
Contributor

👋 /evaluate needs the exact commit to evaluate.

Two ways to run it:

  1. Review flow (recommended — no SHA to copy): open Files changed → Review changes, type /evaluate in the review box, and Submit review. GitHub binds the run to the exact commit you reviewed.
  2. Comment flow: copy-paste this command for the current head:
/evaluate fe6df0b285e9bb465b26abf1823b8f84cae0ffcb

@Evangelink

Copy link
Copy Markdown
Member Author

/evaluate fe6df0b

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

Copy link
Copy Markdown
Contributor

📊 Skill Evaluation Results

5 skill(s) evaluated — ✅ 4 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
code-testing-agent +20.0% 0.500 +8.0% 1/4/0 4.6/5 3.9/5 🟡 0.36 ⚠️ 3/4 · 2/4 (plugin)
coverage-analysis +73.3% 0.000 +41.3% 11/4/0 4.7/5 3.0/5 ✅ 0.14 5/5 · 5/5 (plugin)
find-untested-sources +53.3% 0.004 +21.3% 8/7/0 4.7/5 4.0/5 🟡 0.40 ⚠️ 5/5 · 3/5 (plugin)
generate-testability-wrappers +73.3% 0.000 +45.3% 11/4/0 4.1/5 2.8/5 ✅ 0.15 4/4 · 4/4 (plugin)
grade-tests +77.8% 0.000 +34.4% 15/2/1 4.5/5 1.4/5 🟡 0.42 6/6 · 6/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 +20.0% (1W/4T/0L over 5 trial(s), sign test p=0.500), mean preference +8.0% — not credible — 4 of 5 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)
= Diagnose failing tests without generating a new suite +0.0% +0.0% 0/1/0
▲ Does not revert a gutted-looking workspace (workspace integrity) +100.0% +40.0% 1/0/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 +0.0% +0.0% 0/1/0

Per-scenario details for 4 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 971 in dotnet/skills, download eval artifacts with gh run download 30632646522 --repo dotnet/skills --pattern "vally-results-*" --dir ./eval-results, then fetch https://raw.githubusercontent.com/dotnet/skills/d3831da34a53cd8ea86ce72df668d0cfd2bc406b/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

…cord

Three defects, none of which was 'the skill is weak'.

1. Discovery. The skill's description said to invoke it 'even when the
   request says to use the repository's standard test-generation
   workflow'. That phrase existed in exactly two places in this repo: the
   description, and three of this eval's own prompts. Nowhere else - a
   closed loop between the eval and the skill it measures. Removing it
   from one prompt last commit dropped that scenario's activation to
   zero (run 30631489464, skillActivationCount 0) even though 'please
   add unit tests for that one function' is plainly a test-generation
   request. The description advertised only project-scale work, so the
   model reasonably skipped it for a one-function ask. It now states
   that scope changes how much of the workflow runs, never whether the
   skill applies - which is true since the focused/broad split landed.

2. Eval integrity. Removed the phrase from the remaining three prompts.
   The overfitting judge had flagged it twice as handing the skilled arm
   an advantage the request does not contain. Activation is now measured
   against how users actually write.

3. Passability. At runs: 1 this eval could not pass at any effect size.
   One of its five scenarios is a dormancy guard whose correct outcome
   is a tie, so discordant trials cap at 4 - one short of the 5 the sign
   test needs. It was unwinnable before a trial ran. runs: 2 gives ~8
   discordant-capable trials. Held at 2, not 3: this is the plugin's
   most expensive eval and its cost is the open P1 on #899.

Merged config into defaults per check 10 rather than adding a second
block. Graders left untouched - the Requirement|Evidence contract is a
real deliverable, and removing it would cut signal, not overfitting.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 024b3241-d7af-418a-b9cd-3bb9ee9bf0ee
Copilot AI review requested due to automatic review settings July 31, 2026 14:23
@Evangelink

Copy link
Copy Markdown
Member Author

/evaluate d662d04

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 not reviewed (1)
  • tests/dotnet-test/find-untested-sources/fixtures/generated-and-orphan/src/Billing/TaxTable.Designer.cs: Generated file
Suppressed comments (1)

eng/vally-adapter/adapt.test.mjs:342

  • This test declaration is formatted as a single long line with the opening brace and const v = … on the same line, unlike the surrounding tests in this file. Reformatting it to match the existing style will improve readability and reduce accidental diffs.
test("the smallest record that does pass is five wins and no losses", () => {  const v = gate([0.4, 0.4, 0.4, 0.4, 0.4]);
  • Files reviewed: 50/52 changed files
  • Comments generated: 0 new

@github-actions github-actions Bot added waiting-on-author PR state label and removed pr-state/ready-for-eval PR is mergeable and awaiting evaluation labels Jul 31, 2026
…ps-899

Both branches edited the same five dotnet-test evals. Resolutions:

* code-testing-agent - both sides independently concluded runs: 2, for
  different reasons: main because more scenarios of that shape cost more
  than they inform, this branch because a tie-by-design dormancy guard
  capped discordant trials at 4 and made the eval unwinnable. Kept both
  rationales in one comment.

  Main's version is currently BROKEN: it added defaults: runs: 2 while
  leaving the config: block in place, which vally's loader rejects
  ('cannot specify both config and defaults') - the exact defect check 10
  on this branch catches. Verified against vally 0.9.0's loadEvalSpec:
  main's spec is rejected, so code-testing-agent produces no verdicts on
  main today. The merged file has a single defaults block and loads.

* coverage-analysis - interleaved additions. Kept all four new scenarios
  (this branch: spread-across-members, CI-report-without-re-running;
  main: refactoring-safety, branch-vs-line coverage). The shared
  environment block is reused by both new scenarios, with each keeping
  its own cobertura destination path.

* grade-tests - both sides added a scenario for the same property
  (grading C# with production code present) on different fixtures. Took
  main's Banking fixture and dropped this branch's Orders duplicate:
  main's covers a superset of grade cases (adds a conditional-logic D),
  and the C-grade case this branch contributed is already covered by
  three other scenarios. Removed the now-orphaned fixture.

* generate-testability-wrappers - kept this branch's anti-hijack rubric
  item over main's whitespace-only change.

* Fixture rename/rename - git matched this branch's new csproj files
  against the orphaned mtp-hot-reload fixtures it deleted, which main had
  independently repurposed into platform-detection. Both sides agree the
  orphans go; kept each side's new files.

Validation: 97/97 specs load under vally 0.9.0, eval-quality gate clean
(plain and --base-ref), 22/22 gate self-tests, 21/21 adapter tests,
markdownlint 0 errors, no dotnet-test orphaned fixtures.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 024b3241-d7af-418a-b9cd-3bb9ee9bf0ee
Copilot AI review requested due to automatic review settings July 31, 2026 15:20
@Evangelink

Copy link
Copy Markdown
Member Author

/evaluate f88376f

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 not reviewed (1)
  • tests/dotnet-test/find-untested-sources/fixtures/generated-and-orphan/src/Billing/TaxTable.Designer.cs: Generated file
Suppressed comments (1)

eng/vally-adapter/adapt.test.mjs:342

  • This test definition looks like it was accidentally collapsed onto one line (opening brace + const v = ...), which makes the file inconsistent with the surrounding style and harder to read/maintain.
test("the smallest record that does pass is five wins and no losses", () => {  const v = gate([0.4, 0.4, 0.4, 0.4, 0.4]);
  • Files reviewed: 37/39 changed files
  • Comments generated: 1

@github-actions

Copy link
Copy Markdown
Contributor

📊 Skill Evaluation Results

5 skill(s) evaluated — ✅ 4 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
code-testing-agent +20.0% 0.250 +8.0% 2/8/0 4.0/5 4.0/5 ✅ 0.19 ⚠️ 1/4 · 1/4 (plugin)
coverage-analysis +86.7% 0.000 +54.7% 13/2/0 4.7/5 3.0/5 ✅ 0.09 5/5 · 5/5 (plugin)
find-untested-sources +80.0% 0.000 +32.0% 12/3/0 4.4/5 3.9/5 🟡 0.36 ⚠️ 4/5 · 3/5 (plugin)
generate-testability-wrappers +93.3% 0.000 +61.3% 14/1/0 4.5/5 2.9/5 ✅ 0.16 4/4 · 4/4 (plugin)
grade-tests +66.7% 0.000 +26.7% 12/6/0 4.9/5 2.4/5 🟡 0.43 6/6 · 6/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 +20.0% (2W/8T/0L over 10 trial(s), sign test p=0.250), mean preference +8.0% — not credible — 8 of 10 trial(s) tied, leaving only 2 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)
= Diagnose failing tests without generating a new suite +0.0% +0.0% 0/2/0
= 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 +50.0% +20.0% 1/1/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

Per-scenario details for 4 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 971 in dotnet/skills, download eval artifacts with gh run download 30638418640 --repo dotnet/skills --pattern "vally-results-*" --dir ./eval-results, then fetch https://raw.githubusercontent.com/dotnet/skills/d662d04279a99f4d826513147cb8fa77ca0b7dbb/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

git checkout --ours on a rename/rename conflict selects the ours-side
*path* but leaves the conflicted *content*, so this csproj shipped with
<<<<<<< / ======= / >>>>>>> markers and an xunit.v3 PackageReference that
belongs to main's platform-detection fixture. MSBuild cannot load it.

Restored the pre-merge content: a single ProjectReference to
Billing.csproj, matching the other find-untested-sources fixtures.

Verified the fixture builds (0 warnings, 0 errors) and scanned every
tracked file in the repo for conflict markers — this was the only one.

Caught in review by copilot-pull-request-reviewer.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 024b3241-d7af-418a-b9cd-3bb9ee9bf0ee
Copilot AI review requested due to automatic review settings July 31, 2026 15:28
@Evangelink

Copy link
Copy Markdown
Member Author

/evaluate ee2dd38

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 not reviewed (1)
  • tests/dotnet-test/find-untested-sources/fixtures/generated-and-orphan/src/Billing/TaxTable.Designer.cs: Generated file
Suppressed comments (1)

eng/vally-adapter/adapt.test.mjs:346

  • This test declaration has the opening brace and the first statement (const v = …) on the same line, which is inconsistent with the surrounding tests and may fail formatting/lint expectations for this file. Consider splitting it to the usual multi-line form.
test("the smallest record that does pass is five wins and no losses", () => {  const v = gate([0.4, 0.4, 0.4, 0.4, 0.4]);
  assert.equal(v.passed, true);
  assert.equal(v.underpowered, false);
  assert.ok(v.signTest.pValue <= SIGN_TEST_ALPHA);
  assert.match(v.reason, /credibly better/);
  • Files reviewed: 37/39 changed files
  • Comments generated: 0 new

@github-actions

Copy link
Copy Markdown
Contributor

❌ Evaluation ran but produced no results.

The evaluate job completed but no results.json verdicts were generated. This is usually a transient infrastructure failure — commonly an LLM-session auth error (Session was not created with authentication info or custom provider) — not a problem with your skill. Check the workflow run logs, then re-post /evaluate to try again.

@Evangelink Evangelink left a comment

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

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

/evaluate

@Evangelink
Evangelink temporarily deployed to copilot-pat-pool July 31, 2026 15:48 — with GitHub Actions Inactive
@github-actions

Copy link
Copy Markdown
Contributor

❌ Evaluation ran but produced no results.

The evaluate job completed but no results.json verdicts were generated. This is usually a transient infrastructure failure — commonly an LLM-session auth error (Session was not created with authentication info or custom provider) — not a problem with your skill. Check the workflow run logs, then re-post /evaluate to try again.

@Evangelink
Evangelink merged commit 573938d into main Jul 31, 2026
58 checks passed
@Evangelink
Evangelink deleted the dev/amauryleve/dotnet-test-eval-followups-899 branch July 31, 2026 15:59
@github-actions

Copy link
Copy Markdown
Contributor

📊 Skill Evaluation Results

5 skill(s) evaluated — ✅ 4 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
code-testing-agent +10.0% 0.500 +4.0% 1/9/0 4.1/5 4.0/5 ✅ 0.18 ⚠️ 1/4 · 1/4 (plugin)
coverage-analysis +76.2% 0.000 +44.8% 16/5/0 4.6/5 3.1/5 ✅ 0.12 ⚠️ 6/7 · 5/7 (plugin)
find-untested-sources +77.8% 0.000 +31.1% 14/4/0 4.4/5 3.9/5 🟡 0.37 ⚠️ 5/6 · 4/6 (plugin)
generate-testability-wrappers +80.0% 0.000 +48.0% 12/3/0 4.7/5 3.3/5 ✅ 0.16 4/4 · 4/4 (plugin)
grade-tests +50.0% 0.006 +20.0% 10/7/1 4.9/5 3.3/5 🟡 0.38 6/6 · 6/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 +10.0% (1W/9T/0L over 10 trial(s), sign test p=0.500), mean preference +4.0% — not credible — 9 of 10 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)
= Diagnose failing tests without generating a new suite +0.0% +0.0% 0/2/0
= 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) +0.0% +0.0% 0/2/0
▲ Keep a single-function request proportional +50.0% +20.0% 1/1/0

Per-scenario details for 4 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 971 in dotnet/skills, download eval artifacts with gh run download 30642518177 --repo dotnet/skills --pattern "vally-results-*" --dir ./eval-results, then fetch https://raw.githubusercontent.com/dotnet/skills/f88376f1040e96ac4478a4f0018863999211842f/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

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