From 927895a69dd1857cf85ba81e3a3db0b2c9e33df5 Mon Sep 17 00:00:00 2001 From: igneum-labs <337424239+igneum-labs@users.noreply.github.com> Date: Wed, 7 Oct 2026 09:34:17 +0000 Subject: [PATCH] prover loop: no records-indexing poll until the node's exec follower holds a record (ledger N7, PC 1 on 0.3.18) The 0.3.18 clock-sample gate stopped one caller; the prover's first igneum_getAssignedShards after the node reads synced killed PC 1's 0.3.17 node the same way (rpc.rs:808, records[1..=0] on an empty vector) because its follower loads after the sync flag. The loop now waits on igneum_getExecStatus's executedTipHash, the same gate. Co-Authored-By: Claude Fable 5.1 --- app/igneum-app/src/prover.rs | 10 ++++++++++ app/igneum-app/src/update.rs | 2 +- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/app/igneum-app/src/prover.rs b/app/igneum-app/src/prover.rs index 1d2140bbc..56784cdbb 100644 --- a/app/igneum-app/src/prover.rs +++ b/app/igneum-app/src/prover.rs @@ -478,6 +478,16 @@ fn loop_forever(shared: Arc, bin_dir: PathBuf) { }); continue; } + // ledger N7 (7 October 2026, PC 1 on 0.3.18): a node before the exec RPC fix dies on igneum_getAssignedShards + // and igneum_getProofRecords when its exec follower holds no record (rpc.rs slices records[1..=0]), and the + // node reads synced seconds before a slow follower has one; nothing below asks until the follower reports a tip + if !crate::update::exec_has_record(shared.runtime.evm_port()) { + set(&shared, |p| { + p.status = "waiting".into(); + p.message = "waiting for the node's execution layer".into(); + }); + continue; + } // 1. the keys and the work list let labels = labels(&shared); let mut keys: Vec<(String, String)> = Vec::new(); diff --git a/app/igneum-app/src/update.rs b/app/igneum-app/src/update.rs index ef2ce46e2..382823536 100644 --- a/app/igneum-app/src/update.rs +++ b/app/igneum-app/src/update.rs @@ -42,7 +42,7 @@ fn days_from_civil(y: i64, m: i64, d: i64) -> i64 { /// True once the node's exec follower holds a record (igneum_getExecStatus's executedTipHash is set). Any error or an /// unreachable node reads false: the block sample waits rather than asks. -fn exec_has_record(evm_port: u16) -> bool { +pub fn exec_has_record(evm_port: u16) -> bool { let body = "{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"igneum_getExecStatus\",\"params\":[]}"; let out = crate::detect::run_timeout( Command::new(crate::platform::tool("curl")).args(["-s", "--max-time", "5", "-X", "POST", &format!("http://127.0.0.1:{evm_port}"), "-H", "Content-Type: application/json", "-d", body]),