Conversation
…skipped-work count (REQ-316, #973) Closes #973. On PR #970's job 105030664579 the assertion step `Check surviving mutants` failed with 4 missed mutants and the work around it (`Run cargo-mutants` succeeded, `Upload mutants report` succeeded) — but the trailing GitHub-scheduled `Post Run Swatinem/rust-cache@v2` step was `skipped`, as it always is once any earlier step fails, and `skipped_after` counted it. `classify_failure` returned `setup-failed`, which is the misdiagnosis this classifier was written to prevent (REQ-316/REQ-317) reached from the other side: the work did run, and its own assertion said the change was bad. Fix: the skipped-after count excludes steps whose name begins with `Post `. Those are the runner's own per-action cleanup hooks (GitHub schedules and names them; users cannot). Only a NON-`Post ` skipped step is evidence that the workflow's real work never ran. The existing Kani case still classifies as `setup-failed`: its skipped work step is `Run cargo kani -p rivet-core`, which is a workflow step, not a `Post ` hook. A new mixed case pins that behaviour — a setup failure followed by both the skipped work step AND a skipped `Post …` still reads as `setup-failed`, so the new exclusion cannot silence a genuine setup failure. Two cases added to `diagnose_test.sh`, both derived from real incidents: - the #973 reproduction (assertion failed, only `Post` cleanup skipped after) — expects `job-failed` - setup failure with a `Post …` skip trailing the real skip — expects `setup-failed` Reverting the fix while keeping the tests reddens exactly the #973-derived case and leaves every other case green; the whole file runs 41 cases green with the fix in place. Fixes: REQ-316 Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01T1QYjjHmT5DQU6EMuEVq8V
There was a problem hiding this comment.
⚠️ Performance Alert ⚠️
Possible performance regression was detected for benchmark 'Rivet Criterion Benchmarks'.
Benchmark result of this commit is worse than the previous benchmark result exceeding threshold 1.20.
| Benchmark suite | Current: d302719 | Previous: f16245a | Ratio |
|---|---|---|---|
store_lookup/100 |
1941 ns/iter (± 4) |
1606 ns/iter (± 10) |
1.21 |
store_by_type/100 |
96 ns/iter (± 0) |
76 ns/iter (± 0) |
1.26 |
store_by_type/1000 |
96 ns/iter (± 0) |
76 ns/iter (± 0) |
1.26 |
store_by_type/10000 |
96 ns/iter (± 0) |
76 ns/iter (± 0) |
1.26 |
diff/1000 |
708535 ns/iter (± 3190) |
581112 ns/iter (± 7534) |
1.22 |
query/100 |
1117 ns/iter (± 18) |
910 ns/iter (± 14) |
1.23 |
query/1000 |
14112 ns/iter (± 25) |
11672 ns/iter (± 131) |
1.21 |
This comment was automatically generated by workflow using github-action-benchmark.
|
Kani Proofs failed — not this PR's failure, standing down on it.
Keeping the PR watched. If any other check on this PR reddens I will act on it; this one is documented and left as-is. Generated by Claude Code |
|
Criterion regression alert — cannot be caused by this PR's diff, so no push from here.
Keeping the PR watched. Everything else on head Generated by Claude Code |
Closes #973.
What
classify_failureintools/ci-diagnose/diagnose.shcounted every skipped step after the first failed step as evidence that the real work never ran, and returnedsetup-failed. GitHub's per-actionPost …cleanup hooks are scheduled by the runner after the workflow's own steps and are routinely markedskippedonce any earlier step has failed. That is why PR #970's job 105030664579 misclassified:The assertion step failed, the report was uploaded, and only the runner's own cleanup was skipped.
classify_failurereturnedsetup-failed, which is the misdiagnosis this classifier exists to prevent (REQ-316/REQ-317), reached the other way — the work did run, and its own check said the change was bad.Fix
Exclude any step whose
namestarts withPostfromskipped_after. Those are the runner's own cleanup hooks (GitHub schedules and names them; users cannot). APostskip is not evidence the workflow's work never ran; only a non-Postskipped step is.Acceptance criteria (from #973)
Post …steps fromskipped_after. Thestartswith("Post ")guard on.nameis the only change to the classifier.diagnose_test.shand it classifies asjob-failed.assertion failed, only Post cleanup skipped— reduced from PR fix(yaml): multi-line plain scalars were truncated at their first line on the rowan read path (REQ-363) #970's job 105030664579.setup-failed. The skipped work step there isRun cargo kani -p rivet-core, which is a workflow step and not aPosthook, so the existing case is unchanged. A new mixed case (setup failed with a Post skip still after it) also pins that aPostskip trailing a real skipped work step cannot silence the setup failure — the exclusion is safe.Evidence
41 cases green with the fix, and stashing the classifier change while keeping the tests reddens exactly the one new #973-derived case:
The rest of the file (classify_stall, normalize_runner_fetch, workflow-needs.py, the liveness cases) is untouched.
🤖 Generated with Claude Code
https://claude.ai/code/session_01T1QYjjHmT5DQU6EMuEVq8V
Generated by Claude Code