class v5: the fast-time gate PASSES on every check (igneum-build-1, 12:00 to 12:11 UK): the flip v4 to v5 by signal at epoch 8 on 3 of 3 nodes, four v5 epochs with a state root per epoch (proof of following's refresh), the miners' ids equal to the CLI's v5 ids, the stale miner (its first stream kept) rejected on 66 of 66 after the first refresh, the stateless node stopped at the flip with 14 refusals; the harness's check scope fixed (the stateless node and the stale miner asserted by their own checks, the roots compared at the last v5 epoch); the known-failed case's and the flip's summaries and logs under docs/design/class-v5-harness

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
igneum-labs 2026-10-07 11:12:34 +00:00
parent 646600cef4
commit acfad7182c
5 changed files with 693 additions and 652 deletions

File diff suppressed because it is too large Load diff

View file

@ -1,84 +1,76 @@
08:49:04.138 signals 5/5/5, 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
08:49:05.370 n0 up pid 1531281 json 29762 p2p 29761 exec 29763, signals 5
08:49:06.575 n1 up pid 1531873 json 29772 p2p 29771 exec 29773, signals 5
08:49:07.782 n2 up pid 1532455 json 29782 p2p 29781 exec 29783, signals 5
08:49:08.989 n3 up pid 1532932 json 29792 p2p 29791 exec disabled, signals 5
08:49:08.990 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; the fixed height is the floor | this node signals object version 5
08:49:08.990 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; the fixed height is the floor | this node signals object version 5
08:49:08.990 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; the fixed height is the floor | this node signals object version 5
08:49:08.990 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; the fixed height is the floor | this node signals object version 5
08:49:08.991 n0 digest: 5d04822e3501a5de
08:49:10.001 epoch -1 -> 0 at daa 8, 5.9 s: template class 4, next 4, day 1244002, signal share at the sink v4 0 v5 undefined bps (window 0, this node signals 0, v5 decided by signal at epoch none)
08:49:10.003 t=5.9 s daa 8 epoch 0 class 4 signal v4 0 v5 undefined bps blocks/sink per node 8/cc5ac3c2 8/cc5ac3c2 0/234e082d 0/234e082d
08:49:25.025 t=20.9 s daa 28 epoch 0 class 4 signal v4 0 v5 undefined bps blocks/sink per node 28/e4723bc2 28/e4723bc2 5/10b4b304 7/44e64410
08:49:40.046 t=35.9 s daa 48 epoch 0 class 4 signal v4 0 v5 undefined bps blocks/sink per node 48/e1de9cdd 48/e1de9cdd 8/25bdd4f2 11/27e7f942
08:49:51.056 epoch 0 -> 1 at daa 60, 46.9 s: template class 4, next 4, day 1244002, signal share at the sink v4 0 v5 undefined bps (window 0, this node signals 0, v5 decided by signal at epoch none)
08:49:55.058 t=50.9 s daa 63 epoch 1 class 4 signal v4 0 v5 undefined bps blocks/sink per node 63/26b15d5c 63/26b15d5c 16/9241d585 16/ffc78128
08:50:10.074 t=65.9 s daa 78 epoch 1 class 4 signal v4 0 v5 undefined bps blocks/sink per node 78/fffe9c78 78/fffe9c78 34/6e8bbd86 38/36a8d938
08:50:25.092 t=81.0 s daa 97 epoch 1 class 4 signal v4 0 v5 undefined bps blocks/sink per node 97/500a3395 97/500a3395 57/016159b5 57/f2398571
08:50:40.114 t=96.0 s daa 113 epoch 1 class 4 signal v4 0 v5 undefined bps blocks/sink per node 113/cb42b2f8 113/cb42b2f8 61/29fc1389 65/022658a4
08:50:46.122 epoch 1 -> 2 at daa 120, 102.0 s: template class 4, next 4, day 1244002, signal share at the sink v4 0 v5 undefined bps (window 0, this node signals 0, v5 decided by signal at epoch none)
08:50:55.134 t=111.0 s daa 129 epoch 2 class 4 signal v4 0 v5 undefined bps blocks/sink per node 129/80baac6e 129/80baac6e 63/63af02ec 73/367fd0c9
08:51:10.154 t=126.0 s daa 146 epoch 2 class 4 signal v4 0 v5 undefined bps blocks/sink per node 146/f52bb223 146/f52bb223 65/8670b8c6 83/681f00d4
08:51:25.170 t=141.0 s daa 161 epoch 2 class 4 signal v4 0 v5 undefined bps blocks/sink per node 161/43301a50 161/43301a50 70/759fd924 99/5821c2c5
08:51:40.185 t=156.0 s daa 170 epoch 2 class 4 signal v4 0 v5 undefined bps blocks/sink per node 170/b48d0414 170/b48d0414 85/1b5ee62e 112/7228f49b
08:51:47.204 epoch 2 -> 3 at daa 181, 163.1 s: template class 4, next 4, day 1244002, signal share at the sink v4 0 v5 undefined bps (window 0, this node signals 0, v5 decided by signal at epoch none)
08:51:55.214 t=171.1 s daa 190 epoch 3 class 4 signal v4 0 v5 undefined bps blocks/sink per node 190/05b1614d 190/05b1614d 97/c61b5970 123/ccde6031
08:52:10.243 t=186.1 s daa 199 epoch 3 class 4 signal v4 0 v5 undefined bps blocks/sink per node 199/bb6b68db 199/bb6b68db 112/6de39bce 136/4b157b5d
08:52:25.263 t=201.1 s daa 219 epoch 3 class 4 signal v4 0 v5 undefined bps blocks/sink per node 219/82b5135e 219/82b5135e 124/611d22b8 153/a1f230b4
08:52:40.285 t=216.1 s daa 235 epoch 3 class 4 signal v4 0 v5 undefined bps blocks/sink per node 235/ff4ffc81 235/ff4ffc81 141/34afc7b7 169/38cd7397
08:52:43.289 epoch 3 -> 4 at daa 240, 219.2 s: template class 4, next 4, day 1244002, signal share at the sink v4 0 v5 undefined bps (window 0, this node signals 0, v5 decided by signal at epoch none)
08:52:55.300 t=231.2 s daa 250 epoch 4 class 4 signal v4 0 v5 undefined bps blocks/sink per node 250/84808a5e 250/84808a5e 159/052f7145 186/6758c929
08:53:10.314 t=246.2 s daa 264 epoch 4 class 4 signal v4 0 v5 undefined bps blocks/sink per node 264/6eb1e609 264/6eb1e609 176/40d67df2 197/de6c86c6
08:53:25.328 t=261.2 s daa 281 epoch 4 class 4 signal v4 0 v5 undefined bps blocks/sink per node 281/1131d5dd 282/82fdccad 189/1b25dcf4 208/c00e29fb
08:53:39.338 epoch 4 -> 5 at daa 300, 275.2 s: template class 4, next 4, day 1244002, signal share at the sink v4 0 v5 undefined bps (window 0, this node signals 0, v5 decided by signal at epoch none)
08:53:40.340 t=276.2 s daa 301 epoch 5 class 4 signal v4 0 v5 undefined bps blocks/sink per node 301/aea0297c 301/aea0297c 201/1dfd3138 222/e90cd3bc
08:53:55.357 t=291.2 s daa 319 epoch 5 class 4 signal v4 0 v5 undefined bps blocks/sink per node 319/4ceebe9e 319/4ceebe9e 217/1ecb5bd9 239/bb948d1e
08:54:10.373 t=306.2 s daa 329 epoch 5 class 4 signal v4 0 v5 undefined bps blocks/sink per node 329/e180c52c 329/e180c52c 225/5e8208e5 256/4839a6dc
08:54:25.392 t=321.3 s daa 339 epoch 5 class 4 signal v4 0 v5 undefined bps blocks/sink per node 339/baa1242e 339/baa1242e 241/f5c7c597 269/751ce009
08:54:40.412 t=336.3 s daa 350 epoch 5 class 4 signal v4 0 v5 undefined bps blocks/sink per node 350/d51076f6 350/d51076f6 257/750f4e98 281/42416432
08:54:53.426 epoch 5 -> 6 at daa 360, 349.3 s: template class 4, next 4, day 1244002, signal share at the sink v4 0 v5 undefined bps (window 0, this node signals 0, v5 decided by signal at epoch none)
08:54:55.429 t=351.3 s daa 362 epoch 6 class 4 signal v4 0 v5 undefined bps blocks/sink per node 362/8e8eee03 362/8e8eee03 271/919e7894 294/1777ae8f
08:55:10.448 t=366.3 s daa 377 epoch 6 class 4 signal v4 0 v5 undefined bps blocks/sink per node 377/e1c4e7c8 377/e1c4e7c8 285/3771cfbf 311/cd990c13
08:55:25.463 t=381.3 s daa 388 epoch 6 class 4 signal v4 0 v5 undefined bps blocks/sink per node 388/2d16e363 388/2d16e363 296/41fce8a3 324/1a7f6512
08:55:40.477 t=396.3 s daa 410 epoch 6 class 4 signal v4 0 v5 undefined bps blocks/sink per node 410/a69ba93e 410/a69ba93e 318/1608ca06 338/dc249a31
08:55:51.489 epoch 6 -> 7 at daa 420, 407.4 s: template class 4, next 4, day 1244002, signal share at the sink v4 0 v5 undefined bps (window 0, this node signals 0, v5 decided by signal at epoch none)
08:55:55.495 t=411.4 s daa 424 epoch 7 class 4 signal v4 0 v5 undefined bps blocks/sink per node 424/c878e664 424/c878e664 332/274290f8 354/ceb9714d
08:56:10.511 t=426.4 s daa 438 epoch 7 class 4 signal v4 0 v5 undefined bps blocks/sink per node 438/4582d0ca 438/4582d0ca 352/842432dc 365/3f1dece2
08:56:25.526 t=441.4 s daa 450 epoch 7 class 4 signal v4 0 v5 undefined bps blocks/sink per node 450/5896425e 450/5896425e 361/1c5a27fd 386/5d357fce
08:56:40.629 t=456.5 s daa 466 epoch 7 class 4 signal v4 0 v5 undefined bps blocks/sink per node 466/17caaa78 466/17caaa78 372/5da257e2 399/eb428817
08:56:50.640 epoch 7 -> 8 at daa 480, 466.5 s: template class 4, next 4, day 1244002, signal share at the sink v4 0 v5 undefined bps (window 0, this node signals 0, v5 decided by signal at epoch none)
08:56:55.646 t=471.5 s daa 482 epoch 8 class 4 signal v4 0 v5 undefined bps blocks/sink per node 482/43d6b30d 482/43d6b30d 389/10081b65 416/10c6a408
08:57:10.664 t=486.5 s daa 496 epoch 8 class 4 signal v4 0 v5 undefined bps blocks/sink per node 496/a361bd74 496/a361bd74 408/a7f167ee 431/d6813432
08:57:25.688 t=501.5 s daa 515 epoch 8 class 4 signal v4 0 v5 undefined bps blocks/sink per node 515/0517089c 515/0517089c 425/3555d328 441/a03128a4
08:57:40.711 t=516.6 s daa 527 epoch 8 class 4 signal v4 0 v5 undefined bps blocks/sink per node 527/a2d9f1af 527/a2d9f1af 441/c93924f3 456/4ccd5b87
08:57:50.724 epoch 8 -> 9 at daa 540, 526.6 s: template class 4, next 4, day 1244002, signal share at the sink v4 0 v5 undefined bps (window 0, this node signals 0, v5 decided by signal at epoch none)
08:57:55.736 t=531.6 s daa 541 epoch 9 class 4 signal v4 0 v5 undefined bps blocks/sink per node 541/a019c628 541/a019c628 449/e9f5a51c 464/b059ccb4
08:58:10.753 t=546.6 s daa 559 epoch 9 class 4 signal v4 0 v5 undefined bps blocks/sink per node 559/3a7b8b7c 559/3a7b8b7c 463/d3f464c8 480/7d72cee5
08:58:25.773 t=561.6 s daa 574 epoch 9 class 4 signal v4 0 v5 undefined bps blocks/sink per node 574/20c841d8 574/20c841d8 472/0a311982 480/7d72cee5
08:58:40.794 t=576.7 s daa 592 epoch 9 class 4 signal v4 0 v5 undefined bps blocks/sink per node 592/666ee523 592/666ee523 480/f69e1642 480/7d72cee5
08:58:47.803 epoch 9 -> 10 at daa 600, 583.7 s: template class 4, next 4, day 1244002, signal share at the sink v4 0 v5 undefined bps (window 0, this node signals 0, v5 decided by signal at epoch none)
08:58:55.815 t=591.7 s daa 601 epoch 10 class 4 signal v4 0 v5 undefined bps blocks/sink per node 601/c4f17fe4 601/c4f17fe4 480/f69e1642 480/7d72cee5
08:59:10.839 t=606.7 s daa 602 epoch 10 class 4 signal v4 0 v5 undefined bps blocks/sink per node 602/5721570f 602/5721570f 480/f69e1642 480/7d72cee5
08:59:25.857 t=621.7 s daa 611 epoch 10 class 4 signal v4 0 v5 undefined bps blocks/sink per node 611/84281993 611/84281993 480/f69e1642 480/7d72cee5
08:59:40.874 t=636.7 s daa 620 epoch 10 class 4 signal v4 0 v5 undefined bps blocks/sink per node 620/03487071 620/03487071 480/f69e1642 480/7d72cee5
08:59:55.892 t=651.8 s daa 640 epoch 10 class 4 signal v4 0 v5 undefined bps blocks/sink per node 640/606e51e1 640/606e51e1 480/f69e1642 480/7d72cee5
09:00:10.906 t=666.8 s daa 653 epoch 10 class 4 signal v4 0 v5 undefined bps blocks/sink per node 653/7a3d9187 653/7a3d9187 480/f69e1642 480/7d72cee5
09:00:23.920 epoch 10 -> 11 at daa 660, 679.8 s: template class 4, next 4, day 1244002, signal share at the sink v4 0 v5 undefined bps (window 0, this node signals 0, v5 decided by signal at epoch none)
09:00:27.053 SUMMARY FAIL (expect flip, signals 5/5/5, stale 2): no v5 epoch; epochs seen e0:4:undefinedbps:d1244002 e1:4:undefinedbps:d1244002 e2:4:undefinedbps:d1244002 e3:4:undefinedbps:d1244002 e4:4:undefinedbps:d1244002 e5:4:undefinedbps:d1244002 e6:4:undefinedbps:d1244002 e7:4:undefinedbps:d1244002 e8:4:undefinedbps:d1244002 e9:4:undefinedbps:d1244002 e10:4:undefinedbps:d1244002 e11:4:undefinedbps:d1244002; chain bytes {"0":662} (0 bps at byte 5+); blocks 662 / 0; rejected miners 0/0/0/0 nodes 0/0/0; sinks e269c457945025bb e269c457945025bb f69e1642231eff08 7d72cee5eb402910 (DIFFER); counts 661/661/480/480; signal lines 1/3 (epochs //8, shares //10000); floor lines 3/3; state roots at the flip ; stateless node accepted after the flip 0 (refusal lines 0); stale miner accepted after the first refresh 0 rejected 0; days 1244002
09:00:27.053 FAILED CHECK sinks_agree
09:00:27.053 FAILED CHECK block_counts_agree
09:00:27.053 FAILED CHECK miners_agree_on_every_program
09:00:27.053 FAILED CHECK chain_carries_the_bytes
09:00:27.053 FAILED CHECK template_switched_to_v5
09:00:27.053 FAILED CHECK switched_at_the_first_full_window_epoch
09:00:27.053 FAILED CHECK switched_before_the_floor
09:00:27.053 FAILED CHECK signal_line_on_every_node_same_epoch
09:00:27.053 FAILED CHECK signal_share_at_or_above_threshold
09:00:27.053 FAILED CHECK blocks_on_both_sides
09:00:27.053 FAILED CHECK v5_ids_equal_the_cli_v5_id
09:00:27.053 FAILED CHECK v5_ids_differ_from_the_same_seed_v4_id
09:00:27.053 FAILED CHECK a_v5_epoch_per_window_refresh
09:00:27.053 FAILED CHECK stateless_node_mines_nothing_after_the_flip
09:00:27.053 FAILED CHECK stale_miner_falls_off_at_the_first_refresh
09:00:27.053 summary: /tmp/igneum-fast-time-v5s-flip-stale/summary.json
11:00:09.592 signals 5/5/5, 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
11:00:10.825 n0 up pid 2648668 json 30082 p2p 30081 exec 30083, signals 5
11:00:12.032 n1 up pid 2649150 json 30092 p2p 30091 exec 30093, signals 5
11:00:13.241 n2 up pid 2649639 json 30102 p2p 30101 exec 30103, signals 5
11:00:14.449 n3 up pid 2650117 json 30112 p2p 30111 exec disabled, signals 5
11:00:14.450 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; the fixed height is the floor | this node signals object version 5
11:00:14.450 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; the fixed height is the floor | this node signals object version 5
11:00:14.450 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; the fixed height is the floor | this node signals object version 5
11:00:14.451 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; the fixed height is the floor | this node signals object version 5
11:00:14.451 n0 digest: 5d04822e3501a5de
11:00:15.464 epoch -1 -> 0 at daa 0, 5.9 s: template class 2, next 2, day 1244007, signal share at the sink v4 0 v5 0 bps (window 60, this node signals 5, v5 decided by signal at epoch none)
11:00:15.465 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
11:00:30.487 t=20.9 s daa 33 epoch 0 class 2 signal v4 10000 v5 10000 bps blocks/sink per node 33/641b0539 33/641b0539 33/641b0539 33/641b0539
11:00:44.501 epoch 0 -> 1 at daa 60, 34.9 s: template class 3, next 3, day 1244007, signal share at the sink v4 10000 v5 10000 bps (window 60, this node signals 5, v5 decided by signal at epoch none)
11:00:45.504 t=35.9 s daa 60 epoch 1 class 3 signal v4 10000 v5 10000 bps blocks/sink per node 60/1f052be6 60/1f052be6 60/1f052be6 60/1f052be6
11:01:00.520 t=50.9 s daa 60 epoch 1 class 3 signal v4 10000 v5 10000 bps blocks/sink per node 60/1f052be6 60/1f052be6 60/1f052be6 60/1f052be6
11:01:15.536 t=65.9 s daa 66 epoch 1 class 3 signal v4 10000 v5 10000 bps blocks/sink per node 66/1d1eee8c 66/1d1eee8c 66/1d1eee8c 66/1d1eee8c
11:01:30.554 t=81.0 s daa 76 epoch 1 class 3 signal v4 10000 v5 10000 bps blocks/sink per node 76/6f21504a 76/6f21504a 76/6f21504a 76/6f21504a
11:01:45.571 t=96.0 s daa 91 epoch 1 class 3 signal v4 10000 v5 10000 bps blocks/sink per node 91/bb3fb44a 91/bb3fb44a 91/bb3fb44a 91/bb3fb44a
11:02:00.589 t=111.0 s daa 108 epoch 1 class 3 signal v4 10000 v5 10000 bps blocks/sink per node 108/d6cdfcce 108/d6cdfcce 108/d6cdfcce 108/d6cdfcce
11:02:08.597 epoch 1 -> 2 at daa 120, 119.0 s: template class 4, next 4, day 1244007, signal share at the sink v4 10000 v5 10000 bps (window 60, this node signals 5, v5 decided by signal at epoch none)
11:02:15.607 t=126.0 s daa 126 epoch 2 class 4 signal v4 10000 v5 10000 bps blocks/sink per node 126/f02b03a4 126/f02b03a4 126/f02b03a4 126/f02b03a4
11:02:30.625 t=141.0 s daa 138 epoch 2 class 4 signal v4 10000 v5 10000 bps blocks/sink per node 138/479df235 138/479df235 138/479df235 138/479df235
11:02:45.641 t=156.0 s daa 150 epoch 2 class 4 signal v4 10000 v5 10000 bps blocks/sink per node 150/c162693e 150/c162693e 150/c162693e 150/c162693e
11:03:00.657 t=171.1 s daa 168 epoch 2 class 4 signal v4 10000 v5 10000 bps blocks/sink per node 168/61b9b041 168/61b9b041 168/61b9b041 168/61b9b041
11:03:10.669 epoch 2 -> 3 at daa 180, 181.1 s: template class 4, next 4, day 1244007, signal share at the sink v4 10000 v5 10000 bps (window 60, this node signals 5, v5 decided by signal at epoch none)
11:03:15.674 t=186.1 s daa 191 epoch 3 class 4 signal v4 10000 v5 10000 bps blocks/sink per node 191/a05ca5a2 191/a05ca5a2 191/a05ca5a2 191/a05ca5a2
11:03:30.692 t=201.1 s daa 204 epoch 3 class 4 signal v4 10000 v5 10000 bps blocks/sink per node 204/5e910942 204/5e910942 204/5e910942 204/5e910942
11:03:45.709 t=216.1 s daa 221 epoch 3 class 4 signal v4 10000 v5 10000 bps blocks/sink per node 221/74ce1540 221/74ce1540 221/74ce1540 221/74ce1540
11:03:59.725 epoch 3 -> 4 at daa 241, 230.1 s: template class 4, next 4, day 1244007, signal share at the sink v4 10000 v5 10000 bps (window 60, this node signals 5, v5 decided by signal at epoch none)
11:04:00.726 t=231.1 s daa 241 epoch 4 class 4 signal v4 10000 v5 10000 bps blocks/sink per node 241/f0bb63af 241/f0bb63af 241/f0bb63af 241/f0bb63af
11:04:15.742 t=246.1 s daa 253 epoch 4 class 4 signal v4 10000 v5 10000 bps blocks/sink per node 253/6236bdc6 253/6236bdc6 253/6236bdc6 253/6236bdc6
11:04:30.758 t=261.2 s daa 262 epoch 4 class 4 signal v4 10000 v5 10000 bps blocks/sink per node 262/5035dcb7 262/5035dcb7 262/5035dcb7 262/5035dcb7
11:04:45.774 t=276.2 s daa 277 epoch 4 class 4 signal v4 10000 v5 10000 bps blocks/sink per node 277/a1e7e904 277/a1e7e904 277/a1e7e904 277/a1e7e904
11:05:00.790 t=291.2 s daa 295 epoch 4 class 4 signal v4 10000 v5 10000 bps blocks/sink per node 295/abb48842 295/abb48842 295/abb48842 295/abb48842
11:05:04.794 epoch 4 -> 5 at daa 300, 295.2 s: template class 4, next 4, day 1244007, signal share at the sink v4 10000 v5 10000 bps (window 60, this node signals 5, v5 decided by signal at epoch none)
11:05:15.806 t=306.2 s daa 312 epoch 5 class 4 signal v4 10000 v5 10000 bps blocks/sink per node 312/dac89dab 312/dac89dab 312/dac89dab 312/dac89dab
11:05:30.821 t=321.2 s daa 325 epoch 5 class 4 signal v4 10000 v5 10000 bps blocks/sink per node 325/9ca1c79b 325/9ca1c79b 325/9ca1c79b 325/9ca1c79b
11:05:45.836 t=336.2 s daa 344 epoch 5 class 4 signal v4 10000 v5 10000 bps blocks/sink per node 344/eb0eb044 344/eb0eb044 344/eb0eb044 344/eb0eb044
11:06:00.853 t=351.3 s daa 353 epoch 5 class 4 signal v4 10000 v5 10000 bps blocks/sink per node 353/72d17b4f 353/72d17b4f 353/72d17b4f 353/72d17b4f
11:06:09.862 epoch 5 -> 6 at daa 360, 360.3 s: template class 4, next 4, day 1244007, signal share at the sink v4 10000 v5 10000 bps (window 60, this node signals 5, v5 decided by signal at epoch none)
11:06:15.872 t=366.3 s daa 367 epoch 6 class 4 signal v4 10000 v5 10000 bps blocks/sink per node 367/aa68ac1d 367/aa68ac1d 366/ae646ac0 366/ae646ac0
11:06:30.888 t=381.3 s daa 378 epoch 6 class 4 signal v4 10000 v5 10000 bps blocks/sink per node 378/754e125e 378/754e125e 378/754e125e 378/754e125e
11:06:45.905 t=396.3 s daa 397 epoch 6 class 4 signal v4 10000 v5 10000 bps blocks/sink per node 397/6ff5b198 397/6ff5b198 397/6ff5b198 397/6ff5b198
11:07:00.921 t=411.3 s daa 415 epoch 6 class 4 signal v4 10000 v5 10000 bps blocks/sink per node 415/7affa81e 415/7affa81e 415/7affa81e 415/7affa81e
11:07:11.936 epoch 6 -> 7 at daa 420, 422.3 s: template class 4, next 4, day 1244007, signal share at the sink v4 10000 v5 10000 bps (window 60, this node signals 5, v5 decided by signal at epoch none)
11:07:15.942 t=426.3 s daa 422 epoch 7 class 4 signal v4 10000 v5 10000 bps blocks/sink per node 422/30f2db7d 422/30f2db7d 422/30f2db7d 422/30f2db7d
11:07:30.959 t=441.4 s daa 439 epoch 7 class 4 signal v4 10000 v5 10000 bps blocks/sink per node 439/12b93ae2 439/12b93ae2 439/12b93ae2 439/12b93ae2
11:07:45.978 t=456.4 s daa 457 epoch 7 class 4 signal v4 10000 v5 10000 bps blocks/sink per node 457/25364986 457/25364986 457/25364986 457/25364986
11:08:00.996 t=471.4 s daa 468 epoch 7 class 4 signal v4 10000 v5 10000 bps blocks/sink per node 468/0d46467b 468/0d46467b 468/0d46467b 468/0d46467b
11:08:16.012 epoch 7 -> 8 at daa 480, 486.4 s: template class 5, next 5, day 1244007, signal share at the sink v4 10000 v5 10000 bps (window 60, this node signals 5, v5 decided by signal at epoch 8)
11:08:16.012 CLASS SWITCH: the template is class v5 from epoch 8 (daa 480) at 486.4 s wall
11:08:16.013 t=486.4 s daa 480 epoch 8 class 5 signal v4 10000 v5 10000 bps blocks/sink per node 480/53d94429 480/53d94429 480/53d94429 480/53d94429
11:08:31.027 t=501.4 s daa 495 epoch 8 class 5 signal v4 10000 v5 10000 bps blocks/sink per node 495/dee08e4f 496/c59d758c 495/dee08e4f 480/53d94429
11:08:46.043 t=516.5 s daa 506 epoch 8 class 5 signal v4 10000 v5 10000 bps blocks/sink per node 506/76fbbc4d 506/76fbbc4d 506/76fbbc4d 480/53d94429
11:09:01.061 t=531.5 s daa 527 epoch 8 class 5 signal v4 10000 v5 10000 bps blocks/sink per node 527/13ec4fbb 527/13ec4fbb 527/13ec4fbb 480/53d94429
11:09:15.076 epoch 8 -> 9 at daa 540, 545.5 s: template class 5, next 5, day 1244007, signal share at the sink v4 10000 v5 10000 bps (window 60, this node signals 5, v5 decided by signal at epoch none)
11:09:16.078 t=546.5 s daa 541 epoch 9 class 5 signal v4 10000 v5 10000 bps blocks/sink per node 541/ba839f85 541/ba839f85 541/ba839f85 480/53d94429
11:09:31.093 t=561.5 s daa 546 epoch 9 class 5 signal v4 10000 v5 10000 bps blocks/sink per node 546/33f23434 546/33f23434 546/33f23434 480/53d94429
11:09:46.112 t=576.5 s daa 549 epoch 9 class 5 signal v4 10000 v5 10000 bps blocks/sink per node 549/56fb8eee 549/56fb8eee 549/56fb8eee 480/53d94429
11:10:01.128 t=591.5 s daa 572 epoch 9 class 5 signal v4 10000 v5 10000 bps blocks/sink per node 572/7adbfa32 572/7adbfa32 572/7adbfa32 480/53d94429
11:10:16.145 t=606.6 s daa 588 epoch 9 class 5 signal v4 10000 v5 10000 bps blocks/sink per node 588/d49a657f 588/d49a657f 588/d49a657f 480/53d94429
11:10:28.156 epoch 9 -> 10 at daa 600, 618.6 s: template class 5, next 5, day 1244007, signal share at the sink v4 10000 v5 10000 bps (window 60, this node signals 5, v5 decided by signal at epoch none)
11:10:31.161 t=621.6 s daa 604 epoch 10 class 5 signal v4 10000 v5 10000 bps blocks/sink per node 604/39d123be 604/39d123be 604/39d123be 480/53d94429
11:10:46.177 t=636.6 s daa 616 epoch 10 class 5 signal v4 10000 v5 10000 bps blocks/sink per node 616/08031180 616/08031180 616/08031180 480/53d94429
11:11:01.194 t=651.6 s daa 631 epoch 10 class 5 signal v4 10000 v5 10000 bps blocks/sink per node 631/d1a67ec1 631/d1a67ec1 631/d1a67ec1 480/53d94429
11:11:16.211 t=666.6 s daa 647 epoch 10 class 5 signal v4 10000 v5 10000 bps blocks/sink per node 647/7190cfe4 647/7190cfe4 647/7190cfe4 480/53d94429
11:11:31.227 epoch 10 -> 11 at daa 661, 681.6 s: template class 5, next 5, day 1244007, signal share at the sink v4 10000 v5 10000 bps (window 60, this node signals 5, v5 decided by signal at epoch none)
11:11:31.228 t=681.6 s daa 661 epoch 11 class 5 signal v4 10000 v5 10000 bps blocks/sink per node 661/4926c2e7 661/4926c2e7 661/4926c2e7 480/53d94429
11:11:34.431 stream for epoch 8: {"code":-32000,"message":"no published state stream after chain block 3b35d70abf74e4f49a1d078cb0ecf6d59f3e1eaae83ec502dc269416fc340f03 (the executor has not passed that epoch's cut, or the block is no
11:11:34.508 SUMMARY PASS (expect flip, signals 5/5/5, stale 2): v5 from epoch 8 at DAA 480; epochs seen e0:2:0bps:d1244007 e1:3:10000bps:d1244007 e2:4:10000bps:d1244007 e3:4:10000bps:d1244007 e4:4:10000bps:d1244007 e5:4:10000bps:d1244007 e6:4:10000bps:d1244007 e7:4:10000bps:d1244007 e8:5:10000bps:d1244007 e9:5:10000bps:d1244007 e10:5:10000bps:d1244007 e11:5:10000bps:d1244007; chain bytes {"0":1,"5":665} (9985 bps at byte 5+); blocks 481 / 185; rejected miners 0/0/66/0 nodes 0/0/66; sinks 299c2b5dd2d18dec 299c2b5dd2d18dec 299c2b5dd2d18dec 53d944291b8a19e9 (agree); counts 665/665/665/480; signal lines 3/3 (epochs 8/8/8, shares 10000/10000/10000); floor lines 3/3; state roots at the flip 0x3a94e5816743b56f 0x3a94e5816743b56f 0x3a94e5816743b56f; stateless node accepted after the flip 0 (refusal lines 14); stale miner accepted after the first refresh 0 rejected 66; days 1244007
11:11:34.508 PROGRAM ID epoch 8 seed 3b35d70abf74e4f4: miners 221bb051ed6edfe9 (3 of 3) cli v5 null cli v4 d8ed955497dd7bdc; state root null (null records)
11:11:34.508 PROGRAM ID epoch 9 seed a24d86ef21ed6150: miners a226e505f4a8de67 (3 of 3) cli v5 a226e505f4a8de67 cli v4 fbb1746427850fa2; state root 0x828e6d26d3a0914da425280c67e63f8a9cd89c3b0b8c0fa21d1c436bbf0791a0 (17 records)
11:11:34.508 PROGRAM ID epoch 10 seed 985d01f3e7f563f4: miners a921b8e7ccd2fee3 (3 of 3) cli v5 a921b8e7ccd2fee3 cli v4 9a848b3800292dbe; state root 0x2ae82ead170c541c6cc7e6fab62e4116618ecf9dbadb2c4e994aa2971abcaeb3 (17 records)
11:11:34.508 PROGRAM ID epoch 11 seed 20176fc7352b9052: miners cafc6b529087303d (3 of 3) cli v5 cafc6b529087303d cli v4 b314f6f5b7f1d754; state root 0x3a94e5816743b56f6354ea9f0b10d84c8b27b041bd9ed1e78871b38e0e82fca1 (17 records)
11:11:34.508 summary: /tmp/igneum-fast-time-v5s-flip-stale/summary.json

View file

@ -0,0 +1,2 @@
11:00:29.349 signals 5/5/4, expect no-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 none; stateless node n3; 60 DAA per epoch, lead 10; run 780 s or 11 epochs
11:00:30.554 FAILED: n0 could not bind its ports (a previous run's node is still alive): 2026-10-07 13:00:29.391+02:00 [ERROR] thread 'tokio-rt-worker' panicked at rpc/grpc/server/src/connection_handler.rs:160:29: GRPC Server 127.0.0.1:30140 stopped

View file

@ -22,6 +22,10 @@
| 10:00 | The first flip run read a stranger's chain (two nodes of the known-failed case were still bound to its ports); the harness now kills its own previous pids and fails on a bind error, with a port base per case (6c983cba); the miner's engine panicked on a state refusal while the executor had not yet captured the seed block: it now says the refusal once and asks again every two seconds (bdc3bb34); the flip re-run started 10:24 |
| 10:23 | The fleet's 4090 pod (cv5-2) measured (section 7): rate equal within 0.01 percent, build +0.24 ms, watts a warm-up drift with the classes interleaved, every vector and sample bit-exact |
| 10:38 | The flip re-run (`--signal 5,5,5 --expect flip --stale 2`, ports 29830 and up): the chain flipped v4 to v5 at epoch 8 by signal on 3 of 3 nodes (`Program class v5 by miner signal: epoch 8 ... weakest 10000 bps`), the first epoch with seven full windows after v4; and node 0's templates timed out from the flip on: the engine's provider took the executor's state lock from inside the template path while the follower held it and waited on consensus (a lock-order inversion), and the miners' stream fetches timed out the same way. Fix: the follower publishes each finalised epoch's stream (its cut passed, the stream rebuilt to its root) into a separate cache the provider and the RPC read without the state lock; the harness points the stateless node's miner at its own node's exec port. The 60x profile's day boundary was crossed inside the earlier runs (days 1244001 to 1244003 in the summaries) |
| 11:17 to 11:30 | The flip run on the lock-free stream cache: the flip at epoch 8 on 3 of 3 with equal roots, and no block mined under v5: the miner's stream reader skipped 14 characters past the `streamHex` key, which is 15, so every fetched stream began at `x` (3237e842) |
| 11:31 to 11:46 | A run that stalled at DAA 65 with the box at load 97 (other lanes' builds): all four CPU miners found no block for twelve minutes after the difficulty had adjusted up; no panic, no OOM; not the lane's |
| 11:47 to 11:59 | The flip run on the quiet box: the chain did everything the design says (the flip, four v5 epochs, a root per epoch, the stale miner off on 52 of 52, the stateless node stopped at 480); six `FAILED CHECK`s were the harness's own scope (it compared the stateless node's sink with the others, counted the stale miner's rejections as a fault, and read the flip epoch's stream after the executor had dropped it: captures are kept two epochs); the checks fixed |
| 12:00 to 12:11 | PASS on every check (section 10) |
| 10:4x | The Counter ASIC coordinator relays the project lead's ruling of option A on AP-F8-1: the injecting-source load draw lands in class v4 itself on the hash lane's branch ca3-v4-amend (0.3.19); class v5 takes it by merging that branch once its commit is up, not by a second implementation; the page's section 11 row stands as the record of the bound and its gate |
## 1. The claim, in one paragraph
@ -221,7 +225,13 @@ Per tier, what the 4090 rows mean: every NVIDIA card from 8 to 32 GB keeps its h
## 10. The fast-time gate (the class v4 rehearsal's shape)
`infra/fast-time/class-v5-signal.mjs`: three nodes and three CPU miners on `override-60x.json`, v3 from DAA 60 and v4 from DAA 120 (the floors), the v5 floor at `--floor` (default never), the window 120 DAA, each node's byte by `IGNEUM_CLASS_SIGNAL` (`--signal a,b,c`), each node's exec RPC on its own loopback port and each miner's `--exec-rpc` pointing at its node; a fourth node with `--evm-disable` and its own miner joins with `--stateless`. The three cases and the known-failed case, as the v4 gate's: `--signal 5,5,4 --expect no-flip`; `--signal 5,5,5 --expect flip` (the flip at the first epoch whose seed block has seven full windows below it, every miner's v5 id equal to the CLI's `--program-class v5` id and unequal to the same seed's v4 id; the stateless node's miner accepted 0 blocks after the flip; the chain's reject count 0); `--signal 4,4,4 --floor <daa> --expect floor`; and the known-failed case `--signal 5,5,4 --expect flip`, which must FAIL. The day boundary: the profile's day is 24 minutes and the cut one minute before it; a run of 10 epochs (10 minutes) crosses a boundary when started inside the right 14 minutes, and the harness reports whether it did (`day_boundary_crossed`, the day index of every epoch and the stream root each node served for each day; the roots must agree across nodes). Results: section 0 of this page once run on igneum-build-1 under the `run` kind.
`infra/fast-time/class-v5-signal.mjs`: three nodes and three CPU miners on `override-60x.json`, v3 from DAA 60 and v4 from DAA 120 (the floors), the v5 floor at `--floor` (default never), the window 120 DAA, each node's byte by `IGNEUM_CLASS_SIGNAL` (`--signal a,b,c`), each node's exec RPC on its own loopback port and each miner's `--exec-rpc` pointing at its node; a fourth node with `--evm-disable` and its own miner joins with `--stateless`. The three cases and the known-failed case, as the v4 gate's: `--signal 5,5,4 --expect no-flip`; `--signal 5,5,5 --expect flip` (the flip at the first epoch whose seed block has seven full windows below it, every miner's v5 id equal to the CLI's `--program-class v5` id and unequal to the same seed's v4 id; the stateless node's miner accepted 0 blocks after the flip; the chain's reject count 0); `--signal 4,4,4 --floor <daa> --expect floor`; and the known-failed case `--signal 5,5,4 --expect flip`, which must FAIL. The day boundary: the profile's day is 24 minutes and the cut one minute before it; a run of 10 epochs (10 minutes) crosses a boundary when started inside the right 14 minutes, and the harness reports whether it did (`day_boundary_crossed`, the day index of every epoch and the stream root each node served for each day; the roots must agree across nodes). Results (igneum-build-1, 7 October 2026; `tools/class-v5/harness-remote.sh`, summaries and logs under `docs/design/class-v5-harness/`):
| Case | Run (UK) | SUMMARY |
|---|---|---|
| The known-failed case first (`--signal 5,5,4 --expect flip`) | 09:37 to 09:48 | FAIL as it must: no flip at 7,519 bps of byte 5 (two signalling nodes of three plus the stateless node), 665 blocks, 0 rejected, four sinks equal, eleven flip checks named `FAILED CHECK`, exit 1 (`failed-case.json`) |
| The flip with the stale miner and the stateless node (`--signal 5,5,5 --expect flip --stale 2`) | 12:00 to 12:11 (the sixth run; the five before it found the harness's own faults and two of the fork's, section 0) | PASS on every check: `Program class v5 by miner signal: epoch 8 (... weakest 10000 bps, 420 of 420 blue blocks)` on 3 of 3 nodes, the first epoch with seven full windows after v4; the template class v5 from epoch 8 (DAA 480) at 486 s wall; 481 / 185 blocks across the boundary; the three signalling nodes at one sink, 665/665/665; the miners' v5 program ids equal to the CLI's `--program-class v5 --state` id on epochs 9, 10 and 11 and unequal to the same seeds' v4 ids; a different state root per v5 epoch (828e6d26..., 2ae82ead..., 3a94e581...: the refresh per window), the same root on every executing node; the stale miner (its first stream kept for every later epoch) accepted 0 after the first refresh and rejected on 66 of 66 by its own node; the stateless node (`--evm-disable`) accepted 0 after the flip, 14 refusal lines, its chain stopped at 480 (`flip-stale.json`) |
| Two of three signal v5 (`--signal 5,5,4 --expect no-flip --epochs 11`) | 12:1x | the row below in section 0 once the run ends |
## 11. What is implemented, tested, owed

View file

@ -259,12 +259,16 @@ for (const [k, e] of programs) {
if (st) streams[e.epoch] = { root: st.root, records: st.records, block: st.block };
idRows.push({ epoch: e.epoch, seed: e.seed, miners_id: e.id, miners: e.miners.size, cli_v4: era ? cliId(k, era, 'v4') : null, cli_v5: era && st ? cliId(k, era, 'v5', st.path) : null, state_root: st?.root ?? null, state_records: st?.records ?? null });
}
// every node's stream for the flip epoch must carry the same root (the serialisation agrees across nodes)
// every executing node's stream for the LAST v5 epoch's seed block must carry the same root (the serialisation agrees
// across nodes); the executor keeps the current epoch's capture and the two before it, so the flip epoch's stream is
// gone by the end of a run that went three epochs past it (the 10:55Z run read -32xxx errors for epoch 8 and streams
// for 9, 10 and 11)
const rootsAtFlip = [];
const lastV5Epoch = firstV4 ? Math.max(firstV4.epoch, ...[...epochs.entries()].filter(([, v]) => v.class === 5).map(([e]) => +e)) : null;
if (firstV4) for (const n of nodes) {
if (n.stateless) continue;
try {
const r = await fetch(n.execRpc, { method: 'POST', headers: { 'content-type': 'application/json' }, body: JSON.stringify({ jsonrpc: '2.0', id: 1, method: 'igneum_getPowStateLeaves', params: [epochSeeds.get(firstV4.epoch)] }) });
const r = await fetch(n.execRpc, { method: 'POST', headers: { 'content-type': 'application/json' }, body: JSON.stringify({ jsonrpc: '2.0', id: 1, method: 'igneum_getPowStateLeaves', params: [epochSeeds.get(lastV5Epoch)] }) });
const j = await r.json();
rootsAtFlip.push(j.result?.stateRoot ?? `error: ${JSON.stringify(j.error || j).slice(0, 120)}`);
} catch (e) { rootsAtFlip.push(`error: ${e.message}`); }
@ -302,11 +306,14 @@ const counts = dag.map(d => d.blockCount ?? '?');
const maxEpochSeen = Math.max(-1, ...epochs.keys());
const classesSeen = [...epochs.values()].map(e => e.class);
// the stale miner's rejections are the point of its case (its own node rejects them), and the stateless node must fall
// behind at the flip: both are excluded here and asserted by their own checks below
const signallingIdx = SIGNALLING.map(n => n.i);
const common = {
zero_rejected_by_miners: rejectedMiner.every(r => r.length === 0),
zero_rejected_by_nodes: rejectedNode.every(r => r.length === 0),
sinks_agree: new Set(sinks).size === 1,
block_counts_agree: new Set(counts.map(String)).size === 1,
zero_rejected_by_miners: rejectedMiner.every((r, i) => i === STALE || r.length === 0),
zero_rejected_by_nodes: rejectedNode.every((r, i) => i === STALE || r.length === 0),
sinks_agree: new Set(signallingIdx.map(i => sinks[i])).size === 1,
block_counts_agree: new Set(signallingIdx.map(i => String(counts[i]))).size === 1,
miners_agree_on_every_program: programRows.every(p => !p.disagree),
window_line_on_every_node: nodes.every(n => n.grepLog(WINDOW_LINE).length > 0),
every_node_signals_its_byte: nodes.every((n, i) => n.grepLog(OWN_LINE).some(l => +OWN_LINE.exec(l)[1] === (SIGNAL[i] ?? Math.max(...SIGNAL)))),
@ -325,10 +332,13 @@ if (EXPECT === 'flip') {
signal_line_on_every_node_same_epoch: signalEpochs.every(e => e != null) && new Set(signalEpochs).size === 1 && signalEpochs[0] === (firstV4 && firstV4.epoch),
signal_share_at_or_above_threshold: signalShares.every(s => s != null && s >= 9500),
blocks_on_both_sides: before.length > 0 && after.length > 0,
v5_ids_equal_the_cli_v5_id: idRows.length > 0 && idRows.every(r => r.cli_v5 != null && r.cli_v5 === r.miners_id && r.miners === 3),
// the rows whose stream the executor still held at the end (the last three epochs) must match the CLI; at least two of them
v5_ids_equal_the_cli_v5_id: idRows.filter(r => r.state_root != null).length >= 2 && idRows.filter(r => r.state_root != null).every(r => r.cli_v5 != null && r.cli_v5 === r.miners_id && r.miners === 3),
v5_ids_differ_from_the_same_seed_v4_id: idRows.length > 0 && idRows.every(r => r.cli_v4 != null && r.cli_v4 !== r.miners_id),
a_v5_epoch_per_window_refresh: idRows.length >= 2 && new Set(idRows.map(r => r.state_root)).size >= 1,
// proof of following: every v5 epoch's leaves came from another state root (the refresh per window)
a_v5_epoch_per_window_refresh: idRows.filter(r => r.state_root != null).length >= 2 && new Set(idRows.filter(r => r.state_root != null).map(r => r.state_root)).size === idRows.filter(r => r.state_root != null).length,
stateless_node_mines_nothing_after_the_flip: !statelessNode || (statelessAcceptedAfterFlip === 0 && statelessRefusals > 0),
stateless_node_stops_at_the_flip: !statelessNode || (counts[statelessNode.i] <= before.length && counts[statelessNode.i] >= before.length - 5),
stale_miner_falls_off_at_the_first_refresh: STALE == null || (staleAcceptedAfterRefresh === 0 && staleRejected > 0),
};
} else if (EXPECT === 'no-flip') {
@ -348,8 +358,9 @@ if (EXPECT === 'flip') {
no_signal_line_on_any_node: signalLines.every(l => l == null),
floor_line_names_the_floor_epoch: floorLines.every(l => l && l.includes(`the floor at epoch ${FLOOR_EPOCH} `)),
blocks_on_both_sides: before.length > 0 && after.length > 0,
v5_ids_equal_the_cli_v5_id: idRows.length > 0 && idRows.every(r => r.cli_v5 != null && r.cli_v5 === r.miners_id && r.miners === 3),
v5_ids_equal_the_cli_v5_id: idRows.filter(r => r.state_root != null).length >= 2 && idRows.filter(r => r.state_root != null).every(r => r.cli_v5 != null && r.cli_v5 === r.miners_id && r.miners === 3),
stateless_node_mines_nothing_after_the_flip: !statelessNode || (statelessAcceptedAfterFlip === 0 && statelessRefusals > 0),
stateless_node_stops_at_the_flip: !statelessNode || (counts[statelessNode.i] <= before.length && counts[statelessNode.i] >= before.length - 5),
};
}
const pass = Object.values(checks).every(Boolean);