From d0939373b0cfb6053b4dbabd0fe239469ffbb98e Mon Sep 17 00:00:00 2001 From: igneum-labs <337424239+igneum-labs@users.noreply.github.com> Date: Wed, 7 Oct 2026 19:07:32 +0000 Subject: [PATCH 01/19] class v5 design page: section 14 (the acceptance rule's class v5 part on the residual hot-set class, the two fixes, the floor taken), the witness row done, the class-walk exception, the harness skew and override-field rows Co-Authored-By: Claude Fable 5.1 --- docs/design/class-v5-stored-state.md | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/docs/design/class-v5-stored-state.md b/docs/design/class-v5-stored-state.md index c3704c653..db5466eca 100644 --- a/docs/design/class-v5-stored-state.md +++ b/docs/design/class-v5-stored-state.md @@ -32,6 +32,9 @@ | 13:2x | The coordinator's correction: the hot-set bound is NOT satisfied by sub-version 1 (F8's re-gate: nine of the first 30 seeds over 1.2x, p31 at 29.3x, 0.19 percent hot-set programs; saturated values pass saturation-preserving writers); v5 inherits the gap by merge and takes sub-version 2 by merge when it lands; the AP-F4-1 and AP-F1-1 rules come in the next round; the lane stops here | | 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 | +| 19:4x | The flip-stale harness re-run (base 30500) read FAIL on `v5_ids_equal_the_cli_v5_id`, `sinks_agree`, `block_counts_agree`: the fork binaries on build-1 date from 18:56 UK, before AP-F4-1 (19:27) and AP-F1-1 (19:37), so the miners' v5 ids differ from the CLI's at redrawn epochs (9 and 10 differ, 11 equal). Binary skew; the fork rebuilds after (c''') and the case runs again on the matched pair. The harness itself: the 60x file now carries other lanes' override fields (`sig_scheme`, `sig_scheme_activation_daa`, `finality_succession_activation_daa`, `latency_ladder_cache_rung`) that the fork's `OverrideParams` (deny_unknown_fields) refuses; the harness drops the fields the fork source does not name and says so in its log (1c02465c) | +| 19:5x | Main's order through the coordinator: class v5's acceptance carries the fix for the residual hot-set class (adv-accept's seed 100767, section 14), the cheapest fix first (the raised per-site floor) against the per-site hot-item test, chosen by the lower clean rejection rate. (c''') in at ab6f980b: `MIN_DISTINCT_RATIO_V5 = 0.995`, known-failed first on the exemplar, the census test `v5_hot_census` behind the number | +| 20:0x | The v5-fasttime lane's exception, owned by the node lane: `class_signal.rs decide()` with the v5 object set and both floors at 0 resolves the epochs under the window to class v3 regardless of the v4 floor (e0:v3 e1:v3 e2:v4 on the 60x profile); on Devnet 3 (v4 from genesis) enabling v5 would re-read day one as v3. This lane's harness never saw it (its v4 floor is 120, v3 at 60). Gates the crossing object, not the hash side | ## 1. The claim, in one paragraph @@ -274,8 +277,20 @@ Every item of this page that has no code, no test or no measurement yet, with th | Miner cost rows per card (5090, M5 Max, 9070 XT, 4070) | the 4090 row only (rate equal within 0.01 percent, build +0.24 ms); the four named cards owed, each labelled measured with the date | fleet (5090, 4070), this lane (M5 Max under the lock), PC 1 (9070 XT) | 3 | | The exec snapshot wire carrying the day streams (a proof-synced node's trusted-data path) | DONE by the node lane (19:3x UK): fork branch class-v5-node-wire 7737ebd9 on both box mirrors, igneum/exec only, SNAPSHOT_VERSION kept at 1 with `epoch_streams` as the last field and a legacy fallback (a 0.3.23 snapshot loads on a pre-field node and the other way round through the sweep); the writer carries the two newest captures, each checked to rebuild to its root; the loader rebuilds each, compares its root with the loaded state's record at that block, publishes the final one to `ExecState.stream_cache` at once and holds the next until its cut, refuses a tampered or foreign stream and installs the rest; tests `snapshot::tests::the_legacy_shape_is_the_struct_without_the_streams` and `service::class_v5_tests::a_snapshot_carries_the_epoch_streams_and_a_loader_serves_them`, known-failed first; exec suite 43 of 43 on build-2 at 18:33:09Z | node lane | 0 | | The pool protocol's per-epoch state fetch | NO code | pool lane | 2 | -| The day-state witness in the pruning-proof format | IN PROGRESS (the node lane, from 19:3x UK, on class-v5-node-wire): the reference block's hash and state root per epoch beside the epoch seed witnesses (`ProofSeeds::from_witnesses`), checked against the syncing node's snapshot record once it holds one; nothing in igneum-pow changes | node lane | 4 | +| The day-state witness in the pruning-proof format | DONE by the node lane (19:5x UK): class-v5-node-wire 6d827c5d on both mirrors. The witness is the state root after each class v5 epoch's seed block, `EpochSeedHeader.stateRoot = 3` beside the epoch seed header (empty before class v5, so the old wire parses both ways), `PruningProofStateRoots` on the proof metadata; the prover reads each class v5 seed block's root from the installed provider (`DayStateProvider::state_root(block)`, one addition to the kaspa-pow trait, default decodes the stream) or from a witness it took; the verifier's `ProofSeeds::from_witnesses_with_roots` refuses a class v5 epoch whose seed header has no root (the known-failed shape) and a root for an epoch with no header; `check_header` on DayStateUnavailable for a class v5 header accepts it as trusted data when the proof carries the epoch's witness, else refuses naming the missing witness; the importer installs the (seed block, root) pairs through `install_day_state_witnesses`; the executor's `install_epoch_streams` holds a stream for a block it has no record of to that witness (section 5's rule, both conditions). Suites on build-2 on the commit: kaspa-consensus 122, igneum-exec 44, kaspa-p2p-flows 37, kaspa-p2p-lib 20, kaspa-pow 18 | node lane | 0 | +| The acceptance bound on a program's hot-set share (section 14, main's order 19:5x UK) | (c''') at ab6f980b: the per-site distinct-index floor raised to 0.995 under the state flag, known-failed first on seed 100767; the census (clean rejection rate, attempts histogram) running on box 2; the number goes to the coordinator and here when it lands | this lane | 1 | +| The class walk under the v5 object (`class_signal.rs decide()`: epochs under the window resolve to v3 regardless of the v4 floor once v5 is enabled; the v5-fasttime lane's reading 20:0x UK) | OPEN, the node lane's: a known-failed test with v4 from genesis and the v5 object set must read v4 at epoch 0; this lane's harness gains the same case (v4 floor 0, v3 never) once the fork has the fix | node lane (fork), this lane (harness case) | 2 | | The spec text (01 1.8.5 the leaf line, 1.12 the cut, 10 the witness) | NO text | this lane | 2 | | The litepaper paragraph and ledger M35 | done (the litepaper's measured numbers are the 4090's) | this lane | 0 | Sum of the gap: about 40 agent hours, 17 of them this lane's (the two draw rules, the M5 Max rows, the spec text, the gate's v5 checks), the rest the node, worker, pool, fleet and attack-pass lanes'. + +## 14. The acceptance rule's class v5 part (c'''): the residual hot-set class (main's order, 7 October 2026, 19:5x UK) + +The class the in-house attack pass attributed tonight (adv-accept, `docs/analysis/cryptanalysis/report-acceptance-rule.md` on branch adv-accept): a value-level constant from a lineage-fresh writer that neither (a') nor (c'') reaches. The exemplar is class v4 sub-version 3's seed 100767 of the f8 label space (epoch bytes the words of `igneum-attack-f8/program/100767`, era bytes of `igneum-attack-f8/era/100767`, attempt 2, program id 9d68e6286fc817d4, class mx8-era763e5847+sh256x27). It passes every part of the sub-version 3 rule: its load site 6 (instruction 23, source r6, a quarter window) reads a (c'') ratio of 0.9919 on the closed form and 0.9920 on the live day at the rule's own 2^20 sample, 0.012 above the 0.98 floor; live at 2^24 sequential nonces the site sends 3.35 percent of its reads to the top 0.1 percent of items (the multiples of 2^19: `rotl(x * stride, rot)` of a `mad` value that is near zero in a value class; r6 is zero in 0.0126 percent of evaluations, 1,677 reads of index 0 in 10^6 nonces), the top 0.1 percent of items taking 2.05x the window model's share, where the chip model's gate is 1.2x. + +Two fixes were on the table, with the rule that the one with the lower rejection rate on clean seeds wins if it reaches the class: (i) a per-site hot-item test at live scale (the top items' share per site against the window model, which needs a sample far above 2^20: at 2^20 evaluations the hot set is 272,544 word indices in 17,034 items, 0.13 reads per index, so no index-multiplicity statistic reads it; the item-share statistic at 2^20 reads 2.05x only with the 2^24 run's resolution); (ii) the per-site distinct-index floor of (c'') raised from 0.98 to the bottom of the clean seeds' spread. The distinct count is the same statistic as the collision excess the hot set produces: 3.35 percent of a site's reads landing on 0.1 percent of its window's items is about 0.8 percent of its evaluations repeating an index at 2^20, which is exactly the 0.992 the ratio reads, while the model's spread at that sample is 0.0001 (the collision count is near Poisson with mean n^2 / 2W = 8,192 on the quarter window, so a clean site reads 0.9997 to 1.0001; adv-accept's census of sub-version 3 clean seeds reads 0.9960 at the minimum site, 0.9990 at p1, 1.0000 at the median). + +The rule taken: `MIN_DISTINCT_RATIO_V5 = 0.995` (igneum-pow `accept.rs`, ab6f980b), applied by `check_indices_v5` on the ratio pass's own run when the candidate's class has the state flag: `site_index_stats` keeps every site's sorted word indices once (the distinct count, the colliding pairs, the most read index with its count), `distinct_ratio_on` names a site under 0.98 as (c'') first, then `hot_item_pass` names a site under 0.995 as (c''') `Reject::HotItemSite` with the ratio and the most read index. No class v4 verdict moves (the key is the state flag), no new sample is drawn, and the per-candidate cost is the sort (c'') already paid plus one linear pass. The exemplar is refused at attempt 2 under class v5; the class v5 draw moves to the next attempt; the class v4 draw still lands on it. The known-failed test `class_v5_hot_set_rule_known_failed_seed_100767` holds all of that and the genesis draws of both classes clearing the floor. The census test `v5_hot_census` (ignored; run by hand on a box) reads over 4,600 seeds of the f8 label space the class v4 accepted programs' minimum-site spread, the count under floors 0.98, 0.99, 0.995, 0.998 and 0.999, the attempts histogram of the class v4 and class v5 draws and the seeds whose v5 draw lands on another attempt: the clean rejection rate and the retried-draw cost of the number. Its reading goes in this section when it lands. + +What the floor does not reach, named: a hot set whose excess collisions at 2^20 stay under 0.5 percent of a site's evaluations (a top-0.1-percent item share under about 1.3x); adv-accept's lowest-ratio list between 0.995 and 0.998 reads 1.29x to 1.63x live on the f8 gate but no hot set by X_f >= f, and the floor rejects those too (cheap: one more attempt). A chip that holds 0.1 percent of a window's items serves at most the excess the floor allows, 0.5 percent of a site's reads, 1/16 of that over the program: under the 1.067x bound of AP-F8-1 by a wide margin. The per-site hot-item test at live scale stays owed only if the census reads the floor's clean rejection rate over 1 percent. From 9705a022ef16da0e1b6ddb4c4e9a2d81436ea5c0 Mon Sep 17 00:00:00 2001 From: igneum-labs <337424239+igneum-labs@users.noreply.github.com> Date: Wed, 7 Oct 2026 19:10:20 +0000 Subject: [PATCH 02/19] class v5 harness: the miners stop before the final sink and count read (a node's own newest block is a tip its peers have not seen yet; the 19:50 UK run compared sinks mid-propagation) Co-Authored-By: Claude Fable 5.1 --- infra/fast-time/class-v5-signal.mjs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/infra/fast-time/class-v5-signal.mjs b/infra/fast-time/class-v5-signal.mjs index 3ebc4fa88..9406bacfe 100644 --- a/infra/fast-time/class-v5-signal.mjs +++ b/infra/fast-time/class-v5-signal.mjs @@ -222,6 +222,11 @@ while (Date.now() - t0 < SECS * 1000) { if (firstV4 != null && daa != null && daa >= (firstV4.epoch + 3) * EPOCH) { endAt = +since(); break; } if (firstV4 == null && daa != null && daa >= EPOCHS * EPOCH) { endAt = +since(); break; } } +// the miners stop before the final read: with every node mining at the fast-time rate a node's own newest block is +// a tip its peers have not seen for a moment, and a read taken while they mine compares sinks mid-propagation (the +// 19:50 UK run of 7 October 2026 read 666/665/665 blocks and two sinks on three agreeing nodes). Their logs stay. +const nodeProcs = new Set(nodes.map(n => n.proc)); +for (const p of started) if (!nodeProcs.has(p)) { try { p.kill('SIGINT'); } catch { } } await sleep(3000); const dag = await Promise.all(nodes.map(async n => { try { return await n.rpc.call('getBlockDagInfo'); } catch (e) { return { error: e.message }; } })); From 15eeb5b5f605c331cdf242e8b1e615d9a7428853 Mon Sep 17 00:00:00 2001 From: igneum-labs <337424239+igneum-labs@users.noreply.github.com> Date: Wed, 7 Oct 2026 19:24:03 +0000 Subject: [PATCH 03/19] class v5: the (c''') census runner on box 2 through the pool lease (the suite's own test binary, the log copied under the harness dir) Co-Authored-By: Claude Fable 5.1 --- tools/class-v5/census-remote.sh | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100755 tools/class-v5/census-remote.sh diff --git a/tools/class-v5/census-remote.sh b/tools/class-v5/census-remote.sh new file mode 100755 index 000000000..d98f3b873 --- /dev/null +++ b/tools/class-v5/census-remote.sh @@ -0,0 +1,19 @@ +#!/usr/bin/env bash +# The class v5 (c''') census (docs/design/class-v5-stored-state.md section 14) on igneum-build-2 through the pool lease +# (main's rule, 7 October 2026, 20:17 UK: no sweep or thread-bound job starts on a box except through `lease pool`). +# Runs igneum-pow's ignored test `v5_hot_census` from the test binary the suite build left under the worktree's +# target (so the binary is the commit the suite judged), copies the log back under docs/design/class-v5-harness/. +# tools/class-v5/census-remote.sh [seeds] [from] [threads] defaults 4600 0 88 +set -euo pipefail +ROOT="$(cd "$(dirname "$0")/../.." && pwd)" +WT="$(basename "$ROOT")" +HOST=build@142.132.249.238 +KEY="$HOME/.ssh/igneum_ed25519" +REMOTE_ROOT="/srv/builds/$WT" +SEEDS="${1:-4600}"; FROM="${2:-0}"; THREADS="${3:-88}" +OUT="$ROOT/docs/design/class-v5-harness" +mkdir -p "$OUT" +LOG="v5-census-$SEEDS-$FROM.log" +ssh -i "$KEY" "$HOST" "set -e; cd $REMOTE_ROOT/igneum-pow; bin=\$(ls -t target/release/deps/igneum_pow-* | grep -v '\.d\$' | head -1); echo \"census: binary \$bin (\$(stat -c %y \$bin | cut -c1-19)), commit \$(git -C $REMOTE_ROOT rev-parse --short HEAD)\"; mkdir -p /srv/builds/_log/v5-class; /srv/builds/_bin/lease pool $THREADS --label 'class v5 (c''') census: $SEEDS seeds from $FROM' --owner class-v5 --min 16 -- env IGNEUM_V5_CENSUS_SEEDS=$SEEDS IGNEUM_V5_CENSUS_FROM=$FROM IGNEUM_V5_CENSUS_THREADS={cores} \$bin --ignored v5_hot_census --nocapture --test-threads 1 2>&1 | tee /srv/builds/_log/v5-class/$LOG" +rsync -a -e "ssh -i $KEY" "$HOST:/srv/builds/_log/v5-class/$LOG" "$OUT/" +echo "census: log at $OUT/$LOG" From 7acccc31e5c6c39e735e10b99436a293d429ad35 Mon Sep 17 00:00:00 2001 From: igneum-labs <337424239+igneum-labs@users.noreply.github.com> Date: Wed, 7 Oct 2026 19:25:53 +0000 Subject: [PATCH 04/19] class v5 census runner: the lease label without apostrophes (the remote shell read the (c''') mark as quotes) Co-Authored-By: Claude Fable 5.1 --- tools/class-v5/census-remote.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/class-v5/census-remote.sh b/tools/class-v5/census-remote.sh index d98f3b873..e5d3cece6 100755 --- a/tools/class-v5/census-remote.sh +++ b/tools/class-v5/census-remote.sh @@ -14,6 +14,6 @@ SEEDS="${1:-4600}"; FROM="${2:-0}"; THREADS="${3:-88}" OUT="$ROOT/docs/design/class-v5-harness" mkdir -p "$OUT" LOG="v5-census-$SEEDS-$FROM.log" -ssh -i "$KEY" "$HOST" "set -e; cd $REMOTE_ROOT/igneum-pow; bin=\$(ls -t target/release/deps/igneum_pow-* | grep -v '\.d\$' | head -1); echo \"census: binary \$bin (\$(stat -c %y \$bin | cut -c1-19)), commit \$(git -C $REMOTE_ROOT rev-parse --short HEAD)\"; mkdir -p /srv/builds/_log/v5-class; /srv/builds/_bin/lease pool $THREADS --label 'class v5 (c''') census: $SEEDS seeds from $FROM' --owner class-v5 --min 16 -- env IGNEUM_V5_CENSUS_SEEDS=$SEEDS IGNEUM_V5_CENSUS_FROM=$FROM IGNEUM_V5_CENSUS_THREADS={cores} \$bin --ignored v5_hot_census --nocapture --test-threads 1 2>&1 | tee /srv/builds/_log/v5-class/$LOG" +ssh -i "$KEY" "$HOST" "set -e; cd $REMOTE_ROOT/igneum-pow; bin=\$(ls -t target/release/deps/igneum_pow-* | grep -v '\.d\$' | head -1); echo \"census: binary \$bin (\$(stat -c %y \$bin | cut -c1-19)), commit \$(git -C $REMOTE_ROOT rev-parse --short HEAD)\"; mkdir -p /srv/builds/_log/v5-class; /srv/builds/_bin/lease pool $THREADS --label 'class v5 c3 census: $SEEDS seeds from $FROM' --owner class-v5 --min 16 -- env IGNEUM_V5_CENSUS_SEEDS=$SEEDS IGNEUM_V5_CENSUS_FROM=$FROM IGNEUM_V5_CENSUS_THREADS={cores} \$bin --ignored v5_hot_census --nocapture --test-threads 1 2>&1 | tee /srv/builds/_log/v5-class/$LOG" rsync -a -e "ssh -i $KEY" "$HOST:/srv/builds/_log/v5-class/$LOG" "$OUT/" echo "census: log at $OUT/$LOG" From 7bb87b096f0e4189b0f0925308e7ff62d8a938b8 Mon Sep 17 00:00:00 2001 From: igneum-labs <337424239+igneum-labs@users.noreply.github.com> Date: Wed, 7 Oct 2026 19:26:40 +0000 Subject: [PATCH 05/19] class v5 census runner: the test binary is the extension-less igneum_pow- (the first pick read an object file) Co-Authored-By: Claude Fable 5.1 --- tools/class-v5/census-remote.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/class-v5/census-remote.sh b/tools/class-v5/census-remote.sh index e5d3cece6..07b1798c9 100755 --- a/tools/class-v5/census-remote.sh +++ b/tools/class-v5/census-remote.sh @@ -14,6 +14,6 @@ SEEDS="${1:-4600}"; FROM="${2:-0}"; THREADS="${3:-88}" OUT="$ROOT/docs/design/class-v5-harness" mkdir -p "$OUT" LOG="v5-census-$SEEDS-$FROM.log" -ssh -i "$KEY" "$HOST" "set -e; cd $REMOTE_ROOT/igneum-pow; bin=\$(ls -t target/release/deps/igneum_pow-* | grep -v '\.d\$' | head -1); echo \"census: binary \$bin (\$(stat -c %y \$bin | cut -c1-19)), commit \$(git -C $REMOTE_ROOT rev-parse --short HEAD)\"; mkdir -p /srv/builds/_log/v5-class; /srv/builds/_bin/lease pool $THREADS --label 'class v5 c3 census: $SEEDS seeds from $FROM' --owner class-v5 --min 16 -- env IGNEUM_V5_CENSUS_SEEDS=$SEEDS IGNEUM_V5_CENSUS_FROM=$FROM IGNEUM_V5_CENSUS_THREADS={cores} \$bin --ignored v5_hot_census --nocapture --test-threads 1 2>&1 | tee /srv/builds/_log/v5-class/$LOG" +ssh -i "$KEY" "$HOST" "set -e; cd $REMOTE_ROOT/igneum-pow; bin=target/release/deps/\$(ls -t target/release/deps/ | grep -E '^igneum_pow-[0-9a-f]+\$' | head -1); echo \"census: binary \$bin (\$(stat -c %y \$bin | cut -c1-19)), commit \$(git -C $REMOTE_ROOT rev-parse --short HEAD)\"; mkdir -p /srv/builds/_log/v5-class; /srv/builds/_bin/lease pool $THREADS --label 'class v5 c3 census: $SEEDS seeds from $FROM' --owner class-v5 --min 16 -- env IGNEUM_V5_CENSUS_SEEDS=$SEEDS IGNEUM_V5_CENSUS_FROM=$FROM IGNEUM_V5_CENSUS_THREADS={cores} \$bin --ignored v5_hot_census --nocapture --test-threads 1 2>&1 | tee /srv/builds/_log/v5-class/$LOG" rsync -a -e "ssh -i $KEY" "$HOST:/srv/builds/_log/v5-class/$LOG" "$OUT/" echo "census: log at $OUT/$LOG" From 4d6218ee8442eb55684ce6dcd228a8e1b0d6a8cc Mon Sep 17 00:00:00 2001 From: igneum-labs <337424239+igneum-labs@users.noreply.github.com> Date: Wed, 7 Oct 2026 19:36:21 +0000 Subject: [PATCH 06/19] class v5 census runner: pick the test binary by --list (the CLI binary shares the igneum_pow- name; the first run held 64 pool cores for 9 minutes on the CLI's usage text) Co-Authored-By: Claude Fable 5.1 --- tools/class-v5/census-remote.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/class-v5/census-remote.sh b/tools/class-v5/census-remote.sh index 07b1798c9..1a18159f2 100755 --- a/tools/class-v5/census-remote.sh +++ b/tools/class-v5/census-remote.sh @@ -14,6 +14,6 @@ SEEDS="${1:-4600}"; FROM="${2:-0}"; THREADS="${3:-88}" OUT="$ROOT/docs/design/class-v5-harness" mkdir -p "$OUT" LOG="v5-census-$SEEDS-$FROM.log" -ssh -i "$KEY" "$HOST" "set -e; cd $REMOTE_ROOT/igneum-pow; bin=target/release/deps/\$(ls -t target/release/deps/ | grep -E '^igneum_pow-[0-9a-f]+\$' | head -1); echo \"census: binary \$bin (\$(stat -c %y \$bin | cut -c1-19)), commit \$(git -C $REMOTE_ROOT rev-parse --short HEAD)\"; mkdir -p /srv/builds/_log/v5-class; /srv/builds/_bin/lease pool $THREADS --label 'class v5 c3 census: $SEEDS seeds from $FROM' --owner class-v5 --min 16 -- env IGNEUM_V5_CENSUS_SEEDS=$SEEDS IGNEUM_V5_CENSUS_FROM=$FROM IGNEUM_V5_CENSUS_THREADS={cores} \$bin --ignored v5_hot_census --nocapture --test-threads 1 2>&1 | tee /srv/builds/_log/v5-class/$LOG" +ssh -i "$KEY" "$HOST" "set -e; cd $REMOTE_ROOT/igneum-pow; bin=; for c in \$(ls -t target/release/deps/ | grep -E '^igneum_pow-[0-9a-f]+\$'); do if target/release/deps/\$c --list 2>/dev/null | grep -q v5_hot_census; then bin=target/release/deps/\$c; break; fi; done; [ -n \"\$bin\" ] || { echo 'census: no test binary lists v5_hot_census (the CLI binary shares the igneum_pow- name)'; exit 3; }; echo \"census: binary \$bin (\$(stat -c %y \$bin | cut -c1-19)), commit \$(git -C $REMOTE_ROOT rev-parse --short HEAD)\"; mkdir -p /srv/builds/_log/v5-class; /srv/builds/_bin/lease pool $THREADS --label 'class v5 c3 census: $SEEDS seeds from $FROM' --owner class-v5 --min 16 -- env IGNEUM_V5_CENSUS_SEEDS=$SEEDS IGNEUM_V5_CENSUS_FROM=$FROM IGNEUM_V5_CENSUS_THREADS={cores} \$bin --ignored v5_hot_census --nocapture --test-threads 1 2>&1 | tee /srv/builds/_log/v5-class/$LOG" rsync -a -e "ssh -i $KEY" "$HOST:/srv/builds/_log/v5-class/$LOG" "$OUT/" echo "census: log at $OUT/$LOG" From 78714e59d5c619e520545bc380330d6d2a051d5f Mon Sep 17 00:00:00 2001 From: igneum-labs <337424239+igneum-labs@users.noreply.github.com> Date: Wed, 7 Oct 2026 19:39:16 +0000 Subject: [PATCH 07/19] class v5 design page: section 14 carries adv-accept's class v5 check of the exemplar (the hot set does not move under the state dataset) and the known-failed test's reading Co-Authored-By: Claude Fable 5.1 --- docs/design/class-v5-stored-state.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docs/design/class-v5-stored-state.md b/docs/design/class-v5-stored-state.md index db5466eca..7a7c7df8d 100644 --- a/docs/design/class-v5-stored-state.md +++ b/docs/design/class-v5-stored-state.md @@ -293,4 +293,8 @@ Two fixes were on the table, with the rule that the one with the lower rejection The rule taken: `MIN_DISTINCT_RATIO_V5 = 0.995` (igneum-pow `accept.rs`, ab6f980b), applied by `check_indices_v5` on the ratio pass's own run when the candidate's class has the state flag: `site_index_stats` keeps every site's sorted word indices once (the distinct count, the colliding pairs, the most read index with its count), `distinct_ratio_on` names a site under 0.98 as (c'') first, then `hot_item_pass` names a site under 0.995 as (c''') `Reject::HotItemSite` with the ratio and the most read index. No class v4 verdict moves (the key is the state flag), no new sample is drawn, and the per-candidate cost is the sort (c'') already paid plus one linear pass. The exemplar is refused at attempt 2 under class v5; the class v5 draw moves to the next attempt; the class v4 draw still lands on it. The known-failed test `class_v5_hot_set_rule_known_failed_seed_100767` holds all of that and the genesis draws of both classes clearing the floor. The census test `v5_hot_census` (ignored; run by hand on a box) reads over 4,600 seeds of the f8 label space the class v4 accepted programs' minimum-site spread, the count under floors 0.98, 0.99, 0.995, 0.998 and 0.999, the attempts histogram of the class v4 and class v5 draws and the seeds whose v5 draw lands on another attempt: the clean rejection rate and the retried-draw cost of the number. Its reading goes in this section when it lands. +The exemplar under class v5 itself (adv-accept, 20:36 UK, logs/adv-accept/v5-exemplar.log on branch adv-accept): the same base program and era drawn as generator 5 (id 2fd83dbae09c366d under 25c8063f, before (c''')), the dataset keyed by the Devnet 3 v5 pack's state stream (11 records, root 7e37a9fb...a311), the unmodified f8 census at 2^24 sequential nonces on day 20730, 589 warps checked against Epoch::hash_warp with 0 mismatches: hot-set test X_f +0.15514 percent at f = 0.1 percent (X/f 1.55, a hot set) against +0.15503 under class v4; top 0.1 percent share 2.0462x against 2.0455x; the same eight hottest items (0x000000 with 29,722 reads, then the other multiples of 2^19); site 6 carries 3.358 percent of its reads into the hot set against 3.350. The state leaf changes every dataset word and the hot set does not move by a part in a thousand: the concentration is the program's register dataflow at site 6 plus the era stride, and any dataset keyed through the same load address inherits it. That is why the floor on the index statistic (which the state does not touch) is the right instrument, and why class v5's dataset gives no cover. + +The known-failed test's reading on box 2 (20:33 UK): class v4 accepts the exemplar with site 6 at 0.9919 (1,031,917 distinct of 1,048,576, adv-accept's exact count; index 0 the most read, 235 times at the 2^20 random sample against 1,677 per 10^6 sequential nonces); class v5 refuses it at attempt 2 naming site 6 at 0.991; the class v5 draw lands on attempt 4 (program 734fbb8e3e4cd20f) and passes; the class v4 draw still lands on attempt 2; the genesis draws of both classes read 0.9990 at their minimum site. + What the floor does not reach, named: a hot set whose excess collisions at 2^20 stay under 0.5 percent of a site's evaluations (a top-0.1-percent item share under about 1.3x); adv-accept's lowest-ratio list between 0.995 and 0.998 reads 1.29x to 1.63x live on the f8 gate but no hot set by X_f >= f, and the floor rejects those too (cheap: one more attempt). A chip that holds 0.1 percent of a window's items serves at most the excess the floor allows, 0.5 percent of a site's reads, 1/16 of that over the program: under the 1.067x bound of AP-F8-1 by a wide margin. The per-site hot-item test at live scale stays owed only if the census reads the floor's clean rejection rate over 1 percent. From 658f6b91957512d1c2aae77430e75ba31ae04516 Mon Sep 17 00:00:00 2001 From: igneum-labs <337424239+igneum-labs@users.noreply.github.com> Date: Wed, 7 Oct 2026 19:40:48 +0000 Subject: [PATCH 08/19] class v5 design page: section 14 carries adv-accept's multiplicity reading at the acceptance sample Co-Authored-By: Claude Fable 5.1 --- docs/design/class-v5-stored-state.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/design/class-v5-stored-state.md b/docs/design/class-v5-stored-state.md index 7a7c7df8d..5d7a48f0e 100644 --- a/docs/design/class-v5-stored-state.md +++ b/docs/design/class-v5-stored-state.md @@ -297,4 +297,6 @@ The exemplar under class v5 itself (adv-accept, 20:36 UK, logs/adv-accept/v5-exe The known-failed test's reading on box 2 (20:33 UK): class v4 accepts the exemplar with site 6 at 0.9919 (1,031,917 distinct of 1,048,576, adv-accept's exact count; index 0 the most read, 235 times at the 2^20 random sample against 1,677 per 10^6 sequential nonces); class v5 refuses it at attempt 2 naming site 6 at 0.991; the class v5 draw lands on attempt 4 (program 734fbb8e3e4cd20f) and passes; the class v4 draw still lands on attempt 2; the genesis draws of both classes read 0.9990 at their minimum site. +The multiplicity reading at the acceptance sample (adv-accept's gap tool, 20:4x UK, logs/adv-accept/gap-rep8.log): the exemplar's site 6 spends 0.168 percent (closed form) and 0.151 percent (live day) of its 2^20 reads on word indices read 8 or more times, every other site 0.000 percent; seed 100211 (d07885a437e237c7) reads site 9 at 0.186 / 0.179 percent with ratio 0.9907 / 0.9908; the control program reads 0.000 at every site. Items are 16 words and 2^24 of them, so 3.35 percent of a site's reads into the top 0.1 percent of items at 2^24 sequential nonces reads as 0.17 percent on heavily repeated word indices at 2^20, and the distinct count the floor reads carries the same signal with the model's spread of 0.0001 under it. The multiplicity statistic would be the second instrument if the floor's clean rejection rate read high; the census decides. + What the floor does not reach, named: a hot set whose excess collisions at 2^20 stay under 0.5 percent of a site's evaluations (a top-0.1-percent item share under about 1.3x); adv-accept's lowest-ratio list between 0.995 and 0.998 reads 1.29x to 1.63x live on the f8 gate but no hot set by X_f >= f, and the floor rejects those too (cheap: one more attempt). A chip that holds 0.1 percent of a window's items serves at most the excess the floor allows, 0.5 percent of a site's reads, 1/16 of that over the program: under the 1.067x bound of AP-F8-1 by a wide margin. The per-site hot-item test at live scale stays owed only if the census reads the floor's clean rejection rate over 1 percent. From 9ac364b722382a8352a4144d174d920bf611d421 Mon Sep 17 00:00:00 2001 From: igneum-labs <337424239+igneum-labs@users.noreply.github.com> Date: Wed, 7 Oct 2026 19:41:44 +0000 Subject: [PATCH 09/19] class v5 census runner: lease class v5 (the pool's priority classes, lease 5d84d644) Co-Authored-By: Claude Fable 5.1 --- tools/class-v5/census-remote.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/class-v5/census-remote.sh b/tools/class-v5/census-remote.sh index 1a18159f2..a2f0fdae2 100755 --- a/tools/class-v5/census-remote.sh +++ b/tools/class-v5/census-remote.sh @@ -14,6 +14,6 @@ SEEDS="${1:-4600}"; FROM="${2:-0}"; THREADS="${3:-88}" OUT="$ROOT/docs/design/class-v5-harness" mkdir -p "$OUT" LOG="v5-census-$SEEDS-$FROM.log" -ssh -i "$KEY" "$HOST" "set -e; cd $REMOTE_ROOT/igneum-pow; bin=; for c in \$(ls -t target/release/deps/ | grep -E '^igneum_pow-[0-9a-f]+\$'); do if target/release/deps/\$c --list 2>/dev/null | grep -q v5_hot_census; then bin=target/release/deps/\$c; break; fi; done; [ -n \"\$bin\" ] || { echo 'census: no test binary lists v5_hot_census (the CLI binary shares the igneum_pow- name)'; exit 3; }; echo \"census: binary \$bin (\$(stat -c %y \$bin | cut -c1-19)), commit \$(git -C $REMOTE_ROOT rev-parse --short HEAD)\"; mkdir -p /srv/builds/_log/v5-class; /srv/builds/_bin/lease pool $THREADS --label 'class v5 c3 census: $SEEDS seeds from $FROM' --owner class-v5 --min 16 -- env IGNEUM_V5_CENSUS_SEEDS=$SEEDS IGNEUM_V5_CENSUS_FROM=$FROM IGNEUM_V5_CENSUS_THREADS={cores} \$bin --ignored v5_hot_census --nocapture --test-threads 1 2>&1 | tee /srv/builds/_log/v5-class/$LOG" +ssh -i "$KEY" "$HOST" "set -e; cd $REMOTE_ROOT/igneum-pow; bin=; for c in \$(ls -t target/release/deps/ | grep -E '^igneum_pow-[0-9a-f]+\$'); do if target/release/deps/\$c --list 2>/dev/null | grep -q v5_hot_census; then bin=target/release/deps/\$c; break; fi; done; [ -n \"\$bin\" ] || { echo 'census: no test binary lists v5_hot_census (the CLI binary shares the igneum_pow- name)'; exit 3; }; echo \"census: binary \$bin (\$(stat -c %y \$bin | cut -c1-19)), commit \$(git -C $REMOTE_ROOT rev-parse --short HEAD)\"; mkdir -p /srv/builds/_log/v5-class; /srv/builds/_bin/lease pool $THREADS --label 'v5 gate: c3 census, $SEEDS seeds from $FROM' --owner class-v5 --class v5 --min 16 -- env IGNEUM_V5_CENSUS_SEEDS=$SEEDS IGNEUM_V5_CENSUS_FROM=$FROM IGNEUM_V5_CENSUS_THREADS={cores} \$bin --ignored v5_hot_census --nocapture --test-threads 1 2>&1 | tee /srv/builds/_log/v5-class/$LOG" rsync -a -e "ssh -i $KEY" "$HOST:/srv/builds/_log/v5-class/$LOG" "$OUT/" echo "census: log at $OUT/$LOG" From f8e6d9f84a8633976484bd66b59c10c0cc8dc47d Mon Sep 17 00:00:00 2001 From: igneum-labs <337424239+igneum-labs@users.noreply.github.com> Date: Wed, 7 Oct 2026 19:51:43 +0000 Subject: [PATCH 10/19] class v5 harness: the stale miner's fall-off is judged by the block's DAA score (a nonce found on a pre-boundary template and submitted after it is a flip-epoch block, valid; the wall-clock count failed the 20:4x UK run on one such block), nonces matched as the nearest double the JSON RPC carries Co-Authored-By: Claude Fable 5.1 --- infra/fast-time/class-v5-signal.mjs | 29 +++++++++++++++++++++++++---- 1 file changed, 25 insertions(+), 4 deletions(-) diff --git a/infra/fast-time/class-v5-signal.mjs b/infra/fast-time/class-v5-signal.mjs index 9406bacfe..d6c98dcca 100644 --- a/infra/fast-time/class-v5-signal.mjs +++ b/infra/fast-time/class-v5-signal.mjs @@ -237,7 +237,7 @@ async function allBlocks(n) { const r = await n.rpc.call('getBlocks', { lowHash: low, includeBlocks: true, includeTransactions: false }); const blocks = r.blocks || []; let added = 0; - for (const b of blocks) { const h = b.verboseData?.hash || b.header?.hash; if (seen.has(h)) continue; seen.add(h); out.push({ hash: h, daa: +b.header.daaScore, version: +b.header.version, chain: !!b.verboseData?.isChainBlock }); added++; } + for (const b of blocks) { const h = b.verboseData?.hash || b.header?.hash; if (seen.has(h)) continue; seen.add(h); out.push({ hash: h, daa: +b.header.daaScore, version: +b.header.version, nonce: Number(b.header.nonce ?? 0), chain: !!b.verboseData?.isChainBlock }); added++; } if (!blocks.length || added === 0) break; low = (r.blockHashes || []).at(-1) || blocks.at(-1).verboseData?.hash; if (!low) break; } @@ -332,9 +332,30 @@ const statelessAcceptedAfterFlip = statelessNode ? acceptedAfter(statelessNode.i const honestAcceptedAfterFlip = SIGNALLING.filter(n => n.i !== STALE).map(n => acceptedAfter(n.i, flipAtMs)); // the refusal reaches the miner as a template error and the node's log as the engine's line; either counts const statelessRefusals = statelessNode ? statelessNode.grepLog(REFUSAL_LINE).length + minerLog(statelessNode.i).filter(l => REFUSAL_LINE.test(l)).length : 0; -// the stale miner: accepted after the FIRST REFRESH after the flip (one epoch later), and its rejections -const refreshWall = flipAtMs == null ? null : flipAtMs + EPOCH * 1000; -const staleAcceptedAfterRefresh = STALE == null ? null : acceptedAfter(STALE, refreshWall); +// the stale miner: accepted blocks IN the first refresh epoch after the flip or later (its frozen leaves are the flip +// epoch's; from the next epoch its blocks fail PoW), and its rejections. Judged by the block's DAA score, not the wall +// clock: a nonce found on a template taken before the boundary and submitted a few seconds after it is a flip-epoch +// block (the 20:4x UK run of 7 October 2026 read one such ACCEPTED line, "template 2 gens old", 4.7 s after the +// boundary's wall time, and the wall-clock form of this count failed the case on a block that was valid). The miner's +// ACCEPTED line carries the nonce; the chain carries the nonce and the DAA score of every block. +const refreshDaa = firstV4 ? (firstV4.epoch + 1) * EPOCH : null; +// the JSON RPC carries the 64-bit nonce as a JSON number, so the node's value arrives as the nearest double; Number(BigInt(hex)) +// of the miner's line is the nearest double to the same integer, so the two keys are equal (660 blocks never share one) +const blockByNonce = new Map(blocks.map(b => [b.nonce, b])); +function acceptedAtOrAboveDaa(i, daa) { + if (daa == null) return 0; + let count = 0, unmatched = 0; + for (const l of minerLog(i)) { + const m = /ACCEPTED block nonce=(0x[0-9a-f]+)/.exec(l); + if (!m) continue; + const b = blockByNonce.get(Number(BigInt(m[1]))); + if (!b) { unmatched++; continue; } + if (b.daa >= daa) count++; + } + if (unmatched) log(`miner ${i}: ${unmatched} ACCEPTED nonce(s) not found on the chain read from n0 (pruned or a side block)`); + return count; +} +const staleAcceptedAfterRefresh = STALE == null ? null : acceptedAtOrAboveDaa(STALE, refreshDaa); const staleRejected = STALE == null ? null : rejectedMiner[STALE].length; const daysSeen = [...new Set([...dayOfEpoch.values()])]; const sinks = dag.map(d => String(d.sink || '?').slice(0, 16)); From 0d5570e2995788805fa2715117420c304d337d5a Mon Sep 17 00:00:00 2001 From: igneum-labs <337424239+igneum-labs@users.noreply.github.com> Date: Wed, 7 Oct 2026 20:04:35 +0000 Subject: [PATCH 11/19] class v5 (c'''): the census number in the record (4,600 f8 seeds: 2.435 percent of sub-version 3 accepted programs under 0.995, attempts mean 2.174 to 2.248, 0 class v5 programs under the floor; 0.99 would pass the exemplar), the flip-stale PASS on the matched binaries Co-Authored-By: Claude Fable 5.1 --- docs/design/class-v5-harness/flip-stale.json | 914 +++++++++--------- docs/design/class-v5-harness/flip-stale.log | 149 ++- .../class-v5-harness/v5-census-4600-0.log | 46 + docs/design/class-v5-stored-state.md | 5 +- igneum-pow/src/accept.rs | 23 +- 5 files changed, 573 insertions(+), 564 deletions(-) create mode 100644 docs/design/class-v5-harness/v5-census-4600-0.log diff --git a/docs/design/class-v5-harness/flip-stale.json b/docs/design/class-v5-harness/flip-stale.json index 1a4df1b5b..d0c8403d2 100644 --- a/docs/design/class-v5-harness/flip-stale.json +++ b/docs/design/class-v5-harness/flip-stale.json @@ -25,6 +25,7 @@ "v5_ids_equal_the_cli_v5_id": true, "v5_ids_differ_from_the_same_seed_v4_id": true, "a_v5_epoch_per_window_refresh": true, + "accepted_parser_proved": true, "stateless_node_mines_nothing_after_the_flip": true, "stateless_node_stops_at_the_flip": true, "stale_miner_falls_off_at_the_first_refresh": true @@ -40,44 +41,49 @@ "floor_epoch": 1667, "stale_miner": 2, "stale_accepted_after_first_refresh": 0, - "stale_rejected": 59, + "honest_accepted_after_flip": [ + 78, + 77 + ], + "stale_rejected": 44, "stateless_node": 3, "stateless_accepted_after_flip": 0, "stateless_refusal_lines": 14, "state_roots_at_flip": [ - "0x74ca7aec647f5b7cfff9f04ac9196a2db54d3ccbe9290899fa6b8da489ac56a8", - "0x74ca7aec647f5b7cfff9f04ac9196a2db54d3ccbe9290899fa6b8da489ac56a8", - "0x74ca7aec647f5b7cfff9f04ac9196a2db54d3ccbe9290899fa6b8da489ac56a8" + "0xf0b0138c8456840275a765eb3fec28b3d89544a285889994d71c47a00c993056", + "0xf0b0138c8456840275a765eb3fec28b3d89544a285889994d71c47a00c993056", + "0xf0b0138c8456840275a765eb3fec28b3d89544a285889994d71c47a00c993056" ], "streams": { - "9": { - "root": "0xbf6b97cebb029f8199c4d19462fcde08a89fc15e7789528b8355e0b89ab6fd55", + "8": { + "root": "0x3205dcb6f3e9573f73676333a9817f0777ab43d4ef19f9cfdeb97b29dae29020", "records": 17, - "block": "08bff267814458466da2510361d672abbec2057abab36c198f10892e49a5ac23" + "block": "bf2cc4ee6f98f731bdc646795d010d7880961c54e49b5d0ea13ddb1dc9c3073e" + }, + "9": { + "root": "0xfcd516d490df275d67e44019c1475e47b9e2b81e719d59aec329a2bb4cb97fde", + "records": 17, + "block": "e084365e803420258551678e63571b3957c32111c4808db73b5d3c80cfbb50e7" }, "10": { - "root": "0x3cc8212d577bf3210e2431eabccdec1183200572009be61d6ef4c4ee52eedc0c", + "root": "0x2dea45d42e7c95ec5f27100de0ceae3264eb8e9094c897375d64cac064552aef", "records": 17, - "block": "07f52472cc3bb9a729951af3b692e1a91b1eb3d00c5f33120165f8bb7fa55bf0" - }, - "11": { - "root": "0x74ca7aec647f5b7cfff9f04ac9196a2db54d3ccbe9290899fa6b8da489ac56a8", - "records": 17, - "block": "c62861f9c90ea32dc681150cab48664c3a34fa2a88957f29abc1376c4ebe3bba" + "block": "21da0d26c9008547447f0bacd1e8abf33f926b2f8876da9c5d2e88271f1bb0a6" } }, "days_seen": [ - 1244010 + 1244029, + 1244030 ], - "day_boundary_crossed": false, + "day_boundary_crossed": true, "node": "/srv/builds/igneum-wt-class-v5/vendor/igneum-node-class-v5/target/release/igneumd", "miner": "/srv/builds/igneum-wt-class-v5/vendor/igneum-node-class-v5/target/release/igneum-miner", "template_switch": { "epoch": 8, "daa": 480, - "at": 486.4 + "at": 476.5 }, - "run_ended_at_s": 694.7, + "run_ended_at_s": 658.6, "final_daa": 660, "max_epoch_seen": 11, "epochs": { @@ -89,126 +95,126 @@ "bps": 0, "bps5": 0, "signal_epoch": null, - "day": 1244010 + "day": 1244029 }, "1": { "class": 3, "firstSeenDaa": 60, - "at": 36.9, + "at": 56, "eraSeed": "234e082d653dc69db36d875b256d0f5f4a123b353d6aa069c3c7aa9aa6c46062", - "bps": 10000, + "bps": 0, "bps5": 10000, "signal_epoch": null, - "day": 1244010 + "day": 1244029 }, "2": { "class": 4, - "firstSeenDaa": 121, - "at": 107, + "firstSeenDaa": 120, + "at": 133, "eraSeed": "234e082d653dc69db36d875b256d0f5f4a123b353d6aa069c3c7aa9aa6c46062", - "bps": 10000, + "bps": 0, "bps5": 10000, "signal_epoch": null, - "day": 1244010 + "day": 1244029 }, "3": { "class": 4, "firstSeenDaa": 180, - "at": 179.1, + "at": 197.1, "eraSeed": "234e082d653dc69db36d875b256d0f5f4a123b353d6aa069c3c7aa9aa6c46062", - "bps": 10000, + "bps": 0, "bps5": 10000, "signal_epoch": null, - "day": 1244010 + "day": 1244029 }, "4": { "class": 4, - "firstSeenDaa": 241, - "at": 234.1, + "firstSeenDaa": 240, + "at": 258.2, "eraSeed": "234e082d653dc69db36d875b256d0f5f4a123b353d6aa069c3c7aa9aa6c46062", - "bps": 10000, + "bps": 0, "bps5": 10000, "signal_epoch": null, - "day": 1244010 + "day": 1244029 }, "5": { "class": 4, "firstSeenDaa": 300, - "at": 297.2, + "at": 313.2, "eraSeed": "234e082d653dc69db36d875b256d0f5f4a123b353d6aa069c3c7aa9aa6c46062", - "bps": 10000, + "bps": 0, "bps5": 10000, "signal_epoch": null, - "day": 1244010 + "day": 1244029 }, "6": { "class": 4, "firstSeenDaa": 360, - "at": 355.2, + "at": 368.3, "eraSeed": "234e082d653dc69db36d875b256d0f5f4a123b353d6aa069c3c7aa9aa6c46062", - "bps": 10000, + "bps": 0, "bps5": 10000, "signal_epoch": null, - "day": 1244010 + "day": 1244029 }, "7": { "class": 4, "firstSeenDaa": 420, - "at": 408.3, + "at": 423.4, "eraSeed": "234e082d653dc69db36d875b256d0f5f4a123b353d6aa069c3c7aa9aa6c46062", - "bps": 10000, + "bps": 0, "bps5": 10000, "signal_epoch": null, - "day": 1244010 + "day": 1244029 }, "8": { "class": 5, "firstSeenDaa": 480, - "at": 486.4, + "at": 476.5, "eraSeed": "234e082d653dc69db36d875b256d0f5f4a123b353d6aa069c3c7aa9aa6c46062", - "bps": 10000, + "bps": 0, "bps5": 10000, "signal_epoch": 8, - "day": 1244010 + "day": 1244029 }, "9": { "class": 5, - "firstSeenDaa": 541, - "at": 561.5, + "firstSeenDaa": 540, + "at": 541.5, "eraSeed": "234e082d653dc69db36d875b256d0f5f4a123b353d6aa069c3c7aa9aa6c46062", - "bps": 10000, + "bps": 0, "bps5": 10000, "signal_epoch": null, - "day": 1244010 + "day": 1244030 }, "10": { "class": 5, "firstSeenDaa": 600, - "at": 632.6, + "at": 600.6, "eraSeed": "234e082d653dc69db36d875b256d0f5f4a123b353d6aa069c3c7aa9aa6c46062", - "bps": 10000, + "bps": 0, "bps5": 10000, "signal_epoch": null, - "day": 1244010 + "day": 1244030 }, "11": { "class": 5, "firstSeenDaa": 660, - "at": 694.7, + "at": 658.6, "eraSeed": "234e082d653dc69db36d875b256d0f5f4a123b353d6aa069c3c7aa9aa6c46062", - "bps": 10000, + "bps": 0, "bps5": 10000, "signal_epoch": null, - "day": 1244010 + "day": 1244030 } }, "blocks": { - "total": 664, - "before_boundary": 481, - "after_boundary": 183, + "total": 661, + "before_boundary": 484, + "after_boundary": 177, "version_bytes": { "0": 1, - "6": 663 + "6": 660 }, "signal_share_bps_on_chain": 9985 }, @@ -224,88 +230,80 @@ { "epoch": 1, "class": "v3", - "program_id": "139e4c872af8a28a", - "seed": "511d26248aa5df3d", + "program_id": "bf5c79297f21cd14", + "seed": "d62a0bf975cfcdce", "miners": 4, "disagree": false }, { "epoch": 2, "class": "v4", - "program_id": "8727c996510a4944", - "seed": "b87694a4e7d5e253", + "program_id": "bd58b4a60663e105", + "seed": "6331b11d22b1ff0d", "miners": 4, "disagree": false }, { "epoch": 3, "class": "v4", - "program_id": "83be12e05c20b628", - "seed": "d77874fccdd82c2a", + "program_id": "12a925ef8ae98242", + "seed": "da0dbe11eee5394e", "miners": 4, "disagree": false }, { "epoch": 4, "class": "v4", - "program_id": "1667f52dc03154ea", - "seed": "ab80fe04d842616e", + "program_id": "58770b5a2ce43ac9", + "seed": "20b1a213342d23d3", "miners": 4, "disagree": false }, { "epoch": 5, "class": "v4", - "program_id": "2c2f412c04ec342f", - "seed": "85c3733f0ae81d59", + "program_id": "1791cf34b8402793", + "seed": "01338df19000d670", "miners": 4, "disagree": false }, { "epoch": 6, "class": "v4", - "program_id": "b73250ab4712e1e3", - "seed": "208b626b2a1280e9", + "program_id": "55223851706657a9", + "seed": "fc9cd721fa890fb2", "miners": 4, "disagree": false }, { "epoch": 7, "class": "v4", - "program_id": "ec48ca85f60da0ff", - "seed": "6048ca2a6bc96645", + "program_id": "5e0efbbf70eee106", + "seed": "63725c18688c0d98", "miners": 4, "disagree": false }, { "epoch": 8, "class": "v5", - "program_id": "d08d85950066de4d", - "seed": "268c6593e67a9dd7", + "program_id": "26e09c25f5851738", + "seed": "bf2cc4ee6f98f731", "miners": 3, "disagree": false }, { "epoch": 9, "class": "v5", - "program_id": "3208c2111780c61b", - "seed": "08bff26781445846", + "program_id": "f61eb472b42066cf", + "seed": "e084365e80342025", "miners": 3, "disagree": false }, { "epoch": 10, "class": "v5", - "program_id": "a829ce27d55d786a", - "seed": "07f52472cc3bb9a7", - "miners": 3, - "disagree": false - }, - { - "epoch": 11, - "class": "v5", - "program_id": "14e1299c3e3f892c", - "seed": "c62861f9c90ea32d", + "program_id": "e9535034ee509f57", + "seed": "21da0d26c9008547", "miners": 3, "disagree": false } @@ -313,83 +311,73 @@ "program_id_rows": [ { "epoch": 8, - "seed": "268c6593e67a9dd7", - "miners_id": "d08d85950066de4d", + "seed": "bf2cc4ee6f98f731", + "miners_id": "26e09c25f5851738", "miners": 3, - "cli_v4": "fa9cfb45ea50369e", - "cli_v5": null, - "state_root": null, - "state_records": null + "cli_v4": "7b7c33e82a76a7cd", + "cli_v5": "26e09c25f5851738", + "state_root": "0x3205dcb6f3e9573f73676333a9817f0777ab43d4ef19f9cfdeb97b29dae29020", + "state_records": 17 }, { "epoch": 9, - "seed": "08bff26781445846", - "miners_id": "3208c2111780c61b", + "seed": "e084365e80342025", + "miners_id": "f61eb472b42066cf", "miners": 3, - "cli_v4": "051361b422d5ab40", - "cli_v5": "3208c2111780c61b", - "state_root": "0xbf6b97cebb029f8199c4d19462fcde08a89fc15e7789528b8355e0b89ab6fd55", + "cli_v4": "41aa829f244c1d36", + "cli_v5": "f61eb472b42066cf", + "state_root": "0xfcd516d490df275d67e44019c1475e47b9e2b81e719d59aec329a2bb4cb97fde", "state_records": 17 }, { "epoch": 10, - "seed": "07f52472cc3bb9a7", - "miners_id": "a829ce27d55d786a", + "seed": "21da0d26c9008547", + "miners_id": "e9535034ee509f57", "miners": 3, - "cli_v4": "da0bf8b3363f1f75", - "cli_v5": "a829ce27d55d786a", - "state_root": "0x3cc8212d577bf3210e2431eabccdec1183200572009be61d6ef4c4ee52eedc0c", - "state_records": 17 - }, - { - "epoch": 11, - "seed": "c62861f9c90ea32d", - "miners_id": "14e1299c3e3f892c", - "miners": 3, - "cli_v4": "42560cc9c8175b5b", - "cli_v5": "14e1299c3e3f892c", - "state_root": "0x74ca7aec647f5b7cfff9f04ac9196a2db54d3ccbe9290899fa6b8da489ac56a8", + "cli_v4": "07707180e509384e", + "cli_v5": "e9535034ee509f57", + "state_root": "0x2dea45d42e7c95ec5f27100de0ceae3264eb8e9094c897375d64cac064552aef", "state_records": 17 } ], "accepted_per_miner": [ - 199, - 194, - 134, - 136 + 198, + 197, + 146, + 119 ], "rejected_by_miners": [ 0, 0, - 59, + 44, 0 ], "rejected_by_nodes": [ 0, 0, - 59 + 44 ], "sinks": [ - "cbaa8a516e2350f2", - "cbaa8a516e2350f2", - "cbaa8a516e2350f2", - "21f187edb6341649" + "7fb15f8172fa0cba", + "7fb15f8172fa0cba", + "7fb15f8172fa0cba", + "c330a3cfba60380a" ], "block_counts": [ - 663, - 663, - 663, - 480 + 660, + 660, + 660, + 483 ], "signal_lines": [ - "Program class v5 by miner signal: epoch 8 (share 10000 bps at byte 6 or above over 60 DAA ending at seed block 268c6593e67a9dd74d676e8bed9a9425df30ab048aec9b80077394cb668242ba, threshold 9500 bps in each of 7 consecutive windows, weakest 10000 bps, shares oldest first [10000, 10000, 10000, 10000, 10000, 10000, 10000], 420 of 420 blue blocks)", - "Program class v5 by miner signal: epoch 8 (share 10000 bps at byte 6 or above over 60 DAA ending at seed block 268c6593e67a9dd74d676e8bed9a9425df30ab048aec9b80077394cb668242ba, threshold 9500 bps in each of 7 consecutive windows, weakest 10000 bps, shares oldest first [10000, 10000, 10000, 10000, 10000, 10000, 10000], 420 of 420 blue blocks)", - "Program class v5 by miner signal: epoch 8 (share 10000 bps at byte 6 or above over 60 DAA ending at seed block 268c6593e67a9dd74d676e8bed9a9425df30ab048aec9b80077394cb668242ba, threshold 9500 bps in each of 7 consecutive windows, weakest 10000 bps, shares oldest first [10000, 10000, 10000, 10000, 10000, 10000, 10000], 420 of 420 blue blocks)" + "Program class v5 by miner signal: epoch 8 (share 10000 bps at byte 6 over 60 DAA ending at seed block bf2cc4ee6f98f731bdc646795d010d7880961c54e49b5d0ea13ddb1dc9c3073e, threshold 9500 bps in each of 7 consecutive windows, weakest 10000 bps, shares oldest first [10000, 10000, 10000, 10000, 10000, 10000, 10000], 420 of 420 blue blocks)", + "Program class v5 by miner signal: epoch 8 (share 10000 bps at byte 6 over 60 DAA ending at seed block bf2cc4ee6f98f731bdc646795d010d7880961c54e49b5d0ea13ddb1dc9c3073e, threshold 9500 bps in each of 7 consecutive windows, weakest 10000 bps, shares oldest first [10000, 10000, 10000, 10000, 10000, 10000, 10000], 420 of 420 blue blocks)", + "Program class v5 by miner signal: epoch 8 (share 10000 bps at byte 6 over 60 DAA ending at seed block bf2cc4ee6f98f731bdc646795d010d7880961c54e49b5d0ea13ddb1dc9c3073e, threshold 9500 bps in each of 7 consecutive windows, weakest 10000 bps, shares oldest first [10000, 10000, 10000, 10000, 10000, 10000, 10000], 420 of 420 blue blocks)" ], "floor_lines": [ - "Program class v5 from the override file: enabled, the floor at epoch 1667 (DAA score 100000 rounded up to the epoch boundary at 100020); the class v5 signal (byte 6 or above, 9500 bps in each of 7 consecutive windows) can flip v4 to v5 before it; every item of the dataset is keyed by the execution state after the epoch's seed block", - "Program class v5 from the override file: enabled, the floor at epoch 1667 (DAA score 100000 rounded up to the epoch boundary at 100020); the class v5 signal (byte 6 or above, 9500 bps in each of 7 consecutive windows) can flip v4 to v5 before it; every item of the dataset is keyed by the execution state after the epoch's seed block", - "Program class v5 from the override file: enabled, the floor at epoch 1667 (DAA score 100000 rounded up to the epoch boundary at 100020); the class v5 signal (byte 6 or above, 9500 bps in each of 7 consecutive windows) can flip v4 to v5 before it; every item of the dataset is keyed by the execution state after the epoch's seed block" + "Program class v5 from the override file: enabled, the floor at epoch 1667 (DAA score 100000 rounded up to the epoch boundary at 100020); the class v5 signal (byte 6, 9500 bps in each of 7 consecutive windows) can flip v4 to v5 before it; every item of the dataset is keyed by the execution state after the epoch's seed block", + "Program class v5 from the override file: enabled, the floor at epoch 1667 (DAA score 100000 rounded up to the epoch boundary at 100020); the class v5 signal (byte 6, 9500 bps in each of 7 consecutive windows) can flip v4 to v5 before it; every item of the dataset is keyed by the execution state after the epoch's seed block", + "Program class v5 from the override file: enabled, the floor at epoch 1667 (DAA score 100000 rounded up to the epoch boundary at 100020); the class v5 signal (byte 6, 9500 bps in each of 7 consecutive windows) can flip v4 to v5 before it; every item of the dataset is keyed by the execution state after the epoch's seed block" ], "samples": [ { @@ -408,632 +396,604 @@ }, { "t": 20.9, - "daa": 29, + "daa": 8, "epoch": 0, "class": 2, - "bps": 10000, + "bps": 0, "bps5": 10000, "nodes": [ - "29/57e79fe0", - "29/57e79fe0", - "29/57e79fe0", - "29/57e79fe0" + "8/6939d755", + "8/6939d755", + "8/6939d755", + "8/6939d755" ] }, { "t": 35.9, - "daa": 59, + "daa": 36, "epoch": 0, "class": 2, - "bps": 10000, + "bps": 0, "bps5": 10000, "nodes": [ - "59/8c19d208", - "59/8c19d208", - "59/8c19d208", - "59/8c19d208" + "36/2c682cc1", + "36/2c682cc1", + "36/2c682cc1", + "36/2c682cc1" ] }, { "t": 50.9, + "daa": 55, + "epoch": 0, + "class": 2, + "bps": 0, + "bps5": 10000, + "nodes": [ + "55/94f7f9fd", + "55/94f7f9fd", + "55/94f7f9fd", + "55/94f7f9fd" + ] + }, + { + "t": 66, "daa": 63, "epoch": 1, "class": 3, - "bps": 10000, + "bps": 0, "bps5": 10000, "nodes": [ - "63/25731901", - "63/25731901", - "63/25731901", - "63/25731901" + "63/147b2936", + "63/147b2936", + "63/147b2936", + "63/147b2936" ] }, { - "t": 65.9, - "daa": 71, + "t": 81, + "daa": 66, "epoch": 1, "class": 3, - "bps": 10000, + "bps": 0, "bps5": 10000, "nodes": [ - "71/8acff126", - "71/8acff126", - "71/8acff126", - "71/8acff126" - ] - }, - { - "t": 80.9, - "daa": 82, - "epoch": 1, - "class": 3, - "bps": 10000, - "bps5": 10000, - "nodes": [ - "82/83272ecc", - "82/83272ecc", - "82/83272ecc", - "82/83272ecc" + "66/60ae17e2", + "66/60ae17e2", + "66/60ae17e2", + "66/60ae17e2" ] }, { "t": 96, - "daa": 106, + "daa": 72, "epoch": 1, "class": 3, - "bps": 10000, + "bps": 0, "bps5": 10000, "nodes": [ - "106/5c2063f1", - "106/5c2063f1", - "106/5c2063f1", - "106/5c2063f1" + "72/6469405c", + "72/6469405c", + "72/6469405c", + "72/6469405c" ] }, { "t": 111, - "daa": 125, - "epoch": 2, - "class": 4, - "bps": 10000, + "daa": 88, + "epoch": 1, + "class": 3, + "bps": 0, "bps5": 10000, "nodes": [ - "125/1a1ed97e", - "125/1a1ed97e", - "125/1a1ed97e", - "125/1a1ed97e" + "88/89a6958b", + "88/89a6958b", + "88/89a6958b", + "88/89a6958b" ] }, { "t": 126, + "daa": 109, + "epoch": 1, + "class": 3, + "bps": 0, + "bps5": 10000, + "nodes": [ + "109/4ca548e8", + "109/4ca548e8", + "109/4ca548e8", + "109/4ca548e8" + ] + }, + { + "t": 141.1, + "daa": 122, + "epoch": 2, + "class": 4, + "bps": 0, + "bps5": 10000, + "nodes": [ + "122/9fce4e5c", + "122/9fce4e5c", + "122/9fce4e5c", + "122/9fce4e5c" + ] + }, + { + "t": 156.1, "daa": 142, "epoch": 2, "class": 4, - "bps": 10000, + "bps": 0, "bps5": 10000, "nodes": [ - "142/bdd5d432", - "142/bdd5d432", - "142/bdd5d432", - "142/bdd5d432" + "142/2ea761fb", + "142/2ea761fb", + "142/2ea761fb", + "142/2ea761fb" ] }, { - "t": 141, - "daa": 149, + "t": 171.1, + "daa": 159, "epoch": 2, "class": 4, - "bps": 10000, + "bps": 0, "bps5": 10000, "nodes": [ - "149/eb50d76d", - "149/eb50d76d", - "149/eb50d76d", - "149/eb50d76d" - ] - }, - { - "t": 156, - "daa": 163, - "epoch": 2, - "class": 4, - "bps": 10000, - "bps5": 10000, - "nodes": [ - "163/1f9bbb92", - "163/1f9bbb92", - "163/1f9bbb92", - "163/1f9bbb92" - ] - }, - { - "t": 171, - "daa": 174, - "epoch": 2, - "class": 4, - "bps": 10000, - "bps5": 10000, - "nodes": [ - "174/2a61a80c", - "174/2a61a80c", - "174/2a61a80c", - "174/2a61a80c" + "159/23130104", + "159/23130104", + "159/23130104", + "159/23130104" ] }, { "t": 186.1, - "daa": 187, - "epoch": 3, + "daa": 175, + "epoch": 2, "class": 4, - "bps": 10000, + "bps": 0, "bps5": 10000, "nodes": [ - "187/e6dfde32", - "187/e6dfde32", - "187/e6dfde32", - "187/e6dfde32" + "175/5372ca4f", + "175/5372ca4f", + "175/5372ca4f", + "175/5372ca4f" ] }, { "t": 201.1, - "daa": 200, + "daa": 182, "epoch": 3, "class": 4, - "bps": 10000, + "bps": 0, "bps5": 10000, "nodes": [ - "200/8de101de", - "200/8de101de", - "200/8de101de", - "200/8de101de" + "182/e4d5c245", + "182/e4d5c245", + "182/e4d5c245", + "182/e4d5c245" ] }, { "t": 216.1, - "daa": 219, + "daa": 189, "epoch": 3, "class": 4, - "bps": 10000, + "bps": 0, "bps5": 10000, "nodes": [ - "219/7705c4e3", - "219/7705c4e3", - "219/7705c4e3", - "219/7705c4e3" + "189/297043c0", + "189/297043c0", + "189/297043c0", + "189/297043c0" ] }, { - "t": 231.1, - "daa": 236, + "t": 231.2, + "daa": 210, "epoch": 3, "class": 4, - "bps": 10000, + "bps": 0, "bps5": 10000, "nodes": [ - "236/fad4712e", - "236/fad4712e", - "236/fad4712e", - "236/fad4712e" + "210/0bf2aa57", + "210/0bf2aa57", + "210/0bf2aa57", + "210/0bf2aa57" ] }, { - "t": 246.1, - "daa": 252, - "epoch": 4, + "t": 246.2, + "daa": 224, + "epoch": 3, "class": 4, - "bps": 10000, + "bps": 0, "bps5": 10000, "nodes": [ - "252/822758a3", - "252/822758a3", - "252/822758a3", - "252/822758a3" + "224/9a23c79c", + "224/9a23c79c", + "224/9a23c79c", + "224/9a23c79c" ] }, { - "t": 261.1, - "daa": 267, + "t": 261.2, + "daa": 240, "epoch": 4, "class": 4, - "bps": 10000, + "bps": 0, "bps5": 10000, "nodes": [ - "267/17080f66", - "267/17080f66", - "267/17080f66", - "267/17080f66" + "240/5f359d16", + "240/5f359d16", + "240/5f359d16", + "240/5f359d16" ] }, { - "t": 276.1, - "daa": 279, + "t": 276.2, + "daa": 255, "epoch": 4, "class": 4, - "bps": 10000, + "bps": 0, "bps5": 10000, "nodes": [ - "279/765e10f6", - "279/765e10f6", - "279/765e10f6", - "279/765e10f6" + "255/933a8429", + "255/933a8429", + "255/933a8429", + "255/933a8429" ] }, { "t": 291.2, - "daa": 294, + "daa": 271, "epoch": 4, "class": 4, - "bps": 10000, + "bps": 0, "bps5": 10000, "nodes": [ - "294/bc002c8d", - "294/bc002c8d", - "294/bc002c8d", - "294/bc002c8d" + "271/d25f20a4", + "271/d25f20a4", + "271/d25f20a4", + "271/d25f20a4" ] }, { "t": 306.2, - "daa": 312, - "epoch": 5, + "daa": 291, + "epoch": 4, "class": 4, - "bps": 10000, + "bps": 0, "bps5": 10000, "nodes": [ - "312/8a61fffe", - "312/8a61fffe", - "312/8a61fffe", - "312/8a61fffe" + "291/e2c6c73a", + "291/e2c6c73a", + "291/e2c6c73a", + "291/e2c6c73a" ] }, { - "t": 321.2, - "daa": 326, + "t": 321.3, + "daa": 303, "epoch": 5, "class": 4, - "bps": 10000, + "bps": 0, "bps5": 10000, "nodes": [ - "326/30eae59f", - "326/30eae59f", - "326/30eae59f", - "326/30eae59f" + "303/f8c37455", + "303/f8c37455", + "303/f8c37455", + "303/f8c37455" ] }, { - "t": 336.2, - "daa": 338, + "t": 336.3, + "daa": 322, "epoch": 5, "class": 4, - "bps": 10000, + "bps": 0, "bps5": 10000, "nodes": [ - "338/a2f652c0", - "338/a2f652c0", - "338/a2f652c0", - "338/a2f652c0" + "322/e06c3b35", + "322/e06c3b35", + "322/e06c3b35", + "322/e06c3b35" ] }, { - "t": 351.2, - "daa": 356, + "t": 351.3, + "daa": 345, "epoch": 5, "class": 4, - "bps": 10000, + "bps": 0, "bps5": 10000, "nodes": [ - "356/d1e15cf7", - "356/d1e15cf7", - "356/d1e15cf7", - "356/d1e15cf7" + "345/b4395042", + "345/b4395042", + "345/b4395042", + "345/b4395042" ] }, { - "t": 366.2, - "daa": 370, - "epoch": 6, + "t": 366.3, + "daa": 359, + "epoch": 5, "class": 4, - "bps": 10000, + "bps": 0, "bps5": 10000, "nodes": [ - "370/1e127f8e", - "370/1e127f8e", - "370/1e127f8e", - "370/1e127f8e" + "359/8b14f183", + "359/8b14f183", + "359/8b14f183", + "359/8b14f183" ] }, { "t": 381.3, - "daa": 382, + "daa": 369, "epoch": 6, "class": 4, - "bps": 10000, + "bps": 0, "bps5": 10000, "nodes": [ - "382/f1fa6859", - "382/f1fa6859", - "382/f1fa6859", - "382/f1fa6859" + "369/2270842f", + "363/fbbded09", + "369/2270842f", + "369/2270842f" ] }, { "t": 396.3, - "daa": 402, + "daa": 381, "epoch": 6, "class": 4, - "bps": 10000, + "bps": 0, "bps5": 10000, "nodes": [ - "402/f0ee3823", - "402/f0ee3823", - "402/f0ee3823", - "402/f0ee3823" + "381/9a0f430e", + "381/9a0f430e", + "381/9a0f430e", + "381/9a0f430e" ] }, { - "t": 411.3, - "daa": 424, - "epoch": 7, + "t": 411.4, + "daa": 403, + "epoch": 6, "class": 4, - "bps": 10000, + "bps": 0, "bps5": 10000, "nodes": [ - "424/db80ccc8", - "424/db80ccc8", - "424/db80ccc8", - "424/db80ccc8" + "403/05438833", + "403/05438833", + "403/05438833", + "403/05438833" ] }, { - "t": 426.3, - "daa": 440, + "t": 426.4, + "daa": 420, "epoch": 7, "class": 4, - "bps": 10000, + "bps": 0, "bps5": 10000, "nodes": [ - "440/6e1c3b1c", - "440/6e1c3b1c", - "440/6e1c3b1c", - "440/6e1c3b1c" + "420/d8f715fa", + "420/d8f715fa", + "420/d8f715fa", + "420/d8f715fa" ] }, { - "t": 441.3, - "daa": 450, + "t": 441.4, + "daa": 433, "epoch": 7, "class": 4, - "bps": 10000, + "bps": 0, "bps5": 10000, "nodes": [ - "450/f63d97d3", - "451/dd8296fd", - "450/f63d97d3", - "450/f63d97d3" + "433/f9e9b031", + "433/f9e9b031", + "433/f9e9b031", + "433/f9e9b031" ] }, { "t": 456.4, - "daa": 461, + "daa": 458, "epoch": 7, "class": 4, - "bps": 10000, + "bps": 0, "bps5": 10000, "nodes": [ - "461/c51f9db0", - "461/c51f9db0", - "461/c51f9db0", - "461/c51f9db0" + "458/fe51fe91", + "458/fe51fe91", + "458/fe51fe91", + "458/fe51fe91" ] }, { "t": 471.4, - "daa": 474, + "daa": 475, "epoch": 7, "class": 4, - "bps": 10000, + "bps": 0, "bps5": 10000, "nodes": [ - "474/b58b91f1", - "474/b58b91f1", - "474/b58b91f1", - "474/b58b91f1" + "475/77b18db4", + "475/77b18db4", + "475/77b18db4", + "475/77b18db4" ] }, { - "t": 486.4, - "daa": 480, + "t": 486.5, + "daa": 483, "epoch": 8, "class": 5, - "bps": 10000, + "bps": 0, "bps5": 10000, "nodes": [ - "480/21f187ed", - "480/21f187ed", - "480/21f187ed", - "480/21f187ed" + "483/c330a3cf", + "484/f6b99031", + "483/c330a3cf", + "483/c330a3cf" ] }, { - "t": 501.4, - "daa": 486, + "t": 501.5, + "daa": 496, "epoch": 8, "class": 5, - "bps": 10000, + "bps": 0, "bps5": 10000, "nodes": [ - "486/9b65540b", - "486/9b65540b", - "486/9b65540b", - "480/21f187ed" + "496/5c1b390b", + "496/5c1b390b", + "496/5c1b390b", + "483/c330a3cf" ] }, { - "t": 516.4, - "daa": 494, + "t": 516.5, + "daa": 510, "epoch": 8, "class": 5, - "bps": 10000, + "bps": 0, "bps5": 10000, "nodes": [ - "494/abb33f53", - "494/abb33f53", - "494/abb33f53", - "480/21f187ed" + "510/512a2eb2", + "510/512a2eb2", + "510/512a2eb2", + "483/c330a3cf" ] }, { "t": 531.5, - "daa": 508, + "daa": 527, "epoch": 8, "class": 5, - "bps": 10000, + "bps": 0, "bps5": 10000, "nodes": [ - "508/98820272", - "508/98820272", - "508/98820272", - "480/21f187ed" + "527/a5d29536", + "527/a5d29536", + "527/a5d29536", + "483/c330a3cf" ] }, { - "t": 546.5, - "daa": 521, - "epoch": 8, - "class": 5, - "bps": 10000, - "bps5": 10000, - "nodes": [ - "521/dca86d92", - "521/dca86d92", - "521/dca86d92", - "480/21f187ed" - ] - }, - { - "t": 561.5, - "daa": 541, + "t": 546.6, + "daa": 543, "epoch": 9, "class": 5, - "bps": 10000, + "bps": 0, "bps5": 10000, "nodes": [ - "541/c8c056ff", - "541/c8c056ff", - "540/53503f9f", - "480/21f187ed" + "543/a103e45a", + "543/a103e45a", + "543/a103e45a", + "483/c330a3cf" ] }, { - "t": 576.5, - "daa": 553, + "t": 561.6, + "daa": 561, "epoch": 9, "class": 5, - "bps": 10000, + "bps": 0, "bps5": 10000, "nodes": [ - "553/4bc650e2", - "553/4bc650e2", - "553/4bc650e2", - "480/21f187ed" + "561/73c98862", + "561/73c98862", + "561/73c98862", + "483/c330a3cf" + ] + }, + { + "t": 576.6, + "daa": 579, + "epoch": 9, + "class": 5, + "bps": 0, + "bps5": 10000, + "nodes": [ + "579/c53e2285", + "579/c53e2285", + "579/c53e2285", + "483/c330a3cf" ] }, { "t": 591.6, - "daa": 564, + "daa": 592, "epoch": 9, "class": 5, - "bps": 10000, + "bps": 0, "bps5": 10000, "nodes": [ - "564/5c8d12d8", - "564/5c8d12d8", - "564/5c8d12d8", - "480/21f187ed" + "592/05718264", + "592/05718264", + "592/05718264", + "483/c330a3cf" ] }, { "t": 606.6, - "daa": 573, - "epoch": 9, + "daa": 601, + "epoch": 10, "class": 5, - "bps": 10000, + "bps": 0, "bps5": 10000, "nodes": [ - "573/836b76e4", - "573/836b76e4", - "573/836b76e4", - "480/21f187ed" + "601/f08e1b5c", + "603/cabd6f67", + "601/f08e1b5c", + "483/c330a3cf" ] }, { "t": 621.6, - "daa": 593, - "epoch": 9, + "daa": 621, + "epoch": 10, "class": 5, - "bps": 10000, + "bps": 0, "bps5": 10000, "nodes": [ - "593/6b3a8177", - "593/6b3a8177", - "593/6b3a8177", - "480/21f187ed" + "621/3a603021", + "621/3a603021", + "621/3a603021", + "483/c330a3cf" ] }, { "t": 636.6, - "daa": 604, + "daa": 643, "epoch": 10, "class": 5, - "bps": 10000, + "bps": 0, "bps5": 10000, "nodes": [ - "604/f728bfa4", - "604/f728bfa4", - "604/f728bfa4", - "480/21f187ed" + "643/6ea206cd", + "643/6ea206cd", + "643/6ea206cd", + "483/c330a3cf" ] }, { - "t": 651.7, - "daa": 621, + "t": 651.6, + "daa": 654, "epoch": 10, "class": 5, - "bps": 10000, + "bps": 0, "bps5": 10000, "nodes": [ - "621/fd2ffc00", - "621/fd2ffc00", - "621/fd2ffc00", - "480/21f187ed" - ] - }, - { - "t": 666.7, - "daa": 637, - "epoch": 10, - "class": 5, - "bps": 10000, - "bps5": 10000, - "nodes": [ - "637/0fc792f1", - "637/0fc792f1", - "637/0fc792f1", - "480/21f187ed" - ] - }, - { - "t": 681.7, - "daa": 650, - "epoch": 10, - "class": 5, - "bps": 10000, - "bps5": 10000, - "nodes": [ - "650/c62861f9", - "650/c62861f9", - "650/c62861f9", - "480/21f187ed" + "654/e894cc26", + "654/e894cc26", + "654/e894cc26", + "483/c330a3cf" ] } ] diff --git a/docs/design/class-v5-harness/flip-stale.log b/docs/design/class-v5-harness/flip-stale.log index 64c35bfd0..6da3463be 100644 --- a/docs/design/class-v5-harness/flip-stale.log +++ b/docs/design/class-v5-harness/flip-stale.log @@ -1,76 +1,73 @@ -12:09:52.489 signals 6/6/6, expect flip; v3 from 60 (epoch 1), v4 floor 120 (epoch 2), v5 floor 100000 (epoch 1667), window 60 DAA x 7 (the first epoch with seven full windows after v4 is 8); stale miner 2; stateless node n3; 60 DAA per epoch, lead 10; run 780 s or 11 epochs -12:09:53.723 n0 up pid 3045315 json 30342 p2p 30341 exec 30343, signals 6 -12:09:54.928 n1 up pid 3045932 json 30352 p2p 30351 exec 30353, signals 6 -12:09:56.134 n2 up pid 3046589 json 30362 p2p 30361 exec 30363, signals 6 -12:09:57.338 n3 up pid 3047510 json 30372 p2p 30371 exec disabled, signals 6 -12:09:57.339 n0: Program class v4 signal window from the override file: 60 DAA ending at each epoch's seed block, threshold 9500 bps of blue blocks in each of 7 windows; the fixed height is the floor; this node signals object version 6 (class v4 with the load-source rule, sub-version 1; object 4, the 6 October stream, does not count) | this node signals object version 6 -12:09:57.339 n1: Program class v4 signal window from the override file: 60 DAA ending at each epoch's seed block, threshold 9500 bps of blue blocks in each of 7 windows; the fixed height is the floor; this node signals object version 6 (class v4 with the load-source rule, sub-version 1; object 4, the 6 October stream, does not count) | this node signals object version 6 -12:09:57.339 n2: Program class v4 signal window from the override file: 60 DAA ending at each epoch's seed block, threshold 9500 bps of blue blocks in each of 7 windows; the fixed height is the floor; this node signals object version 6 (class v4 with the load-source rule, sub-version 1; object 4, the 6 October stream, does not count) | this node signals object version 6 -12:09:57.339 n3: Program class v4 signal window from the override file: 60 DAA ending at each epoch's seed block, threshold 9500 bps of blue blocks in each of 7 windows; the fixed height is the floor; this node signals object version 6 (class v4 with the load-source rule, sub-version 1; object 4, the 6 October stream, does not count) | this node signals object version 6 -12:09:57.339 n0 digest: 5d04822e3501a5de -12:09:58.350 epoch -1 -> 0 at daa 0, 5.9 s: template class 2, next 2, day 1244010, signal share at the sink v4 0 v5 0 bps (window 60, this node signals 6, v5 decided by signal at epoch none) -12:09:58.351 t=5.9 s daa 0 epoch 0 class 2 signal v4 0 v5 0 bps blocks/sink per node 0/234e082d 0/234e082d 0/234e082d 0/234e082d -12:10:13.369 t=20.9 s daa 29 epoch 0 class 2 signal v4 10000 v5 10000 bps blocks/sink per node 29/57e79fe0 29/57e79fe0 29/57e79fe0 29/57e79fe0 -12:10:28.384 t=35.9 s daa 59 epoch 0 class 2 signal v4 10000 v5 10000 bps blocks/sink per node 59/8c19d208 59/8c19d208 59/8c19d208 59/8c19d208 -12:10:29.385 epoch 0 -> 1 at daa 60, 36.9 s: template class 3, next 3, day 1244010, signal share at the sink v4 10000 v5 10000 bps (window 60, this node signals 6, v5 decided by signal at epoch none) -12:10:43.398 t=50.9 s daa 63 epoch 1 class 3 signal v4 10000 v5 10000 bps blocks/sink per node 63/25731901 63/25731901 63/25731901 63/25731901 -12:10:58.418 t=65.9 s daa 71 epoch 1 class 3 signal v4 10000 v5 10000 bps blocks/sink per node 71/8acff126 71/8acff126 71/8acff126 71/8acff126 -12:11:13.436 t=80.9 s daa 82 epoch 1 class 3 signal v4 10000 v5 10000 bps blocks/sink per node 82/83272ecc 82/83272ecc 82/83272ecc 82/83272ecc -12:11:28.452 t=96.0 s daa 106 epoch 1 class 3 signal v4 10000 v5 10000 bps blocks/sink per node 106/5c2063f1 106/5c2063f1 106/5c2063f1 106/5c2063f1 -12:11:39.464 epoch 1 -> 2 at daa 121, 107.0 s: template class 4, next 4, day 1244010, signal share at the sink v4 10000 v5 10000 bps (window 60, this node signals 6, v5 decided by signal at epoch none) -12:11:43.469 t=111.0 s daa 125 epoch 2 class 4 signal v4 10000 v5 10000 bps blocks/sink per node 125/1a1ed97e 125/1a1ed97e 125/1a1ed97e 125/1a1ed97e -12:11:58.484 t=126.0 s daa 142 epoch 2 class 4 signal v4 10000 v5 10000 bps blocks/sink per node 142/bdd5d432 142/bdd5d432 142/bdd5d432 142/bdd5d432 -12:12:13.501 t=141.0 s daa 149 epoch 2 class 4 signal v4 10000 v5 10000 bps blocks/sink per node 149/eb50d76d 149/eb50d76d 149/eb50d76d 149/eb50d76d -12:12:28.518 t=156.0 s daa 163 epoch 2 class 4 signal v4 10000 v5 10000 bps blocks/sink per node 163/1f9bbb92 163/1f9bbb92 163/1f9bbb92 163/1f9bbb92 -12:12:43.540 t=171.0 s daa 174 epoch 2 class 4 signal v4 10000 v5 10000 bps blocks/sink per node 174/2a61a80c 174/2a61a80c 174/2a61a80c 174/2a61a80c -12:12:51.549 epoch 2 -> 3 at daa 180, 179.1 s: template class 4, next 4, day 1244010, signal share at the sink v4 10000 v5 10000 bps (window 60, this node signals 6, v5 decided by signal at epoch none) -12:12:58.560 t=186.1 s daa 187 epoch 3 class 4 signal v4 10000 v5 10000 bps blocks/sink per node 187/e6dfde32 187/e6dfde32 187/e6dfde32 187/e6dfde32 -12:13:13.574 t=201.1 s daa 200 epoch 3 class 4 signal v4 10000 v5 10000 bps blocks/sink per node 200/8de101de 200/8de101de 200/8de101de 200/8de101de -12:13:28.589 t=216.1 s daa 219 epoch 3 class 4 signal v4 10000 v5 10000 bps blocks/sink per node 219/7705c4e3 219/7705c4e3 219/7705c4e3 219/7705c4e3 -12:13:43.598 t=231.1 s daa 236 epoch 3 class 4 signal v4 10000 v5 10000 bps blocks/sink per node 236/fad4712e 236/fad4712e 236/fad4712e 236/fad4712e -12:13:46.599 epoch 3 -> 4 at daa 241, 234.1 s: template class 4, next 4, day 1244010, signal share at the sink v4 10000 v5 10000 bps (window 60, this node signals 6, v5 decided by signal at epoch none) -12:13:58.610 t=246.1 s daa 252 epoch 4 class 4 signal v4 10000 v5 10000 bps blocks/sink per node 252/822758a3 252/822758a3 252/822758a3 252/822758a3 -12:14:13.626 t=261.1 s daa 267 epoch 4 class 4 signal v4 10000 v5 10000 bps blocks/sink per node 267/17080f66 267/17080f66 267/17080f66 267/17080f66 -12:14:28.637 t=276.1 s daa 279 epoch 4 class 4 signal v4 10000 v5 10000 bps blocks/sink per node 279/765e10f6 279/765e10f6 279/765e10f6 279/765e10f6 -12:14:43.651 t=291.2 s daa 294 epoch 4 class 4 signal v4 10000 v5 10000 bps blocks/sink per node 294/bc002c8d 294/bc002c8d 294/bc002c8d 294/bc002c8d -12:14:49.656 epoch 4 -> 5 at daa 300, 297.2 s: template class 4, next 4, day 1244010, signal share at the sink v4 10000 v5 10000 bps (window 60, this node signals 6, v5 decided by signal at epoch none) -12:14:58.666 t=306.2 s daa 312 epoch 5 class 4 signal v4 10000 v5 10000 bps blocks/sink per node 312/8a61fffe 312/8a61fffe 312/8a61fffe 312/8a61fffe -12:15:13.682 t=321.2 s daa 326 epoch 5 class 4 signal v4 10000 v5 10000 bps blocks/sink per node 326/30eae59f 326/30eae59f 326/30eae59f 326/30eae59f -12:15:28.696 t=336.2 s daa 338 epoch 5 class 4 signal v4 10000 v5 10000 bps blocks/sink per node 338/a2f652c0 338/a2f652c0 338/a2f652c0 338/a2f652c0 -12:15:43.714 t=351.2 s daa 356 epoch 5 class 4 signal v4 10000 v5 10000 bps blocks/sink per node 356/d1e15cf7 356/d1e15cf7 356/d1e15cf7 356/d1e15cf7 -12:15:47.718 epoch 5 -> 6 at daa 360, 355.2 s: template class 4, next 4, day 1244010, signal share at the sink v4 10000 v5 10000 bps (window 60, this node signals 6, v5 decided by signal at epoch none) -12:15:58.731 t=366.2 s daa 370 epoch 6 class 4 signal v4 10000 v5 10000 bps blocks/sink per node 370/1e127f8e 370/1e127f8e 370/1e127f8e 370/1e127f8e -12:16:13.748 t=381.3 s daa 382 epoch 6 class 4 signal v4 10000 v5 10000 bps blocks/sink per node 382/f1fa6859 382/f1fa6859 382/f1fa6859 382/f1fa6859 -12:16:28.763 t=396.3 s daa 402 epoch 6 class 4 signal v4 10000 v5 10000 bps blocks/sink per node 402/f0ee3823 402/f0ee3823 402/f0ee3823 402/f0ee3823 -12:16:40.776 epoch 6 -> 7 at daa 420, 408.3 s: template class 4, next 4, day 1244010, signal share at the sink v4 10000 v5 10000 bps (window 60, this node signals 6, v5 decided by signal at epoch none) -12:16:43.778 t=411.3 s daa 424 epoch 7 class 4 signal v4 10000 v5 10000 bps blocks/sink per node 424/db80ccc8 424/db80ccc8 424/db80ccc8 424/db80ccc8 -12:16:58.796 t=426.3 s daa 440 epoch 7 class 4 signal v4 10000 v5 10000 bps blocks/sink per node 440/6e1c3b1c 440/6e1c3b1c 440/6e1c3b1c 440/6e1c3b1c -12:17:13.826 t=441.3 s daa 450 epoch 7 class 4 signal v4 10000 v5 10000 bps blocks/sink per node 450/f63d97d3 451/dd8296fd 450/f63d97d3 450/f63d97d3 -12:17:28.845 t=456.4 s daa 461 epoch 7 class 4 signal v4 10000 v5 10000 bps blocks/sink per node 461/c51f9db0 461/c51f9db0 461/c51f9db0 461/c51f9db0 -12:17:43.867 t=471.4 s daa 474 epoch 7 class 4 signal v4 10000 v5 10000 bps blocks/sink per node 474/b58b91f1 474/b58b91f1 474/b58b91f1 474/b58b91f1 -12:17:58.887 epoch 7 -> 8 at daa 480, 486.4 s: template class 5, next 5, day 1244010, signal share at the sink v4 10000 v5 10000 bps (window 60, this node signals 6, v5 decided by signal at epoch 8) -12:17:58.887 CLASS SWITCH: the template is class v5 from epoch 8 (daa 480) at 486.4 s wall -12:17:58.889 t=486.4 s daa 480 epoch 8 class 5 signal v4 10000 v5 10000 bps blocks/sink per node 480/21f187ed 480/21f187ed 480/21f187ed 480/21f187ed -12:18:13.912 t=501.4 s daa 486 epoch 8 class 5 signal v4 10000 v5 10000 bps blocks/sink per node 486/9b65540b 486/9b65540b 486/9b65540b 480/21f187ed -12:18:28.939 t=516.4 s daa 494 epoch 8 class 5 signal v4 10000 v5 10000 bps blocks/sink per node 494/abb33f53 494/abb33f53 494/abb33f53 480/21f187ed -12:18:43.960 t=531.5 s daa 508 epoch 8 class 5 signal v4 10000 v5 10000 bps blocks/sink per node 508/98820272 508/98820272 508/98820272 480/21f187ed -12:18:58.982 t=546.5 s daa 521 epoch 8 class 5 signal v4 10000 v5 10000 bps blocks/sink per node 521/dca86d92 521/dca86d92 521/dca86d92 480/21f187ed -12:19:13.999 epoch 8 -> 9 at daa 541, 561.5 s: template class 5, next 5, day 1244010, signal share at the sink v4 10000 v5 10000 bps (window 60, this node signals 6, v5 decided by signal at epoch none) -12:19:14.000 t=561.5 s daa 541 epoch 9 class 5 signal v4 10000 v5 10000 bps blocks/sink per node 541/c8c056ff 541/c8c056ff 540/53503f9f 480/21f187ed -12:19:29.022 t=576.5 s daa 553 epoch 9 class 5 signal v4 10000 v5 10000 bps blocks/sink per node 553/4bc650e2 553/4bc650e2 553/4bc650e2 480/21f187ed -12:19:44.046 t=591.6 s daa 564 epoch 9 class 5 signal v4 10000 v5 10000 bps blocks/sink per node 564/5c8d12d8 564/5c8d12d8 564/5c8d12d8 480/21f187ed -12:19:59.073 t=606.6 s daa 573 epoch 9 class 5 signal v4 10000 v5 10000 bps blocks/sink per node 573/836b76e4 573/836b76e4 573/836b76e4 480/21f187ed -12:20:14.098 t=621.6 s daa 593 epoch 9 class 5 signal v4 10000 v5 10000 bps blocks/sink per node 593/6b3a8177 593/6b3a8177 593/6b3a8177 480/21f187ed -12:20:25.116 epoch 9 -> 10 at daa 600, 632.6 s: template class 5, next 5, day 1244010, signal share at the sink v4 10000 v5 10000 bps (window 60, this node signals 6, v5 decided by signal at epoch none) -12:20:29.122 t=636.6 s daa 604 epoch 10 class 5 signal v4 10000 v5 10000 bps blocks/sink per node 604/f728bfa4 604/f728bfa4 604/f728bfa4 480/21f187ed -12:20:44.151 t=651.7 s daa 621 epoch 10 class 5 signal v4 10000 v5 10000 bps blocks/sink per node 621/fd2ffc00 621/fd2ffc00 621/fd2ffc00 480/21f187ed -12:20:59.171 t=666.7 s daa 637 epoch 10 class 5 signal v4 10000 v5 10000 bps blocks/sink per node 637/0fc792f1 637/0fc792f1 637/0fc792f1 480/21f187ed -12:21:14.196 t=681.7 s daa 650 epoch 10 class 5 signal v4 10000 v5 10000 bps blocks/sink per node 650/c62861f9 650/c62861f9 650/c62861f9 480/21f187ed -12:21:27.222 epoch 10 -> 11 at daa 660, 694.7 s: template class 5, next 5, day 1244010, signal share at the sink v4 10000 v5 10000 bps (window 60, this node signals 6, v5 decided by signal at epoch none) -12:21:30.419 stream for epoch 8: {"code":-32000,"message":"no published state stream after chain block 268c6593e67a9dd74d676e8bed9a9425df30ab048aec9b80077394cb668242ba (the executor has not passed that epoch's cut, or the block is no -12:21:30.569 SUMMARY PASS (expect flip, signals 6/6/6, stale 2): v5 from epoch 8 at DAA 480; epochs seen e0:2:0bps:d1244010 e1:3:10000bps:d1244010 e2:4:10000bps:d1244010 e3:4:10000bps:d1244010 e4:4:10000bps:d1244010 e5:4:10000bps:d1244010 e6:4:10000bps:d1244010 e7:4:10000bps:d1244010 e8:5:10000bps:d1244010 e9:5:10000bps:d1244010 e10:5:10000bps:d1244010 e11:5:10000bps:d1244010; chain bytes {"0":1,"6":663} (9985 bps at byte 6+); blocks 481 / 183; rejected miners 0/0/59/0 nodes 0/0/59; sinks cbaa8a516e2350f2 cbaa8a516e2350f2 cbaa8a516e2350f2 21f187edb6341649 (agree); counts 663/663/663/480; signal lines 3/3 (epochs 8/8/8, shares 10000/10000/10000); floor lines 3/3; state roots at the flip 0x74ca7aec647f5b7c 0x74ca7aec647f5b7c 0x74ca7aec647f5b7c; stateless node accepted after the flip 0 (refusal lines 14); stale miner accepted after the first refresh 0 rejected 59; days 1244010 -12:21:30.569 PROGRAM ID epoch 8 seed 268c6593e67a9dd7: miners d08d85950066de4d (3 of 3) cli v5 null cli v4 fa9cfb45ea50369e; state root null (null records) -12:21:30.569 PROGRAM ID epoch 9 seed 08bff26781445846: miners 3208c2111780c61b (3 of 3) cli v5 3208c2111780c61b cli v4 051361b422d5ab40; state root 0xbf6b97cebb029f8199c4d19462fcde08a89fc15e7789528b8355e0b89ab6fd55 (17 records) -12:21:30.569 PROGRAM ID epoch 10 seed 07f52472cc3bb9a7: miners a829ce27d55d786a (3 of 3) cli v5 a829ce27d55d786a cli v4 da0bf8b3363f1f75; state root 0x3cc8212d577bf3210e2431eabccdec1183200572009be61d6ef4c4ee52eedc0c (17 records) -12:21:30.569 PROGRAM ID epoch 11 seed c62861f9c90ea32d: miners 14e1299c3e3f892c (3 of 3) cli v5 14e1299c3e3f892c cli v4 42560cc9c8175b5b; state root 0x74ca7aec647f5b7cfff9f04ac9196a2db54d3ccbe9290899fa6b8da489ac56a8 (17 records) -12:21:30.570 summary: /tmp/igneum-fast-time-v5s-flip-stale/summary.json +19:51:45.336 override: dropped 4 field(s) the fork binary does not know (another lane's, riding in master's 60x file): sig_scheme, sig_scheme_activation_daa, finality_succession_activation_daa, latency_ladder_cache_rung +19:51:45.338 signals 6/6/6, expect flip; v3 from 60 (epoch 1), v4 floor 120 (epoch 2), v5 floor 100000 (epoch 1667), window 60 DAA x 7 (the first epoch with seven full windows after v4 is 8); stale miner 2; stateless node n3; 60 DAA per epoch, lead 10; run 780 s or 11 epochs +19:51:46.583 n0 up pid 1506038 json 30702 p2p 30701 exec 30703, signals 6 +19:51:47.791 n1 up pid 1506670 json 30712 p2p 30711 exec 30713, signals 6 +19:51:48.998 n2 up pid 1507402 json 30722 p2p 30721 exec 30723, signals 6 +19:51:50.205 n3 up pid 1507901 json 30732 p2p 30731 exec disabled, signals 6 +19:51:50.205 n0: Program class v4 signal window from the override file: 60 DAA ending at each epoch's seed block, threshold 9500 bps of blue blocks in each of 7 windows; the fixed height is the floor; this node signals object version 6 (class v4 sub-version 3: the amended draw with the distinct-values and most-repeated-value bounds; objects 4 and 5, the earlier v4 streams, do not count; 6 is class v5) | this node signals object version 6 +19:51:50.206 n1: Program class v4 signal window from the override file: 60 DAA ending at each epoch's seed block, threshold 9500 bps of blue blocks in each of 7 windows; the fixed height is the floor; this node signals object version 6 (class v4 sub-version 3: the amended draw with the distinct-values and most-repeated-value bounds; objects 4 and 5, the earlier v4 streams, do not count; 6 is class v5) | this node signals object version 6 +19:51:50.206 n2: Program class v4 signal window from the override file: 60 DAA ending at each epoch's seed block, threshold 9500 bps of blue blocks in each of 7 windows; the fixed height is the floor; this node signals object version 6 (class v4 sub-version 3: the amended draw with the distinct-values and most-repeated-value bounds; objects 4 and 5, the earlier v4 streams, do not count; 6 is class v5) | this node signals object version 6 +19:51:50.206 n3: Program class v4 signal window from the override file: 60 DAA ending at each epoch's seed block, threshold 9500 bps of blue blocks in each of 7 windows; the fixed height is the floor; this node signals object version 6 (class v4 sub-version 3: the amended draw with the distinct-values and most-repeated-value bounds; objects 4 and 5, the earlier v4 streams, do not count; 6 is class v5) | this node signals object version 6 +19:51:50.206 n0 digest: 1787ce0fd511a452 +19:51:51.224 epoch -1 -> 0 at daa 0, 5.9 s: template class 2, next 2, day 1244029, signal share at the sink v4 0 v5 0 bps (window 60, this node signals 6, v5 decided by signal at epoch none) +19:51:51.227 t=5.9 s daa 0 epoch 0 class 2 signal v4 0 v5 0 bps blocks/sink per node 0/234e082d 0/234e082d 0/234e082d 0/234e082d +19:52:06.253 t=20.9 s daa 8 epoch 0 class 2 signal v4 0 v5 10000 bps blocks/sink per node 8/6939d755 8/6939d755 8/6939d755 8/6939d755 +19:52:21.270 t=35.9 s daa 36 epoch 0 class 2 signal v4 0 v5 10000 bps blocks/sink per node 36/2c682cc1 36/2c682cc1 36/2c682cc1 36/2c682cc1 +19:52:36.285 t=50.9 s daa 55 epoch 0 class 2 signal v4 0 v5 10000 bps blocks/sink per node 55/94f7f9fd 55/94f7f9fd 55/94f7f9fd 55/94f7f9fd +19:52:41.297 epoch 0 -> 1 at daa 60, 56.0 s: template class 3, next 3, day 1244029, signal share at the sink v4 0 v5 10000 bps (window 60, this node signals 6, v5 decided by signal at epoch none) +19:52:51.306 t=66.0 s daa 63 epoch 1 class 3 signal v4 0 v5 10000 bps blocks/sink per node 63/147b2936 63/147b2936 63/147b2936 63/147b2936 +19:53:06.316 t=81.0 s daa 66 epoch 1 class 3 signal v4 0 v5 10000 bps blocks/sink per node 66/60ae17e2 66/60ae17e2 66/60ae17e2 66/60ae17e2 +19:53:21.333 t=96.0 s daa 72 epoch 1 class 3 signal v4 0 v5 10000 bps blocks/sink per node 72/6469405c 72/6469405c 72/6469405c 72/6469405c +19:53:36.346 t=111.0 s daa 88 epoch 1 class 3 signal v4 0 v5 10000 bps blocks/sink per node 88/89a6958b 88/89a6958b 88/89a6958b 88/89a6958b +19:53:51.373 t=126.0 s daa 109 epoch 1 class 3 signal v4 0 v5 10000 bps blocks/sink per node 109/4ca548e8 109/4ca548e8 109/4ca548e8 109/4ca548e8 +19:53:58.383 epoch 1 -> 2 at daa 120, 133.0 s: template class 4, next 4, day 1244029, signal share at the sink v4 0 v5 10000 bps (window 60, this node signals 6, v5 decided by signal at epoch none) +19:54:06.394 t=141.1 s daa 122 epoch 2 class 4 signal v4 0 v5 10000 bps blocks/sink per node 122/9fce4e5c 122/9fce4e5c 122/9fce4e5c 122/9fce4e5c +19:54:21.406 t=156.1 s daa 142 epoch 2 class 4 signal v4 0 v5 10000 bps blocks/sink per node 142/2ea761fb 142/2ea761fb 142/2ea761fb 142/2ea761fb +19:54:36.424 t=171.1 s daa 159 epoch 2 class 4 signal v4 0 v5 10000 bps blocks/sink per node 159/23130104 159/23130104 159/23130104 159/23130104 +19:54:51.440 t=186.1 s daa 175 epoch 2 class 4 signal v4 0 v5 10000 bps blocks/sink per node 175/5372ca4f 175/5372ca4f 175/5372ca4f 175/5372ca4f +19:55:02.450 epoch 2 -> 3 at daa 180, 197.1 s: template class 4, next 4, day 1244029, signal share at the sink v4 0 v5 10000 bps (window 60, this node signals 6, v5 decided by signal at epoch none) +19:55:06.461 t=201.1 s daa 182 epoch 3 class 4 signal v4 0 v5 10000 bps blocks/sink per node 182/e4d5c245 182/e4d5c245 182/e4d5c245 182/e4d5c245 +19:55:21.474 t=216.1 s daa 189 epoch 3 class 4 signal v4 0 v5 10000 bps blocks/sink per node 189/297043c0 189/297043c0 189/297043c0 189/297043c0 +19:55:36.494 t=231.2 s daa 210 epoch 3 class 4 signal v4 0 v5 10000 bps blocks/sink per node 210/0bf2aa57 210/0bf2aa57 210/0bf2aa57 210/0bf2aa57 +19:55:51.504 t=246.2 s daa 224 epoch 3 class 4 signal v4 0 v5 10000 bps blocks/sink per node 224/9a23c79c 224/9a23c79c 224/9a23c79c 224/9a23c79c +19:56:03.519 epoch 3 -> 4 at daa 240, 258.2 s: template class 4, next 4, day 1244029, signal share at the sink v4 0 v5 10000 bps (window 60, this node signals 6, v5 decided by signal at epoch none) +19:56:06.524 t=261.2 s daa 240 epoch 4 class 4 signal v4 0 v5 10000 bps blocks/sink per node 240/5f359d16 240/5f359d16 240/5f359d16 240/5f359d16 +19:56:21.551 t=276.2 s daa 255 epoch 4 class 4 signal v4 0 v5 10000 bps blocks/sink per node 255/933a8429 255/933a8429 255/933a8429 255/933a8429 +19:56:36.569 t=291.2 s daa 271 epoch 4 class 4 signal v4 0 v5 10000 bps blocks/sink per node 271/d25f20a4 271/d25f20a4 271/d25f20a4 271/d25f20a4 +19:56:51.580 t=306.2 s daa 291 epoch 4 class 4 signal v4 0 v5 10000 bps blocks/sink per node 291/e2c6c73a 291/e2c6c73a 291/e2c6c73a 291/e2c6c73a +19:56:58.587 epoch 4 -> 5 at daa 300, 313.2 s: template class 4, next 4, day 1244029, signal share at the sink v4 0 v5 10000 bps (window 60, this node signals 6, v5 decided by signal at epoch none) +19:57:06.596 t=321.3 s daa 303 epoch 5 class 4 signal v4 0 v5 10000 bps blocks/sink per node 303/f8c37455 303/f8c37455 303/f8c37455 303/f8c37455 +19:57:21.608 t=336.3 s daa 322 epoch 5 class 4 signal v4 0 v5 10000 bps blocks/sink per node 322/e06c3b35 322/e06c3b35 322/e06c3b35 322/e06c3b35 +19:57:36.621 t=351.3 s daa 345 epoch 5 class 4 signal v4 0 v5 10000 bps blocks/sink per node 345/b4395042 345/b4395042 345/b4395042 345/b4395042 +19:57:51.635 t=366.3 s daa 359 epoch 5 class 4 signal v4 0 v5 10000 bps blocks/sink per node 359/8b14f183 359/8b14f183 359/8b14f183 359/8b14f183 +19:57:53.637 epoch 5 -> 6 at daa 360, 368.3 s: template class 4, next 4, day 1244029, signal share at the sink v4 0 v5 10000 bps (window 60, this node signals 6, v5 decided by signal at epoch none) +19:58:06.656 t=381.3 s daa 369 epoch 6 class 4 signal v4 0 v5 10000 bps blocks/sink per node 369/2270842f 363/fbbded09 369/2270842f 369/2270842f +19:58:21.677 t=396.3 s daa 381 epoch 6 class 4 signal v4 0 v5 10000 bps blocks/sink per node 381/9a0f430e 381/9a0f430e 381/9a0f430e 381/9a0f430e +19:58:36.692 t=411.4 s daa 403 epoch 6 class 4 signal v4 0 v5 10000 bps blocks/sink per node 403/05438833 403/05438833 403/05438833 403/05438833 +19:58:48.707 epoch 6 -> 7 at daa 420, 423.4 s: template class 4, next 4, day 1244029, signal share at the sink v4 0 v5 10000 bps (window 60, this node signals 6, v5 decided by signal at epoch none) +19:58:51.712 t=426.4 s daa 420 epoch 7 class 4 signal v4 0 v5 10000 bps blocks/sink per node 420/d8f715fa 420/d8f715fa 420/d8f715fa 420/d8f715fa +19:59:06.737 t=441.4 s daa 433 epoch 7 class 4 signal v4 0 v5 10000 bps blocks/sink per node 433/f9e9b031 433/f9e9b031 433/f9e9b031 433/f9e9b031 +19:59:21.762 t=456.4 s daa 458 epoch 7 class 4 signal v4 0 v5 10000 bps blocks/sink per node 458/fe51fe91 458/fe51fe91 458/fe51fe91 458/fe51fe91 +19:59:36.784 t=471.4 s daa 475 epoch 7 class 4 signal v4 0 v5 10000 bps blocks/sink per node 475/77b18db4 475/77b18db4 475/77b18db4 475/77b18db4 +19:59:41.793 epoch 7 -> 8 at daa 480, 476.5 s: template class 5, next 5, day 1244029, signal share at the sink v4 0 v5 10000 bps (window 60, this node signals 6, v5 decided by signal at epoch 8) +19:59:41.793 CLASS SWITCH: the template is class v5 from epoch 8 (daa 480) at 476.5 s wall +19:59:51.808 t=486.5 s daa 483 epoch 8 class 5 signal v4 0 v5 10000 bps blocks/sink per node 483/c330a3cf 484/f6b99031 483/c330a3cf 483/c330a3cf +20:00:06.831 t=501.5 s daa 496 epoch 8 class 5 signal v4 0 v5 10000 bps blocks/sink per node 496/5c1b390b 496/5c1b390b 496/5c1b390b 483/c330a3cf +20:00:21.855 t=516.5 s daa 510 epoch 8 class 5 signal v4 0 v5 10000 bps blocks/sink per node 510/512a2eb2 510/512a2eb2 510/512a2eb2 483/c330a3cf +20:00:36.874 t=531.5 s daa 527 epoch 8 class 5 signal v4 0 v5 10000 bps blocks/sink per node 527/a5d29536 527/a5d29536 527/a5d29536 483/c330a3cf +20:00:46.884 epoch 8 -> 9 at daa 540, 541.5 s: template class 5, next 5, day 1244030, signal share at the sink v4 0 v5 10000 bps (window 60, this node signals 6, v5 decided by signal at epoch none) +20:00:51.889 t=546.6 s daa 543 epoch 9 class 5 signal v4 0 v5 10000 bps blocks/sink per node 543/a103e45a 543/a103e45a 543/a103e45a 483/c330a3cf +20:01:06.899 t=561.6 s daa 561 epoch 9 class 5 signal v4 0 v5 10000 bps blocks/sink per node 561/73c98862 561/73c98862 561/73c98862 483/c330a3cf +20:01:21.913 t=576.6 s daa 579 epoch 9 class 5 signal v4 0 v5 10000 bps blocks/sink per node 579/c53e2285 579/c53e2285 579/c53e2285 483/c330a3cf +20:01:36.923 t=591.6 s daa 592 epoch 9 class 5 signal v4 0 v5 10000 bps blocks/sink per node 592/05718264 592/05718264 592/05718264 483/c330a3cf +20:01:45.926 epoch 9 -> 10 at daa 600, 600.6 s: template class 5, next 5, day 1244030, signal share at the sink v4 0 v5 10000 bps (window 60, this node signals 6, v5 decided by signal at epoch none) +20:01:51.931 t=606.6 s daa 601 epoch 10 class 5 signal v4 0 v5 10000 bps blocks/sink per node 601/f08e1b5c 603/cabd6f67 601/f08e1b5c 483/c330a3cf +20:02:06.943 t=621.6 s daa 621 epoch 10 class 5 signal v4 0 v5 10000 bps blocks/sink per node 621/3a603021 621/3a603021 621/3a603021 483/c330a3cf +20:02:21.957 t=636.6 s daa 643 epoch 10 class 5 signal v4 0 v5 10000 bps blocks/sink per node 643/6ea206cd 643/6ea206cd 643/6ea206cd 483/c330a3cf +20:02:36.970 t=651.6 s daa 654 epoch 10 class 5 signal v4 0 v5 10000 bps blocks/sink per node 654/e894cc26 654/e894cc26 654/e894cc26 483/c330a3cf +20:02:43.974 epoch 10 -> 11 at daa 660, 658.6 s: template class 5, next 5, day 1244030, signal share at the sink v4 0 v5 10000 bps (window 60, this node signals 6, v5 decided by signal at epoch none) +20:03:05.031 SUMMARY PASS (expect flip, signals 6/6/6, stale 2): v5 from epoch 8 at DAA 480; epochs seen e0:2:0bps:d1244029 e1:3:10000bps:d1244029 e2:4:10000bps:d1244029 e3:4:10000bps:d1244029 e4:4:10000bps:d1244029 e5:4:10000bps:d1244029 e6:4:10000bps:d1244029 e7:4:10000bps:d1244029 e8:5:10000bps:d1244029 e9:5:10000bps:d1244030 e10:5:10000bps:d1244030 e11:5:10000bps:d1244030; chain bytes {"0":1,"6":660} (9985 bps at byte 6); blocks 484 / 177; rejected miners 0/0/44/0 nodes 0/0/44; sinks 7fb15f8172fa0cba 7fb15f8172fa0cba 7fb15f8172fa0cba c330a3cfba60380a (agree); counts 660/660/660/483; signal lines 3/3 (epochs 8/8/8, shares 10000/10000/10000); floor lines 3/3; state roots at the flip 0xf0b0138c84568402 0xf0b0138c84568402 0xf0b0138c84568402; stateless node accepted after the flip 0 (refusal lines 14); stale miner accepted after the first refresh 0 rejected 44; days 1244029/1244030 +20:03:05.031 PROGRAM ID epoch 8 seed bf2cc4ee6f98f731: miners 26e09c25f5851738 (3 of 3) cli v5 26e09c25f5851738 cli v4 7b7c33e82a76a7cd; state root 0x3205dcb6f3e9573f73676333a9817f0777ab43d4ef19f9cfdeb97b29dae29020 (17 records) +20:03:05.031 PROGRAM ID epoch 9 seed e084365e80342025: miners f61eb472b42066cf (3 of 3) cli v5 f61eb472b42066cf cli v4 41aa829f244c1d36; state root 0xfcd516d490df275d67e44019c1475e47b9e2b81e719d59aec329a2bb4cb97fde (17 records) +20:03:05.031 PROGRAM ID epoch 10 seed 21da0d26c9008547: miners e9535034ee509f57 (3 of 3) cli v5 e9535034ee509f57 cli v4 07707180e509384e; state root 0x2dea45d42e7c95ec5f27100de0ceae3264eb8e9094c897375d64cac064552aef (17 records) +20:03:05.031 summary: /tmp/igneum-fast-time-v5s-flip-stale/summary.json diff --git a/docs/design/class-v5-harness/v5-census-4600-0.log b/docs/design/class-v5-harness/v5-census-4600-0.log new file mode 100644 index 000000000..82f7a7ad8 --- /dev/null +++ b/docs/design/class-v5-harness/v5-census-4600-0.log @@ -0,0 +1,46 @@ +lease: 0 of 16 pool cores free (88 leased); waiting +lease: holding 48 pool cores (8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,73,74,75,76,77,78,79,80,81,82,83,84,85,86, waited 10 s, class v5): v5 gate: c3 census, 4600 seeds from 0 + +running 1 test +test accept::tests::v5_hot_census ... v5_hot_census: 4600 seeds 0..4600 in 1256 s on 48 threads +class v4 sub-version 3 accepted programs' minimum site ratio: min 0.9807 p0.1 0.9831 p1 0.9906 p5 0.9962 median 0.9999 max 1.0000 +floor 0.980: 0 of 4600 class v4 accepted programs under it (0.000 percent) +floor 0.990: 43 of 4600 class v4 accepted programs under it (0.935 percent) +floor 0.995: 112 of 4600 class v4 accepted programs under it (2.435 percent) +floor 0.998: 517 of 4600 class v4 accepted programs under it (11.239 percent) +floor 0.999: 868 of 4600 class v4 accepted programs under it (18.870 percent) +low: seed 1471 v4 attempt 4 min site 0 ratio 0.9807; v5 attempt 11 min ratio 1.0000 +low: seed 3771 v4 attempt 1 min site 1 ratio 0.9810; v5 attempt 4 min ratio 0.9998 +low: seed 3387 v4 attempt 1 min site 13 ratio 0.9820; v5 attempt 6 min ratio 0.9999 +low: seed 2509 v4 attempt 3 min site 13 ratio 0.9830; v5 attempt 5 min ratio 0.9999 +low: seed 3477 v4 attempt 1 min site 9 ratio 0.9831; v5 attempt 2 min ratio 0.9991 +low: seed 1976 v4 attempt 0 min site 3 ratio 0.9831; v5 attempt 6 min ratio 0.9990 +low: seed 4256 v4 attempt 0 min site 10 ratio 0.9832; v5 attempt 4 min ratio 0.9999 +low: seed 414 v4 attempt 0 min site 5 ratio 0.9832; v5 attempt 4 min ratio 0.9999 +low: seed 928 v4 attempt 7 min site 3 ratio 0.9833; v5 attempt 8 min ratio 0.9999 +low: seed 3618 v4 attempt 1 min site 3 ratio 0.9834; v5 attempt 3 min ratio 0.9999 +low: seed 4123 v4 attempt 3 min site 13 ratio 0.9835; v5 attempt 5 min ratio 0.9998 +low: seed 3044 v4 attempt 1 min site 9 ratio 0.9838; v5 attempt 2 min ratio 0.9999 +low: seed 2110 v4 attempt 5 min site 10 ratio 0.9839; v5 attempt 7 min ratio 0.9994 +low: seed 4346 v4 attempt 2 min site 2 ratio 0.9840; v5 attempt 4 min ratio 0.9999 +low: seed 1560 v4 attempt 0 min site 11 ratio 0.9848; v5 attempt 6 min ratio 0.9980 +low: seed 3268 v4 attempt 3 min site 0 ratio 0.9853; v5 attempt 9 min ratio 1.0000 +low: seed 2992 v4 attempt 0 min site 3 ratio 0.9856; v5 attempt 2 min ratio 0.9999 +low: seed 2864 v4 attempt 5 min site 14 ratio 0.9856; v5 attempt 7 min ratio 0.9999 +low: seed 4462 v4 attempt 1 min site 9 ratio 0.9860; v5 attempt 4 min ratio 0.9998 +low: seed 916 v4 attempt 2 min site 10 ratio 0.9861; v5 attempt 6 min ratio 0.9999 +low: seed 4033 v4 attempt 1 min site 0 ratio 0.9866; v5 attempt 6 min ratio 1.0000 +low: seed 1686 v4 attempt 8 min site 6 ratio 0.9866; v5 attempt 10 min ratio 0.9985 +low: seed 2565 v4 attempt 4 min site 7 ratio 0.9866; v5 attempt 10 min ratio 0.9964 +low: seed 1264 v4 attempt 1 min site 3 ratio 0.9867; v5 attempt 3 min ratio 0.9998 +low: seed 2502 v4 attempt 3 min site 8 ratio 0.9868; v5 attempt 11 min ratio 0.9999 +attempts histogram class v4 (mean 2.174): {0: 1435, 1: 1038, 2: 651, 3: 453, 4: 341, 5: 201, 6: 162, 7: 90, 8: 69, 9: 54, 10: 31, 11: 21, 12: 21, 13: 9, 14: 6, 15: 7, 16: 5, 17: 2, 19: 3, 24: 1} +attempts histogram class v5 (mean 2.248): {0: 1409, 1: 1014, 2: 654, 3: 457, 4: 348, 5: 205, 6: 169, 7: 96, 8: 71, 9: 56, 10: 36, 11: 25, 12: 23, 13: 10, 14: 7, 15: 8, 16: 5, 17: 2, 19: 4, 24: 1} +seeds whose class v5 draw lands on another attempt than the class v4 draw: 112 of 4600 (2.435 percent) +class v5 accepted programs under the class v5 floor 0.995: 0 (must be 0) +ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 76 filtered out; finished in 1256.29s + +Terminated +lease: released 48 pool cores after 1267 s, exit 0 diff --git a/docs/design/class-v5-stored-state.md b/docs/design/class-v5-stored-state.md index 5d7a48f0e..c36792350 100644 --- a/docs/design/class-v5-stored-state.md +++ b/docs/design/class-v5-stored-state.md @@ -35,6 +35,7 @@ | 19:4x | The flip-stale harness re-run (base 30500) read FAIL on `v5_ids_equal_the_cli_v5_id`, `sinks_agree`, `block_counts_agree`: the fork binaries on build-1 date from 18:56 UK, before AP-F4-1 (19:27) and AP-F1-1 (19:37), so the miners' v5 ids differ from the CLI's at redrawn epochs (9 and 10 differ, 11 equal). Binary skew; the fork rebuilds after (c''') and the case runs again on the matched pair. The harness itself: the 60x file now carries other lanes' override fields (`sig_scheme`, `sig_scheme_activation_daa`, `finality_succession_activation_daa`, `latency_ladder_cache_rung`) that the fork's `OverrideParams` (deny_unknown_fields) refuses; the harness drops the fields the fork source does not name and says so in its log (1c02465c) | | 19:5x | Main's order through the coordinator: class v5's acceptance carries the fix for the residual hot-set class (adv-accept's seed 100767, section 14), the cheapest fix first (the raised per-site floor) against the per-site hot-item test, chosen by the lower clean rejection rate. (c''') in at ab6f980b: `MIN_DISTINCT_RATIO_V5 = 0.995`, known-failed first on the exemplar, the census test `v5_hot_census` behind the number | | 20:0x | The v5-fasttime lane's exception, owned by the node lane: `class_signal.rs decide()` with the v5 object set and both floors at 0 resolves the epochs under the window to class v3 regardless of the v4 floor (e0:v3 e1:v3 e2:v4 on the 60x profile); on Devnet 3 (v4 from genesis) enabling v5 would re-read day one as v3. This lane's harness never saw it (its v4 floor is 120, v3 at 60). Gates the crossing object, not the hash side | +| 21:03 | The (c''') census landed (section 14): 112 of 4,600 under 0.995 (2.435 percent), attempts mean +3.4 percent, 0 class v5 programs under the floor; the floor stays 0.995 (0.99 would pass the exemplar). The flip-stale harness PASSED on the matched fork and igneum-pow binaries at 21:03 UK (base 30700) once the stale miner's fall-off was judged by the block's DAA score: the 20:4x run had failed on one ACCEPTED line 4.7 s after the boundary's wall time that was a flip-epoch block found on a pre-boundary template, valid | ## 1. The claim, in one paragraph @@ -278,7 +279,7 @@ Every item of this page that has no code, no test or no measurement yet, with th | The exec snapshot wire carrying the day streams (a proof-synced node's trusted-data path) | DONE by the node lane (19:3x UK): fork branch class-v5-node-wire 7737ebd9 on both box mirrors, igneum/exec only, SNAPSHOT_VERSION kept at 1 with `epoch_streams` as the last field and a legacy fallback (a 0.3.23 snapshot loads on a pre-field node and the other way round through the sweep); the writer carries the two newest captures, each checked to rebuild to its root; the loader rebuilds each, compares its root with the loaded state's record at that block, publishes the final one to `ExecState.stream_cache` at once and holds the next until its cut, refuses a tampered or foreign stream and installs the rest; tests `snapshot::tests::the_legacy_shape_is_the_struct_without_the_streams` and `service::class_v5_tests::a_snapshot_carries_the_epoch_streams_and_a_loader_serves_them`, known-failed first; exec suite 43 of 43 on build-2 at 18:33:09Z | node lane | 0 | | The pool protocol's per-epoch state fetch | NO code | pool lane | 2 | | The day-state witness in the pruning-proof format | DONE by the node lane (19:5x UK): class-v5-node-wire 6d827c5d on both mirrors. The witness is the state root after each class v5 epoch's seed block, `EpochSeedHeader.stateRoot = 3` beside the epoch seed header (empty before class v5, so the old wire parses both ways), `PruningProofStateRoots` on the proof metadata; the prover reads each class v5 seed block's root from the installed provider (`DayStateProvider::state_root(block)`, one addition to the kaspa-pow trait, default decodes the stream) or from a witness it took; the verifier's `ProofSeeds::from_witnesses_with_roots` refuses a class v5 epoch whose seed header has no root (the known-failed shape) and a root for an epoch with no header; `check_header` on DayStateUnavailable for a class v5 header accepts it as trusted data when the proof carries the epoch's witness, else refuses naming the missing witness; the importer installs the (seed block, root) pairs through `install_day_state_witnesses`; the executor's `install_epoch_streams` holds a stream for a block it has no record of to that witness (section 5's rule, both conditions). Suites on build-2 on the commit: kaspa-consensus 122, igneum-exec 44, kaspa-p2p-flows 37, kaspa-p2p-lib 20, kaspa-pow 18 | node lane | 0 | -| The acceptance bound on a program's hot-set share (section 14, main's order 19:5x UK) | (c''') at ab6f980b: the per-site distinct-index floor raised to 0.995 under the state flag, known-failed first on seed 100767; the census (clean rejection rate, attempts histogram) running on box 2; the number goes to the coordinator and here when it lands | this lane | 1 | +| The acceptance bound on a program's hot-set share (section 14, main's order 19:5x UK) | DONE: (c''') `MIN_DISTINCT_RATIO_V5 = 0.995` under the state flag (ab6f980b), known-failed first on seed 100767, the census read (21:03 UK): 2.435 percent of sub-version 3 accepted programs under the floor, attempts mean 2.174 to 2.248, 0 class v5 programs under it; the design reading of 0 clean rejections was wrong and the page says so | this lane | 0 | | The class walk under the v5 object (`class_signal.rs decide()`: epochs under the window resolve to v3 regardless of the v4 floor once v5 is enabled; the v5-fasttime lane's reading 20:0x UK) | OPEN, the node lane's: a known-failed test with v4 from genesis and the v5 object set must read v4 at epoch 0; this lane's harness gains the same case (v4 floor 0, v3 never) once the fork has the fix | node lane (fork), this lane (harness case) | 2 | | The spec text (01 1.8.5 the leaf line, 1.12 the cut, 10 the witness) | NO text | this lane | 2 | | The litepaper paragraph and ledger M35 | done (the litepaper's measured numbers are the 4090's) | this lane | 0 | @@ -299,4 +300,6 @@ The known-failed test's reading on box 2 (20:33 UK): class v4 accepts the exempl The multiplicity reading at the acceptance sample (adv-accept's gap tool, 20:4x UK, logs/adv-accept/gap-rep8.log): the exemplar's site 6 spends 0.168 percent (closed form) and 0.151 percent (live day) of its 2^20 reads on word indices read 8 or more times, every other site 0.000 percent; seed 100211 (d07885a437e237c7) reads site 9 at 0.186 / 0.179 percent with ratio 0.9907 / 0.9908; the control program reads 0.000 at every site. Items are 16 words and 2^24 of them, so 3.35 percent of a site's reads into the top 0.1 percent of items at 2^24 sequential nonces reads as 0.17 percent on heavily repeated word indices at 2^20, and the distinct count the floor reads carries the same signal with the model's spread of 0.0001 under it. The multiplicity statistic would be the second instrument if the floor's clean rejection rate read high; the census decides. +The census reading (box 2, 48 pool cores under lease class v5, 20:42 to 21:03 UK, log `class-v5-harness/v5-census-4600-0.log`): over 4,600 seeds of the f8 label space the class v4 sub-version 3 accepted programs' minimum site ratio reads min 0.9807, p0.1 0.9831, p1 0.9906, p5 0.9962, median 0.9999, max 1.0000; under 0.98 none, under 0.99 43 (0.935 percent), under 0.995 112 (2.435 percent), under 0.998 517 (11.2 percent), under 0.999 868 (18.9 percent). The 112 are the seeds whose class v5 draw lands on a later attempt (the same 112); the attempts histogram goes from mean 2.174 (v4: 0: 1435, 1: 1038, 2: 651, 3: 453, 4: 341, 5: 201, 6: 162, 7: 90, 8: 69, 9: 54, 10: 31, 11: 21, 12: 21, 13: 9, 14: 6, 15: 7, 16: 5, 17: 2, 19: 3, 24: 1) to mean 2.248 (v5: 0: 1409, 1: 1014, 2: 654, 3: 457, 4: 348, 5: 205, 6: 169, 7: 96, 8: 71, 9: 56, 10: 36, 11: 25, 12: 23, 13: 10, 14: 7, 15: 8, 16: 5, 17: 2, 19: 4, 24: 1), the tail unchanged; 0 class v5 accepted programs sit under the floor. Two premises corrected by the census: the clean spread relayed as "0.9960 minimum, p1 0.9990" was a smaller sample's, not the chain draw's; and a floor at 0.99 would pass the exemplar (0.9919). So 0.995 is the lowest round floor that refuses seed 100767 with the model's spread under it, at the cost of one or more extra draw attempts on 2.4 percent of epochs (each attempt about 0.3 s of acceptance on one core; no consensus cost, nothing in the hash or the kits' shape). Whether the 2.4 percent are clean is adv-accept's live-low20 row at 2^24 (its first seed read, 3664, at 1.31x on the f8 gate: not clean), and its four measured lowest-ratio seeds all read beyond the 1.2x gate live: the floor rejects the band where every program measured so far is a weak hot-set program. Per tier: a miner sees nothing (the program of an epoch is drawn once by every node alike); a pool sees nothing; the chip model loses the hot set the exemplar offered. + What the floor does not reach, named: a hot set whose excess collisions at 2^20 stay under 0.5 percent of a site's evaluations (a top-0.1-percent item share under about 1.3x); adv-accept's lowest-ratio list between 0.995 and 0.998 reads 1.29x to 1.63x live on the f8 gate but no hot set by X_f >= f, and the floor rejects those too (cheap: one more attempt). A chip that holds 0.1 percent of a window's items serves at most the excess the floor allows, 0.5 percent of a site's reads, 1/16 of that over the program: under the 1.067x bound of AP-F8-1 by a wide margin. The per-site hot-item test at live scale stays owed only if the census reads the floor's clean rejection rate over 1 percent. diff --git a/igneum-pow/src/accept.rs b/igneum-pow/src/accept.rs index fa521aebd..9937dba06 100644 --- a/igneum-pow/src/accept.rs +++ b/igneum-pow/src/accept.rs @@ -42,16 +42,19 @@ pub const MIN_DISTINCT_RATIO_V4: f64 = 0.98; /// 16,384 evaluations (a uniform site repeats a value 2 or 3 times; the finding's bands sit under the ratio instead). pub const MAX_SOURCE_REPEAT_V4: u32 = 8; /// (c'''), class v5 (`docs/design/class-v5-stored-state.md` section 14): the per-site distinct-index floor of the -/// ratio pass raised from sub-version 3's 0.98 to the bottom of the clean seeds' spread. On the 2^20-evaluation -/// sample the model's spread is about 0.0001 (the collision count is near Poisson with mean n^2 / 2W = 8,192 on -/// the quarter window); the sub-version 3 clean seeds' site rows read 0.9960 at the minimum, 0.9990 at p1 and -/// 1.0000 at the median (adv-accept's census), and the residual class the in-house pass attributed (seed 100767, -/// program 9d68e6286fc817d4: site 6 reads the multiples of 2^19 through `rotl(x * stride, rot)` of a `mad` value -/// that is near zero in a value class, 3.35 percent of its live reads on the top 0.1 percent of items, 1,677 reads -/// of index 0 in 10^6 nonces) reads 0.9919 closed and 0.9920 on the live day at the same sample: 0.012 above the -/// 0.98 floor, 0.003 under this one. The floor is the cheapest fix that reaches the class (main's order of 7 October -/// 2026): no new sample, the verdict at attempt 2 with no 2^24 run; the census test `v5_hot_census` reads its clean -/// rejection rate and the attempts histogram beside the per-site hot-item test. +/// ratio pass raised from sub-version 3's 0.98 to 0.995. The residual class the in-house pass attributed (adv-accept, +/// 7 October 2026: seed 100767 of the f8 label space, program 9d68e6286fc817d4; its site 6 reads the multiples of +/// 2^19 through `rotl(x * stride, rot)` of a `mad` value that is near zero in a value class, 3.35 percent of its live +/// reads on the top 0.1 percent of items, 1,677 reads of index 0 in 10^6 nonces) reads 0.9919 on the closed form and +/// 0.9920 on the live day at the rule's own 2^20 sample: 0.012 above the 0.98 floor, 0.003 under this one, where the +/// window model's spread is 0.0001 (the collision count is near Poisson with mean n^2 / 2W = 8,192 on the quarter +/// window). The census behind the number (`v5_hot_census`, 4,600 seeds of the f8 label space, 7 October 2026, 21:03 +/// UK): the class v4 sub-version 3 accepted programs' minimum site ratio reads min 0.9807, p1 0.9906, p5 0.9962, +/// median 0.9999; 112 of 4,600 (2.435 percent) sit under 0.995 and take one or more further attempts under class v5 +/// (the attempts mean 2.174 to 2.248, the tail unchanged at 24); 0 class v5 accepted programs sit under the floor. +/// 0.99 would pass the exemplar (43 under it); 0.995 is the lowest round floor that refuses it with the model's +/// spread under it. The cheapest fix that reaches the class (main's order of 7 October 2026): no new sample, the +/// verdict at the attempt itself, no 2^24 run, and a per-site hot-item test at that sample is the same statistic. pub const MIN_DISTINCT_RATIO_V5: f64 = 0.995; /// Hashes the dynamic test evaluates: 2,048. pub const ACCEPT_HASHES: usize = ACCEPT_UNITS * LANES; From ceceaf64d63ae8685e033255afb6c63388755da0 Mon Sep 17 00:00:00 2001 From: igneum-labs <337424239+igneum-labs@users.noreply.github.com> Date: Wed, 7 Oct 2026 20:36:11 +0000 Subject: [PATCH 12/19] class v5 harness runner: the box side in a script run by path (main's rule of 21:33 UK: no redirect-truncate inside a shell command string) Co-Authored-By: Claude Fable 5.1 --- tools/class-v5/harness-box.sh | 18 ++++++++++++++++++ tools/class-v5/harness-remote.sh | 4 +++- 2 files changed, 21 insertions(+), 1 deletion(-) create mode 100755 tools/class-v5/harness-box.sh diff --git a/tools/class-v5/harness-box.sh b/tools/class-v5/harness-box.sh new file mode 100755 index 000000000..cb1e04919 --- /dev/null +++ b/tools/class-v5/harness-box.sh @@ -0,0 +1,18 @@ +#!/usr/bin/env bash +# The box side of tools/class-v5/harness-remote.sh: runs the class v5 fast-time harness under the worktree on the box and +# keeps its log and summary under the harness log dir. In a file, not an ssh string (main's rule, 7 October 2026, 21:33 +# UK: no inline deletion or redirect-truncate inside a shell -c string). +# harness-box.sh +set -uo pipefail +REMOTE_ROOT="$1"; REMOTE_LOG="$2"; CASE="$3"; BASE="$4"; shift 4 +touch "$REMOTE_ROOT/infra/fast-time/class-v5-signal.mjs" "$REMOTE_ROOT/infra/fast-time/override-60x.json" +mkdir -p "$REMOTE_LOG" +cd "$REMOTE_ROOT" +IGNEUM_V5_BASE="$BASE" IGNEUM_V5_TMP="/tmp/igneum-fast-time-v5s-$CASE" \ +IGNEUM_V5_BIN="$REMOTE_ROOT/vendor/igneum-node-class-v5/target/release" \ +IGNEUM_POW="$REMOTE_ROOT/igneum-pow/target/release/igneum-pow" \ + node infra/fast-time/class-v5-signal.mjs "$@" > "$REMOTE_LOG/$CASE.log" 2>&1 +rc=$? +cp "/tmp/igneum-fast-time-v5s-$CASE/summary.json" "$REMOTE_LOG/$CASE.json" 2>/dev/null || true +echo "harness-remote: rc $rc" +exit $rc diff --git a/tools/class-v5/harness-remote.sh b/tools/class-v5/harness-remote.sh index 56ae80e05..a014f89d5 100755 --- a/tools/class-v5/harness-remote.sh +++ b/tools/class-v5/harness-remote.sh @@ -27,6 +27,8 @@ BASE="${BASE:-29760}" echo "harness-remote: case $CASE on $HOST: node $REMOTE_ROOT/infra/fast-time/class-v5-signal.mjs $ARGS" # the harness file travels by rsync (the mirror carries HEAD; an uncommitted change rides along, re-stamped: the copied-sources rule) rsync -a -e "ssh -i $KEY" "$ROOT/infra/fast-time/class-v5-signal.mjs" "$ROOT/infra/fast-time/override-60x.json" "$HOST:$REMOTE_ROOT/infra/fast-time/" -ssh -i "$KEY" "$HOST" "touch $REMOTE_ROOT/infra/fast-time/class-v5-signal.mjs $REMOTE_ROOT/infra/fast-time/override-60x.json; mkdir -p $REMOTE_LOG; cd $REMOTE_ROOT && IGNEUM_V5_BASE=$BASE IGNEUM_V5_TMP=/tmp/igneum-fast-time-v5s-$CASE IGNEUM_V5_BIN=$REMOTE_ROOT/vendor/igneum-node-class-v5/target/release IGNEUM_POW=$REMOTE_ROOT/igneum-pow/target/release/igneum-pow node infra/fast-time/class-v5-signal.mjs $ARGS > $REMOTE_LOG/$CASE.log 2>&1; rc=\$?; cp /tmp/igneum-fast-time-v5s-$CASE/summary.json $REMOTE_LOG/$CASE.json 2>/dev/null || true; echo \"harness-remote: rc \$rc\"; exit \$rc" || true +rsync -a -e "ssh -i $KEY" "$ROOT/tools/class-v5/harness-box.sh" "$HOST:$REMOTE_ROOT/tools/class-v5/" +# the box side is a script run by path (tools/class-v5/harness-box.sh), not an ssh command string +ssh -i "$KEY" "$HOST" "$REMOTE_ROOT/tools/class-v5/harness-box.sh" "$REMOTE_ROOT" "$REMOTE_LOG" "$CASE" "$BASE" $ARGS || true rsync -a -e "ssh -i $KEY" "$HOST:$REMOTE_LOG/$CASE.log" "$HOST:$REMOTE_LOG/$CASE.json" "$OUT/" 2>/dev/null || true grep -E "SUMMARY|FAILED CHECK|PROGRAM ID|CLASS SWITCH" "$OUT/$CASE.log" || tail -20 "$OUT/$CASE.log" From 764a41d9e7d661645b0efcd7dd98f736a06d0e77 Mon Sep 17 00:00:00 2001 From: igneum-labs <337424239+igneum-labs@users.noreply.github.com> Date: Wed, 7 Oct 2026 20:37:52 +0000 Subject: [PATCH 13/19] class v5 shadow rule test: the scan is over the candidate draw at attempt 0 (the full draw costs seconds per candidate under the 2^20 ratio pass; the first form ran over an hour on box 2) Co-Authored-By: Claude Fable 5.1 --- igneum-pow/src/generator.rs | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/igneum-pow/src/generator.rs b/igneum-pow/src/generator.rs index 2e2f24264..5deb79d69 100644 --- a/igneum-pow/src/generator.rs +++ b/igneum-pow/src/generator.rs @@ -2031,22 +2031,26 @@ mod tests { bad.push(mk(Op::Or, 3, 5)); } assert!(shadow_removable_count(&bad) * 1000 > bad.len() * SHADOW_REMOVABLE_MAX_PERMILLE, "a block of or-idempotent pairs is over the bound"); + // The scan is over the shadow DRAW (the candidate at attempt 0 of each class, no acceptance run): a full draw + // under class v4 or v5 costs seconds per candidate (the 2^20 ratio pass over 64 + 256 x 27 instructions per + // evaluation), and the first form of this scan, 6,000 seeds x two full draws, ran for over an hour on box 2 + // (7 October 2026, 21:4x UK). The redraw rule lives in the candidate draw, so the candidate is where it shows. let era = [7u8; 32]; + let v5_class = LoadClass::era(V5_CLASS, &era, &V3_ALLOWED); + let v4_class = LoadClass::era(V4_CLASS, &era, &V3_ALLOWED); let mut redrawn = 0; let mut scanned = 0; for i in 0..6_000u32 { let seed = format!("igneum-shadow-scan/{i}"); - let v5 = generate_from_seed_bytes_program_class(&seed, seed.as_bytes(), ProgramClass::V5, Some(&era)); + let v5 = candidate_class(&seed, seed.as_bytes(), 0, v5_class); assert!(shadow_removable_count(&v5.shadow) * 1000 <= v5.shadow.len() * SHADOW_REMOVABLE_MAX_PERMILLE, "{seed}: a v5 block over the bound"); - let v4 = generate_from_seed_bytes_program_class(&seed, seed.as_bytes(), ProgramClass::V4, Some(&era)); + let v4 = candidate_class(&seed, seed.as_bytes(), 0, v4_class); if v5.shadow == v4.shadow { assert_eq!(v5.instrs, v4.instrs, "{seed}: an unredrawn seed is the amended v4 draw for draw"); } else { - // the acceptance rules read the shadow (the freshness fixpoint), so a redrawn block can move the accepted - // attempt and with it the base program; what must hold is that the first v4 block was over the bound + // the first v4 block was over the bound and the rule redrew it from the continuing stream redrawn += 1; - let first = candidate_class(&seed, seed.as_bytes(), v4.attempt, v4.class); - assert!(shadow_removable_count(&first.shadow) * 1000 > first.shadow.len() * SHADOW_REMOVABLE_MAX_PERMILLE || v5.attempt != v4.attempt, "{seed}: v5 redrew a block the rule admits"); + assert!(shadow_removable_count(&v4.shadow) * 1000 > v4.shadow.len() * SHADOW_REMOVABLE_MAX_PERMILLE, "{seed}: v5 redrew a block the rule admits"); } scanned += 1; if redrawn >= 2 && scanned >= 1_000 { From 7eb3ad69ceb59f7371c0308d64361c96fe7fb115 Mon Sep 17 00:00:00 2001 From: igneum-labs <337424239+igneum-labs@users.noreply.github.com> Date: Wed, 7 Oct 2026 20:38:29 +0000 Subject: [PATCH 14/19] class v5 design page: section 14 carries the five programs' ratios and the record's sentence (the floor closes the class on every measured hot set by X_f >= f and misses the shadow-block-write residual, named with its instrument and bound); the residual as a gap row Co-Authored-By: Claude Fable 5.1 --- docs/design/class-v5-stored-state.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docs/design/class-v5-stored-state.md b/docs/design/class-v5-stored-state.md index c36792350..f2515bf2b 100644 --- a/docs/design/class-v5-stored-state.md +++ b/docs/design/class-v5-stored-state.md @@ -36,6 +36,7 @@ | 19:5x | Main's order through the coordinator: class v5's acceptance carries the fix for the residual hot-set class (adv-accept's seed 100767, section 14), the cheapest fix first (the raised per-site floor) against the per-site hot-item test, chosen by the lower clean rejection rate. (c''') in at ab6f980b: `MIN_DISTINCT_RATIO_V5 = 0.995`, known-failed first on the exemplar, the census test `v5_hot_census` behind the number | | 20:0x | The v5-fasttime lane's exception, owned by the node lane: `class_signal.rs decide()` with the v5 object set and both floors at 0 resolves the epochs under the window to class v3 regardless of the v4 floor (e0:v3 e1:v3 e2:v4 on the 60x profile); on Devnet 3 (v4 from genesis) enabling v5 would re-read day one as v3. This lane's harness never saw it (its v4 floor is 120, v3 at 60). Gates the crossing object, not the hash side | | 21:03 | The (c''') census landed (section 14): 112 of 4,600 under 0.995 (2.435 percent), attempts mean +3.4 percent, 0 class v5 programs under the floor; the floor stays 0.995 (0.99 would pass the exemplar). The flip-stale harness PASSED on the matched fork and igneum-pow binaries at 21:03 UK (base 30700) once the stale miner's fall-off was judged by the block's DAA score: the 20:4x run had failed on one ACCEPTED line 4.7 s after the boundary's wall time that was a flip-epoch block found on a pre-boundary template, valid | +| 21:4x | The five programs' ratios landed (section 14): the floor refuses 4346 and 5245 and every measured hot set by X_f >= f, misses the three milder shadow-block-write concentrations (0.9992 to 0.9997), Devnet 3's first program among them; the residual named with its instrument and bound. The full suite's run on the (c''') commit was stopped at 70 minutes: `class_v5_shadow_redundancy_rule`'s scan drew 6,000 seeds twice through the full draw (seconds per candidate under the 2^20 pass; the scan had never run to its loop before, the test having failed earlier at an assertion), rewritten over the candidate draw (45765de6); the suite re-queued | ## 1. The claim, in one paragraph @@ -281,6 +282,7 @@ Every item of this page that has no code, no test or no measurement yet, with th | The day-state witness in the pruning-proof format | DONE by the node lane (19:5x UK): class-v5-node-wire 6d827c5d on both mirrors. The witness is the state root after each class v5 epoch's seed block, `EpochSeedHeader.stateRoot = 3` beside the epoch seed header (empty before class v5, so the old wire parses both ways), `PruningProofStateRoots` on the proof metadata; the prover reads each class v5 seed block's root from the installed provider (`DayStateProvider::state_root(block)`, one addition to the kaspa-pow trait, default decodes the stream) or from a witness it took; the verifier's `ProofSeeds::from_witnesses_with_roots` refuses a class v5 epoch whose seed header has no root (the known-failed shape) and a root for an epoch with no header; `check_header` on DayStateUnavailable for a class v5 header accepts it as trusted data when the proof carries the epoch's witness, else refuses naming the missing witness; the importer installs the (seed block, root) pairs through `install_day_state_witnesses`; the executor's `install_epoch_streams` holds a stream for a block it has no record of to that witness (section 5's rule, both conditions). Suites on build-2 on the commit: kaspa-consensus 122, igneum-exec 44, kaspa-p2p-flows 37, kaspa-p2p-lib 20, kaspa-pow 18 | node lane | 0 | | The acceptance bound on a program's hot-set share (section 14, main's order 19:5x UK) | DONE: (c''') `MIN_DISTINCT_RATIO_V5 = 0.995` under the state flag (ab6f980b), known-failed first on seed 100767, the census read (21:03 UK): 2.435 percent of sub-version 3 accepted programs under the floor, attempts mean 2.174 to 2.248, 0 class v5 programs under it; the design reading of 0 clean rejections was wrong and the page says so | this lane | 0 | | The class walk under the v5 object (`class_signal.rs decide()`: epochs under the window resolve to v3 regardless of the v4 floor once v5 is enabled; the v5-fasttime lane's reading 20:0x UK) | OPEN, the node lane's: a known-failed test with v4 from genesis and the v5 object set must read v4 at epoch 0; this lane's harness gains the same case (v4 floor 0, v3 never) once the fork has the fix | node lane (fork), this lane (harness case) | 2 | +| The shadow-block-write residual of section 14 (the three milder concentrations at 1.26x to 1.45x, Devnet 3's first program among them) | OPEN: a draw rule on the shadow block's last write to a load's source (mul, mulhi, sub of the same register), known-failed first on fce15bf61030be57's site 0, with its after-fraction census; not in tonight's object (the chip value is under the AP-F8-1 bound by two orders); adv-mixer-2's AP-F4-1 lever (redraw when the FPGA LUT cost is 205 or less, a 2-adder mul, or all rotations equal; about 22 days per 100 years redrawn) is the second independent statement of the same mechanism, its census owed on the class v5 generator | this lane | 3 | | The spec text (01 1.8.5 the leaf line, 1.12 the cut, 10 the witness) | NO text | this lane | 2 | | The litepaper paragraph and ledger M35 | done (the litepaper's measured numbers are the 4090's) | this lane | 0 | @@ -302,4 +304,6 @@ The multiplicity reading at the acceptance sample (adv-accept's gap tool, 20:4x The census reading (box 2, 48 pool cores under lease class v5, 20:42 to 21:03 UK, log `class-v5-harness/v5-census-4600-0.log`): over 4,600 seeds of the f8 label space the class v4 sub-version 3 accepted programs' minimum site ratio reads min 0.9807, p0.1 0.9831, p1 0.9906, p5 0.9962, median 0.9999, max 1.0000; under 0.98 none, under 0.99 43 (0.935 percent), under 0.995 112 (2.435 percent), under 0.998 517 (11.2 percent), under 0.999 868 (18.9 percent). The 112 are the seeds whose class v5 draw lands on a later attempt (the same 112); the attempts histogram goes from mean 2.174 (v4: 0: 1435, 1: 1038, 2: 651, 3: 453, 4: 341, 5: 201, 6: 162, 7: 90, 8: 69, 9: 54, 10: 31, 11: 21, 12: 21, 13: 9, 14: 6, 15: 7, 16: 5, 17: 2, 19: 3, 24: 1) to mean 2.248 (v5: 0: 1409, 1: 1014, 2: 654, 3: 457, 4: 348, 5: 205, 6: 169, 7: 96, 8: 71, 9: 56, 10: 36, 11: 25, 12: 23, 13: 10, 14: 7, 15: 8, 16: 5, 17: 2, 19: 4, 24: 1), the tail unchanged; 0 class v5 accepted programs sit under the floor. Two premises corrected by the census: the clean spread relayed as "0.9960 minimum, p1 0.9990" was a smaller sample's, not the chain draw's; and a floor at 0.99 would pass the exemplar (0.9919). So 0.995 is the lowest round floor that refuses seed 100767 with the model's spread under it, at the cost of one or more extra draw attempts on 2.4 percent of epochs (each attempt about 0.3 s of acceptance on one core; no consensus cost, nothing in the hash or the kits' shape). Whether the 2.4 percent are clean is adv-accept's live-low20 row at 2^24 (its first seed read, 3664, at 1.31x on the f8 gate: not clean), and its four measured lowest-ratio seeds all read beyond the 1.2x gate live: the floor rejects the band where every program measured so far is a weak hot-set program. Per tier: a miner sees nothing (the program of an epoch is drawn once by every node alike); a pool sees nothing; the chip model loses the hot set the exemplar offered. +The five programs main named, read by adv-accept at the acceptance's own 2^20 sample (21:35 UK, logs gap-five-d20733.log and gap-five-d20730.log on branch adv-accept): seed 4346 (bbb38e847011c354, 2.24x live) minimum site 2 at 0.9840 and seed 5245 (beaad44840bb9e4e, 1.86x live) site 8 at 0.9831, both refused by the floor; Devnet 3's epoch-0 class v4 program fce15bf61030be57 at site 0 (instruction 3, source r6) 0.9992 (live 0.9993), adv-cache-2's era-fixed-20 (11f9f955b21d56c9) site 11 at 0.9997 and era-drawn-2 (7ceb797d31eedb3e) site 13 at 0.9992: at or above the floor, the residual. Two further hot sets of adv-accept's (106924 at 0.9821, 107022 at 0.9877) refused. The record's sentence: the floor closes the class on every program whose live hot set passes X_f at or above f that any lane measured (seven of adv-accept's, 0.9821 to 0.9919 at the minimum site, and 4346, 5245), and misses the three milder concentrations (top 0.1 percent share 1.26x to 1.45x of control, 0.03 to 0.1 percent of a hash's reads each, the shadow block's last write to the load's source register as the mechanism: a mul, a mulhi, a sub), Devnet 3's own first program among them, whose site-0 product low-bit law moves the distinct count by 0.08 percent: inside the clean population's spread at 2^20 (adv-accept's clean 1st percentile about 0.9993 on 29,032 programs), so no floor that keeps the clean rejection rate near 2.4 percent reaches it. Devnet 3's first class v5 program therefore draws the same (e5a4ac5978462156, attempt 0; the (c''') CLI on build-1 at 21:08 UK confirms). The residual's chip value: a hot table serving 0.1 percent of one site's reads is 1/16 of that over the program's loads, under the 1.067x bound of AP-F8-1 by two orders; its instrument, if main wants it closed, is a shadow-block draw rule (the last write before a load's source may not be a mul, mulhi or sub of the same register: a rule in the draw, not the acceptance), owed as a named row below, not tonight's object. + What the floor does not reach, named: a hot set whose excess collisions at 2^20 stay under 0.5 percent of a site's evaluations (a top-0.1-percent item share under about 1.3x); adv-accept's lowest-ratio list between 0.995 and 0.998 reads 1.29x to 1.63x live on the f8 gate but no hot set by X_f >= f, and the floor rejects those too (cheap: one more attempt). A chip that holds 0.1 percent of a window's items serves at most the excess the floor allows, 0.5 percent of a site's reads, 1/16 of that over the program: under the 1.067x bound of AP-F8-1 by a wide margin. The per-site hot-item test at live scale stays owed only if the census reads the floor's clean rejection rate over 1 percent. From 03c3f88046a8b493536ad46fa5f5281818b999c7 Mon Sep 17 00:00:00 2001 From: igneum-labs <337424239+igneum-labs@users.noreply.github.com> Date: Wed, 7 Oct 2026 20:38:42 +0000 Subject: [PATCH 15/19] class v5 design page: section 14's record sentence is the defender's ruling (the hot-set half closed, the residual named with prevalence, gain and lever) Co-Authored-By: Claude Fable 5.1 --- docs/design/class-v5-stored-state.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/design/class-v5-stored-state.md b/docs/design/class-v5-stored-state.md index f2515bf2b..9b5fe88e9 100644 --- a/docs/design/class-v5-stored-state.md +++ b/docs/design/class-v5-stored-state.md @@ -304,6 +304,6 @@ The multiplicity reading at the acceptance sample (adv-accept's gap tool, 20:4x The census reading (box 2, 48 pool cores under lease class v5, 20:42 to 21:03 UK, log `class-v5-harness/v5-census-4600-0.log`): over 4,600 seeds of the f8 label space the class v4 sub-version 3 accepted programs' minimum site ratio reads min 0.9807, p0.1 0.9831, p1 0.9906, p5 0.9962, median 0.9999, max 1.0000; under 0.98 none, under 0.99 43 (0.935 percent), under 0.995 112 (2.435 percent), under 0.998 517 (11.2 percent), under 0.999 868 (18.9 percent). The 112 are the seeds whose class v5 draw lands on a later attempt (the same 112); the attempts histogram goes from mean 2.174 (v4: 0: 1435, 1: 1038, 2: 651, 3: 453, 4: 341, 5: 201, 6: 162, 7: 90, 8: 69, 9: 54, 10: 31, 11: 21, 12: 21, 13: 9, 14: 6, 15: 7, 16: 5, 17: 2, 19: 3, 24: 1) to mean 2.248 (v5: 0: 1409, 1: 1014, 2: 654, 3: 457, 4: 348, 5: 205, 6: 169, 7: 96, 8: 71, 9: 56, 10: 36, 11: 25, 12: 23, 13: 10, 14: 7, 15: 8, 16: 5, 17: 2, 19: 4, 24: 1), the tail unchanged; 0 class v5 accepted programs sit under the floor. Two premises corrected by the census: the clean spread relayed as "0.9960 minimum, p1 0.9990" was a smaller sample's, not the chain draw's; and a floor at 0.99 would pass the exemplar (0.9919). So 0.995 is the lowest round floor that refuses seed 100767 with the model's spread under it, at the cost of one or more extra draw attempts on 2.4 percent of epochs (each attempt about 0.3 s of acceptance on one core; no consensus cost, nothing in the hash or the kits' shape). Whether the 2.4 percent are clean is adv-accept's live-low20 row at 2^24 (its first seed read, 3664, at 1.31x on the f8 gate: not clean), and its four measured lowest-ratio seeds all read beyond the 1.2x gate live: the floor rejects the band where every program measured so far is a weak hot-set program. Per tier: a miner sees nothing (the program of an epoch is drawn once by every node alike); a pool sees nothing; the chip model loses the hot set the exemplar offered. -The five programs main named, read by adv-accept at the acceptance's own 2^20 sample (21:35 UK, logs gap-five-d20733.log and gap-five-d20730.log on branch adv-accept): seed 4346 (bbb38e847011c354, 2.24x live) minimum site 2 at 0.9840 and seed 5245 (beaad44840bb9e4e, 1.86x live) site 8 at 0.9831, both refused by the floor; Devnet 3's epoch-0 class v4 program fce15bf61030be57 at site 0 (instruction 3, source r6) 0.9992 (live 0.9993), adv-cache-2's era-fixed-20 (11f9f955b21d56c9) site 11 at 0.9997 and era-drawn-2 (7ceb797d31eedb3e) site 13 at 0.9992: at or above the floor, the residual. Two further hot sets of adv-accept's (106924 at 0.9821, 107022 at 0.9877) refused. The record's sentence: the floor closes the class on every program whose live hot set passes X_f at or above f that any lane measured (seven of adv-accept's, 0.9821 to 0.9919 at the minimum site, and 4346, 5245), and misses the three milder concentrations (top 0.1 percent share 1.26x to 1.45x of control, 0.03 to 0.1 percent of a hash's reads each, the shadow block's last write to the load's source register as the mechanism: a mul, a mulhi, a sub), Devnet 3's own first program among them, whose site-0 product low-bit law moves the distinct count by 0.08 percent: inside the clean population's spread at 2^20 (adv-accept's clean 1st percentile about 0.9993 on 29,032 programs), so no floor that keeps the clean rejection rate near 2.4 percent reaches it. Devnet 3's first class v5 program therefore draws the same (e5a4ac5978462156, attempt 0; the (c''') CLI on build-1 at 21:08 UK confirms). The residual's chip value: a hot table serving 0.1 percent of one site's reads is 1/16 of that over the program's loads, under the 1.067x bound of AP-F8-1 by two orders; its instrument, if main wants it closed, is a shadow-block draw rule (the last write before a load's source may not be a mul, mulhi or sub of the same register: a rule in the draw, not the acceptance), owed as a named row below, not tonight's object. +The five programs main named, read by adv-accept at the acceptance's own 2^20 sample (21:35 UK, logs gap-five-d20733.log and gap-five-d20730.log on branch adv-accept): seed 4346 (bbb38e847011c354, 2.24x live) minimum site 2 at 0.9840 and seed 5245 (beaad44840bb9e4e, 1.86x live) site 8 at 0.9831, both refused by the floor; Devnet 3's epoch-0 class v4 program fce15bf61030be57 at site 0 (instruction 3, source r6) 0.9992 (live 0.9993), adv-cache-2's era-fixed-20 (11f9f955b21d56c9) site 11 at 0.9997 and era-drawn-2 (7ceb797d31eedb3e) site 13 at 0.9992: at or above the floor, the residual. Two further hot sets of adv-accept's (106924 at 0.9821, 107022 at 0.9877) refused. The record's sentence (the defender's ruling, 21:4x UK): the freeze commit CLOSES THE HOT-SET HALF of the class and NOT the class: the floor refuses every program whose live hot set passes X_f at or above f that any lane measured (seven of adv-accept's, 0.9821 to 0.9919 at the minimum site, and 4346, 5245), and misses the three milder concentrations (top 0.1 percent share 1.26x to 1.45x of control, 0.03 to 0.1 percent of a hash's reads each, the shadow block's last write to the load's source register as the mechanism: a mul, a mulhi, a sub), Devnet 3's own first program among them, whose site-0 product low-bit law moves the distinct count by 0.08 percent: inside the clean population's spread at 2^20 (adv-accept's clean 1st percentile about 0.9993 on 29,032 programs), so no floor that keeps the clean rejection rate near 2.4 percent reaches it; the residual's prevalence is 3 of 432 load sites in adv-cache-2's census and its chip gain under 1.001x; its lever is a value-level source test at live scale or a per-site hot-item test, not a ratio, routed to the next class as a named item. Devnet 3's first class v5 program therefore draws the same (e5a4ac5978462156, attempt 0; the (c''') CLI on build-1 at 21:08 UK confirms). The residual's chip value: a hot table serving 0.1 percent of one site's reads is 1/16 of that over the program's loads, under the 1.067x bound of AP-F8-1 by two orders; its instrument, if main wants it closed, is a shadow-block draw rule (the last write before a load's source may not be a mul, mulhi or sub of the same register: a rule in the draw, not the acceptance), owed as a named row below, not tonight's object. What the floor does not reach, named: a hot set whose excess collisions at 2^20 stay under 0.5 percent of a site's evaluations (a top-0.1-percent item share under about 1.3x); adv-accept's lowest-ratio list between 0.995 and 0.998 reads 1.29x to 1.63x live on the f8 gate but no hot set by X_f >= f, and the floor rejects those too (cheap: one more attempt). A chip that holds 0.1 percent of a window's items serves at most the excess the floor allows, 0.5 percent of a site's reads, 1/16 of that over the program: under the 1.067x bound of AP-F8-1 by a wide margin. The per-site hot-item test at live scale stays owed only if the census reads the floor's clean rejection rate over 1 percent. From 1fabc0842abc9406e67d810d1ee896a26b3af192 Mon Sep 17 00:00:00 2001 From: igneum-labs <337424239+igneum-labs@users.noreply.github.com> Date: Wed, 7 Oct 2026 20:39:15 +0000 Subject: [PATCH 16/19] class v5 design page: section 14's running total (adv-accept's seed 1738 refused; six of six live hot sets under the floor) Co-Authored-By: Claude Fable 5.1 --- docs/design/class-v5-stored-state.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/design/class-v5-stored-state.md b/docs/design/class-v5-stored-state.md index 9b5fe88e9..5a741ad6d 100644 --- a/docs/design/class-v5-stored-state.md +++ b/docs/design/class-v5-stored-state.md @@ -304,6 +304,6 @@ The multiplicity reading at the acceptance sample (adv-accept's gap tool, 20:4x The census reading (box 2, 48 pool cores under lease class v5, 20:42 to 21:03 UK, log `class-v5-harness/v5-census-4600-0.log`): over 4,600 seeds of the f8 label space the class v4 sub-version 3 accepted programs' minimum site ratio reads min 0.9807, p0.1 0.9831, p1 0.9906, p5 0.9962, median 0.9999, max 1.0000; under 0.98 none, under 0.99 43 (0.935 percent), under 0.995 112 (2.435 percent), under 0.998 517 (11.2 percent), under 0.999 868 (18.9 percent). The 112 are the seeds whose class v5 draw lands on a later attempt (the same 112); the attempts histogram goes from mean 2.174 (v4: 0: 1435, 1: 1038, 2: 651, 3: 453, 4: 341, 5: 201, 6: 162, 7: 90, 8: 69, 9: 54, 10: 31, 11: 21, 12: 21, 13: 9, 14: 6, 15: 7, 16: 5, 17: 2, 19: 3, 24: 1) to mean 2.248 (v5: 0: 1409, 1: 1014, 2: 654, 3: 457, 4: 348, 5: 205, 6: 169, 7: 96, 8: 71, 9: 56, 10: 36, 11: 25, 12: 23, 13: 10, 14: 7, 15: 8, 16: 5, 17: 2, 19: 4, 24: 1), the tail unchanged; 0 class v5 accepted programs sit under the floor. Two premises corrected by the census: the clean spread relayed as "0.9960 minimum, p1 0.9990" was a smaller sample's, not the chain draw's; and a floor at 0.99 would pass the exemplar (0.9919). So 0.995 is the lowest round floor that refuses seed 100767 with the model's spread under it, at the cost of one or more extra draw attempts on 2.4 percent of epochs (each attempt about 0.3 s of acceptance on one core; no consensus cost, nothing in the hash or the kits' shape). Whether the 2.4 percent are clean is adv-accept's live-low20 row at 2^24 (its first seed read, 3664, at 1.31x on the f8 gate: not clean), and its four measured lowest-ratio seeds all read beyond the 1.2x gate live: the floor rejects the band where every program measured so far is a weak hot-set program. Per tier: a miner sees nothing (the program of an epoch is drawn once by every node alike); a pool sees nothing; the chip model loses the hot set the exemplar offered. -The five programs main named, read by adv-accept at the acceptance's own 2^20 sample (21:35 UK, logs gap-five-d20733.log and gap-five-d20730.log on branch adv-accept): seed 4346 (bbb38e847011c354, 2.24x live) minimum site 2 at 0.9840 and seed 5245 (beaad44840bb9e4e, 1.86x live) site 8 at 0.9831, both refused by the floor; Devnet 3's epoch-0 class v4 program fce15bf61030be57 at site 0 (instruction 3, source r6) 0.9992 (live 0.9993), adv-cache-2's era-fixed-20 (11f9f955b21d56c9) site 11 at 0.9997 and era-drawn-2 (7ceb797d31eedb3e) site 13 at 0.9992: at or above the floor, the residual. Two further hot sets of adv-accept's (106924 at 0.9821, 107022 at 0.9877) refused. The record's sentence (the defender's ruling, 21:4x UK): the freeze commit CLOSES THE HOT-SET HALF of the class and NOT the class: the floor refuses every program whose live hot set passes X_f at or above f that any lane measured (seven of adv-accept's, 0.9821 to 0.9919 at the minimum site, and 4346, 5245), and misses the three milder concentrations (top 0.1 percent share 1.26x to 1.45x of control, 0.03 to 0.1 percent of a hash's reads each, the shadow block's last write to the load's source register as the mechanism: a mul, a mulhi, a sub), Devnet 3's own first program among them, whose site-0 product low-bit law moves the distinct count by 0.08 percent: inside the clean population's spread at 2^20 (adv-accept's clean 1st percentile about 0.9993 on 29,032 programs), so no floor that keeps the clean rejection rate near 2.4 percent reaches it; the residual's prevalence is 3 of 432 load sites in adv-cache-2's census and its chip gain under 1.001x; its lever is a value-level source test at live scale or a per-site hot-item test, not a ratio, routed to the next class as a named item. Devnet 3's first class v5 program therefore draws the same (e5a4ac5978462156, attempt 0; the (c''') CLI on build-1 at 21:08 UK confirms). The residual's chip value: a hot table serving 0.1 percent of one site's reads is 1/16 of that over the program's loads, under the 1.067x bound of AP-F8-1 by two orders; its instrument, if main wants it closed, is a shadow-block draw rule (the last write before a load's source may not be a mul, mulhi or sub of the same register: a rule in the draw, not the acceptance), owed as a named row below, not tonight's object. +The five programs main named, read by adv-accept at the acceptance's own 2^20 sample (21:35 UK, logs gap-five-d20733.log and gap-five-d20730.log on branch adv-accept): seed 4346 (bbb38e847011c354, 2.24x live) minimum site 2 at 0.9840 and seed 5245 (beaad44840bb9e4e, 1.86x live) site 8 at 0.9831, both refused by the floor; Devnet 3's epoch-0 class v4 program fce15bf61030be57 at site 0 (instruction 3, source r6) 0.9992 (live 0.9993), adv-cache-2's era-fixed-20 (11f9f955b21d56c9) site 11 at 0.9997 and era-drawn-2 (7ceb797d31eedb3e) site 13 at 0.9992: at or above the floor, the residual. Three further hot sets of adv-accept's refused: 106924 at 0.9821, 107022 at 0.9877, and 1738 (33ece54e2df5ea44, attempt 4, X at 0.1 percent +0.102 percent, 1.68x over the window model) at site 13 0.9868 (live 0.9870; log gap-hot3.log), so every live hot set by X_f at or above f adv-accept has read, six with minimum sites 0.9821 to 0.9919, is refused. The record's sentence (the defender's ruling, 21:4x UK): the freeze commit CLOSES THE HOT-SET HALF of the class and NOT the class: the floor refuses every program whose live hot set passes X_f at or above f that any lane measured (seven of adv-accept's, 0.9821 to 0.9919 at the minimum site, and 4346, 5245), and misses the three milder concentrations (top 0.1 percent share 1.26x to 1.45x of control, 0.03 to 0.1 percent of a hash's reads each, the shadow block's last write to the load's source register as the mechanism: a mul, a mulhi, a sub), Devnet 3's own first program among them, whose site-0 product low-bit law moves the distinct count by 0.08 percent: inside the clean population's spread at 2^20 (adv-accept's clean 1st percentile about 0.9993 on 29,032 programs), so no floor that keeps the clean rejection rate near 2.4 percent reaches it; the residual's prevalence is 3 of 432 load sites in adv-cache-2's census and its chip gain under 1.001x; its lever is a value-level source test at live scale or a per-site hot-item test, not a ratio, routed to the next class as a named item. Devnet 3's first class v5 program therefore draws the same (e5a4ac5978462156, attempt 0; the (c''') CLI on build-1 at 21:08 UK confirms). The residual's chip value: a hot table serving 0.1 percent of one site's reads is 1/16 of that over the program's loads, under the 1.067x bound of AP-F8-1 by two orders; its instrument, if main wants it closed, is a shadow-block draw rule (the last write before a load's source may not be a mul, mulhi or sub of the same register: a rule in the draw, not the acceptance), owed as a named row below, not tonight's object. What the floor does not reach, named: a hot set whose excess collisions at 2^20 stay under 0.5 percent of a site's evaluations (a top-0.1-percent item share under about 1.3x); adv-accept's lowest-ratio list between 0.995 and 0.998 reads 1.29x to 1.63x live on the f8 gate but no hot set by X_f >= f, and the floor rejects those too (cheap: one more attempt). A chip that holds 0.1 percent of a window's items serves at most the excess the floor allows, 0.5 percent of a site's reads, 1/16 of that over the program: under the 1.067x bound of AP-F8-1 by a wide margin. The per-site hot-item test at live scale stays owed only if the census reads the floor's clean rejection rate over 1 percent. From 886be840016ac02cbb1c0e30238e81d7f35f76bb Mon Sep 17 00:00:00 2001 From: igneum-labs <337424239+igneum-labs@users.noreply.github.com> Date: Wed, 7 Oct 2026 20:45:16 +0000 Subject: [PATCH 17/19] class v5 shadow rule test: the scan reads the drawn blocks' maximum removable share and redraws (none over the bound in 6,000 first draws under the census arm); the liveness claim is the synthetic over-bound block through the same predicate Co-Authored-By: Claude Fable 5.1 --- igneum-pow/src/generator.rs | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/igneum-pow/src/generator.rs b/igneum-pow/src/generator.rs index 5deb79d69..b3667c8c3 100644 --- a/igneum-pow/src/generator.rs +++ b/igneum-pow/src/generator.rs @@ -2039,12 +2039,13 @@ mod tests { let v5_class = LoadClass::era(V5_CLASS, &era, &V3_ALLOWED); let v4_class = LoadClass::era(V4_CLASS, &era, &V3_ALLOWED); let mut redrawn = 0; - let mut scanned = 0; + let mut max_permille = 0usize; for i in 0..6_000u32 { let seed = format!("igneum-shadow-scan/{i}"); let v5 = candidate_class(&seed, seed.as_bytes(), 0, v5_class); assert!(shadow_removable_count(&v5.shadow) * 1000 <= v5.shadow.len() * SHADOW_REMOVABLE_MAX_PERMILLE, "{seed}: a v5 block over the bound"); let v4 = candidate_class(&seed, seed.as_bytes(), 0, v4_class); + max_permille = max_permille.max(shadow_removable_count(&v4.shadow) * 1000 / v4.shadow.len()); if v5.shadow == v4.shadow { assert_eq!(v5.instrs, v4.instrs, "{seed}: an unredrawn seed is the amended v4 draw for draw"); } else { @@ -2052,13 +2053,15 @@ mod tests { redrawn += 1; assert!(shadow_removable_count(&v4.shadow) * 1000 > v4.shadow.len() * SHADOW_REMOVABLE_MAX_PERMILLE, "{seed}: v5 redrew a block the rule admits"); } - scanned += 1; - if redrawn >= 2 && scanned >= 1_000 { - break; - } } - assert!(redrawn >= 1, "no redraw in {scanned} seeds (the census says about 4e-3 per draw)"); - assert!(redrawn * 50 <= scanned, "{redrawn} redraws in {scanned} seeds: the metric is far above the census's 4e-3"); + // Under the census arm (the same op, the same amount or register) a drawn block's removable share stays far + // under the 3 percent bound: the first 6,000 first draws read a maximum of a few permille and no redraw (7 + // October 2026, 21:5x UK; the 4e-3 per draw of the earlier census counted every rotate pair). The rule's + // liveness is the synthetic over-bound block above through the same predicate; the chain-draw census of the + // trigger rate is the attack-pass lane's F1 census on the class v5 generator. + println!("shadow redundancy over 6,000 first draws: max {max_permille} permille, {redrawn} redraw(s); bound {SHADOW_REMOVABLE_MAX_PERMILLE}"); + assert!(max_permille <= SHADOW_REMOVABLE_MAX_PERMILLE || redrawn >= 1, "a first block over the bound was not redrawn"); + assert!(redrawn * 50 <= 6_000, "{redrawn} redraws in 6,000 seeds: the metric is far above the census's rate"); } /// Class v5 (docs/design/class-v5-stored-state.md) takes the amended class v4 draw (AP-F8-1) as the chain draws it: From 7965f5bafa334c5ffb0230a832a2458c9a358248 Mon Sep 17 00:00:00 2001 From: igneum-labs <337424239+igneum-labs@users.noreply.github.com> Date: Wed, 7 Oct 2026 20:49:23 +0000 Subject: [PATCH 18/19] class v5 design page: section 14's final total from adv-accept (seven of seven live hot sets refused; the three mild concentrations at about 1.0004x) Co-Authored-By: Claude Fable 5.1 --- docs/design/class-v5-stored-state.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/design/class-v5-stored-state.md b/docs/design/class-v5-stored-state.md index 5a741ad6d..d3b17e7f8 100644 --- a/docs/design/class-v5-stored-state.md +++ b/docs/design/class-v5-stored-state.md @@ -304,6 +304,6 @@ The multiplicity reading at the acceptance sample (adv-accept's gap tool, 20:4x The census reading (box 2, 48 pool cores under lease class v5, 20:42 to 21:03 UK, log `class-v5-harness/v5-census-4600-0.log`): over 4,600 seeds of the f8 label space the class v4 sub-version 3 accepted programs' minimum site ratio reads min 0.9807, p0.1 0.9831, p1 0.9906, p5 0.9962, median 0.9999, max 1.0000; under 0.98 none, under 0.99 43 (0.935 percent), under 0.995 112 (2.435 percent), under 0.998 517 (11.2 percent), under 0.999 868 (18.9 percent). The 112 are the seeds whose class v5 draw lands on a later attempt (the same 112); the attempts histogram goes from mean 2.174 (v4: 0: 1435, 1: 1038, 2: 651, 3: 453, 4: 341, 5: 201, 6: 162, 7: 90, 8: 69, 9: 54, 10: 31, 11: 21, 12: 21, 13: 9, 14: 6, 15: 7, 16: 5, 17: 2, 19: 3, 24: 1) to mean 2.248 (v5: 0: 1409, 1: 1014, 2: 654, 3: 457, 4: 348, 5: 205, 6: 169, 7: 96, 8: 71, 9: 56, 10: 36, 11: 25, 12: 23, 13: 10, 14: 7, 15: 8, 16: 5, 17: 2, 19: 4, 24: 1), the tail unchanged; 0 class v5 accepted programs sit under the floor. Two premises corrected by the census: the clean spread relayed as "0.9960 minimum, p1 0.9990" was a smaller sample's, not the chain draw's; and a floor at 0.99 would pass the exemplar (0.9919). So 0.995 is the lowest round floor that refuses seed 100767 with the model's spread under it, at the cost of one or more extra draw attempts on 2.4 percent of epochs (each attempt about 0.3 s of acceptance on one core; no consensus cost, nothing in the hash or the kits' shape). Whether the 2.4 percent are clean is adv-accept's live-low20 row at 2^24 (its first seed read, 3664, at 1.31x on the f8 gate: not clean), and its four measured lowest-ratio seeds all read beyond the 1.2x gate live: the floor rejects the band where every program measured so far is a weak hot-set program. Per tier: a miner sees nothing (the program of an epoch is drawn once by every node alike); a pool sees nothing; the chip model loses the hot set the exemplar offered. -The five programs main named, read by adv-accept at the acceptance's own 2^20 sample (21:35 UK, logs gap-five-d20733.log and gap-five-d20730.log on branch adv-accept): seed 4346 (bbb38e847011c354, 2.24x live) minimum site 2 at 0.9840 and seed 5245 (beaad44840bb9e4e, 1.86x live) site 8 at 0.9831, both refused by the floor; Devnet 3's epoch-0 class v4 program fce15bf61030be57 at site 0 (instruction 3, source r6) 0.9992 (live 0.9993), adv-cache-2's era-fixed-20 (11f9f955b21d56c9) site 11 at 0.9997 and era-drawn-2 (7ceb797d31eedb3e) site 13 at 0.9992: at or above the floor, the residual. Three further hot sets of adv-accept's refused: 106924 at 0.9821, 107022 at 0.9877, and 1738 (33ece54e2df5ea44, attempt 4, X at 0.1 percent +0.102 percent, 1.68x over the window model) at site 13 0.9868 (live 0.9870; log gap-hot3.log), so every live hot set by X_f at or above f adv-accept has read, six with minimum sites 0.9821 to 0.9919, is refused. The record's sentence (the defender's ruling, 21:4x UK): the freeze commit CLOSES THE HOT-SET HALF of the class and NOT the class: the floor refuses every program whose live hot set passes X_f at or above f that any lane measured (seven of adv-accept's, 0.9821 to 0.9919 at the minimum site, and 4346, 5245), and misses the three milder concentrations (top 0.1 percent share 1.26x to 1.45x of control, 0.03 to 0.1 percent of a hash's reads each, the shadow block's last write to the load's source register as the mechanism: a mul, a mulhi, a sub), Devnet 3's own first program among them, whose site-0 product low-bit law moves the distinct count by 0.08 percent: inside the clean population's spread at 2^20 (adv-accept's clean 1st percentile about 0.9993 on 29,032 programs), so no floor that keeps the clean rejection rate near 2.4 percent reaches it; the residual's prevalence is 3 of 432 load sites in adv-cache-2's census and its chip gain under 1.001x; its lever is a value-level source test at live scale or a per-site hot-item test, not a ratio, routed to the next class as a named item. Devnet 3's first class v5 program therefore draws the same (e5a4ac5978462156, attempt 0; the (c''') CLI on build-1 at 21:08 UK confirms). The residual's chip value: a hot table serving 0.1 percent of one site's reads is 1/16 of that over the program's loads, under the 1.067x bound of AP-F8-1 by two orders; its instrument, if main wants it closed, is a shadow-block draw rule (the last write before a load's source may not be a mul, mulhi or sub of the same register: a rule in the draw, not the acceptance), owed as a named row below, not tonight's object. +The five programs main named, read by adv-accept at the acceptance's own 2^20 sample (21:35 UK, logs gap-five-d20733.log and gap-five-d20730.log on branch adv-accept): seed 4346 (bbb38e847011c354, 2.24x live) minimum site 2 at 0.9840 and seed 5245 (beaad44840bb9e4e, 1.86x live) site 8 at 0.9831, both refused by the floor; Devnet 3's epoch-0 class v4 program fce15bf61030be57 at site 0 (instruction 3, source r6) 0.9992 (live 0.9993), adv-cache-2's era-fixed-20 (11f9f955b21d56c9) site 11 at 0.9997 and era-drawn-2 (7ceb797d31eedb3e) site 13 at 0.9992: at or above the floor, the residual. Three further hot sets of adv-accept's refused: 106924 at 0.9821, 107022 at 0.9877, and 1738 (33ece54e2df5ea44, attempt 4, X at 0.1 percent +0.102 percent, 1.68x over the window model) at site 13 0.9868 (live 0.9870; log gap-hot3.log), and 170 (53a02a7c9c9b86f3, attempt 4, X at 0.1 percent +0.143 percent, 2.02x) at site 2 0.9880 (live 0.9877; log gap-hot4.log), so every live hot set by X_f at or above f adv-accept found (seven in the lowest 25 of 29,032 accepted programs, minimum sites 0.9821 to 0.9919) is refused; the three mild concentrations it misses are worth about 1.0004x to a chip. The record's sentence (the defender's ruling, 21:4x UK): the freeze commit CLOSES THE HOT-SET HALF of the class and NOT the class: the floor refuses every program whose live hot set passes X_f at or above f that any lane measured (seven of adv-accept's, 0.9821 to 0.9919 at the minimum site, and 4346, 5245), and misses the three milder concentrations (top 0.1 percent share 1.26x to 1.45x of control, 0.03 to 0.1 percent of a hash's reads each, the shadow block's last write to the load's source register as the mechanism: a mul, a mulhi, a sub), Devnet 3's own first program among them, whose site-0 product low-bit law moves the distinct count by 0.08 percent: inside the clean population's spread at 2^20 (adv-accept's clean 1st percentile about 0.9993 on 29,032 programs), so no floor that keeps the clean rejection rate near 2.4 percent reaches it; the residual's prevalence is 3 of 432 load sites in adv-cache-2's census and its chip gain under 1.001x; its lever is a value-level source test at live scale or a per-site hot-item test, not a ratio, routed to the next class as a named item. Devnet 3's first class v5 program therefore draws the same (e5a4ac5978462156, attempt 0; the (c''') CLI on build-1 at 21:08 UK confirms). The residual's chip value: a hot table serving 0.1 percent of one site's reads is 1/16 of that over the program's loads, under the 1.067x bound of AP-F8-1 by two orders; its instrument, if main wants it closed, is a shadow-block draw rule (the last write before a load's source may not be a mul, mulhi or sub of the same register: a rule in the draw, not the acceptance), owed as a named row below, not tonight's object. What the floor does not reach, named: a hot set whose excess collisions at 2^20 stay under 0.5 percent of a site's evaluations (a top-0.1-percent item share under about 1.3x); adv-accept's lowest-ratio list between 0.995 and 0.998 reads 1.29x to 1.63x live on the f8 gate but no hot set by X_f >= f, and the floor rejects those too (cheap: one more attempt). A chip that holds 0.1 percent of a window's items serves at most the excess the floor allows, 0.5 percent of a site's reads, 1/16 of that over the program: under the 1.067x bound of AP-F8-1 by a wide margin. The per-site hot-item test at live scale stays owed only if the census reads the floor's clean rejection rate over 1 percent. From dba17a0a4f6e283eaae837ca788ef14ecc3b101e Mon Sep 17 00:00:00 2001 From: igneum-labs <337424239+igneum-labs@users.noreply.github.com> Date: Wed, 7 Oct 2026 20:53:07 +0000 Subject: [PATCH 19/19] class v5 FREEZE: the suite's green and the gate on the record (section 0), the shadow rule's measured trigger reading, the next commit named Co-Authored-By: Claude Fable 5.1 --- docs/design/class-v5-stored-state.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/design/class-v5-stored-state.md b/docs/design/class-v5-stored-state.md index d3b17e7f8..5b842f116 100644 --- a/docs/design/class-v5-stored-state.md +++ b/docs/design/class-v5-stored-state.md @@ -37,6 +37,7 @@ | 20:0x | The v5-fasttime lane's exception, owned by the node lane: `class_signal.rs decide()` with the v5 object set and both floors at 0 resolves the epochs under the window to class v3 regardless of the v4 floor (e0:v3 e1:v3 e2:v4 on the 60x profile); on Devnet 3 (v4 from genesis) enabling v5 would re-read day one as v3. This lane's harness never saw it (its v4 floor is 120, v3 at 60). Gates the crossing object, not the hash side | | 21:03 | The (c''') census landed (section 14): 112 of 4,600 under 0.995 (2.435 percent), attempts mean +3.4 percent, 0 class v5 programs under the floor; the floor stays 0.995 (0.99 would pass the exemplar). The flip-stale harness PASSED on the matched fork and igneum-pow binaries at 21:03 UK (base 30700) once the stale miner's fall-off was judged by the block's DAA score: the 20:4x run had failed on one ACCEPTED line 4.7 s after the boundary's wall time that was a flip-epoch block found on a pre-boundary template, valid | | 21:4x | The five programs' ratios landed (section 14): the floor refuses 4346 and 5245 and every measured hot set by X_f >= f, misses the three milder shadow-block-write concentrations (0.9992 to 0.9997), Devnet 3's first program among them; the residual named with its instrument and bound. The full suite's run on the (c''') commit was stopped at 70 minutes: `class_v5_shadow_redundancy_rule`'s scan drew 6,000 seeds twice through the full draw (seconds per candidate under the 2^20 pass; the scan had never run to its loop before, the test having failed earlier at an assertion), rewritten over the candidate draw (45765de6); the suite re-queued | +| 22:1x | FREEZE. The full igneum-pow suite green on the tree (box 2, 22:0x UK: 73 unit tests, 4 ignored census/bench, packs 20 incl. the pinned v5 packs unchanged, derive 7, mixer 4, recheck 2, scratch 7), the pre-push gate GREEN (58 checks). The shadow rule's trigger reading: 6,000 first draws read a maximum removable share of 11 permille against the 30 bound, 0 redraws (the earlier 4e-3 counted every rotate pair; the attack-pass lane's F1 census on 10^5 reads the chain rate). Pinned pack v5-dn3-epoch0 (e5a4ac5978462156, fingerprint 82b19cbde8557ea5) stands. Next commit, after the freeze: AP-F4-1 in the agreed form (cost A at most 205 against the median 226, w32 without the position-32 digit, a two-adder multiplier or one rotation amount rejected; the known-failed day 29,337), and class v5's verified last resort (adv-accept-3's finding: the sub-version 3 rewrite fails the rule on 223 of 2,500 seeds, 209 by part (a); class v5 repairs the stale loads and checks; known-failed first on adv3/steer/2) | ## 1. The claim, in one paragraph