Skip to content

ci: Kani Proofs fails ~58% with exit 143 and has never passed on a push to main #839

Description

@avrabe

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:

  1. 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.
  2. 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.
  3. 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).

Activity

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions