From 073fbea1d1b237048f1e6266a6b138119e9d5c50 Mon Sep 17 00:00:00 2001 From: igneum-labs <337424239+igneum-labs@users.noreply.github.com> Date: Wed, 7 Oct 2026 12:12:10 +0000 Subject: [PATCH] execrpc: an empty or unparsable reply is no answer, so a stopped node reads as silent to the watchdog's probe Co-Authored-By: Claude Fable 5.1 --- app/igneum-app/src/execrpc.rs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/app/igneum-app/src/execrpc.rs b/app/igneum-app/src/execrpc.rs index 29cbe478f..ee7e36531 100644 --- a/app/igneum-app/src/execrpc.rs +++ b/app/igneum-app/src/execrpc.rs @@ -40,7 +40,9 @@ fn post(evm_port: u16, method: &str, params: Value, timeout: Duration) -> Result ); let _ = std::fs::remove_file(&tmp); let out = out.ok_or_else(|| format!("{method}: the node's RPC did not answer"))?; - let v: Value = serde_json::from_str(&out).map_err(|e| format!("{method}: {e}"))?; + // an empty or unparsable body is no answer (a stopped node's socket still accepts the connection and curl + // returns nothing inside its own limit; the probe must read that as silence, 7 October 2026) + let v: Value = serde_json::from_str(&out).map_err(|e| format!("{method}: the node's RPC did not answer ({e})"))?; if let Some(err) = v.get("error") { return Err(format!("{method}: {}", err.get("message").and_then(|m| m.as_str()).unwrap_or("error"))); }