Summary
Kani Proofs fails roughly 58% of the time and has not succeeded once on a
push to main in the sampled window. Exit code is always 143 (SIGTERM).
It is continue-on-error: true and is not among ci-gate's needs, so it
blocks nothing — which is exactly why it has been merged past repeatedly today
without anyone establishing what is actually killing it.
Data — last 15 CI runs
| conclusion |
count |
durations |
| success |
5 |
454, 457, 468, 484, 500 s |
| failure |
7 |
270, 283, 344, 345, 368, 375, 460 s |
| cancelled |
2 |
3300, 3301 s |
The distribution is bimodal. Successes cluster tightly at 454–500 s; six of
seven failures die at 270–375 s — before the work would have completed. This
is not a uniform random kill.
Split by event:
| event |
success |
failure |
cancelled |
push → main |
0 |
4 |
2 |
pull_request |
4 |
3 |
0 |
schedule |
1 |
0 |
0 |
Ruled out
- Not a job timeout.
timeout-minutes: 45; failures die at ~5 minutes.
- Not concurrency cancellation.
cancel-in-progress is
${{ github.event_name == 'pull_request' }}, yet push-to-main runs fail
too — and those would report cancelled, not failure.
- Not a proof regression. The failing step is the
model-checking/kani-github-action@v1 step itself; cargo kani -p rivet-core
is skipped afterwards, so verification never starts.
Not established
What sends the SIGTERM. Worth noting that the evidence is inconsistent:
some failures log ##[error]The runner has received a shutdown signal (e.g.
the run on #813), others log only Process completed with exit code 143 with no
shutdown line (the run on #836). If it were purely hosted-runner reclaim I would
expect that message consistently.
Candidates for whoever picks this up:
- OOM inside CBMC. Kani is memory-hungry and
ubuntu-latest is modest. A
kernel OOM-kill is normally SIGKILL/137, but a wrapper script can translate
it to 143 — check dmesg/runner diagnostics, or add /usr/bin/time -v.
- An internal timeout in the action. The action's own script references a
cargo timeout investigation; it may impose a bound well under our 45 min.
- Hosted-runner reclaim, which would fit the message-bearing subset.
The PR path runs -p rivet-core --only-codegen while main runs the full
27-harness suite; that main/PR asymmetry lines up with main never passing, and
is the first thing to probe.
Why it matters even though it blocks nothing
A gate that fails 58% of the time trains everyone to merge past it. I did so
four times today, and each time the justification had to be re-derived. Either
it should be reliable enough to be a signal, or it should be explicitly marked
advisory and moved off the PR surface so it stops costing attention.
Related: #299 decoupled kani from needs:[test]; #509 covers self-hosted pool
liveness (kani is on ubuntu-latest, so a different surface).
Summary
Kani Proofsfails roughly 58% of the time and has not succeeded once on apush to
mainin the sampled window. Exit code is always 143 (SIGTERM).It is
continue-on-error: trueand is not amongci-gate'sneeds, so itblocks nothing — which is exactly why it has been merged past repeatedly today
without anyone establishing what is actually killing it.
Data — last 15 CI runs
The distribution is bimodal. Successes cluster tightly at 454–500 s; six of
seven failures die at 270–375 s — before the work would have completed. This
is not a uniform random kill.
Split by event:
push→ mainpull_requestscheduleRuled out
timeout-minutes: 45; failures die at ~5 minutes.cancel-in-progressis${{ github.event_name == 'pull_request' }}, yetpush-to-mainruns failtoo — and those would report
cancelled, notfailure.model-checking/kani-github-action@v1step itself;cargo kani -p rivet-coreis
skippedafterwards, so verification never starts.Not established
What sends the SIGTERM. Worth noting that the evidence is inconsistent:
some failures log
##[error]The runner has received a shutdown signal(e.g.the run on #813), others log only
Process completed with exit code 143with noshutdown line (the run on #836). If it were purely hosted-runner reclaim I would
expect that message consistently.
Candidates for whoever picks this up:
ubuntu-latestis modest. Akernel OOM-kill is normally SIGKILL/137, but a wrapper script can translate
it to 143 — check
dmesg/runner diagnostics, or add/usr/bin/time -v.cargo timeout investigation; it may impose a bound well under our 45 min.
The PR path runs
-p rivet-core --only-codegenwhilemainruns the full27-harness suite; that main/PR asymmetry lines up with main never passing, and
is the first thing to probe.
Why it matters even though it blocks nothing
A gate that fails 58% of the time trains everyone to merge past it. I did so
four times today, and each time the justification had to be re-derived. Either
it should be reliable enough to be a signal, or it should be explicitly marked
advisory and moved off the PR surface so it stops costing attention.
Related: #299 decoupled kani from
needs:[test]; #509 covers self-hosted poolliveness (kani is on
ubuntu-latest, so a different surface).