From 5a6dff73de2a80b09c4996e711779cbb3a85db33 Mon Sep 17 00:00:00 2001 From: igneum-labs <337424239+igneum-labs@users.noreply.github.com> Date: Wed, 7 Oct 2026 21:07:07 +0000 Subject: [PATCH] docs/plans/pool.md 10.5c and 10.5d: the members part of the hour from their logs (pool-b twenty minutes, no rejected line), the prepare stall and its two halves with the fork commit, the two rejected counters and what each counts Co-Authored-By: Claude Fable 5.1 --- docs/plans/pool.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/docs/plans/pool.md b/docs/plans/pool.md index 9210f8e5c..f89e18e84 100644 --- a/docs/plans/pool.md +++ b/docs/plans/pool.md @@ -517,6 +517,15 @@ header time): `/srv/builds/igneum-wt-pool-finish-21/pl-dn3/read/hour-oldtags.jso The daemons' own counts per box (STATUS, `/api/open`, OPEN SHARE lines) are the fleet lane's hour-end lines and join this table when they arrive. +The members' part of the hour, from their own logs (the fleet lane, codes read from the lines, not the counters): +dn3-pool-b's miner accepted 312 to 320 shares between 19:33:28Z and 19:53:24Z and then nothing, so its contribution +is those twenty minutes; it has not one rejected line inside the hour (its STATUS rejected=47,700 was a constant +carried from the 19:25Z to 19:33Z era under the 45db7613 daemon). Its 19:53Z stall is MF-15 in the reliability +register (`docs/plans/miner-faults.md`) and the two fixes are below. The daemon's STATUS rejected=235,016 at the +hour's end is the ledger's lifetime across every daemon era since the pair's first start (the state file persists +it), not the hour's: from 4a123b89 STATUS and `/api/stats` carry the rejections by code twice, the ledger's life and +this process's run, and say which is which. + ### 10.5d Two faults found by the hour, and the sweep | Item | What | Rule or fact | @@ -524,6 +533,8 @@ this table when they arrive. | The tags | the open pool's `IGNS` (commitment) and `IGNP` (split) were the proving sections' tags (`proving.rs` SECTION_TAG, SEGMENT_SECTION_TAG) and finality's ADDRESS_TAG is `IGNP` too; the hour's read found 288 blocks of other miners carrying one of them (the trailers). Safe on honest blocks (the trailer's body is empty, `payout_split_in` refuses), but a consensus rule never rides a shared tag | renamed to `IGNH` and `IGNW` (fork pool-tags-node 7455b8d5, cherry-picked by the node lane as 785dafb3 onto v5-object-0323, the 0.3.24 line; a test that no coinbase tag is shared); the pool crate, the tool and these docs on the new tags (pool-finish-22 bb0e4351 and after); a daemon on the renamed tags is staged on build-1 (igneum-pool-bb0e4351-seed-tags, sha cda57289...) and moves to the pair when a 0.3.24 node pair exists, since a 0.3.23 node reads the new tags as unknown and carries nothing of them; the 0.3.23 node carries b0444f51's shared-tag form at never | | The daemon's hash tree | the first Devnet 3 daemon (0.3.21 repo tree, fork b0444f51) refused every share as WRONG HASH; the second (release-0.3.22 tree, fork 69d1b56e) too, with identical seeds on both sides: the release-0.3.22 repo tree's igneum-pow/src/generator.rs was 316 lines behind the re-pin 017e7037 the chain and the miner run, and the fork's kaspa-pow takes igneum-pow by path from the repo tree it is built in | the pairing rule reaches every crate that embeds the lottery engine (the node, the pool daemon, the app's CPU re-check): igneum-pow at the release's pin, and the proto-cuda packs with it (the recheck tests pin the pair; the release-0.3.22 tree's packs were the pre-amend export, program id 12071054473004869770 against the generator's 1892128023569472608); pool-finish-22 carries igneum-pow and the packs from 017e7037 (17452d1e, fed5772c) | | The sweep | the 0.3.23 node 2720d8d2 moves Devnet 3's digest to ba75bf6f; a one-box-at-a-time sweep split the network (build-1's node at 83eb50cd read 27 "digest mismatch, local ba75bf6f" rejects between 20:19Z and 20:37Z); every Devnet 3 node restarts inside one minute at the fleet's clock, the member nodes among them, by the fleet lane on its boxes; the daemons stay (the pairing is unchanged on 2720d8d2) | a daemon row owed if a daemon's gRPC connection does not survive its node's restart (STATUS must return to "node ok" within a minute of templates) | +| The prepare stall | at the epoch-3 boundary (19:53:14Z) dn3-pool-b's miner wrote the checked pack, sent the prepare, and the worker never said prepared: 54 minutes with every job held, nothing sent, nothing rejected, 0 MH/s, until a hand restart. Two halves: the pack root `packs/dn3-prepare` was relative to the miner's working directory and handed as such to the worker, a separate process that never found it (the node lane's finding and fix, `absolute_pack_root` on class-v5-node-wire); and pool mode had no guard on an unanswered prepare and did not honour `--exit-on-seed-change` at a seed move the way the solo path does | fork 4789fbf7 (on v5-object-0323's tip c8f9b383, for the 0.3.24 line): a seed move in pool mode is logged as SEED CHANGE; a worker that cannot prepare exits 42 for the launcher under the flag; a prepare unanswered for 120 s is re-sent once with the pack written again, unanswered twice it is a fault (exit 42, or the worker replaced and the pair prepared again); tests `a_prepare_that_never_answers_is_resent_once_then_a_fault`, `a_seed_move_in_pool_mode_exits_for_the_launcher_or_hot_swaps`. Operators until then: an absolute `--prepare-packs` path or miner and worker from one directory. Register row MF-15 | +| The two rejected counters | the daemon's STATUS rejected=235,016 beside the member's zero rejected lines in the hour: the daemon's counter is the ledger's life (persisted in the state file across its eras: the 12-job-window era's unknown_job and the 45db7613 era's wrong_hash), the member's is its run | 4a123b89: STATUS prints `rejected_by_code(ledger)=` and `rejected_by_code(this run)=`; `/api/stats` carries `shares.rejected_by_code`, `shares.rejected_by_code_this_run` and a `counters_since` note; `refuse_share` takes the code | ### 10.6 Open after this round