Skip to content

Flake reproducer has been dead since #395 — and its failure looked like a repro - #730

Merged
rbuergi merged 1 commit into
mainfrom
fix/flake-repro-dead-pack-step
Jul 31, 2026
Merged

rbuergi merged 1 commit into
mainfrom
fix/flake-repro-dead-pack-step

Conversation

@rbuergi

@rbuergi rbuergi commented Jul 30, 2026

Copy link
Copy Markdown
Contributor

Every dispatch of flake-repro.yml has died before running the test.

It packs src/MeshWeaver.BusinessRules{,.Generator} "exactly as dotnet-test.yml does". #395 removed that step from dotnet-test.yml — the scope generator ships in-process, and legacy #r "nuget:MeshWeaver.BusinessRules.Generator" directives are filtered out of the resolve set at compile — and the projects left src/ with it. This copy kept packing them:

MSBUILD : error MSB1009: Project file does not exist.
Switch: src/MeshWeaver.BusinessRules/MeshWeaver.BusinessRules.csproj

Why it survived this long

The pack step runs before the loop, so:

success  7  Build
failure  8  Pack mesh-local          ← dies here
skipped  9  Loop the suspect test until it fails

The loop shows as skipped while the job reports failure — the exact shape of a successful reproduction, whose entire purpose is to fail. I dispatched it against the TrackActivity flake, saw failure, and was one step from reporting a repro of a test that never executed. What caught it was an artifact list that came back empty.

A reproducer whose did-not-run is indistinguishable from its did-reproduce is worse than no reproducer: it answers the question you asked it, with the wrong answer.

The fix

  • Remove the dead pack step.
  • Make that outcome impossible to mistake: the loop step now runs with always() and fails loudly — REPRO DID NOT RUN … the job's failure is the harness, not the flake — when its project is absent.

Deliberately not changed

The log-level guidance. This file already warns that Debug in the CompileWatcher hot path masks the race — repros #1/#2 caught it at the committed level, #3/#4 with Debug missed it across 120+ iterations. Dispatch at the default first; treat Trace as a last resort. Worth flagging that my own dispatch used Trace, which on that evidence may itself have suppressed the race it was hunting.

🤖 Generated with Claude Code

https://claude.ai/code/session_01WJiX3ou4QJnUppszJytrNj

…ke a repro

Every dispatch of flake-repro.yml has died before running the test. It packed
src/MeshWeaver.BusinessRules{,.Generator} "exactly as dotnet-test.yml does"; #395
removed that step from dotnet-test.yml (the scope generator ships in-process and legacy
`#r "nuget:MeshWeaver.BusinessRules.Generator"` directives are filtered out of the
resolve set at compile) and the projects left src/ with it. This copy kept packing them:

  MSBUILD : error MSB1009: Project file does not exist.
  Switch: src/MeshWeaver.BusinessRules/MeshWeaver.BusinessRules.csproj

WHY IT SURVIVED. The pack step runs BEFORE the loop, so the loop showed as `skipped`
while the job reported `failure` — the exact shape of a successful reproduction, whose
whole purpose is to fail. I dispatched it against the TrackActivity flake, saw
`failure`, and was one step away from reporting a repro of a test that never executed.
An artifact list that came back empty is what made me look.

So this removes the dead step AND makes that outcome impossible to mistake: the loop
step now runs with `always()` and fails loudly — "REPRO DID NOT RUN … the job's failure
is the harness, not the flake" — when its project is absent. A reproducer whose
did-not-run is indistinguishable from its did-reproduce is worse than no reproducer,
because it answers the question you asked it with the wrong answer.

Not changed, deliberately: the log-level guidance. This file already warns that Debug
in the CompileWatcher hot path MASKS the race (repros #1/#2 caught it at the committed
level; #3/#4 with Debug missed it across 120+ iterations). Dispatch with the default
level first and treat Trace as a last resort — my own dispatch used Trace, which on
that evidence may have suppressed the very race it was hunting.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WJiX3ou4QJnUppszJytrNj
Copilot AI review requested due to automatic review settings July 30, 2026 22:28

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

Fixes the manual flake-repro.yml workflow so it no longer fails before executing the intended test loop (after #395 removed the BusinessRules pack step), and makes “repro did not run” harder to misinterpret as “flake reproduced”.

Changes:

  • Removed the stale “pack mesh-local #r packages” step that referenced deleted projects and caused the workflow to fail before the loop.
  • Ensured the loop step runs with if: always() and added a guard to fail loudly when the target project path is missing.

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

Comment on lines 84 to 85
- name: Build
run: dotnet build --no-restore -c Release -p:CIRun=true -warnaserror
Comment on lines 109 to +118
set -uo pipefail
iters="$REPRO_ITERS"
proj="$REPRO_PROJECT"
filt="$REPRO_FILTER"
# A repro run that never executed the test is the one outcome that must NOT be silent:
# its exit code is identical to a real reproduction.
if [ ! -d "$proj" ]; then
echo "::error::REPRO DID NOT RUN — project '$proj' not found. Nothing was reproduced; the job's failure is the harness, not the flake."
exit 1
fi
@github-actions

Copy link
Copy Markdown
Contributor

Test Results (shard 3)

   12 files  ±0     12 suites  ±0   4m 5s ⏱️ +9s
  998 tests ±0    994 ✅ ±0  4 💤 ±0  0 ❌ ±0 
1 063 runs  ±0  1 059 ✅ ±0  4 💤 ±0  0 ❌ ±0 

Results for commit a787d32. ± Comparison against base commit 1897a4d.

@github-actions

Copy link
Copy Markdown
Contributor

Test Results (shard 2)

1 131 tests  ±0   1 028 ✅ ±0   5m 3s ⏱️ -11s
   10 suites ±0     103 💤 ±0 
   10 files   ±0       0 ❌ ±0 

Results for commit a787d32. ± Comparison against base commit 1897a4d.

@github-actions

Copy link
Copy Markdown
Contributor

Test Results (shard 4)

2 109 tests  ±0   1 921 ✅ ±0   4m 27s ⏱️ -41s
   12 suites ±0     188 💤 ±0 
   12 files   ±0       0 ❌ ±0 

Results for commit a787d32. ± Comparison against base commit 1897a4d.

@github-actions

Copy link
Copy Markdown
Contributor

Test Results (shard 0)

959 tests  ±0   953 ✅ ±0   4m 34s ⏱️ +11s
  5 suites ±0     6 💤 ±0 
  5 files   ±0     0 ❌ ±0 

Results for commit a787d32. ± Comparison against base commit 1897a4d.

@github-actions

Copy link
Copy Markdown
Contributor

Test Results (shard 5)

1 182 tests  ±0   1 181 ✅ ±0   5m 33s ⏱️ -19s
   12 suites ±0       1 💤 ±0 
   12 files   ±0       0 ❌ ±0 

Results for commit a787d32. ± Comparison against base commit 1897a4d.

@github-actions

Copy link
Copy Markdown
Contributor

Test Results (shard 1)

1 208 tests  ±0   1 207 ✅ ±0   7m 17s ⏱️ -18s
   10 suites ±0       1 💤 ±0 
   10 files   ±0       0 ❌ ±0 

Results for commit a787d32. ± Comparison against base commit 1897a4d.

@github-actions

Copy link
Copy Markdown
Contributor

Test Results

   61 files  ±0     61 suites  ±0   31m 2s ⏱️ - 1m 8s
7 587 tests ±0  7 284 ✅ ±0  303 💤 ±0  0 ❌ ±0 
7 652 runs  ±0  7 349 ✅ ±0  303 💤 ±0  0 ❌ ±0 

Results for commit a787d32. ± Comparison against base commit 1897a4d.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants