Skip to content

docs(ci): two ways to attribute a red that reachability cannot settle - #2873

Merged
rbuergi merged 1 commit into
mainfrom
docs/attributing-a-red-when-reachability-cannot-exonerate
Aug 31, 2026
Merged

rbuergi merged 1 commit into
mainfrom
docs/attributing-a-red-when-reachability-cannot-exonerate

Conversation

@rbuergi

@rbuergi rbuergi commented Aug 31, 2026

Copy link
Copy Markdown
Contributor

Docs only. Conserving tonight's triage findings as a committed page rather than leaving them in issue comments.

ReadingCiSignals.md already tells you to attribute by reachability before adjacency. That only ever answers no. Two additions for the cases it cannot settle:

1. When reachability cannot exonerate you, ask whether your path EMITTED anything.

#2868 changed four assemblies that MeshWeaver.Graph.Test depends on, with a real mechanism to worry about — the change moved a callback onto a different thread. The graph said nothing. This did:

the changed path's tags in the failing test's own output:   0
the same tags elsewhere in that shard:                     30

A change cannot hang a test through a branch the test never takes. Zero-against-thirty is positive evidence, not an absence of it — the thirty prove the grep works. Re-running confirmed it afterwards, which is the point: a re-run whose result you can predict is a confirmation; one you cannot is a coin toss.

2. A host-cap kill destroys the hung test's transcript; a methodTimeout kill keeps it.

how it dies transcript of the test that hung
host cap (exit=124, HOST_CRASHED) destroyed
xUnit methodTimeout written in full

The ambient hang family therefore erases its own defining artefact — an investigation that waits for a CI occurrence and reads the artifacts reads everything except the thing that hung. A crashed shard held 21 Dropping StreamEndedEvent and 3 ADVANCE_WITHOUT_HANDOFF while the hung test's name appeared nowhere. Hunt the method-timeout instances, which carry the window intact and are routinely discarded as ordinary flakes. One found the same night put the pair 12 ms apart on the same path, then 25 s of silence — /debug's signature for a dropped reactive emission rather than a lock.

Verified: MeshWeaver.Documentation and MeshWeaver.Documentation.Test build -c Release -warnaserror at 0 Warning(s) 0 Error(s); the full MeshWeaver.Documentation.Test suite is 132/132. Link form matches the file's existing /Doc/Architecture/… convention and the target exists.

🤖 Generated with Claude Code

Conserving tonight's triage findings as a committed page rather than leaving
them in issue comments (AGENTS.md: work products get committed).

ReadingCiSignals.md already says to attribute by REACHABILITY before adjacency.
That only ever answers NO. Two additions for the cases it cannot settle:

1. When the failing test's project DOES reference everything the diff touched —
   and a plausible mechanism exists — ask whether the changed path EMITTED
   anything in that test. Measured on #2868: 0 tags in the failing test's own
   output against 30 elsewhere in the shard. Zero-against-thirty is positive
   evidence the branch was not entered, because the thirty prove the grep works.
   A change cannot hang a test through a branch the test never takes.

   Corroboration in the same breath: two UNRELATED PRs red in the same window on
   different tests and shards is an ambient population, not either diff.

2. A host-cap kill (exit=124 / HOST_CRASHED) DESTROYS the transcript of the very
   test that hung; an xUnit methodTimeout kill writes it in full. So the ambient
   hang family erases its own defining artefact — an investigation that reads a
   crashed shard's artifacts reads everything except the thing that hung. Hunt
   the method-timeout instances, which are routinely discarded as flakes and
   carry the window intact. Includes the 2026-08-31 window where
   Dropping StreamEndedEvent and ADVANCE_WITHOUT_HANDOFF land 12 ms apart on the
   same path, then 25 s of silence — /debug's signature for a dropped reactive
   emission rather than a lock.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Copilot AI lite review requested due to automatic review settings August 31, 2026 04:50

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

Adds two documentation heuristics to improve CI-red attribution in cases where dependency reachability can’t eliminate a suspect change, by focusing on whether the changed path actually emitted logs in the failing test and on which termination mode preserves useful artifacts.

Changes:

  • Document a log-emission check (“did the changed path emit anything in the failing test?”) as positive evidence for/against causal involvement when reachability can’t decide.
  • Document the artifact difference between host-cap kills vs xUnit methodTimeout (transcript destroyed vs preserved) and how that should steer investigation toward method-timeout instances.

💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

@github-actions

Copy link
Copy Markdown
Contributor

Test Results (shard 0)

792 tests   788 ✅  4m 29s ⏱️
  7 suites    4 💤
  7 files      0 ❌

Results for commit a7157d9.

@github-actions

Copy link
Copy Markdown
Contributor

Test Results (shard 4)

1 090 tests   1 090 ✅  5m 30s ⏱️
    7 suites      0 💤
    7 files        0 ❌

Results for commit a7157d9.

@github-actions

Copy link
Copy Markdown
Contributor

Test Results (shard 1)

951 tests   951 ✅  5m 26s ⏱️
  7 suites    0 💤
  7 files      0 ❌

Results for commit a7157d9.

@github-actions

Copy link
Copy Markdown
Contributor

Test Results (shard 5)

    8 files      8 suites   5m 53s ⏱️
1 535 tests 1 534 ✅ 1 💤 0 ❌
2 228 runs  2 227 ✅ 1 💤 0 ❌

Results for commit a7157d9.

@github-actions

Copy link
Copy Markdown
Contributor

Test Results (shard 2)

3 030 tests   2 838 ✅  6m 17s ⏱️
    8 suites    192 💤
    8 files        0 ❌

Results for commit a7157d9.

@github-actions

Copy link
Copy Markdown
Contributor

Test Results (shard 3)

1 186 tests   1 186 ✅  8m 4s ⏱️
    7 suites      0 💤
    7 files        0 ❌

Results for commit a7157d9.

@github-actions

Copy link
Copy Markdown
Contributor

Test Results

   44 files     44 suites   35m 43s ⏱️
8 584 tests 8 387 ✅ 197 💤 0 ❌
9 277 runs  9 080 ✅ 197 💤 0 ❌

Results for commit a7157d9.

@rbuergi
rbuergi added this pull request to the merge queue Aug 31, 2026
Merged via the queue into main with commit 13e1490 Aug 31, 2026
26 checks passed
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