igneum/docs/plans/release-0.3.13.md
2026-10-06 15:01:23 +00:00

13 KiB

Igneum Miner 0.3.13: node-only, the execution layer follows again and the finality route; prepared to the publish gate, 6 October 2026

Release engineer, from 13:05 UTC, on the coordinator's instruction: "prepare, so it ships the moment the fix lands: a release-0.3.13 branch, NODE-ONLY". Worktree /Users/joshm/Projects/igneum-wt-ship0313, branch release-0.3.13 from master 19edae0; the fork worktree vendor/igneum-node-0313, branch release-0.3.13-node, at 83089544 (the 0.3.12 node) until the two node fixes land on it; vendor/ symlinked to the main checkout's. The 0.3.12 recipe throughout; igneum-labs commits; times UTC.

1. Why, and what it carries

Since the publish-2 restarts of 0.3.12 (about 11:37Z) the execution layer is dead on every node: eth_blockNumber answers 0x0 and igneum_getProvingStatus reads active: false, paidShards 0, paidWei 0x0 (the observer at 13:05Z). The devnet's pruning point left genesis today, and the follower, which walks from genesis in memory, can no longer start; --archival does not help an existing datadir.

Change Where State
The execution layer follows again: the exec state persisted to the data dir every 5 min and at stop, resumed at start (--igneum-exec-snapshot=<path>[,<sha256>], igneum_exportExecSnapshot, the loud "exec not synced" status); the snapshot served and fetched over p2p (protocol 16, messages 76 and 77); the archival walk through the ghostdag store when the virtual-chain query refuses a tip below the retention root; exec_restart_number, exec_restart_hash and exec_restart_trust_daa in the override object (in the digest once set: without them a node on this build stays blocked, the bodies below 27,276 being gone on every hand) the proving agent's exec-sync-0313 05e93f0e (7 commits on 83089544) merged onto the route fix as release-0.3.13-node a9dfe78e (clean, 23 files). Measured by its agent on a copy of node 1's data dir: 27,276 header-only records, the EVM state restarted at chain block 27,276 and re-executed to the sink (130,272) in 93 s; paidShards 1,482, paidWei 1,825.70 IGN; the state persisted (114.8 MB) and resumed in 9 s
The finality route (the fleet's finding, 26 fresh nodes): a certificate for an index below this node's window is ignored (the seed re-locked index 2954 2,811 times in seven minutes and the echo filled every fresh peer's route); the IgneumFinality route takes a checkpoint burst (4,096); a full route drops the message and keeps the peer; votes are skipped during IBD fork branch fin-route-0313 5a339733 (the bench-log entry fin-route 05d0944, merged e6c939e) in: p2p 33, flows 19, finality 12 tests green; harness s7 PASS
The six version files 7c9b00f (--check: 0.3.13 in all 6) the app's version bump only, for the node payload

A consensus change after all: the three exec-restart fields enter the digest once set, so this is the 0.3.12 two-publish shape (section 2), not the one carried-over publish first planned. The thirteen-field object (the packaged line 71cb8a4, publish 2, the hands' and the seed's files at step 2; exec_restart_trust_daa 200,000 pending the coordinator's word):

<the ten-field object of 0.3.12> + "exec_restart_number":27276,"exec_restart_hash":"bb45cf0dd2d7cc97ebfa5a2701527c09a8ede5d32de74efead9caa293b15688a","exec_restart_trust_daa":200000

PROTOCOL_VERSION 15 to 16: the handshake takes the lower version, a 0.3.12 and a 0.3.13 node peer during the window.

1a. The devnet's one-time state reset (the coordinator's question, answered plainly)

No verified snapshot at chain block 27,276 exists. The executor starts at chain block 27,276 (DAA 45,537, the pruning point of 11:40Z) from an EMPTY EVM state (daemon.rs: "Exec restart from the override file: the EVM state restarts empty at chain block {}"; 3dd9b2c9: "with header-only records below it") and executes forward from the stored bodies; exec_restart_hash bb45cf0d... is that chain block's hash (where, not a state root), and nothing is verified against a header's state root because there is no prior state to verify. Gone: every balance, contract and nonce from before chain block 27,276 (the coinbase credits of the chain's first 45,537 DAA, the txgen harness wallets' transfers from the relay tests, any contract state). Back, re-derived: coinbase credits from 27,276 on, every shard payout record (proving v0 began at DAA 84,100, above the restart, so the proving ledger re-derives whole) and the fee flows after it.

Reading Before 11:37Z (node 1) After the restart (the copy, 13:43Z)
igneum_getProvingStatus paidShards / paidWei 663 / 814.64 IGN at 00:3xZ; 1,261 / 1,573 IGN at 08:30Z 1,482 / 1,825.70 IGN (higher: it grows with the chain, nothing of it is lost)
PC 2's payout address 0xcafc6e74...516a not read (no balance reading before 11:37Z exists anywhere: the hub's intake carries status lines, not balances) 267,648 IGN (the rewards of chain blocks 27,276 to 130,272)
node 1's, PC 1's payout addresses not read re-derived from 27,276 on, as PC 2's
the first 45,537 DAA (chain blocks 1 to 27,275) about 124,600 IGN of producer rewards (the subsidy 3.17 IGN at genesis rising to 3.67 at DAA 45,537 on the launch ramp, one blue block a second, the producer share 80%) and about 31,100 IGN of pool escrow (the proving agent's computation from consensus/core/src/igneum.rs, approximate) gone; not attributable to addresses (the coinbase payloads with the IGNA payout addresses are in the pruned bodies, and the header's vote-key fallback names another address)
chain block 1 to 27,275 on the explorer bodies and state header-only; history below 27,276 is honest only as headers

The chain, the finality locks and the hash are untouched; the reset is of the execution layer's state, once. the project lead approved the one-time reset with the go (15:20Z).

2. The order at the go (the coordinator relays it; nothing below runs before)

Runbook: the session scratchpad's r0313/rollout-0313.sh. The 0.3.12 shape: publish 1 the binary with the TEN-field object (digest 7bd98cc4... unchanged, no window), publish 2 the THIRTEEN-field object (a new digest, one window per side).

Step What Check
0 the baseline step_check_observer: eth_blockNumber 0x0 and igneum_getProvingStatus inactive on the observer today; node 1 read 814.64 IGN over 663 shards at 00:3xZ and 1,573 over 1,261 at 08:30Z (it grows with the chain) the numbers to beat after the switch: paidShards >= 1,482, paidWei >= 1,825 IGN
1a the hand nodes, the seed step_1a_hand_nodes, step_1a_seed: the 0.3.13 binary with the SAME ten-field file; step_mac_miners only if the Mac mines (paused on the project lead's order since 07:10Z) each prints 7bd98cc4...; igneum_getExecStatus.blocked says why the exec layer waits (the three fields are not set yet)
1b publish 1 step_1b_ship (--from ci): consensus CARRIED OVER (the ten-field object), the DMG, the installer and zip from the Windows run, HiveOS with --public the live manifest 0.3.13, digest unchanged
1c update-now Mac (its node is node 1: the engine alone), then PC 2 and PC 1 on the coordinator's word each app's STATUS on 0.3.13, its node on 7bd98cc4
2a the hand nodes, the seed step_2b_hand_nodes, step_2b_seed: the thirteen-field file each prints the new digest; within about 2 minutes eth_blockNumber climbs to the sink, igneum_getExecStatus reads startedFrom "restart at chain block 27276" (then "snapshot" on every restart after), blocked null, and igneum_getProvingStatus reads active with paidShards >= 1,482 and paidWei >= 1,825 IGN
2b publish 2 step_2b_manifest: the thirteen-field object, --activation-height 198000, the note names the exec restart the live manifest carries the three fields
2c the switch jobs step_2b_update_now Mac (nothing to restart: node 1), then PC 2, then PC 1, each on the coordinator's word each PC's node restarts once (seconds), its [proving] lines resume within minutes, its digest the new one
3 the sweep every node on the new digest, exec climbing, proving active; the fleet's rented nodes take the thirteen-field object through their operator (the fleet agent) the per-machine times in section 4

3. Builds and artefacts (to fill when the fork tip is set)

What Command Result
The fork's Mac node, a9dfe78e CARGO_TARGET_DIR=vendor/igneum-node/target-0313 cargo build --release -j 4 -p kaspad -p igneum-miner --features kaspad/igneum-pow from vendor/igneum-node-0313, under the lock (the target cloned from the route fix's) 14:51:39 to 14:55:3xZ: igneumd ef76ff5c1371317d783330e460ad4f6a1a8b3f2cdc55b228362ee64a227b30fa (41,686,528), igneum-miner b7926642... (8,763,888); igneumd/2.1.0-a9dfe78e
The seed's Linux node (glibc 2.36 target, zig) NODE_SRC=<abs fork> TARGET_DIR=vendor/igneum-node/target-0313-linux OUT_DIR=<scratch>/r0313/cross infra/cross/build-linux.sh under the lock 14:51:47 to 14:55:12Z (203 s): igneumd c7c696c5fa915350993b29378d3fceb252b88a1af880f6051472aef82f796777 (48,246,888), igneum-miner 77ab2e08... (9,860,400); handed to the fleet agent with the thirteen-field file at 14:56Z
The Windows node exes CARGO_TARGET_DIR=vendor/igneum-node/target-0313-win proto-cuda/windows-node/cross-build.sh <fork> 4 on the Mac (mingw) under the lock 14:51:54 to 14:55:1xZ: igneumd.exe f4e9ef8a83464535aa314e390682acb0ee0e23ceffea09815d546f5fd1ad90ae (52,518,912), igneum-miner.exe 574adb79... (11,039,232)
The inputs, the pin IGNEUM_WIN_RELEASE=<target-0313-win>/x86_64-pc-windows-gnu/release IGNEUM_NODE_SRC=vendor/igneum-node-0313 packaging/windows/push-inputs.sh, 14:56:51Z; the 0.3.11-verified workers 2b3b8c92.../edc4a75d... and the telemetry helper 8d679b52... unchanged payload-inputs.zip 2327e1da165afbc2194fc7cd1f1be67c509b6845f6d7c032f6878a00a878991d (65,393,804), signed, live; node-source.pin a9dfe78e committed as 0c4f90e (the CI commit)
The digests on the Mac node ef76ff5c... (ports 60995/60996, 22 s each, under run) the ten-field file: 7bd98cc4... (unchanged: publish 1 changes no handshake); the thirteen-field file: b18ed271f75dd46406d230f4156c37472127415a4c32c558bac662f6f840e61c with Exec restart from the override file: the EVM state restarts empty at chain block 27276 bb45cf0d...
The DMG NODE=<fork igneumd> MINER=<fork igneum-miner> PROVE_HOST/PROVE_EXPORT=<the 0.3.12 build, unchanged> packaging/mac/build-dmg.sh under the lock 14:58:18 to 14:58:5xZ: Igneum-Miner-0.3.13.dmg 90864092fb69a90c0bd90fbfba91f24f9663499252c86e453abe3fa5dedbe716 (41,879,478), engine 0.3.13, node a9dfe78e (41,462,352 inside), the prover host ce03ceb5..., igneum-bench from proto-metal/main.swift (unchanged), packaged-config carries the thirteen-field object, hdiutil checksum valid
The HiveOS package NODE_OUT=<scratch>/r0313/cross WORKERS_OUT=<the 0.3.11 Linux workers> VERSION=0.3.13 packaging/hive/make-hive-package.sh, then publish-public.sh --hive into dl/public (the 0.3.12 package removed; the ship's deploy carries it) 14:58:59Z: igneum-hive-0.3.13.tar.gz 41e0633b2677005fabd360ad80669221ef8f7ea4da0a4aa48e1b659df8718eec (24,632,169); the node inside is a9dfe78e
The node suites with the igneum-pow feature (the Mac, no fail-fast) CARGO_TARGET_DIR=vendor/igneum-node/target-0313 cargo test --release -j 4 --no-fail-fast -p kaspa-consensus -p kaspa-consensus-core -p igneum-exec -p kaspa-pow -p igneum-miner -p kaspa-p2p-flows -p kaspa-p2p-lib --features kaspa-consensus/igneum-pow,kaspa-pow/igneum-pow from the fork, under the lock, 14:58:26 to 15:00:1xZ igneum-miner 18 of 18, p2p-flows 33 of 33 (the IBD vote skip inside), p2p-lib 19 of 19 (the overflow-policy test), kaspa-pow 14 of 14, db_compat 7 of 7; kaspa-consensus 99 passed, 1 failed (the known M20 era test; the finality ban test green this run); consensus-core 107 passed, 1 failed (the known fast-time file duplicate-key test); igneum-exec 17 passed, 1 failed, NEW: proving::tests::assignment_follows_the_window_and_records_check_against_native_execution (proving.rs:1171: the test expects a record to be refused, the code after 05e93f0e checks it as assigned: true; the crate was 17 of 17 on 83089544): the proving agent's to resolve before the gate (a fix commit, or the test's expectation is the stale half)
The Windows run windows.yml run 37483331039 on 0c4f90e (dispatched 14:57:37Z after the inputs push); ci 37483332527 (pending)

4. The rollout (to fill at the go)

5. The one line for the project lead

When he says go: the execution layer comes back on every node at its restart (the hands and the seed by hand, the Mac, PC 2 and PC 1 through two update-nows each, the node restarting once for the switch), with the state restarted empty at chain block 27,276 (6 October 11:40Z, DAA 45,537) and re-derived forward, so every IGN earned since then by mining and proving is back on the ledger (PC 2's address 267,648 IGN; 1,482 shards, 1,825.70 IGN of prover payouts) and the chain's first 45,537 DAA (about 124,600 IGN of mining rewards and 31,100 IGN of escrow, approximate) are gone from it and cannot be given back to addresses, once; the chain, the finality locks and the hash are untouched; a fresh node joining the devnet no longer loses the seed every checkpoint once the seed runs this.

6. Owed