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
- Run all integration targets:
cargo test $WORKSPACE_EXCLUDES --tests (or --all-targets),
rather than one named target.
- Fix the
payout_ledger_e2e fixture — cutoff inside the 1800 s freshness window.
- 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.
13 of 14 integration test targets never run in CI — and two are red on
mainright nowFound while verifying #578.
bins/ghost-pool/tests/payout_ledger_e2e.rshas 2 failing tests onunmodified
main(9b7e356d6), and CI is green, because CI never runs that file.What CI runs
.github/workflows/ci.yml:--lib --binsdoes not buildtests/integration targets, and--test integrationnames a singleone. Everything else is invisible.
What exists
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)
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:
The test builds its cutoff at
Utc::now() - 3_600(line 113) whilePRE_GATE_FRESHNESS_SECS = 1800(payout.rs:432) rejects anything older than 30 minutes. Thefixture 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_HEIGHTraised abovePAYOUT_TOLERANCE_V2_HEIGHT(960_106).Suggested fix
cargo test $WORKSPACE_EXCLUDES --tests(or--all-targets),rather than one named target.
payout_ledger_e2efixture — cutoff inside the 1800 s freshness window.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.