From 50f17ac523cd2e6539d97f26d6ae2a246e920c8c Mon Sep 17 00:00:00 2001 From: igneum-labs <337424239+igneum-labs@users.noreply.github.com> Date: Wed, 7 Oct 2026 12:22:13 +0000 Subject: [PATCH] class v5 design page: the amended v4 base and object byte 6 recorded, the PASS with bytes 6,6,6 Co-Authored-By: Claude Fable 5.1 --- docs/design/class-v5-stored-state.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/docs/design/class-v5-stored-state.md b/docs/design/class-v5-stored-state.md index d74c47a83..cccbae22a 100644 --- a/docs/design/class-v5-stored-state.md +++ b/docs/design/class-v5-stored-state.md @@ -27,6 +27,7 @@ | 11:47 to 11:59 | The flip run on the quiet box: the chain did everything the design says (the flip, four v5 epochs, a root per epoch, the stale miner off on 52 of 52, the stateless node stopped at 480); six `FAILED CHECK`s were the harness's own scope (it compared the stateless node's sink with the others, counted the stale miner's rejections as a fault, and read the flip epoch's stream after the executor had dropped it: captures are kept two epochs); the checks fixed | | 12:00 to 12:11 | PASS on every check (section 10) | | 12:12 to 12:23 | The no-flip case PASS (section 10); both branches pushed; master merged for the build-2 test route (d1285cef) | +| 12:5x to 13:21 | The amended class v4 taken in: ca3-v4-amend 8c728ca3 merged into class-v5 (4e737543) and release-0.3.20-node into class-v5-node (699db5a2); the source rule's class key sets the state flag aside so v5 and its rungs draw under it (a unit test pins the v5 chain draw equal to the amended v4's with no lossy-sourced load, the unamended v3 stream the known-failed case); generator 5 keeps `program_id(5, seed, attempt)` with no sub-version (the hash lane's reading: the suffix separates two streams inside generator 4); class v5 is object byte 6 above the amended v4's 5 (the fork, the harness, the default byte); igneum-pow 67 unit and 39 integration tests on igneum-build-2, the packs test with the re-exported control pack, the flip case PASS again with bytes 6,6,6 (the flip at epoch 8 on 3 of 3, 183 v5 blocks, the stale miner off on 59 of 59, the stateless node stopped at 480, equal roots) | | 10:4x | The Counter ASIC coordinator relays the project lead's ruling of option A on AP-F8-1: the injecting-source load draw lands in class v4 itself on the hash lane's branch ca3-v4-amend (0.3.19); class v5 takes it by merging that branch once its commit is up, not by a second implementation; the page's section 11 row stands as the record of the bound and its gate | ## 1. The claim, in one paragraph @@ -171,12 +172,12 @@ The same machinery as class v4 and the ladder (counter-asic-3-node.md section 6; | Item | Rule | |---|---| -| The carrier | the object version in bits 8 to 13 of the header version; `CLASS_SIGNAL_V5 = 5`; a byte at or above 5 signals v5 and, as before, v4 (a later object contains the earlier); accepted by every node since 0.3.15 (only the low byte is checked), so no header rule changes | +| The carrier | the object version in bits 8 to 13 of the header version; `CLASS_SIGNAL_V5 = 6` (the amended class v4 of the 0.3.20 node line is 5, the 6 October stream was 4); a byte at or above 6 signals v5 and, as before, the amended v4 (a later object contains the earlier); accepted by every node since 0.3.15 (only the low byte is checked), so no header rule changes | | The switch | `Params::program_class_v5_activation_daa`, `u64::MAX` never, the floor once set (rounded up to the epoch boundary as v3's and v4's); in the digest ONLY once set (the 0.3.15 rule), so a binary carrying the field peers with one that does not until a file sets it; `--override-params-file` field `program_class_v5_activation_daa` | | Active | `class_v5_enabled() = program_class_v5_activation_daa() != never`; with it never, a byte 5 on the chain counts as a v4 signal and nothing else moves | | The window | `program_class_v4_signal_window_daa`, shared: one window for every object's tally (86,400 on the devnet, 120 on the fast-time profile) | | The decision for epoch `e` | v5 when the floor says so; else when epoch `e - 1` was v5 (monotone); else when epoch `e - 1` was v4 and each of the seven consecutive windows ending at the seed block `S_e` is full and has at least 9,500 bps of its blue blocks at byte 5 or above; else the v4 rule's answer. One step per epoch: a chain goes v3, v4, v5 through three decisions at the earliest | -| This node's byte | `IGNEUM_CLASS_SIGNAL` on devnet and simnet; the default is 5 when `class_v5_enabled()` and 4 otherwise, so a live file where v5 is never writes exactly what 0.3.18 writes | +| This node's byte | `IGNEUM_CLASS_SIGNAL` on devnet and simnet; the default is 6 when `class_v5_enabled()` and 5 (the amended v4's) otherwise, so a live file where v5 is never writes exactly what the 0.3.20 line writes | | What a node reports | `PowEpochInfo` fields 37 to 40: `programClassV5ActivationDaa` (optional, absent = never), `programClassV5SignalBps`, `programClassV5SignalWeakestBps`, `programClassV5SignalEpoch`; the daemon prints the floor and window lines for v5 beside v4's, and `Program class v5 by miner signal: epoch E (...)` once per flip | | The miner | takes the class from the template as before; a v5 pair needs the day stream, fetched from its node's exec RPC (`igneum_getPowDayState [day]`, `--exec-rpc` on the miner, default the node's host at the exec port) when the engine's provider asks | | The day-state provider | `kaspa_pow::igneum::install_day_state_provider(Arc)`: the daemon installs the executor's; the miner installs the RPC client's; an engine without one refuses v5 with `DayStateUnavailable` |