Merge master 1dd05f020 into class-v6-family-gate under the master-landing lock

This commit is contained in:
igneum-labs 2026-10-08 20:20:04 +00:00
commit cd4a58d4cf
16 changed files with 3202 additions and 174 deletions

View file

@ -0,0 +1,11 @@
{
"what": "The class v5 pairing rule's fixed attempt-3 seed (8 October 2026, 14:1x UK): the 0.3.25 pin d5b68fae's FAIL seed from the cross harness run cross-0325-d5b68fae, epoch 9 of that run, whose draw lands at attempt 3 under the freeze's rule. Every harness run reads it through the pair's engine path (kaspa-pow program-id) and the run's CLI (igneum-pow show) and compares attempt and id; a difference is FAILED CHECK attempt_3_seed_reads_equal.",
"epoch_hex": "ec0a8cf9e1c6874fc3bc7f9e5a2d8113f2b2353fced8bf293e9d451a48d68212",
"era_hex": "234e082d653dc69db36d875b256d0f5f4a123b353d6aa069c3c7aa9aa6c46062",
"day": 1244071,
"genesis_day": 1243740,
"genesis_log2": 28,
"state_file": "state.igsd1",
"state_root": "3046a7c17feb51c91b30f29d26e1b0de1",
"expected": { "class": "v5", "attempt": 3, "id": "1f1cf82877f46ee6", "read_by": "igneum-pow at exactly 1c420786 and kaspa-pow program-id on class-v5-node f912e614, build-1, 14:07 UK" }
}

View file

@ -0,0 +1,381 @@
{
"attempt_3_seed": {
"seed": "ec0a8cf9e1c6874f",
"expected": {
"class": "v5",
"attempt": 3,
"id": "1f1cf82877f46ee6",
"read_by": "igneum-pow at exactly 1c420786 and kaspa-pow program-id on class-v5-node f912e614, build-1, 14:07 UK"
},
"cli": {
"attempt": 3,
"id": "1f1cf82877f46ee6"
},
"engine": {
"attempt": 3,
"id": "1f1cf82877f46ee6",
"binary": "/srv/builds/igneum-wt-class-v5/vendor/igneum-node-class-v5/target/release/program-id"
},
"engine_refusal": null,
"equal": true
},
"pass": true,
"expect": "no-flip",
"signals": [
6,
6,
7
],
"checks": {
"zero_rejected_by_miners": true,
"zero_rejected_by_nodes": true,
"sinks_agree": true,
"block_counts_agree": true,
"miners_agree_on_every_program": true,
"window_line_on_every_node": true,
"every_node_signals_its_byte": true,
"chain_carries_the_bytes": true,
"state_roots_agree_across_nodes": true,
"template_never_v5": true,
"no_signal_line_on_any_node": true,
"ran_the_epochs": true,
"v4_programs_seen": true,
"signal_share_under_threshold_on_chain_or_the_object_off": true,
"attempt_3_seed_reads_equal": true
},
"window": 60,
"windows": 7,
"floor": 100000,
"v4_floor": 120,
"v3_activation": 60,
"epoch_blocks": 60,
"lead": 10,
"first_full_window_epoch": 8,
"floor_epoch": 1667,
"stale_miner": null,
"stale_accepted_after_first_refresh": null,
"honest_accepted_after_flip": [
0,
0,
0
],
"stale_rejected": null,
"stateless_node": 3,
"stateless_accepted_after_flip": 0,
"stateless_refusal_lines": 0,
"state_roots_at_flip": [],
"streams": {},
"days_seen": [
1244073
],
"day_boundary_crossed": false,
"node": "/srv/artefacts/0325-6ccaf9e9/node-lane/igneumd",
"miner": "/srv/artefacts/0325-6ccaf9e9/node-lane/igneum-miner",
"template_switch": null,
"run_ended_at_s": 195,
"final_daa": 180,
"max_epoch_seen": 3,
"epochs": {
"0": {
"class": 2,
"firstSeenDaa": 0,
"at": 5.9,
"eraSeed": "234e082d653dc69db36d875b256d0f5f4a123b353d6aa069c3c7aa9aa6c46062",
"bps": 0,
"bps5": 0,
"signal_epoch": null,
"day": 1244073
},
"1": {
"class": 3,
"firstSeenDaa": 60,
"at": 33.9,
"eraSeed": "234e082d653dc69db36d875b256d0f5f4a123b353d6aa069c3c7aa9aa6c46062",
"bps": 5111,
"bps5": 4888,
"signal_epoch": null,
"day": 1244073
},
"2": {
"class": 4,
"firstSeenDaa": 120,
"at": 141,
"eraSeed": "234e082d653dc69db36d875b256d0f5f4a123b353d6aa069c3c7aa9aa6c46062",
"bps": 4500,
"bps5": 5500,
"signal_epoch": null,
"day": 1244073
},
"3": {
"class": 4,
"firstSeenDaa": 180,
"at": 195,
"eraSeed": "234e082d653dc69db36d875b256d0f5f4a123b353d6aa069c3c7aa9aa6c46062",
"bps": 4500,
"bps5": 5500,
"signal_epoch": null,
"day": 1244073
}
},
"blocks": {
"total": 181,
"before_boundary": 181,
"after_boundary": 0,
"version_bytes": {
"0": 1,
"6": 95,
"7": 85
},
"signal_share_bps_on_chain": 5249
},
"programs": [
{
"epoch": 0,
"class": "v2",
"program_id": "8f8806638d59850f",
"seed": "234e082d653dc69d",
"miners": 4,
"disagree": false
},
{
"epoch": 1,
"class": "v3",
"program_id": "0387598d54486141",
"seed": "0ae69e83fe335830",
"miners": 4,
"disagree": false
},
{
"epoch": 2,
"class": "v4",
"program_id": "b1a3de278844ed23",
"seed": "ce2f8891e7887337",
"miners": 4,
"disagree": false
}
],
"program_id_rows": [],
"accepted_per_miner": [
45,
50,
51,
34
],
"rejected_by_miners": [
0,
0,
0,
0
],
"rejected_by_nodes": [
0,
0,
0
],
"sinks": [
"5bb8ff5febfb6d68",
"5bb8ff5febfb6d68",
"5bb8ff5febfb6d68",
"5bb8ff5febfb6d68"
],
"block_counts": [
180,
180,
180,
180
],
"signal_lines": [
null,
null,
null
],
"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, 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": [
{
"t": 5.9,
"daa": 0,
"epoch": 0,
"class": 2,
"bps": 0,
"bps5": 0,
"nodes": [
"0/234e082d",
"0/234e082d",
"0/234e082d",
"0/234e082d"
]
},
{
"t": 20.9,
"daa": 31,
"epoch": 0,
"class": 2,
"bps": 5000,
"bps5": 5000,
"nodes": [
"31/481eb180",
"31/481eb180",
"31/481eb180",
"31/481eb180"
]
},
{
"t": 35.9,
"daa": 61,
"epoch": 1,
"class": 3,
"bps": 5111,
"bps5": 4888,
"nodes": [
"61/e14a1e5c",
"60/7b41a4a8",
"60/7b41a4a8",
"61/e14a1e5c"
]
},
{
"t": 50.9,
"daa": 63,
"epoch": 1,
"class": 3,
"bps": 5166,
"bps5": 4833,
"nodes": [
"63/b476ae5b",
"63/b476ae5b",
"63/b476ae5b",
"63/b476ae5b"
]
},
{
"t": 65.9,
"daa": 66,
"epoch": 1,
"class": 3,
"bps": 5166,
"bps5": 4833,
"nodes": [
"66/33e621e7",
"66/33e621e7",
"66/33e621e7",
"66/33e621e7"
]
},
{
"t": 81,
"daa": 69,
"epoch": 1,
"class": 3,
"bps": 5000,
"bps5": 5000,
"nodes": [
"69/79ccfaa3",
"69/79ccfaa3",
"69/79ccfaa3",
"69/79ccfaa3"
]
},
{
"t": 96,
"daa": 73,
"epoch": 1,
"class": 3,
"bps": 5000,
"bps5": 5000,
"nodes": [
"73/e5dab553",
"73/e5dab553",
"73/e5dab553",
"73/e5dab553"
]
},
{
"t": 111,
"daa": 78,
"epoch": 1,
"class": 3,
"bps": 5166,
"bps5": 4833,
"nodes": [
"78/2e9fd6f8",
"78/2e9fd6f8",
"78/2e9fd6f8",
"78/2e9fd6f8"
]
},
{
"t": 126,
"daa": 98,
"epoch": 1,
"class": 3,
"bps": 4833,
"bps5": 5166,
"nodes": [
"98/e1b2aa1f",
"98/e1b2aa1f",
"98/e1b2aa1f",
"98/e1b2aa1f"
]
},
{
"t": 141,
"daa": 120,
"epoch": 2,
"class": 4,
"bps": 4500,
"bps5": 5500,
"nodes": [
"120/a4e0b591",
"120/a4e0b591",
"120/a4e0b591",
"120/a4e0b591"
]
},
{
"t": 156,
"daa": 136,
"epoch": 2,
"class": 4,
"bps": 4500,
"bps5": 5500,
"nodes": [
"136/d00c2fca",
"136/d00c2fca",
"136/d00c2fca",
"136/d00c2fca"
]
},
{
"t": 171,
"daa": 151,
"epoch": 2,
"class": 4,
"bps": 4500,
"bps5": 5500,
"nodes": [
"151/5e0379d8",
"151/5e0379d8",
"151/5e0379d8",
"151/5e0379d8"
]
},
{
"t": 186,
"daa": 171,
"epoch": 2,
"class": 4,
"bps": 4500,
"bps5": 5500,
"nodes": [
"171/997b824e",
"171/997b824e",
"171/997b824e",
"171/997b824e"
]
}
]
}

View file

@ -0,0 +1,30 @@
13:12:41.745 signals 6/6/7, 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 200 s or 3 epochs
13:12:42.977 n0 up pid 3807653 json 31202 p2p 31201 exec 31203, signals 6
13:12:44.184 n1 up pid 3808329 json 31212 p2p 31211 exec 31213, signals 6
13:12:45.393 n2 up pid 3808893 json 31222 p2p 31221 exec 31223, signals 7
13:12:46.600 n3 up pid 3809441 json 31232 p2p 31231 exec disabled, signals 7
13:12:46.601 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
13:12:46.601 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
13:12:46.601 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 7
13:12:46.601 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 7
13:12:46.602 n0 digest: 1787ce0fd511a452
13:12:47.614 epoch -1 -> 0 at daa 0, 5.9 s: template class 2, next 2, day 1244073, signal share at the sink v4 0 v5 0 bps (window 60, this node signals 6, v5 decided by signal at epoch none)
13:12:47.616 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
13:13:02.635 t=20.9 s daa 31 epoch 0 class 2 signal v4 5000 v5 5000 bps blocks/sink per node 31/481eb180 31/481eb180 31/481eb180 31/481eb180
13:13:15.645 epoch 0 -> 1 at daa 60, 33.9 s: template class 3, next 3, day 1244073, signal share at the sink v4 5111 v5 4888 bps (window 60, this node signals 6, v5 decided by signal at epoch none)
13:13:17.648 t=35.9 s daa 61 epoch 1 class 3 signal v4 5111 v5 4888 bps blocks/sink per node 61/e14a1e5c 60/7b41a4a8 60/7b41a4a8 61/e14a1e5c
13:13:32.663 t=50.9 s daa 63 epoch 1 class 3 signal v4 5166 v5 4833 bps blocks/sink per node 63/b476ae5b 63/b476ae5b 63/b476ae5b 63/b476ae5b
13:13:47.679 t=65.9 s daa 66 epoch 1 class 3 signal v4 5166 v5 4833 bps blocks/sink per node 66/33e621e7 66/33e621e7 66/33e621e7 66/33e621e7
13:14:02.696 t=81.0 s daa 69 epoch 1 class 3 signal v4 5000 v5 5000 bps blocks/sink per node 69/79ccfaa3 69/79ccfaa3 69/79ccfaa3 69/79ccfaa3
13:14:17.710 t=96.0 s daa 73 epoch 1 class 3 signal v4 5000 v5 5000 bps blocks/sink per node 73/e5dab553 73/e5dab553 73/e5dab553 73/e5dab553
13:14:32.725 t=111.0 s daa 78 epoch 1 class 3 signal v4 5166 v5 4833 bps blocks/sink per node 78/2e9fd6f8 78/2e9fd6f8 78/2e9fd6f8 78/2e9fd6f8
13:14:47.736 t=126.0 s daa 98 epoch 1 class 3 signal v4 4833 v5 5166 bps blocks/sink per node 98/e1b2aa1f 98/e1b2aa1f 98/e1b2aa1f 98/e1b2aa1f
13:15:02.743 epoch 1 -> 2 at daa 120, 141.0 s: template class 4, next 4, day 1244073, signal share at the sink v4 4500 v5 5500 bps (window 60, this node signals 6, v5 decided by signal at epoch none)
13:15:02.744 t=141.0 s daa 120 epoch 2 class 4 signal v4 4500 v5 5500 bps blocks/sink per node 120/a4e0b591 120/a4e0b591 120/a4e0b591 120/a4e0b591
13:15:17.753 t=156.0 s daa 136 epoch 2 class 4 signal v4 4500 v5 5500 bps blocks/sink per node 136/d00c2fca 136/d00c2fca 136/d00c2fca 136/d00c2fca
13:15:32.768 t=171.0 s daa 151 epoch 2 class 4 signal v4 4500 v5 5500 bps blocks/sink per node 151/5e0379d8 151/5e0379d8 151/5e0379d8 151/5e0379d8
13:15:47.781 t=186.0 s daa 171 epoch 2 class 4 signal v4 4500 v5 5500 bps blocks/sink per node 171/997b824e 171/997b824e 171/997b824e 171/997b824e
13:15:56.790 epoch 2 -> 3 at daa 180, 195.0 s: template class 4, next 4, day 1244073, signal share at the sink v4 4500 v5 5500 bps (window 60, this node signals 6, v5 decided by signal at epoch none)
13:16:09.441 ATTEMPT-3 SEED ec0a8cf9e1c6874f: cli attempt 3 id 1f1cf82877f46ee6 | engine attempt 3 id 1f1cf82877f46ee6 | expected attempt 3 id 1f1cf82877f46ee6 | EQUAL
13:16:09.442 SUMMARY PASS (expect no-flip, signals 6/6/7, stale none): no v5 epoch; epochs seen e0:2:0bps:d1244073 e1:3:4888bps:d1244073 e2:4:5500bps:d1244073 e3:4:5500bps:d1244073; chain bytes {"0":1,"6":95,"7":85} (5249 bps at byte 6); blocks 181 / 0; rejected miners 0/0/0/0 nodes 0/0/0; sinks 5bb8ff5febfb6d68 5bb8ff5febfb6d68 5bb8ff5febfb6d68 5bb8ff5febfb6d68 (agree); counts 180/180/180/180; signal lines 0/3 (epochs //, shares //); 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 n/a rejected n/a; days 1244073
13:16:09.442 summary: /tmp/igneum-fast-time-v5s-attempt3-check/summary.json

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,73 @@
12:44:03.636 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 none; stateless node n3; 60 DAA per epoch, lead 10; run 780 s or 11 epochs
12:44:04.868 n0 up pid 3379053 json 31002 p2p 31001 exec 31003, signals 6
12:44:06.073 n1 up pid 3380107 json 31012 p2p 31011 exec 31013, signals 6
12:44:07.279 n2 up pid 3381311 json 31022 p2p 31021 exec 31023, signals 6
12:44:08.485 n3 up pid 3382272 json 31032 p2p 31031 exec disabled, signals 6
12:44:08.485 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
12:44:08.486 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
12:44:08.486 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
12:44:08.486 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
12:44:08.486 n0 digest: 1787ce0fd511a452
12:44:09.496 epoch -1 -> 0 at daa 0, 5.9 s: template class 2, next 2, day 1244071, signal share at the sink v4 0 v5 0 bps (window 60, this node signals 6, v5 decided by signal at epoch none)
12:44:09.497 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:44:24.519 t=20.9 s daa 33 epoch 0 class 2 signal v4 0 v5 10000 bps blocks/sink per node 33/d2ef461a 33/d2ef461a 33/d2ef461a 33/d2ef461a
12:44:39.531 t=35.9 s daa 58 epoch 0 class 2 signal v4 0 v5 10000 bps blocks/sink per node 58/2e29fe31 58/2e29fe31 58/2e29fe31 58/2e29fe31
12:44:42.533 epoch 0 -> 1 at daa 60, 38.9 s: template class 3, next 3, day 1244071, signal share at the sink v4 0 v5 10000 bps (window 60, this node signals 6, v5 decided by signal at epoch none)
12:44:54.541 t=50.9 s daa 62 epoch 1 class 3 signal v4 0 v5 10000 bps blocks/sink per node 62/83a755d7 62/83a755d7 62/83a755d7 62/83a755d7
12:45:09.554 t=65.9 s daa 68 epoch 1 class 3 signal v4 0 v5 10000 bps blocks/sink per node 68/7964dbe5 68/7964dbe5 68/7964dbe5 68/7964dbe5
12:45:24.567 t=80.9 s daa 73 epoch 1 class 3 signal v4 0 v5 10000 bps blocks/sink per node 73/560e2760 73/560e2760 73/560e2760 73/560e2760
12:45:39.579 t=95.9 s daa 84 epoch 1 class 3 signal v4 0 v5 10000 bps blocks/sink per node 84/5e750e48 84/5e750e48 84/5e750e48 84/5e750e48
12:45:54.598 t=111.0 s daa 95 epoch 1 class 3 signal v4 0 v5 10000 bps blocks/sink per node 95/0989a9b9 95/0989a9b9 95/0989a9b9 95/0989a9b9
12:46:09.601 t=126.0 s daa 102 epoch 1 class 3 signal v4 0 v5 10000 bps blocks/sink per node 102/ed1daeac 102/ed1daeac 102/ed1daeac 102/ed1daeac
12:46:24.611 epoch 1 -> 2 at daa 120, 141.0 s: template class 4, next 4, day 1244071, signal share at the sink v4 0 v5 10000 bps (window 60, this node signals 6, v5 decided by signal at epoch none)
12:46:24.612 t=141.0 s daa 120 epoch 2 class 4 signal v4 0 v5 10000 bps blocks/sink per node 120/7c2399bf 120/7c2399bf 120/7c2399bf 120/7c2399bf
12:46:39.619 t=156.0 s daa 133 epoch 2 class 4 signal v4 0 v5 10000 bps blocks/sink per node 133/04564122 133/04564122 133/04564122 133/04564122
12:46:54.631 t=171.0 s daa 142 epoch 2 class 4 signal v4 0 v5 10000 bps blocks/sink per node 142/30bf7f8c 142/30bf7f8c 142/30bf7f8c 142/30bf7f8c
12:47:09.643 t=186.0 s daa 157 epoch 2 class 4 signal v4 0 v5 10000 bps blocks/sink per node 157/3c10f05c 157/3c10f05c 157/3c10f05c 157/3c10f05c
12:47:24.664 t=201.0 s daa 177 epoch 2 class 4 signal v4 0 v5 10000 bps blocks/sink per node 177/9ae20407 177/9ae20407 177/9ae20407 177/9ae20407
12:47:26.666 epoch 2 -> 3 at daa 180, 203.0 s: template class 4, next 4, day 1244071, signal share at the sink v4 0 v5 10000 bps (window 60, this node signals 6, v5 decided by signal at epoch none)
12:47:39.674 t=216.0 s daa 200 epoch 3 class 4 signal v4 0 v5 10000 bps blocks/sink per node 200/d7082e36 200/d7082e36 200/d7082e36 200/d7082e36
12:47:54.682 t=231.0 s daa 216 epoch 3 class 4 signal v4 0 v5 10000 bps blocks/sink per node 216/6cf82f86 216/6cf82f86 216/6cf82f86 216/6cf82f86
12:48:09.690 t=246.1 s daa 228 epoch 3 class 4 signal v4 0 v5 10000 bps blocks/sink per node 228/db9374fd 228/db9374fd 223/b292ba86 228/db9374fd
12:48:24.698 t=261.1 s daa 237 epoch 3 class 4 signal v4 0 v5 10000 bps blocks/sink per node 237/4e1b4f6d 237/4e1b4f6d 237/4e1b4f6d 237/4e1b4f6d
12:48:29.704 epoch 3 -> 4 at daa 240, 266.1 s: template class 4, next 4, day 1244072, signal share at the sink v4 0 v5 10000 bps (window 60, this node signals 6, v5 decided by signal at epoch none)
12:48:39.715 t=276.1 s daa 247 epoch 4 class 4 signal v4 0 v5 10000 bps blocks/sink per node 247/77c117e5 247/77c117e5 247/77c117e5 247/77c117e5
12:48:54.724 t=291.1 s daa 267 epoch 4 class 4 signal v4 0 v5 10000 bps blocks/sink per node 267/0b8d848a 267/0b8d848a 267/0b8d848a 267/0b8d848a
12:49:09.739 t=306.1 s daa 281 epoch 4 class 4 signal v4 0 v5 10000 bps blocks/sink per node 281/3faeb485 281/3faeb485 281/3faeb485 281/3faeb485
12:49:24.744 t=321.1 s daa 297 epoch 4 class 4 signal v4 0 v5 10000 bps blocks/sink per node 297/b65c955c 297/b65c955c 297/b65c955c 297/b65c955c
12:49:31.751 epoch 4 -> 5 at daa 300, 328.1 s: template class 4, next 4, day 1244072, signal share at the sink v4 0 v5 10000 bps (window 60, this node signals 6, v5 decided by signal at epoch none)
12:49:39.758 t=336.1 s daa 303 epoch 5 class 4 signal v4 0 v5 10000 bps blocks/sink per node 303/c52e2404 301/2162668a 301/2162668a 303/c52e2404
12:49:54.776 t=351.1 s daa 325 epoch 5 class 4 signal v4 0 v5 10000 bps blocks/sink per node 325/08c8b9a8 325/08c8b9a8 325/08c8b9a8 325/08c8b9a8
12:50:09.784 t=366.1 s daa 342 epoch 5 class 4 signal v4 0 v5 10000 bps blocks/sink per node 342/3844afe5 342/3844afe5 342/3844afe5 342/3844afe5
12:50:24.794 t=381.2 s daa 358 epoch 5 class 4 signal v4 0 v5 10000 bps blocks/sink per node 358/67f90b83 358/67f90b83 358/67f90b83 358/67f90b83
12:50:26.796 epoch 5 -> 6 at daa 360, 383.2 s: template class 4, next 4, day 1244072, signal share at the sink v4 0 v5 10000 bps (window 60, this node signals 6, v5 decided by signal at epoch none)
12:50:39.807 t=396.2 s daa 374 epoch 6 class 4 signal v4 0 v5 10000 bps blocks/sink per node 374/c9032968 374/c9032968 374/c9032968 374/c9032968
12:50:54.821 t=411.2 s daa 395 epoch 6 class 4 signal v4 0 v5 10000 bps blocks/sink per node 395/5a107825 395/5a107825 395/5a107825 395/5a107825
12:51:09.834 t=426.2 s daa 410 epoch 6 class 4 signal v4 0 v5 10000 bps blocks/sink per node 410/90f8ad0c 410/90f8ad0c 410/90f8ad0c 410/90f8ad0c
12:51:24.841 t=441.2 s daa 417 epoch 6 class 4 signal v4 0 v5 10000 bps blocks/sink per node 417/7b268690 417/7b268690 417/7b268690 417/7b268690
12:51:26.843 epoch 6 -> 7 at daa 420, 443.2 s: template class 4, next 4, day 1244072, signal share at the sink v4 0 v5 10000 bps (window 60, this node signals 6, v5 decided by signal at epoch none)
12:51:39.850 t=456.2 s daa 426 epoch 7 class 4 signal v4 0 v5 10000 bps blocks/sink per node 426/e694ba9b 426/e694ba9b 426/e694ba9b 426/e694ba9b
12:51:54.860 t=471.2 s daa 435 epoch 7 class 4 signal v4 0 v5 10000 bps blocks/sink per node 435/29516f6b 435/29516f6b 435/29516f6b 435/29516f6b
12:52:09.868 t=486.2 s daa 454 epoch 7 class 4 signal v4 0 v5 10000 bps blocks/sink per node 454/984c3920 454/984c3920 454/984c3920 454/984c3920
12:52:24.876 t=501.2 s daa 476 epoch 7 class 4 signal v4 0 v5 10000 bps blocks/sink per node 476/5e094726 476/5e094726 476/5e094726 476/5e094726
12:52:27.879 epoch 7 -> 8 at daa 480, 504.2 s: template class 5, next 5, day 1244072, signal share at the sink v4 0 v5 10000 bps (window 60, this node signals 6, v5 decided by signal at epoch 8)
12:52:27.879 CLASS SWITCH: the template is class v5 from epoch 8 (daa 480) at 504.2 s wall
12:52:39.890 t=516.3 s daa 491 epoch 8 class 5 signal v4 0 v5 10000 bps blocks/sink per node 491/db71df20 491/db71df20 491/db71df20 482/c64efca2
12:52:54.901 t=531.3 s daa 511 epoch 8 class 5 signal v4 0 v5 10000 bps blocks/sink per node 511/7aef33ac 511/7aef33ac 511/7aef33ac 482/c64efca2
12:53:09.916 t=546.3 s daa 526 epoch 8 class 5 signal v4 0 v5 10000 bps blocks/sink per node 526/9eb1279b 526/9eb1279b 526/9eb1279b 482/c64efca2
12:53:22.925 epoch 8 -> 9 at daa 540, 559.3 s: template class 5, next 5, day 1244072, signal share at the sink v4 0 v5 10000 bps (window 60, this node signals 6, v5 decided by signal at epoch none)
12:53:24.926 t=561.3 s daa 540 epoch 9 class 5 signal v4 0 v5 10000 bps blocks/sink per node 540/0405bcdb 540/0405bcdb 540/0405bcdb 482/c64efca2
12:53:39.939 t=576.3 s daa 554 epoch 9 class 5 signal v4 0 v5 10000 bps blocks/sink per node 554/12e89206 554/12e89206 554/12e89206 482/c64efca2
12:53:54.955 t=591.3 s daa 567 epoch 9 class 5 signal v4 0 v5 10000 bps blocks/sink per node 567/92b2ef43 567/92b2ef43 567/92b2ef43 482/c64efca2
12:54:09.970 t=606.3 s daa 582 epoch 9 class 5 signal v4 0 v5 10000 bps blocks/sink per node 582/2eb5622e 582/2eb5622e 582/2eb5622e 482/c64efca2
12:54:23.982 epoch 9 -> 10 at daa 600, 620.3 s: template class 5, next 5, day 1244072, signal share at the sink v4 0 v5 10000 bps (window 60, this node signals 6, v5 decided by signal at epoch none)
12:54:24.984 t=621.3 s daa 600 epoch 10 class 5 signal v4 0 v5 10000 bps blocks/sink per node 600/d429af33 600/d429af33 600/d429af33 482/c64efca2
12:54:39.999 t=636.4 s daa 611 epoch 10 class 5 signal v4 0 v5 10000 bps blocks/sink per node 611/00a09ad3 611/00a09ad3 611/00a09ad3 482/c64efca2
12:54:55.010 t=651.4 s daa 634 epoch 10 class 5 signal v4 0 v5 10000 bps blocks/sink per node 634/7666f2e1 634/7666f2e1 634/7666f2e1 482/c64efca2
12:55:10.023 t=666.4 s daa 649 epoch 10 class 5 signal v4 0 v5 10000 bps blocks/sink per node 649/81f52784 649/81f52784 649/81f52784 482/c64efca2
12:55:19.032 epoch 10 -> 11 at daa 660, 675.4 s: template class 5, next 5, day 1244072, signal share at the sink v4 0 v5 10000 bps (window 60, this node signals 6, v5 decided by signal at epoch none)
12:55:35.454 SUMMARY PASS (expect flip, signals 6/6/6, stale none): v5 from epoch 8 at DAA 480; epochs seen e0:2:0bps:d1244071 e1:3:10000bps:d1244071 e2:4:10000bps:d1244071 e3:4:10000bps:d1244071 e4:4:10000bps:d1244072 e5:4:10000bps:d1244072 e6:4:10000bps:d1244072 e7:4:10000bps:d1244072 e8:5:10000bps:d1244072 e9:5:10000bps:d1244072 e10:5:10000bps:d1244072 e11:5:10000bps:d1244072; chain bytes {"0":1,"6":660} (9985 bps at byte 6); blocks 483 / 178; rejected miners 0/0/0/0 nodes 0/0/0; sinks 07746f278d93a731 07746f278d93a731 07746f278d93a731 c64efca2aff05bb7 (agree); counts 660/660/660/482; signal lines 3/3 (epochs 8/8/8, shares 10000/10000/10000); floor lines 3/3; state roots at the flip 0x1f8c3947c3d6c541 0x1f8c3947c3d6c541 0x1f8c3947c3d6c541; stateless node accepted after the flip 0 (refusal lines 2); stale miner accepted after the first refresh n/a rejected n/a; days 1244071/1244072
12:55:35.454 PROGRAM ID epoch 8 seed 0d678808b643463d: miners 13a54a0dd793ca79 (3 of 3) cli v5 13a54a0dd793ca79 cli v4 1da741ef698a6db4; state root 0x42ab4909a4639b610bc9bb093bf573930d925a3e264254bf0c76dd572bf1b8d2 (17 records)
12:55:35.454 PROGRAM ID epoch 9 seed a171f4772ab723c1: miners d35cd0e9cb186d00 (3 of 3) cli v5 d35cd0e9cb186d00 cli v4 5e498a10ae61d651; state root 0x0c78a7c4d904dbf1ac372b329b426657311d9626daecf517ddc601dc5e701682 (17 records)
12:55:35.454 PROGRAM ID epoch 10 seed bbb07c76c85908d4: miners 6104176723170d72 (3 of 3) cli v5 6104176723170d72 cli v4 afe4d858b51258c7; state root 0x5625c3098db30d8d9cbfa212c38b2065f24fda889ee52799656d79e2564a0396 (17 records)
12:55:35.454 summary: /tmp/igneum-fast-time-v5s-readback-0325/summary.json

File diff suppressed because one or more lines are too long

View file

@ -334,6 +334,14 @@ Rule: a case maps to a cell only where the cell's tests visibly answer it; cover
- ROT-07 Ablate redundant rotation layers: partial: the acceptance-side ablation rows (layer 8 off against the same-crate windowed control: the draw cost, the floors' costs, the hot-set and 1.2x ceiling, the bit-R read; the mixer and shape axes' per-era invisibility and verifier rows), docs/analysis/class-v6/family-gate.md sections 6.4 to 6.12; the adversarial cost and the GPU setup rows per layer are the hash lane's and the adversary lane's
- ROT-08 Pass the no-new-rules counterfactual: partial: the no-rescue control document (38,000 drawn eras of the parameter family through the acceptance, the bound arithmetic on the counts, the honest line of what the gate cannot see), family-gate.md sections 1 to 6; the competitiveness envelope and the economic half are ECO's
### bench:amd-intel-energy
- Command: `the AMD-and-Intel energy lane jobs on the signed-jobs channel: run-ae-pc2-b580-energy-20261008 (PC 2, Arc B580, the class v6 kit worker --memprobe and --bench-pack on hl-v6-foldrw and hl-v6-all, Level Zero energy counter) and run-ae-pc1-7600-energy-20261008 (PC 1, RX 7600, the same with ADLX watts at stock, plimit -30, gmax -500 + plimit -30); scripts in docs/analysis/class-v6/amd-intel-energy/`
- Box class: PC 1 and PC 2 bench (OpenCL)
- Fixtures: F0, F1
- Cases:
- GPU-03 Measure the real 64-register GPU cost: partial: the 64-register window on AMD and Intel, rate per unit of work (RX 7600 0 percent, Arc B580 -0.3 percent, kernel throughput, quiet) with the B580 fingerprints equal on both packs and the offline RDNA allocation (160 VGPRs, no spill); energy owed (the 7600 job queued, the B580 counter unsupported unelevated); team-run, not under the standard's paired protocol or a wall meter
## Automated cases with no harness in the matrix (NOT RUN, the reason)
- GOV-02 Approve thresholds before results: the approval is recorded in the registry's approval field; the automated half (thresholds frozen before any run_status) is the gate rule landing by 21:00

File diff suppressed because it is too large Load diff

View file

@ -34,6 +34,7 @@
import { spawn, spawnSync } from 'node:child_process';
import { mkdirSync, rmSync, writeFileSync, readFileSync, openSync, existsSync } from 'node:fs';
import { dirname } from 'node:path';
import { connectRpc } from '../../tools/finality-attacks/lib/rpc.mjs';
import { devAddress } from '../../tools/harness/lib/address.mjs';
@ -59,6 +60,7 @@ const V3_ACTIVATION = actflag('v3-activation', 60);
const WINDOW = flag('window', 60);
const STALE = sflag('stale') == null ? null : +sflag('stale');
const STATELESS_NODE = !args.includes('--no-stateless-node');
const A3_DIR = `${ROOT}docs/design/class-v5-harness/attempt-3-seed`;
const WINDOWS = 7;
const SIGNAL = (sflag('signal') || '6,6,6').split(',').map(Number);
// since the 0.3.23 node line the bytes are not ordered by class: 7 = class v4 sub-version 3, 6 = class v5 (counted exactly)
@ -74,6 +76,15 @@ for (const b of [IGNEUMD, CPU_MINER]) if (!existsSync(b)) { console.error(`missi
// whose log says a port was in use fails the run at once
const PIDS = `${TMP}/pids`;
try { for (const pid of readFileSync(PIDS, 'utf8').split('\n').map(Number).filter(Boolean)) { try { process.kill(pid, 'SIGKILL'); console.log(`killed survivor pid ${pid} of the previous run`); } catch { } } } catch { }
// `--a3-only [--a3-known-failed]`: the attempt-3 seed read alone, no nodes, seconds (the check's own self-test and a pairing
// read between a pair and a CLI without a run); exit 0 on EQUAL, 1 on DIFFER or unread, and with --a3-known-failed the
// flipped expectation must read DIFFER (exit 0 then, 1 if it reads EQUAL).
if (args.includes('--a3-only')) {
const kf = args.includes('--a3-known-failed');
const row = readAttempt3Seed(kf);
console.log(JSON.stringify(row));
process.exit(kf ? (row.equal ? 1 : 0) : (row.equal ? 0 : 1));
}
rmSync(TMP, { recursive: true, force: true }); mkdirSync(TMP, { recursive: true });
const recordPid = (p) => { try { writeFileSync(PIDS, `${readFileSync(PIDS, 'utf8')}${p.pid}\n`); } catch { writeFileSync(PIDS, `${p.pid}\n`); } };
let baseText = readFileSync(FILE, 'utf8');
@ -429,8 +440,34 @@ if (EXPECT === 'flip') {
stateless_node_stops_at_the_flip: !statelessNode || (counts[statelessNode.i] <= before.length && counts[statelessNode.i] >= before.length - 5),
};
}
// The pairing rule's fixed attempt-3 seed (8 October 2026, 14:1x UK; the 0.3.25 pin d5b68fae's FAIL seed): read on every
// run through the pair's engine path (kaspa-pow `program-id`, beside the node binary or in the fork worktree's target) and
// through the run's CLI (igneum-pow show), attempt and id compared with each other and with the record's expectation.
// A run's own seeds are its block hashes and rarely land at attempt 3, which is where two acceptance rules show; this
// read does not wait for the chain to draw one. An unreadable side is a FAILED CHECK, never a skip.
function readAttempt3Seed(knownFailed = false) {
try {
const j = JSON.parse(readFileSync(`${A3_DIR}/seed.json`, 'utf8'));
// the check's own known-failed shape (--a3-known-failed): the record's expected id with one hex digit flipped must read DIFFER
if (knownFailed) j.expected = { ...j.expected, id: j.expected.id.slice(0, 15) + (j.expected.id.endsWith('0') ? '1' : '0') };
const state = `${A3_DIR}/${j.state_file}`;
const dayHex = Buffer.concat([Buffer.from('igneum-day/'), Buffer.from(BigInt(j.day).toString(16).padStart(16, '0'), 'hex').reverse()]).toString('hex');
const cli = IGNEUM_POW && existsSync(IGNEUM_POW) ? spawnSync(IGNEUM_POW, ['show', '--program-class', 'v5', '--epoch-hex', j.epoch_hex, '--era-hex', j.era_hex, '--day-hex', dayHex, '--state', state], { encoding: 'utf8' }).stdout || '' : '';
const cm = /attempt (\d+) program id ([0-9a-f]{16})/.exec(cli);
const pidBin = [`${dirname(IGNEUMD)}/program-id`, `${ROOT}vendor/igneum-node-class-v5/target/release/program-id`].find(p => existsSync(p));
const eng = pidBin ? spawnSync(pidBin, ['--epoch-hex', j.epoch_hex, '--era-hex', j.era_hex, '--day', String(j.day), '--class', 'v5', '--state', state, '--genesis-day', String(j.genesis_day), '--genesis-log2', String(j.genesis_log2)], { encoding: 'utf8' }) : null;
const em = eng ? /attempt (\d+) id ([0-9a-f]{16})/.exec(eng.stdout || '') : null;
const row = { seed: j.epoch_hex.slice(0, 16), expected: j.expected, cli: cm ? { attempt: +cm[1], id: cm[2] } : null, engine: em ? { attempt: +em[1], id: em[2], binary: pidBin } : null, engine_refusal: eng && !em ? (eng.stderr || '').trim().slice(0, 200) : null };
row.equal = !!(cm && em && cm[1] === em[1] && cm[2] === em[2] && +cm[1] === j.expected.attempt && cm[2] === j.expected.id);
log(`ATTEMPT-3 SEED ${row.seed}: cli ${cm ? `attempt ${cm[1]} id ${cm[2]}` : 'UNREAD'} | engine ${em ? `attempt ${em[1]} id ${em[2]}` : `UNREAD${row.engine_refusal ? ` (${row.engine_refusal})` : pidBin ? '' : ' (no program-id binary)'}`} | expected attempt ${j.expected.attempt} id ${j.expected.id} | ${row.equal ? 'EQUAL' : 'DIFFER'}`);
return row;
} catch (e) { log(`ATTEMPT-3 SEED: ${e.message}`); return { equal: false, error: e.message }; }
}
const a3 = readAttempt3Seed();
checks.attempt_3_seed_reads_equal = !!a3.equal;
const pass = Object.values(checks).every(Boolean);
const summary = {
attempt_3_seed: a3,
pass, expect: EXPECT, signals: SIGNAL, checks, window: WINDOW, windows: WINDOWS, floor: FLOOR ?? 'never', v4_floor: V4_FLOOR ?? 'never', v3_activation: V3_ACTIVATION ?? 'never', epoch_blocks: EPOCH, lead: LEAD, first_full_window_epoch: FIRST_FULL_EPOCH, floor_epoch: FLOOR_EPOCH,
stale_miner: STALE, stale_accepted_after_first_refresh: staleAcceptedAfterRefresh, honest_accepted_after_flip: honestAcceptedAfterFlip, stale_rejected: staleRejected, stateless_node: statelessNode ? statelessNode.i : null, stateless_accepted_after_flip: statelessAcceptedAfterFlip, stateless_refusal_lines: statelessRefusals,
state_roots_at_flip: rootsAtFlip, streams, days_seen: daysSeen, day_boundary_crossed: daysSeen.length > 1,

View file

@ -0,0 +1,15 @@
{
"run_id": "amd-intel-energy-20261008-01",
"manifest_sha": "c245d50b9",
"evidence_dir": "docs/analysis/class-v6/amd-intel-energy",
"cells": [
{
"cell": "bench:amd-intel-energy",
"status": "NOT RUN",
"evidence": "docs/analysis/class-v6/amd-intel-energy.md",
"note": "GPU-03 AMD and Intel cells: the window costs the RX 7600 0 percent and the Arc B580 -0.3 percent of rate per unit of work (measured, kernel throughput, quiet); B580 fingerprints equal on hl-v6-foldrw and hl-v6-all; energy owed (RX 7600 ADLX job queued behind a held PC 1 runner; the B580 Level Zero energy counter unsupported unelevated); RUNNING, not PASS: team-run, no paired 30-minute protocol, no wall meter",
"method": "GPU",
"in_progress": true
}
]
}

View file

@ -574,6 +574,20 @@
"ROT-07": "partial: the acceptance-side ablation rows (layer 8 off against the same-crate windowed control: the draw cost, the floors' costs, the hot-set and 1.2x ceiling, the bit-R read; the mixer and shape axes' per-era invisibility and verifier rows), docs/analysis/class-v6/family-gate.md sections 6.4 to 6.12; the adversarial cost and the GPU setup rows per layer are the hash lane's and the adversary lane's",
"ROT-08": "partial: the no-rescue control document (38,000 drawn eras of the parameter family through the acceptance, the bound arithmetic on the counts, the honest line of what the gate cannot see), family-gate.md sections 1 to 6; the competitiveness envelope and the economic half are ECO's"
}
},
"bench:amd-intel-energy": {
"command": "the AMD-and-Intel energy lane jobs on the signed-jobs channel: run-ae-pc2-b580-energy-20261008 (PC 2, Arc B580, the class v6 kit worker --memprobe and --bench-pack on hl-v6-foldrw and hl-v6-all, Level Zero energy counter) and run-ae-pc1-7600-energy-20261008 (PC 1, RX 7600, the same with ADLX watts at stock, plimit -30, gmax -500 + plimit -30); scripts in docs/analysis/class-v6/amd-intel-energy/",
"box_class": "PC 1 and PC 2 bench (OpenCL)",
"fixtures": [
"F0",
"F1"
],
"cases": [
"GPU-03"
],
"coverage": {
"GPU-03": "partial: the 64-register window on AMD and Intel, rate per unit of work (RX 7600 0 percent, Arc B580 -0.3 percent, kernel throughput, quiet) with the B580 fingerprints equal on both packs and the offline RDNA allocation (160 VGPRs, no spill); energy owed (the 7600 job queued, the B580 counter unsupported unelevated); team-run, not under the standard's paired protocol or a wall meter"
}
}
},
"not_run": {

View file

@ -0,0 +1,27 @@
#!/usr/bin/env bash
# The kit's CPU emulation of the NVRTC worker (the real kernel text on host threads, kits-on-box.sh's emu step lifted) on
# any two packs: pack A is run through --check, pack B is the second namespace the two-pack emulation needs. Prints each
# pack's id and class, then the check line (the dataset self-test, the vector warps, the fingerprint). The class v6 kit's
# known-failed shape (8 October 2026): the plain-address pack and the fold pack of one seed must read two ids and two
# fingerprints. A file run by path on the box, through the pool lease.
# emu-two-packs-box.sh <worktree root on the box> <pack A dir> <pack B dir> [label]
set -uo pipefail
R="$1"; A="$2"; B="$3"; L="${4:-emu-two-packs}"
T=$(mktemp -d /tmp/v6-emu.XXXXXX); E="$T/emu"; mkdir -p "$E"
cd "$R"
for p in "$A" "$B"; do echo "PACK $(basename "$p") id $(grep -oE 'IGNEUM_PROGRAM_ID 0x[0-9a-f]+' "$p/program.h" | head -1 | awk '{print $2}') generator $(grep -oE 'IGNEUM_GENERATOR [0-9]+' "$p/program.h" | awk '{print $2}') class $(grep -oE 'IGNEUM_LOAD_CLASS "[^"]+"' "$p/program.h" | cut -d'"' -f2)"; done
build_and_check() { # <pack dir as A> <pack dir as B> <name>: one emulation build per orientation in its own dir
local ed="$T/emu-$3"; mkdir -p "$ed"
emu_kernel() { { echo '#include <cuda_runtime.h>'; echo '#include <cstdint>'; echo "namespace $2 {"; sed -E 's/([A-Za-z_0-9]+)<<<([^,]+), ([^>]+)>>>\(/emu_launch(\1, \2, \3, /' "$1/$3.cu"; echo "}"; } > "$ed/$3_$2.cpp"; g++ -std=c++17 -O2 -w -I proto-cuda/emu -I "$1" -c "$ed/$3_$2.cpp" -o "$ed/$3_$2.o"; }
emu_kernel "$1" emu_pack_a kernel && emu_kernel "$1" emu_pack_a kernel_bound && emu_kernel "$2" emu_pack_b kernel && emu_kernel "$2" emu_pack_b kernel_bound \
&& g++ -std=c++17 -O2 -w -DIGNEUM_EMU -I proto-cuda/nvrtc -I /usr/local/cuda/include -c proto-cuda/nvrtc/worker.cpp -o "$ed/worker.o" \
&& g++ -std=c++17 -O2 -w -DIGNEUM_EMU -DIGNEUM_EMU_TWO_PACKS -I proto-cuda/nvrtc -I proto-cuda/emu -I /usr/local/cuda/include -c proto-cuda/nvrtc/emu/emu_backend.cpp -o "$ed/emu_backend.o" \
&& g++ -std=c++17 -O2 -w -I proto-cuda/emu -c proto-cuda/emu/shim.cpp -o "$ed/shim.o" \
&& g++ -o "$ed/igneum-worker-cuda-emu" "$ed"/*.o -pthread 2> "$T/emu-build-$3.log" || { echo "FAIL emu build $3"; head -20 "$T/emu-build-$3.log"; return 1; }
/srv/builds/_bin/lease pool 32 --label "$L: $3" --owner class-v5 --class v5 --min 8 -- env IGNEUM_EMU_PACK="$1" IGNEUM_EMU_PACK2="$2" timeout 2400 "$ed/igneum-worker-cuda-emu" --check --pack "$1" > "$T/$3.log" 2>&1
echo "RC $3 $?"
grep -E '^check (PASS|FAIL)|self-test|fingerprint|FAIL|error' "$T/$3.log" | grep -vE "^lease:" | cut -c1-320
}
build_and_check "$A" "$B" "$(basename "$A")"
build_and_check "$B" "$A" "$(basename "$B")"
echo "logs under $T"

28
tools/class-v5/gate-remote.sh Executable file
View file

@ -0,0 +1,28 @@
#!/usr/bin/env bash
# The FULL gate (tools/ci/pre-push.sh with no arguments) over this worktree's tree, run on a build box, never on the Mac (the
# no-Mac-builds rule of 7 October 2026). Shape as kits-remote.sh: the sources sync to the worktree's mirror checkout on the box
# and the gate runs there from the script FILE the commit carries (no inline string). Usage: tools/class-v5/gate-remote.sh [--box N]
# Exit: the gate's own status; the log at /tmp/v5-gate-<stamp>.log on the Mac.
set -euo pipefail
HERE="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
. "$HERE/../../infra/build-server/lib.sh"
BOX=2 # box 2 carries the overlap browser (/srv/builds/_bin/overlap); box 1 does not (the 20:56 UK red)
while [ $# -gt 0 ]; do case "$1" in --box) BOX="$2"; shift 2 ;; *) echo "unknown argument $1" >&2; exit 2 ;; esac; done
export IGNEUM_AGENT="${IGNEUM_AGENT:-v5-gate}"
bs_host "$BOX"
pushd "$HERE/../../igneum-pow" > /dev/null; bs_context; popd > /dev/null
WT="$BS_REMOTE_WT"
STAMP=$(date -u +%Y%m%dT%H%M%SZ)
bs_toolchain_check
bs_sync_sources
bs_log "sources at $WT (commit $BS_SHA on $BS_BRANCH); the full gate on box $BOX"
# ci mode: the box runs the gate as the box runners do (box-locks reads ok with no host file; a browser is found at
# /srv/builds/_bin/overlap); local mode on a box reads two environment reds that are not the tree's (20:56 UK)
CMD="cd '$WT' && IGNEUM_GATE_NO_TITLE=1 bash tools/ci/pre-push.sh ci"
set +e
BR_KIND=gate BR_COMMAND="the full gate (tools/ci/pre-push.sh) over the class-v5 tree" BR_TARGET="x86_64-linux" BR_ARTEFACTS="" \
bs_remote_run "$WT" "$BS_WT class-v5 full gate" "$CMD" 2>&1 | tee "/tmp/v5-gate-$STAMP.log" | grep -E '^( (ok|FAIL|RED)|pre-push gate|FAIL|build-remote: RESULT)'
rc=${PIPESTATUS[0]}
set -e
bs_wt_unlock
[ "$rc" = 0 ] && bs_log "full gate GREEN at $BS_SHA" || bs_die "full gate RED (rc $rc); full log /tmp/v5-gate-$STAMP.log"

View file

@ -10,7 +10,7 @@ mkdir -p "$REMOTE_LOG"
cd "$REMOTE_ROOT"
IGNEUM_V5_BASE="$BASE" IGNEUM_V5_TMP="/tmp/igneum-fast-time-v5s-$CASE" \
IGNEUM_V5_BIN="${IGNEUM_V5_BIN:-$REMOTE_ROOT/vendor/igneum-node-class-v5/target/release}" \
IGNEUM_POW="$REMOTE_ROOT/igneum-pow/target/release/igneum-pow" \
IGNEUM_POW="${IGNEUM_POW_BIN:-$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

View file

@ -28,8 +28,12 @@ echo "harness-remote: case $CASE on $HOST: node $REMOTE_ROOT/infra/fast-time/cla
# 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/"
rsync -a -e "ssh -i $KEY" "$ROOT/tools/class-v5/harness-box.sh" "$HOST:$REMOTE_ROOT/tools/class-v5/"
# the pairing rule's fixed attempt-3 seed (seed.json and its stream) travels with the harness
mkdir -p "$ROOT/docs/design/class-v5-harness/attempt-3-seed"
rsync -a -e "ssh -i $KEY" "$ROOT/docs/design/class-v5-harness/attempt-3-seed/" "$HOST:$REMOTE_ROOT/docs/design/class-v5-harness/attempt-3-seed/"
# the box side is a script run by path (tools/class-v5/harness-box.sh), not an ssh command string
# FORK_BIN=<dir on the box> points the harness at another fork build (the node lane's pair build for a fix not yet on class-v5-node)
ssh -i "$KEY" "$HOST" "IGNEUM_V5_BIN=${FORK_BIN:-} $REMOTE_ROOT/tools/class-v5/harness-box.sh" "$REMOTE_ROOT" "$REMOTE_LOG" "$CASE" "$BASE" $ARGS || true
# POW_BIN=<igneum-pow binary on the box> points the harness's CLI id read at another crate build (the freeze CLI for a pairing read-back)
ssh -i "$KEY" "$HOST" "IGNEUM_V5_BIN=${FORK_BIN:-} IGNEUM_POW_BIN=${POW_BIN:-} $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"
grep -E "SUMMARY|FAILED CHECK|PROGRAM ID|CLASS SWITCH|ATTEMPT-3 SEED" "$OUT/$CASE.log" || tail -20 "$OUT/$CASE.log"