Repository navigation
[Soak] Calibration dress rehearsal: snapshot-free boot, sustained sync, block production, PDP — zero Lotus (v1.9.0 final gate) #104
Description
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
- 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.
| Tier | Retention | Validation | Head corroboration | Block submit | Soak coverage |
|---|---|---|---|---|---|
| Light | in-memory (~1 GB) | none | off (divergence monitor + fork choice) | no | Phase 1 boot + read-serve + zero-Glif check |
| PDP | persistent 2-5 GB cache | none | off | opt-in | Phase 1 boot + Phases 3-4 (Curio + PDP e2e) |
| Full | persistent cache + full chain surface | observe-mode pure-Go consensus (#90) | 2 distinct peers (auto) | opt-in | Phases 1-2 + Phase 5 (superset) |
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
- Build soak binary from main with feat(#80 part 2, #97): head-source corroboration + per-topic gossipsub scoring #101 (head corroboration + topic scoring), chore(#102): build with Go 1.26.x #103 (Go 1.26.4), feat(#96): FRC-0089 EC finality calculator (observed-data finality) #105 (EC finality), feat(#93): wallet export/import (Lotus hex-KeyInfo) + import-lotus #106 (wallet import), feat(#98): VM-bridge cross-check auditor (observe-only divergence alarm) #107 (VM cross-check) merged; record commit hash +
lantern version- Test:
git describeon the running binary; confirm all five PRs are in the commit. - Pass: version string embeds the main-HEAD commit and all five PRs are merged into it.
- Evidence: ✅ commit
3021887,lantern v1.9.0-rc1-11-g3021887(comment #4864587138).
- Test:
- Optional: soak build with
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)- 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.
- Test: build with the experiment flag;
- Full tier selected (
nodeprofileFull), FullValidation on, observe mode (not fatal)- Test:
lantern node-type full; on next boot the log printsfull block validation ON (observe mode, #90). - Pass:
node-profile.jsonhastier=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.
- Test:
- 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).
- Evidence: exact launch command + startup head-source log line.
- VM bridge target for block production is Forest (never Lotus - the point of this soak)
- Test: stand up a Forest node on calibration; point
--vm-bridge-rpcat Forest; confirm it is Forest (version string), not the prod Lotus. - Pass: bridge RPC answers and self-identifies as Forest; Phase 5 uses only this endpoint for the post-execution state root.
- Evidence: Forest version + RPC URL; note that reads/validation do NOT use it (proven by the Phase-5 outage drill).
- Test: stand up a Forest node on calibration; point
-
--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- Test: launch with
--vm-crosscheck --vm-bridge-rpc <forest>; watch the cross-check card/counter. - Pass: auditor runs each interval, compares local vs Forest state root, zero DIVERGE under normal operation.
- Evidence: cross-check counter + zero-DIVERGE over the window.
- Test: launch with
- Dashboard reachable; note the dev-page URL for stat screenshots
- Test:
curlthe--metricsdashboard/dev page over the tunnel. - Pass: dashboard serves; dev page shows gossip/corroboration/EC-finality/cross-check cards.
- Evidence: dev-page URL + a screenshot reference.
- Test:
Phase 1 — Snapshot-free boot (per tier)
- Light cold start on calibration with no snapshot import: boot from the multi-source F3-finalized anchor quorum
- Test: wipe chain state (keys untouched), boot
tier=light, time from process start to live head. - Pass: reaches tip with no snapshot; in-memory footprint stays ~1 GB.
- Evidence: time-to-tip + RSS.
- Test: wipe chain state (keys untouched), boot
- PDP cold start, snapshot-free, persistent cache provisioned
- Test: boot
tier=pdp, confirm persistent cache dir created and populated. - Pass: reaches tip; disk footprint in the 2-5 GB cache budget.
- Evidence: time-to-tip + cache-dir size.
- Test: boot
- Full cold start, snapshot-free (this is the soak node for Phases 2 & 5)
- Test: boot
tier=full; confirmfull block validation ON (observe mode)log line. - Pass: reaches tip; validator active; footprint single-digit GB.
- Evidence: time-to-tip + footprint after boot and after 1h.
- Test: boot
- If chain/exchange BlockSync port: snapshot-free full-node boot #91 (BlockSync tail-fill) has landed: verify headers-only deep-tail fetch + record header-store depth; if not, note boot anchor depth as the chain/exchange BlockSync port: snapshot-free full-node boot #91 baseline
- Test: inspect header-store depth vs anchor epoch.
- Pass: N/A until chain/exchange BlockSync port: snapshot-free full-node boot #91; record baseline depth now.
- Evidence: anchor epoch + header-store depth.
Phase 2 — Sustained sync (24h minimum, Full tier)
- Head lag ≤ 1 epoch sustained; no wedge across the full window
- Test: sample
gossip.last_install_epochvs wall-clock epoch over 24h. - Pass: lag ≤ 1 epoch at every sample; no stall.
- Evidence: min/median/max lag; sample count.
- Test: sample
-
fullvalidateobserve counters: 100% agreement, zero validation failures on canonical blocks (Full-node tier: pure-Go block-validation pipeline + tunable resident state #90 evidence)- Test: read the observe-mode validator counters over the window.
- Pass: 100% agreement on canonical blocks; zero unexplained failures (non-canonical/orphan disagreements noted, not counted against).
- Evidence: blocks validated / agreed / failed counts.
- Corroboration stats sane (Peer-table eclipse hardening for the head path: pin anchor peers + head-source diversity #80 part 2 / PR feat(#80 part 2, #97): head-source corroboration + per-topic gossipsub scoring #101):
held_uncorroblow and non-wedging, heads adopt within seconds- Test: read corroboration held/adopted counters.
- Pass: heads adopt within seconds; held-uncorroborated never wedges the head.
- Evidence: held vs adopted counts; max hold time.
- Divergence gate: zero false-positive holds during normal operation (Running-head fork choice: heaviest-ParentWeight + periodic re-quorum (not boot-only) #79/feat(#85): header-propagation integrity gate + running-head divergence monitor #86)
- Test: watch divergence-monitor holds.
- Pass: zero false-positive holds on healthy chain.
- Evidence: hold count + any reasons.
- Zero Glif / zero gateway hits in bridge-off mode ([Tracking] Lantern bridge-off parity for stock Curio (maxboom / PR #1311) #76 evidence): fetch counters show cache/bitswap only
- Test: read fetch-source counters (cache / bitswap / gateway / glif) over the window.
- Pass: gateway = 0, glif = 0; all fetches served by cache/bitswap.
- Evidence: per-source fetch counts.
- Peer health: mesh ≥ 6 peers, trusted floor peers still connected at end of window (Peer-table eclipse hardening for the head path: pin anchor peers + head-source diversity #80 part 1)
- Test: sample mesh size + trusted-floor peer connectivity.
- Pass: mesh ≥ 6 throughout; trusted floor peers connected at end.
- Evidence: mesh min/max; floor-peer status.
- EC finality card (Lift FRC-0089 EC finality calculator (lotus chain/ecfinality): observed-data finality without F3 #96): computed 2^-30 depth settles ~30 epochs on healthy calibration;
window_epochsgrows with uptime; computed ec-finalized epoch tracks F3 plausibly- Test: read the EC-finality card over the window.
- Pass: depth ~30 epochs healthy; window grows; ec-finalized tracks F3.
- Evidence: computed depth + window_epochs + ec-finalized vs F3-finalized.
Phase 3 — Curio binds (real binary, no Lotus; PDP/Full tier)
- Stock Curio binary binds the soak Lantern as its chain node; startup clean, no missing-RPC errors
- Test: point a separate soak Curio (not prod) at
FULLNODE_API_INFO=<soak Lantern :1235>; start it. - Pass: Curio starts; zero missing-RPC / method-not-found errors in the chain path.
- Evidence: Curio startup log excerpt; RPC-error count = 0.
- Test: point a separate soak Curio (not prod) at
- Curio chain-facing pages/ops work against Lantern (head, messages, wallet balances)
- Test: drive Curio's chain views/ops.
- Pass: head, messages, balances all render correct values matching Lantern RPC.
- Evidence: side-by-side value spot-checks.
- Message path: send → confirm → receipt through Lantern's mpool (pending → confirmed, rebroadcast if needed)
- Test: send a small self-message via Curio→Lantern; track through mpool.
- Pass: pending → confirmed → receipt, on our own identity.
- Evidence: message CID + confirm epoch + receipt.
- 24h co-run: no RPC-parity regressions logged ([Tracking] Lantern bridge-off parity for stock Curio (maxboom / PR #1311) #76 evidence)
- Test: run the Curio↔Lantern co-run 24h; scan for parity errors.
- Pass: zero RPC-parity regressions.
- Evidence: error scan summary.
Phase 4 — PDP end-to-end (PDP tier, our own datasets)
- add-piece through Lantern-served chain state
- Test: add a piece to our own dataset via Curio→Lantern.
- Pass: piece added, dataset state advances.
- Evidence: dataset id + add-piece tx.
- Prove window: challenge randomness drawn bridge-off (Bridge-off PDP prove fails 'cannot draw randomness from future epoch' — no bridge-off fallback + head lags tip #82 path), proof submitted, on-chain success
- Test: at the prove window, confirm randomness is drawn from live head bridge-off; submit proof.
- Pass: proof tx status 0x1 on calibration.
- Evidence: prove tx hash + epoch; randomness-source log line.
- ≥ 3 consecutive prove windows land without manual intervention (PDP/mid tier (F1): persistent cache + pinning + block-submit + install-time tier [needs live soak] #94 evidence)
- Test: watch three consecutive windows.
- Pass: 3/3 land, zero manual repair.
- Evidence: three tx hashes + epochs.
- 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/SyncSubmitBlockserved 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.
- Test: exercise the three miner RPCs via Curio→Lantern with
- 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.
- Evidence: height + block CID + independent-node confirmation.
- Produced block passes our own
fullvalidate+ is adopted by our own head path- Test: run our observe-validator against our own produced block.
- Pass: passes; adopted by our head.
- Evidence: validator result + head adoption.
- Restart resilience: restart Lantern mid-soak → Curio reconnects, proving resumes, no manual repair
- Test: restart the soak daemon during the run.
- Pass: Curio reconnects; proving resumes automatically.
- Evidence: restart timestamp + resume evidence.
- 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: kill Forest mid-run; verify reads/validation continue; restore.
- Pass: reads/validation unaffected (proves bridge-off reads); production pauses + alarms; resumes on restore.
- Evidence: read continuity during outage + alarm + resume.
- If leak-profile build (Setup Keystore passphrase silently falls back to empty string when LANTERN_PASS is unset #2):
/debug/pprof/goroutineleakclean after the full soak- 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.
- (Blocked on Stage C: pure-Go FVM via wazero (remove filecoin-ffi dep #2) #89)
MinerCreateBlockcomputesParentStateRootvia pure-Go FVM; no--vm-bridge-rpc; block lands on calibration- Test: produce a block with the VM bridge fully disconnected.
- Pass: block lands with a state root computed in-process.
- Evidence: height + CID + confirmation the bridge was down.
Exit criteria
Phases 1-4 + 5a checked, numbers posted as comments. Then:
- Close Full-node tier: pure-Go block-validation pipeline + tunable resident state #90 (observe-mode validated), PDP/mid tier (F1): persistent cache + pinning + block-submit + install-time tier [needs live soak] #94 (PDP tier live), [Tracking] Lantern bridge-off parity for stock Curio (maxboom / PR #1311) #76 (bridge-off parity) with links to the evidence comments
- Ship v1.9.0 final from the soaked commit
- 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
Related: #87 (epic), #100 (head-trust epic), #89 (pure-Go FVM, Phase 5b gate), PR #101, PR #103.
Activity
Reiers commentedon Jul 2, 2026
Setup — checkbox 1: soak binary built from main ✅
Commit:
3021887(main HEAD = merge of #107). Confirms the five soak prerequisites are baked in:Version string (running binary):
lantern v1.9.0-rc1-11-g3021887(git describe→ 11 commits past v1.9.0-rc1, at 3021887).Topology of the soak (evidence trail, per ground rules)
./lantern daemon --network calibration --listen 127.0.0.1:1235 --metrics 127.0.0.1:9092, pid 1023478, cwd~/lantern-soak, on hostdoctor-calibration-techx.lotus daemon, separate process), prod Curio--layers=gui,post,storagerides Lotus. The soak Lantern replaces nothing.ChainHeadreturns a real calibration tipset (head block minerf0143103, our own identity).All subsequent phase numbers in this thread are measured against the soak Lantern on :1235, never the Lotus-backed prod node.
Reiers commentedon Jul 2, 2026
Setup checkbox 2 — deferred (optional). Not building the
GOEXPERIMENT=goroutineleakprofilebinary now: it only feeds the Phase 5/debug/pprof/goroutineleakend-check, and swapping the daemon would reset the Phase 2 sustained-sync clock. Will do a dedicated leak-profile build at Phase 5 if we want that data point. Box left unchecked.Reiers commentedon Jul 2, 2026
Setup — checkbox 3: Full tier + FullValidation observe ✅ (staged for Phase 1 boot)
Before: no profile file → daemon defaulted to
tier=light(FullValidation OFF). So this was NOT satisfied by the running warm-up daemon.Action:
lantern node-type full --network calibration --allow-block-submitResult on disk
~/.lantern/calibration/node-profile.json:{ "tier": "full", "allow_block_submit": true }Read-back:
node-type: full, persistent cache 3072 MiB, block-submit opted in. Takes effect at the next daemon start (the Phase 1 cold boot) — current Light warm-up daemon left running until then. Rollback: delete node-profile.json → Light default.What 'full' actually turns on in this binary (3021887) — honest scope
profile.FullValidation()is true only fortier=full. At boot the daemon wiressync.SetBlockValidator(... fullvalidate.ValidateBlockConsensus ...)in observe mode (not fatal) — logsnode tier: full block validation ON (observe mode, #90). Per-block it re-verifies signature / election VRF / ticket VRF / win-count / miner power against resident F3-anchored state (chainAPI.FullValidateView()), NOT the VM bridge → runs bridge-off.Honest caveat (documented per ground rules)
'full' here does not do native bridge-off FVM state re-execution (needs CGo/filecoin-ffi; #89 Stage C, not in this binary). The source is explicit: full tier 'behaves like PDP with block-submit until the full-node track lands.' Native FVM state is only required for Phase 5 block production, where the VM bridge = Forest supplies the post-execution state root. Phase 2's
fullvalidate observe counters: 100% agreementline is precisely the evidence that resident-state consensus validation actually agrees bridge-off — that's #90's acceptance.Reiers commentedon Jul 2, 2026
Issue restructured (per soak-owner direction, 2026-07-02)
Three changes, no scope loss:
ParentStateRoot.v1.9.0 is therefore claimed honestly: bridge-off reads + observe-validation + PDP; block production still leans on an external VM (Forest, not Lotus). The true zero-external full node is the next milestone (#89), tracked as Phase 5b.
Prior body archived internally; ticked boxes (Setup 1, Setup 3) preserved.
Reiers commentedon Jul 2, 2026
Setup — checkbox 7: dashboard reachable ✅
Test:
curlthe--metricsendpoints on the soak Lantern over the tunnel.Result:
http://127.0.0.1:9092/dashboard/→ HTTP 200http://127.0.0.1:9092/metrics→ HTTP 200Dev-page URL (via tunnel):
http://127.0.0.1:9092/dashboard/(soak Lantern pid 1023478). This is where the gossip / corroboration / EC-finality / VM-crosscheck cards render for the phase screenshots.Note: dashboard bound loopback-only (
127.0.0.1), consistent with #57 (non-loopback bind would require a Bearer token).Reiers commentedon Jul 2, 2026
Setup — checkbox 4: bridge-off / NoFallbackRPC ✅ (capability implemented)
Finding: the running warm-up binary (3021887) had no way to disable Glif — the CLI wired it unconditionally as the last-resort runtime source at 4 sites, and default fallback =
api.calibration.node.glif.io. So a provably Glif-free node wasn't achievable. (Per soak-owner call: build the real thing, not a reworded weaker claim.)Action: implemented
--no-fallback-rpcon the standalone CLI → PR #108.hstore.Sync/net/blockingestnil-guards fire (no Glif client constructed; both become no-ops). Head = gossipsub only.Verified (Test/Pass):
go build+vet+gofmtclean (incl. linux/amd64 cross);hstore+blockingestnil-guard tests pass.lantern.new version=v1.9.0-rc1-12-g896f41b;daemon --helpshows the flag; guard fires on--no-libp2pand empty--p2p-listen.~/lantern-soak/lantern.new(running daemon untouched — still serving HTTP 200).Evidence (runtime log line) captured at Phase 1 when we cold-boot with
--no-fallback-rpcand seebridge-off: no upstream RPC fallback wired (#76); head=gossipsub-only.Honest boundary: the one-time boot anchor (#54) still uses gateway+Glif multi-source agreement — separate from runtime fetch counters. Follow-up #109 filed for anchor Glif-independence. Not a v1.9.0 blocker; runtime bridge-off is proven by Phase 2 counters.
fix(#116): split parent-walk backfill cap from RPC inline cap
feat(devnet): first-class support for local Curio devnet (#122)
feat(#87): wire pure-Go WinningPoSt verify into Full-tier ingest (obs…
Reiers commentedon Jul 23, 2026
2026-07-23 — soak restarted on latest main; Phase 1 evidence (Light + Full); message path proven live
Acknowledging the process point first: v1.9.0 was tagged before this soak ran. That was out of order against this issue's own exit criteria. v1.9.0/v1.9.1 stand as pre-stable releases; the 'stable' designation stays gated on this soak completing.
What changed under the soak since the checklist was written
Today's PRs materially moved the write path this soak exercises:
--network calibrationchimera fix, wall-clock anchor sanity gate, per-network gateway, t-prefix)Phase 1 — snapshot-free boot: evidence
Light tier (a calibration test node): cold init + boot on main
c02be8e. Quorum 2/2, anchor at live head. Time-to-serving-head: under a minute from process start (gossip head adoption; no snapshot).Full tier (a second calibration test node, THE soak node):
node-type full --network calibration, cold boot, snapshot-free:node tier: full (persistent cache .../calibration/blockcache, soft cap 12288 MiB)full block validation ON (observe mode, #90)mpool: publisher wired (topic /fil/msgs/calibrationnet)Phase 3 message-path checkbox — pre-proven standalone (was the biggest risk)
Two real sends through a standalone Lantern's own mpool on calibration, confirmed by an independent node (Glif):
MpoolPushMessageRPC self-send: CIDbafy2bzaceaknsrbajubpie4ahepmn7tsutida6456hwemwv6ruww2qwfpajfc→ ExitCode 0, GasUsed 738263, Height 3916380lantern wallet send --network calibrationCLI (1.5 FIL, distinct recipient): CIDbafy2bzacearvlluvp3sxhcji7qoqy5mznieunvvmvul3wrt5yevgvo2djjysw→ ExitCode 0, GasUsed 1213263, Height 3916431; recipient balance verified movedNonce fill, gas estimation, signing, gossipsub publish, #119 journal (
addentry verified on disk), #47 reconcile — all exercised.Running now
Still open before this issue closes
Reiers commentedon Oct 26, 2026
2026-10-26: Phases 3 and 4 progress (stock Curio-PDP, bridge-off Lantern, calibration)
Setup under test: the official Curio-PDP docker stack (
filecoin/curio-pdp:calibnet, Curio 1.29.0) with Forest removed andFULLNODE_API_INFOpointed at a standalone Lantern daemon (PDP tier, no--vm-bridge-rpc, no Lotus, no Forest). The exact steps are now in RUN-PDP.md anddeploy/curio-pdp/.Evidence (all calibration, all sent by Curio through Lantern's local mpool, receipts served by Lantern):
0xb3dcd20214bac8706dbb3740e4f23a698ddae5e20fd3f485ff899f5f696d9903(status 1). ✅0xfd05fb0fda451a69eb1ef47378924b7c4b44a3d8faf54478716f019f0ac28865-> data set 47136,0x468fbdb14caafd192ac7977a591e591a08757104bd74a8306e0e870eb61d01d4-> data set 47137. Curio extracted both ids from Lantern-served receipt logs. ✅nextProvingPeriod):0x004a454559191da22e8d4f6d46c0fdc89ff2bd62cbb904f853f3ae77219d6dc0(47136),0xba643e25125f57d5621450c5ed3a3cac66e4ef65f56db754a95fb1853f9367b0(47137). ✅Lantern bugs this run surfaced, all fixed and merged today:
eth_getTransactionReceiptwith logs, bounded lookups.Not yet verified: Curio GUI chain pages against Lantern, >= 3 consecutive prove windows.
Reiers commentedon Oct 26, 2026
Prove #1 — DS 47136 & 47137 ✅
First possession proofs landed on-chain at challenge epoch 4190280.
Reiers commentedon Oct 27, 2026
2026-10-27: 24h soak result (stock Curio-PDP on bridge-off Lantern, calibration)
13 consecutive prove windows landed for each of data sets 47136 and 47137, with no manual intervention and no Lantern restart.
provePossessiontxs (2 per window, one per data set), every one status 1 on-chain, plus 26 matchingnextProvingPeriodtxs. First window epoch 4190280, latest prove at 2026-10-27 17:10 UTC.Sample prove txs (first and latest window):
0x17ad835f941619bc008cc1bf2a8eb71c147ef27b36059d91ba0bbeb040868390(47136, window 1)0xda43be10d9549e28c6ebf3f647b9b57ca402feab4fc6fe0faca8cd84a3551051(47137, window 1)0x46c756ed1fb9b69a528331adf4f40b2671c3b1ee7eb169a0d3ce496dc96984c5(window 13)0xf7ab6ec6ef890f111a6edd39ec60fd3b1979f96176135070937595e6d74f10dc(window 13)Minor friction seen: one Curio RPC read hit its client-side i/o timeout once while processing a termination (retried successfully a minute later). Tracking.
Phase 4 criterion ">= 3 consecutive prove windows without manual intervention": met.