You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
One supervised live session that proves the whole three-tier story end-to-end on calibration, with no Lotus anywhere in the stack: Lantern boots without a snapshot, stays in sync, serves a real Curio binary, produces a block, and runs the PDP flow. This is the release gate for v1.9.0 final, and the acceptance evidence for #90, #94 and #76 in one run.
Every checkbox below carries an explicit Test / Pass / Evidence so a tick is never a vibe — it's a measurement posted as a comment.
Ground rules
Our node is part of what keeps calibration stable. The soak node runs alongside existing infra, never replacing a production component until its phase has passed. No experiment may disrupt the network: block production uses our own miner identity, PDP uses our own datasets.
Rollback is always one step: stop the soak binary, existing infra unaffected.
Every phase gets its numbers written into the issue as a comment (counters, epochs, tx hashes) - this document is the evidence trail.
Node under test is always the soak Lantern (127.0.0.1:1235), never the Lotus-backed production stack running alongside.
Tier matrix — Light / PDP / Full
The three tiers are one binary + two dials (retention, verification). They differ, so the soak exercises each where it diverges rather than running three identical soaks.
Full is the end-to-end superset. Light and PDP get targeted differential checks (boot, footprint, cache present/absent, validation on/off, corroboration default). Each tier's boot is its own checkbox in Phase 1.
Test: build with the experiment flag; curl /debug/pprof/goroutineleak.
Pass: endpoint responds; profile parses.
Evidence: deferred; only built if we want the Phase-5 leak data point.
Full tier selected (nodeprofile Full), FullValidation on, observe mode (not fatal)
Test:lantern node-type full; on next boot the log prints full block validation ON (observe mode, #90).
Pass:node-profile.json has tier=full; FullValidation() true; validator wired non-fatal.
Evidence: ✅ { "tier": "full", "allow_block_submit": true } staged for Phase-1 boot (comment #4864626157). Boot-log line confirmed at Phase 1.
Bridge-off config: NoFallbackRPC / no Glif; gateway configured only if a phase explicitly tests fallback
Test: launch with the explicit no-RPC-fallback head source; grep launch flags + startup log for the head-source mode; confirm no Glif endpoint configured.
Pass: head source = live gossip/quorum only, no silent RPC fallback; gateway present only as last-resort cold-block fetch (not head).
Settlement/payment rails exercised where applicable; record txs
Test: run any applicable settlement path.
Pass: settlement tx lands.
Evidence: tx hashes.
Phase 5a — Block production (zero Lotus; Forest as VM bridge; Full tier) — v1.9.0 gate
Honest scope: this binary has no pure-Go FVM (#89). Creating a block requires the post-execution ParentStateRoot, which is an FVM execution. So block production uses an external VM bridge = Forest for that state root only. Everything else (base info, ticket/election, block assembly, gossip submit, all reads/validation) is Lantern. This proves we are not Lotus-locked, not that we are zero-external. Uses our own miner identity.
MinerGetBaseInfo / MinerCreateBlock / SyncSubmitBlock served by Lantern, VM bridge = Forest for the post-execution state root
Test: exercise the three miner RPCs via Curio→Lantern with --vm-bridge-rpc <forest>.
Pass: all three return correct data; only the state-root call touches Forest.
Evidence: RPC traces; confirm Forest is the sole external touch.
Winning epoch produces a block: created, submitted, lands on calibration and propagates (seen by an independent node)
Test: at a winning epoch, create + submit a block on our identity.
Pass: block lands and is seen by an independent node.
Bridge outage drill: kill Forest bridge → reads keep working (bridge is production-only), alarms fire, block production degrades gracefully and resumes when bridge returns
Test: query the leak profiler post-soak (only if the leak build was used).
Pass: no leaked goroutines.
Evidence: profile summary.
Phase 5b — Zero-external block production (#89, pure-Go FVM) — NOT v1.9.0; future gate
The real full-node claim: compute the post-execution state root in-process, pure-Go FVM (wazero), so block production needs zero external VM (no Forest, no Lotus). This is gated on #89 Stage C and is explicitly out of scope for v1.9.0. Tracked here so we never overclaim "full node" while Phase 5a still leans on Forest.
Phase 5b / Stage C: pure-Go FVM via wazero (remove filecoin-ffi dep #2) #89 remains open — v1.9.0 is honestly "bridge-off reads + observe-validation + PDP; block production still needs an external VM (Forest, not Lotus)." Zero-external block production is the next milestone, not this release.
Any failure: file the specific issue, fix, re-run only the failed phase
Goal
One supervised live session that proves the whole three-tier story end-to-end on calibration, with no Lotus anywhere in the stack: Lantern boots without a snapshot, stays in sync, serves a real Curio binary, produces a block, and runs the PDP flow. This is the release gate for v1.9.0 final, and the acceptance evidence for #90, #94 and #76 in one run.
Every checkbox below carries an explicit Test / Pass / Evidence so a tick is never a vibe — it's a measurement posted as a comment.
Ground rules
127.0.0.1:1235), never the Lotus-backed production stack running alongside.Tier matrix — Light / PDP / Full
The three tiers are one binary + two dials (retention, verification). They differ, so the soak exercises each where it diverges rather than running three identical soaks.
Full is the end-to-end superset. Light and PDP get targeted differential checks (boot, footprint, cache present/absent, validation on/off, corroboration default). Each tier's boot is its own checkbox in Phase 1.
Setup
lantern versiongit describeon the running binary; confirm all five PRs are in the commit.3021887,lantern v1.9.0-rc1-11-g3021887(comment #4864587138).GOEXPERIMENT=goroutineleakprofilefor the leak check in Phase 5 (Move toolchain to Go 1.26.x (Green Tea GC default, heap ASLR, goroutine-leak profiler) #102 follow-up) — deferred to Phase 5 (optional; avoid resetting the sustained-sync clock)curl /debug/pprof/goroutineleak.nodeprofileFull), FullValidation on, observe mode (not fatal)lantern node-type full; on next boot the log printsfull block validation ON (observe mode, #90).node-profile.jsonhastier=full;FullValidation()true; validator wired non-fatal.{ "tier": "full", "allow_block_submit": true }staged for Phase-1 boot (comment #4864626157). Boot-log line confirmed at Phase 1.NoFallbackRPC/ no Glif; gateway configured only if a phase explicitly tests fallback--vm-bridge-rpcat Forest; confirm it is Forest (version string), not the prod Lotus.--vm-crosscheckenabled (FVM cross-check mode: use the VM bridge as an auditor (state-root divergence alarm) #98, landed): the auditor rides the same Forest bridge--vm-crosscheck --vm-bridge-rpc <forest>; watch the cross-check card/counter.curlthe--metricsdashboard/dev page over the tunnel.Phase 1 — Snapshot-free boot (per tier)
tier=light, time from process start to live head.tier=pdp, confirm persistent cache dir created and populated.tier=full; confirmfull block validation ON (observe mode)log line.Phase 2 — Sustained sync (24h minimum, Full tier)
gossip.last_install_epochvs wall-clock epoch over 24h.fullvalidateobserve counters: 100% agreement, zero validation failures on canonical blocks (Full-node tier: pure-Go block-validation pipeline + tunable resident state #90 evidence)held_uncorroblow and non-wedging, heads adopt within secondswindow_epochsgrows with uptime; computed ec-finalized epoch tracks F3 plausiblyPhase 3 — Curio binds (real binary, no Lotus; PDP/Full tier)
FULLNODE_API_INFO=<soak Lantern :1235>; start it.Phase 4 — PDP end-to-end (PDP tier, our own datasets)
Phase 5a — Block production (zero Lotus; Forest as VM bridge; Full tier) — v1.9.0 gate
MinerGetBaseInfo/MinerCreateBlock/SyncSubmitBlockserved by Lantern, VM bridge = Forest for the post-execution state root--vm-bridge-rpc <forest>.fullvalidate+ is adopted by our own head path/debug/pprof/goroutineleakclean after the full soakPhase 5b — Zero-external block production (#89, pure-Go FVM) — NOT v1.9.0; future gate
MinerCreateBlockcomputesParentStateRootvia pure-Go FVM; no--vm-bridge-rpc; block lands on calibrationExit criteria
Phases 1-4 + 5a checked, numbers posted as comments. Then:
Related: #87 (epic), #100 (head-trust epic), #89 (pure-Go FVM, Phase 5b gate), PR #101, PR #103.