diff --git a/docs/fud-ledger.md b/docs/fud-ledger.md index 858470236..1c88bcc8f 100644 --- a/docs/fud-ledger.md +++ b/docs/fud-ledger.md @@ -2465,6 +2465,16 @@ Per tier: a home node or a hand started without the host refused every proof sub Fix on release-0.3.20-node, 55768f88 (c4459193's child): `resolve_program_ids`, the override object's fields first, then the env or the host, then the embedded keys; a bare node reports the ids in its proving v1 line and builds the statement with them. Gate: `a_bare_node_resolves_its_program_ids_from_the_embedded_keys` (known failed first: the bare node's None and the zero-id statement differing from the one with the ids at the id bytes; then the resolver's embedded ids, the override's fields still winning), and the fleet's 12 GB line on the 55768f88 binary. Owed: the proving v1 line names where its ids came from (file, env, host or embedded). +### N15. The exec chain block number is the node's own record index, not a canonical index of the DAG, so seven standing provers number the same block 2 to 46 higher than the hub and every segment record they make is refused at the carrier (the fleet's per-node read, 7 October 2026, 14:05Z) + +The fleet read each node's `eth_getBlockByNumber` at height 164000 against hub-1's `eth_getBlockByHash` for that hash: p1-4090 (paid) holds 0xd6185dea... and the hub numbers it 164000; p1-5090 holds 0x144918eb..., the hub's 163995 (offset minus 5); p2-3090-1 the same; p2-4090-1b minus 6; p2-3090-4 minus 4; p2-3090-2 minus 3; p1-a5000 minus 2; p2-3090-3 0x030105cb... at the hub's 163954 (minus 46); the offsets are per-node constants, the same at the tip. The worked example: p1-5090's record for "164638..164645" named 0x1c99cbe0..., which the hub holds at 164640, so every carrier refused it ("block 1c99cbe0... is not chain block 164645 on this chain", seven carries) while p1-4090's record for the same DAG blocks was paid at 0x2834c. Over the last 7,200 blocks the seven nodes claimed and proved every claim (0 FAILED, 8 of 8 shards, 93 to 183 s) and were paid 0; the five boxes at offset 0 plus two keys outside the fleet took every payment. + +Why: on every build, 5899f603 and this line alike, `ChainBlockRecord.number` is the index of the node's own record vector, seeded by the archival walk of the selected chain from genesis (0 at genesis), by the exec restart pin (27276 for bb45cf0d) with header-only records below it, or by a peer's or its own snapshot with the numbers it carried, and extended one per chain block the follower appends from `get_virtual_chain_from_block`, with the ring's `truncate_to` on a reorg. Consensus's own selected-chain store indexes the pruning point at 0 after a proof sync, so it is not canonical either. A node numbering a block N higher than the hub holds N records below it for blocks the hub's chain never numbered: duplicates appended across a reorg or orphans the unwind left; the drift point is one follower event and the offset is constant after it. Which event is owed: the fleet scans p1-5090 and p2-3090-3 downward from the tip for the first n where block n's `parentHash` is not block n-1's hash and reads the log there. + +Per tier: a home prover whose node drifted is never paid, whatever the card and whatever the claim rule (the settled floor of N11 cures reorged blocks, not numbering), and nothing tells it; a prover on an undrifted node is paid when its proof lands first; the chain itself is right, the carrier's check is right on its own numbering, and the two nodes disagree on what a block is called. + +Fix direction (0.3.21 if the scan names the event in time, else 0.3.22): the number canonical by construction (the restart pin's number plus the selected-parent distance, a continuity check at every append that refuses a record whose parent is not the previous record and re-walks from the last agreed one), a drift self-check at start against the pin (the walk is cheap), and the carrier resolving a record's segment by the block hash it names rather than refusing on the number; the kit reads a node's drift today with the same `parentHash` walk over the last 1,000 blocks before it claims. + ## Status updates, 5 October 2026 (ledger sweep, night of 4 to 5 October) `docs/review/ledger-sweep-2026-10-05.md` holds the runs, the commands and the running table. Every Open, Proposed, Unmeasured or pending entry was read against its experiment line; the status lines above carry the evidence inline, marked "Sweep (5 October 2026)" where a note was added and "Was:" where the status changed. Items owned by the other two night branches (F23, F24, G12, X18, the flood memory growth; the base-fee floor, testnet parameters, G13, G14, public text) were left to them.