Skip to content

ci: run orphaned Nethermind test projects in the test matrix - #12689

Open
benaadams wants to merge 5 commits into
masterfrom
test-hygiene/wire-orphan-test-projects-into-ci
Open

ci: run orphaned Nethermind test projects in the test matrix#12689
benaadams wants to merge 5 commits into
masterfrom
test-hygiene/wire-orphan-test-projects-into-ci

Conversation

@benaadams

@benaadams benaadams commented Aug 5, 2026

Copy link
Copy Markdown
Member

Changes

How to review this fast: three commits (base change, then two review/lint follow-ups), +36/-8 across 4 files - new matrix entries and a guard job in nethermind-tests.yml, one missing project entry in Nethermind.slnx, and redundant usings removed from the newly built test project. No product code changed.

  • Seven Nethermind.* test projects were absent from every test workflow (nethermind-tests.yml, -flat, -checked), so their tests never ran in CI: Analyzers.Test, BalRecorder.Test, CensorshipDetector.Plugin.Test, OpcodeTracing.Plugin.Test, Serialization.SszGenerator.Test, State.Flat.History.Test, StateDiffsWriter.Test. This adds them to the tests job matrix.
  • Nethermind.OpcodeTracing.Plugin.Test was also missing from Nethermind.slnx (only the plugin itself was listed), so the shared test-artifact build produced no binaries for it; added to the solution.
  • Nethermind.Precompiles.Benchmark.Test is deliberately not wired in: it lives in Benchmarks.slnx only, and the test-artifact build compiles only Nethermind.slnx + EthereumTests.slnx; pulling the BenchmarkDotNet-dependent benchmark project into the main solution for its single test seemed disproportionate.

From review feedback:

  • A matrix-guard job now fails CI when a src/Nethermind/*.Test directory has no matrix entry, so projects cannot silently fall out of CI again (allowlist: Nethermind.Precompiles.Benchmark.Test, Ethereum.Blockchain.Pyspec.Test). It is wired into tests-summary so branch protection sees it.
  • Ethereum.Ssz.Test was in EthereumTests.slnx but in no matrix; added to tests-spec.
  • The two OpcodeTracing test files shed usings covered by ImplicitUsings (flagged by lint once the project actually built in the solution).

This is the first PR of a test-hygiene effort (fixing tests that cannot meaningfully fail); a test suite that never runs is the limiting case, so it goes first.

Types of changes

What types of changes does your code introduce?

  • Bugfix (a non-breaking change that fixes an issue)
  • New feature (a non-breaking change that adds functionality)
  • Breaking change (a change that causes existing functionality not to work as expected)
  • Optimization
  • Refactoring
  • Documentation update
  • Build-related changes

Testing

Requires testing

  • Yes

If yes, did you write tests?

  • No

Notes on testing

All 7 projects were run locally on windows-x64 (release, sequential): Analyzers 96, BalRecorder 24, CensorshipDetector 7, OpcodeTracing 16, SszGenerator 61, State.Flat.History 100, StateDiffsWriter 36 - 340 tests, 0 failed, 0 skipped. The real verification is this PR's own checks: the 7 new matrix jobs must appear and pass on ubuntu x64/arm64.

Documentation

Requires documentation update

  • No

Requires explanation in Release Notes

  • No

Seven Nethermind.* test projects were absent from every test workflow, so
their tests never ran in CI: Analyzers, BalRecorder, CensorshipDetector.Plugin,
OpcodeTracing.Plugin, Serialization.SszGenerator, State.Flat.History and
StateDiffsWriter. Adds them to the nethermind-tests.yml matrix.

Nethermind.OpcodeTracing.Plugin.Test was also missing from Nethermind.slnx
(only the plugin itself was listed), so the shared test-artifact build did not
produce its binaries; adds the project to the solution.

Nethermind.Precompiles.Benchmark.Test is intentionally not wired in: it lives
in Benchmarks.slnx only, and the test-artifact build compiles only
Nethermind.slnx and EthereumTests.slnx.
@benaadams
benaadams requested a review from rubo as a code owner August 5, 2026 01:53
Copilot AI review requested due to automatic review settings August 5, 2026 01:53
@claude

claude Bot commented Aug 5, 2026

Copy link
Copy Markdown
Contributor

Claude finished @benaadams's task in 6m 41s —— View job


Review: ci: run orphaned Nethermind test projects in the test matrix

  • Read the diff and the test workflows
  • Verify the 7 project names/paths resolve and are built by the shared artifact step
  • Check whether the sibling workflows (-flat, -checked) need the same entries
  • Check the deliberately-excluded project claim
  • Post review

No Critical / High / Medium findings. The mechanism is right and the completeness claim checks out. Four Low notes below.


What I verified

Check Result
Directory name == csproj name == matrix entry for all 7 ✅ — required, since the job does working-directory: src/Nethermind/${{ matrix.project }} + dotnet restore ${{ matrix.project }}.csproj
All 7 in Nethermind.slnx (so --no-build finds binaries) ✅ — 6 already were; OpcodeTracing.Plugin.Test is the one this PR adds. build-test-artifacts.yml builds Nethermind.slnx + EthereumTests.slnx, so the artifact now covers all 7
All 7 import ../tests.props ✅ — EnableNUnitRunner, Microsoft.Testing.Extensions.CodeCoverage, NUnit adapter — so both the plain and --coverage paths work
Matrix stays ASCII-alphabetical ✅ — Serialization.Ssz.Test < Serialization.SszGenerator.Test, State.Flat.History.Test < State.Flat.Test, State.Test.Runner.Test < StateDiffsWriter.Test (. = 0x2E < D)
.slnx placement follows convention ✅ — plugin tests sit beside their plugin (matches /Plugins/CensorshipDetector/, /Plugins/StateDiffsWriter/); non-plugin ones were already under /Tests/
No submodule dependency ✅ — the tests job doesn't run fetch-submodules; none of the 7 read src/tests
No zero-test risk ✅ — this matters: Ethereum.Blockchain.Pyspec.Test/CiSentinelTests.cs documents that MTP exits non-zero when zero tests run. None of the 7 has a CiRunnerGuard-style per-runner filter, [Explicit], or [Ignore], so all tests run on both x64 and arm64
Flake surface on arm64 ✅ — no Thread.Sleep / Task.Delay / DateTime.Now / RuntimeInformation / hardcoded paths / TestBlockchain / SemaphoreSlim anywhere in the 7. These are fast unit-test projects
Coverage exclusions still hold ✅ — codecoverage.json's (Ethereum|Nethermind)\..*\.Test(\.Runner)?\.dll$ exclude matches all 7 new assemblies, and ExcludeAssembliesWithoutSources: MissingAll keeps Roslyn out of Analyzers.Test's instrumentation
Completeness of "these are all the orphans" ✅ — the only unwired Nethermind.* test directory left is Nethermind.Precompiles.Benchmark.Test, which the PR body acknowledges. Nethermind.IntegrationTests looks like a gap but is run by run-e2e-tests.yml:68

The Benchmarks.slnx-only rationale for excluding Precompiles.Benchmark.Test is sound — pulling a BenchmarkDotNet project into Nethermind.slnx would put it in build-solutions, code-lint, and the artifact build for one test.

Low

1. Nethermind.OpcodeTracing.Plugin.Test enters code-lint for the first time. Left inline — this project has never been compiled in CI, and code-lint.yml builds the slnx with EnforceCodeStyleInBuild=true, failing on any warning IDE\d+/CA\d+ (20 rules are promoted to warning in .editorconfig, IDE0005 unused-using being the likeliest to bite). --locked-mode in build-solutions.yml is fine (no lock file in this project's graph). Nothing to change — just needs Code Lint and Build solutions green before merge. Both were still in progress when I looked.

2. No guard against the next orphan. This PR fixes the seven instances; the class stays open. nethermind-tests-checked.yml already drifts independently of this PR — it runs 44 projects and is missing Nethermind.EraE.Test and Nethermind.State.Flat.Test, which have been in nethermind-tests.yml all along, and is now behind by 9. (nethermind-tests-flat.yml is a deliberate 5-project subset, so leaving it alone is correct.) A CI step that diffs ls -d src/Nethermind/Nethermind.*.Test against the matrix, with an explicit allowlist for the intentional exclusion, would make the next orphan fail CI instead of silently never running — the natural companion to a test-hygiene series. Fix this →

3. Ethereum.Ssz.Test is the same defect, still unwired. It's in EthereumTests.slnx (so the artifact job builds it) but absent from the tests-spec matrix — ~22 [Test]/[TestCase] attributes across 4 files that never execute. Outside the PR's stated Nethermind.* scope, but squarely inside "a test suite that never runs is the limiting case". One matrix line. Fix this →

4. Nethermind.Analyzers.Test brings a test-runtime network dependency into the matrix. Microsoft.CodeAnalysis.CSharp.Analyzer.Testing's ReferenceAssemblies.Net.Net80 / .Net100 (used across 7 of its test files) resolve Microsoft.NETCore.App.Ref from NuGet while the tests run — the job's dotnet restore can't prefetch these, since they're not PackageReferences. Fine on GitHub runners, but note the failure mode: a NuGet hiccup surfaces as rc=1, which the step treats as a genuine test failure and does not retry (only non-0/1 exit codes get the crash retry). Nothing to do now; worth remembering if this job is the one that goes red intermittently.

Nit

+7 projects × 2 Linux runners = 14 new jobs per PR (plus coverage on master pushes) for 340 tests total. Per-project jobs match the existing structure, so consistency probably wins over batching the small ones — noting it only because the arithmetic isn't free.


Nothing blocking. Verdict is contingent on this PR's own Code Lint, Build solutions, and the 14 new test jobs going green — which, as the PR body says, is the real verification.
· branch test-hygiene/wire-orphan-test-projects-into-ci

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 improves CI coverage by ensuring previously “orphaned” Nethermind.* test projects are included in the primary test workflow matrix, and that Nethermind.OpcodeTracing.Plugin.Test is also built by the shared test-artifact solution build.

Changes:

  • Adds 7 missing Nethermind.* test projects to the tests job matrix in .github/workflows/nethermind-tests.yml so they run in CI.
  • Adds Nethermind.OpcodeTracing.Plugin.Test to src/Nethermind/Nethermind.slnx so the shared Linux test-artifact build produces binaries for it.

Reviewed changes

Copilot reviewed 2 out of 2 changed files in this pull request and generated no comments.

File Description
src/Nethermind/Nethermind.slnx Includes Nethermind.OpcodeTracing.Plugin.Test in the main solution so it’s built in shared test artifacts.
.github/workflows/nethermind-tests.yml Extends the test matrix to run additional Nethermind.* test projects on the standard runners.

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

Comment thread src/Nethermind/Nethermind.slnx
The OpcodeTracing test project enables ImplicitUsings, so the remaining
leading System.* usings are redundant - IDE0005 anchors the whole
contiguous group at line 4, which is why removing only 'using System;'
did not clear the warning.

Also, per review: wire Ethereum.Ssz.Test into tests-spec (it is in
EthereumTests.slnx but ran in no matrix), and add a matrix-guard job
that fails when a *.Test project directory has no matrix entry, so the
next orphaned test project fails CI instead of silently never running.
@benaadams

Copy link
Copy Markdown
Member Author

@claude re-review

@claude

claude Bot commented Aug 5, 2026

Copy link
Copy Markdown
Contributor

Claude encountered an error after 3m 20s —— View job


I'll analyze this and get back to you.

@benaadams

Copy link
Copy Markdown
Member Author

@claude re-review

@claude

claude Bot commented Aug 5, 2026

Copy link
Copy Markdown
Contributor

Claude finished @benaadams's task in 4m 51s —— View job


Re-review: ci: run orphaned Nethermind test projects in the test matrix

  • Diff the new commits against my prior review
  • Trace the matrix-guard script against the real tree
  • Check tests-summary gating of the new job
  • Verify Ethereum.Ssz.Test wiring + allowlist claims
  • Check CI status
  • Post review

2 Medium, 3 Low. The three Lows from my last pass were all addressed — matrix-guard, Ethereum.Ssz.Test, and the unused usings. The guard itself is well built and passes on the current tree. Both Mediums are in the new guard: it isn't actually wired into the gate, and one allowlist entry masks a real orphan.


Since last review

Prior note Status
Low 1 — first-time code-lint exposure for OpcodeTracing.Plugin.Test ✅ Real: IDE0005 fired. ac78ff6/c51732a removed 7 now-implicit usings. Code Lint and Build solutions green
Low 2 — no guard against the next orphan matrix-guard job added
Low 3 — Ethereum.Ssz.Test unwired ✅ Added to tests-spec. Verified in EthereumTests.slnx:69 (artifact has binaries for --no-build) and correctly not in FIXTURE_PROJECTS — it reads no submodule fixtures
Low 4 — Analyzers.Test runtime NuGet dep Unchanged, still just a note

CI on head c51732a: 14/14 workflow runs green, including Check test project matrix is exhaustive (job) and the new test jobs. That also settles the one thing I couldn't check statically: [[ … ]] && continue under Actions' bash -eo pipefail is not fatal on the allowlist branch (errexit is suppressed for the non-final command of an && list), so the loop doesn't abort on the first allowlisted project.

Medium

1. matrix-guard is in needs but not in the assertion — the guard doesn't gate. Inline. tests-summary is if: always() with an explicit four-way [[ ]] (L408–413) covering tests/tests-spec/tests-chunked/nethtest. matrix-guard was added to needs (L402) but not to the conjunction, so a guard failure leaves Tests summary green; the needs entry's only effect is to delay the summary. In a workflow that deliberately funnels everything into one aggregate check, that means the next orphan shows up as a red job inside a green required check — the same silent-pass this PR exists to close. One line in the assertion.

2. The Ethereum.Blockchain.Pyspec.Test allowlist rationale covers only part of the assembly. Inline. "superseded by the nethtest job" is true for the CiRunnerGuard-gated fixture fixtures in PyspecTestFixture.cs. It is not true for the plain NUnit unit tests sitting in the same project: ZkEvmFixtures/ZkEvmBlockchainTests.cs:89 StatelessSchemaTests — no guard, no [Explicit] — contributes ~20 cases (Revision_1_schema_roundtrips ×6, Request_struct_conversion_roundtrips ×5, the [TestCase(0x0f01)] / [TestCase(10UL, 20UL, true)] / BlockchainIds sets, one bare [Test] at L180), plus CiSentinelTests.cs:16. nethtest drives Nethermind.Test.Runner over fixture JSON and never loads this assembly, and the project is in no matrix in any of the three test workflows. So it is an orphan of exactly the class this PR fixes — and the allowlist is what will keep the new guard quiet about it. Adding it to tests-spec is enough: it's in EthereumTests.slnx:58, not a FIXTURE_PROJECTS member, the fixture fixtures self-skip via CiRunnerGuard, and CiSentinelTests keeps the run non-empty.

Low

3. nethermind-tests-checked.yml drift is now 10 projects, and the guard doesn't see it. The guard greps only nethermind-tests.yml. -checked lists 44 projects and is missing all 7 newly wired ones plus Ethereum.Ssz.Test, Nethermind.EraE.Test and Nethermind.State.Flat.Test (the last two predate this PR). Out of the PR's stated scope, and -flat is a deliberate 5-project subset — but the same class of defect remains unguarded one file over. If -checked is meant to be exhaustive, a one-line comment saying so plus extending the guard to it would close the loop; if it's a curated subset, saying that in the file is enough. Fix this →

4. The guard's glob only matches *.Test, so *.Tests names escape it silently. for dir in src/Nethermind/*.Test misses Nethermind.IntegrationTests (fine — it runs via run-e2e-tests.yml:68), but that's by accident of the glob rather than by the allowlist, so it isn't documented, and a future Nethermind.Foo.Tests would be invisible to the guard rather than caught. src/Nethermind/*.Test?(s) with shopt -s extglob, or *.Test* plus a couple more allowlist entries for Ethereum.Test.Base / Nethermind.Test.Runner / Nethermind.EthereumTests.Benchmark, would make the coverage boundary explicit. Same shape: [[ -f "$dir/$project.csproj" ]] || continue silently skips any project whose directory name ≠ csproj name — currently none, and such a project would fail the tests job anyway.

5. Flow-style exclude: entries would satisfy the guard. The second alternative project: ${esc}[,} ] matches inline mapping entries, and it can't tell an include: from an exclude:. No such case exists today — the only exclude: blocks (L109, L224) use block style, whose trailing newline the pattern correctly rejects — so a project that's excluded on every runner would currently be caught. Just noting the pattern doesn't guarantee that.

What I re-verified

  • Guard produces no false positives on the real tree — confirmed by the green job, cross-checked against all 78 *Test* project files. Anchored ^ +- <esc>$ correctly distinguishes Nethermind.State.Test from Nethermind.State.Test.Runner.Test, and Ethereum.Legacy.Blockchain.Test matches via the tests-chunked flow-form alternative.
  • Comment lines can't produce false matches (^ +- requires - immediately after the indent, so # - Foo doesn't match), and the allowlist= line itself matches neither alternative.
  • Matrix ordering still ASCII-alphabetical, including Ethereum.Rlp.Test < Ethereum.Ssz.Test < Ethereum.Transaction.Test.
  • The 7 removed usings in OpcodeTracingModuleTests.cs / OpcodeTraceRecorderTests.cs are all implicit-usings duplicates; compilation is confirmed by green Build solutions, Code Lint and the test jobs themselves.

Neither Medium is a defect in what now runs — all 348-odd newly wired tests do execute and pass on both Linux arches. They're both about the guard's own effectiveness, which is the part that has to be right if it's going to prevent the next instance rather than document this one. Finding 1 is a one-line fix; finding 2 is one matrix line and a narrowed comment.
· branch test-hygiene/wire-orphan-test-projects-into-ci

tests-summary:
name: Tests summary
needs: [tests, tests-spec, tests-chunked, nethtest]
needs: [tests, tests-spec, tests-chunked, nethtest, matrix-guard]

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.

matrix-guard is added to needs but its result is never asserted, so the guard is not actually gating.

tests-summary runs if: always() and its check is an explicit four-way conjunction (lines 408–413) that still only covers tests, tests-spec, tests-chunked, nethtest. With matrix-guard in needs but absent from the [[ ]], a guard failure leaves Tests summary green — the only effect of the needs entry is to delay the summary until the guard finishes.

That matters because this workflow deliberately funnels every job into one aggregate check; if Tests summary is the required status check, a future orphaned test project produces a red Check test project matrix is exhaustive job inside an otherwise-green required check, which is precisely the "silently never runs" failure mode this PR exists to close. Adding it to needs shows the gating was intended, so this reads as an oversight rather than a choice.

Suggested change
needs: [tests, tests-spec, tests-chunked, nethtest, matrix-guard]
needs: [tests, tests-spec, tests-chunked, nethtest, matrix-guard]

…plus the matching line in the assertion:

            "${{ needs.matrix-guard.result }}" == "success" && \

(If the intent really is that the guard is advisory and gated only as its own check, dropping it from needs and saying so in a comment would be clearer than the current half-wired state.)

# Intentional exclusions:
# - Nethermind.Precompiles.Benchmark.Test: lives in Benchmarks.slnx only, not built by the test artifact
# - Ethereum.Blockchain.Pyspec.Test: superseded by the nethtest job (see run-nethtest.yml)
allowlist="Nethermind.Precompiles.Benchmark.Test Ethereum.Blockchain.Pyspec.Test"

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.

The Ethereum.Blockchain.Pyspec.Test allowlist rationale is only true for part of the project, and allowlisting it permanently hides a real orphan.

"superseded by the nethtest job" holds for the fixture-driven fixtures (PyspecTestFixture.cs — those are CiRunnerGuard-gated and their coverage did move to run-nethtest.yml). It does not hold for the plain unit tests that live in the same assembly:

  • ZkEvmFixtures/ZkEvmBlockchainTests.cs:89 StatelessSchemaTests — no CiRunnerGuard, no [Explicit]: Revision_1_schema_roundtrips (6 cases), Request_struct_conversion_roundtrips (5 cases), plus the [TestCase(0x0f01)] / [TestCase(10UL, 20UL, true)] / [TestCase(BlockchainIds.Gnosis, true)] sets and one bare [Test] at line 180 — roughly 20 cases of stateless-payload schema and ExecutionRequest size assertions.
  • CiSentinelTests.cs:16 — the zero-tests-ran sentinel, which by construction cannot fire if the project is never run.

nethtest drives Nethermind.Test.Runner over fixture JSON; it does not execute this NUnit assembly, and Ethereum.Blockchain.Pyspec.Test appears in no matrix in any of the three test workflows. So these are never-run tests of exactly the class this PR is closing — and this allowlist entry is what will stop the new guard from ever reporting them.

Two options, either fine:

  • Add Ethereum.Blockchain.Pyspec.Test to the tests-spec matrix. It's in EthereumTests.slnx, so the artifact already contains its binaries, and it's not in FIXTURE_PROJECTS, so it needs no submodule. The CiRunnerGuard calls make the fixture fixtures self-skip, CiSentinelTests keeps the run non-empty, and the ~20 unit cases start executing.
  • Or move StatelessSchemaTests into a project that does run, and keep the allowlist entry with the rationale narrowed to "fixture shards only".

Either way the comment should stop implying the whole assembly is covered.

Fix this →

@benaadams

Copy link
Copy Markdown
Member Author

@claude re-review

@claude

claude Bot commented Aug 6, 2026

Copy link
Copy Markdown
Contributor

Claude finished @benaadams's task in 1m 50s —— View job


Re-review: ci: run orphaned Nethermind test projects in the test matrix

  • Check for new commits since the last review
  • Re-verify the two open Mediums against the current tree
  • Re-check CI status
  • Post review

No new commits since my last pass. HEAD is still c51732a (the same commit I reviewed at 06:45); git diff against the merge base 9260034 is unchanged at +36/−8 across the same 4 files. Both Mediums from that review are still present in the tree, verbatim. Everything else I verified previously still holds, and all 20 workflow runs are green.


Still open

Medium 1 — matrix-guard is in needs but not in the assertion. .github/workflows/nethermind-tests.yml:402 lists it in needs; the [[ ]] at L408–413 still covers only tests / tests-spec / tests-chunked / nethtest:

needs: [tests, tests-spec, tests-chunked, nethtest, matrix-guard]   # L402
...
[[ \
  "${{ needs.tests.result }}" == "success" && \
  "${{ needs.tests-spec.result }}" == "success" && \
  "${{ needs.tests-chunked.result }}" == "success" && \
  "${{ needs.nethtest.result }}" == "success" \
]]                                                                  # L408–413

A guard failure therefore leaves Tests summary green; the needs entry only delays the summary. In a workflow that funnels everything into one aggregate check, the next orphan shows up as a red job inside a green required check — the exact silent-pass this PR exists to close. One line:

  "${{ needs.matrix-guard.result }}" == "success" && \

Medium 2 — the Ethereum.Blockchain.Pyspec.Test allowlist entry hides a real orphan. L386's rationale ("superseded by the nethtest job") is true for the CiRunnerGuard-gated fixture fixtures in PyspecTestFixture.cs, but not for the plain NUnit tests in the same assembly. Re-confirmed against the tree just now — ZkEvmFixtures/ZkEvmBlockchainTests.cs:90 StatelessSchemaTests has no guard and no [Explicit], and carries ~20 cases (6 ProtocolFork cases at L92–97, 5 ExecutionRequestType size cases at L118–122, the [TestCase(0x0f01)]/[TestCase(10UL, 20UL, true)]/BlockchainIds sets, a bare [Test] at L180), plus CiSentinelTests.cs. nethtest drives Nethermind.Test.Runner over fixture JSON and never loads this assembly, and the project appears in no matrix in any of the three test workflows. Adding it to tests-spec suffices — it's in EthereumTests.slnx, is not a FIXTURE_PROJECTS member (L200), the fixture fixtures self-skip, and CiSentinelTests keeps the run non-empty.

The three Lows (-checked drift, the *.Test-only glob, flow-style exclude:) are unchanged and remain non-blocking; details in my previous review.

CI

All 20 runs on c51732a completed successfully — Nethermind/Ethereum tests, Code Lint, Build solutions, Nethermind extra test variants, Integration tests (E2E), and the rest. 0 failures, 0 pending. The 14 new test jobs and Check test project matrix is exhaustive are green, which is the verification the PR body asked for.

Verdict

What this PR adds is correct and passing — the ~348 newly wired tests do execute on both Linux arches, and the guard produces no false positives on the real tree. The two Mediums are both about the guard's own effectiveness rather than about anything currently broken, and neither has been acknowledged with a rationale, so I'm keeping the same call as last time: not blocking on correctness, but Finding 1 is a one-line change and Finding 2 is one matrix line plus a narrowed comment, and together they're the difference between a guard that prevents the next instance and one that documents this one.

I can't push the workflow change myself — GitHub App permissions don't allow modifying files under .github/workflows (FAQ). Both fixes are quoted above ready to paste.


· branch test-hygiene/wire-orphan-test-projects-into-ci ·

The guard job sat in needs but not in the result conjunction, so a
guard failure left the summary green. The Pyspec allowlist comment now
states what stays unwired and why: test discovery loads the full
fixture sets, so a tests-spec run exceeds the job timeout.
CiSentinelTests is scaffolding for filtered-out runs, not coverage.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants