Skip to content

Verification gate has grown to meet its own 90-minute timeout — required check now fails ~half the time #350

Description

@avrabe

The Verification gate (rivet-driven) is a required check whose runtime has converged on its own timeout-minutes: 90. It is now a coin flip.

Evidence

PR branch gate outcome
#344 feat/verification-weak-evidence-census failure at 1h30m21s — i.e. killed at the 90-minute limit
#344 (earlier attempt) cancelled
#344 (earlier attempt) success
#342 fix/verification-gate-zero-match failure ×2
#343 perf/verification-named-tests success ×2
#340 feat/rel-p01-draft-then-finalize success at ~1h3m

Same sweep (156 artifacts), durations from ~63 min to ≥90 min. The variance is wider than the headroom, so the outcome is decided by runner load rather than by whether anything is actually wrong.

Why this is worse than a slow gate

  1. It is indistinguishable from a real failure at a glance. A timeout surfaces as fail; you have to read the duration to tell. That already cost a diagnosis cycle this week.
  2. It trains re-running a red safety gate. The action that "works" is hitting re-run — precisely the reflex that gets a genuine failure clicked through.
  3. It blocks the PRs trying to improve it. perf(verify): name the tests 5 falcon-core verification steps actually rely on #343 (which speeds the sweep up) and fix(ci): a Verify-Filter matching zero artifacts must not pass the gate #342 (which fixes a fail-open hole) both have to pass this gate to land.

Where the time goes — measured, partially

  • cargo test -p falcon-core is 60 tests / 51s and was invoked per sweep as a whole-crate step ≈ 408s. perf(verify): name the tests 5 falcon-core verification steps actually rely on #343 converts 5 of those (measured 306s → 31s).
  • But the other top whole-crate crates are cheap: relay-mavlink 5s, relay-rate 1s, falcon-sitl-hover <1s. So step conversion alone will not close a 30-minute gap.
  • Caveat: those were measured warm. The sweep spans 64 distinct crates under cargo test with 29 --release steps — two profile-wide compile sets. On a cold runner the dominant cost is almost certainly compilation, not test execution.

I have not measured the compile-vs-test split on the runner itself. That is the next measurement, and it should come before any fix is chosen.

Options, roughly in order of confidence

  1. Raise timeout-minutes (e.g. 90 → 150). Cheapest, stops the false failures immediately, does not weaken the gate — it is being killed, not failing. Buys time to do the real work.
  2. Measure compile vs test on the runner, then attack whichever dominates (cache warming, profile consolidation, or dropping the --release duplicates where they add nothing).
  3. Continue whole-crate → named conversion (perf(verify): name the tests 5 falcon-core verification steps actually rely on #343, part of rivet hygiene: backfill release: fields + convert whole-crate verification steps to named tests #262) — right for traceability regardless, but on current evidence not the wall-clock fix.

Option 1 is a stopgap and should be labelled as one; shipping it without option 2 just moves the cliff.

Related: #262 (whole-crate steps), #345 (a separate unreproducible rivet validate failure in this same gate).

🤖 Generated with Claude Code

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