Skip to content

CI never runs 13 of 14 integration test targets — payout_ledger_e2e has been red on main unnoticed #580

Description

@defenwycke

13 of 14 integration test targets never run in CI — and two are red on main right now

Found while verifying #578. bins/ghost-pool/tests/payout_ledger_e2e.rs has 2 failing tests on
unmodified main
(9b7e356d6), and CI is green, because CI never runs that file.

What CI runs

.github/workflows/ci.yml:

- name: Run unit tests
  run: cargo test $WORKSPACE_EXCLUDES --lib --bins     # excludes tests/ targets entirely

- name: Run integration tests
  run: cargo test --test integration                   # ONE named target

--lib --bins does not build tests/ integration targets, and --test integration names a single
one. Everything else is invisible.

What exists

bins/ghost-pool/tests/empty_template_e2e.rs
bins/ghost-pool/tests/fleet_rehearsal.rs
bins/ghost-pool/tests/payout_ledger_e2e.rs          <- 2 failing on main
bins/wraith-coordinator/tests/bond_e2e.rs
bins/wraith-coordinator/tests/gossip.rs
bins/wraith-coordinator/tests/router.rs
crates/ghost-consensus/tests/mesh_onboarding_fanout.rs
crates/ghost-consensus/tests/mpc_mesh_dispatch.rs
crates/ghost-mpc/tests/mpc_lifecycle.rs
crates/ghost-reaper/tests/backtest_computational_only.rs
crates/ghost-reaper/tests/backtest_mainnet.rs
crates/ghost-reaper/tests/backtest_simulator_delta.rs
crates/ghost-verification/tests/identity_tls_handshake.rs
crates/mpc-xproc-harness/tests/xproc.rs

These are the highest-value tests in the repo — end-to-end payout ratification, mesh onboarding,
MPC lifecycle, reaper backtests, TLS identity — and they are exactly the ones not gating anything.

This is the same class as #530 (feature-gated modules compiled but untested), which the CI file
itself documents. The fix there named the missing features; the integration targets were missed.

The two failures (triaged — NOT a production bug)

block_win_is_ratified_and_pays_every_miner_the_ledger_owes
share_arriving_after_the_cutoff_does_not_break_ratification

GHOST-02: 0/8 nodes approved, quorum needs 6 — the fleet would reject its own
payout and the coinbase would fall back to paying pool_payout_address

Alarming on its face — this is the coinbase-split approval path that runs when the pool wins a
block
, and per #556 the fleet has not won one since 2026-06-02, so production has not exercised it
in two months.

It is a stale fixture, not a live defect:

node rejected the payout: pre-gate proposal timestamp 1785476925 not within 1800s of now 1785480528

The test builds its cutoff at Utc::now() - 3_600 (line 113) while
PRE_GATE_FRESHNESS_SECS = 1800 (payout.rs:432) rejects anything older than 30 minutes. The
fixture predates that rule. Production proposals are stamped fresh, so the live path is unaffected.

I also verified it is not gate-related: still fails with BLOCK_HEIGHT raised above
PAYOUT_TOLERANCE_V2_HEIGHT (960_106).

Suggested fix

  1. Run all integration targets: cargo test $WORKSPACE_EXCLUDES --tests (or --all-targets),
    rather than one named target.
  2. Fix the payout_ledger_e2e fixture — cutoff inside the 1800 s freshness window.
  3. Expect others in that list to be red too; they have not gated anything in a long time. Worth
    triaging before switching the job to blocking, so it can go green and stay green.

The general rule this keeps violating: a check that never runs cannot fail. Same root as #555,
#563, #564 and #530.

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

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions