Compare commits

...

44 commits

Author SHA1 Message Date
igneum-labs
259e478b2a adv-accept report: 1738 against the 0.995 floor (refused), gap-hot3 log
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-07 20:39:08 +00:00
igneum-labs
2e48abab54 adv-accept report: ledger of the 21:26 to 21:36 BST clearances and re-queues
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-07 20:38:02 +00:00
igneum-labs
bda21085f3 adv-accept report: the 0.995 floor against eight measured concentrations (five refused, three residuals incl. Devnet 3 epoch 0); logs copied
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-07 20:37:20 +00:00
igneum-labs
6afd2d1c2e adv-accept report: lowest 25 complete (17 beyond, 7 hot sets), a second concentration shape without saturation; logs copied
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-07 20:32:22 +00:00
igneum-labs
a578aa1402 adv-accept: gap tool takes raw hex seeds and a day (--hex epoch:era:label, --day)
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-07 20:30:44 +00:00
igneum-labs
7dfe03d44e adv-accept report: random 20 complete (1 beyond, 0 hot sets), lowest 20 (13 beyond, 4 hot sets incl. 1738)
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-07 20:25:38 +00:00
igneum-labs
db33c70d67 adv-accept report: box-2 queue re-submitted at 21:13 BST
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-07 20:13:35 +00:00
igneum-labs
92212676c3 adv-accept report: two more hot sets (4346, 5245) with attribution; board tally 3 of 33
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-07 20:12:53 +00:00
igneum-labs
c7abf5b621 adv-accept report: where the pass stands at 20:50 BST (29,032 programs, 29 live rows, partials named)
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-07 19:48:37 +00:00
igneum-labs
ce8759bcef adv-accept report: base rate over 29,032 accepted programs; partial live logs copied
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-07 19:46:58 +00:00
igneum-labs
785dafd22b adv-accept report: census seen holding cores on box 2 at 20:44 BST
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-07 19:45:01 +00:00
igneum-labs
552cc38ee1 adv-accept report: build-1 waiters re-submitted under the ranked lease at 32 threads
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-07 19:43:45 +00:00
igneum-labs
473b61b065 adv-accept report: class v5 row relabelled (confirming row for the (c''') floor), gap-rep8 complete, yield and withdrawal on box 2 recorded
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-07 19:42:55 +00:00
igneum-labs
61b0c28483 adv-accept report: the 100767 hot set survives class v5 unchanged (row, log); Q1 board row updated
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-07 19:39:08 +00:00
igneum-labs
4c487c013d adv-accept report: yield test by owner (class-v5, or attack-pass with v5 in the label; never adv-)
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-07 19:32:27 +00:00
igneum-labs
5e36fdd6d8 adv-accept report: yield rule widened to any class-v5 or v5-labelled waiter
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-07 19:31:09 +00:00
igneum-labs
da2dff4ca7 adv-accept report: 20:28 BST pool state (all 15 leases waiting, 0 free cores)
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-07 19:29:02 +00:00
igneum-labs
b15d3ed088 adv-accept report: row 90 queued through the lease at 20:27 BST
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-07 19:27:41 +00:00
igneum-labs
f2c3b21a64 adv-accept report: re-queue through lease pool recorded (order, boxes, times, leases)
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-07 19:26:03 +00:00
igneum-labs
01f8a109fc adv-accept: run-box.sh through lease pool (no sweep.lock); attempts census prints progress
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-07 19:24:45 +00:00
igneum-labs
fde905de46 adv-accept report: final tonight's live rows (12 lowest: 5 beyond; 11 random: 1 beyond), counts corrected
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-07 19:24:00 +00:00
igneum-labs
29b6cb11eb adv-accept report: ledger of the 20:21 BST kill and the re-queue through the lease
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-07 19:22:45 +00:00
igneum-labs
839109598c adv-accept report: widened rows at 21 programs, random base rate 1 of 10 beyond, 256-unit selector weak (5 of 11 false positives)
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-07 19:19:41 +00:00
igneum-labs
0bccf4b83a adv-accept report: where the pass stands (box-hours, bounds reached, blocked, what a longer pass adds)
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-07 19:06:13 +00:00
igneum-labs
bf65cb8a3a adv-accept report: widened live rows, partial: the selector has false positives (2 of the next 3 lowest are within 1.2x)
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-07 19:05:18 +00:00
igneum-labs
840a554a30 adv-accept report: Q2 BOUND over 54 programs (gap-50.log copied)
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-07 19:04:14 +00:00
igneum-labs
ac07f90923 adv-accept: gap tool reports the share of reads on indices read 8 or more times (defender's question); report skeleton for the widened rows and the class-v5 row
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-07 19:00:31 +00:00
igneum-labs
be3f7c4458 adv-accept: class-v5 variant of the live harness (vendored class-v5 igneum-pow, the Devnet 3 v5 pack's state stream); run-box.sh takes the per-box sweep lock; rule change 19:55 BST recorded
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-07 18:57:38 +00:00
igneum-labs
7664cabc7d adv-accept: cryptanalysis reports excluded from the public export (research docs); report clocks in UK time
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-07 18:56:01 +00:00
igneum-labs
a1b2c3e30e adv-accept report: reproducibility block, selector base rate over 16,337 programs, row 90 plant; status board updated
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-07 18:53:52 +00:00
igneum-labs
d01fa093ec adv-accept report: 2^24 confirmations of the four low-ratio seeds; logs copied
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-07 18:50:46 +00:00
igneum-labs
debbc993d4 adv-accept report: Q2 stand-in gap first bound (plant fires, four programs agree to 2e-4)
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-07 18:48:46 +00:00
igneum-labs
67d40c9b97 adv-accept: attempts command (row 90: per-part rejections, cap, last resort, forced-exhaust plant)
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-07 18:47:44 +00:00
igneum-labs
ff81c2dea1 adv-accept report: seed 100767 hot-set finding at 2^24 nonces, bounded; census baseline
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-07 18:45:47 +00:00
igneum-labs
75e8ff24e9 adv-accept: gap tool compile fix (distinct count on a slice)
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-07 18:45:16 +00:00
igneum-labs
e0d9ed9526 adv-accept: first live results (five low-ratio programs, plant and control), logs copied; Q2 gap tool
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-07 18:43:12 +00:00
igneum-labs
fe9dac31e5 adv-accept: logs, pid and result files under /srv/builds/_adv-adv-accept, outside the worktree mirror
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-07 18:39:35 +00:00
igneum-labs
a55de00864 adv-accept: no yield, cores 8-95 at nice 10 (ruling 18:4x UTC); report times in UTC; merge build/master
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-07 18:33:54 +00:00
igneum-labs
0c2108437d Merge remote-tracking branch 'build/master' into adv-accept 2026-10-07 18:33:54 +00:00
igneum-labs
6d2eac61ef adv-accept: re-base onto build/master d21ca54a noted, sharded sweep and live runs recorded
igneum-pow at HEAD is IDENTICAL to the frozen object c3d32437 (and so is build/master's).
Shards 00 (box 2) and 01 (box 1) running under the yield script; shards 02..09 in the shared
queue; the adv-live const-item plant and its control running on box 1.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-07 18:31:21 +00:00
igneum-labs
27ebcca035 Merge remote-tracking branch 'build/master' into adv-accept 2026-10-07 18:28:57 +00:00
igneum-labs
f451be0fba adv-accept: re-scope to the bypass lane, yield run script, sharded sweep, f8 harness as adv-live
Plan section 2.4 records the re-scope (Q1, Q2, Q5 here; Q3 and Q4 to the sibling lanes) and
the operating changes (both boxes, nice 10, the capacity layer's yield, queued sweeps). The
sweep is shardable (--seed-start), writes every row as it lands, counts the Q5 structure
and draws from the F8 label space so the unmodified f8 harness (src/live.rs, built as
adv-live) measures the live hot set of the same program. Devnet 3 epoch-0 program.json
copied read-only as an input.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-07 18:28:19 +00:00
igneum-labs
8423de3eb9 adv-accept: harness, run script and report skeleton
The adv-accept harness crate (draw-path check, accepted-program sweep over class v4,
closed-form distinct and per-site ratio, plant hooks), the box-2 run script, and the
Deliverable-2 report with the status board. Draw path validated (shared devnet epoch-0
id a785001687d8688a). The plant fires on (a'). The 10k-seed sweep is running on box 2.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-07 18:14:37 +00:00
igneum-labs
abb6d51cca adv-accept: attack plan for the acceptance rule, crate pinned to the frozen commit
Deliverable 1 of the internal adversarial pass on the program acceptance rule and
its generator (class v4 sub-version 3, frozen commit c3d32437).

build/master's igneum-pow/ is NOT byte-identical to the frozen commit (6 files, 635
deletions: master stripped the v4 sub-version-3 code). To obey the outsider rule this
worktree's igneum-pow/ and proto-cuda/packs-ca3-v4/ are reset to the frozen commit, so
every build and run in this pass is against the frozen rule.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-07 18:06:04 +00:00
60 changed files with 24697 additions and 0 deletions

View file

@ -0,0 +1,10 @@
adv-accept attempts: seeds 2..5 (3), 3 threads, cap 256, force-exhaust true
seed 2: EXHAUSTED at cap 8; last resort id e3f47f1ab9d3c562 attempt 8 op mix xor=19 load=16 add=7 rotl=7 mad=5 rotr=5 shfl=4 sub=1 shadow mix xor=90 add=46 mad=29 shfl=28 rotl=24 sub=20 rotr=19; rule verdict on it Ok("accept distinct_mean 128.000 sat 0 bias 63"); structure lossy_last 0 or 0 mul 0 mulhi 0 regs 8
seed 4: EXHAUSTED at cap 8; last resort id 592875c46032e6ad attempt 8 op mix xor=17 load=16 sub=9 shfl=6 add=5 rotl=4 rotr=4 mad=3 shadow mix xor=93 add=37 shfl=35 mad=28 rotr=22 rotl=21 sub=20; rule verdict on it Ok("accept distinct_mean 127.864 sat 0 bias 58"); structure lossy_last 0 or 0 mul 0 mulhi 0 regs 8
seed 3: EXHAUSTED at cap 8; last resort id 579a85a94f80826b attempt 8 op mix xor=17 load=16 rotl=10 shfl=7 add=6 mad=6 rotr=2 shadow mix xor=93 add=40 mad=31 shfl=26 rotl=23 sub=23 rotr=20; rule verdict on it Ok("accept distinct_mean 128.000 sat 0 bias 66"); structure lossy_last 0 or 0 mul 0 mulhi 0 regs 8
attempts: 3 seeds in 116 s; 17 rejected candidates, 0 accepted, 3 exhausted (cap 256)
rejection by part over all candidates: (a) stale=3 (17.6%) (b) no-inject=1 (5.9%) (a') unfresh=13 (76.5%) (c) const-bit=0 (0.0%) (c) lane-const=0 (0.0%) (c) saturated=0 (0.0%) (c') sat-source=0 (0.0%) (c'') repeated=0 (0.0%) (c'') low-entropy=0 (0.0%) (c) bias=0 (0.0%) (c) distinct=0 (0.0%)
accepted-attempt histogram 0..0: [0]
attempt 0: 2 candidates, rejected 2 (100.0%): (a) stale=1 (b) no-inject=1
mean accepted attempt 0.000; per-candidate rejection probability 1.0000; P(256 consecutive rejections) if independent = 1.000e0
attempts DONE

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,92 @@
gap: seed 100767
gap: program id 9d68e6286fc817d4 attempt 2 class mx8-era763e5847+sh256x27 day 20730 (cache filled in 0.6 s) plant zero-dataset false
gap: mirror validated against hash_warp on 8 units (closed form and live)
gap: closed-form per-site distinct counts equal the library's distinct_indices_v4 on 4096 units
gap: (c) metrics on 64 units: closed distinct_mean 127.714 saturated 0 bias_max 82; live distinct_mean 127.730 saturated 1 bias_max 53
gap: site 0 closed ratio 0.9997 (1044181) live ratio 0.9999 (1044337) diff -0.0001
gap: site 1 closed ratio 0.9998 (1046291) live ratio 0.9997 (1046234) diff +0.0001
gap: site 2 closed ratio 0.9999 (1040272) live ratio 0.9998 (1040205) diff +0.0001
gap: site 3 closed ratio 0.9997 (1046208) live ratio 0.9998 (1046357) diff -0.0001
gap: site 4 closed ratio 0.9998 (1044272) live ratio 0.9999 (1044371) diff -0.0001
gap: site 5 closed ratio 0.9998 (1044269) live ratio 0.9999 (1044334) diff -0.0001
gap: site 6 closed ratio 0.9919 (1031917) live ratio 0.9920 (1032049) diff -0.0001
gap: site 7 closed ratio 0.9997 (1040121) live ratio 0.9998 (1040139) diff -0.0000
gap: site 8 closed ratio 0.9999 (1044334) live ratio 0.9998 (1044277) diff +0.0001
gap: site 9 closed ratio 0.9997 (1044213) live ratio 0.9997 (1044176) diff +0.0000
gap: site 10 closed ratio 0.9998 (1046311) live ratio 0.9998 (1046304) diff +0.0000
gap: site 11 closed ratio 0.9998 (1044255) live ratio 0.9998 (1044247) diff +0.0000
gap: site 12 closed ratio 1.0000 (1040348) live ratio 0.9998 (1040163) diff +0.0002
gap: site 13 closed ratio 0.9998 (1046273) live ratio 0.9998 (1046309) diff -0.0000
gap: site 14 closed ratio 0.9997 (1046243) live ratio 0.9998 (1046302) diff -0.0001
gap: site 15 closed ratio 0.9997 (1044149) live ratio 0.9998 (1044287) diff -0.0001
gap: min ratio closed 0.9919 live 0.9920; largest site gap +0.0002 at site 12; verdict under the 0.98 floor: closed accept live accept; 9.7 s
gap DONE 9d68e6286fc817d4
gap: seed 2
gap: program id 8a0047b2eb071ade attempt 5 class mx8-era35d128b9+sh256x27 day 20730 (cache filled in 0.7 s) plant zero-dataset false
gap: mirror validated against hash_warp on 8 units (closed form and live)
gap: closed-form per-site distinct counts equal the library's distinct_indices_v4 on 4096 units
gap: (c) metrics on 64 units: closed distinct_mean 128.000 saturated 1 bias_max 56; live distinct_mean 128.000 saturated 0 bias_max 57
gap: site 0 closed ratio 1.0000 (1040416) live ratio 1.0002 (1040607) diff -0.0002
gap: site 1 closed ratio 0.9999 (1046463) live ratio 1.0000 (1046575) diff -0.0001
gap: site 2 closed ratio 1.0000 (1046531) live ratio 1.0001 (1046645) diff -0.0001
gap: site 3 closed ratio 1.0000 (1046511) live ratio 1.0001 (1046596) diff -0.0001
gap: site 4 closed ratio 1.0001 (1040437) live ratio 0.9999 (1040329) diff +0.0001
gap: site 5 closed ratio 1.0000 (1044493) live ratio 1.0001 (1044597) diff -0.0001
gap: site 6 closed ratio 1.0002 (1040579) live ratio 1.0001 (1040442) diff +0.0001
gap: site 7 closed ratio 1.0000 (1044480) live ratio 1.0000 (1044495) diff -0.0000
gap: site 8 closed ratio 1.0000 (1046508) live ratio 1.0000 (1046511) diff -0.0000
gap: site 9 closed ratio 1.0001 (1044535) live ratio 1.0000 (1044429) diff +0.0001
gap: site 10 closed ratio 0.9999 (1040317) live ratio 1.0001 (1040530) diff -0.0002
gap: site 11 closed ratio 1.0000 (1044517) live ratio 1.0001 (1044565) diff -0.0000
gap: site 12 closed ratio 1.0001 (1040488) live ratio 0.9999 (1040310) diff +0.0002
gap: site 13 closed ratio 1.0000 (1046549) live ratio 1.0000 (1046580) diff -0.0000
gap: site 14 closed ratio 1.0000 (1046487) live ratio 1.0000 (1046488) diff -0.0000
gap: site 15 closed ratio 0.9999 (1040327) live ratio 1.0002 (1040548) diff -0.0002
gap: min ratio closed 0.9999 live 0.9999; largest site gap -0.0002 at site 15; verdict under the 0.98 floor: closed accept live accept; 10.1 s
gap DONE 8a0047b2eb071ade
gap: seed 100211
gap: program id d07885a437e237c7 attempt 0 class mx8-eraa8bce51f+sh256x27 day 20730 (cache filled in 0.6 s) plant zero-dataset false
gap: mirror validated against hash_warp on 8 units (closed form and live)
gap: closed-form per-site distinct counts equal the library's distinct_indices_v4 on 4096 units
gap: (c) metrics on 64 units: closed distinct_mean 128.000 saturated 0 bias_max 61; live distinct_mean 128.000 saturated 0 bias_max 57
gap: site 0 closed ratio 1.0001 (1044569) live ratio 1.0000 (1044436) diff +0.0001
gap: site 1 closed ratio 1.0001 (1044548) live ratio 0.9999 (1044420) diff +0.0001
gap: site 2 closed ratio 1.0001 (1046583) live ratio 1.0000 (1046505) diff +0.0001
gap: site 3 closed ratio 1.0001 (1040470) live ratio 1.0000 (1040420) diff +0.0000
gap: site 4 closed ratio 1.0000 (1040420) live ratio 1.0000 (1040436) diff -0.0000
gap: site 5 closed ratio 1.0000 (1046556) live ratio 1.0000 (1046524) diff +0.0000
gap: site 6 closed ratio 1.0000 (1044469) live ratio 1.0001 (1044551) diff -0.0001
gap: site 7 closed ratio 1.0002 (1040604) live ratio 1.0000 (1040409) diff +0.0002
gap: site 8 closed ratio 1.0000 (1040382) live ratio 1.0001 (1040521) diff -0.0001
gap: site 9 closed ratio 0.9907 (1034720) live ratio 0.9908 (1034913) diff -0.0002
gap: site 10 closed ratio 1.0000 (1046489) live ratio 1.0000 (1046567) diff -0.0001
gap: site 11 closed ratio 1.0000 (1044496) live ratio 1.0001 (1044546) diff -0.0000
gap: site 12 closed ratio 1.0002 (1040563) live ratio 0.9999 (1040306) diff +0.0002
gap: site 13 closed ratio 1.0000 (1046492) live ratio 1.0000 (1046480) diff +0.0000
gap: site 14 closed ratio 1.0001 (1040478) live ratio 1.0000 (1040406) diff +0.0001
gap: site 15 closed ratio 1.0000 (1044498) live ratio 0.9999 (1044420) diff +0.0001
gap: min ratio closed 0.9907 live 0.9908; largest site gap +0.0002 at site 12; verdict under the 0.98 floor: closed accept live accept; 9.9 s
gap DONE d07885a437e237c7
gap: seed 100064
gap: program id 2442abf9d56f6611 attempt 2 class mx8-eraa210d1bd+sh256x27 day 20730 (cache filled in 0.6 s) plant zero-dataset false
gap: mirror validated against hash_warp on 8 units (closed form and live)
gap: closed-form per-site distinct counts equal the library's distinct_indices_v4 on 4096 units
gap: (c) metrics on 64 units: closed distinct_mean 128.000 saturated 11 bias_max 64; live distinct_mean 128.000 saturated 6 bias_max 51
gap: site 0 closed ratio 1.0002 (1044665) live ratio 1.0000 (1044436) diff +0.0002
gap: site 1 closed ratio 1.0000 (1046553) live ratio 1.0000 (1046547) diff +0.0000
gap: site 2 closed ratio 1.0000 (1044482) live ratio 1.0000 (1044529) diff -0.0000
gap: site 3 closed ratio 1.0000 (1044491) live ratio 1.0001 (1044596) diff -0.0001
gap: site 4 closed ratio 1.0000 (1046539) live ratio 1.0000 (1046523) diff +0.0000
gap: site 5 closed ratio 1.0001 (1040513) live ratio 0.9999 (1040282) diff +0.0002
gap: site 6 closed ratio 1.0001 (1046582) live ratio 1.0000 (1046545) diff +0.0000
gap: site 7 closed ratio 1.0000 (1046489) live ratio 1.0001 (1046583) diff -0.0001
gap: site 8 closed ratio 1.0000 (1044497) live ratio 0.9999 (1044335) diff +0.0002
gap: site 9 closed ratio 1.0000 (1046531) live ratio 1.0000 (1046545) diff -0.0000
gap: site 10 closed ratio 1.0000 (1046523) live ratio 1.0000 (1046552) diff -0.0000
gap: site 11 closed ratio 0.9832 (1022918) live ratio 0.9831 (1022831) diff +0.0001
gap: site 12 closed ratio 1.0000 (1044431) live ratio 0.9999 (1044389) diff +0.0000
gap: site 13 closed ratio 1.0000 (1046496) live ratio 1.0000 (1046497) diff -0.0000
gap: site 14 closed ratio 1.0002 (1044658) live ratio 1.0002 (1044663) diff -0.0000
gap: site 15 closed ratio 0.9914 (1035466) live ratio 0.9914 (1035489) diff -0.0000
gap: min ratio closed 0.9832 live 0.9831; largest site gap +0.0002 at site 5; verdict under the 0.98 floor: closed accept live accept; 10.9 s
gap DONE 2442abf9d56f6611

View file

@ -0,0 +1,142 @@
lease: 0 of 4 pool cores free (88 leased); waiting
lease: holding 8 pool cores (42,43,44,45,46,47,48,49, waited 31 s, class adv): adv-accept gap-five-d20730
gap: hex program adv-cache-2-era-fixed-20: epoch bc6ad5ae912e203edbba9f74bc1c2ae35d8670d74a66c3939674366ae28e2746 era edc4fa844da9dc98d37e965176f6558a31560e40502ab3ae5491b21aaaabfb07
gap: program id 11f9f955b21d56c9 attempt 1 class mx8-erad810f22d+sh256x27 day 20730 (cache filled in 0.6 s) plant zero-dataset false
gap: mirror validated against hash_warp on 8 units (closed form and live)
gap: closed-form per-site distinct counts equal the library's distinct_indices_v4 on 4096 units
gap: (c) metrics on 64 units: closed distinct_mean 127.999 saturated 0 bias_max 54; live distinct_mean 128.000 saturated 1 bias_max 57
gap: site 0 closed ratio 1.0000 (1046495) live ratio 1.0001 (1046588) diff -0.0001; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 1 closed ratio 0.9999 (1044385) live ratio 0.9999 (1044399) diff -0.0000; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 2 closed ratio 1.0001 (1040439) live ratio 1.0000 (1040401) diff +0.0000; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 3 closed ratio 1.0000 (1046505) live ratio 1.0000 (1046516) diff -0.0000; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 4 closed ratio 1.0000 (1046571) live ratio 1.0000 (1046501) diff +0.0001; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 5 closed ratio 1.0000 (1046505) live ratio 1.0000 (1046524) diff -0.0000; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 6 closed ratio 0.9999 (1046439) live ratio 1.0000 (1046569) diff -0.0001; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 7 closed ratio 0.9999 (1046459) live ratio 1.0000 (1046498) diff -0.0000; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 8 closed ratio 1.0001 (1044536) live ratio 0.9999 (1044413) diff +0.0001; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 9 closed ratio 1.0000 (1044444) live ratio 0.9999 (1044416) diff +0.0000; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 10 closed ratio 1.0000 (1044519) live ratio 1.0000 (1044453) diff +0.0001; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 11 closed ratio 0.9997 (1046229) live ratio 0.9997 (1046174) diff +0.0001; reads on indices read >= 8 times: closed 0.0008% live 0.0000%
gap: site 12 closed ratio 1.0000 (1046567) live ratio 1.0000 (1046536) diff +0.0000; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 13 closed ratio 1.0000 (1046543) live ratio 1.0000 (1046548) diff -0.0000; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 14 closed ratio 0.9999 (1044374) live ratio 1.0000 (1044433) diff -0.0001; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 15 closed ratio 0.9999 (1044385) live ratio 0.9999 (1044349) diff +0.0000; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: min ratio closed 0.9997 live 0.9997; largest site gap -0.0001 at site 6; verdict under the 0.98 floor: closed accept live accept; 14.1 s
gap DONE 11f9f955b21d56c9
gap: hex program adv-cache-2-era-drawn-2: epoch 348a0e0a344d74eed85878dddbd6008d363188db30d3b1e7335e8588ed694101 era 6469f1b0f5d45ff506504b1fea38093175f651ad082e229b8b76d4f3f6c9af31
gap: program id 7ceb797d31eedb3e attempt 0 class mx8-eracd0def15+sh256x27 day 20730 (cache filled in 0.6 s) plant zero-dataset false
gap: mirror validated against hash_warp on 8 units (closed form and live)
gap: closed-form per-site distinct counts equal the library's distinct_indices_v4 on 4096 units
gap: (c) metrics on 64 units: closed distinct_mean 128.000 saturated 0 bias_max 56; live distinct_mean 128.000 saturated 0 bias_max 50
gap: site 0 closed ratio 1.0000 (1044481) live ratio 1.0001 (1044590) diff -0.0001; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 1 closed ratio 1.0000 (1046558) live ratio 0.9999 (1046461) diff +0.0001; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 2 closed ratio 1.0000 (1044519) live ratio 0.9999 (1044427) diff +0.0001; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 3 closed ratio 1.0001 (1044587) live ratio 1.0001 (1044546) diff +0.0000; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 4 closed ratio 1.0001 (1046586) live ratio 1.0000 (1046527) diff +0.0001; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 5 closed ratio 1.0000 (1040333) live ratio 1.0001 (1040438) diff -0.0001; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 6 closed ratio 1.0000 (1040352) live ratio 1.0000 (1040433) diff -0.0001; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 7 closed ratio 1.0001 (1044534) live ratio 1.0000 (1044526) diff +0.0000; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 8 closed ratio 1.0000 (1044482) live ratio 1.0000 (1044490) diff -0.0000; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 9 closed ratio 0.9998 (1040206) live ratio 1.0002 (1040556) diff -0.0003; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 10 closed ratio 1.0000 (1046517) live ratio 1.0000 (1046476) diff +0.0000; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 11 closed ratio 1.0000 (1046505) live ratio 1.0000 (1046522) diff -0.0000; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 12 closed ratio 1.0000 (1044520) live ratio 1.0000 (1044522) diff -0.0000; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 13 closed ratio 0.9992 (1045687) live ratio 0.9993 (1045757) diff -0.0001; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 14 closed ratio 1.0001 (1040438) live ratio 1.0000 (1040368) diff +0.0001; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 15 closed ratio 1.0001 (1044583) live ratio 1.0000 (1044523) diff +0.0001; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: min ratio closed 0.9992 live 0.9993; largest site gap -0.0003 at site 9; verdict under the 0.98 floor: closed accept live accept; 14.1 s
gap DONE 7ceb797d31eedb3e
gap: seed 4346
gap: program id bbb38e847011c354 attempt 2 class mx8-eraa577896a+sh256x27 day 20730 (cache filled in 0.6 s) plant zero-dataset false
gap: mirror validated against hash_warp on 8 units (closed form and live)
gap: closed-form per-site distinct counts equal the library's distinct_indices_v4 on 4096 units
gap: (c) metrics on 64 units: closed distinct_mean 127.999 saturated 0 bias_max 61; live distinct_mean 127.997 saturated 0 bias_max 53
gap: site 0 closed ratio 0.9997 (1044186) live ratio 0.9996 (1044074) diff +0.0001; reads on indices read >= 8 times: closed 0.0349% live 0.0354%
gap: site 1 closed ratio 1.0000 (1046562) live ratio 1.0000 (1046559) diff +0.0000; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 2 closed ratio 0.9840 (1029769) live ratio 0.9839 (1029638) diff +0.0001; reads on indices read >= 8 times: closed 0.3636% live 0.3881%
gap: site 3 closed ratio 1.0000 (1044459) live ratio 1.0000 (1044480) diff -0.0000; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 4 closed ratio 0.9998 (1044268) live ratio 0.9999 (1044326) diff -0.0001; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 5 closed ratio 1.0001 (1044547) live ratio 1.0001 (1044568) diff -0.0000; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 6 closed ratio 1.0001 (1040464) live ratio 0.9999 (1040326) diff +0.0001; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 7 closed ratio 1.0000 (1046571) live ratio 1.0000 (1046482) diff +0.0001; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 8 closed ratio 0.9981 (1042510) live ratio 0.9982 (1042562) diff -0.0000; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 9 closed ratio 0.9981 (1042465) live ratio 0.9982 (1042603) diff -0.0001; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 10 closed ratio 0.9990 (1045529) live ratio 0.9990 (1045478) diff +0.0000; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 11 closed ratio 1.0000 (1046518) live ratio 1.0000 (1046521) diff -0.0000; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 12 closed ratio 0.9997 (1040086) live ratio 1.0000 (1040385) diff -0.0003; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 13 closed ratio 1.0000 (1046523) live ratio 1.0000 (1046479) diff +0.0000; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 14 closed ratio 1.0000 (1046513) live ratio 0.9999 (1046467) diff +0.0000; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 15 closed ratio 1.0000 (1046568) live ratio 1.0000 (1046529) diff +0.0000; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: min ratio closed 0.9840 live 0.9839; largest site gap -0.0003 at site 12; verdict under the 0.98 floor: closed accept live accept; 13.5 s
gap DONE bbb38e847011c354
gap: seed 5245
gap: program id beaad44840bb9e4e attempt 5 class mx8-erae7b2abfb+sh256x27 day 20730 (cache filled in 0.6 s) plant zero-dataset false
gap: mirror validated against hash_warp on 8 units (closed form and live)
gap: closed-form per-site distinct counts equal the library's distinct_indices_v4 on 4096 units
gap: (c) metrics on 64 units: closed distinct_mean 128.000 saturated 0 bias_max 59; live distinct_mean 128.000 saturated 0 bias_max 59
gap: site 0 closed ratio 1.0001 (1044601) live ratio 1.0001 (1044603) diff -0.0000; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 1 closed ratio 1.0000 (1046564) live ratio 1.0000 (1046555) diff +0.0000; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 2 closed ratio 1.0000 (1046519) live ratio 1.0000 (1046485) diff +0.0000; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 3 closed ratio 1.0001 (1040482) live ratio 1.0002 (1040593) diff -0.0001; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 4 closed ratio 1.0000 (1044483) live ratio 1.0000 (1044453) diff +0.0000; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 5 closed ratio 1.0001 (1046612) live ratio 1.0000 (1046504) diff +0.0001; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 6 closed ratio 0.9999 (1044373) live ratio 1.0001 (1044575) diff -0.0002; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 7 closed ratio 1.0000 (1040430) live ratio 1.0000 (1040353) diff +0.0001; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 8 closed ratio 0.9831 (1022759) live ratio 0.9833 (1023050) diff -0.0003; reads on indices read >= 8 times: closed 0.3495% live 0.3639%
gap: site 9 closed ratio 1.0000 (1040392) live ratio 1.0001 (1040448) diff -0.0001; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 10 closed ratio 1.0000 (1046546) live ratio 0.9999 (1046451) diff +0.0001; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 11 closed ratio 1.0000 (1046545) live ratio 1.0000 (1046528) diff +0.0000; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 12 closed ratio 1.0000 (1046507) live ratio 1.0000 (1046540) diff -0.0000; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 13 closed ratio 1.0001 (1044572) live ratio 1.0000 (1044465) diff +0.0001; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 14 closed ratio 1.0000 (1046491) live ratio 1.0000 (1046484) diff +0.0000; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 15 closed ratio 1.0000 (1040415) live ratio 1.0001 (1040442) diff -0.0000; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: min ratio closed 0.9831 live 0.9833; largest site gap -0.0003 at site 8; verdict under the 0.98 floor: closed accept live accept; 13.6 s
gap DONE beaad44840bb9e4e
gap: seed 106924
gap: program id 8aa3c604dba9d11b attempt 1 class mx8-erac4d89708+sh256x27 day 20730 (cache filled in 0.6 s) plant zero-dataset false
gap: mirror validated against hash_warp on 8 units (closed form and live)
gap: closed-form per-site distinct counts equal the library's distinct_indices_v4 on 4096 units
gap: (c) metrics on 64 units: closed distinct_mean 127.750 saturated 0 bias_max 60; live distinct_mean 127.760 saturated 0 bias_max 56
gap: site 0 closed ratio 1.0000 (1044464) live ratio 1.0001 (1044564) diff -0.0001; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 1 closed ratio 1.0001 (1040449) live ratio 1.0000 (1040348) diff +0.0001; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 2 closed ratio 1.0001 (1046623) live ratio 1.0001 (1046599) diff +0.0000; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 3 closed ratio 1.0000 (1040393) live ratio 1.0000 (1040350) diff +0.0000; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 4 closed ratio 1.0000 (1044446) live ratio 1.0000 (1044498) diff -0.0000; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 5 closed ratio 1.0000 (1046555) live ratio 1.0000 (1046494) diff +0.0001; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 6 closed ratio 1.0001 (1044546) live ratio 1.0000 (1044476) diff +0.0001; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 7 closed ratio 1.0000 (1046531) live ratio 1.0000 (1046549) diff -0.0000; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 8 closed ratio 1.0002 (1040552) live ratio 1.0000 (1040413) diff +0.0001; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 9 closed ratio 1.0000 (1046497) live ratio 1.0000 (1046546) diff -0.0000; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 10 closed ratio 0.9821 (1027800) live ratio 0.9823 (1027954) diff -0.0001; reads on indices read >= 8 times: closed 0.0937% live 0.0897%
gap: site 11 closed ratio 1.0000 (1046558) live ratio 1.0000 (1046490) diff +0.0001; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 12 closed ratio 0.9999 (1044396) live ratio 1.0001 (1044563) diff -0.0002; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 13 closed ratio 1.0000 (1046497) live ratio 1.0000 (1046478) diff +0.0000; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 14 closed ratio 1.0000 (1046572) live ratio 1.0000 (1046502) diff +0.0001; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 15 closed ratio 0.9999 (1040314) live ratio 1.0000 (1040422) diff -0.0001; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: min ratio closed 0.9821 live 0.9823; largest site gap -0.0002 at site 12; verdict under the 0.98 floor: closed accept live accept; 13.9 s
gap DONE 8aa3c604dba9d11b
gap: seed 107022
gap: program id 0fd1d15a8bd627d4 attempt 1 class mx8-era12c72f2b+sh256x27 day 20730 (cache filled in 0.6 s) plant zero-dataset false
gap: mirror validated against hash_warp on 8 units (closed form and live)
gap: closed-form per-site distinct counts equal the library's distinct_indices_v4 on 4096 units
gap: (c) metrics on 64 units: closed distinct_mean 128.000 saturated 0 bias_max 69; live distinct_mean 128.000 saturated 0 bias_max 49
gap: site 0 closed ratio 1.0000 (1046532) live ratio 1.0001 (1046633) diff -0.0001; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 1 closed ratio 1.0000 (1046574) live ratio 1.0000 (1046533) diff +0.0000; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 2 closed ratio 1.0001 (1040444) live ratio 1.0000 (1040408) diff +0.0000; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 3 closed ratio 1.0000 (1040361) live ratio 1.0002 (1040591) diff -0.0002; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 4 closed ratio 1.0000 (1046574) live ratio 1.0000 (1046537) diff +0.0000; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 5 closed ratio 1.0001 (1046603) live ratio 1.0000 (1046566) diff +0.0000; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 6 closed ratio 1.0000 (1046537) live ratio 1.0001 (1046588) diff -0.0000; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 7 closed ratio 1.0001 (1046596) live ratio 1.0000 (1046514) diff +0.0001; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 8 closed ratio 1.0000 (1046570) live ratio 1.0000 (1046481) diff +0.0001; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 9 closed ratio 0.9999 (1040260) live ratio 1.0000 (1040374) diff -0.0001; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 10 closed ratio 0.9877 (1031592) live ratio 0.9876 (1031543) diff +0.0000; reads on indices read >= 8 times: closed 0.2035% live 0.2214%
gap: site 11 closed ratio 0.9940 (1038229) live ratio 0.9940 (1038256) diff -0.0000; reads on indices read >= 8 times: closed 0.0511% live 0.0534%
gap: site 12 closed ratio 0.9999 (1040269) live ratio 1.0001 (1040474) diff -0.0002; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 13 closed ratio 1.0000 (1044507) live ratio 1.0001 (1044617) diff -0.0001; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 14 closed ratio 1.0000 (1046491) live ratio 1.0000 (1046524) diff -0.0000; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 15 closed ratio 1.0001 (1044566) live ratio 1.0000 (1044450) diff +0.0001; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: min ratio closed 0.9877 live 0.9876; largest site gap -0.0002 at site 3; verdict under the 0.98 floor: closed accept live accept; 13.4 s
gap DONE 0fd1d15a8bd627d4
Terminated
lease: released 8 pool cores after 138 s, exit 0

View file

@ -0,0 +1,27 @@
lease: 0 of 4 pool cores free (88 leased); waiting
lease: holding 8 pool cores (42,43,44,45,46,47,48,49, waited 11 s, class adv): adv-accept gap-five-d20733
gap: hex program devnet3-epoch0-v4: epoch 4020cb4382e3fe4b281c817c02582e147d8f851f566ae9172b28912b8e68b925 era 4020cb4382e3fe4b281c817c02582e147d8f851f566ae9172b28912b8e68b925
gap: program id fce15bf61030be57 attempt 0 class mx8-eraaf3a9139+sh256x27 day 20733 (cache filled in 0.6 s) plant zero-dataset false
gap: mirror validated against hash_warp on 8 units (closed form and live)
gap: closed-form per-site distinct counts equal the library's distinct_indices_v4 on 4096 units
gap: (c) metrics on 64 units: closed distinct_mean 128.000 saturated 0 bias_max 58; live distinct_mean 128.000 saturated 0 bias_max 73
gap: site 0 closed ratio 0.9992 (1045725) live ratio 0.9993 (1045766) diff -0.0000; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 1 closed ratio 0.9999 (1040295) live ratio 1.0001 (1040513) diff -0.0002; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 2 closed ratio 1.0000 (1044477) live ratio 1.0000 (1044480) diff -0.0000; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 3 closed ratio 1.0000 (1046530) live ratio 1.0000 (1046549) diff -0.0000; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 4 closed ratio 0.9999 (1044399) live ratio 1.0001 (1044573) diff -0.0002; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 5 closed ratio 1.0001 (1044584) live ratio 1.0000 (1044473) diff +0.0001; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 6 closed ratio 1.0001 (1044568) live ratio 1.0000 (1044520) diff +0.0000; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 7 closed ratio 1.0000 (1046573) live ratio 1.0000 (1046494) diff +0.0001; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 8 closed ratio 1.0000 (1040408) live ratio 1.0000 (1040415) diff -0.0000; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 9 closed ratio 1.0000 (1044441) live ratio 1.0000 (1044429) diff +0.0000; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 10 closed ratio 1.0001 (1044553) live ratio 1.0000 (1044438) diff +0.0001; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 11 closed ratio 1.0000 (1046573) live ratio 1.0000 (1046532) diff +0.0000; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 12 closed ratio 1.0000 (1040352) live ratio 1.0002 (1040544) diff -0.0002; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 13 closed ratio 1.0000 (1046504) live ratio 0.9999 (1046439) diff +0.0001; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 14 closed ratio 1.0000 (1044488) live ratio 0.9999 (1044407) diff +0.0001; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 15 closed ratio 1.0000 (1044503) live ratio 1.0000 (1044429) diff +0.0001; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: min ratio closed 0.9992 live 0.9993; largest site gap -0.0002 at site 1; verdict under the 0.98 floor: closed accept live accept; 14.0 s
gap DONE fce15bf61030be57
Terminated
lease: released 8 pool cores after 29 s, exit 0

View file

@ -0,0 +1,50 @@
lease: 0 of 4 pool cores free (88 leased); waiting
lease: holding 8 pool cores (42,43,44,45,46,47,48,49, waited 1035 s, class adv): adv-accept gap-hot2
gap: seed 4346
gap: program id bbb38e847011c354 attempt 2 class mx8-eraa577896a+sh256x27 day 20730 (cache filled in 0.6 s) plant zero-dataset false
gap: mirror validated against hash_warp on 8 units (closed form and live)
gap: closed-form per-site distinct counts equal the library's distinct_indices_v4 on 4096 units
gap: (c) metrics on 64 units: closed distinct_mean 127.999 saturated 0 bias_max 61; live distinct_mean 127.997 saturated 0 bias_max 53
gap: site 0 closed ratio 0.9997 (1044186) live ratio 0.9996 (1044074) diff +0.0001; reads on indices read >= 8 times: closed 0.0349% live 0.0354%
gap: site 1 closed ratio 1.0000 (1046562) live ratio 1.0000 (1046559) diff +0.0000; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 2 closed ratio 0.9840 (1029769) live ratio 0.9839 (1029638) diff +0.0001; reads on indices read >= 8 times: closed 0.3636% live 0.3881%
gap: site 3 closed ratio 1.0000 (1044459) live ratio 1.0000 (1044480) diff -0.0000; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 4 closed ratio 0.9998 (1044268) live ratio 0.9999 (1044326) diff -0.0001; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 5 closed ratio 1.0001 (1044547) live ratio 1.0001 (1044568) diff -0.0000; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 6 closed ratio 1.0001 (1040464) live ratio 0.9999 (1040326) diff +0.0001; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 7 closed ratio 1.0000 (1046571) live ratio 1.0000 (1046482) diff +0.0001; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 8 closed ratio 0.9981 (1042510) live ratio 0.9982 (1042562) diff -0.0000; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 9 closed ratio 0.9981 (1042465) live ratio 0.9982 (1042603) diff -0.0001; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 10 closed ratio 0.9990 (1045529) live ratio 0.9990 (1045478) diff +0.0000; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 11 closed ratio 1.0000 (1046518) live ratio 1.0000 (1046521) diff -0.0000; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 12 closed ratio 0.9997 (1040086) live ratio 1.0000 (1040385) diff -0.0003; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 13 closed ratio 1.0000 (1046523) live ratio 1.0000 (1046479) diff +0.0000; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 14 closed ratio 1.0000 (1046513) live ratio 0.9999 (1046467) diff +0.0000; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 15 closed ratio 1.0000 (1046568) live ratio 1.0000 (1046529) diff +0.0000; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: min ratio closed 0.9840 live 0.9839; largest site gap -0.0003 at site 12; verdict under the 0.98 floor: closed accept live accept; 13.8 s
gap DONE bbb38e847011c354
gap: seed 5245
gap: program id beaad44840bb9e4e attempt 5 class mx8-erae7b2abfb+sh256x27 day 20730 (cache filled in 0.6 s) plant zero-dataset false
gap: mirror validated against hash_warp on 8 units (closed form and live)
gap: closed-form per-site distinct counts equal the library's distinct_indices_v4 on 4096 units
gap: (c) metrics on 64 units: closed distinct_mean 128.000 saturated 0 bias_max 59; live distinct_mean 128.000 saturated 0 bias_max 59
gap: site 0 closed ratio 1.0001 (1044601) live ratio 1.0001 (1044603) diff -0.0000; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 1 closed ratio 1.0000 (1046564) live ratio 1.0000 (1046555) diff +0.0000; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 2 closed ratio 1.0000 (1046519) live ratio 1.0000 (1046485) diff +0.0000; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 3 closed ratio 1.0001 (1040482) live ratio 1.0002 (1040593) diff -0.0001; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 4 closed ratio 1.0000 (1044483) live ratio 1.0000 (1044453) diff +0.0000; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 5 closed ratio 1.0001 (1046612) live ratio 1.0000 (1046504) diff +0.0001; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 6 closed ratio 0.9999 (1044373) live ratio 1.0001 (1044575) diff -0.0002; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 7 closed ratio 1.0000 (1040430) live ratio 1.0000 (1040353) diff +0.0001; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 8 closed ratio 0.9831 (1022759) live ratio 0.9833 (1023050) diff -0.0003; reads on indices read >= 8 times: closed 0.3495% live 0.3639%
gap: site 9 closed ratio 1.0000 (1040392) live ratio 1.0001 (1040448) diff -0.0001; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 10 closed ratio 1.0000 (1046546) live ratio 0.9999 (1046451) diff +0.0001; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 11 closed ratio 1.0000 (1046545) live ratio 1.0000 (1046528) diff +0.0000; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 12 closed ratio 1.0000 (1046507) live ratio 1.0000 (1046540) diff -0.0000; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 13 closed ratio 1.0001 (1044572) live ratio 1.0000 (1044465) diff +0.0001; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 14 closed ratio 1.0000 (1046491) live ratio 1.0000 (1046484) diff +0.0000; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 15 closed ratio 1.0000 (1040415) live ratio 1.0001 (1040442) diff -0.0000; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: min ratio closed 0.9831 live 0.9833; largest site gap -0.0003 at site 8; verdict under the 0.98 floor: closed accept live accept; 14.9 s
gap DONE beaad44840bb9e4e
Terminated
lease: released 8 pool cores after 1071 s, exit 0

View file

@ -0,0 +1,27 @@
lease: 0 of 4 pool cores free (88 leased); waiting
lease: holding 8 pool cores (33,34,35,36,37,38,39,40, waited 732 s, class adv): adv-accept gap-hot3
gap: seed 1738
gap: program id 33ece54e2df5ea44 attempt 4 class mx8-era47aaf3f9+sh256x27 day 20730 (cache filled in 0.6 s) plant zero-dataset false
gap: mirror validated against hash_warp on 8 units (closed form and live)
gap: closed-form per-site distinct counts equal the library's distinct_indices_v4 on 4096 units
gap: (c) metrics on 64 units: closed distinct_mean 128.000 saturated 0 bias_max 51; live distinct_mean 128.000 saturated 0 bias_max 54
gap: site 0 closed ratio 1.0002 (1040562) live ratio 1.0000 (1040428) diff +0.0001; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 1 closed ratio 1.0000 (1044503) live ratio 1.0000 (1044471) diff +0.0000; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 2 closed ratio 1.0000 (1046562) live ratio 1.0000 (1046526) diff +0.0000; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 3 closed ratio 1.0001 (1046586) live ratio 1.0000 (1046533) diff +0.0001; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 4 closed ratio 1.0001 (1046625) live ratio 1.0000 (1046491) diff +0.0001; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 5 closed ratio 1.0000 (1044515) live ratio 1.0000 (1044431) diff +0.0001; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 6 closed ratio 1.0001 (1044601) live ratio 1.0001 (1044628) diff -0.0000; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 7 closed ratio 0.9999 (1044425) live ratio 1.0000 (1044501) diff -0.0001; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 8 closed ratio 1.0000 (1046478) live ratio 1.0000 (1046548) diff -0.0001; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 9 closed ratio 1.0001 (1044542) live ratio 1.0001 (1044578) diff -0.0000; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 10 closed ratio 0.9998 (1040215) live ratio 0.9999 (1040236) diff -0.0000; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 11 closed ratio 1.0001 (1040528) live ratio 1.0000 (1040421) diff +0.0001; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 12 closed ratio 1.0001 (1046603) live ratio 1.0000 (1046557) diff +0.0000; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 13 closed ratio 0.9868 (1026682) live ratio 0.9870 (1026875) diff -0.0002; reads on indices read >= 8 times: closed 0.2595% live 0.2535%
gap: site 14 closed ratio 1.0000 (1044508) live ratio 1.0000 (1044500) diff +0.0000; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 15 closed ratio 0.9924 (1032460) live ratio 0.9925 (1032541) diff -0.0001; reads on indices read >= 8 times: closed 0.0585% live 0.0530%
gap: min ratio closed 0.9868 live 0.9870; largest site gap -0.0002 at site 13; verdict under the 0.98 floor: closed accept live accept; 15.0 s
gap DONE 33ece54e2df5ea44
Terminated
lease: released 8 pool cores after 751 s, exit 0

View file

@ -0,0 +1,23 @@
gap: seed 2
gap: program id 8a0047b2eb071ade attempt 5 class mx8-era35d128b9+sh256x27 day 20730 (cache filled in 0.6 s) plant zero-dataset true
gap: mirror validated against hash_warp on 8 units (closed form; live skipped under the plant)
gap: closed-form per-site distinct counts equal the library's distinct_indices_v4 on 4096 units
gap: (c) metrics on 64 units: closed distinct_mean 128.000 saturated 1 bias_max 56; live distinct_mean 115.988 saturated 0 bias_max 64
gap: site 0 closed ratio 1.0000 (1040416) live ratio 1.0001 (1040526) diff -0.0001
gap: site 1 closed ratio 0.9999 (1046463) live ratio 1.0000 (1046552) diff -0.0001
gap: site 2 closed ratio 1.0000 (1046531) live ratio 1.0000 (1046557) diff -0.0000
gap: site 3 closed ratio 1.0000 (1046511) live ratio 0.9999 (1046441) diff +0.0001
gap: site 4 closed ratio 1.0001 (1040437) live ratio 1.0000 (1040375) diff +0.0001
gap: site 5 closed ratio 1.0000 (1044493) live ratio 0.9999 (1044426) diff +0.0001
gap: site 6 closed ratio 1.0002 (1040579) live ratio 1.0000 (1040400) diff +0.0002
gap: site 7 closed ratio 1.0000 (1044480) live ratio 1.0001 (1044566) diff -0.0001
gap: site 8 closed ratio 1.0000 (1046508) live ratio 1.0000 (1046557) diff -0.0000
gap: site 9 closed ratio 1.0001 (1044535) live ratio 0.9832 (1026892) diff +0.0169
gap: site 10 closed ratio 0.9999 (1040317) live ratio 0.9733 (1012652) diff +0.0266
gap: site 11 closed ratio 1.0000 (1044517) live ratio 1.0000 (1044522) diff -0.0000
gap: site 12 closed ratio 1.0001 (1040488) live ratio 1.0000 (1040400) diff +0.0001
gap: site 13 closed ratio 1.0000 (1046549) live ratio 1.0000 (1046512) diff +0.0000
gap: site 14 closed ratio 1.0000 (1046487) live ratio 1.0000 (1046518) diff -0.0000
gap: site 15 closed ratio 0.9999 (1040327) live ratio 1.0001 (1040504) diff -0.0002
gap: min ratio closed 0.9999 live 0.9733; largest site gap +0.0266 at site 10; verdict under the 0.98 floor: closed accept live REJECT; 5.8 s
gap DONE 8a0047b2eb071ade

View file

@ -0,0 +1,165 @@
lease: 0 of 16 pool cores free (88 leased); waiting
lease: holding 31 pool cores (42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72, waited 840 s): adv-accept gap-rep8
gap: seed 100767
gap: program id 9d68e6286fc817d4 attempt 2 class mx8-era763e5847+sh256x27 day 20730 (cache filled in 0.4 s) plant zero-dataset false
gap: mirror validated against hash_warp on 8 units (closed form and live)
gap: closed-form per-site distinct counts equal the library's distinct_indices_v4 on 4096 units
gap: (c) metrics on 64 units: closed distinct_mean 127.714 saturated 0 bias_max 82; live distinct_mean 127.730 saturated 1 bias_max 53
gap: site 0 closed ratio 0.9997 (1044181) live ratio 0.9999 (1044337) diff -0.0001; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 1 closed ratio 0.9998 (1046291) live ratio 0.9997 (1046234) diff +0.0001; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 2 closed ratio 0.9999 (1040272) live ratio 0.9998 (1040205) diff +0.0001; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 3 closed ratio 0.9997 (1046208) live ratio 0.9998 (1046357) diff -0.0001; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 4 closed ratio 0.9998 (1044272) live ratio 0.9999 (1044371) diff -0.0001; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 5 closed ratio 0.9998 (1044269) live ratio 0.9999 (1044334) diff -0.0001; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 6 closed ratio 0.9919 (1031917) live ratio 0.9920 (1032049) diff -0.0001; reads on indices read >= 8 times: closed 0.1681% live 0.1514%
gap: site 7 closed ratio 0.9997 (1040121) live ratio 0.9998 (1040139) diff -0.0000; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 8 closed ratio 0.9999 (1044334) live ratio 0.9998 (1044277) diff +0.0001; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 9 closed ratio 0.9997 (1044213) live ratio 0.9997 (1044176) diff +0.0000; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 10 closed ratio 0.9998 (1046311) live ratio 0.9998 (1046304) diff +0.0000; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 11 closed ratio 0.9998 (1044255) live ratio 0.9998 (1044247) diff +0.0000; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 12 closed ratio 1.0000 (1040348) live ratio 0.9998 (1040163) diff +0.0002; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 13 closed ratio 0.9998 (1046273) live ratio 0.9998 (1046309) diff -0.0000; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 14 closed ratio 0.9997 (1046243) live ratio 0.9998 (1046302) diff -0.0001; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 15 closed ratio 0.9997 (1044149) live ratio 0.9998 (1044287) diff -0.0001; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: min ratio closed 0.9919 live 0.9920; largest site gap +0.0002 at site 12; verdict under the 0.98 floor: closed accept live accept; 5.8 s
gap DONE 9d68e6286fc817d4
gap: seed 100211
gap: program id d07885a437e237c7 attempt 0 class mx8-eraa8bce51f+sh256x27 day 20730 (cache filled in 0.6 s) plant zero-dataset false
gap: mirror validated against hash_warp on 8 units (closed form and live)
gap: closed-form per-site distinct counts equal the library's distinct_indices_v4 on 4096 units
gap: (c) metrics on 64 units: closed distinct_mean 128.000 saturated 0 bias_max 61; live distinct_mean 128.000 saturated 0 bias_max 57
gap: site 0 closed ratio 1.0001 (1044569) live ratio 1.0000 (1044436) diff +0.0001; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 1 closed ratio 1.0001 (1044548) live ratio 0.9999 (1044420) diff +0.0001; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 2 closed ratio 1.0001 (1046583) live ratio 1.0000 (1046505) diff +0.0001; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 3 closed ratio 1.0001 (1040470) live ratio 1.0000 (1040420) diff +0.0000; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 4 closed ratio 1.0000 (1040420) live ratio 1.0000 (1040436) diff -0.0000; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 5 closed ratio 1.0000 (1046556) live ratio 1.0000 (1046524) diff +0.0000; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 6 closed ratio 1.0000 (1044469) live ratio 1.0001 (1044551) diff -0.0001; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 7 closed ratio 1.0002 (1040604) live ratio 1.0000 (1040409) diff +0.0002; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 8 closed ratio 1.0000 (1040382) live ratio 1.0001 (1040521) diff -0.0001; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 9 closed ratio 0.9907 (1034720) live ratio 0.9908 (1034913) diff -0.0002; reads on indices read >= 8 times: closed 0.1862% live 0.1794%
gap: site 10 closed ratio 1.0000 (1046489) live ratio 1.0000 (1046567) diff -0.0001; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 11 closed ratio 1.0000 (1044496) live ratio 1.0001 (1044546) diff -0.0000; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 12 closed ratio 1.0002 (1040563) live ratio 0.9999 (1040306) diff +0.0002; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 13 closed ratio 1.0000 (1046492) live ratio 1.0000 (1046480) diff +0.0000; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 14 closed ratio 1.0001 (1040478) live ratio 1.0000 (1040406) diff +0.0001; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 15 closed ratio 1.0000 (1044498) live ratio 0.9999 (1044420) diff +0.0001; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: min ratio closed 0.9907 live 0.9908; largest site gap +0.0002 at site 12; verdict under the 0.98 floor: closed accept live accept; 7.7 s
gap DONE d07885a437e237c7
gap: seed 100064
gap: program id 2442abf9d56f6611 attempt 2 class mx8-eraa210d1bd+sh256x27 day 20730 (cache filled in 0.6 s) plant zero-dataset false
gap: mirror validated against hash_warp on 8 units (closed form and live)
gap: closed-form per-site distinct counts equal the library's distinct_indices_v4 on 4096 units
gap: (c) metrics on 64 units: closed distinct_mean 128.000 saturated 11 bias_max 64; live distinct_mean 128.000 saturated 6 bias_max 51
gap: site 0 closed ratio 1.0002 (1044665) live ratio 1.0000 (1044436) diff +0.0002; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 1 closed ratio 1.0000 (1046553) live ratio 1.0000 (1046547) diff +0.0000; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 2 closed ratio 1.0000 (1044482) live ratio 1.0000 (1044529) diff -0.0000; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 3 closed ratio 1.0000 (1044491) live ratio 1.0001 (1044596) diff -0.0001; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 4 closed ratio 1.0000 (1046539) live ratio 1.0000 (1046523) diff +0.0000; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 5 closed ratio 1.0001 (1040513) live ratio 0.9999 (1040282) diff +0.0002; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 6 closed ratio 1.0001 (1046582) live ratio 1.0000 (1046545) diff +0.0000; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 7 closed ratio 1.0000 (1046489) live ratio 1.0001 (1046583) diff -0.0001; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 8 closed ratio 1.0000 (1044497) live ratio 0.9999 (1044335) diff +0.0002; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 9 closed ratio 1.0000 (1046531) live ratio 1.0000 (1046545) diff -0.0000; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 10 closed ratio 1.0000 (1046523) live ratio 1.0000 (1046552) diff -0.0000; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 11 closed ratio 0.9832 (1022918) live ratio 0.9831 (1022831) diff +0.0001; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 12 closed ratio 1.0000 (1044431) live ratio 0.9999 (1044389) diff +0.0000; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 13 closed ratio 1.0000 (1046496) live ratio 1.0000 (1046497) diff -0.0000; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 14 closed ratio 1.0002 (1044658) live ratio 1.0002 (1044663) diff -0.0000; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 15 closed ratio 0.9914 (1035466) live ratio 0.9914 (1035489) diff -0.0000; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: min ratio closed 0.9832 live 0.9831; largest site gap +0.0002 at site 5; verdict under the 0.98 floor: closed accept live accept; 7.8 s
gap DONE 2442abf9d56f6611
gap: seed 100159
gap: program id 573d650159a8b04e attempt 3 class mx8-era9e0e4f28+sh256x27 day 20730 (cache filled in 0.6 s) plant zero-dataset false
gap: mirror validated against hash_warp on 8 units (closed form and live)
gap: closed-form per-site distinct counts equal the library's distinct_indices_v4 on 4096 units
gap: (c) metrics on 64 units: closed distinct_mean 127.467 saturated 0 bias_max 46; live distinct_mean 127.458 saturated 0 bias_max 64
gap: site 0 closed ratio 1.0000 (1040396) live ratio 1.0000 (1040385) diff +0.0000; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 1 closed ratio 1.0000 (1046497) live ratio 1.0000 (1046483) diff +0.0000; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 2 closed ratio 1.0001 (1040463) live ratio 1.0001 (1040441) diff +0.0000; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 3 closed ratio 1.0000 (1040403) live ratio 1.0000 (1040360) diff +0.0000; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 4 closed ratio 1.0002 (1040636) live ratio 1.0001 (1040451) diff +0.0002; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 5 closed ratio 0.9960 (1036266) live ratio 0.9962 (1036416) diff -0.0001; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 6 closed ratio 1.0000 (1046544) live ratio 1.0000 (1046540) diff +0.0000; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 7 closed ratio 0.9834 (1023068) live ratio 0.9832 (1022905) diff +0.0002; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 8 closed ratio 0.9999 (1044402) live ratio 1.0001 (1044572) diff -0.0002; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 9 closed ratio 1.0001 (1040449) live ratio 1.0000 (1040341) diff +0.0001; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 10 closed ratio 1.0000 (1040366) live ratio 1.0002 (1040607) diff -0.0002; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 11 closed ratio 1.0000 (1046539) live ratio 1.0000 (1046513) diff +0.0000; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 12 closed ratio 1.0000 (1040416) live ratio 1.0002 (1040552) diff -0.0001; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 13 closed ratio 1.0001 (1040454) live ratio 1.0000 (1040392) diff +0.0001; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 14 closed ratio 1.0000 (1046562) live ratio 1.0000 (1046534) diff +0.0000; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 15 closed ratio 1.0000 (1046523) live ratio 1.0001 (1046632) diff -0.0001; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: min ratio closed 0.9834 live 0.9832; largest site gap -0.0002 at site 10; verdict under the 0.98 floor: closed accept live accept; 7.7 s
gap DONE 573d650159a8b04e
gap: seed 100629
gap: program id 37c849d9741c5994 attempt 0 class mx8-era31b72e61+sh256x27 day 20730 (cache filled in 0.6 s) plant zero-dataset false
gap: mirror validated against hash_warp on 8 units (closed form and live)
gap: closed-form per-site distinct counts equal the library's distinct_indices_v4 on 4096 units
gap: (c) metrics on 64 units: closed distinct_mean 128.000 saturated 0 bias_max 64; live distinct_mean 128.000 saturated 0 bias_max 52
gap: site 0 closed ratio 0.9999 (1044395) live ratio 1.0000 (1044438) diff -0.0000; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 1 closed ratio 1.0001 (1044552) live ratio 1.0000 (1044457) diff +0.0001; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 2 closed ratio 1.0000 (1040424) live ratio 1.0001 (1040508) diff -0.0001; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 3 closed ratio 1.0000 (1044516) live ratio 1.0000 (1044433) diff +0.0001; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 4 closed ratio 1.0001 (1044582) live ratio 1.0000 (1044505) diff +0.0001; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 5 closed ratio 0.9834 (1023069) live ratio 0.9834 (1023089) diff -0.0000; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 6 closed ratio 1.0000 (1046561) live ratio 1.0000 (1046526) diff +0.0000; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 7 closed ratio 0.9999 (1046473) live ratio 1.0000 (1046503) diff -0.0000; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 8 closed ratio 1.0002 (1040594) live ratio 1.0000 (1040365) diff +0.0002; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 9 closed ratio 1.0000 (1040420) live ratio 1.0001 (1040531) diff -0.0001; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 10 closed ratio 1.0001 (1044537) live ratio 1.0000 (1044439) diff +0.0001; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 11 closed ratio 1.0000 (1040379) live ratio 1.0000 (1040414) diff -0.0000; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 12 closed ratio 0.9999 (1044359) live ratio 1.0001 (1044540) diff -0.0002; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 13 closed ratio 1.0000 (1046490) live ratio 1.0000 (1046536) diff -0.0000; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 14 closed ratio 1.0000 (1046570) live ratio 1.0000 (1046553) diff +0.0000; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 15 closed ratio 1.0001 (1046587) live ratio 1.0000 (1046558) diff +0.0000; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: min ratio closed 0.9834 live 0.9834; largest site gap +0.0002 at site 8; verdict under the 0.98 floor: closed accept live accept; 7.6 s
gap DONE 37c849d9741c5994
gap: seed 2
gap: program id 8a0047b2eb071ade attempt 5 class mx8-era35d128b9+sh256x27 day 20730 (cache filled in 0.6 s) plant zero-dataset false
gap: mirror validated against hash_warp on 8 units (closed form and live)
gap: closed-form per-site distinct counts equal the library's distinct_indices_v4 on 4096 units
gap: (c) metrics on 64 units: closed distinct_mean 128.000 saturated 1 bias_max 56; live distinct_mean 128.000 saturated 0 bias_max 57
gap: site 0 closed ratio 1.0000 (1040416) live ratio 1.0002 (1040607) diff -0.0002; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 1 closed ratio 0.9999 (1046463) live ratio 1.0000 (1046575) diff -0.0001; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 2 closed ratio 1.0000 (1046531) live ratio 1.0001 (1046645) diff -0.0001; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 3 closed ratio 1.0000 (1046511) live ratio 1.0001 (1046596) diff -0.0001; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 4 closed ratio 1.0001 (1040437) live ratio 0.9999 (1040329) diff +0.0001; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 5 closed ratio 1.0000 (1044493) live ratio 1.0001 (1044597) diff -0.0001; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 6 closed ratio 1.0002 (1040579) live ratio 1.0001 (1040442) diff +0.0001; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 7 closed ratio 1.0000 (1044480) live ratio 1.0000 (1044495) diff -0.0000; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 8 closed ratio 1.0000 (1046508) live ratio 1.0000 (1046511) diff -0.0000; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 9 closed ratio 1.0001 (1044535) live ratio 1.0000 (1044429) diff +0.0001; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 10 closed ratio 0.9999 (1040317) live ratio 1.0001 (1040530) diff -0.0002; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 11 closed ratio 1.0000 (1044517) live ratio 1.0001 (1044565) diff -0.0000; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 12 closed ratio 1.0001 (1040488) live ratio 0.9999 (1040310) diff +0.0002; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 13 closed ratio 1.0000 (1046549) live ratio 1.0000 (1046580) diff -0.0000; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 14 closed ratio 1.0000 (1046487) live ratio 1.0000 (1046488) diff -0.0000; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 15 closed ratio 0.9999 (1040327) live ratio 1.0002 (1040548) diff -0.0002; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: min ratio closed 0.9999 live 0.9999; largest site gap -0.0002 at site 15; verdict under the 0.98 floor: closed accept live accept; 7.7 s
gap DONE 8a0047b2eb071ade
gap: seed 3664
gap: program id abfcb4fe4f054bad attempt 1 class mx8-era22e9123a+sh256x27 day 20730 (cache filled in 0.6 s) plant zero-dataset false
gap: mirror validated against hash_warp on 8 units (closed form and live)
gap: closed-form per-site distinct counts equal the library's distinct_indices_v4 on 4096 units
gap: (c) metrics on 64 units: closed distinct_mean 124.021 saturated 0 bias_max 59; live distinct_mean 123.989 saturated 0 bias_max 60
gap: site 0 closed ratio 0.9997 (1040099) live ratio 0.9998 (1040193) diff -0.0001; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 1 closed ratio 0.9998 (1040166) live ratio 0.9996 (1039994) diff +0.0002; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 2 closed ratio 0.9998 (1044306) live ratio 0.9998 (1044312) diff -0.0000; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 3 closed ratio 0.9998 (1044260) live ratio 0.9997 (1044152) diff +0.0001; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 4 closed ratio 0.9999 (1040277) live ratio 0.9999 (1040271) diff +0.0000; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 5 closed ratio 0.9997 (1044203) live ratio 0.9998 (1044221) diff -0.0000; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 6 closed ratio 1.0000 (1040390) live ratio 0.9996 (1039997) diff +0.0004; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 7 closed ratio 0.9998 (1044299) live ratio 0.9998 (1044304) diff -0.0000; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 8 closed ratio 0.9997 (1044158) live ratio 0.9998 (1044223) diff -0.0001; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 9 closed ratio 0.9998 (1044312) live ratio 0.9997 (1044192) diff +0.0001; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 10 closed ratio 0.9998 (1046295) live ratio 0.9998 (1046290) diff +0.0000; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 11 closed ratio 0.9999 (1040240) live ratio 0.9997 (1040081) diff +0.0002; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 12 closed ratio 0.9963 (1036533) live ratio 0.9965 (1036691) diff -0.0002; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 13 closed ratio 0.9962 (1036435) live ratio 0.9964 (1036645) diff -0.0002; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 14 closed ratio 0.9998 (1046279) live ratio 0.9997 (1046251) diff +0.0000; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: site 15 closed ratio 0.9944 (1038613) live ratio 0.9943 (1038549) diff +0.0001; reads on indices read >= 8 times: closed 0.0000% live 0.0000%
gap: min ratio closed 0.9944 live 0.9943; largest site gap +0.0004 at site 6; verdict under the 0.98 floor: closed accept live accept; 7.9 s
gap DONE abfcb4fe4f054bad
Terminated
lease: released 31 pool cores after 918 s, exit 0

View file

@ -0,0 +1 @@
2240972

View file

@ -0,0 +1 @@
2240972

View file

@ -0,0 +1,2 @@
2026-10-07T19:20:45Z queued pid 2192622 pgid 2192622 behind the per-box sweep lock; nice 10 cores 8-95; log /srv/builds/_adv-adv-accept/gap-rep8.log
2026-10-07T19:25:11Z queued on lease pool 32 (min 16) pid 2240972 pgid 2240972; log /srv/builds/_adv-adv-accept/gap-rep8.log

View file

@ -0,0 +1,296 @@
[2026-10-07T18:40:55Z] attack-f8 0.1.0 (igneum-pow 4); args ["warps", "--program", "100767", "--nonces", "16777216", "--threads", "32", "--out", "/srv/builds/_adv-adv-accept/live", "--validate", "sample", "--diag", "1"]
[2026-10-07T18:40:55Z] census warps: programs [100767] day 20730 nonces 16777216 threads 32 plant none validate sample check_every 997 diag true
[2026-10-07T18:40:55Z] day 20730: cache filled in 0.61 s, fnv 448274a57f508cbc
[2026-10-07T18:40:58Z] table: 16777216 items derived with their 8 lines in 2.4 s; library comparison sample (0 mismatches)
[2026-10-07T18:41:02Z] program p100767-attack-f8: epoch seed 74484b391756fc49568cdd716bcfd839a55d31a45633c223c65c7f2ab4617fd4 era seed 7a65a05391dcd87b8fdaf7f74813aa17c6e13f7c56a03da2aaa6176987ef038b id 9d68e6286fc817d4 attempt 2 class mx8-era763e5847+sh256x27 op mix load=16 add=8 mad=6 mul=6 rotl=6 mulhi=5 xor=5 rotr=4 shfl=4 or=2 sub=2; era stride mul 0x54387173 rot 28 interleave [4, 11, 13, 15] windows 6:1:0 9:0:0 11:2:1 12:0:0 13:1:1 19:1:1 23:2:0 32:2:0 36:1:1 39:1:1 41:0:0 45:1:0 50:2:3 58:0:0 59:0:0 63:1:0
[2026-10-07T18:41:02Z] load site instr 6: src r6 win 1 off 0; last base writer mad at 4; writers back to the last injecting one: mad@4; shadow writes of r6 per rep: add=5 mad=7 mul=1 mulhi=1 rotl=3 rotr=2 shfl=3 sub=1 xor=6
[2026-10-07T18:41:02Z] load site instr 9: src r7 win 0 off 0; last base writer load at 6; writers back to the last injecting one: load@6; shadow writes of r7 per rep: add=5 mad=5 mul=4 mulhi=5 rotl=1 rotr=5 shfl=3 sub=4 xor=5
[2026-10-07T18:41:02Z] load site instr 11: src r5 win 2 off 1; last base writer xor at 5; writers back to the last injecting one: xor@5; shadow writes of r5 per rep: add=10 mul=5 mulhi=1 rotl=3 rotr=1 shfl=4 sub=3 xor=4
[2026-10-07T18:41:02Z] load site instr 12: src r3 win 0 off 0; last base writer load at 9; writers back to the last injecting one: load@9; shadow writes of r3 per rep: mad=6 mul=2 mulhi=4 or=1 rotl=4 rotr=2 xor=4
[2026-10-07T18:41:02Z] load site instr 13: src r2 win 1 off 1; last base writer load at 12; writers back to the last injecting one: load@12; shadow writes of r2 per rep: add=3 mad=2 mul=4 mulhi=2 or=6 rotl=1 rotr=1 shfl=5 sub=2 xor=4
[2026-10-07T18:41:02Z] load site instr 19: src r4 win 1 off 1; last base writer add at 7; writers back to the last injecting one: add@7; shadow writes of r4 per rep: add=5 mad=5 mul=4 mulhi=5 or=1 rotl=4 rotr=5 shfl=3 sub=5 xor=2
[2026-10-07T18:41:02Z] load site instr 23: src r6 win 2 off 0; last base writer mad at 22; writers back to the last injecting one: mad@22; shadow writes of r6 per rep: add=5 mad=7 mul=1 mulhi=1 rotl=3 rotr=2 shfl=3 sub=1 xor=6
[2026-10-07T18:41:02Z] load site instr 32: src r0 win 2 off 0; last base writer xor at 20; writers back to the last injecting one: xor@20; shadow writes of r0 per rep: add=7 mad=1 mul=3 mulhi=3 or=3 rotl=3 rotr=2 shfl=5 sub=2 xor=3
[2026-10-07T18:41:02Z] load site instr 36: src r7 win 1 off 1; last base writer rotr at 31; writers back to the last injecting one: rotr@31 load@6; shadow writes of r7 per rep: add=5 mad=5 mul=4 mulhi=5 rotl=1 rotr=5 shfl=3 sub=4 xor=5
[2026-10-07T18:41:02Z] load site instr 39: src r7 win 1 off 1; last base writer rotl at 38; writers back to the last injecting one: rotl@38 add@37; shadow writes of r7 per rep: add=5 mad=5 mul=4 mulhi=5 rotl=1 rotr=5 shfl=3 sub=4 xor=5
[2026-10-07T18:41:02Z] load site instr 41: src r4 win 0 off 0; last base writer rotl at 40; writers back to the last injecting one: rotl@40 load@32; shadow writes of r4 per rep: add=5 mad=5 mul=4 mulhi=5 or=1 rotl=4 rotr=5 shfl=3 sub=5 xor=2
[2026-10-07T18:41:02Z] load site instr 45: src r5 win 1 off 0; last base writer rotr at 27; writers back to the last injecting one: rotr@27 shfl@24; shadow writes of r5 per rep: add=10 mul=5 mulhi=1 rotl=3 rotr=1 shfl=4 sub=3 xor=4
[2026-10-07T18:41:02Z] load site instr 50: src r7 win 2 off 3; last base writer load at 45; writers back to the last injecting one: load@45; shadow writes of r7 per rep: add=5 mad=5 mul=4 mulhi=5 rotl=1 rotr=5 shfl=3 sub=4 xor=5
[2026-10-07T18:41:02Z] load site instr 58: src r3 win 0 off 0; last base writer load at 50; writers back to the last injecting one: load@50; shadow writes of r3 per rep: mad=6 mul=2 mulhi=4 or=1 rotl=4 rotr=2 xor=4
[2026-10-07T18:41:02Z] load site instr 59: src r2 win 0 off 0; last base writer xor at 46; writers back to the last injecting one: xor@46; shadow writes of r2 per rep: add=3 mad=2 mul=4 mulhi=2 or=6 rotl=1 rotr=1 shfl=5 sub=2 xor=4
[2026-10-07T18:41:02Z] load site instr 63: src r1 win 1 off 0; last base writer rotr at 62; writers back to the last injecting one: rotr@62 add@56; shadow writes of r1 per rep: add=5 mad=4 mul=6 mulhi=3 or=2 rotl=2 rotr=3 shfl=5 sub=3 xor=2
[2026-10-07T18:41:02Z] window layer: site item windows (first, items) (0x0,2^23) (0x0,2^24) (0x400000,2^22) (0x0,2^24) (0x800000,2^23) (0x800000,2^23) (0x0,2^22) (0x0,2^22) (0x800000,2^23) (0x800000,2^23) (0x0,2^24) (0x0,2^23) (0xc00000,2^22) (0x0,2^24) (0x0,2^24) (0x0,2^23); expected reads per item by quarter 152.000 120.000 104.000 136.000 (flat uniform 128.000)
[2026-10-07T18:41:56Z] 524288 warps (16777216 nonces) interpreted in 54.6 s (3.335 ms per warp per thread); Epoch::hash_warp agreement on 589 warps: 0 mismatches
[2026-10-07T18:41:56Z] p100767-attack-f8 distinct lines per hash: n 16777216 min 976 p1 1008 median 1024 p99 1024 max 1024 mean 1021.6650
[2026-10-07T18:41:56Z] p100767-attack-f8 distinct items per hash: n 16777216 min 122 p1 126 median 128 p99 128 max 128 mean 127.7237
[2026-10-07T18:41:56Z] p100767-attack-f8 distinct lines per warp: n 524288 min 32426 p1 32501 median 32567 p99 32623 max 32663 mean 32566.2019
[2026-10-07T18:41:56Z] p100767-attack-f8 distinct items per warp: n 524288 min 4070 p1 4079 median 4087 p99 4093 max 4096 mean 4086.6589
[2026-10-07T18:41:56Z] uniform expectation: distinct lines per hash 1023.875 of 1024 reads, per warp 32640.3 of 32768 reads (2^22 lines); distinct items per hash 127.9995 of 128, per warp 4095.50 of 4096 (2^24 items)
[2026-10-07T18:41:56Z] positions: largest hi16-bucket (256 items) share 0.0280% at p22 (iteration 1, site 6, instr 23); windowed expectation 0.0061%; largest saturated-source share 0.0126% at p54 (site 6, instr 23)
[2026-10-07T18:41:56Z] acceptance-style (2,048 evaluations, the rule's sample size): the most repeated address at one position 2 of 2048 at p118 (site 6, instr 23); saturated sources at one position 1 of 2048 at p102 (site 6, instr 23); uniform expectation: repeats 1 to 2, saturated 0
[2026-10-07T18:41:57Z] p100767-attack-f8 item histogram (flat): bins 16777216 reads 2147483648 mean 128.000 sigma 11.314 max 29355 (bin 0) z_max +2583.33 min 55 z_min -6.45 chi2/dof 5.03991 chi2_z +11700.82 top0.1% 0.30333% top0.5% 0.97981% top1% 1.72538%
[2026-10-07T18:41:57Z] p100767-attack-f8 item histogram against the window density: full 2^24 chi2/dof 2.29791 largest 29355 (item 0x0) at +2368.68 sigma smallest at -5.19; buckets64 chi2/dof 1.84909 largest 38799 (bucket 0) at +294.75 sigma smallest at -4.57
[2026-10-07T18:41:59Z] p100767-attack-f8 WINDOWED CONTROL item histogram (flat): bins 16777216 reads 2147483648 mean 128.000 sigma 11.314 max 215 (bin 2100831) z_max +7.69 min 56 z_min -6.36 chi2/dof 3.49942 chi2_z +7239.08 top0.1% 0.14829% top0.5% 0.71360% top1% 1.40031%
[2026-10-07T18:41:59Z] p100767-attack-f8 WINDOWED CONTROL against the window density: full chi2/dof 0.99988 largest +5.98 sigma; buckets64 chi2/dof 0.99505 largest +5.11 smallest -4.81
[2026-10-07T18:41:59Z] 6-sigma p100767-attack-f8 items buckets64 against the window density: largest bucket +294.75 sigma, smallest -4.57 -> FLAGGED (beyond 6 sigma)
[2026-10-07T18:41:59Z] hot-set p100767-attack-f8 items (windowed control): f 0.1% S_f 0.30333% E_f(control) 0.14829% X_f +0.15503% X_f/f +1.5503 -> HOT SET
[2026-10-07T18:41:59Z] hot-set p100767-attack-f8 items (windowed control): f 0.5% S_f 0.97981% E_f(control) 0.71360% X_f +0.26621% X_f/f +0.5324 -> no hot set
[2026-10-07T18:41:59Z] hot-set p100767-attack-f8 items (windowed control): f 1.0% S_f 1.72538% E_f(control) 1.40031% X_f +0.32507% X_f/f +0.3251 -> no hot set
[2026-10-07T18:41:59Z] hot-set p100767-attack-f8 items (windowed control): verdict FLAGGED
[2026-10-07T18:42:02Z] p100767-attack-f8 FLAT CONTROL item histogram: bins 16777216 reads 2147483648 mean 128.000 sigma 11.314 max 191 (bin 10083710) z_max +5.57 min 71 z_min -5.04 chi2/dof 1.00035 chi2_z +1.01 top0.1% 0.13110% top0.5% 0.63254% top1% 1.24340%
[2026-10-07T18:42:02Z] hot-set p100767-attack-f8 items (flat control, the auditor's first view): f 0.1% S_f 0.30333% E_f(control) 0.13110% X_f +0.17223% X_f/f +1.7223 -> HOT SET
[2026-10-07T18:42:02Z] hot-set p100767-attack-f8 items (flat control, the auditor's first view): f 0.5% S_f 0.97981% E_f(control) 0.63254% X_f +0.34727% X_f/f +0.6945 -> no hot set
[2026-10-07T18:42:02Z] hot-set p100767-attack-f8 items (flat control, the auditor's first view): f 1.0% S_f 1.72538% E_f(control) 1.24340% X_f +0.48197% X_f/f +0.4820 -> no hot set
[2026-10-07T18:42:02Z] hot-set p100767-attack-f8 items (flat control, the auditor's first view): verdict FLAGGED
[2026-10-07T18:42:02Z] ratio p100767-attack-f8: top 0.1% / 0.5% / 1% share over the WINDOW-MODEL control 2.0455x / 1.3731x / 1.2321x (gate 1.2x at 0.1%: BEYOND); over the FLAT control 2.3137x / 1.5490x / 1.3876x
[2026-10-07T18:42:04Z] attribution: hot threshold count >= 257 marks 17034 items (0.1015% of items) holding 6579906 reads (0.3064% of reads); top 8 items t=0x000000:29355 t=0x200000:10052 t=0x300000:7871 t=0x180000:6131 t=0x100000:5820 t=0x080000:4658 t=0x380000:4570 t=0x0c0000:4558
[2026-10-07T18:42:43Z] attribution: reads on hot items per position (flat expectation 0.1015% of each position's 16777216 reads); the 24 largest: p6(it0 s6)=3.357% p38(it2 s6)=3.357% p102(it6 s6)=3.356% p54(it3 s6)=3.350% p22(it1 s6)=3.347% p70(it4 s6)=3.347% p86(it5 s6)=3.345% p118(it7 s6)=3.341% p23(it1 s7)=0.417% p87(it5 s7)=0.416% p55(it3 s7)=0.416% p119(it7 s7)=0.415% p39(it2 s7)=0.414% p7(it0 s7)=0.414% p71(it4 s7)=0.412% p103(it6 s7)=0.412% p107(it6 s11)=0.209% p0(it0 s0)=0.209% p63(it3 s15)=0.208% p11(it0 s11)=0.208% p96(it6 s0)=0.208% p127(it7 s15)=0.208% p75(it4 s11)=0.208% p47(it2 s15)=0.208%
[2026-10-07T18:42:43Z] attribution: hot reads by iteration it0=0.307% it1=0.306% it2=0.307% it3=0.307% it4=0.306% it5=0.306% it6=0.307% it7=0.306% ; by site s0=0.207% s1=0.103% s2=0.000% s3=0.103% s4=0.000% s5=0.000% s6=3.350% s7=0.414% s8=0.000% s9=0.000% s10=0.103% s11=0.207% s12=0.000% s13=0.103% s14=0.103% s15=0.207%
[2026-10-07T18:42:43Z] site 0 (instr 6, src r6, k_off 1 offset 0, window 2^23 items): share of its reads into the top 0.1% 0.2069% (flat expectation 0.1015%); index entropy 15.000 bits of 15 uniform-on-window; saturated source 0.0000%; largest 256-item bucket 0.0032% (window expectation 0.0031%)
[2026-10-07T18:42:43Z] site 1 (instr 9, src r7, k_off 0 offset 0, window 2^24 items): share of its reads into the top 0.1% 0.1027% (flat expectation 0.1015%); index entropy 16.000 bits of 16 uniform-on-window; saturated source 0.0000%; largest 256-item bucket 0.0017% (window expectation 0.0015%)
[2026-10-07T18:42:43Z] site 2 (instr 11, src r5, k_off 2 offset 1, window 2^22 items): share of its reads into the top 0.1% 0.0000% (flat expectation 0.1015%); index entropy 14.000 bits of 14 uniform-on-window; saturated source 0.0000%; largest 256-item bucket 0.0064% (window expectation 0.0061%)
[2026-10-07T18:42:43Z] site 3 (instr 12, src r3, k_off 0 offset 0, window 2^24 items): share of its reads into the top 0.1% 0.1033% (flat expectation 0.1015%); index entropy 16.000 bits of 16 uniform-on-window; saturated source 0.0000%; largest 256-item bucket 0.0017% (window expectation 0.0015%)
[2026-10-07T18:42:43Z] site 4 (instr 13, src r2, k_off 1 offset 1, window 2^23 items): share of its reads into the top 0.1% 0.0000% (flat expectation 0.1015%); index entropy 15.000 bits of 15 uniform-on-window; saturated source 0.0000%; largest 256-item bucket 0.0033% (window expectation 0.0031%)
[2026-10-07T18:42:43Z] site 5 (instr 19, src r4, k_off 1 offset 1, window 2^23 items): share of its reads into the top 0.1% 0.0000% (flat expectation 0.1015%); index entropy 15.000 bits of 15 uniform-on-window; saturated source 0.0000%; largest 256-item bucket 0.0033% (window expectation 0.0031%)
[2026-10-07T18:42:43Z] site 6 (instr 23, src r6, k_off 2 offset 0, window 2^22 items): share of its reads into the top 0.1% 3.3502% (flat expectation 0.1015%); index entropy 13.999 bits of 14 uniform-on-window; saturated source 0.0121%; largest 256-item bucket 0.0276% (window expectation 0.0061%)
[2026-10-07T18:42:43Z] site 7 (instr 32, src r0, k_off 2 offset 0, window 2^22 items): share of its reads into the top 0.1% 0.4144% (flat expectation 0.1015%); index entropy 14.000 bits of 14 uniform-on-window; saturated source 0.0000%; largest 256-item bucket 0.0064% (window expectation 0.0061%)
[2026-10-07T18:42:44Z] site 8 (instr 36, src r7, k_off 1 offset 1, window 2^23 items): share of its reads into the top 0.1% 0.0000% (flat expectation 0.1015%); index entropy 15.000 bits of 15 uniform-on-window; saturated source 0.0000%; largest 256-item bucket 0.0033% (window expectation 0.0031%)
[2026-10-07T18:42:44Z] site 9 (instr 39, src r7, k_off 1 offset 1, window 2^23 items): share of its reads into the top 0.1% 0.0000% (flat expectation 0.1015%); index entropy 15.000 bits of 15 uniform-on-window; saturated source 0.0000%; largest 256-item bucket 0.0032% (window expectation 0.0031%)
[2026-10-07T18:42:44Z] site 10 (instr 41, src r4, k_off 0 offset 0, window 2^24 items): share of its reads into the top 0.1% 0.1034% (flat expectation 0.1015%); index entropy 16.000 bits of 16 uniform-on-window; saturated source 0.0000%; largest 256-item bucket 0.0017% (window expectation 0.0015%)
[2026-10-07T18:42:44Z] site 11 (instr 45, src r5, k_off 1 offset 0, window 2^23 items): share of its reads into the top 0.1% 0.2073% (flat expectation 0.1015%); index entropy 15.000 bits of 15 uniform-on-window; saturated source 0.0000%; largest 256-item bucket 0.0033% (window expectation 0.0031%)
[2026-10-07T18:42:44Z] site 12 (instr 50, src r7, k_off 2 offset 3, window 2^22 items): share of its reads into the top 0.1% 0.0000% (flat expectation 0.1015%); index entropy 14.000 bits of 14 uniform-on-window; saturated source 0.0000%; largest 256-item bucket 0.0064% (window expectation 0.0061%)
[2026-10-07T18:42:44Z] site 13 (instr 58, src r3, k_off 0 offset 0, window 2^24 items): share of its reads into the top 0.1% 0.1035% (flat expectation 0.1015%); index entropy 16.000 bits of 16 uniform-on-window; saturated source 0.0000%; largest 256-item bucket 0.0017% (window expectation 0.0015%)
[2026-10-07T18:42:44Z] site 14 (instr 59, src r2, k_off 0 offset 0, window 2^24 items): share of its reads into the top 0.1% 0.1035% (flat expectation 0.1015%); index entropy 16.000 bits of 16 uniform-on-window; saturated source 0.0000%; largest 256-item bucket 0.0017% (window expectation 0.0015%)
[2026-10-07T18:42:44Z] site 15 (instr 63, src r1, k_off 1 offset 0, window 2^23 items): share of its reads into the top 0.1% 0.2071% (flat expectation 0.1015%); index entropy 15.000 bits of 15 uniform-on-window; saturated source 0.0000%; largest 256-item bucket 0.0033% (window expectation 0.0031%)
[2026-10-07T18:42:44Z] attribution: item 0x000000 (29355 reads) read from positions p22(it1 s6)x3741 p38(it2 s6)x3696 p118(it7 s6)x3694 p54(it3 s6)x3691 p86(it5 s6)x3669 p6(it0 s6)x3631 p102(it6 s6)x3583 p70(it4 s6)x3559 p71(it4 s7)x7 p10(it0 s10)x4 p31(it1 s15)x4 p55(it3 s7)x4
[2026-10-07T18:42:44Z] attribution: item 0x200000 (10052 reads) read from positions p54(it3 s6)x1271 p38(it2 s6)x1269 p6(it0 s6)x1259 p22(it1 s6)x1254 p118(it7 s6)x1253 p70(it4 s6)x1237 p86(it5 s6)x1208 p102(it6 s6)x1187 p87(it5 s7)x6 p48(it3 s0)x5 p63(it3 s15)x5 p71(it4 s7)x5
[2026-10-07T18:42:44Z] attribution: item 0x300000 (7871 reads) read from positions p6(it0 s6)x1020 p86(it5 s6)x1007 p38(it2 s6)x977 p70(it4 s6)x966 p102(it6 s6)x955 p54(it3 s6)x944 p118(it7 s6)x941 p22(it1 s6)x939 p39(it2 s7)x6 p71(it4 s7)x5 p103(it6 s7)x5 p112(it7 s0)x5
[2026-10-07T18:42:44Z] attribution: item 0x180000 (6131 reads) read from positions p54(it3 s6)x776 p70(it4 s6)x773 p102(it6 s6)x754 p22(it1 s6)x753 p6(it0 s6)x749 p86(it5 s6)x748 p38(it2 s6)x738 p118(it7 s6)x724 p7(it0 s7)x7 p55(it3 s7)x6 p103(it6 s7)x6 p43(it2 s11)x5
[2026-10-07T18:42:44Z] attribution: item 0x100000 (5820 reads) read from positions p70(it4 s6)x758 p86(it5 s6)x733 p54(it3 s6)x732 p6(it0 s6)x720 p22(it1 s6)x705 p102(it6 s6)x693 p38(it2 s6)x687 p118(it7 s6)x663 p55(it3 s7)x6 p95(it5 s15)x6 p103(it6 s7)x6 p127(it7 s15)x5
[2026-10-07T18:42:44Z] attribution: item 0x080000 (4658 reads) read from positions p70(it4 s6)x606 p6(it0 s6)x595 p102(it6 s6)x586 p54(it3 s6)x578 p38(it2 s6)x577 p22(it1 s6)x564 p118(it7 s6)x521 p86(it5 s6)x516 p71(it4 s7)x8 p39(it2 s7)x6 p48(it3 s0)x6 p55(it3 s7)x5
[2026-10-07T18:42:44Z] attribution: item 0x380000 (4570 reads) read from positions p70(it4 s6)x598 p54(it3 s6)x578 p86(it5 s6)x576 p118(it7 s6)x558 p22(it1 s6)x556 p102(it6 s6)x541 p6(it0 s6)x523 p38(it2 s6)x520 p47(it2 s15)x8 p7(it0 s7)x7 p16(it1 s0)x5 p17(it1 s1)x4
[2026-10-07T18:42:44Z] attribution: item 0x0c0000 (4558 reads) read from positions p86(it5 s6)x597 p70(it4 s6)x586 p102(it6 s6)x564 p38(it2 s6)x562 p118(it7 s6)x550 p22(it1 s6)x537 p54(it3 s6)x530 p6(it0 s6)x512 p23(it1 s7)x6 p107(it6 s11)x6 p47(it2 s15)x5 p63(it3 s15)x5
[2026-10-07T18:42:44Z] hottest item p100767-attack-f8 (0x000000): 29355 reads (0.0014% of all); predicted source site-instr6:r6:zero:last-writer-mad@4
[2026-10-07T18:42:44Z] program p100767-attack-f8 DONE: 16777216 nonces; 6-sigma (windowed) FLAGGED; hot-set FLAGGED; verdict FLAGGED
[2026-10-07T18:42:44Z] attack-f8 0.1.0 (igneum-pow 4); args ["warps", "--program", "100211", "--nonces", "16777216", "--threads", "32", "--out", "/srv/builds/_adv-adv-accept/live", "--validate", "sample", "--diag", "1"]
[2026-10-07T18:42:44Z] census warps: programs [100211] day 20730 nonces 16777216 threads 32 plant none validate sample check_every 997 diag true
[2026-10-07T18:42:45Z] day 20730: cache filled in 0.61 s, fnv 448274a57f508cbc
[2026-10-07T18:42:48Z] table: 16777216 items derived with their 8 lines in 3.3 s; library comparison sample (0 mismatches)
[2026-10-07T18:42:52Z] program p100211-attack-f8: epoch seed 3d4686b780097991a4600a0683fca3645e627c67edd53365c4131c7095ecc55d era seed 3e3a196a3504d573eee9656bffb7e3d2dffc03dc10f95f92fd08d0ab245641f7 id d07885a437e237c7 attempt 0 class mx8-eraa8bce51f+sh256x27 op mix load=16 xor=11 mul=10 add=7 mad=6 mulhi=4 shfl=4 rotl=3 or=1 rotr=1 sub=1; era stride mul 0x4babb2b7 rot 31 interleave [1, 6, 8, 13] windows 3:1:1 4:1:0 7:0:0 15:2:0 17:2:2 23:0:0 24:1:0 27:2:3 29:2:1 31:1:0 35:0:0 41:1:0 44:2:1 49:0:0 61:2:1 63:1:0
[2026-10-07T18:42:52Z] load site instr 3: src r4 win 1 off 1; last base writer xor at 2; writers back to the last injecting one: xor@2; shadow writes of r4 per rep: add=6 mad=2 mul=4 mulhi=7 or=1 rotl=6 rotr=5 shfl=3 sub=3 xor=5
[2026-10-07T18:42:52Z] load site instr 4: src r0 win 1 off 0; last base writer load at 3; writers back to the last injecting one: load@3; shadow writes of r0 per rep: add=5 mad=4 mul=5 mulhi=1 or=1 rotl=2 rotr=6 shfl=3 sub=6 xor=4
[2026-10-07T18:42:52Z] load site instr 7: src r2 win 0 off 0; last base writer load at 4; writers back to the last injecting one: load@4; shadow writes of r2 per rep: add=5 mad=4 mul=3 mulhi=1 or=2 rotl=2 rotr=3 shfl=1 sub=3 xor=9
[2026-10-07T18:42:52Z] load site instr 15: src r4 win 2 off 0; last base writer mad at 12; writers back to the last injecting one: mad@12; shadow writes of r4 per rep: add=6 mad=2 mul=4 mulhi=7 or=1 rotl=6 rotr=5 shfl=3 sub=3 xor=5
[2026-10-07T18:42:52Z] load site instr 17: src r3 win 2 off 2; last base writer load at 15; writers back to the last injecting one: load@15; shadow writes of r3 per rep: add=4 mad=1 mul=1 mulhi=2 or=1 rotl=4 rotr=2 shfl=4 sub=1 xor=3
[2026-10-07T18:42:52Z] load site instr 23: src r0 win 0 off 0; last base writer xor at 13; writers back to the last injecting one: xor@13; shadow writes of r0 per rep: add=5 mad=4 mul=5 mulhi=1 or=1 rotl=2 rotr=6 shfl=3 sub=6 xor=4
[2026-10-07T18:42:52Z] load site instr 24: src r7 win 1 off 0; last base writer shfl at 16; writers back to the last injecting one: shfl@16; shadow writes of r7 per rep: add=2 mad=4 mul=3 mulhi=1 or=1 rotl=5 rotr=4 shfl=2 sub=1 xor=4
[2026-10-07T18:42:52Z] load site instr 27: src r5 win 2 off 3; last base writer load at 24; writers back to the last injecting one: load@24; shadow writes of r5 per rep: add=3 mad=5 mul=1 mulhi=2 or=1 rotl=3 rotr=2 shfl=6 sub=1 xor=5
[2026-10-07T18:42:52Z] load site instr 29: src r2 win 2 off 1; last base writer load at 27; writers back to the last injecting one: load@27; shadow writes of r2 per rep: add=5 mad=4 mul=3 mulhi=1 or=2 rotl=2 rotr=3 shfl=1 sub=3 xor=9
[2026-10-07T18:42:52Z] load site instr 31: src r6 win 1 off 0; last base writer xor at 30; writers back to the last injecting one: xor@30; shadow writes of r6 per rep: add=5 mad=4 mul=5 mulhi=2 or=1 rotl=3 rotr=3 shfl=1 sub=4 xor=4
[2026-10-07T18:42:52Z] load site instr 35: src r7 win 0 off 0; last base writer rotl at 33; writers back to the last injecting one: rotl@33 shfl@16; shadow writes of r7 per rep: add=2 mad=4 mul=3 mulhi=1 or=1 rotl=5 rotr=4 shfl=2 sub=1 xor=4
[2026-10-07T18:42:52Z] load site instr 41: src r1 win 1 off 0; last base writer add at 40; writers back to the last injecting one: add@40; shadow writes of r1 per rep: add=3 mad=3 mul=3 mulhi=2 or=3 rotl=5 rotr=2 shfl=5 sub=2 xor=5
[2026-10-07T18:42:52Z] load site instr 44: src r5 win 2 off 1; last base writer load at 35; writers back to the last injecting one: load@35; shadow writes of r5 per rep: add=3 mad=5 mul=1 mulhi=2 or=1 rotl=3 rotr=2 shfl=6 sub=1 xor=5
[2026-10-07T18:42:52Z] load site instr 49: src r4 win 0 off 0; last base writer load at 44; writers back to the last injecting one: load@44; shadow writes of r4 per rep: add=6 mad=2 mul=4 mulhi=7 or=1 rotl=6 rotr=5 shfl=3 sub=3 xor=5
[2026-10-07T18:42:52Z] load site instr 61: src r3 win 2 off 1; last base writer xor at 58; writers back to the last injecting one: xor@58; shadow writes of r3 per rep: add=4 mad=1 mul=1 mulhi=2 or=1 rotl=4 rotr=2 shfl=4 sub=1 xor=3
[2026-10-07T18:42:52Z] load site instr 63: src r4 win 1 off 0; last base writer shfl at 62; writers back to the last injecting one: shfl@62; shadow writes of r4 per rep: add=6 mad=2 mul=4 mulhi=7 or=1 rotl=6 rotr=5 shfl=3 sub=3 xor=5
[2026-10-07T18:42:52Z] window layer: site item windows (first, items) (0x800000,2^23) (0x0,2^23) (0x0,2^24) (0x0,2^22) (0x800000,2^22) (0x0,2^24) (0x0,2^23) (0xc00000,2^22) (0x400000,2^22) (0x0,2^23) (0x0,2^24) (0x0,2^23) (0x400000,2^22) (0x0,2^24) (0x400000,2^22) (0x0,2^23); expected reads per item by quarter 144.000 208.000 80.000 80.000 (flat uniform 128.000)
[2026-10-07T18:44:07Z] 524288 warps (16777216 nonces) interpreted in 74.7 s (4.559 ms per warp per thread); Epoch::hash_warp agreement on 589 warps: 0 mismatches
[2026-10-07T18:44:07Z] p100211-attack-f8 distinct lines per hash: n 16777216 min 1007 p1 1023 median 1024 p99 1024 max 1024 mean 1023.8708
[2026-10-07T18:44:07Z] p100211-attack-f8 distinct items per hash: n 16777216 min 126 p1 128 median 128 p99 128 max 128 mean 127.9994
[2026-10-07T18:44:07Z] p100211-attack-f8 distinct lines per warp: n 524288 min 32563 p1 32604 median 32636 p99 32664 max 32688 mean 32635.6824
[2026-10-07T18:44:07Z] p100211-attack-f8 distinct items per warp: n 524288 min 4089 p1 4093 median 4096 p99 4096 max 4096 mean 4095.4103
[2026-10-07T18:44:07Z] uniform expectation: distinct lines per hash 1023.875 of 1024 reads, per warp 32640.3 of 32768 reads (2^22 lines); distinct items per hash 127.9995 of 128, per warp 4095.50 of 4096 (2^24 items)
[2026-10-07T18:44:07Z] positions: largest hi16-bucket (256 items) share 0.0195% at p73 (iteration 4, site 9, instr 31); windowed expectation 0.0031%; largest saturated-source share 0.0000% at p0 (site 0, instr 3)
[2026-10-07T18:44:07Z] acceptance-style (2,048 evaluations, the rule's sample size): the most repeated address at one position 2 of 2048 at p9 (site 9, instr 31); saturated sources at one position 0 of 2048 at p0 (site 0, instr 3); uniform expectation: repeats 1 to 2, saturated 0
[2026-10-07T18:44:07Z] p100211-attack-f8 item histogram (flat): bins 16777216 reads 2147483648 mean 128.000 sigma 11.314 max 21573 (bin 4539781) z_max +1895.49 min 38 z_min -7.95 chi2/dof 23.98837 chi2_z +66581.44 top0.1% 0.26258% top0.5% 1.05774% top1% 2.00267%
[2026-10-07T18:44:07Z] p100211-attack-f8 item histogram against the window density: full 2^24 chi2/dof 1.73535 largest 21573 (item 0x454585) at +1481.40 sigma smallest at -5.00; buckets64 chi2/dof 1.51613 largest 34728 (bucket 70934) at +185.62 sigma smallest at -4.64
[2026-10-07T18:44:11Z] p100211-attack-f8 WINDOWED CONTROL item histogram (flat): bins 16777216 reads 2147483648 mean 128.000 sigma 11.314 max 287 (bin 6586432) z_max +14.05 min 37 z_min -8.04 chi2/dof 22.99924 chi2_z +63716.59 top0.1% 0.19690% top0.5% 0.95201% top1% 1.87250%
[2026-10-07T18:44:11Z] p100211-attack-f8 WINDOWED CONTROL against the window density: full chi2/dof 1.00032 largest +5.93 sigma; buckets64 chi2/dof 1.00195 largest +4.36 smallest -4.67
[2026-10-07T18:44:11Z] 6-sigma p100211-attack-f8 items buckets64 against the window density: largest bucket +185.62 sigma, smallest -4.64 -> FLAGGED (beyond 6 sigma)
[2026-10-07T18:44:11Z] hot-set p100211-attack-f8 items (windowed control): f 0.1% S_f 0.26258% E_f(control) 0.19690% X_f +0.06568% X_f/f +0.6568 -> no hot set
[2026-10-07T18:44:11Z] hot-set p100211-attack-f8 items (windowed control): f 0.5% S_f 1.05774% E_f(control) 0.95201% X_f +0.10573% X_f/f +0.2115 -> no hot set
[2026-10-07T18:44:11Z] hot-set p100211-attack-f8 items (windowed control): f 1.0% S_f 2.00267% E_f(control) 1.87250% X_f +0.13017% X_f/f +0.1302 -> no hot set
[2026-10-07T18:44:11Z] hot-set p100211-attack-f8 items (windowed control): verdict clear
[2026-10-07T18:44:15Z] p100211-attack-f8 FLAT CONTROL item histogram: bins 16777216 reads 2147483648 mean 128.000 sigma 11.314 max 198 (bin 1102678) z_max +6.19 min 75 z_min -4.68 chi2/dof 1.00051 chi2_z +1.47 top0.1% 0.13106% top0.5% 0.63248% top1% 1.24340%
[2026-10-07T18:44:15Z] hot-set p100211-attack-f8 items (flat control, the auditor's first view): f 0.1% S_f 0.26258% E_f(control) 0.13106% X_f +0.13152% X_f/f +1.3152 -> HOT SET
[2026-10-07T18:44:15Z] hot-set p100211-attack-f8 items (flat control, the auditor's first view): f 0.5% S_f 1.05774% E_f(control) 0.63248% X_f +0.42526% X_f/f +0.8505 -> no hot set
[2026-10-07T18:44:15Z] hot-set p100211-attack-f8 items (flat control, the auditor's first view): f 1.0% S_f 2.00267% E_f(control) 1.24340% X_f +0.75927% X_f/f +0.7593 -> no hot set
[2026-10-07T18:44:15Z] hot-set p100211-attack-f8 items (flat control, the auditor's first view): verdict FLAGGED
[2026-10-07T18:44:15Z] ratio p100211-attack-f8: top 0.1% / 0.5% / 1% share over the WINDOW-MODEL control 1.3336x / 1.1111x / 1.0695x (gate 1.2x at 0.1%: BEYOND); over the FLAT control 2.0035x / 1.6724x / 1.6106x
[2026-10-07T18:44:16Z] attribution: hot threshold count >= 272 marks 17479 items (0.1042% of items) holding 5829845 reads (0.2715% of reads); top 8 items t=0x454585:21573 t=0x0a8b68:14417 t=0x151292:9582 t=0x054585:7291 t=0x2a2544:6445 t=0x654585:4996 t=0x4a8b68:4955 t=0x254585:4950
[2026-10-07T18:44:51Z] attribution: reads on hot items per position (flat expectation 0.1042% of each position's 16777216 reads); the 24 largest: p73(it4 s9)=1.882% p9(it0 s9)=1.881% p121(it7 s9)=1.879% p25(it1 s9)=1.876% p57(it3 s9)=1.876% p89(it5 s9)=1.874% p105(it6 s9)=1.873% p41(it2 s9)=1.873% p94(it5 s14)=0.368% p62(it3 s14)=0.368% p44(it2 s12)=0.367% p126(it7 s14)=0.367% p60(it3 s12)=0.367% p56(it3 s8)=0.367% p14(it0 s14)=0.367% p88(it5 s8)=0.367% p104(it6 s8)=0.367% p110(it6 s14)=0.366% p72(it4 s8)=0.366% p46(it2 s14)=0.366% p78(it4 s14)=0.366% p76(it4 s12)=0.366% p12(it0 s12)=0.366% p28(it1 s12)=0.365%
[2026-10-07T18:44:51Z] attribution: hot reads by iteration it0=0.272% it1=0.271% it2=0.271% it3=0.272% it4=0.272% it5=0.271% it6=0.272% it7=0.272% ; by site s0=0.000% s1=0.216% s2=0.108% s3=0.068% s4=0.000% s5=0.109% s6=0.217% s7=0.000% s8=0.365% s9=1.877% s10=0.109% s11=0.217% s12=0.366% s13=0.109% s14=0.367% s15=0.218%
[2026-10-07T18:44:51Z] site 0 (instr 3, src r4, k_off 1 offset 1, window 2^23 items): share of its reads into the top 0.1% 0.0000% (flat expectation 0.1042%); index entropy 15.000 bits of 15 uniform-on-window; saturated source 0.0000%; largest 256-item bucket 0.0032% (window expectation 0.0031%)
[2026-10-07T18:44:51Z] site 1 (instr 4, src r0, k_off 1 offset 0, window 2^23 items): share of its reads into the top 0.1% 0.2158% (flat expectation 0.1042%); index entropy 15.000 bits of 15 uniform-on-window; saturated source 0.0000%; largest 256-item bucket 0.0032% (window expectation 0.0031%)
[2026-10-07T18:44:51Z] site 2 (instr 7, src r2, k_off 0 offset 0, window 2^24 items): share of its reads into the top 0.1% 0.1084% (flat expectation 0.1042%); index entropy 16.000 bits of 16 uniform-on-window; saturated source 0.0000%; largest 256-item bucket 0.0017% (window expectation 0.0015%)
[2026-10-07T18:44:51Z] site 3 (instr 15, src r4, k_off 2 offset 0, window 2^22 items): share of its reads into the top 0.1% 0.0677% (flat expectation 0.1042%); index entropy 14.000 bits of 14 uniform-on-window; saturated source 0.0000%; largest 256-item bucket 0.0064% (window expectation 0.0061%)
[2026-10-07T18:44:51Z] site 4 (instr 17, src r3, k_off 2 offset 2, window 2^22 items): share of its reads into the top 0.1% 0.0000% (flat expectation 0.1042%); index entropy 14.000 bits of 14 uniform-on-window; saturated source 0.0000%; largest 256-item bucket 0.0064% (window expectation 0.0061%)
[2026-10-07T18:44:51Z] site 5 (instr 23, src r0, k_off 0 offset 0, window 2^24 items): share of its reads into the top 0.1% 0.1088% (flat expectation 0.1042%); index entropy 16.000 bits of 16 uniform-on-window; saturated source 0.0000%; largest 256-item bucket 0.0017% (window expectation 0.0015%)
[2026-10-07T18:44:51Z] site 6 (instr 24, src r7, k_off 1 offset 0, window 2^23 items): share of its reads into the top 0.1% 0.2168% (flat expectation 0.1042%); index entropy 15.000 bits of 15 uniform-on-window; saturated source 0.0000%; largest 256-item bucket 0.0033% (window expectation 0.0031%)
[2026-10-07T18:44:51Z] site 7 (instr 27, src r5, k_off 2 offset 3, window 2^22 items): share of its reads into the top 0.1% 0.0000% (flat expectation 0.1042%); index entropy 14.000 bits of 14 uniform-on-window; saturated source 0.0000%; largest 256-item bucket 0.0064% (window expectation 0.0061%)
[2026-10-07T18:44:51Z] site 8 (instr 29, src r2, k_off 2 offset 1, window 2^22 items): share of its reads into the top 0.1% 0.3652% (flat expectation 0.1042%); index entropy 14.000 bits of 14 uniform-on-window; saturated source 0.0000%; largest 256-item bucket 0.0064% (window expectation 0.0061%)
[2026-10-07T18:44:51Z] site 9 (instr 31, src r6, k_off 1 offset 0, window 2^23 items): share of its reads into the top 0.1% 1.8765% (flat expectation 0.1042%); index entropy 14.999 bits of 15 uniform-on-window; saturated source 0.0000%; largest 256-item bucket 0.0189% (window expectation 0.0031%)
[2026-10-07T18:44:51Z] site 10 (instr 35, src r7, k_off 0 offset 0, window 2^24 items): share of its reads into the top 0.1% 0.1088% (flat expectation 0.1042%); index entropy 16.000 bits of 16 uniform-on-window; saturated source 0.0000%; largest 256-item bucket 0.0017% (window expectation 0.0015%)
[2026-10-07T18:44:51Z] site 11 (instr 41, src r1, k_off 1 offset 0, window 2^23 items): share of its reads into the top 0.1% 0.2172% (flat expectation 0.1042%); index entropy 15.000 bits of 15 uniform-on-window; saturated source 0.0000%; largest 256-item bucket 0.0033% (window expectation 0.0031%)
[2026-10-07T18:44:51Z] site 12 (instr 44, src r5, k_off 2 offset 1, window 2^22 items): share of its reads into the top 0.1% 0.3656% (flat expectation 0.1042%); index entropy 14.000 bits of 14 uniform-on-window; saturated source 0.0000%; largest 256-item bucket 0.0063% (window expectation 0.0061%)
[2026-10-07T18:44:51Z] site 13 (instr 49, src r4, k_off 0 offset 0, window 2^24 items): share of its reads into the top 0.1% 0.1086% (flat expectation 0.1042%); index entropy 16.000 bits of 16 uniform-on-window; saturated source 0.0000%; largest 256-item bucket 0.0017% (window expectation 0.0015%)
[2026-10-07T18:44:51Z] site 14 (instr 61, src r3, k_off 2 offset 1, window 2^22 items): share of its reads into the top 0.1% 0.3666% (flat expectation 0.1042%); index entropy 14.000 bits of 14 uniform-on-window; saturated source 0.0000%; largest 256-item bucket 0.0064% (window expectation 0.0061%)
[2026-10-07T18:44:51Z] site 15 (instr 63, src r4, k_off 1 offset 0, window 2^23 items): share of its reads into the top 0.1% 0.2175% (flat expectation 0.1042%); index entropy 15.000 bits of 15 uniform-on-window; saturated source 0.0000%; largest 256-item bucket 0.0032% (window expectation 0.0031%)
[2026-10-07T18:44:51Z] attribution: item 0x454585 (21573 reads) read from positions p73(it4 s9)x2770 p121(it7 s9)x2696 p25(it1 s9)x2685 p9(it0 s9)x2684 p105(it6 s9)x2650 p41(it2 s9)x2643 p57(it3 s9)x2630 p89(it5 s9)x2626 p24(it1 s8)x8 p110(it6 s14)x7 p94(it5 s14)x6 p8(it0 s8)x5
[2026-10-07T18:44:51Z] attribution: item 0x0a8b68 (14417 reads) read from positions p9(it0 s9)x1830 p73(it4 s9)x1820 p41(it2 s9)x1792 p121(it7 s9)x1787 p89(it5 s9)x1786 p57(it3 s9)x1777 p105(it6 s9)x1775 p25(it1 s9)x1730 p6(it0 s6)x5 p95(it5 s15)x5 p11(it0 s11)x4 p22(it1 s6)x4
[2026-10-07T18:44:51Z] attribution: item 0x151292 (9582 reads) read from positions p121(it7 s9)x1242 p41(it2 s9)x1214 p57(it3 s9)x1204 p73(it4 s9)x1187 p89(it5 s9)x1181 p9(it0 s9)x1169 p25(it1 s9)x1133 p105(it6 s9)x1124 p115(it7 s3)x6 p35(it2 s3)x5 p63(it3 s15)x5 p65(it4 s1)x5
[2026-10-07T18:44:51Z] attribution: item 0x054585 (7291 reads) read from positions p9(it0 s9)x913 p73(it4 s9)x909 p25(it1 s9)x903 p105(it6 s9)x900 p41(it2 s9)x896 p57(it3 s9)x889 p121(it7 s9)x878 p89(it5 s9)x875 p115(it7 s3)x7 p3(it0 s3)x5 p37(it2 s5)x5 p33(it2 s1)x5
[2026-10-07T18:44:51Z] attribution: item 0x2a2544 (6445 reads) read from positions p57(it3 s9)x828 p121(it7 s9)x827 p41(it2 s9)x813 p89(it5 s9)x803 p105(it6 s9)x782 p73(it4 s9)x764 p9(it0 s9)x759 p25(it1 s9)x755 p31(it1 s15)x7 p33(it2 s1)x5 p58(it3 s10)x5 p97(it6 s1)x5
[2026-10-07T18:44:51Z] attribution: item 0x654585 (4996 reads) read from positions p121(it7 s9)x628 p25(it1 s9)x621 p89(it5 s9)x608 p41(it2 s9)x603 p9(it0 s9)x602 p57(it3 s9)x589 p105(it6 s9)x583 p73(it4 s9)x577 p110(it6 s14)x9 p91(it5 s11)x7 p24(it1 s8)x6 p44(it2 s12)x6
[2026-10-07T18:44:51Z] attribution: item 0x4a8b68 (4955 reads) read from positions p25(it1 s9)x630 p121(it7 s9)x604 p9(it0 s9)x598 p41(it2 s9)x593 p57(it3 s9)x591 p89(it5 s9)x582 p105(it6 s9)x577 p73(it4 s9)x569 p40(it2 s8)x11 p24(it1 s8)x7 p62(it3 s14)x6 p124(it7 s12)x5
[2026-10-07T18:44:51Z] attribution: item 0x254585 (4950 reads) read from positions p73(it4 s9)x650 p41(it2 s9)x607 p9(it0 s9)x603 p25(it1 s9)x600 p105(it6 s9)x600 p57(it3 s9)x593 p121(it7 s9)x591 p89(it5 s9)x572 p51(it3 s3)x7 p3(it0 s3)x6 p115(it7 s3)x6 p127(it7 s15)x5
[2026-10-07T18:44:51Z] hottest item p100211-attack-f8 (0x454585): 21573 reads (0.0010% of all); predicted source site-instr4:r0:one-zero-bit:last-writer-load@3
[2026-10-07T18:44:51Z] program p100211-attack-f8 DONE: 16777216 nonces; 6-sigma (windowed) FLAGGED; hot-set clear; verdict FLAGGED
[2026-10-07T18:44:52Z] attack-f8 0.1.0 (igneum-pow 4); args ["warps", "--program", "100064", "--nonces", "16777216", "--threads", "32", "--out", "/srv/builds/_adv-adv-accept/live", "--validate", "sample", "--diag", "1"]
[2026-10-07T18:44:52Z] census warps: programs [100064] day 20730 nonces 16777216 threads 32 plant none validate sample check_every 997 diag true
[2026-10-07T18:44:52Z] day 20730: cache filled in 0.67 s, fnv 448274a57f508cbc
[2026-10-07T18:44:56Z] table: 16777216 items derived with their 8 lines in 2.8 s; library comparison sample (0 mismatches)
[2026-10-07T18:45:00Z] program p100064-attack-f8: epoch seed 96bc342fb24875e10a17d093c27cdfe28c4293bfb4e0c96bc302de885e195a89 era seed a860aa82556a6f86d2b45818c33f274427428086c50c5d5b3f7101128c289bdf id 2442abf9d56f6611 attempt 2 class mx8-eraa210d1bd+sh256x27 op mix load=16 sub=9 add=7 xor=7 mul=5 rotl=5 mad=4 rotr=4 shfl=4 or=2 mulhi=1; era stride mul 0x82b69d5d rot 9 interleave [7, 8, 9, 12] windows 2:1:0 9:0:0 10:1:0 15:1:1 16:0:0 20:2:2 21:0:0 25:0:0 28:1:1 30:0:0 31:0:0 33:2:1 34:1:1 35:0:0 41:1:0 51:1:0
[2026-10-07T18:45:00Z] load site instr 2: src r5 win 1 off 0; last base writer rotl at 0; writers back to the last injecting one: rotl@0 xor@62; shadow writes of r5 per rep: add=9 mad=7 mul=1 mulhi=2 or=1 rotl=6 rotr=2 shfl=2 sub=3 xor=6
[2026-10-07T18:45:00Z] load site instr 9: src r1 win 0 off 0; last base writer load at 2; writers back to the last injecting one: load@2; shadow writes of r1 per rep: add=4 mad=2 mul=5 mulhi=1 or=3 rotr=4 shfl=4 sub=3 xor=1
[2026-10-07T18:45:00Z] load site instr 10: src r6 win 1 off 0; last base writer sub at 8; writers back to the last injecting one: sub@8; shadow writes of r6 per rep: add=8 mad=5 mul=2 mulhi=1 or=3 rotl=2 rotr=5 shfl=1 sub=2 xor=1
[2026-10-07T18:45:00Z] load site instr 15: src r6 win 1 off 1; last base writer shfl at 14; writers back to the last injecting one: shfl@14; shadow writes of r6 per rep: add=8 mad=5 mul=2 mulhi=1 or=3 rotl=2 rotr=5 shfl=1 sub=2 xor=1
[2026-10-07T18:45:00Z] load site instr 16: src r7 win 0 off 0; last base writer shfl at 13; writers back to the last injecting one: shfl@13; shadow writes of r7 per rep: add=7 mul=5 mulhi=1 rotl=2 rotr=7 shfl=5 sub=1 xor=4
[2026-10-07T18:45:00Z] load site instr 20: src r2 win 2 off 2; last base writer load at 16; writers back to the last injecting one: load@16; shadow writes of r2 per rep: add=6 mad=1 mul=2 mulhi=1 or=1 rotl=2 rotr=3 shfl=5 sub=5 xor=1
[2026-10-07T18:45:00Z] load site instr 21: src r6 win 0 off 0; last base writer load at 20; writers back to the last injecting one: load@20; shadow writes of r6 per rep: add=8 mad=5 mul=2 mulhi=1 or=3 rotl=2 rotr=5 shfl=1 sub=2 xor=1
[2026-10-07T18:45:00Z] load site instr 25: src r5 win 0 off 0; last base writer load at 10; writers back to the last injecting one: load@10; shadow writes of r5 per rep: add=9 mad=7 mul=1 mulhi=2 or=1 rotl=6 rotr=2 shfl=2 sub=3 xor=6
[2026-10-07T18:45:00Z] load site instr 28: src r2 win 1 off 1; last base writer xor at 26; writers back to the last injecting one: xor@26; shadow writes of r2 per rep: add=6 mad=1 mul=2 mulhi=1 or=1 rotl=2 rotr=3 shfl=5 sub=5 xor=1
[2026-10-07T18:45:00Z] load site instr 30: src r7 win 0 off 0; last base writer load at 28; writers back to the last injecting one: load@28; shadow writes of r7 per rep: add=7 mul=5 mulhi=1 rotl=2 rotr=7 shfl=5 sub=1 xor=4
[2026-10-07T18:45:00Z] load site instr 31: src r4 win 0 off 0; last base writer load at 25; writers back to the last injecting one: load@25; shadow writes of r4 per rep: add=6 mad=3 mul=2 mulhi=4 rotl=4 rotr=4 shfl=3 sub=6 xor=4
[2026-10-07T18:45:00Z] load site instr 33: src r0 win 2 off 1; last base writer mad at 27; writers back to the last injecting one: mad@27; shadow writes of r0 per rep: add=7 mad=1 mul=4 mulhi=2 or=2 rotl=2 rotr=4 shfl=2 sub=3 xor=2
[2026-10-07T18:45:00Z] load site instr 34: src r7 win 1 off 1; last base writer load at 33; writers back to the last injecting one: load@33; shadow writes of r7 per rep: add=7 mul=5 mulhi=1 rotl=2 rotr=7 shfl=5 sub=1 xor=4
[2026-10-07T18:45:00Z] load site instr 35: src r5 win 0 off 0; last base writer load at 34; writers back to the last injecting one: load@34; shadow writes of r5 per rep: add=9 mad=7 mul=1 mulhi=2 or=1 rotl=6 rotr=2 shfl=2 sub=3 xor=6
[2026-10-07T18:45:00Z] load site instr 41: src r2 win 1 off 0; last base writer add at 37; writers back to the last injecting one: add@37; shadow writes of r2 per rep: add=6 mad=1 mul=2 mulhi=1 or=1 rotl=2 rotr=3 shfl=5 sub=5 xor=1
[2026-10-07T18:45:00Z] load site instr 51: src r0 win 1 off 0; last base writer rotl at 46; writers back to the last injecting one: rotl@46 mad@27; shadow writes of r0 per rep: add=7 mad=1 mul=4 mulhi=2 or=2 rotl=2 rotr=4 shfl=2 sub=3 xor=2
[2026-10-07T18:45:00Z] window layer: site item windows (first, items) (0x0,2^23) (0x0,2^24) (0x0,2^23) (0x800000,2^23) (0x0,2^24) (0x800000,2^22) (0x0,2^24) (0x0,2^24) (0x800000,2^23) (0x0,2^24) (0x0,2^24) (0x400000,2^22) (0x800000,2^23) (0x0,2^24) (0x0,2^23) (0x0,2^23); expected reads per item by quarter 120.000 152.000 136.000 104.000 (flat uniform 128.000)
[2026-10-07T18:46:26Z] 524288 warps (16777216 nonces) interpreted in 86.1 s (5.254 ms per warp per thread); Epoch::hash_warp agreement on 589 warps: 0 mismatches
[2026-10-07T18:46:26Z] p100064-attack-f8 distinct lines per hash: n 16777216 min 1008 p1 1023 median 1024 p99 1024 max 1024 mean 1023.8713
[2026-10-07T18:46:26Z] p100064-attack-f8 distinct items per hash: n 16777216 min 126 p1 128 median 128 p99 128 max 128 mean 127.9995
[2026-10-07T18:46:26Z] p100064-attack-f8 distinct lines per warp: n 524288 min 32568 p1 32605 median 32637 p99 32664 max 32694 mean 32636.2220
[2026-10-07T18:46:26Z] p100064-attack-f8 distinct items per warp: n 524288 min 4090 p1 4093 median 4096 p99 4096 max 4096 mean 4095.4813
[2026-10-07T18:46:26Z] uniform expectation: distinct lines per hash 1023.875 of 1024 reads, per warp 32640.3 of 32768 reads (2^22 lines); distinct items per hash 127.9995 of 128, per warp 4095.50 of 4096 (2^24 items)
[2026-10-07T18:46:26Z] positions: largest hi16-bucket (256 items) share 0.0476% at p107 (iteration 6, site 11, instr 33); windowed expectation 0.0061%; largest saturated-source share 0.0000% at p91 (site 11, instr 33)
[2026-10-07T18:46:26Z] acceptance-style (2,048 evaluations, the rule's sample size): the most repeated address at one position 2 of 2048 at p5 (site 5, instr 20); saturated sources at one position 0 of 2048 at p0 (site 0, instr 2); uniform expectation: repeats 1 to 2, saturated 0
[2026-10-07T18:46:26Z] p100064-attack-f8 item histogram (flat): bins 16777216 reads 2147483648 mean 128.000 sigma 11.314 max 696 (bin 4194316) z_max +50.20 min 54 z_min -6.54 chi2/dof 5.44889 chi2_z +12885.36 top0.1% 0.24244% top0.5% 1.01728% top1% 1.88639%
[2026-10-07T18:46:26Z] p100064-attack-f8 item histogram against the window density: full 2^24 chi2/dof 2.73021 largest 696 (item 0x40000c) at +44.12 sigma smallest at -6.16; buckets64 chi2/dof 111.72983 largest 40049 (bucket 65536) at +307.42 sigma smallest at -21.33
[2026-10-07T18:46:30Z] p100064-attack-f8 WINDOWED CONTROL item histogram (flat): bins 16777216 reads 2147483648 mean 128.000 sigma 11.314 max 221 (bin 5635400) z_max +8.22 min 58 z_min -6.19 chi2/dof 3.50075 chi2_z +7242.94 top0.1% 0.14832% top0.5% 0.71374% top1% 1.40048%
[2026-10-07T18:46:30Z] p100064-attack-f8 WINDOWED CONTROL against the window density: full chi2/dof 1.00059 largest +5.93 sigma; buckets64 chi2/dof 0.99822 largest +5.04 smallest -4.62
[2026-10-07T18:46:30Z] 6-sigma p100064-attack-f8 items buckets64 against the window density: largest bucket +307.42 sigma, smallest -21.33 -> FLAGGED (beyond 6 sigma)
[2026-10-07T18:46:30Z] hot-set p100064-attack-f8 items (windowed control): f 0.1% S_f 0.24244% E_f(control) 0.14832% X_f +0.09412% X_f/f +0.9412 -> no hot set
[2026-10-07T18:46:30Z] hot-set p100064-attack-f8 items (windowed control): f 0.5% S_f 1.01728% E_f(control) 0.71374% X_f +0.30354% X_f/f +0.6071 -> no hot set
[2026-10-07T18:46:30Z] hot-set p100064-attack-f8 items (windowed control): f 1.0% S_f 1.88639% E_f(control) 1.40048% X_f +0.48591% X_f/f +0.4859 -> no hot set
[2026-10-07T18:46:30Z] hot-set p100064-attack-f8 items (windowed control): verdict clear
[2026-10-07T18:46:33Z] p100064-attack-f8 FLAT CONTROL item histogram: bins 16777216 reads 2147483648 mean 128.000 sigma 11.314 max 194 (bin 1637841) z_max +5.83 min 66 z_min -5.48 chi2/dof 0.99961 chi2_z -1.14 top0.1% 0.13104% top0.5% 0.63240% top1% 1.24325%
[2026-10-07T18:46:33Z] hot-set p100064-attack-f8 items (flat control, the auditor's first view): f 0.1% S_f 0.24244% E_f(control) 0.13104% X_f +0.11140% X_f/f +1.1140 -> HOT SET
[2026-10-07T18:46:33Z] hot-set p100064-attack-f8 items (flat control, the auditor's first view): f 0.5% S_f 1.01728% E_f(control) 0.63240% X_f +0.38488% X_f/f +0.7698 -> no hot set
[2026-10-07T18:46:33Z] hot-set p100064-attack-f8 items (flat control, the auditor's first view): f 1.0% S_f 1.88639% E_f(control) 1.24325% X_f +0.64314% X_f/f +0.6431 -> no hot set
[2026-10-07T18:46:33Z] hot-set p100064-attack-f8 items (flat control, the auditor's first view): verdict FLAGGED
[2026-10-07T18:46:33Z] ratio p100064-attack-f8: top 0.1% / 0.5% / 1% share over the WINDOW-MODEL control 1.6346x / 1.4253x / 1.3470x (gate 1.2x at 0.1%: BEYOND); over the FLAT control 1.8501x / 1.6086x / 1.5173x
[2026-10-07T18:46:35Z] attribution: hot threshold count >= 275 marks 16882 items (0.1006% of items) holding 5235286 reads (0.2438% of reads); top 8 items t=0x40000c:696 t=0x400051:686 t=0x400034:681 t=0x400079:677 t=0x40005a:673 t=0x400015:672 t=0x400006:670 t=0x400026:669
[2026-10-07T18:46:59Z] attribution: reads on hot items per position (flat expectation 0.1006% of each position's 16777216 reads); the 24 largest: p27(it1 s11)=2.203% p107(it6 s11)=2.203% p91(it5 s11)=2.200% p43(it2 s11)=2.199% p59(it3 s11)=2.197% p123(it7 s11)=2.196% p75(it4 s11)=2.194% p11(it0 s11)=2.147% p111(it6 s15)=0.351% p95(it5 s15)=0.351% p47(it2 s15)=0.351% p79(it4 s15)=0.349% p31(it1 s15)=0.349% p63(it3 s15)=0.349% p127(it7 s15)=0.348% p15(it0 s15)=0.347% p126(it7 s14)=0.212% p50(it3 s2)=0.211% p82(it5 s2)=0.211% p46(it2 s14)=0.211% p2(it0 s2)=0.211% p114(it7 s2)=0.211% p80(it5 s0)=0.210% p112(it7 s0)=0.210%
[2026-10-07T18:46:59Z] attribution: hot reads by iteration it0=0.241% it1=0.244% it2=0.244% it3=0.244% it4=0.244% it5=0.244% it6=0.244% it7=0.244% ; by site s0=0.209% s1=0.104% s2=0.210% s3=0.000% s4=0.104% s5=0.000% s6=0.104% s7=0.105% s8=0.000% s9=0.104% s10=0.104% s11=2.192% s12=0.000% s13=0.104% s14=0.209% s15=0.350%
[2026-10-07T18:46:59Z] site 0 (instr 2, src r5, k_off 1 offset 0, window 2^23 items): share of its reads into the top 0.1% 0.2090% (flat expectation 0.1006%); index entropy 15.000 bits of 15 uniform-on-window; saturated source 0.0000%; largest 256-item bucket 0.0032% (window expectation 0.0031%)
[2026-10-07T18:46:59Z] site 1 (instr 9, src r1, k_off 0 offset 0, window 2^24 items): share of its reads into the top 0.1% 0.1041% (flat expectation 0.1006%); index entropy 16.000 bits of 16 uniform-on-window; saturated source 0.0000%; largest 256-item bucket 0.0017% (window expectation 0.0015%)
[2026-10-07T18:46:59Z] site 2 (instr 10, src r6, k_off 1 offset 0, window 2^23 items): share of its reads into the top 0.1% 0.2100% (flat expectation 0.1006%); index entropy 15.000 bits of 15 uniform-on-window; saturated source 0.0000%; largest 256-item bucket 0.0032% (window expectation 0.0031%)
[2026-10-07T18:46:59Z] site 3 (instr 15, src r6, k_off 1 offset 1, window 2^23 items): share of its reads into the top 0.1% 0.0000% (flat expectation 0.1006%); index entropy 15.000 bits of 15 uniform-on-window; saturated source 0.0000%; largest 256-item bucket 0.0033% (window expectation 0.0031%)
[2026-10-07T18:46:59Z] site 4 (instr 16, src r7, k_off 0 offset 0, window 2^24 items): share of its reads into the top 0.1% 0.1043% (flat expectation 0.1006%); index entropy 16.000 bits of 16 uniform-on-window; saturated source 0.0000%; largest 256-item bucket 0.0017% (window expectation 0.0015%)
[2026-10-07T18:46:59Z] site 5 (instr 20, src r2, k_off 2 offset 2, window 2^22 items): share of its reads into the top 0.1% 0.0000% (flat expectation 0.1006%); index entropy 14.000 bits of 14 uniform-on-window; saturated source 0.0000%; largest 256-item bucket 0.0064% (window expectation 0.0061%)
[2026-10-07T18:46:59Z] site 6 (instr 21, src r6, k_off 0 offset 0, window 2^24 items): share of its reads into the top 0.1% 0.1043% (flat expectation 0.1006%); index entropy 16.000 bits of 16 uniform-on-window; saturated source 0.0000%; largest 256-item bucket 0.0017% (window expectation 0.0015%)
[2026-10-07T18:46:59Z] site 7 (instr 25, src r5, k_off 0 offset 0, window 2^24 items): share of its reads into the top 0.1% 0.1053% (flat expectation 0.1006%); index entropy 16.000 bits of 16 uniform-on-window; saturated source 0.0000%; largest 256-item bucket 0.0017% (window expectation 0.0015%)
[2026-10-07T18:46:59Z] site 8 (instr 28, src r2, k_off 1 offset 1, window 2^23 items): share of its reads into the top 0.1% 0.0000% (flat expectation 0.1006%); index entropy 15.000 bits of 15 uniform-on-window; saturated source 0.0000%; largest 256-item bucket 0.0033% (window expectation 0.0031%)
[2026-10-07T18:46:59Z] site 9 (instr 30, src r7, k_off 0 offset 0, window 2^24 items): share of its reads into the top 0.1% 0.1042% (flat expectation 0.1006%); index entropy 16.000 bits of 16 uniform-on-window; saturated source 0.0000%; largest 256-item bucket 0.0017% (window expectation 0.0015%)
[2026-10-07T18:46:59Z] site 10 (instr 31, src r4, k_off 0 offset 0, window 2^24 items): share of its reads into the top 0.1% 0.1044% (flat expectation 0.1006%); index entropy 16.000 bits of 16 uniform-on-window; saturated source 0.0000%; largest 256-item bucket 0.0017% (window expectation 0.0015%)
[2026-10-07T18:46:59Z] site 11 (instr 33, src r0, k_off 2 offset 1, window 2^22 items): share of its reads into the top 0.1% 2.1923% (flat expectation 0.1006%); index entropy 13.899 bits of 14 uniform-on-window; saturated source 0.0000%; largest 256-item bucket 0.0463% (window expectation 0.0061%)
[2026-10-07T18:46:59Z] site 12 (instr 34, src r7, k_off 1 offset 1, window 2^23 items): share of its reads into the top 0.1% 0.0000% (flat expectation 0.1006%); index entropy 15.000 bits of 15 uniform-on-window; saturated source 0.0000%; largest 256-item bucket 0.0032% (window expectation 0.0031%)
[2026-10-07T18:46:59Z] site 13 (instr 35, src r5, k_off 0 offset 0, window 2^24 items): share of its reads into the top 0.1% 0.1043% (flat expectation 0.1006%); index entropy 16.000 bits of 16 uniform-on-window; saturated source 0.0000%; largest 256-item bucket 0.0017% (window expectation 0.0015%)
[2026-10-07T18:46:59Z] site 14 (instr 41, src r2, k_off 1 offset 0, window 2^23 items): share of its reads into the top 0.1% 0.2091% (flat expectation 0.1006%); index entropy 15.000 bits of 15 uniform-on-window; saturated source 0.0000%; largest 256-item bucket 0.0033% (window expectation 0.0031%)
[2026-10-07T18:46:59Z] site 15 (instr 51, src r0, k_off 1 offset 0, window 2^23 items): share of its reads into the top 0.1% 0.3495% (flat expectation 0.1006%); index entropy 14.818 bits of 15 uniform-on-window; saturated source 0.0000%; largest 256-item bucket 0.0098% (window expectation 0.0031%)
[2026-10-07T18:46:59Z] attribution: item 0x40000c (696 reads) read from positions p27(it1 s11)x76 p75(it4 s11)x72 p91(it5 s11)x72 p59(it3 s11)x67 p43(it2 s11)x63 p107(it6 s11)x62 p11(it0 s11)x59 p123(it7 s11)x54 p31(it1 s15)x8 p15(it0 s15)x7 p127(it7 s15)x6 p10(it0 s10)x6
[2026-10-07T18:46:59Z] attribution: item 0x400051 (686 reads) read from positions p107(it6 s11)x80 p27(it1 s11)x68 p75(it4 s11)x66 p91(it5 s11)x65 p59(it3 s11)x61 p43(it2 s11)x60 p11(it0 s11)x52 p123(it7 s11)x50 p31(it1 s15)x13 p95(it5 s15)x11 p127(it7 s15)x9 p79(it4 s15)x9
[2026-10-07T18:46:59Z] attribution: item 0x400034 (681 reads) read from positions p107(it6 s11)x75 p91(it5 s11)x74 p43(it2 s11)x73 p59(it3 s11)x67 p75(it4 s11)x66 p27(it1 s11)x59 p11(it0 s11)x47 p123(it7 s11)x47 p31(it1 s15)x11 p47(it2 s15)x11 p127(it7 s15)x10 p79(it4 s15)x9
[2026-10-07T18:46:59Z] attribution: item 0x400079 (677 reads) read from positions p107(it6 s11)x71 p27(it1 s11)x70 p75(it4 s11)x64 p59(it3 s11)x63 p91(it5 s11)x62 p11(it0 s11)x61 p43(it2 s11)x61 p123(it7 s11)x57 p111(it6 s15)x11 p47(it2 s15)x9 p79(it4 s15)x9 p31(it1 s15)x8
[2026-10-07T18:46:59Z] attribution: item 0x40005a (673 reads) read from positions p107(it6 s11)x73 p59(it3 s11)x68 p91(it5 s11)x67 p123(it7 s11)x66 p43(it2 s11)x65 p75(it4 s11)x65 p11(it0 s11)x56 p27(it1 s11)x51 p111(it6 s15)x10 p127(it7 s15)x8 p47(it2 s15)x8 p79(it4 s15)x7
[2026-10-07T18:46:59Z] attribution: item 0x400015 (672 reads) read from positions p27(it1 s11)x72 p59(it3 s11)x72 p123(it7 s11)x72 p43(it2 s11)x68 p11(it0 s11)x64 p91(it5 s11)x61 p75(it4 s11)x59 p107(it6 s11)x56 p79(it4 s15)x13 p127(it7 s15)x11 p111(it6 s15)x10 p15(it0 s15)x7
[2026-10-07T18:46:59Z] attribution: item 0x400006 (670 reads) read from positions p59(it3 s11)x74 p75(it4 s11)x67 p27(it1 s11)x64 p43(it2 s11)x64 p91(it5 s11)x61 p11(it0 s11)x57 p123(it7 s11)x55 p107(it6 s11)x54 p47(it2 s15)x14 p95(it5 s15)x11 p31(it1 s15)x7 p94(it5 s14)x6
[2026-10-07T18:46:59Z] attribution: item 0x400026 (669 reads) read from positions p27(it1 s11)x69 p59(it3 s11)x67 p75(it4 s11)x66 p43(it2 s11)x62 p91(it5 s11)x61 p11(it0 s11)x60 p107(it6 s11)x58 p123(it7 s11)x52 p127(it7 s15)x10 p31(it1 s15)x10 p47(it2 s15)x9 p63(it3 s15)x7
[2026-10-07T18:46:59Z] hottest item p100064-attack-f8 (0x40000c): 696 reads (0.0000% of all); predicted source none
[2026-10-07T18:46:59Z] program p100064-attack-f8 DONE: 16777216 nonces; 6-sigma (windowed) FLAGGED; hot-set clear; verdict FLAGGED
[2026-10-07T18:46:59Z] attack-f8 0.1.0 (igneum-pow 4); args ["warps", "--program", "100159", "--nonces", "16777216", "--threads", "32", "--out", "/srv/builds/_adv-adv-accept/live", "--validate", "sample", "--diag", "1"]
[2026-10-07T18:46:59Z] census warps: programs [100159] day 20730 nonces 16777216 threads 32 plant none validate sample check_every 997 diag true
[2026-10-07T18:47:00Z] day 20730: cache filled in 0.65 s, fnv 448274a57f508cbc
[2026-10-07T18:47:03Z] table: 16777216 items derived with their 8 lines in 2.9 s; library comparison sample (0 mismatches)
[2026-10-07T18:47:08Z] program p100159-attack-f8: epoch seed 1d76edc78af5ddea74900f1e005f77ef1b115c69c583ea6f57792e386806aede era seed b659277d9635ccc59ea759fd747241f440d5dc89947f629a2473ccef349c869b id 573d650159a8b04e attempt 3 class mx8-era9e0e4f28+sh256x27 op mix load=16 mulhi=7 xor=7 mul=6 add=5 mad=5 rotl=4 shfl=4 sub=4 or=3 rotr=3; era stride mul 0xa39d49c9 rot 7 interleave [3, 8, 9, 10] windows 5:2:0 10:0:0 16:2:3 17:2:2 23:2:2 26:2:2 40:0:0 42:2:3 45:1:0 47:2:3 49:2:2 56:0:0 59:2:0 60:2:3 61:0:0 62:0:0
[2026-10-07T18:47:08Z] load site instr 5: src r4 win 2 off 0; last base writer shfl at 0; writers back to the last injecting one: shfl@0; shadow writes of r4 per rep: add=5 mad=3 mul=1 mulhi=1 or=2 rotl=3 rotr=2 shfl=4 sub=1 xor=5
[2026-10-07T18:47:08Z] load site instr 10: src r7 win 0 off 0; last base writer add at 6; writers back to the last injecting one: add@6; shadow writes of r7 per rep: add=9 mad=2 mul=1 mulhi=1 or=2 rotl=3 shfl=4 sub=2 xor=9
[2026-10-07T18:47:08Z] load site instr 16: src r5 win 2 off 3; last base writer xor at 9; writers back to the last injecting one: xor@9; shadow writes of r5 per rep: add=1 mad=4 mul=3 mulhi=1 or=2 rotl=4 rotr=1 shfl=6 sub=1 xor=5
[2026-10-07T18:47:08Z] load site instr 17: src r1 win 2 off 2; last base writer load at 10; writers back to the last injecting one: load@10; shadow writes of r1 per rep: add=3 mad=6 mul=4 mulhi=3 or=4 rotl=3 rotr=4 shfl=3 sub=2 xor=6
[2026-10-07T18:47:08Z] load site instr 23: src r7 win 2 off 2; last base writer load at 16; writers back to the last injecting one: load@16; shadow writes of r7 per rep: add=9 mad=2 mul=1 mulhi=1 or=2 rotl=3 shfl=4 sub=2 xor=9
[2026-10-07T18:47:08Z] load site instr 26: src r5 win 2 off 2; last base writer xor at 25; writers back to the last injecting one: xor@25; shadow writes of r5 per rep: add=1 mad=4 mul=3 mulhi=1 or=2 rotl=4 rotr=1 shfl=6 sub=1 xor=5
[2026-10-07T18:47:08Z] load site instr 40: src r1 win 0 off 0; last base writer shfl at 30; writers back to the last injecting one: shfl@30; shadow writes of r1 per rep: add=3 mad=6 mul=4 mulhi=3 or=4 rotl=3 rotr=4 shfl=3 sub=2 xor=6
[2026-10-07T18:47:08Z] load site instr 42: src r5 win 2 off 3; last base writer mad at 33; writers back to the last injecting one: mad@33; shadow writes of r5 per rep: add=1 mad=4 mul=3 mulhi=1 or=2 rotl=4 rotr=1 shfl=6 sub=1 xor=5
[2026-10-07T18:47:08Z] load site instr 45: src r7 win 1 off 0; last base writer add at 44; writers back to the last injecting one: add@44; shadow writes of r7 per rep: add=9 mad=2 mul=1 mulhi=1 or=2 rotl=3 shfl=4 sub=2 xor=9
[2026-10-07T18:47:08Z] load site instr 47: src r2 win 2 off 3; last base writer load at 45; writers back to the last injecting one: load@45; shadow writes of r2 per rep: add=9 mad=4 mul=3 mulhi=2 or=2 rotl=2 rotr=1 shfl=2 sub=2 xor=4
[2026-10-07T18:47:08Z] load site instr 49: src r5 win 2 off 2; last base writer load at 47; writers back to the last injecting one: load@47; shadow writes of r5 per rep: add=1 mad=4 mul=3 mulhi=1 or=2 rotl=4 rotr=1 shfl=6 sub=1 xor=5
[2026-10-07T18:47:08Z] load site instr 56: src r1 win 0 off 0; last base writer mad at 51; writers back to the last injecting one: mad@51; shadow writes of r1 per rep: add=3 mad=6 mul=4 mulhi=3 or=4 rotl=3 rotr=4 shfl=3 sub=2 xor=6
[2026-10-07T18:47:08Z] load site instr 59: src r7 win 2 off 0; last base writer add at 50; writers back to the last injecting one: add@50; shadow writes of r7 per rep: add=9 mad=2 mul=1 mulhi=1 or=2 rotl=3 shfl=4 sub=2 xor=9
[2026-10-07T18:47:08Z] load site instr 60: src r2 win 2 off 3; last base writer rotr at 54; writers back to the last injecting one: rotr@54 load@45; shadow writes of r2 per rep: add=9 mad=4 mul=3 mulhi=2 or=2 rotl=2 rotr=1 shfl=2 sub=2 xor=4
[2026-10-07T18:47:08Z] load site instr 61: src r6 win 0 off 0; last base writer load at 56; writers back to the last injecting one: load@56; shadow writes of r6 per rep: add=4 mad=3 mul=1 mulhi=4 rotl=1 rotr=2 shfl=2 sub=3 xor=8
[2026-10-07T18:47:08Z] load site instr 62: src r5 win 0 off 0; last base writer load at 60; writers back to the last injecting one: load@60; shadow writes of r5 per rep: add=1 mad=4 mul=3 mulhi=1 or=2 rotl=4 rotr=1 shfl=6 sub=1 xor=5
[2026-10-07T18:47:08Z] window layer: site item windows (first, items) (0x0,2^22) (0x0,2^24) (0xc00000,2^22) (0x800000,2^22) (0x800000,2^22) (0x800000,2^22) (0x0,2^24) (0xc00000,2^22) (0x0,2^23) (0xc00000,2^22) (0x800000,2^22) (0x0,2^24) (0x0,2^22) (0xc00000,2^22) (0x0,2^24) (0x0,2^24); expected reads per item by quarter 120.000 56.000 168.000 168.000 (flat uniform 128.000)
[2026-10-07T18:48:05Z] 524288 warps (16777216 nonces) interpreted in 57.7 s (3.524 ms per warp per thread); Epoch::hash_warp agreement on 589 warps: 0 mismatches
[2026-10-07T18:48:05Z] p100159-attack-f8 distinct lines per hash: n 16777216 min 968 p1 1000 median 1023 p99 1024 max 1024 mean 1019.4825
[2026-10-07T18:48:05Z] p100159-attack-f8 distinct items per hash: n 16777216 min 121 p1 125 median 128 p99 128 max 128 mean 127.4508
[2026-10-07T18:48:05Z] p100159-attack-f8 distinct lines per warp: n 524288 min 32330 p1 32412 median 32498 p99 32572 max 32632 mean 32496.4928
[2026-10-07T18:48:05Z] p100159-attack-f8 distinct items per warp: n 524288 min 4058 p1 4068 median 4078 p99 4087 max 4093 mean 4077.8772
[2026-10-07T18:48:05Z] uniform expectation: distinct lines per hash 1023.875 of 1024 reads, per warp 32640.3 of 32768 reads (2^22 lines); distinct items per hash 127.9995 of 128, per warp 4095.50 of 4096 (2^24 items)
[2026-10-07T18:48:05Z] positions: largest hi16-bucket (256 items) share 0.0174% at p71 (iteration 4, site 7, instr 42); windowed expectation 0.0061%; largest saturated-source share 0.0000% at p7 (site 7, instr 42)
[2026-10-07T18:48:05Z] acceptance-style (2,048 evaluations, the rule's sample size): the most repeated address at one position 2 of 2048 at p9 (site 9, instr 47); saturated sources at one position 0 of 2048 at p0 (site 0, instr 5); uniform expectation: repeats 1 to 2, saturated 0
[2026-10-07T18:48:05Z] p100159-attack-f8 item histogram (flat): bins 16777216 reads 2147483648 mean 128.000 sigma 11.314 max 461 (bin 12582957) z_max +29.43 min 23 z_min -9.28 chi2/dof 19.27483 chi2_z +52929.55 top0.1% 0.21205% top0.5% 0.94619% top1% 1.81277%
[2026-10-07T18:48:05Z] p100159-attack-f8 item histogram against the window density: full 2^24 chi2/dof 2.35369 largest 461 (item 0xc0002d) at +22.61 sigma smallest at -6.25; buckets64 chi2/dof 87.22184 largest 26780 (bucket 196608) at +154.57 sigma smallest at -18.35
[2026-10-07T18:48:09Z] p100159-attack-f8 WINDOWED CONTROL item histogram (flat): bins 16777216 reads 2147483648 mean 128.000 sigma 11.314 max 239 (bin 10424085) z_max +9.81 min 23 z_min -9.28 chi2/dof 17.50060 chi2_z +47790.84 top0.1% 0.16452% top0.5% 0.79498% top1% 1.56373%
[2026-10-07T18:48:09Z] p100159-attack-f8 WINDOWED CONTROL against the window density: full chi2/dof 0.99982 largest +5.48 sigma; buckets64 chi2/dof 1.00218 largest +4.63 smallest -4.85
[2026-10-07T18:48:09Z] 6-sigma p100159-attack-f8 items buckets64 against the window density: largest bucket +154.57 sigma, smallest -18.35 -> FLAGGED (beyond 6 sigma)
[2026-10-07T18:48:09Z] hot-set p100159-attack-f8 items (windowed control): f 0.1% S_f 0.21205% E_f(control) 0.16452% X_f +0.04753% X_f/f +0.4753 -> no hot set
[2026-10-07T18:48:09Z] hot-set p100159-attack-f8 items (windowed control): f 0.5% S_f 0.94619% E_f(control) 0.79498% X_f +0.15121% X_f/f +0.3024 -> no hot set
[2026-10-07T18:48:09Z] hot-set p100159-attack-f8 items (windowed control): f 1.0% S_f 1.81277% E_f(control) 1.56373% X_f +0.24904% X_f/f +0.2490 -> no hot set
[2026-10-07T18:48:09Z] hot-set p100159-attack-f8 items (windowed control): verdict clear
[2026-10-07T18:48:12Z] p100159-attack-f8 FLAT CONTROL item histogram: bins 16777216 reads 2147483648 mean 128.000 sigma 11.314 max 192 (bin 14736510) z_max +5.66 min 70 z_min -5.13 chi2/dof 0.99968 chi2_z -0.94 top0.1% 0.13104% top0.5% 0.63242% top1% 1.24329%
[2026-10-07T18:48:12Z] hot-set p100159-attack-f8 items (flat control, the auditor's first view): f 0.1% S_f 0.21205% E_f(control) 0.13104% X_f +0.08101% X_f/f +0.8101 -> no hot set
[2026-10-07T18:48:12Z] hot-set p100159-attack-f8 items (flat control, the auditor's first view): f 0.5% S_f 0.94619% E_f(control) 0.63242% X_f +0.31377% X_f/f +0.6275 -> no hot set
[2026-10-07T18:48:12Z] hot-set p100159-attack-f8 items (flat control, the auditor's first view): f 1.0% S_f 1.81277% E_f(control) 1.24329% X_f +0.56948% X_f/f +0.5695 -> no hot set
[2026-10-07T18:48:12Z] hot-set p100159-attack-f8 items (flat control, the auditor's first view): verdict clear
[2026-10-07T18:48:12Z] ratio p100159-attack-f8: top 0.1% / 0.5% / 1% share over the WINDOW-MODEL control 1.2889x / 1.1902x / 1.1593x (gate 1.2x at 0.1%: BEYOND); over the FLAT control 1.6182x / 1.4961x / 1.4580x
[2026-10-07T18:48:14Z] attribution: hot threshold count >= 251 marks 17263 items (0.1029% of items) holding 4675658 reads (0.2177% of reads); top 8 items t=0xc0002d:461 t=0xc00007:457 t=0xc00014:455 t=0xc00030:453 t=0xc0003d:452 t=0xc00026:451 t=0xc00008:448 t=0xc0003f:447
[2026-10-07T18:48:44Z] attribution: reads on hot items per position (flat expectation 0.1029% of each position's 16777216 reads); the 24 largest: p87(it5 s7)=1.636% p55(it3 s7)=1.632% p71(it4 s7)=1.631% p39(it2 s7)=1.630% p119(it7 s7)=1.630% p103(it6 s7)=1.630% p23(it1 s7)=1.628% p7(it0 s7)=1.590% p57(it3 s9)=0.440% p9(it0 s9)=0.440% p25(it1 s9)=0.440% p41(it2 s9)=0.439% p77(it4 s13)=0.439% p89(it5 s9)=0.439% p93(it5 s13)=0.439% p45(it2 s13)=0.439% p125(it7 s13)=0.439% p114(it7 s2)=0.438% p13(it0 s13)=0.438% p61(it3 s13)=0.438% p29(it1 s13)=0.437% p73(it4 s9)=0.437% p105(it6 s9)=0.437% p121(it7 s9)=0.437%
[2026-10-07T18:48:44Z] attribution: hot reads by iteration it0=0.216% it1=0.218% it2=0.218% it3=0.218% it4=0.218% it5=0.219% it6=0.218% it7=0.218% ; by site s0=0.000% s1=0.109% s2=0.436% s3=0.000% s4=0.000% s5=0.000% s6=0.109% s7=1.626% s8=0.000% s9=0.439% s10=0.000% s11=0.109% s12=0.000% s13=0.438% s14=0.109% s15=0.109%
[2026-10-07T18:48:44Z] site 0 (instr 5, src r4, k_off 2 offset 0, window 2^22 items): share of its reads into the top 0.1% 0.0000% (flat expectation 0.1029%); index entropy 14.000 bits of 14 uniform-on-window; saturated source 0.0000%; largest 256-item bucket 0.0064% (window expectation 0.0061%)
[2026-10-07T18:48:44Z] site 1 (instr 10, src r7, k_off 0 offset 0, window 2^24 items): share of its reads into the top 0.1% 0.1087% (flat expectation 0.1029%); index entropy 16.000 bits of 16 uniform-on-window; saturated source 0.0000%; largest 256-item bucket 0.0017% (window expectation 0.0015%)
[2026-10-07T18:48:44Z] site 2 (instr 16, src r5, k_off 2 offset 3, window 2^22 items): share of its reads into the top 0.1% 0.4360% (flat expectation 0.1029%); index entropy 14.000 bits of 14 uniform-on-window; saturated source 0.0000%; largest 256-item bucket 0.0064% (window expectation 0.0061%)
[2026-10-07T18:48:44Z] site 3 (instr 17, src r1, k_off 2 offset 2, window 2^22 items): share of its reads into the top 0.1% 0.0002% (flat expectation 0.1029%); index entropy 14.000 bits of 14 uniform-on-window; saturated source 0.0000%; largest 256-item bucket 0.0064% (window expectation 0.0061%)
[2026-10-07T18:48:44Z] site 4 (instr 23, src r7, k_off 2 offset 2, window 2^22 items): share of its reads into the top 0.1% 0.0002% (flat expectation 0.1029%); index entropy 14.000 bits of 14 uniform-on-window; saturated source 0.0000%; largest 256-item bucket 0.0064% (window expectation 0.0061%)
[2026-10-07T18:48:44Z] site 5 (instr 26, src r5, k_off 2 offset 2, window 2^22 items): share of its reads into the top 0.1% 0.0003% (flat expectation 0.1029%); index entropy 14.000 bits of 14 uniform-on-window; saturated source 0.0000%; largest 256-item bucket 0.0075% (window expectation 0.0061%)
[2026-10-07T18:48:44Z] site 6 (instr 40, src r1, k_off 0 offset 0, window 2^24 items): share of its reads into the top 0.1% 0.1093% (flat expectation 0.1029%); index entropy 16.000 bits of 16 uniform-on-window; saturated source 0.0000%; largest 256-item bucket 0.0017% (window expectation 0.0015%)
[2026-10-07T18:48:44Z] site 7 (instr 42, src r5, k_off 2 offset 3, window 2^22 items): share of its reads into the top 0.1% 1.6259% (flat expectation 0.1029%); index entropy 13.993 bits of 14 uniform-on-window; saturated source 0.0000%; largest 256-item bucket 0.0165% (window expectation 0.0061%)
[2026-10-07T18:48:44Z] site 8 (instr 45, src r7, k_off 1 offset 0, window 2^23 items): share of its reads into the top 0.1% 0.0000% (flat expectation 0.1029%); index entropy 15.000 bits of 15 uniform-on-window; saturated source 0.0000%; largest 256-item bucket 0.0032% (window expectation 0.0031%)
[2026-10-07T18:48:44Z] site 9 (instr 47, src r2, k_off 2 offset 3, window 2^22 items): share of its reads into the top 0.1% 0.4386% (flat expectation 0.1029%); index entropy 14.000 bits of 14 uniform-on-window; saturated source 0.0000%; largest 256-item bucket 0.0064% (window expectation 0.0061%)
[2026-10-07T18:48:44Z] site 10 (instr 49, src r5, k_off 2 offset 2, window 2^22 items): share of its reads into the top 0.1% 0.0002% (flat expectation 0.1029%); index entropy 14.000 bits of 14 uniform-on-window; saturated source 0.0000%; largest 256-item bucket 0.0064% (window expectation 0.0061%)
[2026-10-07T18:48:44Z] site 11 (instr 56, src r1, k_off 0 offset 0, window 2^24 items): share of its reads into the top 0.1% 0.1087% (flat expectation 0.1029%); index entropy 16.000 bits of 16 uniform-on-window; saturated source 0.0000%; largest 256-item bucket 0.0017% (window expectation 0.0015%)
[2026-10-07T18:48:44Z] site 12 (instr 59, src r7, k_off 2 offset 0, window 2^22 items): share of its reads into the top 0.1% 0.0000% (flat expectation 0.1029%); index entropy 14.000 bits of 14 uniform-on-window; saturated source 0.0000%; largest 256-item bucket 0.0064% (window expectation 0.0061%)
[2026-10-07T18:48:44Z] site 13 (instr 60, src r2, k_off 2 offset 3, window 2^22 items): share of its reads into the top 0.1% 0.4381% (flat expectation 0.1029%); index entropy 14.000 bits of 14 uniform-on-window; saturated source 0.0000%; largest 256-item bucket 0.0064% (window expectation 0.0061%)
[2026-10-07T18:48:44Z] site 14 (instr 61, src r6, k_off 0 offset 0, window 2^24 items): share of its reads into the top 0.1% 0.1088% (flat expectation 0.1029%); index entropy 16.000 bits of 16 uniform-on-window; saturated source 0.0000%; largest 256-item bucket 0.0017% (window expectation 0.0015%)
[2026-10-07T18:48:44Z] site 15 (instr 62, src r5, k_off 0 offset 0, window 2^24 items): share of its reads into the top 0.1% 0.1087% (flat expectation 0.1029%); index entropy 16.000 bits of 16 uniform-on-window; saturated source 0.0000%; largest 256-item bucket 0.0017% (window expectation 0.0015%)
[2026-10-07T18:48:44Z] attribution: item 0xc0002d (461 reads) read from positions p55(it3 s7)x43 p119(it7 s7)x42 p87(it5 s7)x40 p23(it1 s7)x36 p103(it6 s7)x35 p71(it4 s7)x33 p7(it0 s7)x30 p39(it2 s7)x25 p41(it2 s9)x10 p109(it6 s13)x10 p9(it0 s9)x9 p105(it6 s9)x9
[2026-10-07T18:48:44Z] attribution: item 0xc00007 (457 reads) read from positions p55(it3 s7)x48 p23(it1 s7)x45 p119(it7 s7)x45 p87(it5 s7)x39 p103(it6 s7)x39 p39(it2 s7)x34 p7(it0 s7)x30 p71(it4 s7)x27 p2(it0 s2)x9 p41(it2 s9)x7 p45(it2 s13)x6 p66(it4 s2)x6
[2026-10-07T18:48:44Z] attribution: item 0xc00014 (455 reads) read from positions p55(it3 s7)x45 p71(it4 s7)x43 p103(it6 s7)x43 p23(it1 s7)x41 p119(it7 s7)x39 p7(it0 s7)x37 p39(it2 s7)x33 p87(it5 s7)x33 p45(it2 s13)x9 p98(it6 s2)x9 p29(it1 s13)x6 p77(it4 s13)x6
[2026-10-07T18:48:44Z] attribution: item 0xc00030 (453 reads) read from positions p119(it7 s7)x50 p71(it4 s7)x47 p55(it3 s7)x45 p103(it6 s7)x36 p39(it2 s7)x35 p87(it5 s7)x35 p23(it1 s7)x32 p7(it0 s7)x22 p25(it1 s9)x9 p73(it4 s9)x9 p29(it1 s13)x8 p82(it5 s2)x8
[2026-10-07T18:48:44Z] attribution: item 0xc0003d (452 reads) read from positions p71(it4 s7)x44 p103(it6 s7)x44 p87(it5 s7)x40 p55(it3 s7)x37 p119(it7 s7)x36 p39(it2 s7)x33 p23(it1 s7)x31 p7(it0 s7)x27 p66(it4 s2)x8 p121(it7 s9)x7 p9(it0 s9)x7 p29(it1 s13)x7
[2026-10-07T18:48:44Z] attribution: item 0xc00026 (451 reads) read from positions p119(it7 s7)x48 p71(it4 s7)x46 p39(it2 s7)x39 p7(it0 s7)x37 p55(it3 s7)x37 p87(it5 s7)x32 p103(it6 s7)x29 p23(it1 s7)x27 p114(it7 s2)x8 p66(it4 s2)x7 p73(it4 s9)x7 p2(it0 s2)x6
[2026-10-07T18:48:44Z] attribution: item 0xc00008 (448 reads) read from positions p103(it6 s7)x46 p23(it1 s7)x40 p119(it7 s7)x40 p55(it3 s7)x39 p7(it0 s7)x37 p71(it4 s7)x34 p87(it5 s7)x31 p39(it2 s7)x30 p25(it1 s9)x8 p61(it3 s13)x8 p57(it3 s9)x7 p98(it6 s2)x7
[2026-10-07T18:48:44Z] attribution: item 0xc0003f (447 reads) read from positions p71(it4 s7)x48 p23(it1 s7)x45 p55(it3 s7)x41 p7(it0 s7)x36 p87(it5 s7)x35 p119(it7 s7)x34 p103(it6 s7)x33 p39(it2 s7)x32 p89(it5 s9)x8 p34(it2 s2)x7 p82(it5 s2)x7 p57(it3 s9)x6
[2026-10-07T18:48:44Z] hottest item p100159-attack-f8 (0xc0002d): 461 reads (0.0000% of all); predicted source none
[2026-10-07T18:48:44Z] program p100159-attack-f8 DONE: 16777216 nonces; 6-sigma (windowed) FLAGGED; hot-set clear; verdict FLAGGED

View file

@ -0,0 +1,47 @@
[2026-10-07T18:30:09Z] attack-f8 0.1.0 (igneum-pow 4); args ["warps", "--program", "2", "--nonces", "1000000", "--threads", "32", "--out", "/srv/builds/igneum-wt-adv-accept/adv/live", "--validate", "sample"]
[2026-10-07T18:30:09Z] census warps: programs [2] day 20730 nonces 1000000 threads 32 plant none validate sample check_every 997 diag false
[2026-10-07T18:30:24Z] day 20730: cache filled in 15.39 s, fnv 448274a57f508cbc
[2026-10-07T18:30:25Z] table: 16777216 items derived with their 8 lines in 1.3 s; library comparison sample (0 mismatches)
[2026-10-07T18:30:30Z] program p2-attack-f8: epoch seed 59cef1aaa406506685f4355933868219bedece8dbd4e84c281724db9313bfdfa era seed 9cba001faa1e017235841c72f560ebd1b93f6d7aea5f9a598f7d3080e8a11f69 id 8a0047b2eb071ade attempt 5 class mx8-era35d128b9+sh256x27 op mix load=16 mul=8 add=6 mulhi=6 shfl=6 mad=4 or=4 rotl=4 rotr=4 xor=4 sub=2; era stride mul 0xbf0fab63 rot 4 interleave [2, 3, 7, 15] windows 2:2:0 3:0:0 7:0:0 9:0:0 13:2:1 17:1:1 21:2:0 22:1:0 23:0:0 27:1:0 30:2:2 40:1:0 44:2:1 55:0:0 62:0:0 63:2:0
[2026-10-07T18:30:30Z] load site instr 2: src r1 win 2 off 0; last base writer add at 1; writers back to the last injecting one: add@1; shadow writes of r1 per rep: add=7 mad=6 mul=4 mulhi=6 or=1 rotl=3 rotr=6 shfl=1 sub=2 xor=4
[2026-10-07T18:30:30Z] load site instr 3: src r5 win 0 off 0; last base writer mad at 0; writers back to the last injecting one: mad@0; shadow writes of r5 per rep: add=3 mad=4 mul=5 or=5 rotl=1 rotr=4 shfl=4 sub=3 xor=3
[2026-10-07T18:30:30Z] load site instr 7: src r1 win 0 off 0; last base writer shfl at 5; writers back to the last injecting one: shfl@5; shadow writes of r1 per rep: add=7 mad=6 mul=4 mulhi=6 or=1 rotl=3 rotr=6 shfl=1 sub=2 xor=4
[2026-10-07T18:30:30Z] load site instr 9: src r3 win 0 off 0; last base writer add at 6; writers back to the last injecting one: add@6; shadow writes of r3 per rep: add=4 mad=3 mul=1 mulhi=2 rotl=1 rotr=2 shfl=3 sub=3 xor=3
[2026-10-07T18:30:30Z] load site instr 13: src r0 win 2 off 1; last base writer xor at 12; writers back to the last injecting one: xor@12; shadow writes of r0 per rep: add=5 mad=6 mul=1 mulhi=3 or=1 rotl=1 rotr=7 shfl=8 sub=2
[2026-10-07T18:30:30Z] load site instr 17: src r5 win 1 off 1; last base writer xor at 14; writers back to the last injecting one: xor@14; shadow writes of r5 per rep: add=3 mad=4 mul=5 or=5 rotl=1 rotr=4 shfl=4 sub=3 xor=3
[2026-10-07T18:30:30Z] load site instr 21: src r4 win 2 off 0; last base writer shfl at 15; writers back to the last injecting one: shfl@15; shadow writes of r4 per rep: add=4 mad=4 mulhi=1 or=1 rotl=4 rotr=1 shfl=2 sub=8 xor=6
[2026-10-07T18:30:30Z] load site instr 22: src r5 win 1 off 0; last base writer add at 20; writers back to the last injecting one: add@20; shadow writes of r5 per rep: add=3 mad=4 mul=5 or=5 rotl=1 rotr=4 shfl=4 sub=3 xor=3
[2026-10-07T18:30:30Z] load site instr 23: src r1 win 0 off 0; last base writer load at 13; writers back to the last injecting one: load@13; shadow writes of r1 per rep: add=7 mad=6 mul=4 mulhi=6 or=1 rotl=3 rotr=6 shfl=1 sub=2 xor=4
[2026-10-07T18:30:30Z] load site instr 27: src r2 win 1 off 0; last base writer xor at 26; writers back to the last injecting one: xor@26; shadow writes of r2 per rep: add=6 mad=2 mul=4 mulhi=3 or=3 rotl=5 rotr=3 shfl=3 sub=3 xor=6
[2026-10-07T18:30:30Z] load site instr 30: src r2 win 2 off 2; last base writer rotr at 29; writers back to the last injecting one: rotr@29 xor@26; shadow writes of r2 per rep: add=6 mad=2 mul=4 mulhi=3 or=3 rotl=5 rotr=3 shfl=3 sub=3 xor=6
[2026-10-07T18:30:30Z] load site instr 40: src r1 win 1 off 0; last base writer rotl at 32; writers back to the last injecting one: rotl@32 rotl@31 load@30; shadow writes of r1 per rep: add=7 mad=6 mul=4 mulhi=6 or=1 rotl=3 rotr=6 shfl=1 sub=2 xor=4
[2026-10-07T18:30:30Z] load site instr 44: src r4 win 2 off 1; last base writer load at 27; writers back to the last injecting one: load@27; shadow writes of r4 per rep: add=4 mad=4 mulhi=1 or=1 rotl=4 rotr=1 shfl=2 sub=8 xor=6
[2026-10-07T18:30:30Z] load site instr 55: src r4 win 0 off 0; last base writer mad at 51; writers back to the last injecting one: mad@51; shadow writes of r4 per rep: add=4 mad=4 mulhi=1 or=1 rotl=4 rotr=1 shfl=2 sub=8 xor=6
[2026-10-07T18:30:30Z] load site instr 62: src r0 win 0 off 0; last base writer add at 53; writers back to the last injecting one: add@53; shadow writes of r0 per rep: add=5 mad=6 mul=1 mulhi=3 or=1 rotl=1 rotr=7 shfl=8 sub=2
[2026-10-07T18:30:30Z] load site instr 63: src r1 win 2 off 0; last base writer load at 62; writers back to the last injecting one: load@62; shadow writes of r1 per rep: add=7 mad=6 mul=4 mulhi=6 or=1 rotl=3 rotr=6 shfl=1 sub=2 xor=4
[2026-10-07T18:30:30Z] window layer: site item windows (first, items) (0x0,2^22) (0x0,2^24) (0x0,2^24) (0x0,2^24) (0x400000,2^22) (0x800000,2^23) (0x0,2^22) (0x0,2^23) (0x0,2^24) (0x0,2^23) (0x800000,2^22) (0x0,2^23) (0x400000,2^22) (0x0,2^24) (0x0,2^24) (0x0,2^22); expected reads per item by quarter 11.444 9.537 5.722 3.815 (flat uniform 7.629)
[2026-10-07T18:30:33Z] 31250 warps (1000000 nonces) interpreted in 3.7 s (3.780 ms per warp per thread); Epoch::hash_warp agreement on 95 warps: 0 mismatches
[2026-10-07T18:30:33Z] p2-attack-f8 distinct lines per hash: n 1000000 min 1014 p1 1023 median 1024 p99 1024 max 1024 mean 1023.8709
[2026-10-07T18:30:33Z] p2-attack-f8 distinct items per hash: n 1000000 min 127 p1 128 median 128 p99 128 max 128 mean 127.9994
[2026-10-07T18:30:33Z] p2-attack-f8 distinct lines per warp: n 31250 min 32576 p1 32604 median 32636 p99 32663 max 32686 mean 32635.7294
[2026-10-07T18:30:33Z] p2-attack-f8 distinct items per warp: n 31250 min 4091 p1 4093 median 4096 p99 4096 max 4096 mean 4095.4226
[2026-10-07T18:30:33Z] uniform expectation: distinct lines per hash 1023.875 of 1024 reads, per warp 32640.3 of 32768 reads (2^22 lines); distinct items per hash 127.9995 of 128, per warp 4095.50 of 4096 (2^24 items)
[2026-10-07T18:30:33Z] positions: largest hi16-bucket (256 items) share 0.0104% at p16 (iteration 1, site 0, instr 2); windowed expectation 0.0061%; largest saturated-source share 0.0000% at p0 (site 0, instr 2)
[2026-10-07T18:30:33Z] acceptance-style (2,048 evaluations, the rule's sample size): the most repeated address at one position 2 of 2048 at p17 (site 1, instr 3); saturated sources at one position 0 of 2048 at p0 (site 0, instr 2); uniform expectation: repeats 1 to 2, saturated 0
[2026-10-07T18:30:34Z] p2-attack-f8 item histogram (flat): bins 16777216 reads 128000000 mean 7.629 sigma 2.762 max 32 (bin 1185685) z_max +8.82 min 0 z_min -2.76 chi2/dof 2.19250 chi2_z +3453.84 top0.1% 0.29907% top0.5% 1.34679% top1% 2.55754%
[2026-10-07T18:30:34Z] p2-attack-f8 item histogram against the window density: full 2^24 chi2/dof 1.00015 largest 23 (item 0x8c49bb) at +7.22 sigma smallest at -3.38; buckets64 chi2/dof 0.99742 largest 859 (bucket 24423) at +4.68 sigma smallest at -4.55
[2026-10-07T18:30:34Z] p2-attack-f8 WINDOWED CONTROL item histogram (flat): bins 16777216 reads 128000000 mean 7.629 sigma 2.762 max 37 (bin 3356675) z_max +10.63 min 0 z_min -2.76 chi2/dof 2.19210 chi2_z +3452.68 top0.1% 0.29918% top0.5% 1.34673% top1% 2.55749%
[2026-10-07T18:30:34Z] p2-attack-f8 WINDOWED CONTROL against the window density: full chi2/dof 0.99966 largest +7.55 sigma; buckets64 chi2/dof 1.00387 largest +4.49 smallest -4.89
[2026-10-07T18:30:34Z] 6-sigma p2-attack-f8 items buckets64 against the window density: largest bucket +4.68 sigma, smallest -4.55 -> within 6 sigma
[2026-10-07T18:30:34Z] hot-set p2-attack-f8 items (windowed control): f 0.1% S_f 0.29907% E_f(control) 0.29918% X_f -0.00012% X_f/f -0.0012 -> no hot set
[2026-10-07T18:30:34Z] hot-set p2-attack-f8 items (windowed control): f 0.5% S_f 1.34679% E_f(control) 1.34673% X_f +0.00006% X_f/f +0.0001 -> no hot set
[2026-10-07T18:30:34Z] hot-set p2-attack-f8 items (windowed control): f 1.0% S_f 2.55754% E_f(control) 2.55749% X_f +0.00005% X_f/f +0.0000 -> no hot set
[2026-10-07T18:30:34Z] hot-set p2-attack-f8 items (windowed control): verdict clear
[2026-10-07T18:30:34Z] p2-attack-f8 FLAT CONTROL item histogram: bins 16777216 reads 128000000 mean 7.629 sigma 2.762 max 28 (bin 13310856) z_max +7.37 min 0 z_min -2.76 chi2/dof 0.99990 chi2_z -0.29 top0.1% 0.24291% top0.5% 1.09940% top1% 2.08772%
[2026-10-07T18:30:34Z] hot-set p2-attack-f8 items (flat control, the auditor's first view): f 0.1% S_f 0.29907% E_f(control) 0.24291% X_f +0.05616% X_f/f +0.5616 -> no hot set
[2026-10-07T18:30:34Z] hot-set p2-attack-f8 items (flat control, the auditor's first view): f 0.5% S_f 1.34679% E_f(control) 1.09940% X_f +0.24739% X_f/f +0.4948 -> no hot set
[2026-10-07T18:30:34Z] hot-set p2-attack-f8 items (flat control, the auditor's first view): f 1.0% S_f 2.55754% E_f(control) 2.08772% X_f +0.46981% X_f/f +0.4698 -> no hot set
[2026-10-07T18:30:34Z] hot-set p2-attack-f8 items (flat control, the auditor's first view): verdict clear
[2026-10-07T18:30:34Z] ratio p2-attack-f8: top 0.1% / 0.5% / 1% share over the WINDOW-MODEL control 0.9996x / 1.0000x / 1.0000x (gate 1.2x at 0.1%: within); over the FLAT control 1.2312x / 1.2250x / 1.2250x
[2026-10-07T18:30:35Z] hottest item p2-attack-f8 (0x2d3b84): 32 reads (0.0000% of all); predicted source none
[2026-10-07T18:30:35Z] program p2-attack-f8 DONE: 1000000 nonces; 6-sigma (windowed) clear; hot-set clear; verdict PASS (no test fired)

View file

@ -0,0 +1,491 @@
[2026-10-07T18:53:17Z] attack-f8 0.1.0 (igneum-pow 4); args ["warps", "--program", "3664", "--nonces", "16777216", "--threads", "48", "--out", "/srv/builds/_adv-adv-accept/live", "--validate", "sample", "--diag", "1"]
[2026-10-07T18:53:17Z] census warps: programs [3664] day 20730 nonces 16777216 threads 48 plant none validate sample check_every 997 diag true
[2026-10-07T18:53:18Z] day 20730: cache filled in 0.63 s, fnv 448274a57f508cbc
[2026-10-07T18:53:22Z] table: 16777216 items derived with their 8 lines in 4.1 s; library comparison sample (0 mismatches)
[2026-10-07T18:53:27Z] program p3664-attack-f8: epoch seed 6c1cc7ecc9215c3070328f35e82c32bd43b7de375dd01edd01d5ebfad624181f era seed 7b9a9acb80ea254c66c67dc756d0bc8821bac6834b30be5def1eb686e302c668 id abfcb4fe4f054bad attempt 1 class mx8-era22e9123a+sh256x27 op mix load=16 mad=9 or=7 shfl=7 add=5 mul=5 xor=4 mulhi=3 rotl=3 sub=3 rotr=2; era stride mul 0x944b0f15 rot 10 interleave [3, 8, 13, 15] windows 1:2:0 2:2:0 7:1:0 10:1:0 17:2:1 22:1:0 33:2:3 34:1:0 36:1:0 41:1:0 43:0:0 44:2:3 48:2:0 50:2:0 52:0:0 59:1:0
[2026-10-07T18:53:27Z] load site instr 1: src r3 win 2 off 0; last base writer add at 56; writers back to the last injecting one: add@56; shadow writes of r3 per rep: add=7 mad=5 mul=2 mulhi=3 or=1 rotl=4 rotr=3 shfl=1 sub=3 xor=5
[2026-10-07T18:53:27Z] load site instr 2: src r5 win 2 off 0; last base writer load at 1; writers back to the last injecting one: load@1; shadow writes of r5 per rep: add=4 mad=5 mulhi=5 or=3 rotl=3 rotr=3 shfl=1 sub=1 xor=5
[2026-10-07T18:53:27Z] load site instr 7: src r5 win 1 off 0; last base writer xor at 3; writers back to the last injecting one: xor@3; shadow writes of r5 per rep: add=4 mad=5 mulhi=5 or=3 rotl=3 rotr=3 shfl=1 sub=1 xor=5
[2026-10-07T18:53:27Z] load site instr 10: src r0 win 1 off 0; last base writer xor at 5; writers back to the last injecting one: xor@5; shadow writes of r0 per rep: add=9 mad=4 mul=3 mulhi=6 or=1 rotl=2 rotr=1 shfl=4 sub=1 xor=5
[2026-10-07T18:53:27Z] load site instr 17: src r2 win 2 off 1; last base writer xor at 14; writers back to the last injecting one: xor@14; shadow writes of r2 per rep: add=3 mad=5 mulhi=1 or=1 rotr=1 shfl=5 sub=1 xor=2
[2026-10-07T18:53:27Z] load site instr 22: src r7 win 1 off 0; last base writer load at 7; writers back to the last injecting one: load@7; shadow writes of r7 per rep: add=6 mad=5 mulhi=5 or=2 rotl=4 rotr=1 shfl=3 sub=4 xor=3
[2026-10-07T18:53:27Z] load site instr 33: src r4 win 2 off 3; last base writer mad at 29; writers back to the last injecting one: mad@29; shadow writes of r4 per rep: add=5 mad=3 mul=4 mulhi=5 or=3 rotl=4 rotr=2 sub=1 xor=3
[2026-10-07T18:53:27Z] load site instr 34: src r2 win 1 off 0; last base writer shfl at 32; writers back to the last injecting one: shfl@32; shadow writes of r2 per rep: add=3 mad=5 mulhi=1 or=1 rotr=1 shfl=5 sub=1 xor=2
[2026-10-07T18:53:27Z] load site instr 36: src r0 win 1 off 0; last base writer load at 34; writers back to the last injecting one: load@34; shadow writes of r0 per rep: add=9 mad=4 mul=3 mulhi=6 or=1 rotl=2 rotr=1 shfl=4 sub=1 xor=5
[2026-10-07T18:53:27Z] load site instr 41: src r3 win 1 off 0; last base writer sub at 39; writers back to the last injecting one: sub@39; shadow writes of r3 per rep: add=7 mad=5 mul=2 mulhi=3 or=1 rotl=4 rotr=3 shfl=1 sub=3 xor=5
[2026-10-07T18:53:27Z] load site instr 43: src r5 win 0 off 0; last base writer rotr at 42; writers back to the last injecting one: rotr@42 mad@38; shadow writes of r5 per rep: add=4 mad=5 mulhi=5 or=3 rotl=3 rotr=3 shfl=1 sub=1 xor=5
[2026-10-07T18:53:27Z] load site instr 44: src r1 win 2 off 3; last base writer load at 43; writers back to the last injecting one: load@43; shadow writes of r1 per rep: add=5 mad=2 mul=5 mulhi=5 or=4 rotl=3 rotr=5 shfl=5 sub=2 xor=3
[2026-10-07T18:53:27Z] load site instr 48: src r4 win 2 off 0; last base writer add at 46; writers back to the last injecting one: add@46; shadow writes of r4 per rep: add=5 mad=3 mul=4 mulhi=5 or=3 rotl=4 rotr=2 sub=1 xor=3
[2026-10-07T18:53:27Z] load site instr 50: src r4 win 2 off 0; last base writer mad at 49; writers back to the last injecting one: mad@49; shadow writes of r4 per rep: add=5 mad=3 mul=4 mulhi=5 or=3 rotl=4 rotr=2 sub=1 xor=3
[2026-10-07T18:53:27Z] load site instr 52: src r2 win 0 off 0; last base writer load at 48; writers back to the last injecting one: load@48; shadow writes of r2 per rep: add=3 mad=5 mulhi=1 or=1 rotr=1 shfl=5 sub=1 xor=2
[2026-10-07T18:53:27Z] load site instr 59: src r6 win 1 off 0; last base writer sub at 58; writers back to the last injecting one: sub@58; shadow writes of r6 per rep: add=6 mad=2 mul=4 mulhi=3 or=1 rotl=2 rotr=3 shfl=4 sub=4 xor=6
[2026-10-07T18:53:27Z] window layer: site item windows (first, items) (0x0,2^22) (0x0,2^22) (0x0,2^23) (0x0,2^23) (0x400000,2^22) (0x0,2^23) (0xc00000,2^22) (0x0,2^23) (0x0,2^23) (0x0,2^23) (0x0,2^24) (0xc00000,2^22) (0x0,2^22) (0x0,2^22) (0x0,2^24) (0x0,2^23); expected reads per item by quarter 256.000 160.000 16.000 80.000 (flat uniform 128.000)
[2026-10-07T18:55:49Z] 524288 warps (16777216 nonces) interpreted in 142.3 s (13.032 ms per warp per thread); Epoch::hash_warp agreement on 589 warps: 0 mismatches
[2026-10-07T18:55:49Z] p3664-attack-f8 distinct lines per hash: n 16777216 min 951 p1 968 median 992 p99 1016 max 1024 mean 991.8774
[2026-10-07T18:55:49Z] p3664-attack-f8 distinct items per hash: n 16777216 min 119 p1 121 median 124 p99 127 max 128 mean 123.9993
[2026-10-07T18:55:49Z] p3664-attack-f8 distinct lines per warp: n 524288 min 31289 p1 31454 median 31606 p99 31759 max 31914 mean 31606.3300
[2026-10-07T18:55:49Z] p3664-attack-f8 distinct items per warp: n 524288 min 3927 p1 3947 median 3966 p99 3985 max 4004 mean 3965.7494
[2026-10-07T18:55:49Z] uniform expectation: distinct lines per hash 1023.875 of 1024 reads, per warp 32640.3 of 32768 reads (2^22 lines); distinct items per hash 127.9995 of 128, per warp 4095.50 of 4096 (2^24 items)
[2026-10-07T18:55:49Z] positions: largest hi16-bucket (256 items) share 0.0199% at p44 (iteration 2, site 12, instr 48); windowed expectation 0.0061%; largest saturated-source share 0.0000% at p0 (site 0, instr 1)
[2026-10-07T18:55:49Z] acceptance-style (2,048 evaluations, the rule's sample size): the most repeated address at one position 2 of 2048 at p0 (site 0, instr 1); saturated sources at one position 0 of 2048 at p0 (site 0, instr 1); uniform expectation: repeats 1 to 2, saturated 0
[2026-10-07T18:55:49Z] p3664-attack-f8 item histogram (flat): bins 16777216 reads 2147483648 mean 128.000 sigma 11.314 max 453 (bin 4048298) z_max +28.73 min 1 z_min -11.23 chi2/dof 67.56930 chi2_z +192805.27 top0.1% 0.31202% top0.5% 1.49813% top1% 2.92904%
[2026-10-07T18:55:49Z] p3664-attack-f8 item histogram against the window density: full 2^24 chi2/dof 2.78575 largest 453 (item 0x3dc5aa) at +12.31 sigma smallest at -6.69; buckets64 chi2/dof 113.26316 largest 25233 (bucket 30484) at +69.13 sigma smallest at -20.04
[2026-10-07T18:55:55Z] p3664-attack-f8 WINDOWED CONTROL item histogram (flat): bins 16777216 reads 2147483648 mean 128.000 sigma 11.314 max 338 (bin 1570772) z_max +18.56 min 1 z_min -11.23 chi2/dof 63.99641 chi2_z +182457.08 top0.1% 0.23801% top0.5% 1.15438% top1% 2.27390%
[2026-10-07T18:55:55Z] p3664-attack-f8 WINDOWED CONTROL against the window density: full chi2/dof 0.99962 largest +6.26 sigma; buckets64 chi2/dof 1.00306 largest +4.40 smallest -4.88
[2026-10-07T18:55:55Z] 6-sigma p3664-attack-f8 items buckets64 against the window density: largest bucket +69.13 sigma, smallest -20.04 -> FLAGGED (beyond 6 sigma)
[2026-10-07T18:55:55Z] hot-set p3664-attack-f8 items (windowed control): f 0.1% S_f 0.31202% E_f(control) 0.23801% X_f +0.07400% X_f/f +0.7400 -> no hot set
[2026-10-07T18:55:55Z] hot-set p3664-attack-f8 items (windowed control): f 0.5% S_f 1.49813% E_f(control) 1.15438% X_f +0.34375% X_f/f +0.6875 -> no hot set
[2026-10-07T18:55:55Z] hot-set p3664-attack-f8 items (windowed control): f 1.0% S_f 2.92904% E_f(control) 2.27390% X_f +0.65514% X_f/f +0.6551 -> no hot set
[2026-10-07T18:55:55Z] hot-set p3664-attack-f8 items (windowed control): verdict clear
[2026-10-07T18:56:01Z] p3664-attack-f8 FLAT CONTROL item histogram: bins 16777216 reads 2147483648 mean 128.000 sigma 11.314 max 196 (bin 4200947) z_max +6.01 min 72 z_min -4.95 chi2/dof 0.99959 chi2_z -1.20 top0.1% 0.13103% top0.5% 0.63233% top1% 1.24318%
[2026-10-07T18:56:01Z] hot-set p3664-attack-f8 items (flat control, the auditor's first view): f 0.1% S_f 0.31202% E_f(control) 0.13103% X_f +0.18098% X_f/f +1.8098 -> HOT SET
[2026-10-07T18:56:01Z] hot-set p3664-attack-f8 items (flat control, the auditor's first view): f 0.5% S_f 1.49813% E_f(control) 0.63233% X_f +0.86580% X_f/f +1.7316 -> HOT SET
[2026-10-07T18:56:01Z] hot-set p3664-attack-f8 items (flat control, the auditor's first view): f 1.0% S_f 2.92904% E_f(control) 1.24318% X_f +1.68586% X_f/f +1.6859 -> HOT SET
[2026-10-07T18:56:01Z] hot-set p3664-attack-f8 items (flat control, the auditor's first view): verdict FLAGGED
[2026-10-07T18:56:01Z] ratio p3664-attack-f8: top 0.1% / 0.5% / 1% share over the WINDOW-MODEL control 1.3109x / 1.2978x / 1.2881x (gate 1.2x at 0.1%: BEYOND); over the FLAT control 2.3812x / 2.3692x / 2.3561x
[2026-10-07T18:56:02Z] attribution: hot threshold count >= 391 marks 16893 items (0.1007% of items) holding 6745828 reads (0.3141% of reads); top 8 items t=0x3dc5aa:453 t=0x379d3d:452 t=0x0f9dfc:451 t=0x18c52f:448 t=0x2f057a:447 t=0x1dbd59:445 t=0x0dc5c2:445 t=0x2e5d0b:443
[2026-10-07T18:57:11Z] attribution: reads on hot items per position (flat expectation 0.1007% of each position's 16777216 reads); the 24 largest: p124(it7 s12)=1.157% p93(it5 s13)=1.157% p29(it1 s13)=1.156% p77(it4 s13)=1.156% p60(it3 s12)=1.155% p76(it4 s12)=1.155% p44(it2 s12)=1.154% p108(it6 s12)=1.154% p13(it0 s13)=1.154% p28(it1 s12)=1.153% p92(it5 s12)=1.153% p109(it6 s13)=1.152% p125(it7 s13)=1.152% p45(it2 s13)=1.151% p61(it3 s13)=1.150% p12(it0 s12)=1.149% p65(it4 s1)=0.472% p113(it7 s1)=0.471% p81(it5 s1)=0.470% p49(it3 s1)=0.469% p33(it2 s1)=0.469% p17(it1 s1)=0.469% p97(it6 s1)=0.468% p1(it0 s1)=0.467%
[2026-10-07T18:57:11Z] attribution: hot reads by iteration it0=0.314% it1=0.314% it2=0.314% it3=0.314% it4=0.315% it5=0.315% it6=0.314% it7=0.314% ; by site s0=0.445% s1=0.469% s2=0.222% s3=0.246% s4=0.000% s5=0.223% s6=0.000% s7=0.223% s8=0.222% s9=0.223% s10=0.111% s11=0.000% s12=1.154% s13=1.153% s14=0.112% s15=0.223%
[2026-10-07T18:57:11Z] site 0 (instr 1, src r3, k_off 2 offset 0, window 2^22 items): share of its reads into the top 0.1% 0.4449% (flat expectation 0.1007%); index entropy 14.000 bits of 14 uniform-on-window; saturated source 0.0000%; largest 256-item bucket 0.0064% (window expectation 0.0061%)
[2026-10-07T18:57:11Z] site 1 (instr 2, src r5, k_off 2 offset 0, window 2^22 items): share of its reads into the top 0.1% 0.4692% (flat expectation 0.1007%); index entropy 14.000 bits of 14 uniform-on-window; saturated source 0.0000%; largest 256-item bucket 0.0064% (window expectation 0.0061%)
[2026-10-07T18:57:11Z] site 2 (instr 7, src r5, k_off 1 offset 0, window 2^23 items): share of its reads into the top 0.1% 0.2223% (flat expectation 0.1007%); index entropy 15.000 bits of 15 uniform-on-window; saturated source 0.0000%; largest 256-item bucket 0.0033% (window expectation 0.0031%)
[2026-10-07T18:57:11Z] site 3 (instr 10, src r0, k_off 1 offset 0, window 2^23 items): share of its reads into the top 0.1% 0.2463% (flat expectation 0.1007%); index entropy 15.000 bits of 15 uniform-on-window; saturated source 0.0000%; largest 256-item bucket 0.0032% (window expectation 0.0031%)
[2026-10-07T18:57:11Z] site 4 (instr 17, src r2, k_off 2 offset 1, window 2^22 items): share of its reads into the top 0.1% 0.0000% (flat expectation 0.1007%); index entropy 14.000 bits of 14 uniform-on-window; saturated source 0.0000%; largest 256-item bucket 0.0064% (window expectation 0.0061%)
[2026-10-07T18:57:11Z] site 5 (instr 22, src r7, k_off 1 offset 0, window 2^23 items): share of its reads into the top 0.1% 0.2225% (flat expectation 0.1007%); index entropy 15.000 bits of 15 uniform-on-window; saturated source 0.0000%; largest 256-item bucket 0.0032% (window expectation 0.0031%)
[2026-10-07T18:57:11Z] site 6 (instr 33, src r4, k_off 2 offset 3, window 2^22 items): share of its reads into the top 0.1% 0.0000% (flat expectation 0.1007%); index entropy 14.000 bits of 14 uniform-on-window; saturated source 0.0000%; largest 256-item bucket 0.0064% (window expectation 0.0061%)
[2026-10-07T18:57:11Z] site 7 (instr 34, src r2, k_off 1 offset 0, window 2^23 items): share of its reads into the top 0.1% 0.2230% (flat expectation 0.1007%); index entropy 15.000 bits of 15 uniform-on-window; saturated source 0.0000%; largest 256-item bucket 0.0032% (window expectation 0.0031%)
[2026-10-07T18:57:11Z] site 8 (instr 36, src r0, k_off 1 offset 0, window 2^23 items): share of its reads into the top 0.1% 0.2221% (flat expectation 0.1007%); index entropy 15.000 bits of 15 uniform-on-window; saturated source 0.0000%; largest 256-item bucket 0.0033% (window expectation 0.0031%)
[2026-10-07T18:57:11Z] site 9 (instr 41, src r3, k_off 1 offset 0, window 2^23 items): share of its reads into the top 0.1% 0.2227% (flat expectation 0.1007%); index entropy 15.000 bits of 15 uniform-on-window; saturated source 0.0000%; largest 256-item bucket 0.0033% (window expectation 0.0031%)
[2026-10-07T18:57:11Z] site 10 (instr 43, src r5, k_off 0 offset 0, window 2^24 items): share of its reads into the top 0.1% 0.1111% (flat expectation 0.1007%); index entropy 16.000 bits of 16 uniform-on-window; saturated source 0.0000%; largest 256-item bucket 0.0017% (window expectation 0.0015%)
[2026-10-07T18:57:11Z] site 11 (instr 44, src r1, k_off 2 offset 3, window 2^22 items): share of its reads into the top 0.1% 0.0000% (flat expectation 0.1007%); index entropy 14.000 bits of 14 uniform-on-window; saturated source 0.0000%; largest 256-item bucket 0.0064% (window expectation 0.0061%)
[2026-10-07T18:57:11Z] site 12 (instr 48, src r4, k_off 2 offset 0, window 2^22 items): share of its reads into the top 0.1% 1.1539% (flat expectation 0.1007%); index entropy 13.727 bits of 14 uniform-on-window; saturated source 0.0000%; largest 256-item bucket 0.0192% (window expectation 0.0061%)
[2026-10-07T18:57:11Z] site 13 (instr 50, src r4, k_off 2 offset 0, window 2^22 items): share of its reads into the top 0.1% 1.1534% (flat expectation 0.1007%); index entropy 13.727 bits of 14 uniform-on-window; saturated source 0.0000%; largest 256-item bucket 0.0191% (window expectation 0.0061%)
[2026-10-07T18:57:11Z] site 14 (instr 52, src r2, k_off 0 offset 0, window 2^24 items): share of its reads into the top 0.1% 0.1117% (flat expectation 0.1007%); index entropy 16.000 bits of 16 uniform-on-window; saturated source 0.0000%; largest 256-item bucket 0.0017% (window expectation 0.0015%)
[2026-10-07T18:57:11Z] site 15 (instr 59, src r6, k_off 1 offset 0, window 2^23 items): share of its reads into the top 0.1% 0.2229% (flat expectation 0.1007%); index entropy 15.000 bits of 15 uniform-on-window; saturated source 0.0000%; largest 256-item bucket 0.0033% (window expectation 0.0031%)
[2026-10-07T18:57:11Z] attribution: item 0x3dc5aa (453 reads) read from positions p108(it6 s12)x22 p44(it2 s12)x17 p93(it5 s13)x17 p13(it0 s13)x16 p124(it7 s12)x15 p28(it1 s12)x14 p92(it5 s12)x14 p109(it6 s13)x14 p81(it5 s1)x12 p125(it7 s13)x11 p61(it3 s13)x11 p12(it0 s12)x10
[2026-10-07T18:57:11Z] attribution: item 0x379d3d (452 reads) read from positions p45(it2 s13)x19 p13(it0 s13)x16 p77(it4 s13)x15 p108(it6 s12)x15 p125(it7 s13)x14 p12(it0 s12)x14 p92(it5 s12)x14 p60(it3 s12)x13 p124(it7 s12)x13 p28(it1 s12)x12 p0(it0 s0)x11 p76(it4 s12)x11
[2026-10-07T18:57:11Z] attribution: item 0x0f9dfc (451 reads) read from positions p44(it2 s12)x23 p76(it4 s12)x20 p109(it6 s13)x17 p12(it0 s12)x16 p60(it3 s12)x16 p45(it2 s13)x15 p125(it7 s13)x14 p92(it5 s12)x13 p93(it5 s13)x11 p61(it3 s13)x10 p108(it6 s12)x10 p77(it4 s13)x9
[2026-10-07T18:57:11Z] attribution: item 0x18c52f (448 reads) read from positions p92(it5 s12)x20 p109(it6 s13)x18 p45(it2 s13)x17 p125(it7 s13)x17 p93(it5 s13)x15 p60(it3 s12)x14 p13(it0 s13)x13 p44(it2 s12)x13 p76(it4 s12)x12 p124(it7 s12)x11 p0(it0 s0)x10 p113(it7 s1)x10
[2026-10-07T18:57:11Z] attribution: item 0x2f057a (447 reads) read from positions p12(it0 s12)x21 p124(it7 s12)x20 p29(it1 s13)x19 p92(it5 s12)x17 p109(it6 s13)x15 p13(it0 s13)x14 p44(it2 s12)x13 p76(it4 s12)x12 p93(it5 s13)x12 p77(it4 s13)x11 p108(it6 s12)x11 p28(it1 s12)x10
[2026-10-07T18:57:11Z] attribution: item 0x1dbd59 (445 reads) read from positions p13(it0 s13)x17 p60(it3 s12)x17 p92(it5 s12)x17 p12(it0 s12)x16 p109(it6 s13)x16 p29(it1 s13)x13 p61(it3 s13)x13 p28(it1 s12)x12 p45(it2 s13)x12 p76(it4 s12)x11 p77(it4 s13)x11 p124(it7 s12)x11
[2026-10-07T18:57:11Z] attribution: item 0x0dc5c2 (445 reads) read from positions p44(it2 s12)x21 p124(it7 s12)x19 p45(it2 s13)x17 p92(it5 s12)x16 p61(it3 s13)x15 p125(it7 s13)x15 p13(it0 s13)x14 p60(it3 s12)x14 p12(it0 s12)x13 p29(it1 s13)x13 p77(it4 s13)x13 p109(it6 s13)x13
[2026-10-07T18:57:11Z] attribution: item 0x2e5d0b (443 reads) read from positions p28(it1 s12)x21 p92(it5 s12)x17 p44(it2 s12)x16 p76(it4 s12)x16 p93(it5 s13)x16 p125(it7 s13)x13 p29(it1 s13)x12 p60(it3 s12)x12 p109(it6 s13)x12 p45(it2 s13)x11 p61(it3 s13)x11 p77(it4 s13)x11
[2026-10-07T18:57:11Z] hottest item p3664-attack-f8 (0x3dc5aa): 453 reads (0.0000% of all); predicted source none
[2026-10-07T18:57:11Z] program p3664-attack-f8 DONE: 16777216 nonces; 6-sigma (windowed) FLAGGED; hot-set clear; verdict FLAGGED
[2026-10-07T18:57:11Z] attack-f8 0.1.0 (igneum-pow 4); args ["warps", "--program", "103378", "--nonces", "16777216", "--threads", "48", "--out", "/srv/builds/_adv-adv-accept/live", "--validate", "sample", "--diag", "1"]
[2026-10-07T18:57:11Z] census warps: programs [103378] day 20730 nonces 16777216 threads 48 plant none validate sample check_every 997 diag true
[2026-10-07T18:57:12Z] day 20730: cache filled in 0.65 s, fnv 448274a57f508cbc
[2026-10-07T18:57:18Z] table: 16777216 items derived with their 8 lines in 5.3 s; library comparison sample (0 mismatches)
[2026-10-07T18:57:22Z] program p103378-attack-f8: epoch seed 08b07518f0d182284f584806ee7e8a6ccd8f2687bf1f6b2424fe168c5ff62125 era seed f5d8d89689c7c389857ec5dd65c50f62afa0bb7f7d7f975d2eaedbe22fd800d6 id 9860246dd6626c61 attempt 6 class mx8-eraa21a23c1+sh256x27 op mix load=16 xor=9 mul=8 mad=6 rotl=6 add=5 mulhi=5 shfl=4 or=2 rotr=2 sub=1; era stride mul 0x7624e9cd rot 11 interleave [1, 2, 4, 7] windows 3:2:1 5:2:0 12:2:0 13:1:0 16:1:1 18:1:1 22:1:1 25:2:3 31:2:0 35:2:0 36:0:0 39:1:1 44:0:0 48:0:0 55:1:0 57:1:1
[2026-10-07T18:57:22Z] load site instr 3: src r7 win 2 off 1; last base writer shfl at 2; writers back to the last injecting one: shfl@2; shadow writes of r7 per rep: add=7 mad=6 mul=2 mulhi=4 rotl=3 rotr=3 shfl=2 sub=3 xor=3
[2026-10-07T18:57:22Z] load site instr 5: src r3 win 2 off 0; last base writer load at 3; writers back to the last injecting one: load@3; shadow writes of r3 per rep: add=3 mad=3 mul=4 mulhi=1 or=3 rotl=2 rotr=2 shfl=2 sub=4 xor=6
[2026-10-07T18:57:22Z] load site instr 12: src r5 win 2 off 0; last base writer mad at 7; writers back to the last injecting one: mad@7; shadow writes of r5 per rep: add=5 mad=2 mul=5 mulhi=3 or=2 rotl=2 rotr=1 shfl=3 xor=5
[2026-10-07T18:57:22Z] load site instr 13: src r6 win 1 off 0; last base writer xor at 8; writers back to the last injecting one: xor@8; shadow writes of r6 per rep: add=6 mad=4 mul=4 mulhi=1 rotl=2 rotr=4 shfl=3 sub=3 xor=3
[2026-10-07T18:57:22Z] load site instr 16: src r7 win 1 off 1; last base writer rotr at 14; writers back to the last injecting one: rotr@14 shfl@2; shadow writes of r7 per rep: add=7 mad=6 mul=2 mulhi=4 rotl=3 rotr=3 shfl=2 sub=3 xor=3
[2026-10-07T18:57:22Z] load site instr 18: src r1 win 1 off 1; last base writer load at 16; writers back to the last injecting one: load@16; shadow writes of r1 per rep: add=1 mad=4 mul=2 mulhi=1 or=2 rotl=2 rotr=1 shfl=8 xor=4
[2026-10-07T18:57:22Z] load site instr 22: src r4 win 1 off 1; last base writer load at 13; writers back to the last injecting one: load@13; shadow writes of r4 per rep: add=7 mad=4 mul=2 mulhi=1 or=4 rotl=8 rotr=3 shfl=6 sub=3 xor=7
[2026-10-07T18:57:22Z] load site instr 25: src r2 win 2 off 3; last base writer mad at 23; writers back to the last injecting one: mad@23; shadow writes of r2 per rep: add=4 mad=7 mul=2 mulhi=1 or=2 rotl=4 rotr=2 shfl=3 xor=4
[2026-10-07T18:57:22Z] load site instr 31: src r4 win 2 off 0; last base writer load at 25; writers back to the last injecting one: load@25; shadow writes of r4 per rep: add=7 mad=4 mul=2 mulhi=1 or=4 rotl=8 rotr=3 shfl=6 sub=3 xor=7
[2026-10-07T18:57:22Z] load site instr 35: src r0 win 2 off 0; last base writer add at 29; writers back to the last injecting one: add@29; shadow writes of r0 per rep: add=4 mad=7 mul=5 mulhi=2 or=1 rotl=6 rotr=1 shfl=6 sub=2 xor=2
[2026-10-07T18:57:22Z] load site instr 36: src r2 win 0 off 0; last base writer xor at 27; writers back to the last injecting one: xor@27; shadow writes of r2 per rep: add=4 mad=7 mul=2 mulhi=1 or=2 rotl=4 rotr=2 shfl=3 xor=4
[2026-10-07T18:57:22Z] load site instr 39: src r2 win 1 off 1; last base writer add at 37; writers back to the last injecting one: add@37; shadow writes of r2 per rep: add=4 mad=7 mul=2 mulhi=1 or=2 rotl=4 rotr=2 shfl=3 xor=4
[2026-10-07T18:57:22Z] load site instr 44: src r2 win 0 off 0; last base writer mad at 40; writers back to the last injecting one: mad@40; shadow writes of r2 per rep: add=4 mad=7 mul=2 mulhi=1 or=2 rotl=4 rotr=2 shfl=3 xor=4
[2026-10-07T18:57:22Z] load site instr 48: src r6 win 0 off 0; last base writer load at 35; writers back to the last injecting one: load@35; shadow writes of r6 per rep: add=6 mad=4 mul=4 mulhi=1 rotl=2 rotr=4 shfl=3 sub=3 xor=3
[2026-10-07T18:57:22Z] load site instr 55: src r5 win 1 off 0; last base writer shfl at 46; writers back to the last injecting one: shfl@46; shadow writes of r5 per rep: add=5 mad=2 mul=5 mulhi=3 or=2 rotl=2 rotr=1 shfl=3 xor=5
[2026-10-07T18:57:22Z] load site instr 57: src r4 win 1 off 1; last base writer rotl at 47; writers back to the last injecting one: rotl@47 mad@45; shadow writes of r4 per rep: add=7 mad=4 mul=2 mulhi=1 or=4 rotl=8 rotr=3 shfl=6 sub=3 xor=7
[2026-10-07T18:57:22Z] window layer: site item windows (first, items) (0x400000,2^22) (0x0,2^22) (0x0,2^22) (0x0,2^23) (0x800000,2^23) (0x800000,2^23) (0x800000,2^23) (0xc00000,2^22) (0x0,2^22) (0x0,2^22) (0x0,2^24) (0x800000,2^23) (0x0,2^24) (0x0,2^24) (0x0,2^23) (0x800000,2^23); expected reads per item by quarter 184.000 88.000 104.000 136.000 (flat uniform 128.000)
[2026-10-07T18:59:36Z] 524288 warps (16777216 nonces) interpreted in 134.0 s (12.269 ms per warp per thread); Epoch::hash_warp agreement on 589 warps: 0 mismatches
[2026-10-07T18:59:36Z] p103378-attack-f8 distinct lines per hash: n 16777216 min 1007 p1 1023 median 1024 p99 1024 max 1024 mean 1023.8708
[2026-10-07T18:59:36Z] p103378-attack-f8 distinct items per hash: n 16777216 min 126 p1 128 median 128 p99 128 max 128 mean 127.9995
[2026-10-07T18:59:36Z] p103378-attack-f8 distinct lines per warp: n 524288 min 32564 p1 32605 median 32636 p99 32664 max 32686 mean 32636.0050
[2026-10-07T18:59:36Z] p103378-attack-f8 distinct items per warp: n 524288 min 4089 p1 4093 median 4096 p99 4096 max 4096 mean 4095.4550
[2026-10-07T18:59:36Z] uniform expectation: distinct lines per hash 1023.875 of 1024 reads, per warp 32640.3 of 32768 reads (2^22 lines); distinct items per hash 127.9995 of 128, per warp 4095.50 of 4096 (2^24 items)
[2026-10-07T18:59:36Z] positions: largest hi16-bucket (256 items) share 0.0100% at p50 (iteration 3, site 2, instr 12); windowed expectation 0.0061%; largest saturated-source share 0.0000% at p0 (site 0, instr 3)
[2026-10-07T18:59:36Z] acceptance-style (2,048 evaluations, the rule's sample size): the most repeated address at one position 2 of 2048 at p67 (site 3, instr 13); saturated sources at one position 0 of 2048 at p0 (site 0, instr 3); uniform expectation: repeats 1 to 2, saturated 0
[2026-10-07T18:59:36Z] p103378-attack-f8 item histogram (flat): bins 16777216 reads 2147483648 mean 128.000 sigma 11.314 max 308 (bin 655418) z_max +15.91 min 47 z_min -7.16 chi2/dof 12.17726 chi2_z +32372.81 top0.1% 0.20376% top0.5% 0.96480% top1% 1.87363%
[2026-10-07T18:59:36Z] p103378-attack-f8 item histogram against the window density: full 2^24 chi2/dof 1.50239 largest 308 (item 0xa003a) at +9.14 sigma smallest at -5.31; buckets64 chi2/dof 33.18869 largest 17212 (bucket 0) at +50.09 sigma smallest at -12.74
[2026-10-07T18:59:43Z] p103378-attack-f8 WINDOWED CONTROL item histogram (flat): bins 16777216 reads 2147483648 mean 128.000 sigma 11.314 max 260 (bin 1504387) z_max +11.67 min 45 z_min -7.34 chi2/dof 11.50116 chi2_z +30414.62 top0.1% 0.17615% top0.5% 0.85022% top1% 1.67062%
[2026-10-07T18:59:43Z] p103378-attack-f8 WINDOWED CONTROL against the window density: full chi2/dof 1.00048 largest +5.60 sigma; buckets64 chi2/dof 0.99549 largest +4.39 smallest -4.67
[2026-10-07T18:59:43Z] 6-sigma p103378-attack-f8 items buckets64 against the window density: largest bucket +50.09 sigma, smallest -12.74 -> FLAGGED (beyond 6 sigma)
[2026-10-07T18:59:43Z] hot-set p103378-attack-f8 items (windowed control): f 0.1% S_f 0.20376% E_f(control) 0.17615% X_f +0.02760% X_f/f +0.2760 -> no hot set
[2026-10-07T18:59:43Z] hot-set p103378-attack-f8 items (windowed control): f 0.5% S_f 0.96480% E_f(control) 0.85022% X_f +0.11458% X_f/f +0.2292 -> no hot set
[2026-10-07T18:59:43Z] hot-set p103378-attack-f8 items (windowed control): f 1.0% S_f 1.87363% E_f(control) 1.67062% X_f +0.20301% X_f/f +0.2030 -> no hot set
[2026-10-07T18:59:43Z] hot-set p103378-attack-f8 items (windowed control): verdict clear
[2026-10-07T18:59:48Z] p103378-attack-f8 FLAT CONTROL item histogram: bins 16777216 reads 2147483648 mean 128.000 sigma 11.314 max 195 (bin 13794611) z_max +5.92 min 73 z_min -4.86 chi2/dof 0.99980 chi2_z -0.59 top0.1% 0.13107% top0.5% 0.63245% top1% 1.24334%
[2026-10-07T18:59:48Z] hot-set p103378-attack-f8 items (flat control, the auditor's first view): f 0.1% S_f 0.20376% E_f(control) 0.13107% X_f +0.07269% X_f/f +0.7269 -> no hot set
[2026-10-07T18:59:48Z] hot-set p103378-attack-f8 items (flat control, the auditor's first view): f 0.5% S_f 0.96480% E_f(control) 0.63245% X_f +0.33235% X_f/f +0.6647 -> no hot set
[2026-10-07T18:59:48Z] hot-set p103378-attack-f8 items (flat control, the auditor's first view): f 1.0% S_f 1.87363% E_f(control) 1.24334% X_f +0.63029% X_f/f +0.6303 -> no hot set
[2026-10-07T18:59:48Z] hot-set p103378-attack-f8 items (flat control, the auditor's first view): verdict clear
[2026-10-07T18:59:48Z] ratio p103378-attack-f8: top 0.1% / 0.5% / 1% share over the WINDOW-MODEL control 1.1567x / 1.1348x / 1.1215x (gate 1.2x at 0.1%: within); over the FLAT control 1.5546x / 1.5255x / 1.5069x
[2026-10-07T18:59:50Z] attribution: hot threshold count >= 253 marks 18036 items (0.1075% of items) holding 4694173 reads (0.2186% of reads); top 8 items t=0x0a003a:308 t=0x188019:306 t=0x000023:306 t=0x390074:305 t=0x200030:305 t=0x00000a:303 t=0x180068:302 t=0x2ae040:300
[2026-10-07T19:00:50Z] attribution: reads on hot items per position (flat expectation 0.1075% of each position's 16777216 reads); the 24 largest: p50(it3 s2)=1.104% p98(it6 s2)=1.103% p82(it5 s2)=1.103% p18(it1 s2)=1.103% p34(it2 s2)=1.102% p66(it4 s2)=1.101% p114(it7 s2)=1.096% p24(it1 s8)=0.487% p9(it0 s9)=0.485% p40(it2 s8)=0.484% p104(it6 s8)=0.484% p56(it3 s8)=0.484% p72(it4 s8)=0.483% p89(it5 s9)=0.483% p97(it6 s1)=0.483% p8(it0 s8)=0.483% p105(it6 s9)=0.483% p1(it0 s1)=0.482% p33(it2 s1)=0.482% p65(it4 s1)=0.482% p120(it7 s8)=0.482% p49(it3 s1)=0.482% p57(it3 s9)=0.482% p73(it4 s9)=0.482%
[2026-10-07T19:00:50Z] attribution: hot reads by iteration it0=0.188% it1=0.223% it2=0.223% it3=0.223% it4=0.223% it5=0.223% it6=0.223% it7=0.222% ; by site s0=0.000% s1=0.482% s2=1.024% s3=0.240% s4=0.000% s5=0.000% s6=0.000% s7=0.000% s8=0.484% s9=0.482% s10=0.120% s11=0.000% s12=0.305% s13=0.120% s14=0.240% s15=0.000%
[2026-10-07T19:00:50Z] site 0 (instr 3, src r7, k_off 2 offset 1, window 2^22 items): share of its reads into the top 0.1% 0.0000% (flat expectation 0.1075%); index entropy 14.000 bits of 14 uniform-on-window; saturated source 0.0000%; largest 256-item bucket 0.0064% (window expectation 0.0061%)
[2026-10-07T19:00:50Z] site 1 (instr 5, src r3, k_off 2 offset 0, window 2^22 items): share of its reads into the top 0.1% 0.4817% (flat expectation 0.1075%); index entropy 14.000 bits of 14 uniform-on-window; saturated source 0.0000%; largest 256-item bucket 0.0064% (window expectation 0.0061%)
[2026-10-07T19:00:50Z] site 2 (instr 12, src r5, k_off 2 offset 0, window 2^22 items): share of its reads into the top 0.1% 1.0241% (flat expectation 0.1075%); index entropy 13.979 bits of 14 uniform-on-window; saturated source 0.0000%; largest 256-item bucket 0.0091% (window expectation 0.0061%)
[2026-10-07T19:00:50Z] site 3 (instr 13, src r6, k_off 1 offset 0, window 2^23 items): share of its reads into the top 0.1% 0.2403% (flat expectation 0.1075%); index entropy 15.000 bits of 15 uniform-on-window; saturated source 0.0000%; largest 256-item bucket 0.0033% (window expectation 0.0031%)
[2026-10-07T19:00:50Z] site 4 (instr 16, src r7, k_off 1 offset 1, window 2^23 items): share of its reads into the top 0.1% 0.0000% (flat expectation 0.1075%); index entropy 15.000 bits of 15 uniform-on-window; saturated source 0.0000%; largest 256-item bucket 0.0033% (window expectation 0.0031%)
[2026-10-07T19:00:50Z] site 5 (instr 18, src r1, k_off 1 offset 1, window 2^23 items): share of its reads into the top 0.1% 0.0000% (flat expectation 0.1075%); index entropy 15.000 bits of 15 uniform-on-window; saturated source 0.0000%; largest 256-item bucket 0.0032% (window expectation 0.0031%)
[2026-10-07T19:00:50Z] site 6 (instr 22, src r4, k_off 1 offset 1, window 2^23 items): share of its reads into the top 0.1% 0.0000% (flat expectation 0.1075%); index entropy 15.000 bits of 15 uniform-on-window; saturated source 0.0000%; largest 256-item bucket 0.0033% (window expectation 0.0031%)
[2026-10-07T19:00:50Z] site 7 (instr 25, src r2, k_off 2 offset 3, window 2^22 items): share of its reads into the top 0.1% 0.0000% (flat expectation 0.1075%); index entropy 14.000 bits of 14 uniform-on-window; saturated source 0.0000%; largest 256-item bucket 0.0063% (window expectation 0.0061%)
[2026-10-07T19:00:50Z] site 8 (instr 31, src r4, k_off 2 offset 0, window 2^22 items): share of its reads into the top 0.1% 0.4835% (flat expectation 0.1075%); index entropy 14.000 bits of 14 uniform-on-window; saturated source 0.0000%; largest 256-item bucket 0.0064% (window expectation 0.0061%)
[2026-10-07T19:00:50Z] site 9 (instr 35, src r0, k_off 2 offset 0, window 2^22 items): share of its reads into the top 0.1% 0.4820% (flat expectation 0.1075%); index entropy 14.000 bits of 14 uniform-on-window; saturated source 0.0000%; largest 256-item bucket 0.0064% (window expectation 0.0061%)
[2026-10-07T19:00:50Z] site 10 (instr 36, src r2, k_off 0 offset 0, window 2^24 items): share of its reads into the top 0.1% 0.1203% (flat expectation 0.1075%); index entropy 16.000 bits of 16 uniform-on-window; saturated source 0.0000%; largest 256-item bucket 0.0017% (window expectation 0.0015%)
[2026-10-07T19:00:50Z] site 11 (instr 39, src r2, k_off 1 offset 1, window 2^23 items): share of its reads into the top 0.1% 0.0000% (flat expectation 0.1075%); index entropy 15.000 bits of 15 uniform-on-window; saturated source 0.0000%; largest 256-item bucket 0.0032% (window expectation 0.0031%)
[2026-10-07T19:00:50Z] site 12 (instr 44, src r2, k_off 0 offset 0, window 2^24 items): share of its reads into the top 0.1% 0.3053% (flat expectation 0.1075%); index entropy 15.972 bits of 16 uniform-on-window; saturated source 0.0000%; largest 256-item bucket 0.0051% (window expectation 0.0015%)
[2026-10-07T19:00:50Z] site 13 (instr 48, src r6, k_off 0 offset 0, window 2^24 items): share of its reads into the top 0.1% 0.1202% (flat expectation 0.1075%); index entropy 16.000 bits of 16 uniform-on-window; saturated source 0.0000%; largest 256-item bucket 0.0017% (window expectation 0.0015%)
[2026-10-07T19:00:50Z] site 14 (instr 55, src r5, k_off 1 offset 0, window 2^23 items): share of its reads into the top 0.1% 0.2400% (flat expectation 0.1075%); index entropy 15.000 bits of 15 uniform-on-window; saturated source 0.0000%; largest 256-item bucket 0.0033% (window expectation 0.0031%)
[2026-10-07T19:00:50Z] site 15 (instr 57, src r4, k_off 1 offset 1, window 2^23 items): share of its reads into the top 0.1% 0.0000% (flat expectation 0.1075%); index entropy 15.000 bits of 15 uniform-on-window; saturated source 0.0000%; largest 256-item bucket 0.0032% (window expectation 0.0031%)
[2026-10-07T19:00:50Z] attribution: item 0x0a003a (308 reads) read from positions p50(it3 s2)x18 p66(it4 s2)x16 p34(it2 s2)x14 p18(it1 s2)x12 p114(it7 s2)x10 p24(it1 s8)x10 p82(it5 s2)x10 p65(it4 s1)x9 p89(it5 s9)x9 p40(it2 s8)x8 p98(it6 s2)x8 p97(it6 s1)x7
[2026-10-07T19:00:50Z] attribution: item 0x188019 (306 reads) read from positions p66(it4 s2)x16 p98(it6 s2)x16 p18(it1 s2)x13 p34(it2 s2)x12 p41(it2 s9)x10 p114(it7 s2)x10 p50(it3 s2)x9 p82(it5 s2)x9 p105(it6 s9)x9 p2(it0 s2)x8 p12(it0 s12)x8 p40(it2 s8)x8
[2026-10-07T19:00:50Z] attribution: item 0x000023 (306 reads) read from positions p98(it6 s2)x13 p34(it2 s2)x12 p114(it7 s2)x12 p33(it2 s1)x11 p60(it3 s12)x11 p12(it0 s12)x10 p66(it4 s2)x10 p120(it7 s8)x9 p28(it1 s12)x9 p44(it2 s12)x9 p76(it4 s12)x9 p82(it5 s2)x9
[2026-10-07T19:00:50Z] attribution: item 0x390074 (305 reads) read from positions p82(it5 s2)x21 p66(it4 s2)x19 p114(it7 s2)x17 p50(it3 s2)x12 p98(it6 s2)x12 p18(it1 s2)x11 p2(it0 s2)x10 p113(it7 s1)x10 p34(it2 s2)x9 p97(it6 s1)x9 p40(it2 s8)x7 p108(it6 s12)x7
[2026-10-07T19:00:50Z] attribution: item 0x200030 (305 reads) read from positions p66(it4 s2)x19 p18(it1 s2)x18 p82(it5 s2)x14 p98(it6 s2)x13 p12(it0 s12)x10 p28(it1 s12)x10 p34(it2 s2)x10 p114(it7 s2)x10 p25(it1 s9)x8 p50(it3 s2)x8 p92(it5 s12)x8 p121(it7 s9)x7
[2026-10-07T19:00:50Z] attribution: item 0x00000a (303 reads) read from positions p18(it1 s2)x16 p50(it3 s2)x14 p124(it7 s12)x13 p66(it4 s2)x13 p98(it6 s2)x12 p60(it3 s12)x11 p1(it0 s1)x9 p34(it2 s2)x9 p44(it2 s12)x9 p108(it6 s12)x9 p76(it4 s12)x8 p82(it5 s2)x8
[2026-10-07T19:00:50Z] attribution: item 0x180068 (302 reads) read from positions p34(it2 s2)x14 p50(it3 s2)x14 p82(it5 s2)x14 p98(it6 s2)x12 p18(it1 s2)x11 p8(it0 s8)x10 p12(it0 s12)x10 p66(it4 s2)x10 p88(it5 s8)x10 p44(it2 s12)x9 p114(it7 s2)x8 p9(it0 s9)x8
[2026-10-07T19:00:50Z] attribution: item 0x2ae040 (300 reads) read from positions p66(it4 s2)x16 p34(it2 s2)x15 p98(it6 s2)x13 p82(it5 s2)x12 p121(it7 s9)x10 p50(it3 s2)x10 p57(it3 s9)x10 p2(it0 s2)x9 p114(it7 s2)x8 p49(it3 s1)x8 p33(it2 s1)x7 p73(it4 s9)x7
[2026-10-07T19:00:50Z] hottest item p103378-attack-f8 (0x0a003a): 308 reads (0.0000% of all); predicted source none
[2026-10-07T19:00:50Z] program p103378-attack-f8 DONE: 16777216 nonces; 6-sigma (windowed) FLAGGED; hot-set clear; verdict FLAGGED
[2026-10-07T19:00:50Z] attack-f8 0.1.0 (igneum-pow 4); args ["warps", "--program", "105756", "--nonces", "16777216", "--threads", "48", "--out", "/srv/builds/_adv-adv-accept/live", "--validate", "sample", "--diag", "1"]
[2026-10-07T19:00:50Z] census warps: programs [105756] day 20730 nonces 16777216 threads 48 plant none validate sample check_every 997 diag true
[2026-10-07T19:00:51Z] day 20730: cache filled in 0.47 s, fnv 448274a57f508cbc
[2026-10-07T19:00:56Z] table: 16777216 items derived with their 8 lines in 4.9 s; library comparison sample (0 mismatches)
[2026-10-07T19:00:59Z] program p105756-attack-f8: epoch seed c73bcc3bf9000477e9a1c63896b1e9ddd12dde21af5b8300aea3d73a55b8d380 era seed 052f84716bedccaa2c2a056ee4ecdaf3e7cb3c5cc1a94b8c16ec915a470c2849 id 3ec7fb163a6152f5 attempt 0 class mx8-era30fb3e21+sh256x27 op mix load=16 mulhi=8 mad=6 sub=6 rotr=5 shfl=5 add=4 mul=4 rotl=4 xor=4 or=2; era stride mul 0xd02c7407 rot 20 interleave [3, 7, 12, 15] windows 1:0:0 7:1:1 11:1:1 14:1:1 26:0:0 27:2:1 32:2:1 34:0:0 35:0:0 45:1:0 46:1:1 51:0:0 52:0:0 53:2:3 60:0:0 61:1:0
[2026-10-07T19:00:59Z] load site instr 1: src r7 win 0 off 0; last base writer sub at 0; writers back to the last injecting one: sub@0; shadow writes of r7 per rep: add=3 mad=2 mul=7 mulhi=4 rotl=2 shfl=4 sub=2 xor=3
[2026-10-07T19:00:59Z] load site instr 7: src r6 win 1 off 1; last base writer xor at 3; writers back to the last injecting one: xor@3; shadow writes of r6 per rep: add=5 mad=4 mul=1 mulhi=2 or=3 rotl=7 rotr=6 shfl=2 xor=5
[2026-10-07T19:00:59Z] load site instr 11: src r3 win 1 off 1; last base writer sub at 6; writers back to the last injecting one: sub@6; shadow writes of r3 per rep: add=3 mad=5 mul=2 mulhi=2 or=2 rotl=1 rotr=1 shfl=2 sub=2 xor=6
[2026-10-07T19:00:59Z] load site instr 14: src r5 win 1 off 1; last base writer mad at 12; writers back to the last injecting one: mad@12; shadow writes of r5 per rep: add=10 mad=4 mul=6 mulhi=2 or=2 rotl=6 shfl=2 sub=1 xor=5
[2026-10-07T19:00:59Z] load site instr 26: src r0 win 0 off 0; last base writer shfl at 9; writers back to the last injecting one: shfl@9; shadow writes of r0 per rep: add=5 mad=5 mul=4 mulhi=1 or=2 rotl=2 rotr=3 shfl=4 sub=1 xor=5
[2026-10-07T19:00:59Z] load site instr 27: src r5 win 2 off 1; last base writer mad at 21; writers back to the last injecting one: mad@21; shadow writes of r5 per rep: add=10 mad=4 mul=6 mulhi=2 or=2 rotl=6 shfl=2 sub=1 xor=5
[2026-10-07T19:00:59Z] load site instr 32: src r7 win 2 off 1; last base writer shfl at 29; writers back to the last injecting one: shfl@29; shadow writes of r7 per rep: add=3 mad=2 mul=7 mulhi=4 rotl=2 shfl=4 sub=2 xor=3
[2026-10-07T19:00:59Z] load site instr 34: src r5 win 0 off 0; last base writer load at 32; writers back to the last injecting one: load@32; shadow writes of r5 per rep: add=10 mad=4 mul=6 mulhi=2 or=2 rotl=6 shfl=2 sub=1 xor=5
[2026-10-07T19:00:59Z] load site instr 35: src r1 win 0 off 0; last base writer load at 27; writers back to the last injecting one: load@27; shadow writes of r1 per rep: add=5 mad=3 mul=2 mulhi=2 or=2 rotl=4 rotr=3 xor=5
[2026-10-07T19:00:59Z] load site instr 45: src r1 win 1 off 0; last base writer rotl at 43; writers back to the last injecting one: rotl@43 xor@39; shadow writes of r1 per rep: add=5 mad=3 mul=2 mulhi=2 or=2 rotl=4 rotr=3 xor=5
[2026-10-07T19:00:59Z] load site instr 46: src r7 win 1 off 1; last base writer shfl at 44; writers back to the last injecting one: shfl@44; shadow writes of r7 per rep: add=3 mad=2 mul=7 mulhi=4 rotl=2 shfl=4 sub=2 xor=3
[2026-10-07T19:00:59Z] load site instr 51: src r6 win 0 off 0; last base writer rotl at 40; writers back to the last injecting one: rotl@40 load@35; shadow writes of r6 per rep: add=5 mad=4 mul=1 mulhi=2 or=3 rotl=7 rotr=6 shfl=2 xor=5
[2026-10-07T19:00:59Z] load site instr 52: src r2 win 0 off 0; last base writer mad at 50; writers back to the last injecting one: mad@50; shadow writes of r2 per rep: add=3 mad=4 mul=4 mulhi=3 or=1 rotl=2 rotr=4 shfl=3 sub=6 xor=4
[2026-10-07T19:00:59Z] load site instr 53: src r1 win 2 off 3; last base writer load at 51; writers back to the last injecting one: load@51; shadow writes of r1 per rep: add=5 mad=3 mul=2 mulhi=2 or=2 rotl=4 rotr=3 xor=5
[2026-10-07T19:00:59Z] load site instr 60: src r7 win 0 off 0; last base writer rotr at 55; writers back to the last injecting one: rotr@55 shfl@44; shadow writes of r7 per rep: add=3 mad=2 mul=7 mulhi=4 rotl=2 shfl=4 sub=2 xor=3
[2026-10-07T19:00:59Z] load site instr 61: src r5 win 1 off 0; last base writer load at 53; writers back to the last injecting one: load@53; shadow writes of r5 per rep: add=10 mad=4 mul=6 mulhi=2 or=2 rotl=6 shfl=2 sub=1 xor=5
[2026-10-07T19:00:59Z] window layer: site item windows (first, items) (0x0,2^24) (0x800000,2^23) (0x800000,2^23) (0x800000,2^23) (0x0,2^24) (0x400000,2^22) (0x400000,2^22) (0x0,2^24) (0x0,2^24) (0x0,2^23) (0x800000,2^23) (0x0,2^24) (0x0,2^24) (0xc00000,2^22) (0x0,2^24) (0x0,2^23); expected reads per item by quarter 88.000 152.000 120.000 152.000 (flat uniform 128.000)
[2026-10-07T19:03:38Z] 524288 warps (16777216 nonces) interpreted in 159.7 s (14.625 ms per warp per thread); Epoch::hash_warp agreement on 589 warps: 0 mismatches
[2026-10-07T19:03:38Z] p105756-attack-f8 distinct lines per hash: n 16777216 min 991 p1 1015 median 1024 p99 1024 max 1024 mean 1022.8719
[2026-10-07T19:03:38Z] p105756-attack-f8 distinct items per hash: n 16777216 min 124 p1 127 median 128 p99 128 max 128 mean 127.8745
[2026-10-07T19:03:38Z] p105756-attack-f8 distinct lines per warp: n 524288 min 32496 p1 32554 median 32605 p99 32647 max 32685 mean 32604.4774
[2026-10-07T19:03:38Z] p105756-attack-f8 distinct items per warp: n 524288 min 4079 p1 4086 median 4092 p99 4096 max 4096 mean 4091.4810
[2026-10-07T19:03:38Z] uniform expectation: distinct lines per hash 1023.875 of 1024 reads, per warp 32640.3 of 32768 reads (2^22 lines); distinct items per hash 127.9995 of 128, per warp 4095.50 of 4096 (2^24 items)
[2026-10-07T19:03:38Z] positions: largest hi16-bucket (256 items) share 0.0070% at p6 (iteration 0, site 6, instr 32); windowed expectation 0.0061%; largest saturated-source share 0.0000% at p0 (site 0, instr 1)
[2026-10-07T19:03:38Z] acceptance-style (2,048 evaluations, the rule's sample size): the most repeated address at one position 2 of 2048 at p85 (site 5, instr 27); saturated sources at one position 0 of 2048 at p0 (site 0, instr 1); uniform expectation: repeats 1 to 2, saturated 0
[2026-10-07T19:03:39Z] p105756-attack-f8 item histogram (flat): bins 16777216 reads 2147483648 mean 128.000 sigma 11.314 max 218 (bin 6361057) z_max +7.95 min 45 z_min -7.34 chi2/dof 6.50150 chi2_z +15934.04 top0.1% 0.15043% top0.5% 0.72614% top1% 1.42710%
[2026-10-07T19:03:39Z] p105756-attack-f8 item histogram against the window density: full 2^24 chi2/dof 1.00182 largest 186 (item 0xb64382) at +6.02 sigma smallest at -4.93; buckets64 chi2/dof 1.03311 largest 10165 (bucket 108475) at +4.43 sigma smallest at -5.37
[2026-10-07T19:03:45Z] p105756-attack-f8 WINDOWED CONTROL item histogram (flat): bins 16777216 reads 2147483648 mean 128.000 sigma 11.314 max 225 (bin 12696377) z_max +8.57 min 46 z_min -7.25 chi2/dof 6.49894 chi2_z +15926.63 top0.1% 0.15050% top0.5% 0.72613% top1% 1.42695%
[2026-10-07T19:03:45Z] p105756-attack-f8 WINDOWED CONTROL against the window density: full chi2/dof 0.99960 largest +5.92 sigma; buckets64 chi2/dof 1.00393 largest +4.72 smallest -4.74
[2026-10-07T19:03:45Z] 6-sigma p105756-attack-f8 items buckets64 against the window density: largest bucket +4.43 sigma, smallest -5.37 -> within 6 sigma
[2026-10-07T19:03:45Z] hot-set p105756-attack-f8 items (windowed control): f 0.1% S_f 0.15043% E_f(control) 0.15050% X_f -0.00007% X_f/f -0.0007 -> no hot set
[2026-10-07T19:03:45Z] hot-set p105756-attack-f8 items (windowed control): f 0.5% S_f 0.72614% E_f(control) 0.72613% X_f +0.00001% X_f/f +0.0000 -> no hot set
[2026-10-07T19:03:45Z] hot-set p105756-attack-f8 items (windowed control): f 1.0% S_f 1.42710% E_f(control) 1.42695% X_f +0.00015% X_f/f +0.0001 -> no hot set
[2026-10-07T19:03:45Z] hot-set p105756-attack-f8 items (windowed control): verdict clear
[2026-10-07T19:03:51Z] p105756-attack-f8 FLAT CONTROL item histogram: bins 16777216 reads 2147483648 mean 128.000 sigma 11.314 max 194 (bin 5534086) z_max +5.83 min 71 z_min -5.04 chi2/dof 1.00035 chi2_z +1.01 top0.1% 0.13114% top0.5% 0.63261% top1% 1.24354%
[2026-10-07T19:03:51Z] hot-set p105756-attack-f8 items (flat control, the auditor's first view): f 0.1% S_f 0.15043% E_f(control) 0.13114% X_f +0.01929% X_f/f +0.1929 -> no hot set
[2026-10-07T19:03:51Z] hot-set p105756-attack-f8 items (flat control, the auditor's first view): f 0.5% S_f 0.72614% E_f(control) 0.63261% X_f +0.09353% X_f/f +0.1871 -> no hot set
[2026-10-07T19:03:51Z] hot-set p105756-attack-f8 items (flat control, the auditor's first view): f 1.0% S_f 1.42710% E_f(control) 1.24354% X_f +0.18355% X_f/f +0.1836 -> no hot set
[2026-10-07T19:03:51Z] hot-set p105756-attack-f8 items (flat control, the auditor's first view): verdict clear
[2026-10-07T19:03:51Z] ratio p105756-attack-f8: top 0.1% / 0.5% / 1% share over the WINDOW-MODEL control 0.9996x / 1.0000x / 1.0001x (gate 1.2x at 0.1%: within); over the FLAT control 1.1471x / 1.1478x / 1.1476x
[2026-10-07T19:03:53Z] attribution: hot threshold count >= 189 marks 17511 items (0.1044% of items) holding 3369246 reads (0.1569% of reads); top 8 items t=0x610fe1:218 t=0x7ca442:217 t=0xf3c05f:216 t=0xda9abe:216 t=0xfeeaf4:215 t=0xeeec40:215 t=0x796f55:215 t=0xfc94f0:214
[2026-10-07T19:05:02Z] attribution: reads on hot items per position (flat expectation 0.1044% of each position's 16777216 reads); the 24 largest: p77(it4 s13)=0.267% p61(it3 s13)=0.266% p53(it3 s5)=0.265% p38(it2 s6)=0.265% p21(it1 s5)=0.265% p85(it5 s5)=0.265% p6(it0 s6)=0.265% p13(it0 s13)=0.264% p101(it6 s5)=0.264% p22(it1 s6)=0.264% p29(it1 s13)=0.264% p45(it2 s13)=0.264% p70(it4 s6)=0.264% p54(it3 s6)=0.264% p117(it7 s5)=0.264% p102(it6 s6)=0.264% p86(it5 s6)=0.264% p109(it6 s13)=0.264% p69(it4 s5)=0.264% p125(it7 s13)=0.263% p93(it5 s13)=0.263% p118(it7 s6)=0.263% p37(it2 s5)=0.262% p5(it0 s5)=0.262%
[2026-10-07T19:05:02Z] attribution: hot reads by iteration it0=0.157% it1=0.157% it2=0.157% it3=0.157% it4=0.157% it5=0.157% it6=0.157% it7=0.157% ; by site s0=0.132% s1=0.132% s2=0.132% s3=0.132% s4=0.132% s5=0.264% s6=0.264% s7=0.132% s8=0.132% s9=0.132% s10=0.133% s11=0.132% s12=0.132% s13=0.264% s14=0.133% s15=0.132%
[2026-10-07T19:05:02Z] site 0 (instr 1, src r7, k_off 0 offset 0, window 2^24 items): share of its reads into the top 0.1% 0.1323% (flat expectation 0.1044%); index entropy 16.000 bits of 16 uniform-on-window; saturated source 0.0000%; largest 256-item bucket 0.0017% (window expectation 0.0015%)
[2026-10-07T19:05:02Z] site 1 (instr 7, src r6, k_off 1 offset 1, window 2^23 items): share of its reads into the top 0.1% 0.1324% (flat expectation 0.1044%); index entropy 15.000 bits of 15 uniform-on-window; saturated source 0.0000%; largest 256-item bucket 0.0033% (window expectation 0.0031%)
[2026-10-07T19:05:02Z] site 2 (instr 11, src r3, k_off 1 offset 1, window 2^23 items): share of its reads into the top 0.1% 0.1318% (flat expectation 0.1044%); index entropy 15.000 bits of 15 uniform-on-window; saturated source 0.0000%; largest 256-item bucket 0.0032% (window expectation 0.0031%)
[2026-10-07T19:05:02Z] site 3 (instr 14, src r5, k_off 1 offset 1, window 2^23 items): share of its reads into the top 0.1% 0.1317% (flat expectation 0.1044%); index entropy 15.000 bits of 15 uniform-on-window; saturated source 0.0000%; largest 256-item bucket 0.0033% (window expectation 0.0031%)
[2026-10-07T19:05:02Z] site 4 (instr 26, src r0, k_off 0 offset 0, window 2^24 items): share of its reads into the top 0.1% 0.1318% (flat expectation 0.1044%); index entropy 16.000 bits of 16 uniform-on-window; saturated source 0.0000%; largest 256-item bucket 0.0017% (window expectation 0.0015%)
[2026-10-07T19:05:02Z] site 5 (instr 27, src r5, k_off 2 offset 1, window 2^22 items): share of its reads into the top 0.1% 0.2639% (flat expectation 0.1044%); index entropy 14.000 bits of 14 uniform-on-window; saturated source 0.0000%; largest 256-item bucket 0.0065% (window expectation 0.0061%)
[2026-10-07T19:05:02Z] site 6 (instr 32, src r7, k_off 2 offset 1, window 2^22 items): share of its reads into the top 0.1% 0.2640% (flat expectation 0.1044%); index entropy 14.000 bits of 14 uniform-on-window; saturated source 0.0000%; largest 256-item bucket 0.0063% (window expectation 0.0061%)
[2026-10-07T19:05:02Z] site 7 (instr 34, src r5, k_off 0 offset 0, window 2^24 items): share of its reads into the top 0.1% 0.1325% (flat expectation 0.1044%); index entropy 16.000 bits of 16 uniform-on-window; saturated source 0.0000%; largest 256-item bucket 0.0017% (window expectation 0.0015%)
[2026-10-07T19:05:02Z] site 8 (instr 35, src r1, k_off 0 offset 0, window 2^24 items): share of its reads into the top 0.1% 0.1322% (flat expectation 0.1044%); index entropy 16.000 bits of 16 uniform-on-window; saturated source 0.0000%; largest 256-item bucket 0.0017% (window expectation 0.0015%)
[2026-10-07T19:05:02Z] site 9 (instr 45, src r1, k_off 1 offset 0, window 2^23 items): share of its reads into the top 0.1% 0.1318% (flat expectation 0.1044%); index entropy 15.000 bits of 15 uniform-on-window; saturated source 0.0000%; largest 256-item bucket 0.0032% (window expectation 0.0031%)
[2026-10-07T19:05:02Z] site 10 (instr 46, src r7, k_off 1 offset 1, window 2^23 items): share of its reads into the top 0.1% 0.1329% (flat expectation 0.1044%); index entropy 15.000 bits of 15 uniform-on-window; saturated source 0.0000%; largest 256-item bucket 0.0032% (window expectation 0.0031%)
[2026-10-07T19:05:02Z] site 11 (instr 51, src r6, k_off 0 offset 0, window 2^24 items): share of its reads into the top 0.1% 0.1318% (flat expectation 0.1044%); index entropy 16.000 bits of 16 uniform-on-window; saturated source 0.0000%; largest 256-item bucket 0.0017% (window expectation 0.0015%)
[2026-10-07T19:05:02Z] site 12 (instr 52, src r2, k_off 0 offset 0, window 2^24 items): share of its reads into the top 0.1% 0.1317% (flat expectation 0.1044%); index entropy 16.000 bits of 16 uniform-on-window; saturated source 0.0000%; largest 256-item bucket 0.0017% (window expectation 0.0015%)
[2026-10-07T19:05:02Z] site 13 (instr 53, src r1, k_off 2 offset 3, window 2^22 items): share of its reads into the top 0.1% 0.2644% (flat expectation 0.1044%); index entropy 14.000 bits of 14 uniform-on-window; saturated source 0.0000%; largest 256-item bucket 0.0063% (window expectation 0.0061%)
[2026-10-07T19:05:02Z] site 14 (instr 60, src r7, k_off 0 offset 0, window 2^24 items): share of its reads into the top 0.1% 0.1330% (flat expectation 0.1044%); index entropy 16.000 bits of 16 uniform-on-window; saturated source 0.0000%; largest 256-item bucket 0.0017% (window expectation 0.0015%)
[2026-10-07T19:05:02Z] site 15 (instr 61, src r5, k_off 1 offset 0, window 2^23 items): share of its reads into the top 0.1% 0.1321% (flat expectation 0.1044%); index entropy 15.000 bits of 15 uniform-on-window; saturated source 0.0000%; largest 256-item bucket 0.0032% (window expectation 0.0031%)
[2026-10-07T19:05:02Z] attribution: item 0x610fe1 (218 reads) read from positions p21(it1 s5)x10 p53(it3 s5)x10 p117(it7 s5)x7 p5(it0 s5)x6 p37(it2 s5)x6 p70(it4 s6)x6 p85(it5 s5)x6 p86(it5 s6)x6 p102(it6 s6)x6 p127(it7 s15)x5 p6(it0 s6)x5 p15(it0 s15)x5
[2026-10-07T19:05:02Z] attribution: item 0x7ca442 (217 reads) read from positions p86(it5 s6)x9 p121(it7 s9)x8 p21(it1 s5)x7 p22(it1 s6)x7 p102(it6 s6)x7 p54(it3 s6)x6 p73(it4 s9)x6 p95(it5 s15)x6 p101(it6 s5)x6 p5(it0 s5)x5 p53(it3 s5)x5 p110(it6 s14)x5
[2026-10-07T19:05:02Z] attribution: item 0xf3c05f (216 reads) read from positions p45(it2 s13)x11 p99(it6 s3)x8 p29(it1 s13)x8 p93(it5 s13)x8 p1(it0 s1)x6 p26(it1 s10)x6 p33(it2 s1)x6 p42(it2 s10)x6 p109(it6 s13)x6 p115(it7 s3)x6 p122(it7 s10)x6 p77(it4 s13)x5
[2026-10-07T19:05:02Z] attribution: item 0xda9abe (216 reads) read from positions p29(it1 s13)x8 p45(it2 s13)x8 p61(it3 s13)x8 p18(it1 s2)x7 p106(it6 s10)x7 p125(it7 s13)x5 p13(it0 s13)x5 p16(it1 s0)x5 p26(it1 s10)x5 p82(it5 s2)x5 p93(it5 s13)x5 p109(it6 s13)x5
[2026-10-07T19:05:02Z] attribution: item 0xfeeaf4 (215 reads) read from positions p13(it0 s13)x10 p93(it5 s13)x10 p51(it3 s3)x8 p77(it4 s13)x6 p114(it7 s2)x6 p115(it7 s3)x6 p2(it0 s2)x5 p61(it3 s13)x5 p74(it4 s10)x5 p98(it6 s2)x5 p45(it2 s13)x4 p72(it4 s8)x4
[2026-10-07T19:05:02Z] attribution: item 0xeeec40 (215 reads) read from positions p29(it1 s13)x10 p45(it2 s13)x10 p18(it1 s2)x8 p125(it7 s13)x7 p13(it0 s13)x7 p99(it6 s3)x7 p61(it3 s13)x6 p10(it0 s10)x5 p28(it1 s12)x5 p67(it4 s3)x5 p77(it4 s13)x5 p93(it5 s13)x5
[2026-10-07T19:05:02Z] attribution: item 0x796f55 (215 reads) read from positions p54(it3 s6)x10 p85(it5 s5)x10 p6(it0 s6)x9 p86(it5 s6)x8 p70(it4 s6)x7 p117(it7 s5)x7 p5(it0 s5)x6 p101(it6 s5)x6 p102(it6 s6)x6 p22(it1 s6)x5 p69(it4 s5)x5 p105(it6 s9)x5
[2026-10-07T19:05:02Z] attribution: item 0xfc94f0 (214 reads) read from positions p45(it2 s13)x11 p35(it2 s3)x9 p125(it7 s13)x5 p10(it0 s10)x5 p13(it0 s13)x5 p50(it3 s2)x5 p58(it3 s10)x5 p61(it3 s13)x5 p77(it4 s13)x5 p0(it0 s0)x5 p109(it6 s13)x5 p20(it1 s4)x4
[2026-10-07T19:05:02Z] hottest item p105756-attack-f8 (0x610fe1): 218 reads (0.0000% of all); predicted source none
[2026-10-07T19:05:02Z] program p105756-attack-f8 DONE: 16777216 nonces; 6-sigma (windowed) clear; hot-set clear; verdict PASS (no test fired)
[2026-10-07T19:05:03Z] attack-f8 0.1.0 (igneum-pow 4); args ["warps", "--program", "6610", "--nonces", "16777216", "--threads", "48", "--out", "/srv/builds/_adv-adv-accept/live", "--validate", "sample", "--diag", "1"]
[2026-10-07T19:05:03Z] census warps: programs [6610] day 20730 nonces 16777216 threads 48 plant none validate sample check_every 997 diag true
[2026-10-07T19:05:03Z] day 20730: cache filled in 0.64 s, fnv 448274a57f508cbc
[2026-10-07T19:05:09Z] table: 16777216 items derived with their 8 lines in 5.0 s; library comparison sample (0 mismatches)
[2026-10-07T19:05:13Z] program p6610-attack-f8: epoch seed 7a3bb19c88da17cd705061caceaecca9cda1dba382595219718d021a8af98a53 era seed 10cc16c41bdee789adaff05b8605536137129c44c1b49130615066fb155c4825 id d07fa590199cc1e5 attempt 1 class mx8-erad05402ec+sh256x27 op mix load=16 mad=8 xor=8 mul=7 add=6 sub=6 or=4 rotl=3 shfl=3 mulhi=2 rotr=1; era stride mul 0xebd75d29 rot 6 interleave [0, 9, 10, 11] windows 3:1:1 4:0:0 5:0:0 8:1:0 24:1:1 25:2:0 29:1:0 31:0:0 34:0:0 37:0:0 39:0:0 42:2:2 43:1:1 48:0:0 51:0:0 52:2:0
[2026-10-07T19:05:13Z] load site instr 3: src r4 win 1 off 1; last base writer sub at 2; writers back to the last injecting one: sub@2; shadow writes of r4 per rep: add=4 mad=4 mul=2 mulhi=2 or=1 rotl=1 rotr=2 shfl=4 sub=4 xor=4
[2026-10-07T19:05:13Z] load site instr 4: src r6 win 0 off 0; last base writer shfl at 1; writers back to the last injecting one: shfl@1; shadow writes of r6 per rep: add=4 mad=2 mul=5 mulhi=2 rotl=4 rotr=5 shfl=4 sub=2 xor=6
[2026-10-07T19:05:13Z] load site instr 5: src r0 win 0 off 0; last base writer load at 4; writers back to the last injecting one: load@4; shadow writes of r0 per rep: add=2 mad=2 mul=4 mulhi=3 or=3 rotl=8 rotr=1 shfl=1 sub=3 xor=7
[2026-10-07T19:05:13Z] load site instr 8: src r6 win 1 off 0; last base writer xor at 7; writers back to the last injecting one: xor@7; shadow writes of r6 per rep: add=4 mad=2 mul=5 mulhi=2 rotl=4 rotr=5 shfl=4 sub=2 xor=6
[2026-10-07T19:05:13Z] load site instr 24: src r4 win 1 off 1; last base writer load at 8; writers back to the last injecting one: load@8; shadow writes of r4 per rep: add=4 mad=4 mul=2 mulhi=2 or=1 rotl=1 rotr=2 shfl=4 sub=4 xor=4
[2026-10-07T19:05:13Z] load site instr 25: src r2 win 2 off 0; last base writer add at 23; writers back to the last injecting one: add@23; shadow writes of r2 per rep: add=2 mad=2 mul=3 mulhi=4 or=1 rotl=5 rotr=1 shfl=3 sub=2 xor=3
[2026-10-07T19:05:13Z] load site instr 29: src r0 win 1 off 0; last base writer mad at 27; writers back to the last injecting one: mad@27; shadow writes of r0 per rep: add=2 mad=2 mul=4 mulhi=3 or=3 rotl=8 rotr=1 shfl=1 sub=3 xor=7
[2026-10-07T19:05:13Z] load site instr 31: src r4 win 0 off 0; last base writer load at 25; writers back to the last injecting one: load@25; shadow writes of r4 per rep: add=4 mad=4 mul=2 mulhi=2 or=1 rotl=1 rotr=2 shfl=4 sub=4 xor=4
[2026-10-07T19:05:13Z] load site instr 34: src r7 win 0 off 0; last base writer load at 31; writers back to the last injecting one: load@31; shadow writes of r7 per rep: add=9 mad=10 mul=3 mulhi=1 or=1 rotl=3 shfl=2 sub=2 xor=9
[2026-10-07T19:05:13Z] load site instr 37: src r0 win 0 off 0; last base writer xor at 36; writers back to the last injecting one: xor@36; shadow writes of r0 per rep: add=2 mad=2 mul=4 mulhi=3 or=3 rotl=8 rotr=1 shfl=1 sub=3 xor=7
[2026-10-07T19:05:13Z] load site instr 39: src r4 win 0 off 0; last base writer add at 38; writers back to the last injecting one: add@38; shadow writes of r4 per rep: add=4 mad=4 mul=2 mulhi=2 or=1 rotl=1 rotr=2 shfl=4 sub=4 xor=4
[2026-10-07T19:05:13Z] load site instr 42: src r6 win 2 off 2; last base writer load at 37; writers back to the last injecting one: load@37; shadow writes of r6 per rep: add=4 mad=2 mul=5 mulhi=2 rotl=4 rotr=5 shfl=4 sub=2 xor=6
[2026-10-07T19:05:13Z] load site instr 43: src r2 win 1 off 1; last base writer load at 42; writers back to the last injecting one: load@42; shadow writes of r2 per rep: add=2 mad=2 mul=3 mulhi=4 or=1 rotl=5 rotr=1 shfl=3 sub=2 xor=3
[2026-10-07T19:05:13Z] load site instr 48: src r4 win 0 off 0; last base writer load at 43; writers back to the last injecting one: load@43; shadow writes of r4 per rep: add=4 mad=4 mul=2 mulhi=2 or=1 rotl=1 rotr=2 shfl=4 sub=4 xor=4
[2026-10-07T19:05:13Z] load site instr 51: src r1 win 0 off 0; last base writer load at 39; writers back to the last injecting one: load@39; shadow writes of r1 per rep: add=6 mad=2 mul=3 mulhi=3 or=4 rotl=3 rotr=5 shfl=4 xor=3
[2026-10-07T19:05:13Z] load site instr 52: src r0 win 2 off 0; last base writer load at 48; writers back to the last injecting one: load@48; shadow writes of r0 per rep: add=2 mad=2 mul=4 mulhi=3 or=3 rotl=8 rotr=1 shfl=1 sub=3 xor=7
[2026-10-07T19:05:13Z] window layer: site item windows (first, items) (0x800000,2^23) (0x0,2^24) (0x0,2^24) (0x0,2^23) (0x800000,2^23) (0x0,2^22) (0x0,2^23) (0x0,2^24) (0x0,2^24) (0x0,2^24) (0x0,2^24) (0x800000,2^22) (0x800000,2^23) (0x0,2^24) (0x0,2^24) (0x0,2^22); expected reads per item by quarter 160.000 96.000 144.000 112.000 (flat uniform 128.000)
[2026-10-07T19:08:15Z] 524288 warps (16777216 nonces) interpreted in 182.5 s (16.705 ms per warp per thread); Epoch::hash_warp agreement on 589 warps: 0 mismatches
[2026-10-07T19:08:15Z] p6610-attack-f8 distinct lines per hash: n 16777216 min 1008 p1 1023 median 1024 p99 1024 max 1024 mean 1023.8711
[2026-10-07T19:08:15Z] p6610-attack-f8 distinct items per hash: n 16777216 min 126 p1 128 median 128 p99 128 max 128 mean 127.9995
[2026-10-07T19:08:15Z] p6610-attack-f8 distinct lines per warp: n 524288 min 32572 p1 32605 median 32637 p99 32664 max 32687 mean 32636.1965
[2026-10-07T19:08:15Z] p6610-attack-f8 distinct items per warp: n 524288 min 4089 p1 4093 median 4096 p99 4096 max 4096 mean 4095.4806
[2026-10-07T19:08:15Z] uniform expectation: distinct lines per hash 1023.875 of 1024 reads, per warp 32640.3 of 32768 reads (2^22 lines); distinct items per hash 127.9995 of 128, per warp 4095.50 of 4096 (2^24 items)
[2026-10-07T19:08:15Z] positions: largest hi16-bucket (256 items) share 0.0070% at p15 (iteration 0, site 15, instr 52); windowed expectation 0.0061%; largest saturated-source share 0.0000% at p14 (site 14, instr 51)
[2026-10-07T19:08:15Z] acceptance-style (2,048 evaluations, the rule's sample size): the most repeated address at one position 2 of 2048 at p10 (site 10, instr 39); saturated sources at one position 0 of 2048 at p0 (site 0, instr 3); uniform expectation: repeats 1 to 2, saturated 0
[2026-10-07T19:08:15Z] p6610-attack-f8 item histogram (flat): bins 16777216 reads 2147483648 mean 128.000 sigma 11.314 max 247 (bin 2359313) z_max +10.52 min 48 z_min -7.07 chi2/dof 6.31179 chi2_z +15384.58 top0.1% 0.16491% top0.5% 0.78640% top1% 1.53387%
[2026-10-07T19:08:16Z] p6610-attack-f8 item histogram against the window density: full 2^24 chi2/dof 1.33009 largest 170 (item 0x76c80a) at +7.55 sigma smallest at -4.98; buckets64 chi2/dof 5.84995 largest 7157 (bucket 122880) at +12.92 sigma smallest at -7.16
[2026-10-07T19:08:23Z] p6610-attack-f8 WINDOWED CONTROL item histogram (flat): bins 16777216 reads 2147483648 mean 128.000 sigma 11.314 max 229 (bin 1395492) z_max +8.93 min 50 z_min -6.89 chi2/dof 6.00088 chi2_z +14484.10 top0.1% 0.15529% top0.5% 0.74796% top1% 1.46831%
[2026-10-07T19:08:23Z] p6610-attack-f8 WINDOWED CONTROL against the window density: full chi2/dof 0.99965 largest +6.08 sigma; buckets64 chi2/dof 0.99930 largest +4.58 smallest -4.42
[2026-10-07T19:08:23Z] 6-sigma p6610-attack-f8 items buckets64 against the window density: largest bucket +12.92 sigma, smallest -7.16 -> FLAGGED (beyond 6 sigma)
[2026-10-07T19:08:23Z] hot-set p6610-attack-f8 items (windowed control): f 0.1% S_f 0.16491% E_f(control) 0.15529% X_f +0.00963% X_f/f +0.0963 -> no hot set
[2026-10-07T19:08:23Z] hot-set p6610-attack-f8 items (windowed control): f 0.5% S_f 0.78640% E_f(control) 0.74796% X_f +0.03843% X_f/f +0.0769 -> no hot set
[2026-10-07T19:08:23Z] hot-set p6610-attack-f8 items (windowed control): f 1.0% S_f 1.53387% E_f(control) 1.46831% X_f +0.06556% X_f/f +0.0656 -> no hot set
[2026-10-07T19:08:23Z] hot-set p6610-attack-f8 items (windowed control): verdict clear
[2026-10-07T19:08:30Z] p6610-attack-f8 FLAT CONTROL item histogram: bins 16777216 reads 2147483648 mean 128.000 sigma 11.314 max 192 (bin 2553844) z_max +5.66 min 71 z_min -5.04 chi2/dof 1.00043 chi2_z +1.24 top0.1% 0.13109% top0.5% 0.63254% top1% 1.24343%
[2026-10-07T19:08:30Z] hot-set p6610-attack-f8 items (flat control, the auditor's first view): f 0.1% S_f 0.16491% E_f(control) 0.13109% X_f +0.03383% X_f/f +0.3383 -> no hot set
[2026-10-07T19:08:30Z] hot-set p6610-attack-f8 items (flat control, the auditor's first view): f 0.5% S_f 0.78640% E_f(control) 0.63254% X_f +0.15386% X_f/f +0.3077 -> no hot set
[2026-10-07T19:08:30Z] hot-set p6610-attack-f8 items (flat control, the auditor's first view): f 1.0% S_f 1.53387% E_f(control) 1.24343% X_f +0.29044% X_f/f +0.2904 -> no hot set
[2026-10-07T19:08:30Z] hot-set p6610-attack-f8 items (flat control, the auditor's first view): verdict clear
[2026-10-07T19:08:30Z] ratio p6610-attack-f8: top 0.1% / 0.5% / 1% share over the WINDOW-MODEL control 1.0620x / 1.0514x / 1.0447x (gate 1.2x at 0.1%: within); over the FLAT control 1.2581x / 1.2432x / 1.2336x
[2026-10-07T19:08:32Z] attribution: hot threshold count >= 206 marks 17092 items (0.1019% of items) holding 3606393 reads (0.1679% of reads); top 8 items t=0x240011:247 t=0x26d018:244 t=0x1aaf10:243 t=0x312d1a:242 t=0x210310:241 t=0x1aca06:241 t=0x3ea312:240 t=0x38260b:239
[2026-10-07T19:09:39Z] attribution: reads on hot items per position (flat expectation 0.1019% of each position's 16777216 reads); the 24 largest: p22(it1 s6)=0.594% p38(it2 s6)=0.592% p54(it3 s6)=0.592% p118(it7 s6)=0.592% p6(it0 s6)=0.591% p102(it6 s6)=0.589% p86(it5 s6)=0.589% p70(it4 s6)=0.586% p101(it6 s5)=0.483% p37(it2 s5)=0.481% p21(it1 s5)=0.480% p127(it7 s15)=0.480% p5(it0 s5)=0.480% p47(it2 s15)=0.480% p79(it4 s15)=0.479% p53(it3 s5)=0.479% p69(it4 s5)=0.479% p85(it5 s5)=0.479% p15(it0 s15)=0.479% p117(it7 s5)=0.478% p111(it6 s15)=0.478% p95(it5 s15)=0.477% p63(it3 s15)=0.477% p31(it1 s15)=0.476%
[2026-10-07T19:09:39Z] attribution: hot reads by iteration it0=0.168% it1=0.168% it2=0.168% it3=0.168% it4=0.168% it5=0.168% it6=0.168% it7=0.168% ; by site s0=0.000% s1=0.120% s2=0.120% s3=0.240% s4=0.000% s5=0.480% s6=0.590% s7=0.119% s8=0.120% s9=0.081% s10=0.098% s11=0.000% s12=0.000% s13=0.120% s14=0.119% s15=0.478%
[2026-10-07T19:09:39Z] site 0 (instr 3, src r4, k_off 1 offset 1, window 2^23 items): share of its reads into the top 0.1% 0.0001% (flat expectation 0.1019%); index entropy 15.000 bits of 15 uniform-on-window; saturated source 0.0000%; largest 256-item bucket 0.0032% (window expectation 0.0031%)
[2026-10-07T19:09:39Z] site 1 (instr 4, src r6, k_off 0 offset 0, window 2^24 items): share of its reads into the top 0.1% 0.1197% (flat expectation 0.1019%); index entropy 16.000 bits of 16 uniform-on-window; saturated source 0.0000%; largest 256-item bucket 0.0017% (window expectation 0.0015%)
[2026-10-07T19:09:39Z] site 2 (instr 5, src r0, k_off 0 offset 0, window 2^24 items): share of its reads into the top 0.1% 0.1201% (flat expectation 0.1019%); index entropy 16.000 bits of 16 uniform-on-window; saturated source 0.0000%; largest 256-item bucket 0.0017% (window expectation 0.0015%)
[2026-10-07T19:09:39Z] site 3 (instr 8, src r6, k_off 1 offset 0, window 2^23 items): share of its reads into the top 0.1% 0.2399% (flat expectation 0.1019%); index entropy 15.000 bits of 15 uniform-on-window; saturated source 0.0000%; largest 256-item bucket 0.0033% (window expectation 0.0031%)
[2026-10-07T19:09:39Z] site 4 (instr 24, src r4, k_off 1 offset 1, window 2^23 items): share of its reads into the top 0.1% 0.0001% (flat expectation 0.1019%); index entropy 15.000 bits of 15 uniform-on-window; saturated source 0.0000%; largest 256-item bucket 0.0033% (window expectation 0.0031%)
[2026-10-07T19:09:39Z] site 5 (instr 25, src r2, k_off 2 offset 0, window 2^22 items): share of its reads into the top 0.1% 0.4798% (flat expectation 0.1019%); index entropy 14.000 bits of 14 uniform-on-window; saturated source 0.0000%; largest 256-item bucket 0.0064% (window expectation 0.0061%)
[2026-10-07T19:09:39Z] site 6 (instr 29, src r0, k_off 1 offset 0, window 2^23 items): share of its reads into the top 0.1% 0.5905% (flat expectation 0.1019%); index entropy 15.000 bits of 15 uniform-on-window; saturated source 0.0000%; largest 256-item bucket 0.0035% (window expectation 0.0031%)
[2026-10-07T19:09:39Z] site 7 (instr 31, src r4, k_off 0 offset 0, window 2^24 items): share of its reads into the top 0.1% 0.1190% (flat expectation 0.1019%); index entropy 16.000 bits of 16 uniform-on-window; saturated source 0.0000%; largest 256-item bucket 0.0017% (window expectation 0.0015%)
[2026-10-07T19:09:39Z] site 8 (instr 34, src r7, k_off 0 offset 0, window 2^24 items): share of its reads into the top 0.1% 0.1197% (flat expectation 0.1019%); index entropy 16.000 bits of 16 uniform-on-window; saturated source 0.0000%; largest 256-item bucket 0.0017% (window expectation 0.0015%)
[2026-10-07T19:09:39Z] site 9 (instr 37, src r0, k_off 0 offset 0, window 2^24 items): share of its reads into the top 0.1% 0.0814% (flat expectation 0.1019%); index entropy 16.000 bits of 16 uniform-on-window; saturated source 0.0000%; largest 256-item bucket 0.0017% (window expectation 0.0015%)
[2026-10-07T19:09:39Z] site 10 (instr 39, src r4, k_off 0 offset 0, window 2^24 items): share of its reads into the top 0.1% 0.0984% (flat expectation 0.1019%); index entropy 16.000 bits of 16 uniform-on-window; saturated source 0.0000%; largest 256-item bucket 0.0017% (window expectation 0.0015%)
[2026-10-07T19:09:39Z] site 11 (instr 42, src r6, k_off 2 offset 2, window 2^22 items): share of its reads into the top 0.1% 0.0003% (flat expectation 0.1019%); index entropy 14.000 bits of 14 uniform-on-window; saturated source 0.0000%; largest 256-item bucket 0.0063% (window expectation 0.0061%)
[2026-10-07T19:09:39Z] site 12 (instr 43, src r2, k_off 1 offset 1, window 2^23 items): share of its reads into the top 0.1% 0.0001% (flat expectation 0.1019%); index entropy 15.000 bits of 15 uniform-on-window; saturated source 0.0000%; largest 256-item bucket 0.0033% (window expectation 0.0031%)
[2026-10-07T19:09:39Z] site 13 (instr 48, src r4, k_off 0 offset 0, window 2^24 items): share of its reads into the top 0.1% 0.1203% (flat expectation 0.1019%); index entropy 16.000 bits of 16 uniform-on-window; saturated source 0.0000%; largest 256-item bucket 0.0017% (window expectation 0.0015%)
[2026-10-07T19:09:39Z] site 14 (instr 51, src r1, k_off 0 offset 0, window 2^24 items): share of its reads into the top 0.1% 0.1194% (flat expectation 0.1019%); index entropy 16.000 bits of 16 uniform-on-window; saturated source 0.0000%; largest 256-item bucket 0.0017% (window expectation 0.0015%)
[2026-10-07T19:09:39Z] site 15 (instr 52, src r0, k_off 2 offset 0, window 2^22 items): share of its reads into the top 0.1% 0.4779% (flat expectation 0.1019%); index entropy 14.000 bits of 14 uniform-on-window; saturated source 0.0000%; largest 256-item bucket 0.0064% (window expectation 0.0061%)
[2026-10-07T19:09:39Z] attribution: item 0x240011 (247 reads) read from positions p70(it4 s6)x11 p102(it6 s6)x11 p6(it0 s6)x10 p22(it1 s6)x10 p111(it6 s15)x9 p54(it3 s6)x8 p53(it3 s5)x7 p69(it4 s5)x7 p83(it5 s3)x7 p86(it5 s6)x7 p118(it7 s6)x7 p5(it0 s5)x6
[2026-10-07T19:09:39Z] attribution: item 0x26d018 (244 reads) read from positions p102(it6 s6)x11 p6(it0 s6)x10 p22(it1 s6)x10 p38(it2 s6)x10 p47(it2 s15)x10 p85(it5 s5)x9 p51(it3 s3)x7 p70(it4 s6)x7 p79(it4 s15)x7 p95(it5 s15)x7 p111(it6 s15)x6 p127(it7 s15)x5
[2026-10-07T19:09:39Z] attribution: item 0x1aaf10 (243 reads) read from positions p15(it0 s15)x11 p53(it3 s5)x10 p6(it0 s6)x9 p95(it5 s15)x9 p69(it4 s5)x8 p21(it1 s5)x7 p31(it1 s15)x7 p63(it3 s15)x7 p85(it5 s5)x7 p117(it7 s5)x7 p118(it7 s6)x7 p79(it4 s15)x6
[2026-10-07T19:09:39Z] attribution: item 0x312d1a (242 reads) read from positions p86(it5 s6)x12 p15(it0 s15)x10 p70(it4 s6)x10 p37(it2 s5)x9 p85(it5 s5)x9 p6(it0 s6)x7 p118(it7 s6)x7 p19(it1 s3)x6 p53(it3 s5)x6 p111(it6 s15)x6 p5(it0 s5)x5 p33(it2 s1)x5
[2026-10-07T19:09:39Z] attribution: item 0x210310 (241 reads) read from positions p54(it3 s6)x15 p53(it3 s5)x11 p6(it0 s6)x10 p102(it6 s6)x9 p22(it1 s6)x9 p118(it7 s6)x8 p31(it1 s15)x8 p47(it2 s15)x8 p86(it5 s6)x8 p5(it0 s5)x7 p117(it7 s5)x7 p81(it5 s1)x6
[2026-10-07T19:09:39Z] attribution: item 0x1aca06 (241 reads) read from positions p70(it4 s6)x10 p6(it0 s6)x9 p54(it3 s6)x9 p86(it5 s6)x9 p95(it5 s15)x9 p118(it7 s6)x8 p63(it3 s15)x8 p101(it6 s5)x8 p117(it7 s5)x8 p31(it1 s15)x7 p47(it2 s15)x7 p15(it0 s15)x6
[2026-10-07T19:09:39Z] attribution: item 0x3ea312 (240 reads) read from positions p53(it3 s5)x10 p63(it3 s15)x10 p101(it6 s5)x10 p102(it6 s6)x10 p127(it7 s15)x10 p118(it7 s6)x10 p117(it7 s5)x9 p47(it2 s15)x8 p54(it3 s6)x8 p5(it0 s5)x7 p21(it1 s5)x6 p22(it1 s6)x6
[2026-10-07T19:09:39Z] attribution: item 0x38260b (239 reads) read from positions p22(it1 s6)x10 p101(it6 s5)x9 p102(it6 s6)x9 p38(it2 s6)x8 p54(it3 s6)x8 p5(it0 s5)x8 p86(it5 s6)x8 p118(it7 s6)x7 p95(it5 s15)x7 p70(it4 s6)x6 p47(it2 s15)x6 p53(it3 s5)x6
[2026-10-07T19:09:39Z] hottest item p6610-attack-f8 (0x240011): 247 reads (0.0000% of all); predicted source none
[2026-10-07T19:09:39Z] program p6610-attack-f8 DONE: 16777216 nonces; 6-sigma (windowed) FLAGGED; hot-set clear; verdict FLAGGED
[2026-10-07T19:09:40Z] attack-f8 0.1.0 (igneum-pow 4); args ["warps", "--program", "106474", "--nonces", "16777216", "--threads", "48", "--out", "/srv/builds/_adv-adv-accept/live", "--validate", "sample", "--diag", "1"]
[2026-10-07T19:09:40Z] census warps: programs [106474] day 20730 nonces 16777216 threads 48 plant none validate sample check_every 997 diag true
[2026-10-07T19:09:40Z] day 20730: cache filled in 0.67 s, fnv 448274a57f508cbc
[2026-10-07T19:09:46Z] table: 16777216 items derived with their 8 lines in 5.7 s; library comparison sample (0 mismatches)
[2026-10-07T19:09:51Z] program p106474-attack-f8: epoch seed bfe35b22f4290aa7482710af699ef836e3fe18bc1bc0f53b8f1ac6ac694dc2d1 era seed 1dcc3dc64fb6ba82ca9eb2621c34384adfddb9cc2dede35bb42e6c7fd5337fb9 id 3489b57fc090a554 attempt 2 class mx8-era751822ed+sh256x27 op mix load=16 add=9 xor=7 mad=6 mul=5 rotl=5 mulhi=4 rotr=4 shfl=4 or=2 sub=2; era stride mul 0xcd10789b rot 26 interleave [1, 13, 14, 15] windows 4:1:1 6:1:1 9:2:0 12:0:0 13:2:3 17:2:1 19:0:0 23:1:0 26:0:0 39:2:1 40:2:0 43:1:1 46:1:0 50:2:3 53:1:1 56:1:0
[2026-10-07T19:09:51Z] load site instr 4: src r5 win 1 off 1; last base writer rotl at 0; writers back to the last injecting one: rotl@0 rotr@55 mul@41 load@40; shadow writes of r5 per rep: add=5 mad=6 mul=2 mulhi=2 or=3 rotl=4 rotr=2 shfl=7 sub=4 xor=4
[2026-10-07T19:09:51Z] load site instr 6: src r2 win 1 off 1; last base writer load at 4; writers back to the last injecting one: load@4; shadow writes of r2 per rep: add=8 mad=1 mul=3 mulhi=2 or=2 rotl=6 rotr=2 shfl=8 sub=4 xor=7
[2026-10-07T19:09:51Z] load site instr 9: src r4 win 2 off 0; last base writer load at 6; writers back to the last injecting one: load@6; shadow writes of r4 per rep: add=5 mad=2 mul=4 mulhi=2 or=3 rotl=1 shfl=7 xor=7
[2026-10-07T19:09:51Z] load site instr 12: src r2 win 0 off 0; last base writer add at 11; writers back to the last injecting one: add@11; shadow writes of r2 per rep: add=8 mad=1 mul=3 mulhi=2 or=2 rotl=6 rotr=2 shfl=8 sub=4 xor=7
[2026-10-07T19:09:51Z] load site instr 13: src r5 win 2 off 3; last base writer load at 12; writers back to the last injecting one: load@12; shadow writes of r5 per rep: add=5 mad=6 mul=2 mulhi=2 or=3 rotl=4 rotr=2 shfl=7 sub=4 xor=4
[2026-10-07T19:09:51Z] load site instr 17: src r0 win 2 off 1; last base writer load at 13; writers back to the last injecting one: load@13; shadow writes of r0 per rep: add=8 mad=2 mul=4 mulhi=6 rotl=1 rotr=1 shfl=4 sub=1 xor=5
[2026-10-07T19:09:51Z] load site instr 19: src r6 win 0 off 0; last base writer shfl at 16; writers back to the last injecting one: shfl@16; shadow writes of r6 per rep: add=5 mad=2 mul=1 or=1 rotl=4 rotr=1 shfl=4 sub=3 xor=2
[2026-10-07T19:09:51Z] load site instr 23: src r4 win 1 off 0; last base writer add at 18; writers back to the last injecting one: add@18; shadow writes of r4 per rep: add=5 mad=2 mul=4 mulhi=2 or=3 rotl=1 shfl=7 xor=7
[2026-10-07T19:09:51Z] load site instr 26: src r1 win 0 off 0; last base writer sub at 24; writers back to the last injecting one: sub@24; shadow writes of r1 per rep: add=4 mad=2 mulhi=4 or=2 rotl=2 rotr=1 shfl=2 sub=5 xor=2
[2026-10-07T19:09:51Z] load site instr 39: src r5 win 2 off 1; last base writer rotr at 36; writers back to the last injecting one: rotr@36 load@23; shadow writes of r5 per rep: add=5 mad=6 mul=2 mulhi=2 or=3 rotl=4 rotr=2 shfl=7 sub=4 xor=4
[2026-10-07T19:09:51Z] load site instr 40: src r0 win 2 off 0; last base writer add at 38; writers back to the last injecting one: add@38; shadow writes of r0 per rep: add=8 mad=2 mul=4 mulhi=6 rotl=1 rotr=1 shfl=4 sub=1 xor=5
[2026-10-07T19:09:51Z] load site instr 43: src r1 win 1 off 1; last base writer mad at 42; writers back to the last injecting one: mad@42; shadow writes of r1 per rep: add=4 mad=2 mulhi=4 or=2 rotl=2 rotr=1 shfl=2 sub=5 xor=2
[2026-10-07T19:09:51Z] load site instr 46: src r2 win 1 off 0; last base writer load at 43; writers back to the last injecting one: load@43; shadow writes of r2 per rep: add=8 mad=1 mul=3 mulhi=2 or=2 rotl=6 rotr=2 shfl=8 sub=4 xor=7
[2026-10-07T19:09:51Z] load site instr 50: src r6 win 2 off 3; last base writer rotr at 49; writers back to the last injecting one: rotr@49 mad@47; shadow writes of r6 per rep: add=5 mad=2 mul=1 or=1 rotl=4 rotr=1 shfl=4 sub=3 xor=2
[2026-10-07T19:09:51Z] load site instr 53: src r4 win 1 off 1; last base writer load at 50; writers back to the last injecting one: load@50; shadow writes of r4 per rep: add=5 mad=2 mul=4 mulhi=2 or=3 rotl=1 shfl=7 xor=7
[2026-10-07T19:09:51Z] load site instr 56: src r7 win 1 off 0; last base writer shfl at 54; writers back to the last injecting one: shfl@54; shadow writes of r7 per rep: add=4 mad=8 mul=3 mulhi=6 or=3 rotl=3 shfl=4 sub=2 xor=3
[2026-10-07T19:09:51Z] window layer: site item windows (first, items) (0x800000,2^23) (0x800000,2^23) (0x0,2^22) (0x0,2^24) (0xc00000,2^22) (0x400000,2^22) (0x0,2^24) (0x0,2^23) (0x0,2^24) (0x400000,2^22) (0x0,2^22) (0x800000,2^23) (0x0,2^23) (0xc00000,2^22) (0x800000,2^23) (0x0,2^23); expected reads per item by quarter 136.000 136.000 88.000 152.000 (flat uniform 128.000)
[2026-10-07T19:12:33Z] 524288 warps (16777216 nonces) interpreted in 162.2 s (14.852 ms per warp per thread); Epoch::hash_warp agreement on 589 warps: 0 mismatches
[2026-10-07T19:12:33Z] p106474-attack-f8 distinct lines per hash: n 16777216 min 1008 p1 1023 median 1024 p99 1024 max 1024 mean 1023.8713
[2026-10-07T19:12:33Z] p106474-attack-f8 distinct items per hash: n 16777216 min 126 p1 128 median 128 p99 128 max 128 mean 127.9995
[2026-10-07T19:12:33Z] p106474-attack-f8 distinct lines per warp: n 524288 min 32568 p1 32605 median 32637 p99 32664 max 32688 mean 32636.2200
[2026-10-07T19:12:33Z] p106474-attack-f8 distinct items per warp: n 524288 min 4089 p1 4093 median 4096 p99 4096 max 4096 mean 4095.4826
[2026-10-07T19:12:33Z] uniform expectation: distinct lines per hash 1023.875 of 1024 reads, per warp 32640.3 of 32768 reads (2^22 lines); distinct items per hash 127.9995 of 128, per warp 4095.50 of 4096 (2^24 items)
[2026-10-07T19:12:33Z] positions: largest hi16-bucket (256 items) share 0.0070% at p36 (iteration 2, site 4, instr 13); windowed expectation 0.0061%; largest saturated-source share 0.0000% at p52 (site 4, instr 13)
[2026-10-07T19:12:33Z] acceptance-style (2,048 evaluations, the rule's sample size): the most repeated address at one position 2 of 2048 at p5 (site 5, instr 17); saturated sources at one position 0 of 2048 at p0 (site 0, instr 4); uniform expectation: repeats 1 to 2, saturated 0
[2026-10-07T19:12:33Z] p106474-attack-f8 item histogram (flat): bins 16777216 reads 2147483648 mean 128.000 sigma 11.314 max 216 (bin 12880909) z_max +7.78 min 43 z_min -7.51 chi2/dof 5.50169 chi2_z +13038.28 top0.1% 0.14828% top0.5% 0.71379% top1% 1.40086%
[2026-10-07T19:12:33Z] p106474-attack-f8 item histogram against the window density: full 2^24 chi2/dof 1.00017 largest 204 (item 0x2a0f94) at +5.83 sigma smallest at -4.87; buckets64 chi2/dof 0.99779 largest 9105 (bucket 88844) at +4.30 sigma smallest at -4.80
[2026-10-07T19:12:40Z] p106474-attack-f8 WINDOWED CONTROL item histogram (flat): bins 16777216 reads 2147483648 mean 128.000 sigma 11.314 max 232 (bin 16678178) z_max +9.19 min 42 z_min -7.60 chi2/dof 5.49868 chi2_z +13029.57 top0.1% 0.14834% top0.5% 0.71384% top1% 1.40090%
[2026-10-07T19:12:40Z] p106474-attack-f8 WINDOWED CONTROL against the window density: full chi2/dof 0.99979 largest +6.49 sigma; buckets64 chi2/dof 0.99687 largest +4.82 smallest -4.64
[2026-10-07T19:12:40Z] 6-sigma p106474-attack-f8 items buckets64 against the window density: largest bucket +4.30 sigma, smallest -4.80 -> within 6 sigma
[2026-10-07T19:12:40Z] hot-set p106474-attack-f8 items (windowed control): f 0.1% S_f 0.14828% E_f(control) 0.14834% X_f -0.00006% X_f/f -0.0006 -> no hot set
[2026-10-07T19:12:40Z] hot-set p106474-attack-f8 items (windowed control): f 0.5% S_f 0.71379% E_f(control) 0.71384% X_f -0.00005% X_f/f -0.0001 -> no hot set
[2026-10-07T19:12:40Z] hot-set p106474-attack-f8 items (windowed control): f 1.0% S_f 1.40086% E_f(control) 1.40090% X_f -0.00003% X_f/f -0.0000 -> no hot set
[2026-10-07T19:12:40Z] hot-set p106474-attack-f8 items (windowed control): verdict clear
[2026-10-07T19:12:45Z] p106474-attack-f8 FLAT CONTROL item histogram: bins 16777216 reads 2147483648 mean 128.000 sigma 11.314 max 194 (bin 15008693) z_max +5.83 min 72 z_min -4.95 chi2/dof 0.99985 chi2_z -0.43 top0.1% 0.13111% top0.5% 0.63264% top1% 1.24359%
[2026-10-07T19:12:45Z] hot-set p106474-attack-f8 items (flat control, the auditor's first view): f 0.1% S_f 0.14828% E_f(control) 0.13111% X_f +0.01717% X_f/f +0.1717 -> no hot set
[2026-10-07T19:12:45Z] hot-set p106474-attack-f8 items (flat control, the auditor's first view): f 0.5% S_f 0.71379% E_f(control) 0.63264% X_f +0.08116% X_f/f +0.1623 -> no hot set
[2026-10-07T19:12:45Z] hot-set p106474-attack-f8 items (flat control, the auditor's first view): f 1.0% S_f 1.40086% E_f(control) 1.24359% X_f +0.15727% X_f/f +0.1573 -> no hot set
[2026-10-07T19:12:45Z] hot-set p106474-attack-f8 items (flat control, the auditor's first view): verdict clear
[2026-10-07T19:12:45Z] ratio p106474-attack-f8: top 0.1% / 0.5% / 1% share over the WINDOW-MODEL control 0.9996x / 0.9999x / 1.0000x (gate 1.2x at 0.1%: within); over the FLAT control 1.1309x / 1.1283x / 1.1265x
[2026-10-07T19:12:47Z] attribution: hot threshold count >= 186 marks 17580 items (0.1048% of items) holding 3333679 reads (0.1552% of reads); top 8 items t=0xc48c0d:216 t=0xcab0cf:215 t=0xf91a3a:214 t=0xe80539:214 t=0xfd31ca:213 t=0xf36545:213 t=0xf5a5c7:212 t=0xd8ae89:212
[2026-10-07T19:13:46Z] attribution: reads on hot items per position (flat expectation 0.1048% of each position's 16777216 reads); the 24 largest: p84(it5 s4)=0.519% p36(it2 s4)=0.519% p45(it2 s13)=0.519% p68(it4 s4)=0.518% p93(it5 s13)=0.517% p77(it4 s13)=0.517% p13(it0 s13)=0.517% p20(it1 s4)=0.517% p125(it7 s13)=0.516% p29(it1 s13)=0.516% p116(it7 s4)=0.516% p52(it3 s4)=0.515% p109(it6 s13)=0.515% p4(it0 s4)=0.515% p100(it6 s4)=0.515% p61(it3 s13)=0.514% p112(it7 s0)=0.260% p81(it5 s1)=0.260% p91(it5 s11)=0.259% p16(it1 s0)=0.259% p33(it2 s1)=0.259% p27(it1 s11)=0.259% p0(it0 s0)=0.259% p97(it6 s1)=0.259%
[2026-10-07T19:13:46Z] attribution: hot reads by iteration it0=0.155% it1=0.155% it2=0.156% it3=0.155% it4=0.155% it5=0.156% it6=0.155% it7=0.155% ; by site s0=0.258% s1=0.258% s2=0.004% s3=0.131% s4=0.517% s5=0.004% s6=0.132% s7=0.004% s8=0.131% s9=0.003% s10=0.004% s11=0.258% s12=0.004% s13=0.516% s14=0.258% s15=0.004%
[2026-10-07T19:13:46Z] site 0 (instr 4, src r5, k_off 1 offset 1, window 2^23 items): share of its reads into the top 0.1% 0.2582% (flat expectation 0.1048%); index entropy 15.000 bits of 15 uniform-on-window; saturated source 0.0000%; largest 256-item bucket 0.0032% (window expectation 0.0031%)
[2026-10-07T19:13:46Z] site 1 (instr 6, src r2, k_off 1 offset 1, window 2^23 items): share of its reads into the top 0.1% 0.2583% (flat expectation 0.1048%); index entropy 15.000 bits of 15 uniform-on-window; saturated source 0.0000%; largest 256-item bucket 0.0032% (window expectation 0.0031%)
[2026-10-07T19:13:46Z] site 2 (instr 9, src r4, k_off 2 offset 0, window 2^22 items): share of its reads into the top 0.1% 0.0037% (flat expectation 0.1048%); index entropy 14.000 bits of 14 uniform-on-window; saturated source 0.0000%; largest 256-item bucket 0.0064% (window expectation 0.0061%)
[2026-10-07T19:13:46Z] site 3 (instr 12, src r2, k_off 0 offset 0, window 2^24 items): share of its reads into the top 0.1% 0.1307% (flat expectation 0.1048%); index entropy 16.000 bits of 16 uniform-on-window; saturated source 0.0000%; largest 256-item bucket 0.0017% (window expectation 0.0015%)
[2026-10-07T19:13:46Z] site 4 (instr 13, src r5, k_off 2 offset 3, window 2^22 items): share of its reads into the top 0.1% 0.5167% (flat expectation 0.1048%); index entropy 14.000 bits of 14 uniform-on-window; saturated source 0.0000%; largest 256-item bucket 0.0064% (window expectation 0.0061%)
[2026-10-07T19:13:46Z] site 5 (instr 17, src r0, k_off 2 offset 1, window 2^22 items): share of its reads into the top 0.1% 0.0035% (flat expectation 0.1048%); index entropy 14.000 bits of 14 uniform-on-window; saturated source 0.0000%; largest 256-item bucket 0.0064% (window expectation 0.0061%)
[2026-10-07T19:13:46Z] site 6 (instr 19, src r6, k_off 0 offset 0, window 2^24 items): share of its reads into the top 0.1% 0.1315% (flat expectation 0.1048%); index entropy 16.000 bits of 16 uniform-on-window; saturated source 0.0000%; largest 256-item bucket 0.0017% (window expectation 0.0015%)
[2026-10-07T19:13:46Z] site 7 (instr 23, src r4, k_off 1 offset 0, window 2^23 items): share of its reads into the top 0.1% 0.0035% (flat expectation 0.1048%); index entropy 15.000 bits of 15 uniform-on-window; saturated source 0.0000%; largest 256-item bucket 0.0033% (window expectation 0.0031%)
[2026-10-07T19:13:46Z] site 8 (instr 26, src r1, k_off 0 offset 0, window 2^24 items): share of its reads into the top 0.1% 0.1309% (flat expectation 0.1048%); index entropy 16.000 bits of 16 uniform-on-window; saturated source 0.0000%; largest 256-item bucket 0.0017% (window expectation 0.0015%)
[2026-10-07T19:13:46Z] site 9 (instr 39, src r5, k_off 2 offset 1, window 2^22 items): share of its reads into the top 0.1% 0.0034% (flat expectation 0.1048%); index entropy 14.000 bits of 14 uniform-on-window; saturated source 0.0000%; largest 256-item bucket 0.0064% (window expectation 0.0061%)
[2026-10-07T19:13:46Z] site 10 (instr 40, src r0, k_off 2 offset 0, window 2^22 items): share of its reads into the top 0.1% 0.0035% (flat expectation 0.1048%); index entropy 14.000 bits of 14 uniform-on-window; saturated source 0.0000%; largest 256-item bucket 0.0064% (window expectation 0.0061%)
[2026-10-07T19:13:46Z] site 11 (instr 43, src r1, k_off 1 offset 1, window 2^23 items): share of its reads into the top 0.1% 0.2582% (flat expectation 0.1048%); index entropy 15.000 bits of 15 uniform-on-window; saturated source 0.0000%; largest 256-item bucket 0.0032% (window expectation 0.0031%)
[2026-10-07T19:13:46Z] site 12 (instr 46, src r2, k_off 1 offset 0, window 2^23 items): share of its reads into the top 0.1% 0.0035% (flat expectation 0.1048%); index entropy 15.000 bits of 15 uniform-on-window; saturated source 0.0000%; largest 256-item bucket 0.0033% (window expectation 0.0031%)
[2026-10-07T19:13:46Z] site 13 (instr 50, src r6, k_off 2 offset 3, window 2^22 items): share of its reads into the top 0.1% 0.5165% (flat expectation 0.1048%); index entropy 14.000 bits of 14 uniform-on-window; saturated source 0.0000%; largest 256-item bucket 0.0064% (window expectation 0.0061%)
[2026-10-07T19:13:46Z] site 14 (instr 53, src r4, k_off 1 offset 1, window 2^23 items): share of its reads into the top 0.1% 0.2581% (flat expectation 0.1048%); index entropy 15.000 bits of 15 uniform-on-window; saturated source 0.0000%; largest 256-item bucket 0.0033% (window expectation 0.0031%)
[2026-10-07T19:13:46Z] site 15 (instr 56, src r7, k_off 1 offset 0, window 2^23 items): share of its reads into the top 0.1% 0.0035% (flat expectation 0.1048%); index entropy 15.000 bits of 15 uniform-on-window; saturated source 0.0000%; largest 256-item bucket 0.0033% (window expectation 0.0031%)
[2026-10-07T19:13:46Z] attribution: item 0xc48c0d (216 reads) read from positions p52(it3 s4)x11 p29(it1 s13)x10 p75(it4 s11)x10 p93(it5 s13)x9 p116(it7 s4)x9 p36(it2 s4)x8 p77(it4 s13)x8 p112(it7 s0)x6 p32(it2 s0)x5 p38(it2 s6)x5 p45(it2 s13)x5 p62(it3 s14)x5
[2026-10-07T19:13:46Z] attribution: item 0xcab0cf (215 reads) read from positions p100(it6 s4)x11 p29(it1 s13)x10 p36(it2 s4)x8 p84(it5 s4)x8 p1(it0 s1)x7 p125(it7 s13)x7 p77(it4 s13)x6 p116(it7 s4)x6 p13(it0 s13)x5 p16(it1 s0)x5 p45(it2 s13)x5 p0(it0 s0)x5
[2026-10-07T19:13:46Z] attribution: item 0xf91a3a (214 reads) read from positions p52(it3 s4)x10 p109(it6 s13)x10 p29(it1 s13)x7 p36(it2 s4)x7 p13(it0 s13)x6 p33(it2 s1)x6 p45(it2 s13)x6 p46(it2 s14)x6 p116(it7 s4)x6 p125(it7 s13)x5 p20(it1 s4)x5 p32(it2 s0)x5
[2026-10-07T19:13:46Z] attribution: item 0xe80539 (214 reads) read from positions p20(it1 s4)x14 p100(it6 s4)x9 p4(it0 s4)x7 p13(it0 s13)x7 p84(it5 s4)x7 p93(it5 s13)x7 p125(it7 s13)x5 p11(it0 s11)x5 p52(it3 s4)x5 p61(it3 s13)x5 p65(it4 s1)x5 p70(it4 s6)x5
[2026-10-07T19:13:46Z] attribution: item 0xfd31ca (213 reads) read from positions p93(it5 s13)x10 p125(it7 s13)x9 p61(it3 s13)x9 p20(it1 s4)x8 p45(it2 s13)x8 p52(it3 s4)x8 p68(it4 s4)x8 p109(it6 s13)x7 p77(it4 s13)x6 p13(it0 s13)x6 p100(it6 s4)x6 p36(it2 s4)x5
[2026-10-07T19:13:46Z] attribution: item 0xf36545 (213 reads) read from positions p125(it7 s13)x8 p116(it7 s4)x8 p4(it0 s4)x7 p109(it6 s13)x7 p110(it6 s14)x7 p45(it2 s13)x6 p0(it0 s0)x6 p77(it4 s13)x6 p93(it5 s13)x6 p68(it4 s4)x5 p126(it7 s14)x5 p20(it1 s4)x5
[2026-10-07T19:13:46Z] attribution: item 0xf5a5c7 (212 reads) read from positions p116(it7 s4)x10 p52(it3 s4)x8 p68(it4 s4)x7 p77(it4 s13)x7 p20(it1 s4)x6 p45(it2 s13)x6 p61(it3 s13)x6 p1(it0 s1)x6 p100(it6 s4)x6 p109(it6 s13)x6 p93(it5 s13)x5 p14(it0 s14)x5
[2026-10-07T19:13:46Z] attribution: item 0xd8ae89 (212 reads) read from positions p116(it7 s4)x9 p13(it0 s13)x7 p29(it1 s13)x7 p49(it3 s1)x7 p59(it3 s11)x7 p84(it5 s4)x7 p91(it5 s11)x7 p93(it5 s13)x7 p109(it6 s13)x7 p107(it6 s11)x6 p125(it7 s13)x5 p36(it2 s4)x5
[2026-10-07T19:13:46Z] hottest item p106474-attack-f8 (0xc48c0d): 216 reads (0.0000% of all); predicted source none
[2026-10-07T19:13:46Z] program p106474-attack-f8 DONE: 16777216 nonces; 6-sigma (windowed) clear; hot-set clear; verdict PASS (no test fired)
[2026-10-07T19:13:46Z] attack-f8 0.1.0 (igneum-pow 4); args ["warps", "--program", "4765", "--nonces", "16777216", "--threads", "48", "--out", "/srv/builds/_adv-adv-accept/live", "--validate", "sample", "--diag", "1"]
[2026-10-07T19:13:46Z] census warps: programs [4765] day 20730 nonces 16777216 threads 48 plant none validate sample check_every 997 diag true
[2026-10-07T19:13:47Z] day 20730: cache filled in 0.66 s, fnv 448274a57f508cbc
[2026-10-07T19:13:52Z] table: 16777216 items derived with their 8 lines in 4.6 s; library comparison sample (0 mismatches)
[2026-10-07T19:13:56Z] program p4765-attack-f8: epoch seed da93006cf58ee51a55ac92b00c0813585675f263dc9e96a4218ca70e8842ba89 era seed 4694d47ef446e8ba556c8fe2df62e76090931782c7d7b9e70d80af55af821232 id 5fd85ef27d8a1ea7 attempt 0 class mx8-eracacdee8f+sh256x27 op mix load=16 mul=8 shfl=6 xor=6 mad=5 rotr=5 add=4 or=4 rotl=4 sub=4 mulhi=2; era stride mul 0x82f56c09 rot 4 interleave [1, 6, 10, 14] windows 7:2:0 12:1:0 15:2:3 19:1:0 20:2:1 21:1:1 24:2:2 31:1:1 32:2:0 35:0:0 38:0:0 44:2:2 45:0:0 47:1:1 53:1:1 57:0:0
[2026-10-07T19:13:56Z] load site instr 7: src r2 win 2 off 0; last base writer rotr at 5; writers back to the last injecting one: rotr@5 shfl@61; shadow writes of r2 per rep: add=1 mad=2 mul=4 mulhi=4 or=1 rotl=3 rotr=2 shfl=5 sub=2 xor=1
[2026-10-07T19:13:56Z] load site instr 12: src r1 win 1 off 0; last base writer xor at 10; writers back to the last injecting one: xor@10; shadow writes of r1 per rep: add=6 mad=8 mul=3 mulhi=2 or=4 rotl=2 rotr=6 shfl=2 sub=3 xor=3
[2026-10-07T19:13:56Z] load site instr 15: src r6 win 2 off 3; last base writer shfl at 13; writers back to the last injecting one: shfl@13; shadow writes of r6 per rep: add=1 mad=4 mul=7 mulhi=3 or=1 rotl=2 rotr=4 shfl=4 sub=2 xor=4
[2026-10-07T19:13:56Z] load site instr 19: src r2 win 1 off 0; last base writer mad at 14; writers back to the last injecting one: mad@14; shadow writes of r2 per rep: add=1 mad=2 mul=4 mulhi=4 or=1 rotl=3 rotr=2 shfl=5 sub=2 xor=1
[2026-10-07T19:13:56Z] load site instr 20: src r6 win 2 off 1; last base writer load at 19; writers back to the last injecting one: load@19; shadow writes of r6 per rep: add=1 mad=4 mul=7 mulhi=3 or=1 rotl=2 rotr=4 shfl=4 sub=2 xor=4
[2026-10-07T19:13:56Z] load site instr 21: src r3 win 1 off 1; last base writer mad at 18; writers back to the last injecting one: mad@18; shadow writes of r3 per rep: add=4 mad=7 mul=3 mulhi=2 or=2 rotl=3 rotr=2 shfl=4 sub=4 xor=2
[2026-10-07T19:13:56Z] load site instr 24: src r6 win 2 off 2; last base writer xor at 23; writers back to the last injecting one: xor@23; shadow writes of r6 per rep: add=1 mad=4 mul=7 mulhi=3 or=1 rotl=2 rotr=4 shfl=4 sub=2 xor=4
[2026-10-07T19:13:56Z] load site instr 31: src r3 win 1 off 1; last base writer rotr at 25; writers back to the last injecting one: rotr@25 mad@18; shadow writes of r3 per rep: add=4 mad=7 mul=3 mulhi=2 or=2 rotl=3 rotr=2 shfl=4 sub=4 xor=2
[2026-10-07T19:13:56Z] load site instr 32: src r7 win 2 off 0; last base writer load at 31; writers back to the last injecting one: load@31; shadow writes of r7 per rep: add=2 mad=4 mul=1 mulhi=2 or=1 rotl=8 rotr=1 shfl=6 sub=5 xor=2
[2026-10-07T19:13:56Z] load site instr 35: src r2 win 0 off 0; last base writer sub at 33; writers back to the last injecting one: sub@33; shadow writes of r2 per rep: add=1 mad=2 mul=4 mulhi=4 or=1 rotl=3 rotr=2 shfl=5 sub=2 xor=1
[2026-10-07T19:13:56Z] load site instr 38: src r1 win 0 off 0; last base writer load at 35; writers back to the last injecting one: load@35; shadow writes of r1 per rep: add=6 mad=8 mul=3 mulhi=2 or=4 rotl=2 rotr=6 shfl=2 sub=3 xor=3
[2026-10-07T19:13:56Z] load site instr 44: src r7 win 2 off 2; last base writer rotr at 41; writers back to the last injecting one: rotr@41 load@31; shadow writes of r7 per rep: add=2 mad=4 mul=1 mulhi=2 or=1 rotl=8 rotr=1 shfl=6 sub=5 xor=2
[2026-10-07T19:13:56Z] load site instr 45: src r4 win 0 off 0; last base writer add at 27; writers back to the last injecting one: add@27; shadow writes of r4 per rep: add=4 mad=3 mul=3 mulhi=1 or=4 rotl=4 shfl=5 sub=2 xor=6
[2026-10-07T19:13:56Z] load site instr 47: src r3 win 1 off 1; last base writer shfl at 39; writers back to the last injecting one: shfl@39; shadow writes of r3 per rep: add=4 mad=7 mul=3 mulhi=2 or=2 rotl=3 rotr=2 shfl=4 sub=4 xor=2
[2026-10-07T19:13:56Z] load site instr 53: src r1 win 1 off 1; last base writer shfl at 48; writers back to the last injecting one: shfl@48; shadow writes of r1 per rep: add=6 mad=8 mul=3 mulhi=2 or=4 rotl=2 rotr=6 shfl=2 sub=3 xor=3
[2026-10-07T19:13:56Z] load site instr 57: src r4 win 0 off 0; last base writer load at 47; writers back to the last injecting one: load@47; shadow writes of r4 per rep: add=4 mad=3 mul=3 mulhi=1 or=4 rotl=4 shfl=5 sub=2 xor=6
[2026-10-07T19:13:56Z] window layer: site item windows (first, items) (0x0,2^22) (0x0,2^23) (0xc00000,2^22) (0x0,2^23) (0x400000,2^22) (0x800000,2^23) (0x800000,2^22) (0x800000,2^23) (0x0,2^22) (0x0,2^24) (0x0,2^24) (0x800000,2^22) (0x0,2^24) (0x800000,2^23) (0x800000,2^23) (0x0,2^24); expected reads per item by quarter 128.000 96.000 160.000 128.000 (flat uniform 128.000)
[2026-10-07T19:16:43Z] 524288 warps (16777216 nonces) interpreted in 167.1 s (15.303 ms per warp per thread); Epoch::hash_warp agreement on 589 warps: 0 mismatches
[2026-10-07T19:16:43Z] p4765-attack-f8 distinct lines per hash: n 16777216 min 1006 p1 1022 median 1024 p99 1024 max 1024 mean 1023.8127
[2026-10-07T19:16:43Z] p4765-attack-f8 distinct items per hash: n 16777216 min 126 p1 128 median 128 p99 128 max 128 mean 127.9922
[2026-10-07T19:16:43Z] p4765-attack-f8 distinct lines per warp: n 524288 min 32556 p1 32601 median 32635 p99 32663 max 32685 mean 32634.3846
[2026-10-07T19:16:43Z] p4765-attack-f8 distinct items per warp: n 524288 min 4088 p1 4093 median 4095 p99 4096 max 4096 mean 4095.2484
[2026-10-07T19:16:43Z] uniform expectation: distinct lines per hash 1023.875 of 1024 reads, per warp 32640.3 of 32768 reads (2^22 lines); distinct items per hash 127.9995 of 128, per warp 4095.50 of 4096 (2^24 items)
[2026-10-07T19:16:43Z] positions: largest hi16-bucket (256 items) share 0.0070% at p6 (iteration 0, site 6, instr 24); windowed expectation 0.0061%; largest saturated-source share 0.0000% at p18 (site 2, instr 15)
[2026-10-07T19:16:43Z] acceptance-style (2,048 evaluations, the rule's sample size): the most repeated address at one position 2 of 2048 at p52 (site 4, instr 20); saturated sources at one position 0 of 2048 at p0 (site 0, instr 7); uniform expectation: repeats 1 to 2, saturated 0
[2026-10-07T19:16:43Z] p4765-attack-f8 item histogram (flat): bins 16777216 reads 2147483648 mean 128.000 sigma 11.314 max 235 (bin 11842695) z_max +9.46 min 50 z_min -6.89 chi2/dof 5.04021 chi2_z +11701.71 top0.1% 0.15843% top0.5% 0.75939% top1% 1.48695%
[2026-10-07T19:16:44Z] p4765-attack-f8 item histogram against the window density: full 2^24 chi2/dof 1.03190 largest 235 (item 0xb4b487) at +5.93 sigma smallest at -4.98; buckets64 chi2/dof 1.06036 largest 10717 (bucket 140314) at +4.71 sigma smallest at -4.67
[2026-10-07T19:16:51Z] p4765-attack-f8 WINDOWED CONTROL item histogram (flat): bins 16777216 reads 2147483648 mean 128.000 sigma 11.314 max 229 (bin 8591855) z_max +8.93 min 51 z_min -6.81 chi2/dof 5.00134 chi2_z +11589.13 top0.1% 0.15532% top0.5% 0.74796% top1% 1.46798%
[2026-10-07T19:16:51Z] p4765-attack-f8 WINDOWED CONTROL against the window density: full chi2/dof 1.00047 largest +5.61 sigma; buckets64 chi2/dof 1.00291 largest +4.31 smallest -4.48
[2026-10-07T19:16:51Z] 6-sigma p4765-attack-f8 items buckets64 against the window density: largest bucket +4.71 sigma, smallest -4.67 -> within 6 sigma
[2026-10-07T19:16:51Z] hot-set p4765-attack-f8 items (windowed control): f 0.1% S_f 0.15843% E_f(control) 0.15532% X_f +0.00311% X_f/f +0.0311 -> no hot set
[2026-10-07T19:16:51Z] hot-set p4765-attack-f8 items (windowed control): f 0.5% S_f 0.75939% E_f(control) 0.74796% X_f +0.01142% X_f/f +0.0228 -> no hot set
[2026-10-07T19:16:51Z] hot-set p4765-attack-f8 items (windowed control): f 1.0% S_f 1.48695% E_f(control) 1.46798% X_f +0.01897% X_f/f +0.0190 -> no hot set
[2026-10-07T19:16:51Z] hot-set p4765-attack-f8 items (windowed control): verdict clear
[2026-10-07T19:16:58Z] p4765-attack-f8 FLAT CONTROL item histogram: bins 16777216 reads 2147483648 mean 128.000 sigma 11.314 max 191 (bin 11783650) z_max +5.57 min 72 z_min -4.95 chi2/dof 1.00055 chi2_z +1.60 top0.1% 0.13109% top0.5% 0.63263% top1% 1.24357%
[2026-10-07T19:16:58Z] hot-set p4765-attack-f8 items (flat control, the auditor's first view): f 0.1% S_f 0.15843% E_f(control) 0.13109% X_f +0.02734% X_f/f +0.2734 -> no hot set
[2026-10-07T19:16:58Z] hot-set p4765-attack-f8 items (flat control, the auditor's first view): f 0.5% S_f 0.75939% E_f(control) 0.63263% X_f +0.12676% X_f/f +0.2535 -> no hot set
[2026-10-07T19:16:58Z] hot-set p4765-attack-f8 items (flat control, the auditor's first view): f 1.0% S_f 1.48695% E_f(control) 1.24357% X_f +0.24339% X_f/f +0.2434 -> no hot set
[2026-10-07T19:16:58Z] hot-set p4765-attack-f8 items (flat control, the auditor's first view): verdict clear
[2026-10-07T19:16:58Z] ratio p4765-attack-f8: top 0.1% / 0.5% / 1% share over the WINDOW-MODEL control 1.0200x / 1.0153x / 1.0129x (gate 1.2x at 0.1%: within); over the FLAT control 1.2086x / 1.2004x / 1.1957x
[2026-10-07T19:17:00Z] attribution: hot threshold count >= 198 marks 18275 items (0.1089% of items) holding 3698918 reads (0.1722% of reads); top 8 items t=0xb4b487:235 t=0xae3982:233 t=0xa55e00:231 t=0xa81a83:230 t=0xa43983:230 t=0x8c1c02:230 t=0x8b361c:230 t=0x9cdae6:229
[2026-10-07T19:18:16Z] attribution: reads on hot items per position (flat expectation 0.1089% of each position's 16777216 reads); the 24 largest: p75(it4 s11)=0.660% p27(it1 s11)=0.660% p107(it6 s11)=0.658% p59(it3 s11)=0.657% p91(it5 s11)=0.657% p123(it7 s11)=0.656% p43(it2 s11)=0.656% p11(it0 s11)=0.656% p86(it5 s6)=0.527% p102(it6 s6)=0.527% p118(it7 s6)=0.526% p6(it0 s6)=0.525% p70(it4 s6)=0.524% p38(it2 s6)=0.523% p22(it1 s6)=0.522% p54(it3 s6)=0.521% p119(it7 s7)=0.265% p77(it4 s13)=0.264% p53(it3 s5)=0.264% p13(it0 s13)=0.264% p125(it7 s13)=0.263% p69(it4 s5)=0.263% p61(it3 s13)=0.263% p21(it1 s5)=0.263%
[2026-10-07T19:18:16Z] attribution: hot reads by iteration it0=0.172% it1=0.172% it2=0.172% it3=0.172% it4=0.172% it5=0.172% it6=0.172% it7=0.172% ; by site s0=0.000% s1=0.000% s2=0.000% s3=0.000% s4=0.000% s5=0.263% s6=0.524% s7=0.262% s8=0.000% s9=0.131% s10=0.132% s11=0.657% s12=0.131% s13=0.263% s14=0.262% s15=0.131%
[2026-10-07T19:18:16Z] site 0 (instr 7, src r2, k_off 2 offset 0, window 2^22 items): share of its reads into the top 0.1% 0.0000% (flat expectation 0.1089%); index entropy 14.000 bits of 14 uniform-on-window; saturated source 0.0000%; largest 256-item bucket 0.0064% (window expectation 0.0061%)
[2026-10-07T19:18:16Z] site 1 (instr 12, src r1, k_off 1 offset 0, window 2^23 items): share of its reads into the top 0.1% 0.0000% (flat expectation 0.1089%); index entropy 15.000 bits of 15 uniform-on-window; saturated source 0.0000%; largest 256-item bucket 0.0032% (window expectation 0.0031%)
[2026-10-07T19:18:16Z] site 2 (instr 15, src r6, k_off 2 offset 3, window 2^22 items): share of its reads into the top 0.1% 0.0000% (flat expectation 0.1089%); index entropy 14.000 bits of 14 uniform-on-window; saturated source 0.0000%; largest 256-item bucket 0.0064% (window expectation 0.0061%)
[2026-10-07T19:18:16Z] site 3 (instr 19, src r2, k_off 1 offset 0, window 2^23 items): share of its reads into the top 0.1% 0.0000% (flat expectation 0.1089%); index entropy 15.000 bits of 15 uniform-on-window; saturated source 0.0000%; largest 256-item bucket 0.0032% (window expectation 0.0031%)
[2026-10-07T19:18:16Z] site 4 (instr 20, src r6, k_off 2 offset 1, window 2^22 items): share of its reads into the top 0.1% 0.0000% (flat expectation 0.1089%); index entropy 14.000 bits of 14 uniform-on-window; saturated source 0.0000%; largest 256-item bucket 0.0064% (window expectation 0.0061%)
[2026-10-07T19:18:16Z] site 5 (instr 21, src r3, k_off 1 offset 1, window 2^23 items): share of its reads into the top 0.1% 0.2630% (flat expectation 0.1089%); index entropy 15.000 bits of 15 uniform-on-window; saturated source 0.0000%; largest 256-item bucket 0.0032% (window expectation 0.0031%)
[2026-10-07T19:18:16Z] site 6 (instr 24, src r6, k_off 2 offset 2, window 2^22 items): share of its reads into the top 0.1% 0.5244% (flat expectation 0.1089%); index entropy 14.000 bits of 14 uniform-on-window; saturated source 0.0000%; largest 256-item bucket 0.0064% (window expectation 0.0061%)
[2026-10-07T19:18:16Z] site 7 (instr 31, src r3, k_off 1 offset 1, window 2^23 items): share of its reads into the top 0.1% 0.2621% (flat expectation 0.1089%); index entropy 15.000 bits of 15 uniform-on-window; saturated source 0.0000%; largest 256-item bucket 0.0033% (window expectation 0.0031%)
[2026-10-07T19:18:16Z] site 8 (instr 32, src r7, k_off 2 offset 0, window 2^22 items): share of its reads into the top 0.1% 0.0000% (flat expectation 0.1089%); index entropy 14.000 bits of 14 uniform-on-window; saturated source 0.0000%; largest 256-item bucket 0.0064% (window expectation 0.0061%)
[2026-10-07T19:18:16Z] site 9 (instr 35, src r2, k_off 0 offset 0, window 2^24 items): share of its reads into the top 0.1% 0.1309% (flat expectation 0.1089%); index entropy 16.000 bits of 16 uniform-on-window; saturated source 0.0000%; largest 256-item bucket 0.0017% (window expectation 0.0015%)
[2026-10-07T19:18:16Z] site 10 (instr 38, src r1, k_off 0 offset 0, window 2^24 items): share of its reads into the top 0.1% 0.1316% (flat expectation 0.1089%); index entropy 16.000 bits of 16 uniform-on-window; saturated source 0.0000%; largest 256-item bucket 0.0017% (window expectation 0.0015%)
[2026-10-07T19:18:16Z] site 11 (instr 44, src r7, k_off 2 offset 2, window 2^22 items): share of its reads into the top 0.1% 0.6573% (flat expectation 0.1089%); index entropy 14.000 bits of 14 uniform-on-window; saturated source 0.0000%; largest 256-item bucket 0.0064% (window expectation 0.0061%)
[2026-10-07T19:18:16Z] site 12 (instr 45, src r4, k_off 0 offset 0, window 2^24 items): share of its reads into the top 0.1% 0.1314% (flat expectation 0.1089%); index entropy 16.000 bits of 16 uniform-on-window; saturated source 0.0000%; largest 256-item bucket 0.0017% (window expectation 0.0015%)
[2026-10-07T19:18:16Z] site 13 (instr 47, src r3, k_off 1 offset 1, window 2^23 items): share of its reads into the top 0.1% 0.2629% (flat expectation 0.1089%); index entropy 15.000 bits of 15 uniform-on-window; saturated source 0.0000%; largest 256-item bucket 0.0033% (window expectation 0.0031%)
[2026-10-07T19:18:16Z] site 14 (instr 53, src r1, k_off 1 offset 1, window 2^23 items): share of its reads into the top 0.1% 0.2616% (flat expectation 0.1089%); index entropy 15.000 bits of 15 uniform-on-window; saturated source 0.0000%; largest 256-item bucket 0.0032% (window expectation 0.0031%)
[2026-10-07T19:18:16Z] site 15 (instr 57, src r4, k_off 0 offset 0, window 2^24 items): share of its reads into the top 0.1% 0.1307% (flat expectation 0.1089%); index entropy 16.000 bits of 16 uniform-on-window; saturated source 0.0000%; largest 256-item bucket 0.0017% (window expectation 0.0015%)
[2026-10-07T19:18:16Z] attribution: item 0xb4b487 (235 reads) read from positions p22(it1 s6)x10 p6(it0 s6)x8 p42(it2 s10)x8 p54(it3 s6)x8 p102(it6 s6)x8 p107(it6 s11)x8 p75(it4 s11)x7 p11(it0 s11)x6 p27(it1 s11)x6 p70(it4 s6)x6 p91(it5 s11)x6 p123(it7 s11)x6
[2026-10-07T19:18:16Z] attribution: item 0xae3982 (233 reads) read from positions p107(it6 s11)x13 p27(it1 s11)x9 p11(it0 s11)x8 p28(it1 s12)x7 p59(it3 s11)x7 p102(it6 s6)x7 p123(it7 s11)x7 p43(it2 s11)x6 p70(it4 s6)x6 p91(it5 s11)x6 p23(it1 s7)x5 p29(it1 s13)x5
[2026-10-07T19:18:16Z] attribution: item 0xa55e00 (231 reads) read from positions p107(it6 s11)x11 p59(it3 s11)x10 p91(it5 s11)x10 p86(it5 s6)x9 p6(it0 s6)x8 p22(it1 s6)x8 p43(it2 s11)x7 p54(it3 s6)x7 p27(it1 s11)x7 p123(it7 s11)x7 p38(it2 s6)x6 p61(it3 s13)x6
[2026-10-07T19:18:16Z] attribution: item 0xa81a83 (230 reads) read from positions p102(it6 s6)x10 p27(it1 s11)x9 p38(it2 s6)x9 p43(it2 s11)x9 p75(it4 s11)x9 p107(it6 s11)x9 p70(it4 s6)x7 p6(it0 s6)x6 p54(it3 s6)x6 p123(it7 s11)x6 p22(it1 s6)x5 p59(it3 s11)x5
[2026-10-07T19:18:16Z] attribution: item 0xa43983 (230 reads) read from positions p59(it3 s11)x10 p6(it0 s6)x9 p70(it4 s6)x8 p123(it7 s11)x8 p11(it0 s11)x7 p30(it1 s14)x7 p43(it2 s11)x7 p91(it5 s11)x7 p14(it0 s14)x6 p54(it3 s6)x6 p87(it5 s7)x6 p7(it0 s7)x5
[2026-10-07T19:18:16Z] attribution: item 0x8c1c02 (230 reads) read from positions p53(it3 s5)x10 p59(it3 s11)x10 p6(it0 s6)x9 p107(it6 s11)x9 p43(it2 s11)x8 p91(it5 s11)x8 p118(it7 s6)x8 p54(it3 s6)x7 p71(it4 s7)x7 p123(it7 s11)x7 p13(it0 s13)x6 p23(it1 s7)x6
[2026-10-07T19:18:16Z] attribution: item 0x8b361c (230 reads) read from positions p86(it5 s6)x11 p59(it3 s11)x10 p123(it7 s11)x9 p75(it4 s11)x8 p6(it0 s6)x7 p107(it6 s11)x7 p22(it1 s6)x6 p27(it1 s11)x6 p79(it4 s15)x6 p30(it1 s14)x5 p38(it2 s6)x5 p53(it3 s5)x5
[2026-10-07T19:18:16Z] attribution: item 0x9cdae6 (229 reads) read from positions p38(it2 s6)x10 p75(it4 s11)x9 p91(it5 s11)x8 p22(it1 s6)x7 p23(it1 s7)x7 p43(it2 s11)x7 p86(it5 s6)x7 p102(it6 s6)x7 p123(it7 s11)x6 p11(it0 s11)x6 p27(it1 s11)x6 p21(it1 s5)x5
[2026-10-07T19:18:16Z] hottest item p4765-attack-f8 (0xb4b487): 235 reads (0.0000% of all); predicted source none
[2026-10-07T19:18:16Z] program p4765-attack-f8 DONE: 16777216 nonces; 6-sigma (windowed) clear; hot-set clear; verdict PASS (no test fired)
[2026-10-07T19:18:17Z] attack-f8 0.1.0 (igneum-pow 4); args ["warps", "--program", "106700", "--nonces", "16777216", "--threads", "48", "--out", "/srv/builds/_adv-adv-accept/live", "--validate", "sample", "--diag", "1"]
[2026-10-07T19:18:17Z] census warps: programs [106700] day 20730 nonces 16777216 threads 48 plant none validate sample check_every 997 diag true
[2026-10-07T19:18:17Z] day 20730: cache filled in 0.64 s, fnv 448274a57f508cbc
[2026-10-07T19:18:23Z] table: 16777216 items derived with their 8 lines in 5.0 s; library comparison sample (0 mismatches)
[2026-10-07T19:18:27Z] program p106700-attack-f8: epoch seed 9f88092770683cf759f7ce1bb6645fba3c6a2ac8f81eed867c09ebbc1ab907d3 era seed 5743a2b2364f7293a5568468b7fc0d3c8d69814f8d338763d94300a4c2424272 id 50f23e22237fb516 attempt 0 class mx8-era27f81f3d+sh256x27 op mix load=16 add=11 xor=6 mul=5 mulhi=5 rotr=5 shfl=5 mad=4 or=4 rotl=2 sub=1; era stride mul 0x8ee9c4e3 rot 20 interleave [8, 10, 11, 15] windows 6:2:2 11:2:0 13:2:2 15:0:0 26:1:1 28:0:0 31:0:0 37:0:0 42:0:0 45:1:0 46:2:2 51:2:0 52:1:0 55:2:0 61:1:1 62:1:0
[2026-10-07T19:18:27Z] load site instr 6: src r0 win 2 off 2; last base writer add at 0; writers back to the last injecting one: add@0; shadow writes of r0 per rep: add=14 mad=5 mul=5 mulhi=3 rotl=1 rotr=6 shfl=2 sub=1 xor=3
[2026-10-07T19:18:27Z] load site instr 11: src r7 win 2 off 0; last base writer load at 6; writers back to the last injecting one: load@6; shadow writes of r7 per rep: add=5 mad=3 mul=6 or=1 rotl=5 shfl=4 sub=2 xor=6
[2026-10-07T19:18:27Z] load site instr 13: src r3 win 2 off 2; last base writer shfl at 9; writers back to the last injecting one: shfl@9; shadow writes of r3 per rep: add=6 mad=5 mul=2 or=3 rotl=4 rotr=4 shfl=4 sub=1 xor=3
[2026-10-07T19:18:27Z] load site instr 15: src r2 win 0 off 0; last base writer load at 11; writers back to the last injecting one: load@11; shadow writes of r2 per rep: add=4 mad=3 mul=5 or=3 rotl=1 rotr=3 shfl=1 xor=6
[2026-10-07T19:18:27Z] load site instr 26: src r0 win 1 off 1; last base writer rotr at 20; writers back to the last injecting one: rotr@20 load@15; shadow writes of r0 per rep: add=14 mad=5 mul=5 mulhi=3 rotl=1 rotr=6 shfl=2 sub=1 xor=3
[2026-10-07T19:18:27Z] load site instr 28: src r6 win 0 off 0; last base writer load at 26; writers back to the last injecting one: load@26; shadow writes of r6 per rep: add=5 mad=2 mul=4 mulhi=1 or=4 rotl=1 rotr=2 shfl=6 sub=3 xor=6
[2026-10-07T19:18:27Z] load site instr 31: src r2 win 0 off 0; last base writer shfl at 29; writers back to the last injecting one: shfl@29; shadow writes of r2 per rep: add=4 mad=3 mul=5 or=3 rotl=1 rotr=3 shfl=1 xor=6
[2026-10-07T19:18:27Z] load site instr 37: src r7 win 0 off 0; last base writer add at 36; writers back to the last injecting one: add@36; shadow writes of r7 per rep: add=5 mad=3 mul=6 or=1 rotl=5 shfl=4 sub=2 xor=6
[2026-10-07T19:18:27Z] load site instr 42: src r1 win 0 off 0; last base writer add at 40; writers back to the last injecting one: add@40; shadow writes of r1 per rep: add=2 mad=4 mul=7 mulhi=1 or=4 rotl=2 rotr=2 shfl=5 sub=2 xor=6
[2026-10-07T19:18:27Z] load site instr 45: src r2 win 1 off 0; last base writer load at 42; writers back to the last injecting one: load@42; shadow writes of r2 per rep: add=4 mad=3 mul=5 or=3 rotl=1 rotr=3 shfl=1 xor=6
[2026-10-07T19:18:27Z] load site instr 46: src r0 win 2 off 2; last base writer shfl at 33; writers back to the last injecting one: shfl@33; shadow writes of r0 per rep: add=14 mad=5 mul=5 mulhi=3 rotl=1 rotr=6 shfl=2 sub=1 xor=3
[2026-10-07T19:18:27Z] load site instr 51: src r4 win 2 off 0; last base writer load at 46; writers back to the last injecting one: load@46; shadow writes of r4 per rep: add=5 mad=2 mul=4 mulhi=2 or=1 rotl=1 rotr=3 shfl=1 sub=2 xor=8
[2026-10-07T19:18:27Z] load site instr 52: src r5 win 1 off 0; last base writer load at 45; writers back to the last injecting one: load@45; shadow writes of r5 per rep: add=6 mad=3 mul=4 mulhi=2 rotl=1 rotr=3 shfl=4 sub=3 xor=2
[2026-10-07T19:18:27Z] load site instr 55: src r0 win 2 off 0; last base writer rotr at 48; writers back to the last injecting one: rotr@48 shfl@33; shadow writes of r0 per rep: add=14 mad=5 mul=5 mulhi=3 rotl=1 rotr=6 shfl=2 sub=1 xor=3
[2026-10-07T19:18:27Z] load site instr 61: src r3 win 1 off 1; last base writer load at 55; writers back to the last injecting one: load@55; shadow writes of r3 per rep: add=6 mad=5 mul=2 or=3 rotl=4 rotr=4 shfl=4 sub=1 xor=3
[2026-10-07T19:18:27Z] load site instr 62: src r6 win 1 off 0; last base writer mad at 54; writers back to the last injecting one: mad@54; shadow writes of r6 per rep: add=5 mad=2 mul=4 mulhi=1 or=4 rotl=1 rotr=2 shfl=6 sub=3 xor=6
[2026-10-07T19:18:27Z] window layer: site item windows (first, items) (0x800000,2^22) (0x0,2^22) (0x800000,2^22) (0x0,2^24) (0x800000,2^23) (0x0,2^24) (0x0,2^24) (0x0,2^24) (0x0,2^24) (0x0,2^23) (0x800000,2^22) (0x0,2^22) (0x0,2^23) (0x0,2^22) (0x800000,2^23) (0x0,2^23); expected reads per item by quarter 184.000 88.000 168.000 72.000 (flat uniform 128.000)
[2026-10-07T19:20:56Z] 524288 warps (16777216 nonces) interpreted in 149.2 s (13.663 ms per warp per thread); Epoch::hash_warp agreement on 589 warps: 0 mismatches
[2026-10-07T19:20:56Z] p106700-attack-f8 distinct lines per hash: n 16777216 min 1013 p1 1023 median 1024 p99 1024 max 1024 mean 1023.8707
[2026-10-07T19:20:56Z] p106700-attack-f8 distinct items per hash: n 16777216 min 127 p1 128 median 128 p99 128 max 128 mean 127.9995
[2026-10-07T19:20:56Z] p106700-attack-f8 distinct lines per warp: n 524288 min 32567 p1 32604 median 32636 p99 32664 max 32690 mean 32635.7873
[2026-10-07T19:20:56Z] p106700-attack-f8 distinct items per warp: n 524288 min 4089 p1 4093 median 4096 p99 4096 max 4096 mean 4095.4261
[2026-10-07T19:20:56Z] uniform expectation: distinct lines per hash 1023.875 of 1024 reads, per warp 32640.3 of 32768 reads (2^22 lines); distinct items per hash 127.9995 of 128, per warp 4095.50 of 4096 (2^24 items)
[2026-10-07T19:20:56Z] positions: largest hi16-bucket (256 items) share 0.0083% at p48 (iteration 3, site 0, instr 6); windowed expectation 0.0061%; largest saturated-source share 0.0000% at p25 (site 9, instr 45)
[2026-10-07T19:20:56Z] acceptance-style (2,048 evaluations, the rule's sample size): the most repeated address at one position 2 of 2048 at p28 (site 12, instr 52); saturated sources at one position 0 of 2048 at p0 (site 0, instr 6); uniform expectation: repeats 1 to 2, saturated 0
[2026-10-07T19:20:56Z] p106700-attack-f8 item histogram (flat): bins 16777216 reads 2147483648 mean 128.000 sigma 11.314 max 253 (bin 3163635) z_max +11.05 min 34 z_min -8.31 chi2/dof 19.54283 chi2_z +53705.77 top0.1% 0.17621% top0.5% 0.85097% top1% 1.67279%
[2026-10-07T19:20:56Z] p106700-attack-f8 item histogram against the window density: full 2^24 chi2/dof 1.03107 largest 243 (item 0xa684e3) at +5.79 sigma smallest at -5.01; buckets64 chi2/dof 2.99397 largest 11546 (bucket 178325) at +7.66 sigma smallest at -6.83
[2026-10-07T19:21:00Z] p106700-attack-f8 WINDOWED CONTROL item histogram (flat): bins 16777216 reads 2147483648 mean 128.000 sigma 11.314 max 258 (bin 1361096) z_max +11.49 min 32 z_min -8.49 chi2/dof 19.50008 chi2_z +53581.96 top0.1% 0.17611% top0.5% 0.85055% top1% 1.67166%
[2026-10-07T19:21:00Z] p106700-attack-f8 WINDOWED CONTROL against the window density: full chi2/dof 1.00050 largest +5.65 sigma; buckets64 chi2/dof 0.99501 largest +4.60 smallest -4.36
[2026-10-07T19:21:00Z] 6-sigma p106700-attack-f8 items buckets64 against the window density: largest bucket +7.66 sigma, smallest -6.83 -> FLAGGED (beyond 6 sigma)
[2026-10-07T19:21:00Z] hot-set p106700-attack-f8 items (windowed control): f 0.1% S_f 0.17621% E_f(control) 0.17611% X_f +0.00010% X_f/f +0.0010 -> no hot set
[2026-10-07T19:21:00Z] hot-set p106700-attack-f8 items (windowed control): f 0.5% S_f 0.85097% E_f(control) 0.85055% X_f +0.00042% X_f/f +0.0008 -> no hot set
[2026-10-07T19:21:00Z] hot-set p106700-attack-f8 items (windowed control): f 1.0% S_f 1.67279% E_f(control) 1.67166% X_f +0.00114% X_f/f +0.0011 -> no hot set
[2026-10-07T19:21:00Z] hot-set p106700-attack-f8 items (windowed control): verdict clear
[2026-10-07T19:21:04Z] p106700-attack-f8 FLAT CONTROL item histogram: bins 16777216 reads 2147483648 mean 128.000 sigma 11.314 max 192 (bin 8330333) z_max +5.66 min 72 z_min -4.95 chi2/dof 0.99976 chi2_z -0.70 top0.1% 0.13104% top0.5% 0.63252% top1% 1.24341%
[2026-10-07T19:21:04Z] hot-set p106700-attack-f8 items (flat control, the auditor's first view): f 0.1% S_f 0.17621% E_f(control) 0.13104% X_f +0.04517% X_f/f +0.4517 -> no hot set
[2026-10-07T19:21:04Z] hot-set p106700-attack-f8 items (flat control, the auditor's first view): f 0.5% S_f 0.85097% E_f(control) 0.63252% X_f +0.21845% X_f/f +0.4369 -> no hot set
[2026-10-07T19:21:04Z] hot-set p106700-attack-f8 items (flat control, the auditor's first view): f 1.0% S_f 1.67279% E_f(control) 1.24341% X_f +0.42938% X_f/f +0.4294 -> no hot set
[2026-10-07T19:21:04Z] hot-set p106700-attack-f8 items (flat control, the auditor's first view): verdict clear
[2026-10-07T19:21:04Z] ratio p106700-attack-f8: top 0.1% / 0.5% / 1% share over the WINDOW-MODEL control 1.0006x / 1.0005x / 1.0007x (gate 1.2x at 0.1%: within); over the FLAT control 1.3447x / 1.3454x / 1.3453x
[2026-10-07T19:21:06Z] attribution: hot threshold count >= 221 marks 18938 items (0.1129% of items) holding 4261674 reads (0.1984% of reads); top 8 items t=0x3045f3:253 t=0x0bc789:252 t=0x0a3617:252 t=0x0b3b37:251 t=0x07eec4:251 t=0x2daedd:249 t=0x204325:249 t=0x0c9b8f:249
lease: 0 of 16 pool cores free (88 leased); waiting

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,235 @@
[2026-10-07T18:36:58Z] attack-f8 0.1.0 (igneum-pow 4); args ["warps", "--program", "100211", "--nonces", "1000000", "--threads", "32", "--out", "/srv/builds/igneum-wt-adv-accept/adv/live", "--validate", "sample"]
[2026-10-07T18:36:58Z] census warps: programs [100211] day 20730 nonces 1000000 threads 32 plant none validate sample check_every 997 diag false
[2026-10-07T18:36:58Z] day 20730: cache filled in 0.50 s, fnv 448274a57f508cbc
[2026-10-07T18:37:01Z] table: 16777216 items derived with their 8 lines in 2.7 s; library comparison sample (0 mismatches)
[2026-10-07T18:37:06Z] program p100211-attack-f8: epoch seed 3d4686b780097991a4600a0683fca3645e627c67edd53365c4131c7095ecc55d era seed 3e3a196a3504d573eee9656bffb7e3d2dffc03dc10f95f92fd08d0ab245641f7 id d07885a437e237c7 attempt 0 class mx8-eraa8bce51f+sh256x27 op mix load=16 xor=11 mul=10 add=7 mad=6 mulhi=4 shfl=4 rotl=3 or=1 rotr=1 sub=1; era stride mul 0x4babb2b7 rot 31 interleave [1, 6, 8, 13] windows 3:1:1 4:1:0 7:0:0 15:2:0 17:2:2 23:0:0 24:1:0 27:2:3 29:2:1 31:1:0 35:0:0 41:1:0 44:2:1 49:0:0 61:2:1 63:1:0
[2026-10-07T18:37:06Z] load site instr 3: src r4 win 1 off 1; last base writer xor at 2; writers back to the last injecting one: xor@2; shadow writes of r4 per rep: add=6 mad=2 mul=4 mulhi=7 or=1 rotl=6 rotr=5 shfl=3 sub=3 xor=5
[2026-10-07T18:37:06Z] load site instr 4: src r0 win 1 off 0; last base writer load at 3; writers back to the last injecting one: load@3; shadow writes of r0 per rep: add=5 mad=4 mul=5 mulhi=1 or=1 rotl=2 rotr=6 shfl=3 sub=6 xor=4
[2026-10-07T18:37:06Z] load site instr 7: src r2 win 0 off 0; last base writer load at 4; writers back to the last injecting one: load@4; shadow writes of r2 per rep: add=5 mad=4 mul=3 mulhi=1 or=2 rotl=2 rotr=3 shfl=1 sub=3 xor=9
[2026-10-07T18:37:06Z] load site instr 15: src r4 win 2 off 0; last base writer mad at 12; writers back to the last injecting one: mad@12; shadow writes of r4 per rep: add=6 mad=2 mul=4 mulhi=7 or=1 rotl=6 rotr=5 shfl=3 sub=3 xor=5
[2026-10-07T18:37:06Z] load site instr 17: src r3 win 2 off 2; last base writer load at 15; writers back to the last injecting one: load@15; shadow writes of r3 per rep: add=4 mad=1 mul=1 mulhi=2 or=1 rotl=4 rotr=2 shfl=4 sub=1 xor=3
[2026-10-07T18:37:06Z] load site instr 23: src r0 win 0 off 0; last base writer xor at 13; writers back to the last injecting one: xor@13; shadow writes of r0 per rep: add=5 mad=4 mul=5 mulhi=1 or=1 rotl=2 rotr=6 shfl=3 sub=6 xor=4
[2026-10-07T18:37:06Z] load site instr 24: src r7 win 1 off 0; last base writer shfl at 16; writers back to the last injecting one: shfl@16; shadow writes of r7 per rep: add=2 mad=4 mul=3 mulhi=1 or=1 rotl=5 rotr=4 shfl=2 sub=1 xor=4
[2026-10-07T18:37:06Z] load site instr 27: src r5 win 2 off 3; last base writer load at 24; writers back to the last injecting one: load@24; shadow writes of r5 per rep: add=3 mad=5 mul=1 mulhi=2 or=1 rotl=3 rotr=2 shfl=6 sub=1 xor=5
[2026-10-07T18:37:06Z] load site instr 29: src r2 win 2 off 1; last base writer load at 27; writers back to the last injecting one: load@27; shadow writes of r2 per rep: add=5 mad=4 mul=3 mulhi=1 or=2 rotl=2 rotr=3 shfl=1 sub=3 xor=9
[2026-10-07T18:37:06Z] load site instr 31: src r6 win 1 off 0; last base writer xor at 30; writers back to the last injecting one: xor@30; shadow writes of r6 per rep: add=5 mad=4 mul=5 mulhi=2 or=1 rotl=3 rotr=3 shfl=1 sub=4 xor=4
[2026-10-07T18:37:06Z] load site instr 35: src r7 win 0 off 0; last base writer rotl at 33; writers back to the last injecting one: rotl@33 shfl@16; shadow writes of r7 per rep: add=2 mad=4 mul=3 mulhi=1 or=1 rotl=5 rotr=4 shfl=2 sub=1 xor=4
[2026-10-07T18:37:06Z] load site instr 41: src r1 win 1 off 0; last base writer add at 40; writers back to the last injecting one: add@40; shadow writes of r1 per rep: add=3 mad=3 mul=3 mulhi=2 or=3 rotl=5 rotr=2 shfl=5 sub=2 xor=5
[2026-10-07T18:37:06Z] load site instr 44: src r5 win 2 off 1; last base writer load at 35; writers back to the last injecting one: load@35; shadow writes of r5 per rep: add=3 mad=5 mul=1 mulhi=2 or=1 rotl=3 rotr=2 shfl=6 sub=1 xor=5
[2026-10-07T18:37:06Z] load site instr 49: src r4 win 0 off 0; last base writer load at 44; writers back to the last injecting one: load@44; shadow writes of r4 per rep: add=6 mad=2 mul=4 mulhi=7 or=1 rotl=6 rotr=5 shfl=3 sub=3 xor=5
[2026-10-07T18:37:06Z] load site instr 61: src r3 win 2 off 1; last base writer xor at 58; writers back to the last injecting one: xor@58; shadow writes of r3 per rep: add=4 mad=1 mul=1 mulhi=2 or=1 rotl=4 rotr=2 shfl=4 sub=1 xor=3
[2026-10-07T18:37:06Z] load site instr 63: src r4 win 1 off 0; last base writer shfl at 62; writers back to the last injecting one: shfl@62; shadow writes of r4 per rep: add=6 mad=2 mul=4 mulhi=7 or=1 rotl=6 rotr=5 shfl=3 sub=3 xor=5
[2026-10-07T18:37:06Z] window layer: site item windows (first, items) (0x800000,2^23) (0x0,2^23) (0x0,2^24) (0x0,2^22) (0x800000,2^22) (0x0,2^24) (0x0,2^23) (0xc00000,2^22) (0x400000,2^22) (0x0,2^23) (0x0,2^24) (0x0,2^23) (0x400000,2^22) (0x0,2^24) (0x400000,2^22) (0x0,2^23); expected reads per item by quarter 8.583 12.398 4.768 4.768 (flat uniform 7.629)
[2026-10-07T18:37:09Z] 31250 warps (1000000 nonces) interpreted in 3.4 s (3.514 ms per warp per thread); Epoch::hash_warp agreement on 95 warps: 0 mismatches
[2026-10-07T18:37:09Z] p100211-attack-f8 distinct lines per hash: n 1000000 min 1013 p1 1023 median 1024 p99 1024 max 1024 mean 1023.8706
[2026-10-07T18:37:09Z] p100211-attack-f8 distinct items per hash: n 1000000 min 127 p1 128 median 128 p99 128 max 128 mean 127.9994
[2026-10-07T18:37:09Z] p100211-attack-f8 distinct lines per warp: n 31250 min 32580 p1 32604 median 32636 p99 32664 max 32682 mean 32635.6451
[2026-10-07T18:37:09Z] p100211-attack-f8 distinct items per warp: n 31250 min 4089 p1 4093 median 4096 p99 4096 max 4096 mean 4095.4165
[2026-10-07T18:37:09Z] uniform expectation: distinct lines per hash 1023.875 of 1024 reads, per warp 32640.3 of 32768 reads (2^22 lines); distinct items per hash 127.9995 of 128, per warp 4095.50 of 4096 (2^24 items)
[2026-10-07T18:37:09Z] positions: largest hi16-bucket (256 items) share 0.0193% at p89 (iteration 5, site 9, instr 31); windowed expectation 0.0031%; largest saturated-source share 0.0000% at p0 (site 0, instr 3)
[2026-10-07T18:37:09Z] acceptance-style (2,048 evaluations, the rule's sample size): the most repeated address at one position 2 of 2048 at p9 (site 9, instr 31); saturated sources at one position 0 of 2048 at p0 (site 0, instr 3); uniform expectation: repeats 1 to 2, saturated 0
[2026-10-07T18:37:09Z] p100211-attack-f8 item histogram (flat): bins 16777216 reads 128000000 mean 7.629 sigma 2.762 max 1238 (bin 4539781) z_max +445.44 min 0 z_min -2.76 chi2/dof 2.36870 chi2_z +3964.17 top0.1% 0.34137% top0.5% 1.46293% top1% 2.74616%
[2026-10-07T18:37:09Z] p100211-attack-f8 item histogram against the window density: full 2^24 chi2/dof 1.04292 largest 1238 (item 0x454585) at +348.08 sigma smallest at -3.52; buckets64 chi2/dof 1.03150 largest 1989 (bucket 70934) at +42.44 sigma smallest at -4.02
[2026-10-07T18:37:10Z] p100211-attack-f8 WINDOWED CONTROL item histogram (flat): bins 16777216 reads 128000000 mean 7.629 sigma 2.762 max 37 (bin 6537897) z_max +10.63 min 0 z_min -2.76 chi2/dof 2.31214 chi2_z +3800.36 top0.1% 0.31534% top0.5% 1.42196% top1% 2.69721%
[2026-10-07T18:37:10Z] p100211-attack-f8 WINDOWED CONTROL against the window density: full chi2/dof 1.00002 largest +6.99 sigma; buckets64 chi2/dof 0.99932 largest +4.68 smallest -4.45
[2026-10-07T18:37:10Z] 6-sigma p100211-attack-f8 items buckets64 against the window density: largest bucket +42.44 sigma, smallest -4.02 -> FLAGGED (beyond 6 sigma)
[2026-10-07T18:37:10Z] hot-set p100211-attack-f8 items (windowed control): f 0.1% S_f 0.34137% E_f(control) 0.31534% X_f +0.02603% X_f/f +0.2603 -> no hot set
[2026-10-07T18:37:10Z] hot-set p100211-attack-f8 items (windowed control): f 0.5% S_f 1.46293% E_f(control) 1.42196% X_f +0.04096% X_f/f +0.0819 -> no hot set
[2026-10-07T18:37:10Z] hot-set p100211-attack-f8 items (windowed control): f 1.0% S_f 2.74616% E_f(control) 2.69721% X_f +0.04895% X_f/f +0.0489 -> no hot set
[2026-10-07T18:37:10Z] hot-set p100211-attack-f8 items (windowed control): verdict clear
[2026-10-07T18:37:10Z] p100211-attack-f8 FLAT CONTROL item histogram: bins 16777216 reads 128000000 mean 7.629 sigma 2.762 max 27 (bin 9914800) z_max +7.01 min 0 z_min -2.76 chi2/dof 1.00012 chi2_z +0.35 top0.1% 0.24321% top0.5% 1.09954% top1% 2.08777%
[2026-10-07T18:37:10Z] hot-set p100211-attack-f8 items (flat control, the auditor's first view): f 0.1% S_f 0.34137% E_f(control) 0.24321% X_f +0.09815% X_f/f +0.9815 -> no hot set
[2026-10-07T18:37:10Z] hot-set p100211-attack-f8 items (flat control, the auditor's first view): f 0.5% S_f 1.46293% E_f(control) 1.09954% X_f +0.36339% X_f/f +0.7268 -> no hot set
[2026-10-07T18:37:10Z] hot-set p100211-attack-f8 items (flat control, the auditor's first view): f 1.0% S_f 2.74616% E_f(control) 2.08777% X_f +0.65839% X_f/f +0.6584 -> no hot set
[2026-10-07T18:37:10Z] hot-set p100211-attack-f8 items (flat control, the auditor's first view): verdict clear
[2026-10-07T18:37:10Z] ratio p100211-attack-f8: top 0.1% / 0.5% / 1% share over the WINDOW-MODEL control 1.0825x / 1.0288x / 1.0181x (gate 1.2x at 0.1%: within); over the FLAT control 1.4036x / 1.3305x / 1.3154x
[2026-10-07T18:37:10Z] hottest item p100211-attack-f8 (0x454585): 1238 reads (0.0010% of all); predicted source site-instr4:r0:one-zero-bit:last-writer-load@3
[2026-10-07T18:37:10Z] program p100211-attack-f8 DONE: 1000000 nonces; 6-sigma (windowed) FLAGGED; hot-set clear; verdict FLAGGED
[2026-10-07T18:37:11Z] attack-f8 0.1.0 (igneum-pow 4); args ["warps", "--program", "100629", "--nonces", "1000000", "--threads", "32", "--out", "/srv/builds/igneum-wt-adv-accept/adv/live", "--validate", "sample"]
[2026-10-07T18:37:11Z] census warps: programs [100629] day 20730 nonces 1000000 threads 32 plant none validate sample check_every 997 diag false
[2026-10-07T18:37:11Z] day 20730: cache filled in 0.66 s, fnv 448274a57f508cbc
[2026-10-07T18:37:14Z] table: 16777216 items derived with their 8 lines in 2.7 s; library comparison sample (0 mismatches)
[2026-10-07T18:37:19Z] program p100629-attack-f8: epoch seed 68bfab501dbcaf5685d1cfea27ebe7d0bbeb3aeae03591561bd3eabc3d6510a2 era seed 24152e11d7c8f0e60319ba0ca3b83ace33a2f22cffd58ad2a8168dc4283352b5 id 37c849d9741c5994 attempt 0 class mx8-era31b72e61+sh256x27 op mix load=16 add=10 mad=8 mul=6 rotl=5 or=4 shfl=4 xor=4 mulhi=3 rotr=2 sub=2; era stride mul 0xc8c38905 rot 3 interleave [3, 4, 5, 10] windows 4:1:1 5:1:1 9:2:0 13:1:1 15:1:1 16:2:3 17:0:0 18:0:0 19:2:2 33:2:0 34:1:1 38:2:0 40:1:0 47:0:0 51:0:0 54:0:0
[2026-10-07T18:37:19Z] load site instr 4: src r0 win 1 off 1; last base writer mad at 2; writers back to the last injecting one: mad@2; shadow writes of r0 per rep: add=3 mad=3 mul=3 mulhi=2 or=2 rotl=4 rotr=2 sub=5 xor=5
[2026-10-07T18:37:19Z] load site instr 5: src r1 win 1 off 1; last base writer load at 4; writers back to the last injecting one: load@4; shadow writes of r1 per rep: add=9 mad=1 mul=2 mulhi=4 or=4 rotl=1 rotr=2 shfl=1 sub=2 xor=3
[2026-10-07T18:37:19Z] load site instr 9: src r1 win 2 off 0; last base writer add at 8; writers back to the last injecting one: add@8; shadow writes of r1 per rep: add=9 mad=1 mul=2 mulhi=4 or=4 rotl=1 rotr=2 shfl=1 sub=2 xor=3
[2026-10-07T18:37:19Z] load site instr 13: src r2 win 1 off 1; last base writer load at 9; writers back to the last injecting one: load@9; shadow writes of r2 per rep: add=1 mad=3 mul=2 mulhi=1 or=3 rotl=5 rotr=3 shfl=3 sub=4 xor=8
[2026-10-07T18:37:19Z] load site instr 15: src r1 win 1 off 1; last base writer load at 13; writers back to the last injecting one: load@13; shadow writes of r1 per rep: add=9 mad=1 mul=2 mulhi=4 or=4 rotl=1 rotr=2 shfl=1 sub=2 xor=3
[2026-10-07T18:37:19Z] load site instr 16: src r3 win 2 off 3; last base writer mad at 12; writers back to the last injecting one: mad@12; shadow writes of r3 per rep: add=5 mad=3 mul=6 mulhi=3 or=1 rotl=3 rotr=5 shfl=6 sub=3 xor=5
[2026-10-07T18:37:19Z] load site instr 17: src r2 win 0 off 0; last base writer load at 15; writers back to the last injecting one: load@15; shadow writes of r2 per rep: add=1 mad=3 mul=2 mulhi=1 or=3 rotl=5 rotr=3 shfl=3 sub=4 xor=8
[2026-10-07T18:37:19Z] load site instr 18: src r6 win 0 off 0; last base writer load at 16; writers back to the last injecting one: load@16; shadow writes of r6 per rep: add=4 mad=2 mul=6 mulhi=3 or=3 rotl=4 rotr=2 shfl=3 sub=1 xor=3
[2026-10-07T18:37:19Z] load site instr 19: src r5 win 2 off 2; last base writer load at 17; writers back to the last injecting one: load@17; shadow writes of r5 per rep: add=5 mad=2 mul=3 mulhi=5 or=1 rotl=2 rotr=3 shfl=5 sub=6 xor=1
[2026-10-07T18:37:19Z] load site instr 33: src r5 win 2 off 0; last base writer add at 31; writers back to the last injecting one: add@31; shadow writes of r5 per rep: add=5 mad=2 mul=3 mulhi=5 or=1 rotl=2 rotr=3 shfl=5 sub=6 xor=1
[2026-10-07T18:37:19Z] load site instr 34: src r1 win 1 off 1; last base writer xor at 27; writers back to the last injecting one: xor@27; shadow writes of r1 per rep: add=9 mad=1 mul=2 mulhi=4 or=4 rotl=1 rotr=2 shfl=1 sub=2 xor=3
[2026-10-07T18:37:19Z] load site instr 38: src r6 win 2 off 0; last base writer add at 35; writers back to the last injecting one: add@35; shadow writes of r6 per rep: add=4 mad=2 mul=6 mulhi=3 or=3 rotl=4 rotr=2 shfl=3 sub=1 xor=3
[2026-10-07T18:37:19Z] load site instr 40: src r3 win 1 off 0; last base writer load at 38; writers back to the last injecting one: load@38; shadow writes of r3 per rep: add=5 mad=3 mul=6 mulhi=3 or=1 rotl=3 rotr=5 shfl=6 sub=3 xor=5
[2026-10-07T18:37:19Z] load site instr 47: src r1 win 0 off 0; last base writer rotl at 44; writers back to the last injecting one: rotl@44 xor@27; shadow writes of r1 per rep: add=9 mad=1 mul=2 mulhi=4 or=4 rotl=1 rotr=2 shfl=1 sub=2 xor=3
[2026-10-07T18:37:19Z] load site instr 51: src r7 win 0 off 0; last base writer load at 40; writers back to the last injecting one: load@40; shadow writes of r7 per rep: add=7 mad=2 mul=1 mulhi=4 or=2 rotr=5 shfl=2 sub=2 xor=5
[2026-10-07T18:37:19Z] load site instr 54: src r3 win 0 off 0; last base writer load at 51; writers back to the last injecting one: load@51; shadow writes of r3 per rep: add=5 mad=3 mul=6 mulhi=3 or=1 rotl=3 rotr=5 shfl=6 sub=3 xor=5
[2026-10-07T18:37:19Z] window layer: site item windows (first, items) (0x800000,2^23) (0x800000,2^23) (0x0,2^22) (0x800000,2^23) (0x800000,2^23) (0xc00000,2^22) (0x0,2^24) (0x0,2^24) (0x800000,2^22) (0x0,2^22) (0x800000,2^23) (0x0,2^22) (0x0,2^23) (0x0,2^24) (0x0,2^24) (0x0,2^24); expected reads per item by quarter 9.060 3.338 9.060 9.060 (flat uniform 7.629)
[2026-10-07T18:37:23Z] 31250 warps (1000000 nonces) interpreted in 3.8 s (3.852 ms per warp per thread); Epoch::hash_warp agreement on 95 warps: 0 mismatches
[2026-10-07T18:37:23Z] p100629-attack-f8 distinct lines per hash: n 1000000 min 1014 p1 1023 median 1024 p99 1024 max 1024 mean 1023.8713
[2026-10-07T18:37:23Z] p100629-attack-f8 distinct items per hash: n 1000000 min 127 p1 128 median 128 p99 128 max 128 mean 127.9995
[2026-10-07T18:37:23Z] p100629-attack-f8 distinct lines per warp: n 31250 min 32565 p1 32605 median 32636 p99 32664 max 32681 mean 32635.9486
[2026-10-07T18:37:23Z] p100629-attack-f8 distinct items per warp: n 31250 min 4090 p1 4093 median 4096 p99 4096 max 4096 mean 4095.4480
[2026-10-07T18:37:23Z] uniform expectation: distinct lines per hash 1023.875 of 1024 reads, per warp 32640.3 of 32768 reads (2^22 lines); distinct items per hash 127.9995 of 128, per warp 4095.50 of 4096 (2^24 items)
[2026-10-07T18:37:23Z] positions: largest hi16-bucket (256 items) share 0.0104% at p121 (iteration 7, site 9, instr 33); windowed expectation 0.0061%; largest saturated-source share 0.0001% at p5 (site 5, instr 16)
[2026-10-07T18:37:23Z] acceptance-style (2,048 evaluations, the rule's sample size): the most repeated address at one position 2 of 2048 at p4 (site 4, instr 15); saturated sources at one position 0 of 2048 at p0 (site 0, instr 4); uniform expectation: repeats 1 to 2, saturated 0
[2026-10-07T18:37:23Z] p100629-attack-f8 item histogram (flat): bins 16777216 reads 128000000 mean 7.629 sigma 2.762 max 30 (bin 8487097) z_max +8.10 min 0 z_min -2.76 chi2/dof 1.81617 chi2_z +2363.89 top0.1% 0.27111% top0.5% 1.22433% top1% 2.32916%
[2026-10-07T18:37:23Z] p100629-attack-f8 item histogram against the window density: full 2^24 chi2/dof 1.01006 largest 30 (item 0x8180b9) at +6.96 sigma smallest at -3.01; buckets64 chi2/dof 1.01223 largest 296 (bucket 98030) at +5.64 sigma smallest at -4.69
[2026-10-07T18:37:23Z] p100629-attack-f8 WINDOWED CONTROL item histogram (flat): bins 16777216 reads 128000000 mean 7.629 sigma 2.762 max 29 (bin 9724837) z_max +7.74 min 0 z_min -2.76 chi2/dof 1.80496 chi2_z +2331.41 top0.1% 0.26813% top0.5% 1.21510% top1% 2.31449%
[2026-10-07T18:37:23Z] p100629-attack-f8 WINDOWED CONTROL against the window density: full chi2/dof 1.00037 largest +6.93 sigma; buckets64 chi2/dof 0.99550 largest +4.74 smallest -4.31
[2026-10-07T18:37:23Z] 6-sigma p100629-attack-f8 items buckets64 against the window density: largest bucket +5.64 sigma, smallest -4.69 -> within 6 sigma
[2026-10-07T18:37:23Z] hot-set p100629-attack-f8 items (windowed control): f 0.1% S_f 0.27111% E_f(control) 0.26813% X_f +0.00298% X_f/f +0.0298 -> no hot set
[2026-10-07T18:37:23Z] hot-set p100629-attack-f8 items (windowed control): f 0.5% S_f 1.22433% E_f(control) 1.21510% X_f +0.00923% X_f/f +0.0185 -> no hot set
[2026-10-07T18:37:23Z] hot-set p100629-attack-f8 items (windowed control): f 1.0% S_f 2.32916% E_f(control) 2.31449% X_f +0.01468% X_f/f +0.0147 -> no hot set
[2026-10-07T18:37:23Z] hot-set p100629-attack-f8 items (windowed control): verdict clear
[2026-10-07T18:37:24Z] p100629-attack-f8 FLAT CONTROL item histogram: bins 16777216 reads 128000000 mean 7.629 sigma 2.762 max 26 (bin 1359050) z_max +6.65 min 0 z_min -2.76 chi2/dof 1.00082 chi2_z +2.36 top0.1% 0.24290% top0.5% 1.09909% top1% 2.08683%
[2026-10-07T18:37:24Z] hot-set p100629-attack-f8 items (flat control, the auditor's first view): f 0.1% S_f 0.27111% E_f(control) 0.24290% X_f +0.02821% X_f/f +0.2821 -> no hot set
[2026-10-07T18:37:24Z] hot-set p100629-attack-f8 items (flat control, the auditor's first view): f 0.5% S_f 1.22433% E_f(control) 1.09909% X_f +0.12524% X_f/f +0.2505 -> no hot set
[2026-10-07T18:37:24Z] hot-set p100629-attack-f8 items (flat control, the auditor's first view): f 1.0% S_f 2.32916% E_f(control) 2.08683% X_f +0.24233% X_f/f +0.2423 -> no hot set
[2026-10-07T18:37:24Z] hot-set p100629-attack-f8 items (flat control, the auditor's first view): verdict clear
[2026-10-07T18:37:24Z] ratio p100629-attack-f8: top 0.1% / 0.5% / 1% share over the WINDOW-MODEL control 1.0111x / 1.0076x / 1.0063x (gate 1.2x at 0.1%: within); over the FLAT control 1.1161x / 1.1139x / 1.1161x
[2026-10-07T18:37:24Z] hottest item p100629-attack-f8 (0x8180b9): 30 reads (0.0000% of all); predicted source none
[2026-10-07T18:37:24Z] program p100629-attack-f8 DONE: 1000000 nonces; 6-sigma (windowed) clear; hot-set clear; verdict PASS (no test fired)
[2026-10-07T18:37:24Z] attack-f8 0.1.0 (igneum-pow 4); args ["warps", "--program", "100064", "--nonces", "1000000", "--threads", "32", "--out", "/srv/builds/igneum-wt-adv-accept/adv/live", "--validate", "sample"]
[2026-10-07T18:37:24Z] census warps: programs [100064] day 20730 nonces 1000000 threads 32 plant none validate sample check_every 997 diag false
[2026-10-07T18:37:25Z] day 20730: cache filled in 0.61 s, fnv 448274a57f508cbc
[2026-10-07T18:37:28Z] table: 16777216 items derived with their 8 lines in 2.4 s; library comparison sample (0 mismatches)
[2026-10-07T18:37:32Z] program p100064-attack-f8: epoch seed 96bc342fb24875e10a17d093c27cdfe28c4293bfb4e0c96bc302de885e195a89 era seed a860aa82556a6f86d2b45818c33f274427428086c50c5d5b3f7101128c289bdf id 2442abf9d56f6611 attempt 2 class mx8-eraa210d1bd+sh256x27 op mix load=16 sub=9 add=7 xor=7 mul=5 rotl=5 mad=4 rotr=4 shfl=4 or=2 mulhi=1; era stride mul 0x82b69d5d rot 9 interleave [7, 8, 9, 12] windows 2:1:0 9:0:0 10:1:0 15:1:1 16:0:0 20:2:2 21:0:0 25:0:0 28:1:1 30:0:0 31:0:0 33:2:1 34:1:1 35:0:0 41:1:0 51:1:0
[2026-10-07T18:37:32Z] load site instr 2: src r5 win 1 off 0; last base writer rotl at 0; writers back to the last injecting one: rotl@0 xor@62; shadow writes of r5 per rep: add=9 mad=7 mul=1 mulhi=2 or=1 rotl=6 rotr=2 shfl=2 sub=3 xor=6
[2026-10-07T18:37:32Z] load site instr 9: src r1 win 0 off 0; last base writer load at 2; writers back to the last injecting one: load@2; shadow writes of r1 per rep: add=4 mad=2 mul=5 mulhi=1 or=3 rotr=4 shfl=4 sub=3 xor=1
[2026-10-07T18:37:32Z] load site instr 10: src r6 win 1 off 0; last base writer sub at 8; writers back to the last injecting one: sub@8; shadow writes of r6 per rep: add=8 mad=5 mul=2 mulhi=1 or=3 rotl=2 rotr=5 shfl=1 sub=2 xor=1
[2026-10-07T18:37:32Z] load site instr 15: src r6 win 1 off 1; last base writer shfl at 14; writers back to the last injecting one: shfl@14; shadow writes of r6 per rep: add=8 mad=5 mul=2 mulhi=1 or=3 rotl=2 rotr=5 shfl=1 sub=2 xor=1
[2026-10-07T18:37:32Z] load site instr 16: src r7 win 0 off 0; last base writer shfl at 13; writers back to the last injecting one: shfl@13; shadow writes of r7 per rep: add=7 mul=5 mulhi=1 rotl=2 rotr=7 shfl=5 sub=1 xor=4
[2026-10-07T18:37:32Z] load site instr 20: src r2 win 2 off 2; last base writer load at 16; writers back to the last injecting one: load@16; shadow writes of r2 per rep: add=6 mad=1 mul=2 mulhi=1 or=1 rotl=2 rotr=3 shfl=5 sub=5 xor=1
[2026-10-07T18:37:32Z] load site instr 21: src r6 win 0 off 0; last base writer load at 20; writers back to the last injecting one: load@20; shadow writes of r6 per rep: add=8 mad=5 mul=2 mulhi=1 or=3 rotl=2 rotr=5 shfl=1 sub=2 xor=1
[2026-10-07T18:37:32Z] load site instr 25: src r5 win 0 off 0; last base writer load at 10; writers back to the last injecting one: load@10; shadow writes of r5 per rep: add=9 mad=7 mul=1 mulhi=2 or=1 rotl=6 rotr=2 shfl=2 sub=3 xor=6
[2026-10-07T18:37:32Z] load site instr 28: src r2 win 1 off 1; last base writer xor at 26; writers back to the last injecting one: xor@26; shadow writes of r2 per rep: add=6 mad=1 mul=2 mulhi=1 or=1 rotl=2 rotr=3 shfl=5 sub=5 xor=1
[2026-10-07T18:37:32Z] load site instr 30: src r7 win 0 off 0; last base writer load at 28; writers back to the last injecting one: load@28; shadow writes of r7 per rep: add=7 mul=5 mulhi=1 rotl=2 rotr=7 shfl=5 sub=1 xor=4
[2026-10-07T18:37:32Z] load site instr 31: src r4 win 0 off 0; last base writer load at 25; writers back to the last injecting one: load@25; shadow writes of r4 per rep: add=6 mad=3 mul=2 mulhi=4 rotl=4 rotr=4 shfl=3 sub=6 xor=4
[2026-10-07T18:37:32Z] load site instr 33: src r0 win 2 off 1; last base writer mad at 27; writers back to the last injecting one: mad@27; shadow writes of r0 per rep: add=7 mad=1 mul=4 mulhi=2 or=2 rotl=2 rotr=4 shfl=2 sub=3 xor=2
[2026-10-07T18:37:32Z] load site instr 34: src r7 win 1 off 1; last base writer load at 33; writers back to the last injecting one: load@33; shadow writes of r7 per rep: add=7 mul=5 mulhi=1 rotl=2 rotr=7 shfl=5 sub=1 xor=4
[2026-10-07T18:37:32Z] load site instr 35: src r5 win 0 off 0; last base writer load at 34; writers back to the last injecting one: load@34; shadow writes of r5 per rep: add=9 mad=7 mul=1 mulhi=2 or=1 rotl=6 rotr=2 shfl=2 sub=3 xor=6
[2026-10-07T18:37:32Z] load site instr 41: src r2 win 1 off 0; last base writer add at 37; writers back to the last injecting one: add@37; shadow writes of r2 per rep: add=6 mad=1 mul=2 mulhi=1 or=1 rotl=2 rotr=3 shfl=5 sub=5 xor=1
[2026-10-07T18:37:32Z] load site instr 51: src r0 win 1 off 0; last base writer rotl at 46; writers back to the last injecting one: rotl@46 mad@27; shadow writes of r0 per rep: add=7 mad=1 mul=4 mulhi=2 or=2 rotl=2 rotr=4 shfl=2 sub=3 xor=2
[2026-10-07T18:37:32Z] window layer: site item windows (first, items) (0x0,2^23) (0x0,2^24) (0x0,2^23) (0x800000,2^23) (0x0,2^24) (0x800000,2^22) (0x0,2^24) (0x0,2^24) (0x800000,2^23) (0x0,2^24) (0x0,2^24) (0x400000,2^22) (0x800000,2^23) (0x0,2^24) (0x0,2^23) (0x0,2^23); expected reads per item by quarter 7.153 9.060 8.106 6.199 (flat uniform 7.629)
[2026-10-07T18:37:36Z] 31250 warps (1000000 nonces) interpreted in 3.7 s (3.777 ms per warp per thread); Epoch::hash_warp agreement on 95 warps: 0 mismatches
[2026-10-07T18:37:36Z] p100064-attack-f8 distinct lines per hash: n 1000000 min 1014 p1 1023 median 1024 p99 1024 max 1024 mean 1023.8712
[2026-10-07T18:37:36Z] p100064-attack-f8 distinct items per hash: n 1000000 min 127 p1 128 median 128 p99 128 max 128 mean 127.9995
[2026-10-07T18:37:36Z] p100064-attack-f8 distinct lines per warp: n 31250 min 32571 p1 32605 median 32637 p99 32664 max 32682 mean 32636.2260
[2026-10-07T18:37:36Z] p100064-attack-f8 distinct items per warp: n 31250 min 4090 p1 4093 median 4096 p99 4096 max 4096 mean 4095.4805
[2026-10-07T18:37:36Z] uniform expectation: distinct lines per hash 1023.875 of 1024 reads, per warp 32640.3 of 32768 reads (2^22 lines); distinct items per hash 127.9995 of 128, per warp 4095.50 of 4096 (2^24 items)
[2026-10-07T18:37:36Z] positions: largest hi16-bucket (256 items) share 0.0484% at p43 (iteration 2, site 11, instr 33); windowed expectation 0.0061%; largest saturated-source share 0.0000% at p0 (site 0, instr 2)
[2026-10-07T18:37:36Z] acceptance-style (2,048 evaluations, the rule's sample size): the most repeated address at one position 2 of 2048 at p5 (site 5, instr 20); saturated sources at one position 0 of 2048 at p0 (site 0, instr 2); uniform expectation: repeats 1 to 2, saturated 0
[2026-10-07T18:37:36Z] p100064-attack-f8 item histogram (flat): bins 16777216 reads 128000000 mean 7.629 sigma 2.762 max 54 (bin 4194344) z_max +16.79 min 0 z_min -2.76 chi2/dof 1.26520 chi2_z +768.11 top0.1% 0.29988% top0.5% 1.27974% top1% 2.37611%
[2026-10-07T18:37:36Z] p100064-attack-f8 item histogram against the window density: full 2^24 chi2/dof 1.10304 largest 54 (item 0x400028) at +14.93 sigma smallest at -3.01; buckets64 chi2/dof 7.60238 largest 2441 (bucket 65536) at +77.29 sigma smallest at -7.51
[2026-10-07T18:37:36Z] p100064-attack-f8 WINDOWED CONTROL item histogram (flat): bins 16777216 reads 128000000 mean 7.629 sigma 2.762 max 27 (bin 5834067) z_max +7.01 min 0 z_min -2.76 chi2/dof 1.14878 chi2_z +430.91 top0.1% 0.25551% top0.5% 1.15143% top1% 2.18725%
[2026-10-07T18:37:36Z] p100064-attack-f8 WINDOWED CONTROL against the window density: full chi2/dof 0.99986 largest +6.30 sigma; buckets64 chi2/dof 1.00273 largest +4.68 smallest -4.35
[2026-10-07T18:37:36Z] 6-sigma p100064-attack-f8 items buckets64 against the window density: largest bucket +77.29 sigma, smallest -7.51 -> FLAGGED (beyond 6 sigma)
[2026-10-07T18:37:36Z] hot-set p100064-attack-f8 items (windowed control): f 0.1% S_f 0.29988% E_f(control) 0.25551% X_f +0.04437% X_f/f +0.4437 -> no hot set
[2026-10-07T18:37:36Z] hot-set p100064-attack-f8 items (windowed control): f 0.5% S_f 1.27974% E_f(control) 1.15143% X_f +0.12831% X_f/f +0.2566 -> no hot set
[2026-10-07T18:37:36Z] hot-set p100064-attack-f8 items (windowed control): f 1.0% S_f 2.37611% E_f(control) 2.18725% X_f +0.18885% X_f/f +0.1889 -> no hot set
[2026-10-07T18:37:36Z] hot-set p100064-attack-f8 items (windowed control): verdict clear
[2026-10-07T18:37:37Z] p100064-attack-f8 FLAT CONTROL item histogram: bins 16777216 reads 128000000 mean 7.629 sigma 2.762 max 28 (bin 3756411) z_max +7.37 min 0 z_min -2.76 chi2/dof 1.00062 chi2_z +1.80 top0.1% 0.24291% top0.5% 1.09902% top1% 2.08725%
[2026-10-07T18:37:37Z] hot-set p100064-attack-f8 items (flat control, the auditor's first view): f 0.1% S_f 0.29988% E_f(control) 0.24291% X_f +0.05697% X_f/f +0.5697 -> no hot set
[2026-10-07T18:37:37Z] hot-set p100064-attack-f8 items (flat control, the auditor's first view): f 0.5% S_f 1.27974% E_f(control) 1.09902% X_f +0.18072% X_f/f +0.3614 -> no hot set
[2026-10-07T18:37:37Z] hot-set p100064-attack-f8 items (flat control, the auditor's first view): f 1.0% S_f 2.37611% E_f(control) 2.08725% X_f +0.28886% X_f/f +0.2889 -> no hot set
[2026-10-07T18:37:37Z] hot-set p100064-attack-f8 items (flat control, the auditor's first view): verdict clear
[2026-10-07T18:37:37Z] ratio p100064-attack-f8: top 0.1% / 0.5% / 1% share over the WINDOW-MODEL control 1.1737x / 1.1114x / 1.0863x (gate 1.2x at 0.1%: within); over the FLAT control 1.2346x / 1.1644x / 1.1384x
[2026-10-07T18:37:37Z] hottest item p100064-attack-f8 (0x400028): 54 reads (0.0000% of all); predicted source none
[2026-10-07T18:37:37Z] program p100064-attack-f8 DONE: 1000000 nonces; 6-sigma (windowed) FLAGGED; hot-set clear; verdict FLAGGED
[2026-10-07T18:37:37Z] attack-f8 0.1.0 (igneum-pow 4); args ["warps", "--program", "100767", "--nonces", "1000000", "--threads", "32", "--out", "/srv/builds/igneum-wt-adv-accept/adv/live", "--validate", "sample"]
[2026-10-07T18:37:37Z] census warps: programs [100767] day 20730 nonces 1000000 threads 32 plant none validate sample check_every 997 diag false
[2026-10-07T18:37:38Z] day 20730: cache filled in 0.65 s, fnv 448274a57f508cbc
[2026-10-07T18:37:40Z] table: 16777216 items derived with their 8 lines in 2.3 s; library comparison sample (0 mismatches)
[2026-10-07T18:37:45Z] program p100767-attack-f8: epoch seed 74484b391756fc49568cdd716bcfd839a55d31a45633c223c65c7f2ab4617fd4 era seed 7a65a05391dcd87b8fdaf7f74813aa17c6e13f7c56a03da2aaa6176987ef038b id 9d68e6286fc817d4 attempt 2 class mx8-era763e5847+sh256x27 op mix load=16 add=8 mad=6 mul=6 rotl=6 mulhi=5 xor=5 rotr=4 shfl=4 or=2 sub=2; era stride mul 0x54387173 rot 28 interleave [4, 11, 13, 15] windows 6:1:0 9:0:0 11:2:1 12:0:0 13:1:1 19:1:1 23:2:0 32:2:0 36:1:1 39:1:1 41:0:0 45:1:0 50:2:3 58:0:0 59:0:0 63:1:0
[2026-10-07T18:37:45Z] load site instr 6: src r6 win 1 off 0; last base writer mad at 4; writers back to the last injecting one: mad@4; shadow writes of r6 per rep: add=5 mad=7 mul=1 mulhi=1 rotl=3 rotr=2 shfl=3 sub=1 xor=6
[2026-10-07T18:37:45Z] load site instr 9: src r7 win 0 off 0; last base writer load at 6; writers back to the last injecting one: load@6; shadow writes of r7 per rep: add=5 mad=5 mul=4 mulhi=5 rotl=1 rotr=5 shfl=3 sub=4 xor=5
[2026-10-07T18:37:45Z] load site instr 11: src r5 win 2 off 1; last base writer xor at 5; writers back to the last injecting one: xor@5; shadow writes of r5 per rep: add=10 mul=5 mulhi=1 rotl=3 rotr=1 shfl=4 sub=3 xor=4
[2026-10-07T18:37:45Z] load site instr 12: src r3 win 0 off 0; last base writer load at 9; writers back to the last injecting one: load@9; shadow writes of r3 per rep: mad=6 mul=2 mulhi=4 or=1 rotl=4 rotr=2 xor=4
[2026-10-07T18:37:45Z] load site instr 13: src r2 win 1 off 1; last base writer load at 12; writers back to the last injecting one: load@12; shadow writes of r2 per rep: add=3 mad=2 mul=4 mulhi=2 or=6 rotl=1 rotr=1 shfl=5 sub=2 xor=4
[2026-10-07T18:37:45Z] load site instr 19: src r4 win 1 off 1; last base writer add at 7; writers back to the last injecting one: add@7; shadow writes of r4 per rep: add=5 mad=5 mul=4 mulhi=5 or=1 rotl=4 rotr=5 shfl=3 sub=5 xor=2
[2026-10-07T18:37:45Z] load site instr 23: src r6 win 2 off 0; last base writer mad at 22; writers back to the last injecting one: mad@22; shadow writes of r6 per rep: add=5 mad=7 mul=1 mulhi=1 rotl=3 rotr=2 shfl=3 sub=1 xor=6
[2026-10-07T18:37:45Z] load site instr 32: src r0 win 2 off 0; last base writer xor at 20; writers back to the last injecting one: xor@20; shadow writes of r0 per rep: add=7 mad=1 mul=3 mulhi=3 or=3 rotl=3 rotr=2 shfl=5 sub=2 xor=3
[2026-10-07T18:37:45Z] load site instr 36: src r7 win 1 off 1; last base writer rotr at 31; writers back to the last injecting one: rotr@31 load@6; shadow writes of r7 per rep: add=5 mad=5 mul=4 mulhi=5 rotl=1 rotr=5 shfl=3 sub=4 xor=5
[2026-10-07T18:37:45Z] load site instr 39: src r7 win 1 off 1; last base writer rotl at 38; writers back to the last injecting one: rotl@38 add@37; shadow writes of r7 per rep: add=5 mad=5 mul=4 mulhi=5 rotl=1 rotr=5 shfl=3 sub=4 xor=5
[2026-10-07T18:37:45Z] load site instr 41: src r4 win 0 off 0; last base writer rotl at 40; writers back to the last injecting one: rotl@40 load@32; shadow writes of r4 per rep: add=5 mad=5 mul=4 mulhi=5 or=1 rotl=4 rotr=5 shfl=3 sub=5 xor=2
[2026-10-07T18:37:45Z] load site instr 45: src r5 win 1 off 0; last base writer rotr at 27; writers back to the last injecting one: rotr@27 shfl@24; shadow writes of r5 per rep: add=10 mul=5 mulhi=1 rotl=3 rotr=1 shfl=4 sub=3 xor=4
[2026-10-07T18:37:45Z] load site instr 50: src r7 win 2 off 3; last base writer load at 45; writers back to the last injecting one: load@45; shadow writes of r7 per rep: add=5 mad=5 mul=4 mulhi=5 rotl=1 rotr=5 shfl=3 sub=4 xor=5
[2026-10-07T18:37:45Z] load site instr 58: src r3 win 0 off 0; last base writer load at 50; writers back to the last injecting one: load@50; shadow writes of r3 per rep: mad=6 mul=2 mulhi=4 or=1 rotl=4 rotr=2 xor=4
[2026-10-07T18:37:45Z] load site instr 59: src r2 win 0 off 0; last base writer xor at 46; writers back to the last injecting one: xor@46; shadow writes of r2 per rep: add=3 mad=2 mul=4 mulhi=2 or=6 rotl=1 rotr=1 shfl=5 sub=2 xor=4
[2026-10-07T18:37:45Z] load site instr 63: src r1 win 1 off 0; last base writer rotr at 62; writers back to the last injecting one: rotr@62 add@56; shadow writes of r1 per rep: add=5 mad=4 mul=6 mulhi=3 or=2 rotl=2 rotr=3 shfl=5 sub=3 xor=2
[2026-10-07T18:37:45Z] window layer: site item windows (first, items) (0x0,2^23) (0x0,2^24) (0x400000,2^22) (0x0,2^24) (0x800000,2^23) (0x800000,2^23) (0x0,2^22) (0x0,2^22) (0x800000,2^23) (0x800000,2^23) (0x0,2^24) (0x0,2^23) (0xc00000,2^22) (0x0,2^24) (0x0,2^24) (0x0,2^23); expected reads per item by quarter 9.060 7.153 6.199 8.106 (flat uniform 7.629)
[2026-10-07T18:37:49Z] 31250 warps (1000000 nonces) interpreted in 4.2 s (4.322 ms per warp per thread); Epoch::hash_warp agreement on 95 warps: 0 mismatches
[2026-10-07T18:37:49Z] p100767-attack-f8 distinct lines per hash: n 1000000 min 976 p1 1008 median 1024 p99 1024 max 1024 mean 1021.6579
[2026-10-07T18:37:49Z] p100767-attack-f8 distinct items per hash: n 1000000 min 122 p1 126 median 128 p99 128 max 128 mean 127.7228
[2026-10-07T18:37:49Z] p100767-attack-f8 distinct lines per warp: n 31250 min 32426 p1 32500 median 32567 p99 32622 max 32658 mean 32565.9023
[2026-10-07T18:37:49Z] p100767-attack-f8 distinct items per warp: n 31250 min 4070 p1 4079 median 4087 p99 4093 max 4096 mean 4086.6272
[2026-10-07T18:37:49Z] uniform expectation: distinct lines per hash 1023.875 of 1024 reads, per warp 32640.3 of 32768 reads (2^22 lines); distinct items per hash 127.9995 of 128, per warp 4095.50 of 4096 (2^24 items)
[2026-10-07T18:37:49Z] positions: largest hi16-bucket (256 items) share 0.0283% at p22 (iteration 1, site 6, instr 23); windowed expectation 0.0061%; largest saturated-source share 0.0130% at p22 (site 6, instr 23)
[2026-10-07T18:37:49Z] acceptance-style (2,048 evaluations, the rule's sample size): the most repeated address at one position 2 of 2048 at p118 (site 6, instr 23); saturated sources at one position 1 of 2048 at p102 (site 6, instr 23); uniform expectation: repeats 1 to 2, saturated 0
[2026-10-07T18:37:49Z] p100767-attack-f8 item histogram (flat): bins 16777216 reads 128000000 mean 7.629 sigma 2.762 max 1677 (bin 0) z_max +604.38 min 0 z_min -2.76 chi2/dof 1.24228 chi2_z +701.71 top0.1% 0.34274% top0.5% 1.26980% top1% 2.32590%
[2026-10-07T18:37:49Z] p100767-attack-f8 item histogram against the window density: full 2^24 chi2/dof 1.07966 largest 1677 (item 0x0) at +554.14 sigma smallest at -3.01; buckets64 chi2/dof 1.05456 largest 2217 (bucket 0) at +67.99 sigma smallest at -4.21
[2026-10-07T18:37:50Z] p100767-attack-f8 WINDOWED CONTROL item histogram (flat): bins 16777216 reads 128000000 mean 7.629 sigma 2.762 max 27 (bin 919726) z_max +7.01 min 0 z_min -2.76 chi2/dof 1.14901 chi2_z +431.58 top0.1% 0.25578% top0.5% 1.15209% top1% 2.18797%
[2026-10-07T18:37:50Z] p100767-attack-f8 WINDOWED CONTROL against the window density: full chi2/dof 1.00017 largest +6.64 sigma; buckets64 chi2/dof 0.99639 largest +4.40 smallest -4.40
[2026-10-07T18:37:50Z] 6-sigma p100767-attack-f8 items buckets64 against the window density: largest bucket +67.99 sigma, smallest -4.21 -> FLAGGED (beyond 6 sigma)
[2026-10-07T18:37:50Z] hot-set p100767-attack-f8 items (windowed control): f 0.1% S_f 0.34274% E_f(control) 0.25578% X_f +0.08696% X_f/f +0.8696 -> no hot set
[2026-10-07T18:37:50Z] hot-set p100767-attack-f8 items (windowed control): f 0.5% S_f 1.26980% E_f(control) 1.15209% X_f +0.11771% X_f/f +0.2354 -> no hot set
[2026-10-07T18:37:50Z] hot-set p100767-attack-f8 items (windowed control): f 1.0% S_f 2.32590% E_f(control) 2.18797% X_f +0.13793% X_f/f +0.1379 -> no hot set
[2026-10-07T18:37:50Z] hot-set p100767-attack-f8 items (windowed control): verdict clear
[2026-10-07T18:37:50Z] p100767-attack-f8 FLAT CONTROL item histogram: bins 16777216 reads 128000000 mean 7.629 sigma 2.762 max 26 (bin 10438708) z_max +6.65 min 0 z_min -2.76 chi2/dof 0.99974 chi2_z -0.75 top0.1% 0.24260% top0.5% 1.09881% top1% 2.08683%
[2026-10-07T18:37:50Z] hot-set p100767-attack-f8 items (flat control, the auditor's first view): f 0.1% S_f 0.34274% E_f(control) 0.24260% X_f +0.10014% X_f/f +1.0014 -> HOT SET
[2026-10-07T18:37:50Z] hot-set p100767-attack-f8 items (flat control, the auditor's first view): f 0.5% S_f 1.26980% E_f(control) 1.09881% X_f +0.17099% X_f/f +0.3420 -> no hot set
[2026-10-07T18:37:50Z] hot-set p100767-attack-f8 items (flat control, the auditor's first view): f 1.0% S_f 2.32590% E_f(control) 2.08683% X_f +0.23907% X_f/f +0.2391 -> no hot set
[2026-10-07T18:37:50Z] hot-set p100767-attack-f8 items (flat control, the auditor's first view): verdict FLAGGED
[2026-10-07T18:37:50Z] ratio p100767-attack-f8: top 0.1% / 0.5% / 1% share over the WINDOW-MODEL control 1.3400x / 1.1022x / 1.0630x (gate 1.2x at 0.1%: BEYOND); over the FLAT control 1.4128x / 1.1556x / 1.1146x
[2026-10-07T18:37:50Z] hottest item p100767-attack-f8 (0x000000): 1677 reads (0.0013% of all); predicted source site-instr6:r6:zero:last-writer-mad@4
[2026-10-07T18:37:50Z] program p100767-attack-f8 DONE: 1000000 nonces; 6-sigma (windowed) FLAGGED; hot-set clear; verdict FLAGGED
[2026-10-07T18:37:51Z] attack-f8 0.1.0 (igneum-pow 4); args ["warps", "--program", "100159", "--nonces", "1000000", "--threads", "32", "--out", "/srv/builds/igneum-wt-adv-accept/adv/live", "--validate", "sample"]
[2026-10-07T18:37:51Z] census warps: programs [100159] day 20730 nonces 1000000 threads 32 plant none validate sample check_every 997 diag false
[2026-10-07T18:37:51Z] day 20730: cache filled in 0.65 s, fnv 448274a57f508cbc
[2026-10-07T18:37:54Z] table: 16777216 items derived with their 8 lines in 2.8 s; library comparison sample (0 mismatches)
[2026-10-07T18:37:59Z] program p100159-attack-f8: epoch seed 1d76edc78af5ddea74900f1e005f77ef1b115c69c583ea6f57792e386806aede era seed b659277d9635ccc59ea759fd747241f440d5dc89947f629a2473ccef349c869b id 573d650159a8b04e attempt 3 class mx8-era9e0e4f28+sh256x27 op mix load=16 mulhi=7 xor=7 mul=6 add=5 mad=5 rotl=4 shfl=4 sub=4 or=3 rotr=3; era stride mul 0xa39d49c9 rot 7 interleave [3, 8, 9, 10] windows 5:2:0 10:0:0 16:2:3 17:2:2 23:2:2 26:2:2 40:0:0 42:2:3 45:1:0 47:2:3 49:2:2 56:0:0 59:2:0 60:2:3 61:0:0 62:0:0
[2026-10-07T18:37:59Z] load site instr 5: src r4 win 2 off 0; last base writer shfl at 0; writers back to the last injecting one: shfl@0; shadow writes of r4 per rep: add=5 mad=3 mul=1 mulhi=1 or=2 rotl=3 rotr=2 shfl=4 sub=1 xor=5
[2026-10-07T18:37:59Z] load site instr 10: src r7 win 0 off 0; last base writer add at 6; writers back to the last injecting one: add@6; shadow writes of r7 per rep: add=9 mad=2 mul=1 mulhi=1 or=2 rotl=3 shfl=4 sub=2 xor=9
[2026-10-07T18:37:59Z] load site instr 16: src r5 win 2 off 3; last base writer xor at 9; writers back to the last injecting one: xor@9; shadow writes of r5 per rep: add=1 mad=4 mul=3 mulhi=1 or=2 rotl=4 rotr=1 shfl=6 sub=1 xor=5
[2026-10-07T18:37:59Z] load site instr 17: src r1 win 2 off 2; last base writer load at 10; writers back to the last injecting one: load@10; shadow writes of r1 per rep: add=3 mad=6 mul=4 mulhi=3 or=4 rotl=3 rotr=4 shfl=3 sub=2 xor=6
[2026-10-07T18:37:59Z] load site instr 23: src r7 win 2 off 2; last base writer load at 16; writers back to the last injecting one: load@16; shadow writes of r7 per rep: add=9 mad=2 mul=1 mulhi=1 or=2 rotl=3 shfl=4 sub=2 xor=9
[2026-10-07T18:37:59Z] load site instr 26: src r5 win 2 off 2; last base writer xor at 25; writers back to the last injecting one: xor@25; shadow writes of r5 per rep: add=1 mad=4 mul=3 mulhi=1 or=2 rotl=4 rotr=1 shfl=6 sub=1 xor=5
[2026-10-07T18:37:59Z] load site instr 40: src r1 win 0 off 0; last base writer shfl at 30; writers back to the last injecting one: shfl@30; shadow writes of r1 per rep: add=3 mad=6 mul=4 mulhi=3 or=4 rotl=3 rotr=4 shfl=3 sub=2 xor=6
[2026-10-07T18:37:59Z] load site instr 42: src r5 win 2 off 3; last base writer mad at 33; writers back to the last injecting one: mad@33; shadow writes of r5 per rep: add=1 mad=4 mul=3 mulhi=1 or=2 rotl=4 rotr=1 shfl=6 sub=1 xor=5
[2026-10-07T18:37:59Z] load site instr 45: src r7 win 1 off 0; last base writer add at 44; writers back to the last injecting one: add@44; shadow writes of r7 per rep: add=9 mad=2 mul=1 mulhi=1 or=2 rotl=3 shfl=4 sub=2 xor=9
[2026-10-07T18:37:59Z] load site instr 47: src r2 win 2 off 3; last base writer load at 45; writers back to the last injecting one: load@45; shadow writes of r2 per rep: add=9 mad=4 mul=3 mulhi=2 or=2 rotl=2 rotr=1 shfl=2 sub=2 xor=4
[2026-10-07T18:37:59Z] load site instr 49: src r5 win 2 off 2; last base writer load at 47; writers back to the last injecting one: load@47; shadow writes of r5 per rep: add=1 mad=4 mul=3 mulhi=1 or=2 rotl=4 rotr=1 shfl=6 sub=1 xor=5
[2026-10-07T18:37:59Z] load site instr 56: src r1 win 0 off 0; last base writer mad at 51; writers back to the last injecting one: mad@51; shadow writes of r1 per rep: add=3 mad=6 mul=4 mulhi=3 or=4 rotl=3 rotr=4 shfl=3 sub=2 xor=6
[2026-10-07T18:37:59Z] load site instr 59: src r7 win 2 off 0; last base writer add at 50; writers back to the last injecting one: add@50; shadow writes of r7 per rep: add=9 mad=2 mul=1 mulhi=1 or=2 rotl=3 shfl=4 sub=2 xor=9
[2026-10-07T18:37:59Z] load site instr 60: src r2 win 2 off 3; last base writer rotr at 54; writers back to the last injecting one: rotr@54 load@45; shadow writes of r2 per rep: add=9 mad=4 mul=3 mulhi=2 or=2 rotl=2 rotr=1 shfl=2 sub=2 xor=4
[2026-10-07T18:37:59Z] load site instr 61: src r6 win 0 off 0; last base writer load at 56; writers back to the last injecting one: load@56; shadow writes of r6 per rep: add=4 mad=3 mul=1 mulhi=4 rotl=1 rotr=2 shfl=2 sub=3 xor=8
[2026-10-07T18:37:59Z] load site instr 62: src r5 win 0 off 0; last base writer load at 60; writers back to the last injecting one: load@60; shadow writes of r5 per rep: add=1 mad=4 mul=3 mulhi=1 or=2 rotl=4 rotr=1 shfl=6 sub=1 xor=5
[2026-10-07T18:37:59Z] window layer: site item windows (first, items) (0x0,2^22) (0x0,2^24) (0xc00000,2^22) (0x800000,2^22) (0x800000,2^22) (0x800000,2^22) (0x0,2^24) (0xc00000,2^22) (0x0,2^23) (0xc00000,2^22) (0x800000,2^22) (0x0,2^24) (0x0,2^22) (0xc00000,2^22) (0x0,2^24) (0x0,2^24); expected reads per item by quarter 7.153 3.338 10.014 10.014 (flat uniform 7.629)
[2026-10-07T18:38:02Z] 31250 warps (1000000 nonces) interpreted in 3.8 s (3.873 ms per warp per thread); Epoch::hash_warp agreement on 95 warps: 0 mismatches
[2026-10-07T18:38:02Z] p100159-attack-f8 distinct lines per hash: n 1000000 min 976 p1 1000 median 1023 p99 1024 max 1024 mean 1019.4789
[2026-10-07T18:38:02Z] p100159-attack-f8 distinct items per hash: n 1000000 min 122 p1 125 median 128 p99 128 max 128 mean 127.4503
[2026-10-07T18:38:02Z] p100159-attack-f8 distinct lines per warp: n 31250 min 32340 p1 32411 median 32497 p99 32571 max 32616 mean 32496.3442
[2026-10-07T18:38:02Z] p100159-attack-f8 distinct items per warp: n 31250 min 4059 p1 4068 median 4078 p99 4087 max 4091 mean 4077.8626
[2026-10-07T18:38:02Z] uniform expectation: distinct lines per hash 1023.875 of 1024 reads, per warp 32640.3 of 32768 reads (2^22 lines); distinct items per hash 127.9995 of 128, per warp 4095.50 of 4096 (2^24 items)
[2026-10-07T18:38:02Z] positions: largest hi16-bucket (256 items) share 0.0179% at p23 (iteration 1, site 7, instr 42); windowed expectation 0.0061%; largest saturated-source share 0.0000% at p0 (site 0, instr 5)
[2026-10-07T18:38:02Z] acceptance-style (2,048 evaluations, the rule's sample size): the most repeated address at one position 2 of 2048 at p9 (site 9, instr 47); saturated sources at one position 0 of 2048 at p0 (site 0, instr 5); uniform expectation: repeats 1 to 2, saturated 0
[2026-10-07T18:38:03Z] p100159-attack-f8 item histogram (flat): bins 16777216 reads 128000000 mean 7.629 sigma 2.762 max 37 (bin 12582926) z_max +10.63 min 0 z_min -2.76 chi2/dof 2.09764 chi2_z +3179.10 top0.1% 0.30020% top0.5% 1.34002% top1% 2.53830%
[2026-10-07T18:38:03Z] p100159-attack-f8 item histogram against the window density: full 2^24 chi2/dof 1.08732 largest 37 (item 0xc0000e) at +8.53 sigma smallest at -3.16; buckets64 chi2/dof 6.13245 largest 1589 (bucket 196608) at +37.45 sigma smallest at -7.46
[2026-10-07T18:38:04Z] p100159-attack-f8 WINDOWED CONTROL item histogram (flat): bins 16777216 reads 128000000 mean 7.629 sigma 2.762 max 30 (bin 9414155) z_max +8.10 min 0 z_min -2.76 chi2/dof 1.98344 chi2_z +2848.35 top0.1% 0.28063% top0.5% 1.26922% top1% 2.41408%
[2026-10-07T18:38:04Z] p100159-attack-f8 WINDOWED CONTROL against the window density: full chi2/dof 0.99980 largest +6.38 sigma; buckets64 chi2/dof 0.99973 largest +4.54 smallest -4.49
[2026-10-07T18:38:04Z] 6-sigma p100159-attack-f8 items buckets64 against the window density: largest bucket +37.45 sigma, smallest -7.46 -> FLAGGED (beyond 6 sigma)
[2026-10-07T18:38:04Z] hot-set p100159-attack-f8 items (windowed control): f 0.1% S_f 0.30020% E_f(control) 0.28063% X_f +0.01957% X_f/f +0.1957 -> no hot set
[2026-10-07T18:38:04Z] hot-set p100159-attack-f8 items (windowed control): f 0.5% S_f 1.34002% E_f(control) 1.26922% X_f +0.07081% X_f/f +0.1416 -> no hot set
[2026-10-07T18:38:04Z] hot-set p100159-attack-f8 items (windowed control): f 1.0% S_f 2.53830% E_f(control) 2.41408% X_f +0.12422% X_f/f +0.1242 -> no hot set
[2026-10-07T18:38:04Z] hot-set p100159-attack-f8 items (windowed control): verdict clear
[2026-10-07T18:38:04Z] p100159-attack-f8 FLAT CONTROL item histogram: bins 16777216 reads 128000000 mean 7.629 sigma 2.762 max 26 (bin 8617755) z_max +6.65 min 0 z_min -2.76 chi2/dof 0.99990 chi2_z -0.30 top0.1% 0.24308% top0.5% 1.09931% top1% 2.08730%
[2026-10-07T18:38:04Z] hot-set p100159-attack-f8 items (flat control, the auditor's first view): f 0.1% S_f 0.30020% E_f(control) 0.24308% X_f +0.05712% X_f/f +0.5712 -> no hot set
[2026-10-07T18:38:04Z] hot-set p100159-attack-f8 items (flat control, the auditor's first view): f 0.5% S_f 1.34002% E_f(control) 1.09931% X_f +0.24071% X_f/f +0.4814 -> no hot set
[2026-10-07T18:38:04Z] hot-set p100159-attack-f8 items (flat control, the auditor's first view): f 1.0% S_f 2.53830% E_f(control) 2.08730% X_f +0.45100% X_f/f +0.4510 -> no hot set
[2026-10-07T18:38:04Z] hot-set p100159-attack-f8 items (flat control, the auditor's first view): verdict clear
[2026-10-07T18:38:04Z] ratio p100159-attack-f8: top 0.1% / 0.5% / 1% share over the WINDOW-MODEL control 1.0697x / 1.0558x / 1.0515x (gate 1.2x at 0.1%: within); over the FLAT control 1.2350x / 1.2190x / 1.2161x
[2026-10-07T18:38:04Z] hottest item p100159-attack-f8 (0xc0000e): 37 reads (0.0000% of all); predicted source none
[2026-10-07T18:38:04Z] program p100159-attack-f8 DONE: 1000000 nonces; 6-sigma (windowed) FLAGGED; hot-set clear; verdict FLAGGED

View file

@ -0,0 +1,47 @@
[2026-10-07T18:30:08Z] attack-f8 0.1.0 (igneum-pow 4); args ["warps", "--program", "2", "--nonces", "1000000", "--threads", "32", "--out", "/srv/builds/igneum-wt-adv-accept/adv/live", "--plant", "const-item", "--validate", "sample"]
[2026-10-07T18:30:08Z] census warps: programs [2] day 20730 nonces 1000000 threads 32 plant const-item validate sample check_every 997 diag false
[2026-10-07T18:30:24Z] day 20730: cache filled in 15.39 s, fnv 448274a57f508cbc
[2026-10-07T18:30:25Z] table: 16777216 items derived with their 8 lines in 1.2 s; library comparison skipped under the plant (0 mismatches)
[2026-10-07T18:30:30Z] program p2-attack-f8: epoch seed 59cef1aaa406506685f4355933868219bedece8dbd4e84c281724db9313bfdfa era seed 9cba001faa1e017235841c72f560ebd1b93f6d7aea5f9a598f7d3080e8a11f69 id 8a0047b2eb071ade attempt 5 class mx8-era35d128b9+sh256x27 op mix load=16 mul=8 add=6 mulhi=6 shfl=6 mad=4 or=4 rotl=4 rotr=4 xor=4 sub=2; era stride mul 0xbf0fab63 rot 4 interleave [2, 3, 7, 15] windows 2:2:0 3:0:0 7:0:0 9:0:0 13:2:1 17:1:1 21:2:0 22:1:0 23:0:0 27:1:0 30:2:2 40:1:0 44:2:1 55:0:0 62:0:0 63:2:0
[2026-10-07T18:30:30Z] load site instr 2: src r1 win 2 off 0; last base writer add at 1; writers back to the last injecting one: add@1; shadow writes of r1 per rep: add=7 mad=6 mul=4 mulhi=6 or=1 rotl=3 rotr=6 shfl=1 sub=2 xor=4
[2026-10-07T18:30:30Z] load site instr 3: src r5 win 0 off 0; last base writer mad at 0; writers back to the last injecting one: mad@0; shadow writes of r5 per rep: add=3 mad=4 mul=5 or=5 rotl=1 rotr=4 shfl=4 sub=3 xor=3
[2026-10-07T18:30:30Z] load site instr 7: src r1 win 0 off 0; last base writer shfl at 5; writers back to the last injecting one: shfl@5; shadow writes of r1 per rep: add=7 mad=6 mul=4 mulhi=6 or=1 rotl=3 rotr=6 shfl=1 sub=2 xor=4
[2026-10-07T18:30:30Z] load site instr 9: src r3 win 0 off 0; last base writer add at 6; writers back to the last injecting one: add@6; shadow writes of r3 per rep: add=4 mad=3 mul=1 mulhi=2 rotl=1 rotr=2 shfl=3 sub=3 xor=3
[2026-10-07T18:30:30Z] load site instr 13: src r0 win 2 off 1; last base writer xor at 12; writers back to the last injecting one: xor@12; shadow writes of r0 per rep: add=5 mad=6 mul=1 mulhi=3 or=1 rotl=1 rotr=7 shfl=8 sub=2
[2026-10-07T18:30:30Z] load site instr 17: src r5 win 1 off 1; last base writer xor at 14; writers back to the last injecting one: xor@14; shadow writes of r5 per rep: add=3 mad=4 mul=5 or=5 rotl=1 rotr=4 shfl=4 sub=3 xor=3
[2026-10-07T18:30:30Z] load site instr 21: src r4 win 2 off 0; last base writer shfl at 15; writers back to the last injecting one: shfl@15; shadow writes of r4 per rep: add=4 mad=4 mulhi=1 or=1 rotl=4 rotr=1 shfl=2 sub=8 xor=6
[2026-10-07T18:30:30Z] load site instr 22: src r5 win 1 off 0; last base writer add at 20; writers back to the last injecting one: add@20; shadow writes of r5 per rep: add=3 mad=4 mul=5 or=5 rotl=1 rotr=4 shfl=4 sub=3 xor=3
[2026-10-07T18:30:30Z] load site instr 23: src r1 win 0 off 0; last base writer load at 13; writers back to the last injecting one: load@13; shadow writes of r1 per rep: add=7 mad=6 mul=4 mulhi=6 or=1 rotl=3 rotr=6 shfl=1 sub=2 xor=4
[2026-10-07T18:30:30Z] load site instr 27: src r2 win 1 off 0; last base writer xor at 26; writers back to the last injecting one: xor@26; shadow writes of r2 per rep: add=6 mad=2 mul=4 mulhi=3 or=3 rotl=5 rotr=3 shfl=3 sub=3 xor=6
[2026-10-07T18:30:30Z] load site instr 30: src r2 win 2 off 2; last base writer rotr at 29; writers back to the last injecting one: rotr@29 xor@26; shadow writes of r2 per rep: add=6 mad=2 mul=4 mulhi=3 or=3 rotl=5 rotr=3 shfl=3 sub=3 xor=6
[2026-10-07T18:30:30Z] load site instr 40: src r1 win 1 off 0; last base writer rotl at 32; writers back to the last injecting one: rotl@32 rotl@31 load@30; shadow writes of r1 per rep: add=7 mad=6 mul=4 mulhi=6 or=1 rotl=3 rotr=6 shfl=1 sub=2 xor=4
[2026-10-07T18:30:30Z] load site instr 44: src r4 win 2 off 1; last base writer load at 27; writers back to the last injecting one: load@27; shadow writes of r4 per rep: add=4 mad=4 mulhi=1 or=1 rotl=4 rotr=1 shfl=2 sub=8 xor=6
[2026-10-07T18:30:30Z] load site instr 55: src r4 win 0 off 0; last base writer mad at 51; writers back to the last injecting one: mad@51; shadow writes of r4 per rep: add=4 mad=4 mulhi=1 or=1 rotl=4 rotr=1 shfl=2 sub=8 xor=6
[2026-10-07T18:30:30Z] load site instr 62: src r0 win 0 off 0; last base writer add at 53; writers back to the last injecting one: add@53; shadow writes of r0 per rep: add=5 mad=6 mul=1 mulhi=3 or=1 rotl=1 rotr=7 shfl=8 sub=2
[2026-10-07T18:30:30Z] load site instr 63: src r1 win 2 off 0; last base writer load at 62; writers back to the last injecting one: load@62; shadow writes of r1 per rep: add=7 mad=6 mul=4 mulhi=6 or=1 rotl=3 rotr=6 shfl=1 sub=2 xor=4
[2026-10-07T18:30:30Z] window layer: site item windows (first, items) (0x0,2^22) (0x0,2^24) (0x0,2^24) (0x0,2^24) (0x400000,2^22) (0x800000,2^23) (0x0,2^22) (0x0,2^23) (0x0,2^24) (0x0,2^23) (0x800000,2^22) (0x0,2^23) (0x400000,2^22) (0x0,2^24) (0x0,2^24) (0x0,2^22); expected reads per item by quarter 11.444 9.537 5.722 3.815 (flat uniform 7.629)
[2026-10-07T18:30:34Z] 31250 warps (1000000 nonces) interpreted in 3.7 s (3.754 ms per warp per thread); Epoch::hash_warp agreement on 0 warps: 0 mismatches (library comparison skipped under the plant)
[2026-10-07T18:30:34Z] p2-attack-f8 distinct lines per hash: n 1000000 min 952 p1 967 median 968 p99 968 max 968 mean 967.8845
[2026-10-07T18:30:34Z] p2-attack-f8 distinct items per hash: n 1000000 min 119 p1 121 median 121 p99 121 max 121 mean 120.9995
[2026-10-07T18:30:34Z] p2-attack-f8 distinct lines per warp: n 31250 min 30551 p1 30582 median 30612 p99 30637 max 30661 mean 30611.6212
[2026-10-07T18:30:34Z] p2-attack-f8 distinct items per warp: n 31250 min 3835 p1 3838 median 3841 p99 3841 max 3841 mean 3840.5035
[2026-10-07T18:30:34Z] uniform expectation: distinct lines per hash 1023.875 of 1024 reads, per warp 32640.3 of 32768 reads (2^22 lines); distinct items per hash 127.9995 of 128, per warp 4095.50 of 4096 (2^24 items)
[2026-10-07T18:30:34Z] positions: largest hi16-bucket (256 items) share 100.0000% at p0 (iteration 0, site 0, instr 2); windowed expectation 0.0061%; largest saturated-source share 0.0000% at p0 (site 0, instr 2)
[2026-10-07T18:30:34Z] acceptance-style (2,048 evaluations, the rule's sample size): the most repeated address at one position 1 of 2048 at p0 (site 0, instr 2); saturated sources at one position 0 of 2048 at p0 (site 0, instr 2); uniform expectation: repeats 1 to 2, saturated 0
[2026-10-07T18:30:34Z] p2-attack-f8 item histogram (flat): bins 16777216 reads 128000000 mean 7.629 sigma 2.762 max 8000007 (bin 4660) z_max +2896309.15 min 0 z_min -2.76 chi2/dof 500001.72317 chi2_z +1448156739.23 top0.1% 6.52236% top0.5% 7.47807% top1% 8.58175%
[2026-10-07T18:30:34Z] p2-attack-f8 item histogram against the window density: full 2^24 chi2/dof 333334.02123 largest 8000007 (item 0x1234) at +2364825.39 sigma smallest at -3.38; buckets64 chi2/dof 333328.12062 largest 8000582 (bucket 72) at +295597.78 sigma smallest at -7.96
[2026-10-07T18:30:34Z] p2-attack-f8 WINDOWED CONTROL item histogram (flat): bins 16777216 reads 128000000 mean 7.629 sigma 2.762 max 37 (bin 3356675) z_max +10.63 min 0 z_min -2.76 chi2/dof 2.19210 chi2_z +3452.68 top0.1% 0.29918% top0.5% 1.34673% top1% 2.55749%
[2026-10-07T18:30:34Z] p2-attack-f8 WINDOWED CONTROL against the window density: full chi2/dof 0.99966 largest +7.55 sigma; buckets64 chi2/dof 1.00387 largest +4.49 smallest -4.89
[2026-10-07T18:30:34Z] 6-sigma p2-attack-f8 items buckets64 against the window density: largest bucket +295597.78 sigma, smallest -7.96 -> FLAGGED (beyond 6 sigma)
[2026-10-07T18:30:34Z] hot-set p2-attack-f8 items (windowed control): f 0.1% S_f 6.52236% E_f(control) 0.29918% X_f +6.22317% X_f/f +62.2317 -> HOT SET
[2026-10-07T18:30:34Z] hot-set p2-attack-f8 items (windowed control): f 0.5% S_f 7.47807% E_f(control) 1.34673% X_f +6.13134% X_f/f +12.2627 -> HOT SET
[2026-10-07T18:30:34Z] hot-set p2-attack-f8 items (windowed control): f 1.0% S_f 8.58175% E_f(control) 2.55749% X_f +6.02426% X_f/f +6.0243 -> HOT SET
[2026-10-07T18:30:34Z] hot-set p2-attack-f8 items (windowed control): verdict FLAGGED
[2026-10-07T18:30:35Z] p2-attack-f8 FLAT CONTROL item histogram: bins 16777216 reads 128000000 mean 7.629 sigma 2.762 max 28 (bin 13310856) z_max +7.37 min 0 z_min -2.76 chi2/dof 0.99990 chi2_z -0.29 top0.1% 0.24291% top0.5% 1.09940% top1% 2.08772%
[2026-10-07T18:30:35Z] hot-set p2-attack-f8 items (flat control, the auditor's first view): f 0.1% S_f 6.52236% E_f(control) 0.24291% X_f +6.27945% X_f/f +62.7945 -> HOT SET
[2026-10-07T18:30:35Z] hot-set p2-attack-f8 items (flat control, the auditor's first view): f 0.5% S_f 7.47807% E_f(control) 1.09940% X_f +6.37867% X_f/f +12.7573 -> HOT SET
[2026-10-07T18:30:35Z] hot-set p2-attack-f8 items (flat control, the auditor's first view): f 1.0% S_f 8.58175% E_f(control) 2.08772% X_f +6.49402% X_f/f +6.4940 -> HOT SET
[2026-10-07T18:30:35Z] hot-set p2-attack-f8 items (flat control, the auditor's first view): verdict FLAGGED
[2026-10-07T18:30:35Z] ratio p2-attack-f8: top 0.1% / 0.5% / 1% share over the WINDOW-MODEL control 21.8005x / 5.5528x / 3.3555x (gate 1.2x at 0.1%: BEYOND); over the FLAT control 26.8510x / 6.8020x / 4.1106x
[2026-10-07T18:30:35Z] hottest item p2-attack-f8 (0x001234): 8000007 reads (6.2500% of all); predicted source none
[2026-10-07T18:30:35Z] program p2-attack-f8 DONE: 1000000 nonces; 6-sigma (windowed) FLAGGED; hot-set FLAGGED; verdict FLAGGED

View file

@ -0,0 +1,846 @@
[2026-10-07T18:53:21Z] attack-f8 0.1.0 (igneum-pow 4); args ["warps", "--program", "4107", "--nonces", "16777216", "--threads", "32", "--out", "/srv/builds/_adv-adv-accept/live", "--validate", "sample"]
[2026-10-07T18:53:21Z] census warps: programs [4107] day 20730 nonces 16777216 threads 32 plant none validate sample check_every 997 diag false
[2026-10-07T18:53:21Z] day 20730: cache filled in 0.61 s, fnv 448274a57f508cbc
[2026-10-07T18:53:27Z] table: 16777216 items derived with their 8 lines in 5.2 s; library comparison sample (0 mismatches)
[2026-10-07T18:53:31Z] program p4107-attack-f8: epoch seed 2cdb9fc575c38113dd8acb28910b877073ea6ceebade8b08e2692e82a3c4a6ee era seed 9f8fe375faa38b7226a477a0d500c08fe91ebaa1f88d744e5a12a1b1ed3f9092 id b0a3bd259ea8ef1c attempt 0 class mx8-eracd8e7786+sh256x27 op mix load=16 xor=10 add=7 mad=7 shfl=5 mul=4 mulhi=4 rotl=4 rotr=3 sub=3 or=1; era stride mul 0xde72f0fd rot 27 interleave [2, 3, 7, 14] windows 6:1:0 7:2:0 15:0:0 17:2:3 22:0:0 27:2:0 33:1:1 34:1:1 37:1:0 42:2:0 43:1:1 48:2:1 53:0:0 56:2:1 60:2:2 62:2:0
[2026-10-07T18:53:31Z] load site instr 6: src r5 win 1 off 0; last base writer rotl at 4; writers back to the last injecting one: rotl@4 rotr@50 xor@45; shadow writes of r5 per rep: add=4 mad=6 mul=6 or=1 rotl=2 rotr=4 shfl=3 sub=3 xor=2
[2026-10-07T18:53:31Z] load site instr 7: src r4 win 2 off 0; last base writer mad at 5; writers back to the last injecting one: mad@5; shadow writes of r4 per rep: add=8 mad=4 mul=5 mulhi=4 or=6 rotl=4 rotr=3 shfl=2 xor=6
[2026-10-07T18:53:31Z] load site instr 15: src r3 win 0 off 0; last base writer load at 6; writers back to the last injecting one: load@6; shadow writes of r3 per rep: add=6 mad=3 mul=5 mulhi=2 or=5 rotl=7 rotr=4 shfl=1 sub=3 xor=1
[2026-10-07T18:53:31Z] load site instr 17: src r4 win 2 off 3; last base writer xor at 13; writers back to the last injecting one: xor@13; shadow writes of r4 per rep: add=8 mad=4 mul=5 mulhi=4 or=6 rotl=4 rotr=3 shfl=2 xor=6
[2026-10-07T18:53:31Z] load site instr 22: src r7 win 0 off 0; last base writer load at 7; writers back to the last injecting one: load@7; shadow writes of r7 per rep: add=6 mad=4 mul=3 mulhi=4 or=2 rotl=1 rotr=4 shfl=4 sub=1 xor=3
[2026-10-07T18:53:31Z] load site instr 27: src r6 win 2 off 0; last base writer sub at 14; writers back to the last injecting one: sub@14; shadow writes of r6 per rep: add=4 mad=3 mul=2 mulhi=3 or=2 rotl=7 rotr=3 shfl=3 sub=7 xor=5
[2026-10-07T18:53:31Z] load site instr 33: src r4 win 1 off 1; last base writer mad at 31; writers back to the last injecting one: mad@31; shadow writes of r4 per rep: add=8 mad=4 mul=5 mulhi=4 or=6 rotl=4 rotr=3 shfl=2 xor=6
[2026-10-07T18:53:31Z] load site instr 34: src r0 win 1 off 1; last base writer rotr at 30; writers back to the last injecting one: rotr@30 mad@26; shadow writes of r0 per rep: add=3 mul=1 mulhi=2 or=2 rotl=6 rotr=2 shfl=3 sub=1 xor=1
[2026-10-07T18:53:31Z] load site instr 37: src r1 win 1 off 0; last base writer sub at 36; writers back to the last injecting one: sub@36; shadow writes of r1 per rep: add=5 mad=3 mul=3 mulhi=2 rotl=3 rotr=3 shfl=3 sub=4
[2026-10-07T18:53:31Z] load site instr 42: src r7 win 2 off 0; last base writer shfl at 39; writers back to the last injecting one: shfl@39; shadow writes of r7 per rep: add=6 mad=4 mul=3 mulhi=4 or=2 rotl=1 rotr=4 shfl=4 sub=1 xor=3
[2026-10-07T18:53:31Z] load site instr 43: src r3 win 1 off 1; last base writer add at 41; writers back to the last injecting one: add@41; shadow writes of r3 per rep: add=6 mad=3 mul=5 mulhi=2 or=5 rotl=7 rotr=4 shfl=1 sub=3 xor=1
[2026-10-07T18:53:31Z] load site instr 48: src r4 win 2 off 1; last base writer xor at 40; writers back to the last injecting one: xor@40; shadow writes of r4 per rep: add=8 mad=4 mul=5 mulhi=4 or=6 rotl=4 rotr=3 shfl=2 xor=6
[2026-10-07T18:53:31Z] load site instr 53: src r1 win 0 off 0; last base writer add at 47; writers back to the last injecting one: add@47; shadow writes of r1 per rep: add=5 mad=3 mul=3 mulhi=2 rotl=3 rotr=3 shfl=3 sub=4
[2026-10-07T18:53:31Z] load site instr 56: src r3 win 2 off 1; last base writer load at 53; writers back to the last injecting one: load@53; shadow writes of r3 per rep: add=6 mad=3 mul=5 mulhi=2 or=5 rotl=7 rotr=4 shfl=1 sub=3 xor=1
[2026-10-07T18:53:31Z] load site instr 60: src r0 win 2 off 2; last base writer add at 57; writers back to the last injecting one: add@57; shadow writes of r0 per rep: add=3 mul=1 mulhi=2 or=2 rotl=6 rotr=2 shfl=3 sub=1 xor=1
[2026-10-07T18:53:31Z] load site instr 62: src r5 win 2 off 0; last base writer rotr at 50; writers back to the last injecting one: rotr@50 xor@45; shadow writes of r5 per rep: add=4 mad=6 mul=6 or=1 rotl=2 rotr=4 shfl=3 sub=3 xor=2
[2026-10-07T18:53:31Z] window layer: site item windows (first, items) (0x0,2^23) (0x0,2^22) (0x0,2^24) (0xc00000,2^22) (0x0,2^24) (0x0,2^22) (0x800000,2^23) (0x800000,2^23) (0x0,2^23) (0x0,2^22) (0x800000,2^23) (0x400000,2^22) (0x0,2^24) (0x400000,2^22) (0x800000,2^22) (0x0,2^22); expected reads per item by quarter 184.000 120.000 104.000 104.000 (flat uniform 128.000)
[2026-10-07T18:56:09Z] 524288 warps (16777216 nonces) interpreted in 158.5 s (9.677 ms per warp per thread); Epoch::hash_warp agreement on 589 warps: 0 mismatches
[2026-10-07T18:56:09Z] p4107-attack-f8 distinct lines per hash: n 16777216 min 1013 p1 1023 median 1024 p99 1024 max 1024 mean 1023.8712
[2026-10-07T18:56:09Z] p4107-attack-f8 distinct items per hash: n 16777216 min 127 p1 128 median 128 p99 128 max 128 mean 127.9995
[2026-10-07T18:56:09Z] p4107-attack-f8 distinct lines per warp: n 524288 min 32566 p1 32605 median 32637 p99 32664 max 32687 mean 32636.0980
[2026-10-07T18:56:09Z] p4107-attack-f8 distinct items per warp: n 524288 min 4089 p1 4093 median 4096 p99 4096 max 4096 mean 4095.4651
[2026-10-07T18:56:09Z] uniform expectation: distinct lines per hash 1023.875 of 1024 reads, per warp 32640.3 of 32768 reads (2^22 lines); distinct items per hash 127.9995 of 128, per warp 4095.50 of 4096 (2^24 items)
[2026-10-07T18:56:09Z] positions: largest hi16-bucket (256 items) share 0.0071% at p5 (iteration 0, site 5, instr 27); windowed expectation 0.0061%; largest saturated-source share 0.0000% at p102 (site 6, instr 33)
[2026-10-07T18:56:09Z] acceptance-style (2,048 evaluations, the rule's sample size): the most repeated address at one position 2 of 2048 at p16 (site 0, instr 6); saturated sources at one position 0 of 2048 at p0 (site 0, instr 6); uniform expectation: repeats 1 to 2, saturated 0
[2026-10-07T18:56:10Z] p4107-attack-f8 item histogram (flat): bins 16777216 reads 2147483648 mean 128.000 sigma 11.314 max 261 (bin 484487) z_max +11.76 min 55 z_min -6.45 chi2/dof 9.50003 chi2_z +24618.72 top0.1% 0.17621% top0.5% 0.85035% top1% 1.67069%
[2026-10-07T18:56:10Z] p4107-attack-f8 item histogram against the window density: full 2^24 chi2/dof 1.00061 largest 261 (item 0x76487) at +5.68 sigma smallest at -4.80; buckets64 chi2/dof 1.00265 largest 7052 (bucket 200410) at +4.85 sigma smallest at -4.28
[2026-10-07T18:56:16Z] p4107-attack-f8 WINDOWED CONTROL item histogram (flat): bins 16777216 reads 2147483648 mean 128.000 sigma 11.314 max 253 (bin 3626963) z_max +11.05 min 57 z_min -6.28 chi2/dof 9.49942 chi2_z +24616.95 top0.1% 0.17614% top0.5% 0.85010% top1% 1.67040%
[2026-10-07T18:56:16Z] p4107-attack-f8 WINDOWED CONTROL against the window density: full chi2/dof 0.99987 largest +5.79 sigma; buckets64 chi2/dof 0.99939 largest +4.82 smallest -4.31
[2026-10-07T18:56:16Z] 6-sigma p4107-attack-f8 items buckets64 against the window density: largest bucket +4.85 sigma, smallest -4.28 -> within 6 sigma
[2026-10-07T18:56:16Z] hot-set p4107-attack-f8 items (windowed control): f 0.1% S_f 0.17621% E_f(control) 0.17614% X_f +0.00007% X_f/f +0.0007 -> no hot set
[2026-10-07T18:56:16Z] hot-set p4107-attack-f8 items (windowed control): f 0.5% S_f 0.85035% E_f(control) 0.85010% X_f +0.00025% X_f/f +0.0005 -> no hot set
[2026-10-07T18:56:16Z] hot-set p4107-attack-f8 items (windowed control): f 1.0% S_f 1.67069% E_f(control) 1.67040% X_f +0.00029% X_f/f +0.0003 -> no hot set
[2026-10-07T18:56:16Z] hot-set p4107-attack-f8 items (windowed control): verdict clear
[2026-10-07T18:56:21Z] p4107-attack-f8 FLAT CONTROL item histogram: bins 16777216 reads 2147483648 mean 128.000 sigma 11.314 max 191 (bin 13071644) z_max +5.57 min 73 z_min -4.86 chi2/dof 1.00021 chi2_z +0.61 top0.1% 0.13106% top0.5% 0.63246% top1% 1.24332%
[2026-10-07T18:56:21Z] hot-set p4107-attack-f8 items (flat control, the auditor's first view): f 0.1% S_f 0.17621% E_f(control) 0.13106% X_f +0.04515% X_f/f +0.4515 -> no hot set
[2026-10-07T18:56:21Z] hot-set p4107-attack-f8 items (flat control, the auditor's first view): f 0.5% S_f 0.85035% E_f(control) 0.63246% X_f +0.21789% X_f/f +0.4358 -> no hot set
[2026-10-07T18:56:21Z] hot-set p4107-attack-f8 items (flat control, the auditor's first view): f 1.0% S_f 1.67069% E_f(control) 1.24332% X_f +0.42736% X_f/f +0.4274 -> no hot set
[2026-10-07T18:56:21Z] hot-set p4107-attack-f8 items (flat control, the auditor's first view): verdict clear
[2026-10-07T18:56:21Z] ratio p4107-attack-f8: top 0.1% / 0.5% / 1% share over the WINDOW-MODEL control 1.0004x / 1.0003x / 1.0002x (gate 1.2x at 0.1%: within); over the FLAT control 1.3445x / 1.3445x / 1.3437x
[2026-10-07T18:56:21Z] hottest item p4107-attack-f8 (0x076487): 261 reads (0.0000% of all); predicted source none
[2026-10-07T18:56:21Z] program p4107-attack-f8 DONE: 16777216 nonces; 6-sigma (windowed) clear; hot-set clear; verdict PASS (no test fired)
[2026-10-07T18:56:21Z] attack-f8 0.1.0 (igneum-pow 4); args ["warps", "--program", "101710", "--nonces", "16777216", "--threads", "32", "--out", "/srv/builds/_adv-adv-accept/live", "--validate", "sample"]
[2026-10-07T18:56:21Z] census warps: programs [101710] day 20730 nonces 16777216 threads 32 plant none validate sample check_every 997 diag false
[2026-10-07T18:56:22Z] day 20730: cache filled in 0.56 s, fnv 448274a57f508cbc
[2026-10-07T18:56:26Z] table: 16777216 items derived with their 8 lines in 4.5 s; library comparison sample (0 mismatches)
[2026-10-07T18:56:30Z] program p101710-attack-f8: epoch seed 20de618d385b1b6bc3e0b96e74b50544e25a1cf3e9a631640b2db5bc497bfd7d era seed 9250d0838ee83ca2b95ee46642b31dae159f03c80600d121db2c877aad18c34e id 62a749ef32ba9501 attempt 0 class mx8-era1da7acf7+sh256x27 op mix load=16 xor=11 add=7 mad=7 shfl=7 sub=5 mulhi=4 rotr=4 mul=2 rotl=1; era stride mul 0x84c68c49 rot 14 interleave [9, 11, 12, 13] windows 3:0:0 4:1:0 6:1:1 9:1:0 10:0:0 16:2:3 30:0:0 32:1:0 36:0:0 37:0:0 41:0:0 42:0:0 54:1:0 60:2:0 61:1:1 63:0:0
[2026-10-07T18:56:30Z] load site instr 3: src r6 win 0 off 0; last base writer sub at 0; writers back to the last injecting one: sub@0; shadow writes of r6 per rep: add=10 mad=3 mul=5 mulhi=2 rotl=2 rotr=4 shfl=4 sub=3 xor=6
[2026-10-07T18:56:30Z] load site instr 4: src r3 win 1 off 0; last base writer load at 3; writers back to the last injecting one: load@3; shadow writes of r3 per rep: add=7 mad=2 mul=3 mulhi=2 or=1 rotl=4 rotr=3 shfl=5 sub=2 xor=3
[2026-10-07T18:56:30Z] load site instr 6: src r1 win 1 off 1; last base writer load at 4; writers back to the last injecting one: load@4; shadow writes of r1 per rep: add=2 mad=1 mul=2 mulhi=1 or=1 rotl=2 rotr=4 shfl=2 sub=2 xor=3
[2026-10-07T18:56:30Z] load site instr 9: src r3 win 1 off 0; last base writer shfl at 5; writers back to the last injecting one: shfl@5; shadow writes of r3 per rep: add=7 mad=2 mul=3 mulhi=2 or=1 rotl=4 rotr=3 shfl=5 sub=2 xor=3
[2026-10-07T18:56:30Z] load site instr 10: src r7 win 0 off 0; last base writer load at 9; writers back to the last injecting one: load@9; shadow writes of r7 per rep: add=6 mad=2 mul=6 mulhi=4 or=1 rotl=3 rotr=3 shfl=2 sub=4 xor=3
[2026-10-07T18:56:30Z] load site instr 16: src r5 win 2 off 3; last base writer xor at 15; writers back to the last injecting one: xor@15; shadow writes of r5 per rep: add=9 mad=3 mul=2 mulhi=3 or=2 rotl=2 rotr=1 shfl=5 sub=1 xor=7
[2026-10-07T18:56:30Z] load site instr 30: src r2 win 0 off 0; last base writer xor at 28; writers back to the last injecting one: xor@28; shadow writes of r2 per rep: add=3 mad=2 mul=6 mulhi=2 or=3 rotl=2 shfl=5 sub=5 xor=7
[2026-10-07T18:56:30Z] load site instr 32: src r6 win 1 off 0; last base writer mad at 24; writers back to the last injecting one: mad@24; shadow writes of r6 per rep: add=10 mad=3 mul=5 mulhi=2 rotl=2 rotr=4 shfl=4 sub=3 xor=6
[2026-10-07T18:56:30Z] load site instr 36: src r5 win 0 off 0; last base writer rotl at 31; writers back to the last injecting one: rotl@31 add@29; shadow writes of r5 per rep: add=9 mad=3 mul=2 mulhi=3 or=2 rotl=2 rotr=1 shfl=5 sub=1 xor=7
[2026-10-07T18:56:30Z] load site instr 37: src r1 win 0 off 0; last base writer load at 30; writers back to the last injecting one: load@30; shadow writes of r1 per rep: add=2 mad=1 mul=2 mulhi=1 or=1 rotl=2 rotr=4 shfl=2 sub=2 xor=3
[2026-10-07T18:56:30Z] load site instr 41: src r3 win 0 off 0; last base writer mad at 38; writers back to the last injecting one: mad@38; shadow writes of r3 per rep: add=7 mad=2 mul=3 mulhi=2 or=1 rotl=4 rotr=3 shfl=5 sub=2 xor=3
[2026-10-07T18:56:30Z] load site instr 42: src r4 win 0 off 0; last base writer load at 37; writers back to the last injecting one: load@37; shadow writes of r4 per rep: add=3 mad=4 mul=3 mulhi=3 rotl=7 rotr=2 shfl=1 sub=3 xor=4
[2026-10-07T18:56:30Z] load site instr 54: src r5 win 1 off 0; last base writer shfl at 46; writers back to the last injecting one: shfl@46; shadow writes of r5 per rep: add=9 mad=3 mul=2 mulhi=3 or=2 rotl=2 rotr=1 shfl=5 sub=1 xor=7
[2026-10-07T18:56:30Z] load site instr 60: src r1 win 2 off 0; last base writer shfl at 47; writers back to the last injecting one: shfl@47; shadow writes of r1 per rep: add=2 mad=1 mul=2 mulhi=1 or=1 rotl=2 rotr=4 shfl=2 sub=2 xor=3
[2026-10-07T18:56:30Z] load site instr 61: src r6 win 1 off 1; last base writer rotr at 58; writers back to the last injecting one: rotr@58 sub@53; shadow writes of r6 per rep: add=10 mad=3 mul=5 mulhi=2 rotl=2 rotr=4 shfl=4 sub=3 xor=6
[2026-10-07T18:56:30Z] load site instr 63: src r0 win 0 off 0; last base writer mad at 56; writers back to the last injecting one: mad@56; shadow writes of r0 per rep: add=7 mad=6 mul=3 mulhi=1 or=4 rotl=2 rotr=2 shfl=1 sub=1 xor=4
[2026-10-07T18:56:30Z] window layer: site item windows (first, items) (0x0,2^24) (0x0,2^23) (0x800000,2^23) (0x0,2^23) (0x0,2^24) (0xc00000,2^22) (0x0,2^24) (0x0,2^23) (0x0,2^24) (0x0,2^24) (0x0,2^24) (0x0,2^24) (0x0,2^23) (0x0,2^22) (0x800000,2^23) (0x0,2^24); expected reads per item by quarter 160.000 128.000 96.000 128.000 (flat uniform 128.000)
[2026-10-07T18:58:50Z] 524288 warps (16777216 nonces) interpreted in 139.6 s (8.523 ms per warp per thread); Epoch::hash_warp agreement on 589 warps: 0 mismatches
[2026-10-07T18:58:50Z] p101710-attack-f8 distinct lines per hash: n 16777216 min 1008 p1 1023 median 1024 p99 1024 max 1024 mean 1023.8713
[2026-10-07T18:58:50Z] p101710-attack-f8 distinct items per hash: n 16777216 min 126 p1 128 median 128 p99 128 max 128 mean 127.9995
[2026-10-07T18:58:50Z] p101710-attack-f8 distinct lines per warp: n 524288 min 32560 p1 32605 median 32637 p99 32664 max 32686 mean 32636.2319
[2026-10-07T18:58:50Z] p101710-attack-f8 distinct items per warp: n 524288 min 4089 p1 4093 median 4096 p99 4096 max 4096 mean 4095.4838
[2026-10-07T18:58:50Z] uniform expectation: distinct lines per hash 1023.875 of 1024 reads, per warp 32640.3 of 32768 reads (2^22 lines); distinct items per hash 127.9995 of 128, per warp 4095.50 of 4096 (2^24 items)
[2026-10-07T18:58:50Z] positions: largest hi16-bucket (256 items) share 0.0070% at p93 (iteration 5, site 13, instr 60); windowed expectation 0.0061%; largest saturated-source share 0.0000% at p27 (site 11, instr 42)
[2026-10-07T18:58:50Z] acceptance-style (2,048 evaluations, the rule's sample size): the most repeated address at one position 2 of 2048 at p33 (site 1, instr 4); saturated sources at one position 0 of 2048 at p0 (site 0, instr 3); uniform expectation: repeats 1 to 2, saturated 0
[2026-10-07T18:58:50Z] p101710-attack-f8 item histogram (flat): bins 16777216 reads 2147483648 mean 128.000 sigma 11.314 max 230 (bin 2892200) z_max +9.02 min 51 z_min -6.81 chi2/dof 5.03546 chi2_z +11687.94 top0.1% 0.15582% top0.5% 0.74981% top1% 1.47120%
[2026-10-07T18:58:50Z] p101710-attack-f8 item histogram against the window density: full 2^24 chi2/dof 1.03671 largest 195 (item 0x708008) at +5.92 sigma smallest at -4.86; buckets64 chi2/dof 3.36265 largest 8837 (bucket 254991) at +7.13 sigma smallest at -5.62
[2026-10-07T18:58:57Z] p101710-attack-f8 WINDOWED CONTROL item histogram (flat): bins 16777216 reads 2147483648 mean 128.000 sigma 11.314 max 226 (bin 106244) z_max +8.66 min 50 z_min -6.89 chi2/dof 4.99998 chi2_z +11585.18 top0.1% 0.15528% top0.5% 0.74779% top1% 1.46776%
[2026-10-07T18:58:57Z] p101710-attack-f8 WINDOWED CONTROL against the window density: full chi2/dof 0.99997 largest +5.31 sigma; buckets64 chi2/dof 1.00339 largest +4.86 smallest -4.43
[2026-10-07T18:58:57Z] 6-sigma p101710-attack-f8 items buckets64 against the window density: largest bucket +7.13 sigma, smallest -5.62 -> FLAGGED (beyond 6 sigma)
[2026-10-07T18:58:57Z] hot-set p101710-attack-f8 items (windowed control): f 0.1% S_f 0.15582% E_f(control) 0.15528% X_f +0.00053% X_f/f +0.0053 -> no hot set
[2026-10-07T18:58:57Z] hot-set p101710-attack-f8 items (windowed control): f 0.5% S_f 0.74981% E_f(control) 0.74779% X_f +0.00202% X_f/f +0.0040 -> no hot set
[2026-10-07T18:58:57Z] hot-set p101710-attack-f8 items (windowed control): f 1.0% S_f 1.47120% E_f(control) 1.46776% X_f +0.00344% X_f/f +0.0034 -> no hot set
[2026-10-07T18:58:57Z] hot-set p101710-attack-f8 items (windowed control): verdict clear
[2026-10-07T18:59:03Z] p101710-attack-f8 FLAT CONTROL item histogram: bins 16777216 reads 2147483648 mean 128.000 sigma 11.314 max 194 (bin 11298889) z_max +5.83 min 74 z_min -4.77 chi2/dof 1.00040 chi2_z +1.15 top0.1% 0.13112% top0.5% 0.63261% top1% 1.24353%
[2026-10-07T18:59:03Z] hot-set p101710-attack-f8 items (flat control, the auditor's first view): f 0.1% S_f 0.15582% E_f(control) 0.13112% X_f +0.02470% X_f/f +0.2470 -> no hot set
[2026-10-07T18:59:03Z] hot-set p101710-attack-f8 items (flat control, the auditor's first view): f 0.5% S_f 0.74981% E_f(control) 0.63261% X_f +0.11720% X_f/f +0.2344 -> no hot set
[2026-10-07T18:59:03Z] hot-set p101710-attack-f8 items (flat control, the auditor's first view): f 1.0% S_f 1.47120% E_f(control) 1.24353% X_f +0.22766% X_f/f +0.2277 -> no hot set
[2026-10-07T18:59:03Z] hot-set p101710-attack-f8 items (flat control, the auditor's first view): verdict clear
[2026-10-07T18:59:03Z] ratio p101710-attack-f8: top 0.1% / 0.5% / 1% share over the WINDOW-MODEL control 1.0034x / 1.0027x / 1.0023x (gate 1.2x at 0.1%: within); over the FLAT control 1.1884x / 1.1853x / 1.1831x
[2026-10-07T18:59:03Z] hottest item p101710-attack-f8 (0x2c21a8): 230 reads (0.0000% of all); predicted source none
[2026-10-07T18:59:03Z] program p101710-attack-f8 DONE: 16777216 nonces; 6-sigma (windowed) FLAGGED; hot-set clear; verdict FLAGGED
[2026-10-07T18:59:03Z] attack-f8 0.1.0 (igneum-pow 4); args ["warps", "--program", "101886", "--nonces", "16777216", "--threads", "32", "--out", "/srv/builds/_adv-adv-accept/live", "--validate", "sample"]
[2026-10-07T18:59:03Z] census warps: programs [101886] day 20730 nonces 16777216 threads 32 plant none validate sample check_every 997 diag false
[2026-10-07T18:59:04Z] day 20730: cache filled in 0.59 s, fnv 448274a57f508cbc
[2026-10-07T18:59:10Z] table: 16777216 items derived with their 8 lines in 5.2 s; library comparison sample (0 mismatches)
[2026-10-07T18:59:13Z] program p101886-attack-f8: epoch seed 8a3fea6b39394f8f7aee3b6732735420cc22da213837415cbb4d258065c1f7d1 era seed 673dcc8c08c5a016a2e4723959a6c5ac071f153f37aef3d5620cb2a84a428ed9 id 46f640117d2e25a9 attempt 0 class mx8-era6bcec6d6+sh256x27 op mix load=16 add=10 shfl=7 rotr=6 xor=6 mad=5 mulhi=5 mul=4 sub=3 rotl=2; era stride mul 0xd254bce1 rot 1 interleave [4, 6, 11, 15] windows 4:2:0 6:1:1 10:0:0 14:1:0 17:2:1 18:1:0 20:2:2 23:2:2 24:1:1 27:1:0 30:0:0 46:1:1 57:2:0 58:2:1 61:2:3 63:0:0
[2026-10-07T18:59:13Z] load site instr 4: src r1 win 2 off 0; last base writer shfl at 2; writers back to the last injecting one: shfl@2; shadow writes of r1 per rep: add=9 mad=4 mul=6 mulhi=2 or=4 rotl=2 rotr=2 shfl=7 sub=2 xor=2
[2026-10-07T18:59:13Z] load site instr 6: src r7 win 1 off 1; last base writer rotr at 1; writers back to the last injecting one: rotr@1 load@63; shadow writes of r7 per rep: add=7 mul=4 mulhi=1 or=1 rotl=2 rotr=3 shfl=3 sub=2 xor=6
[2026-10-07T18:59:13Z] load site instr 10: src r6 win 0 off 0; last base writer add at 9; writers back to the last injecting one: add@9; shadow writes of r6 per rep: add=6 mad=2 mul=3 mulhi=3 rotl=2 rotr=4 shfl=1 sub=5 xor=4
[2026-10-07T18:59:13Z] load site instr 14: src r2 win 1 off 0; last base writer load at 10; writers back to the last injecting one: load@10; shadow writes of r2 per rep: add=5 mul=4 or=3 rotl=1 rotr=1 shfl=4 sub=5 xor=4
[2026-10-07T18:59:13Z] load site instr 17: src r7 win 2 off 1; last base writer xor at 12; writers back to the last injecting one: xor@12; shadow writes of r7 per rep: add=7 mul=4 mulhi=1 or=1 rotl=2 rotr=3 shfl=3 sub=2 xor=6
[2026-10-07T18:59:13Z] load site instr 18: src r6 win 1 off 0; last base writer load at 14; writers back to the last injecting one: load@14; shadow writes of r6 per rep: add=6 mad=2 mul=3 mulhi=3 rotl=2 rotr=4 shfl=1 sub=5 xor=4
[2026-10-07T18:59:13Z] load site instr 20: src r1 win 2 off 2; last base writer load at 18; writers back to the last injecting one: load@18; shadow writes of r1 per rep: add=9 mad=4 mul=6 mulhi=2 or=4 rotl=2 rotr=2 shfl=7 sub=2 xor=2
[2026-10-07T18:59:13Z] load site instr 23: src r1 win 2 off 2; last base writer add at 21; writers back to the last injecting one: add@21; shadow writes of r1 per rep: add=9 mad=4 mul=6 mulhi=2 or=4 rotl=2 rotr=2 shfl=7 sub=2 xor=2
[2026-10-07T18:59:13Z] load site instr 24: src r6 win 1 off 1; last base writer rotl at 22; writers back to the last injecting one: rotl@22 load@14; shadow writes of r6 per rep: add=6 mad=2 mul=3 mulhi=3 rotl=2 rotr=4 shfl=1 sub=5 xor=4
[2026-10-07T18:59:13Z] load site instr 27: src r5 win 1 off 0; last base writer xor at 25; writers back to the last injecting one: xor@25; shadow writes of r5 per rep: add=5 mad=4 mul=5 or=1 rotl=7 rotr=1 shfl=7 sub=4 xor=1
[2026-10-07T18:59:13Z] load site instr 30: src r1 win 0 off 0; last base writer xor at 26; writers back to the last injecting one: xor@26; shadow writes of r1 per rep: add=9 mad=4 mul=6 mulhi=2 or=4 rotl=2 rotr=2 shfl=7 sub=2 xor=2
[2026-10-07T18:59:13Z] load site instr 46: src r4 win 1 off 1; last base writer add at 42; writers back to the last injecting one: add@42; shadow writes of r4 per rep: add=2 mad=6 mul=2 mulhi=1 rotl=6 rotr=1 shfl=7 sub=4 xor=6
[2026-10-07T18:59:13Z] load site instr 57: src r5 win 2 off 0; last base writer add at 56; writers back to the last injecting one: add@56; shadow writes of r5 per rep: add=5 mad=4 mul=5 or=1 rotl=7 rotr=1 shfl=7 sub=4 xor=1
[2026-10-07T18:59:13Z] load site instr 58: src r3 win 2 off 1; last base writer load at 46; writers back to the last injecting one: load@46; shadow writes of r3 per rep: add=2 mad=3 mul=4 mulhi=4 or=2 rotl=8 rotr=3 shfl=2 sub=3 xor=7
[2026-10-07T18:59:13Z] load site instr 61: src r3 win 2 off 3; last base writer add at 59; writers back to the last injecting one: add@59; shadow writes of r3 per rep: add=2 mad=3 mul=4 mulhi=4 or=2 rotl=8 rotr=3 shfl=2 sub=3 xor=7
[2026-10-07T18:59:13Z] load site instr 63: src r6 win 0 off 0; last base writer mad at 52; writers back to the last injecting one: mad@52; shadow writes of r6 per rep: add=6 mad=2 mul=3 mulhi=3 rotl=2 rotr=4 shfl=1 sub=5 xor=4
[2026-10-07T18:59:13Z] window layer: site item windows (first, items) (0x0,2^22) (0x800000,2^23) (0x0,2^24) (0x0,2^23) (0x400000,2^22) (0x0,2^23) (0x800000,2^22) (0x800000,2^22) (0x800000,2^23) (0x0,2^23) (0x0,2^24) (0x800000,2^23) (0x0,2^22) (0x400000,2^22) (0xc00000,2^22) (0x0,2^24); expected reads per item by quarter 136.000 136.000 136.000 104.000 (flat uniform 128.000)
[2026-10-07T19:01:46Z] 524288 warps (16777216 nonces) interpreted in 152.7 s (9.319 ms per warp per thread); Epoch::hash_warp agreement on 589 warps: 0 mismatches
[2026-10-07T19:01:46Z] p101886-attack-f8 distinct lines per hash: n 16777216 min 1012 p1 1023 median 1024 p99 1024 max 1024 mean 1023.8712
[2026-10-07T19:01:46Z] p101886-attack-f8 distinct items per hash: n 16777216 min 127 p1 128 median 128 p99 128 max 128 mean 127.9995
[2026-10-07T19:01:46Z] p101886-attack-f8 distinct lines per warp: n 524288 min 32565 p1 32605 median 32637 p99 32664 max 32688 mean 32636.3190
[2026-10-07T19:01:46Z] p101886-attack-f8 distinct items per warp: n 524288 min 4090 p1 4093 median 4096 p99 4096 max 4096 mean 4095.4942
[2026-10-07T19:01:46Z] uniform expectation: distinct lines per hash 1023.875 of 1024 reads, per warp 32640.3 of 32768 reads (2^22 lines); distinct items per hash 127.9995 of 128, per warp 4095.50 of 4096 (2^24 items)
[2026-10-07T19:01:46Z] positions: largest hi16-bucket (256 items) share 0.0071% at p116 (iteration 7, site 4, instr 17); windowed expectation 0.0061%; largest saturated-source share 0.0000% at p0 (site 0, instr 4)
[2026-10-07T19:01:46Z] acceptance-style (2,048 evaluations, the rule's sample size): the most repeated address at one position 2 of 2048 at p0 (site 0, instr 4); saturated sources at one position 0 of 2048 at p0 (site 0, instr 4); uniform expectation: repeats 1 to 2, saturated 0
[2026-10-07T19:01:46Z] p101886-attack-f8 item histogram (flat): bins 16777216 reads 2147483648 mean 128.000 sigma 11.314 max 201 (bin 8008368) z_max +6.45 min 59 z_min -6.10 chi2/dof 2.49962 chi2_z +4343.37 top0.1% 0.13743% top0.5% 0.66312% top1% 1.30353%
[2026-10-07T19:01:46Z] p101886-attack-f8 item histogram against the window density: full 2^24 chi2/dof 0.99952 largest 201 (item 0x7a32b0) at +5.57 sigma smallest at -4.54; buckets64 chi2/dof 1.00180 largest 9131 (bucket 152447) at +4.58 sigma smallest at -4.69
[2026-10-07T19:01:53Z] p101886-attack-f8 WINDOWED CONTROL item histogram (flat): bins 16777216 reads 2147483648 mean 128.000 sigma 11.314 max 207 (bin 6083881) z_max +6.98 min 56 z_min -6.36 chi2/dof 2.50050 chi2_z +4345.91 top0.1% 0.13743% top0.5% 0.66318% top1% 1.30367%
[2026-10-07T19:01:53Z] p101886-attack-f8 WINDOWED CONTROL against the window density: full chi2/dof 1.00018 largest +6.09 sigma; buckets64 chi2/dof 1.00060 largest +5.17 smallest -4.75
[2026-10-07T19:01:53Z] 6-sigma p101886-attack-f8 items buckets64 against the window density: largest bucket +4.58 sigma, smallest -4.69 -> within 6 sigma
[2026-10-07T19:01:53Z] hot-set p101886-attack-f8 items (windowed control): f 0.1% S_f 0.13743% E_f(control) 0.13743% X_f +0.00000% X_f/f +0.0000 -> no hot set
[2026-10-07T19:01:53Z] hot-set p101886-attack-f8 items (windowed control): f 0.5% S_f 0.66312% E_f(control) 0.66318% X_f -0.00006% X_f/f -0.0001 -> no hot set
[2026-10-07T19:01:53Z] hot-set p101886-attack-f8 items (windowed control): f 1.0% S_f 1.30353% E_f(control) 1.30367% X_f -0.00014% X_f/f -0.0001 -> no hot set
[2026-10-07T19:01:53Z] hot-set p101886-attack-f8 items (windowed control): verdict clear
[2026-10-07T19:01:58Z] p101886-attack-f8 FLAT CONTROL item histogram: bins 16777216 reads 2147483648 mean 128.000 sigma 11.314 max 196 (bin 7313621) z_max +6.01 min 72 z_min -4.95 chi2/dof 1.00032 chi2_z +0.94 top0.1% 0.13107% top0.5% 0.63252% top1% 1.24340%
[2026-10-07T19:01:58Z] hot-set p101886-attack-f8 items (flat control, the auditor's first view): f 0.1% S_f 0.13743% E_f(control) 0.13107% X_f +0.00636% X_f/f +0.0636 -> no hot set
[2026-10-07T19:01:58Z] hot-set p101886-attack-f8 items (flat control, the auditor's first view): f 0.5% S_f 0.66312% E_f(control) 0.63252% X_f +0.03060% X_f/f +0.0612 -> no hot set
[2026-10-07T19:01:58Z] hot-set p101886-attack-f8 items (flat control, the auditor's first view): f 1.0% S_f 1.30353% E_f(control) 1.24340% X_f +0.06014% X_f/f +0.0601 -> no hot set
[2026-10-07T19:01:58Z] hot-set p101886-attack-f8 items (flat control, the auditor's first view): verdict clear
[2026-10-07T19:01:58Z] ratio p101886-attack-f8: top 0.1% / 0.5% / 1% share over the WINDOW-MODEL control 1.0000x / 0.9999x / 0.9999x (gate 1.2x at 0.1%: within); over the FLAT control 1.0485x / 1.0484x / 1.0484x
[2026-10-07T19:01:58Z] hottest item p101886-attack-f8 (0x7a32b0): 201 reads (0.0000% of all); predicted source none
[2026-10-07T19:01:58Z] program p101886-attack-f8 DONE: 16777216 nonces; 6-sigma (windowed) clear; hot-set clear; verdict PASS (no test fired)
[2026-10-07T19:01:59Z] attack-f8 0.1.0 (igneum-pow 4); args ["warps", "--program", "6132", "--nonces", "16777216", "--threads", "32", "--out", "/srv/builds/_adv-adv-accept/live", "--validate", "sample"]
[2026-10-07T19:01:59Z] census warps: programs [6132] day 20730 nonces 16777216 threads 32 plant none validate sample check_every 997 diag false
[2026-10-07T19:01:59Z] day 20730: cache filled in 0.63 s, fnv 448274a57f508cbc
[2026-10-07T19:02:04Z] table: 16777216 items derived with their 8 lines in 4.4 s; library comparison sample (0 mismatches)
[2026-10-07T19:02:08Z] program p6132-attack-f8: epoch seed a83b83226e9959d88dc3531f06079e053b05a95975c612bd93c341a98469b1bd era seed 650a66624a399cd9552ca8750c77a63c798b0df51ee5cf3480baddfbd4679019 id b04fe05087ed4937 attempt 0 class mx8-era64c929d7+sh256x27 op mix load=16 add=8 mul=8 xor=7 mad=6 or=5 shfl=4 sub=4 mulhi=2 rotl=2 rotr=2; era stride mul 0x217304b9 rot 13 interleave [4, 5, 11, 13] windows 4:1:1 7:2:1 8:0:0 9:2:1 13:2:2 16:2:2 17:2:0 27:2:3 29:0:0 35:1:0 37:0:0 44:2:3 48:2:3 51:2:0 57:2:2 62:0:0
[2026-10-07T19:02:08Z] load site instr 4: src r2 win 1 off 1; last base writer add at 1; writers back to the last injecting one: add@1; shadow writes of r2 per rep: add=2 mul=2 mulhi=7 or=4 rotl=3 rotr=1 shfl=3 sub=1 xor=2
[2026-10-07T19:02:08Z] load site instr 7: src r4 win 2 off 1; last base writer shfl at 6; writers back to the last injecting one: shfl@6; shadow writes of r4 per rep: add=4 mad=3 mul=5 mulhi=2 rotl=1 rotr=5 shfl=2 sub=1 xor=6
[2026-10-07T19:02:08Z] load site instr 8: src r6 win 0 off 0; last base writer load at 7; writers back to the last injecting one: load@7; shadow writes of r6 per rep: add=6 mad=3 mul=5 mulhi=3 or=3 rotl=2 rotr=2 shfl=5 sub=2 xor=7
[2026-10-07T19:02:08Z] load site instr 9: src r4 win 2 off 1; last base writer load at 8; writers back to the last injecting one: load@8; shadow writes of r4 per rep: add=4 mad=3 mul=5 mulhi=2 rotl=1 rotr=5 shfl=2 sub=1 xor=6
[2026-10-07T19:02:08Z] load site instr 13: src r3 win 2 off 2; last base writer rotl at 12; writers back to the last injecting one: rotl@12 shfl@63; shadow writes of r3 per rep: add=2 mad=1 mul=1 mulhi=2 or=2 rotl=6 rotr=2 shfl=7 sub=2 xor=5
[2026-10-07T19:02:08Z] load site instr 16: src r7 win 2 off 2; last base writer add at 10; writers back to the last injecting one: add@10; shadow writes of r7 per rep: add=7 mad=10 mul=4 or=1 rotl=3 rotr=2 shfl=7 xor=6
[2026-10-07T19:02:08Z] load site instr 17: src r0 win 2 off 0; last base writer add at 15; writers back to the last injecting one: add@15; shadow writes of r0 per rep: add=8 mad=5 mul=6 mulhi=2 rotl=3 rotr=3 shfl=2 sub=1 xor=7
[2026-10-07T19:02:08Z] load site instr 27: src r3 win 2 off 3; last base writer mad at 24; writers back to the last injecting one: mad@24; shadow writes of r3 per rep: add=2 mad=1 mul=1 mulhi=2 or=2 rotl=6 rotr=2 shfl=7 sub=2 xor=5
[2026-10-07T19:02:08Z] load site instr 29: src r1 win 0 off 0; last base writer add at 22; writers back to the last injecting one: add@22; shadow writes of r1 per rep: add=5 mad=1 mul=4 mulhi=2 or=3 rotl=3 rotr=2 shfl=2 sub=4 xor=6
[2026-10-07T19:02:08Z] load site instr 35: src r1 win 1 off 0; last base writer xor at 33; writers back to the last injecting one: xor@33; shadow writes of r1 per rep: add=5 mad=1 mul=4 mulhi=2 or=3 rotl=3 rotr=2 shfl=2 sub=4 xor=6
[2026-10-07T19:02:08Z] load site instr 37: src r7 win 0 off 0; last base writer load at 29; writers back to the last injecting one: load@29; shadow writes of r7 per rep: add=7 mad=10 mul=4 or=1 rotl=3 rotr=2 shfl=7 xor=6
[2026-10-07T19:02:08Z] load site instr 44: src r7 win 2 off 3; last base writer sub at 43; writers back to the last injecting one: sub@43; shadow writes of r7 per rep: add=7 mad=10 mul=4 or=1 rotl=3 rotr=2 shfl=7 xor=6
[2026-10-07T19:02:08Z] load site instr 48: src r4 win 2 off 3; last base writer shfl at 38; writers back to the last injecting one: shfl@38; shadow writes of r4 per rep: add=4 mad=3 mul=5 mulhi=2 rotl=1 rotr=5 shfl=2 sub=1 xor=6
[2026-10-07T19:02:08Z] load site instr 51: src r1 win 2 off 0; last base writer load at 48; writers back to the last injecting one: load@48; shadow writes of r1 per rep: add=5 mad=1 mul=4 mulhi=2 or=3 rotl=3 rotr=2 shfl=2 sub=4 xor=6
[2026-10-07T19:02:08Z] load site instr 57: src r6 win 2 off 2; last base writer load at 51; writers back to the last injecting one: load@51; shadow writes of r6 per rep: add=6 mad=3 mul=5 mulhi=3 or=3 rotl=2 rotr=2 shfl=5 sub=2 xor=7
[2026-10-07T19:02:08Z] load site instr 62: src r2 win 0 off 0; last base writer load at 57; writers back to the last injecting one: load@57; shadow writes of r2 per rep: add=2 mul=2 mulhi=7 or=4 rotl=3 rotr=1 shfl=3 sub=1 xor=2
[2026-10-07T19:02:08Z] window layer: site item windows (first, items) (0x800000,2^23) (0x400000,2^22) (0x0,2^24) (0x400000,2^22) (0x800000,2^22) (0x800000,2^22) (0x0,2^22) (0xc00000,2^22) (0x0,2^24) (0x0,2^23) (0x0,2^24) (0xc00000,2^22) (0xc00000,2^22) (0x0,2^22) (0x800000,2^22) (0x0,2^24); expected reads per item by quarter 112.000 112.000 144.000 144.000 (flat uniform 128.000)
[2026-10-07T19:04:11Z] 524288 warps (16777216 nonces) interpreted in 123.0 s (7.507 ms per warp per thread); Epoch::hash_warp agreement on 589 warps: 0 mismatches
[2026-10-07T19:04:11Z] p6132-attack-f8 distinct lines per hash: n 16777216 min 1008 p1 1023 median 1024 p99 1024 max 1024 mean 1023.8714
[2026-10-07T19:04:11Z] p6132-attack-f8 distinct items per hash: n 16777216 min 126 p1 128 median 128 p99 128 max 128 mean 127.9995
[2026-10-07T19:04:11Z] p6132-attack-f8 distinct lines per warp: n 524288 min 32564 p1 32605 median 32637 p99 32664 max 32687 mean 32636.3491
[2026-10-07T19:04:11Z] p6132-attack-f8 distinct items per warp: n 524288 min 4089 p1 4093 median 4096 p99 4096 max 4096 mean 4095.4928
[2026-10-07T19:04:11Z] uniform expectation: distinct lines per hash 1023.875 of 1024 reads, per warp 32640.3 of 32768 reads (2^22 lines); distinct items per hash 127.9995 of 128, per warp 4095.50 of 4096 (2^24 items)
[2026-10-07T19:04:11Z] positions: largest hi16-bucket (256 items) share 0.0070% at p123 (iteration 7, site 11, instr 44); windowed expectation 0.0061%; largest saturated-source share 0.0000% at p9 (site 9, instr 35)
[2026-10-07T19:04:11Z] acceptance-style (2,048 evaluations, the rule's sample size): the most repeated address at one position 2 of 2048 at p57 (site 9, instr 35); saturated sources at one position 0 of 2048 at p0 (site 0, instr 4); uniform expectation: repeats 1 to 2, saturated 0
[2026-10-07T19:04:11Z] p6132-attack-f8 item histogram (flat): bins 16777216 reads 2147483648 mean 128.000 sigma 11.314 max 207 (bin 11017463) z_max +6.98 min 61 z_min -5.92 chi2/dof 2.99912 chi2_z +5790.06 top0.1% 0.14335% top0.5% 0.69133% top1% 1.35811%
[2026-10-07T19:04:11Z] p6132-attack-f8 item histogram against the window density: full 2^24 chi2/dof 0.99941 largest 171 (item 0x1af1a4) at +5.57 sigma smallest at -4.82; buckets64 chi2/dof 1.00226 largest 7554 (bucket 92905) at +4.56 sigma smallest at -4.57
[2026-10-07T19:04:19Z] p6132-attack-f8 WINDOWED CONTROL item histogram (flat): bins 16777216 reads 2147483648 mean 128.000 sigma 11.314 max 212 (bin 12563240) z_max +7.42 min 62 z_min -5.83 chi2/dof 3.00014 chi2_z +5793.01 top0.1% 0.14340% top0.5% 0.69149% top1% 1.35839%
[2026-10-07T19:04:19Z] p6132-attack-f8 WINDOWED CONTROL against the window density: full chi2/dof 1.00048 largest +6.05 sigma; buckets64 chi2/dof 1.00207 largest +5.04 smallest -4.53
[2026-10-07T19:04:19Z] 6-sigma p6132-attack-f8 items buckets64 against the window density: largest bucket +4.56 sigma, smallest -4.57 -> within 6 sigma
[2026-10-07T19:04:19Z] hot-set p6132-attack-f8 items (windowed control): f 0.1% S_f 0.14335% E_f(control) 0.14340% X_f -0.00006% X_f/f -0.0006 -> no hot set
[2026-10-07T19:04:19Z] hot-set p6132-attack-f8 items (windowed control): f 0.5% S_f 0.69133% E_f(control) 0.69149% X_f -0.00016% X_f/f -0.0003 -> no hot set
[2026-10-07T19:04:19Z] hot-set p6132-attack-f8 items (windowed control): f 1.0% S_f 1.35811% E_f(control) 1.35839% X_f -0.00028% X_f/f -0.0003 -> no hot set
[2026-10-07T19:04:19Z] hot-set p6132-attack-f8 items (windowed control): verdict clear
[2026-10-07T19:04:25Z] p6132-attack-f8 FLAT CONTROL item histogram: bins 16777216 reads 2147483648 mean 128.000 sigma 11.314 max 190 (bin 8700551) z_max +5.48 min 70 z_min -5.13 chi2/dof 1.00069 chi2_z +2.01 top0.1% 0.13113% top0.5% 0.63265% top1% 1.24364%
[2026-10-07T19:04:25Z] hot-set p6132-attack-f8 items (flat control, the auditor's first view): f 0.1% S_f 0.14335% E_f(control) 0.13113% X_f +0.01221% X_f/f +0.1221 -> no hot set
[2026-10-07T19:04:25Z] hot-set p6132-attack-f8 items (flat control, the auditor's first view): f 0.5% S_f 0.69133% E_f(control) 0.63265% X_f +0.05868% X_f/f +0.1174 -> no hot set
[2026-10-07T19:04:25Z] hot-set p6132-attack-f8 items (flat control, the auditor's first view): f 1.0% S_f 1.35811% E_f(control) 1.24364% X_f +0.11446% X_f/f +0.1145 -> no hot set
[2026-10-07T19:04:25Z] hot-set p6132-attack-f8 items (flat control, the auditor's first view): verdict clear
[2026-10-07T19:04:25Z] ratio p6132-attack-f8: top 0.1% / 0.5% / 1% share over the WINDOW-MODEL control 0.9996x / 0.9998x / 0.9998x (gate 1.2x at 0.1%: within); over the FLAT control 1.0931x / 1.0928x / 1.0920x
[2026-10-07T19:04:25Z] hottest item p6132-attack-f8 (0xc9a802): 207 reads (0.0000% of all); predicted source none
[2026-10-07T19:04:25Z] program p6132-attack-f8 DONE: 16777216 nonces; 6-sigma (windowed) clear; hot-set clear; verdict PASS (no test fired)
[2026-10-07T19:04:25Z] attack-f8 0.1.0 (igneum-pow 4); args ["warps", "--program", "105915", "--nonces", "16777216", "--threads", "32", "--out", "/srv/builds/_adv-adv-accept/live", "--validate", "sample"]
[2026-10-07T19:04:25Z] census warps: programs [105915] day 20730 nonces 16777216 threads 32 plant none validate sample check_every 997 diag false
[2026-10-07T19:04:26Z] day 20730: cache filled in 0.62 s, fnv 448274a57f508cbc
[2026-10-07T19:04:30Z] table: 16777216 items derived with their 8 lines in 3.8 s; library comparison sample (0 mismatches)
[2026-10-07T19:04:33Z] program p105915-attack-f8: epoch seed 0262cc9244db929e15f0e2b9584482f9619c9cb4f12340cc620d44ba72d0c88b era seed 13f6366b890b73c4c4c097db0b167d3487f8d55f766431b7e549868e56aee92e id 551e35d2a7162781 attempt 2 class mx8-era57398823+sh256x27 op mix load=16 mul=11 mad=9 shfl=8 xor=7 sub=4 add=3 rotr=3 or=2 mulhi=1; era stride mul 0xf3c26ca1 rot 5 interleave [0, 1, 5, 13] windows 7:2:1 8:1:0 11:2:2 12:1:1 16:1:0 17:2:1 19:1:0 21:1:1 27:0:0 38:2:2 39:0:0 44:1:1 45:2:1 48:0:0 52:2:3 58:1:1
[2026-10-07T19:04:33Z] load site instr 7: src r0 win 2 off 1; last base writer xor at 2; writers back to the last injecting one: xor@2; shadow writes of r0 per rep: add=5 mad=5 mul=3 or=2 rotl=3 rotr=1 shfl=2 sub=1 xor=2
[2026-10-07T19:04:33Z] load site instr 8: src r5 win 1 off 0; last base writer load at 7; writers back to the last injecting one: load@7; shadow writes of r5 per rep: add=3 mad=2 mul=2 mulhi=4 or=2 rotl=5 rotr=3 shfl=2 sub=3 xor=8
[2026-10-07T19:04:33Z] load site instr 11: src r0 win 2 off 2; last base writer shfl at 9; writers back to the last injecting one: shfl@9; shadow writes of r0 per rep: add=5 mad=5 mul=3 or=2 rotl=3 rotr=1 shfl=2 sub=1 xor=2
[2026-10-07T19:04:33Z] load site instr 12: src r7 win 1 off 1; last base writer sub at 5; writers back to the last injecting one: sub@5; shadow writes of r7 per rep: add=6 mad=3 mul=7 mulhi=3 or=1 rotl=2 rotr=1 shfl=3 sub=2 xor=8
[2026-10-07T19:04:33Z] load site instr 16: src r7 win 1 off 0; last base writer xor at 15; writers back to the last injecting one: xor@15; shadow writes of r7 per rep: add=6 mad=3 mul=7 mulhi=3 or=1 rotl=2 rotr=1 shfl=3 sub=2 xor=8
[2026-10-07T19:04:33Z] load site instr 17: src r4 win 2 off 1; last base writer load at 16; writers back to the last injecting one: load@16; shadow writes of r4 per rep: add=8 mad=7 mul=3 mulhi=4 rotl=4 rotr=1 shfl=1 sub=3 xor=9
[2026-10-07T19:04:33Z] load site instr 19: src r1 win 1 off 0; last base writer load at 17; writers back to the last injecting one: load@17; shadow writes of r1 per rep: add=3 mad=5 mul=3 mulhi=3 or=2 rotl=1 rotr=4 shfl=1 sub=2 xor=6
[2026-10-07T19:04:33Z] load site instr 21: src r7 win 1 off 1; last base writer sub at 20; writers back to the last injecting one: sub@20; shadow writes of r7 per rep: add=6 mad=3 mul=7 mulhi=3 or=1 rotl=2 rotr=1 shfl=3 sub=2 xor=8
[2026-10-07T19:04:33Z] load site instr 27: src r5 win 0 off 0; last base writer shfl at 24; writers back to the last injecting one: shfl@24; shadow writes of r5 per rep: add=3 mad=2 mul=2 mulhi=4 or=2 rotl=5 rotr=3 shfl=2 sub=3 xor=8
[2026-10-07T19:04:33Z] load site instr 38: src r3 win 2 off 2; last base writer mad at 32; writers back to the last injecting one: mad@32; shadow writes of r3 per rep: add=9 mad=5 mul=1 mulhi=1 or=2 rotl=3 rotr=4 shfl=3 sub=2 xor=7
[2026-10-07T19:04:33Z] load site instr 39: src r7 win 0 off 0; last base writer shfl at 35; writers back to the last injecting one: shfl@35; shadow writes of r7 per rep: add=6 mad=3 mul=7 mulhi=3 or=1 rotl=2 rotr=1 shfl=3 sub=2 xor=8
[2026-10-07T19:04:33Z] load site instr 44: src r2 win 1 off 1; last base writer rotr at 31; writers back to the last injecting one: rotr@31 mad@63; shadow writes of r2 per rep: add=2 mad=4 mul=2 mulhi=3 or=1 rotl=5 rotr=4 shfl=2 sub=1 xor=2
[2026-10-07T19:04:33Z] load site instr 45: src r6 win 2 off 1; last base writer load at 38; writers back to the last injecting one: load@38; shadow writes of r6 per rep: add=7 mad=4 mul=1 mulhi=3 rotl=3 rotr=2 shfl=3 sub=3 xor=3
[2026-10-07T19:04:33Z] load site instr 48: src r0 win 0 off 0; last base writer load at 45; writers back to the last injecting one: load@45; shadow writes of r0 per rep: add=5 mad=5 mul=3 or=2 rotl=3 rotr=1 shfl=2 sub=1 xor=2
[2026-10-07T19:04:33Z] load site instr 52: src r6 win 2 off 3; last base writer shfl at 50; writers back to the last injecting one: shfl@50; shadow writes of r6 per rep: add=7 mad=4 mul=1 mulhi=3 rotl=3 rotr=2 shfl=3 sub=3 xor=3
[2026-10-07T19:04:33Z] load site instr 58: src r4 win 1 off 1; last base writer xor at 49; writers back to the last injecting one: xor@49; shadow writes of r4 per rep: add=8 mad=7 mul=3 mulhi=4 rotl=4 rotr=1 shfl=1 sub=3 xor=9
[2026-10-07T19:04:33Z] window layer: site item windows (first, items) (0x400000,2^22) (0x0,2^23) (0x800000,2^22) (0x800000,2^23) (0x0,2^23) (0x400000,2^22) (0x0,2^23) (0x800000,2^23) (0x0,2^24) (0x800000,2^22) (0x0,2^24) (0x800000,2^23) (0x400000,2^22) (0x0,2^24) (0xc00000,2^22) (0x800000,2^23); expected reads per item by quarter 72.000 168.000 152.000 120.000 (flat uniform 128.000)
[2026-10-07T19:06:42Z] 524288 warps (16777216 nonces) interpreted in 128.8 s (7.859 ms per warp per thread); Epoch::hash_warp agreement on 589 warps: 0 mismatches
[2026-10-07T19:06:42Z] p105915-attack-f8 distinct lines per hash: n 16777216 min 1008 p1 1023 median 1024 p99 1024 max 1024 mean 1023.8710
[2026-10-07T19:06:42Z] p105915-attack-f8 distinct items per hash: n 16777216 min 126 p1 128 median 128 p99 128 max 128 mean 127.9995
[2026-10-07T19:06:42Z] p105915-attack-f8 distinct lines per warp: n 524288 min 32566 p1 32605 median 32636 p99 32664 max 32690 mean 32636.0353
[2026-10-07T19:06:42Z] p105915-attack-f8 distinct items per warp: n 524288 min 4089 p1 4093 median 4096 p99 4096 max 4096 mean 4095.4568
[2026-10-07T19:06:42Z] uniform expectation: distinct lines per hash 1023.875 of 1024 reads, per warp 32640.3 of 32768 reads (2^22 lines); distinct items per hash 127.9995 of 128, per warp 4095.50 of 4096 (2^24 items)
[2026-10-07T19:06:42Z] positions: largest hi16-bucket (256 items) share 0.0075% at p9 (iteration 0, site 9, instr 38); windowed expectation 0.0061%; largest saturated-source share 0.0000% at p105 (site 9, instr 38)
[2026-10-07T19:06:42Z] acceptance-style (2,048 evaluations, the rule's sample size): the most repeated address at one position 2 of 2048 at p4 (site 4, instr 16); saturated sources at one position 0 of 2048 at p0 (site 0, instr 7); uniform expectation: repeats 1 to 2, saturated 0
[2026-10-07T19:06:42Z] p105915-attack-f8 item histogram (flat): bins 16777216 reads 2147483648 mean 128.000 sigma 11.314 max 444 (bin 8388614) z_max +27.93 min 33 z_min -8.40 chi2/dof 12.38838 chi2_z +32984.27 top0.1% 0.22714% top0.5% 0.97886% top1% 1.80875%
[2026-10-07T19:06:43Z] p105915-attack-f8 item histogram against the window density: full 2^24 chi2/dof 1.74805 largest 444 (item 0x800006) at +23.68 sigma smallest at -5.43; buckets64 chi2/dof 2.08357 largest 11565 (bucket 131072) at +18.63 sigma smallest at -5.24
[2026-10-07T19:06:49Z] p105915-attack-f8 WINDOWED CONTROL item histogram (flat): bins 16777216 reads 2147483648 mean 128.000 sigma 11.314 max 238 (bin 6701937) z_max +9.72 min 33 z_min -8.40 chi2/dof 11.50029 chi2_z +30412.08 top0.1% 0.16233% top0.5% 0.78240% top1% 1.53646%
[2026-10-07T19:06:49Z] p105915-attack-f8 WINDOWED CONTROL against the window density: full chi2/dof 1.00041 largest +5.42 sigma; buckets64 chi2/dof 0.99849 largest +4.38 smallest -4.39
[2026-10-07T19:06:49Z] 6-sigma p105915-attack-f8 items buckets64 against the window density: largest bucket +18.63 sigma, smallest -5.24 -> FLAGGED (beyond 6 sigma)
[2026-10-07T19:06:49Z] hot-set p105915-attack-f8 items (windowed control): f 0.1% S_f 0.22714% E_f(control) 0.16233% X_f +0.06481% X_f/f +0.6481 -> no hot set
[2026-10-07T19:06:49Z] hot-set p105915-attack-f8 items (windowed control): f 0.5% S_f 0.97886% E_f(control) 0.78240% X_f +0.19646% X_f/f +0.3929 -> no hot set
[2026-10-07T19:06:49Z] hot-set p105915-attack-f8 items (windowed control): f 1.0% S_f 1.80875% E_f(control) 1.53646% X_f +0.27229% X_f/f +0.2723 -> no hot set
[2026-10-07T19:06:49Z] hot-set p105915-attack-f8 items (windowed control): verdict clear
[2026-10-07T19:06:54Z] p105915-attack-f8 FLAT CONTROL item histogram: bins 16777216 reads 2147483648 mean 128.000 sigma 11.314 max 191 (bin 1122696) z_max +5.57 min 69 z_min -5.21 chi2/dof 0.99975 chi2_z -0.72 top0.1% 0.13106% top0.5% 0.63246% top1% 1.24326%
[2026-10-07T19:06:54Z] hot-set p105915-attack-f8 items (flat control, the auditor's first view): f 0.1% S_f 0.22714% E_f(control) 0.13106% X_f +0.09608% X_f/f +0.9608 -> no hot set
[2026-10-07T19:06:54Z] hot-set p105915-attack-f8 items (flat control, the auditor's first view): f 0.5% S_f 0.97886% E_f(control) 0.63246% X_f +0.34640% X_f/f +0.6928 -> no hot set
[2026-10-07T19:06:54Z] hot-set p105915-attack-f8 items (flat control, the auditor's first view): f 1.0% S_f 1.80875% E_f(control) 1.24326% X_f +0.56550% X_f/f +0.5655 -> no hot set
[2026-10-07T19:06:54Z] hot-set p105915-attack-f8 items (flat control, the auditor's first view): verdict clear
[2026-10-07T19:06:54Z] ratio p105915-attack-f8: top 0.1% / 0.5% / 1% share over the WINDOW-MODEL control 1.3993x / 1.2511x / 1.1772x (gate 1.2x at 0.1%: BEYOND); over the FLAT control 1.7331x / 1.5477x / 1.4549x
[2026-10-07T19:06:54Z] hottest item p105915-attack-f8 (0x800006): 444 reads (0.0000% of all); predicted source none
[2026-10-07T19:06:54Z] program p105915-attack-f8 DONE: 16777216 nonces; 6-sigma (windowed) FLAGGED; hot-set clear; verdict FLAGGED
[2026-10-07T19:06:54Z] attack-f8 0.1.0 (igneum-pow 4); args ["warps", "--program", "5133", "--nonces", "16777216", "--threads", "32", "--out", "/srv/builds/_adv-adv-accept/live", "--validate", "sample"]
[2026-10-07T19:06:54Z] census warps: programs [5133] day 20730 nonces 16777216 threads 32 plant none validate sample check_every 997 diag false
[2026-10-07T19:06:55Z] day 20730: cache filled in 0.66 s, fnv 448274a57f508cbc
[2026-10-07T19:06:59Z] table: 16777216 items derived with their 8 lines in 3.8 s; library comparison sample (0 mismatches)
[2026-10-07T19:07:03Z] program p5133-attack-f8: epoch seed 88bef1a847398bd99eb0b75e5225eab6503b799b42114fe5f39e294fae736b37 era seed 0b69786486999afdd27dff870884916b7509e89effd409dda183e5f8a944f07d id 7de789c76e3c8c92 attempt 0 class mx8-eraec34be39+sh256x27 op mix load=16 add=10 mul=8 rotr=6 mad=5 shfl=5 xor=5 mulhi=4 or=2 sub=2 rotl=1; era stride mul 0x9868e497 rot 30 interleave [3, 9, 10, 15] windows 1:1:1 7:2:3 13:2:2 15:1:1 23:1:1 38:0:0 41:2:1 42:1:1 44:2:3 46:1:0 49:0:0 52:0:0 55:1:1 56:0:0 59:2:3 63:0:0
[2026-10-07T19:07:03Z] load site instr 1: src r6 win 1 off 1; last base writer shfl at 0; writers back to the last injecting one: shfl@0; shadow writes of r6 per rep: add=5 mad=3 mul=2 mulhi=3 or=1 rotl=2 rotr=2 shfl=3 sub=4 xor=3
[2026-10-07T19:07:03Z] load site instr 7: src r7 win 2 off 3; last base writer mad at 6; writers back to the last injecting one: mad@6; shadow writes of r7 per rep: add=5 mad=4 mul=4 mulhi=4 or=3 rotl=2 rotr=5 shfl=4 sub=4 xor=4
[2026-10-07T19:07:03Z] load site instr 13: src r5 win 2 off 2; last base writer load at 7; writers back to the last injecting one: load@7; shadow writes of r5 per rep: add=9 mad=3 mul=5 mulhi=2 or=4 rotl=3 rotr=5 shfl=3 sub=4 xor=4
[2026-10-07T19:07:03Z] load site instr 15: src r2 win 1 off 1; last base writer sub at 5; writers back to the last injecting one: sub@5; shadow writes of r2 per rep: add=5 mad=2 mul=4 mulhi=2 or=1 rotl=6 rotr=1 shfl=6 sub=3 xor=2
[2026-10-07T19:07:03Z] load site instr 23: src r3 win 1 off 1; last base writer shfl at 19; writers back to the last injecting one: shfl@19; shadow writes of r3 per rep: add=7 mad=1 mul=1 mulhi=2 rotl=1 rotr=3 shfl=1 sub=2 xor=4
[2026-10-07T19:07:03Z] load site instr 38: src r4 win 0 off 0; last base writer mad at 29; writers back to the last injecting one: mad@29; shadow writes of r4 per rep: add=8 mad=5 mul=3 mulhi=3 or=3 rotl=2 rotr=2 shfl=7 sub=1 xor=4
[2026-10-07T19:07:03Z] load site instr 41: src r2 win 2 off 1; last base writer add at 26; writers back to the last injecting one: add@26; shadow writes of r2 per rep: add=5 mad=2 mul=4 mulhi=2 or=1 rotl=6 rotr=1 shfl=6 sub=3 xor=2
[2026-10-07T19:07:03Z] load site instr 42: src r1 win 1 off 1; last base writer xor at 39; writers back to the last injecting one: xor@39; shadow writes of r1 per rep: add=5 mad=5 mul=2 mulhi=1 or=1 rotl=5 rotr=1 shfl=4 sub=2 xor=4
[2026-10-07T19:07:03Z] load site instr 44: src r5 win 2 off 3; last base writer rotr at 43; writers back to the last injecting one: rotr@43 load@38; shadow writes of r5 per rep: add=9 mad=3 mul=5 mulhi=2 or=4 rotl=3 rotr=5 shfl=3 sub=4 xor=4
[2026-10-07T19:07:03Z] load site instr 46: src r2 win 1 off 0; last base writer load at 44; writers back to the last injecting one: load@44; shadow writes of r2 per rep: add=5 mad=2 mul=4 mulhi=2 or=1 rotl=6 rotr=1 shfl=6 sub=3 xor=2
[2026-10-07T19:07:03Z] load site instr 49: src r4 win 0 off 0; last base writer shfl at 48; writers back to the last injecting one: shfl@48; shadow writes of r4 per rep: add=8 mad=5 mul=3 mulhi=3 or=3 rotl=2 rotr=2 shfl=7 sub=1 xor=4
[2026-10-07T19:07:03Z] load site instr 52: src r3 win 0 off 0; last base writer load at 49; writers back to the last injecting one: load@49; shadow writes of r3 per rep: add=7 mad=1 mul=1 mulhi=2 rotl=1 rotr=3 shfl=1 sub=2 xor=4
[2026-10-07T19:07:03Z] load site instr 55: src r3 win 1 off 1; last base writer xor at 54; writers back to the last injecting one: xor@54; shadow writes of r3 per rep: add=7 mad=1 mul=1 mulhi=2 rotl=1 rotr=3 shfl=1 sub=2 xor=4
[2026-10-07T19:07:03Z] load site instr 56: src r7 win 0 off 0; last base writer rotr at 47; writers back to the last injecting one: rotr@47 add@45; shadow writes of r7 per rep: add=5 mad=4 mul=4 mulhi=4 or=3 rotl=2 rotr=5 shfl=4 sub=4 xor=4
[2026-10-07T19:07:03Z] load site instr 59: src r1 win 2 off 3; last base writer load at 52; writers back to the last injecting one: load@52; shadow writes of r1 per rep: add=5 mad=5 mul=2 mulhi=1 or=1 rotl=5 rotr=1 shfl=4 sub=2 xor=4
[2026-10-07T19:07:03Z] load site instr 63: src r2 win 0 off 0; last base writer add at 60; writers back to the last injecting one: add@60; shadow writes of r2 per rep: add=5 mad=2 mul=4 mulhi=2 or=1 rotl=6 rotr=1 shfl=6 sub=3 xor=2
[2026-10-07T19:07:03Z] window layer: site item windows (first, items) (0x800000,2^23) (0xc00000,2^22) (0x800000,2^22) (0x800000,2^23) (0x800000,2^23) (0x0,2^24) (0x400000,2^22) (0x800000,2^23) (0xc00000,2^22) (0x0,2^23) (0x0,2^24) (0x0,2^24) (0x800000,2^23) (0x0,2^24) (0xc00000,2^22) (0x0,2^24); expected reads per item by quarter 56.000 88.000 152.000 216.000 (flat uniform 128.000)
[2026-10-07T19:09:04Z] 524288 warps (16777216 nonces) interpreted in 121.3 s (7.404 ms per warp per thread); Epoch::hash_warp agreement on 589 warps: 0 mismatches
[2026-10-07T19:09:04Z] p5133-attack-f8 distinct lines per hash: n 16777216 min 1008 p1 1023 median 1024 p99 1024 max 1024 mean 1023.8705
[2026-10-07T19:09:04Z] p5133-attack-f8 distinct items per hash: n 16777216 min 126 p1 128 median 128 p99 128 max 128 mean 127.9994
[2026-10-07T19:09:04Z] p5133-attack-f8 distinct lines per warp: n 524288 min 32570 p1 32604 median 32636 p99 32664 max 32691 mean 32635.4745
[2026-10-07T19:09:04Z] p5133-attack-f8 distinct items per warp: n 524288 min 4089 p1 4093 median 4096 p99 4096 max 4096 mean 4095.3838
[2026-10-07T19:09:04Z] uniform expectation: distinct lines per hash 1023.875 of 1024 reads, per warp 32640.3 of 32768 reads (2^22 lines); distinct items per hash 127.9995 of 128, per warp 4095.50 of 4096 (2^24 items)
[2026-10-07T19:09:04Z] positions: largest hi16-bucket (256 items) share 0.0070% at p70 (iteration 4, site 6, instr 41); windowed expectation 0.0061%; largest saturated-source share 0.0000% at p0 (site 0, instr 1)
[2026-10-07T19:09:05Z] acceptance-style (2,048 evaluations, the rule's sample size): the most repeated address at one position 2 of 2048 at p0 (site 0, instr 1); saturated sources at one position 0 of 2048 at p0 (site 0, instr 1); uniform expectation: repeats 1 to 2, saturated 0
[2026-10-07T19:09:05Z] p5133-attack-f8 item histogram (flat): bins 16777216 reads 2147483648 mean 128.000 sigma 11.314 max 308 (bin 15670016) z_max +15.91 min 22 z_min -9.37 chi2/dof 30.60000 chi2_z +85730.76 top0.1% 0.20816% top0.5% 1.00316% top1% 1.96963%
[2026-10-07T19:09:05Z] p5133-attack-f8 item histogram against the window density: full 2^24 chi2/dof 1.06440 largest 308 (item 0xef1b00) at +6.26 sigma smallest at -5.04; buckets64 chi2/dof 1.00775 largest 5991 (bucket 118087) at +4.78 sigma smallest at -4.28
[2026-10-07T19:09:10Z] p5133-attack-f8 WINDOWED CONTROL item histogram (flat): bins 16777216 reads 2147483648 mean 128.000 sigma 11.314 max 291 (bin 13638732) z_max +14.41 min 22 z_min -9.37 chi2/dof 30.50030 chi2_z +85441.98 top0.1% 0.20378% top0.5% 0.98610% top1% 1.94005%
[2026-10-07T19:09:10Z] p5133-attack-f8 WINDOWED CONTROL against the window density: full chi2/dof 1.00047 largest +6.15 sigma; buckets64 chi2/dof 0.99813 largest +4.68 smallest -4.53
[2026-10-07T19:09:10Z] 6-sigma p5133-attack-f8 items buckets64 against the window density: largest bucket +4.78 sigma, smallest -4.28 -> within 6 sigma
[2026-10-07T19:09:10Z] hot-set p5133-attack-f8 items (windowed control): f 0.1% S_f 0.20816% E_f(control) 0.20378% X_f +0.00439% X_f/f +0.0439 -> no hot set
[2026-10-07T19:09:10Z] hot-set p5133-attack-f8 items (windowed control): f 0.5% S_f 1.00316% E_f(control) 0.98610% X_f +0.01706% X_f/f +0.0341 -> no hot set
[2026-10-07T19:09:10Z] hot-set p5133-attack-f8 items (windowed control): f 1.0% S_f 1.96963% E_f(control) 1.94005% X_f +0.02958% X_f/f +0.0296 -> no hot set
[2026-10-07T19:09:10Z] hot-set p5133-attack-f8 items (windowed control): verdict clear
[2026-10-07T19:09:15Z] p5133-attack-f8 FLAT CONTROL item histogram: bins 16777216 reads 2147483648 mean 128.000 sigma 11.314 max 193 (bin 15793706) z_max +5.75 min 69 z_min -5.21 chi2/dof 1.00003 chi2_z +0.08 top0.1% 0.13107% top0.5% 0.63246% top1% 1.24334%
[2026-10-07T19:09:15Z] hot-set p5133-attack-f8 items (flat control, the auditor's first view): f 0.1% S_f 0.20816% E_f(control) 0.13107% X_f +0.07709% X_f/f +0.7709 -> no hot set
[2026-10-07T19:09:15Z] hot-set p5133-attack-f8 items (flat control, the auditor's first view): f 0.5% S_f 1.00316% E_f(control) 0.63246% X_f +0.37071% X_f/f +0.7414 -> no hot set
[2026-10-07T19:09:15Z] hot-set p5133-attack-f8 items (flat control, the auditor's first view): f 1.0% S_f 1.96963% E_f(control) 1.24334% X_f +0.72629% X_f/f +0.7263 -> no hot set
[2026-10-07T19:09:15Z] hot-set p5133-attack-f8 items (flat control, the auditor's first view): verdict clear
[2026-10-07T19:09:15Z] ratio p5133-attack-f8: top 0.1% / 0.5% / 1% share over the WINDOW-MODEL control 1.0215x / 1.0173x / 1.0152x (gate 1.2x at 0.1%: within); over the FLAT control 1.5882x / 1.5861x / 1.5841x
[2026-10-07T19:09:16Z] hottest item p5133-attack-f8 (0xef1b00): 308 reads (0.0000% of all); predicted source none
[2026-10-07T19:09:16Z] program p5133-attack-f8 DONE: 16777216 nonces; 6-sigma (windowed) clear; hot-set clear; verdict PASS (no test fired)
[2026-10-07T19:09:16Z] attack-f8 0.1.0 (igneum-pow 4); args ["warps", "--program", "1932", "--nonces", "16777216", "--threads", "32", "--out", "/srv/builds/_adv-adv-accept/live", "--validate", "sample"]
[2026-10-07T19:09:16Z] census warps: programs [1932] day 20730 nonces 16777216 threads 32 plant none validate sample check_every 997 diag false
[2026-10-07T19:09:17Z] day 20730: cache filled in 0.63 s, fnv 448274a57f508cbc
[2026-10-07T19:09:21Z] table: 16777216 items derived with their 8 lines in 3.7 s; library comparison sample (0 mismatches)
[2026-10-07T19:09:29Z] program p1932-attack-f8: epoch seed 39bbff498a9786a2faf68db47b10749f60a22fb57420e1dad6c26ab8c64ba6fc era seed 350b11c6ab4b3fa2a555f444f040c78c6ffb8ce3b07697cb8bce3f45c3b950cb id 9b4b0db53f18f037 attempt 14 class mx8-era0f2bb52d+sh256x27 op mix load=16 add=8 rotl=7 rotr=7 mul=6 xor=5 or=4 mulhi=3 shfl=3 sub=3 mad=2; era stride mul 0xe1a22e51 rot 5 interleave [7, 9, 10, 12] windows 3:2:2 5:2:3 7:2:0 10:2:3 12:1:1 18:2:2 26:0:0 29:2:1 38:1:0 39:2:2 42:0:0 44:0:0 50:0:0 53:1:1 57:2:1 61:0:0
[2026-10-07T19:09:29Z] load site instr 3: src r6 win 2 off 2; last base writer rotl at 2; writers back to the last injecting one: rotl@2 add@55; shadow writes of r6 per rep: add=1 mad=4 mul=3 mulhi=1 or=2 rotl=4 rotr=3 sub=3 xor=7
[2026-10-07T19:09:29Z] load site instr 5: src r2 win 2 off 3; last base writer load at 3; writers back to the last injecting one: load@3; shadow writes of r2 per rep: add=4 mad=2 mul=2 mulhi=2 or=4 rotl=6 shfl=4 sub=2 xor=1
[2026-10-07T19:09:29Z] load site instr 7: src r7 win 2 off 0; last base writer rotr at 6; writers back to the last injecting one: rotr@6 mulhi@62 mul@60 mul@59 load@53; shadow writes of r7 per rep: add=8 mad=5 mul=4 mulhi=1 rotl=2 rotr=3 shfl=5 sub=3 xor=3
[2026-10-07T19:09:29Z] load site instr 10: src r6 win 2 off 3; last base writer load at 7; writers back to the last injecting one: load@7; shadow writes of r6 per rep: add=1 mad=4 mul=3 mulhi=1 or=2 rotl=4 rotr=3 sub=3 xor=7
[2026-10-07T19:09:29Z] load site instr 12: src r0 win 1 off 1; last base writer rotl at 8; writers back to the last injecting one: rotl@8 load@5; shadow writes of r0 per rep: add=8 mad=2 mul=3 mulhi=3 or=2 rotl=5 rotr=2 shfl=3 sub=2 xor=5
[2026-10-07T19:09:29Z] load site instr 18: src r2 win 2 off 2; last base writer sub at 9; writers back to the last injecting one: sub@9; shadow writes of r2 per rep: add=4 mad=2 mul=2 mulhi=2 or=4 rotl=6 shfl=4 sub=2 xor=1
[2026-10-07T19:09:29Z] load site instr 26: src r7 win 0 off 0; last base writer rotl at 22; writers back to the last injecting one: rotl@22 rotr@19 rotr@6 mulhi@62 mul@60 mul@59 load@53; shadow writes of r7 per rep: add=8 mad=5 mul=4 mulhi=1 rotl=2 rotr=3 shfl=5 sub=3 xor=3
[2026-10-07T19:09:29Z] load site instr 29: src r1 win 2 off 1; last base writer load at 26; writers back to the last injecting one: load@26; shadow writes of r1 per rep: add=2 mad=5 mul=4 mulhi=7 or=1 rotl=2 rotr=4 shfl=3 sub=4 xor=5
[2026-10-07T19:09:29Z] load site instr 38: src r4 win 1 off 0; last base writer xor at 36; writers back to the last injecting one: xor@36; shadow writes of r4 per rep: add=4 mad=3 mul=9 mulhi=6 or=2 rotl=4 rotr=1 shfl=2 sub=3 xor=4
[2026-10-07T19:09:29Z] load site instr 39: src r2 win 2 off 2; last base writer rotl at 37; writers back to the last injecting one: rotl@37 mad@32; shadow writes of r2 per rep: add=4 mad=2 mul=2 mulhi=2 or=4 rotl=6 shfl=4 sub=2 xor=1
[2026-10-07T19:09:29Z] load site instr 42: src r1 win 0 off 0; last base writer add at 33; writers back to the last injecting one: add@33; shadow writes of r1 per rep: add=2 mad=5 mul=4 mulhi=7 or=1 rotl=2 rotr=4 shfl=3 sub=4 xor=5
[2026-10-07T19:09:29Z] load site instr 44: src r7 win 0 off 0; last base writer load at 39; writers back to the last injecting one: load@39; shadow writes of r7 per rep: add=8 mad=5 mul=4 mulhi=1 rotl=2 rotr=3 shfl=5 sub=3 xor=3
[2026-10-07T19:09:29Z] load site instr 50: src r3 win 0 off 0; last base writer sub at 24; writers back to the last injecting one: sub@24; shadow writes of r3 per rep: add=5 mad=7 mul=2 mulhi=2 or=1 rotl=3 rotr=4 shfl=1 sub=4 xor=3
[2026-10-07T19:09:29Z] load site instr 53: src r4 win 1 off 1; last base writer xor at 52; writers back to the last injecting one: xor@52; shadow writes of r4 per rep: add=4 mad=3 mul=9 mulhi=6 or=2 rotl=4 rotr=1 shfl=2 sub=3 xor=4
[2026-10-07T19:09:29Z] load site instr 57: src r1 win 2 off 1; last base writer load at 50; writers back to the last injecting one: load@50; shadow writes of r1 per rep: add=2 mad=5 mul=4 mulhi=7 or=1 rotl=2 rotr=4 shfl=3 sub=4 xor=5
[2026-10-07T19:09:29Z] load site instr 61: src r6 win 0 off 0; last base writer add at 55; writers back to the last injecting one: add@55; shadow writes of r6 per rep: add=1 mad=4 mul=3 mulhi=1 or=2 rotl=4 rotr=3 sub=3 xor=7
[2026-10-07T19:09:29Z] window layer: site item windows (first, items) (0x800000,2^22) (0xc00000,2^22) (0x0,2^22) (0xc00000,2^22) (0x800000,2^23) (0x800000,2^22) (0x0,2^24) (0x400000,2^22) (0x0,2^23) (0x800000,2^22) (0x0,2^24) (0x0,2^24) (0x0,2^24) (0x800000,2^23) (0x400000,2^22) (0x0,2^24); expected reads per item by quarter 88.000 120.000 168.000 136.000 (flat uniform 128.000)
[2026-10-07T19:11:37Z] 524288 warps (16777216 nonces) interpreted in 128.5 s (7.844 ms per warp per thread); Epoch::hash_warp agreement on 589 warps: 0 mismatches
[2026-10-07T19:11:37Z] p1932-attack-f8 distinct lines per hash: n 16777216 min 992 p1 1016 median 1024 p99 1024 max 1024 mean 1023.3717
[2026-10-07T19:11:37Z] p1932-attack-f8 distinct items per hash: n 16777216 min 124 p1 127 median 128 p99 128 max 128 mean 127.9370
[2026-10-07T19:11:37Z] p1932-attack-f8 distinct lines per warp: n 524288 min 32525 p1 32578 median 32621 p99 32656 max 32685 mean 32620.3185
[2026-10-07T19:11:37Z] p1932-attack-f8 distinct items per warp: n 524288 min 4083 p1 4089 median 4094 p99 4096 max 4096 mean 4093.4767
[2026-10-07T19:11:37Z] uniform expectation: distinct lines per hash 1023.875 of 1024 reads, per warp 32640.3 of 32768 reads (2^22 lines); distinct items per hash 127.9995 of 128, per warp 4095.50 of 4096 (2^24 items)
[2026-10-07T19:11:37Z] positions: largest hi16-bucket (256 items) share 0.0070% at p17 (iteration 1, site 1, instr 5); windowed expectation 0.0061%; largest saturated-source share 0.0000% at p75 (site 11, instr 44)
[2026-10-07T19:11:37Z] acceptance-style (2,048 evaluations, the rule's sample size): the most repeated address at one position 2 of 2048 at p0 (site 0, instr 3); saturated sources at one position 0 of 2048 at p0 (site 0, instr 3); uniform expectation: repeats 1 to 2, saturated 0
[2026-10-07T19:11:37Z] p1932-attack-f8 item histogram (flat): bins 16777216 reads 2147483648 mean 128.000 sigma 11.314 max 238 (bin 11443406) z_max +9.72 min 47 z_min -7.16 chi2/dof 7.52986 chi2_z +18912.51 top0.1% 0.16262% top0.5% 0.78355% top1% 1.53821%
[2026-10-07T19:11:38Z] p1932-attack-f8 item histogram against the window density: full 2^24 chi2/dof 1.03194 largest 183 (item 0x78e1fd) at +5.75 sigma smallest at -5.06; buckets64 chi2/dof 2.14354 largest 8255 (bucket 91915) at +6.56 sigma smallest at -5.64
[2026-10-07T19:11:43Z] p1932-attack-f8 WINDOWED CONTROL item histogram (flat): bins 16777216 reads 2147483648 mean 128.000 sigma 11.314 max 234 (bin 10462631) z_max +9.37 min 45 z_min -7.34 chi2/dof 7.50078 chi2_z +18828.28 top0.1% 0.16223% top0.5% 0.78189% top1% 1.53527%
[2026-10-07T19:11:43Z] p1932-attack-f8 WINDOWED CONTROL against the window density: full chi2/dof 0.99993 largest +6.12 sigma; buckets64 chi2/dof 0.99950 largest +4.38 smallest -4.53
[2026-10-07T19:11:43Z] 6-sigma p1932-attack-f8 items buckets64 against the window density: largest bucket +6.56 sigma, smallest -5.64 -> FLAGGED (beyond 6 sigma)
[2026-10-07T19:11:43Z] hot-set p1932-attack-f8 items (windowed control): f 0.1% S_f 0.16262% E_f(control) 0.16223% X_f +0.00040% X_f/f +0.0040 -> no hot set
[2026-10-07T19:11:43Z] hot-set p1932-attack-f8 items (windowed control): f 0.5% S_f 0.78355% E_f(control) 0.78189% X_f +0.00166% X_f/f +0.0033 -> no hot set
[2026-10-07T19:11:43Z] hot-set p1932-attack-f8 items (windowed control): f 1.0% S_f 1.53821% E_f(control) 1.53527% X_f +0.00293% X_f/f +0.0029 -> no hot set
[2026-10-07T19:11:43Z] hot-set p1932-attack-f8 items (windowed control): verdict clear
[2026-10-07T19:11:48Z] p1932-attack-f8 FLAT CONTROL item histogram: bins 16777216 reads 2147483648 mean 128.000 sigma 11.314 max 190 (bin 14492666) z_max +5.48 min 74 z_min -4.77 chi2/dof 1.00029 chi2_z +0.84 top0.1% 0.13105% top0.5% 0.63244% top1% 1.24333%
[2026-10-07T19:11:48Z] hot-set p1932-attack-f8 items (flat control, the auditor's first view): f 0.1% S_f 0.16262% E_f(control) 0.13105% X_f +0.03158% X_f/f +0.3158 -> no hot set
[2026-10-07T19:11:48Z] hot-set p1932-attack-f8 items (flat control, the auditor's first view): f 0.5% S_f 0.78355% E_f(control) 0.63244% X_f +0.15111% X_f/f +0.3022 -> no hot set
[2026-10-07T19:11:48Z] hot-set p1932-attack-f8 items (flat control, the auditor's first view): f 1.0% S_f 1.53821% E_f(control) 1.24333% X_f +0.29488% X_f/f +0.2949 -> no hot set
[2026-10-07T19:11:48Z] hot-set p1932-attack-f8 items (flat control, the auditor's first view): verdict clear
[2026-10-07T19:11:48Z] ratio p1932-attack-f8: top 0.1% / 0.5% / 1% share over the WINDOW-MODEL control 1.0024x / 1.0021x / 1.0019x (gate 1.2x at 0.1%: within); over the FLAT control 1.2410x / 1.2389x / 1.2372x
[2026-10-07T19:11:48Z] hottest item p1932-attack-f8 (0xae9cce): 238 reads (0.0000% of all); predicted source none
[2026-10-07T19:11:48Z] program p1932-attack-f8 DONE: 16777216 nonces; 6-sigma (windowed) FLAGGED; hot-set clear; verdict FLAGGED
[2026-10-07T19:11:48Z] attack-f8 0.1.0 (igneum-pow 4); args ["warps", "--program", "2328", "--nonces", "16777216", "--threads", "32", "--out", "/srv/builds/_adv-adv-accept/live", "--validate", "sample"]
[2026-10-07T19:11:48Z] census warps: programs [2328] day 20730 nonces 16777216 threads 32 plant none validate sample check_every 997 diag false
[2026-10-07T19:11:49Z] day 20730: cache filled in 0.62 s, fnv 448274a57f508cbc
[2026-10-07T19:11:52Z] table: 16777216 items derived with their 8 lines in 3.4 s; library comparison sample (0 mismatches)
[2026-10-07T19:11:57Z] program p2328-attack-f8: epoch seed f43db19c8c4f6e5a8fb8e16012b25df73a08dbf41dec315982e62d3d8da65377 era seed f13df287eea1e66703dd8dc65a403db09a9ef6ace2f71bee3c934eccb0a605ea id eb95eb2f3c188643 attempt 7 class mx8-erabae39f40+sh256x27 op mix load=16 add=10 xor=8 sub=6 mul=5 rotr=4 shfl=4 mulhi=3 or=3 rotl=3 mad=2; era stride mul 0xdb92c45b rot 21 interleave [0, 1, 12, 13] windows 2:2:1 9:1:1 16:2:0 18:0:0 25:0:0 29:1:0 30:0:0 38:1:1 43:0:0 44:0:0 47:1:0 48:2:2 53:1:0 56:2:2 61:0:0 62:1:1
[2026-10-07T19:11:57Z] load site instr 2: src r0 win 2 off 1; last base writer add at 1; writers back to the last injecting one: add@1; shadow writes of r0 per rep: add=5 mad=4 mul=2 mulhi=2 or=3 rotl=4 rotr=2 xor=4
[2026-10-07T19:11:57Z] load site instr 9: src r6 win 1 off 1; last base writer rotl at 7; writers back to the last injecting one: rotl@7 add@4; shadow writes of r6 per rep: add=6 mad=3 mul=1 mulhi=6 or=3 rotl=2 rotr=4 shfl=6 sub=1 xor=7
[2026-10-07T19:11:57Z] load site instr 16: src r0 win 2 off 0; last base writer add at 6; writers back to the last injecting one: add@6; shadow writes of r0 per rep: add=5 mad=4 mul=2 mulhi=2 or=3 rotl=4 rotr=2 xor=4
[2026-10-07T19:11:57Z] load site instr 18: src r4 win 0 off 0; last base writer mad at 5; writers back to the last injecting one: mad@5; shadow writes of r4 per rep: add=5 mad=2 mul=7 mulhi=4 or=1 rotl=4 rotr=2 shfl=4 sub=4 xor=3
[2026-10-07T19:11:57Z] load site instr 25: src r1 win 0 off 0; last base writer sub at 23; writers back to the last injecting one: sub@23; shadow writes of r1 per rep: add=9 mad=2 mul=2 mulhi=3 or=1 rotl=4 rotr=2 shfl=1 sub=3 xor=4
[2026-10-07T19:11:57Z] load site instr 29: src r0 win 1 off 0; last base writer sub at 22; writers back to the last injecting one: sub@22; shadow writes of r0 per rep: add=5 mad=4 mul=2 mulhi=2 or=3 rotl=4 rotr=2 xor=4
[2026-10-07T19:11:57Z] load site instr 30: src r3 win 0 off 0; last base writer load at 29; writers back to the last injecting one: load@29; shadow writes of r3 per rep: add=5 mad=2 mul=2 or=4 rotl=2 rotr=4 shfl=2 sub=1 xor=10
[2026-10-07T19:11:57Z] load site instr 38: src r0 win 1 off 1; last base writer sub at 34; writers back to the last injecting one: sub@34; shadow writes of r0 per rep: add=5 mad=4 mul=2 mulhi=2 or=3 rotl=4 rotr=2 xor=4
[2026-10-07T19:11:57Z] load site instr 43: src r7 win 0 off 0; last base writer shfl at 39; writers back to the last injecting one: shfl@39; shadow writes of r7 per rep: add=2 mad=3 mul=2 mulhi=3 or=1 rotl=4 rotr=1 shfl=4 sub=3 xor=6
[2026-10-07T19:11:57Z] load site instr 44: src r4 win 0 off 0; last base writer xor at 40; writers back to the last injecting one: xor@40; shadow writes of r4 per rep: add=5 mad=2 mul=7 mulhi=4 or=1 rotl=4 rotr=2 shfl=4 sub=4 xor=3
[2026-10-07T19:11:57Z] load site instr 47: src r5 win 1 off 0; last base writer load at 44; writers back to the last injecting one: load@44; shadow writes of r5 per rep: add=4 mad=1 mul=4 mulhi=1 or=1 rotl=5 rotr=1 shfl=1 sub=3 xor=6
[2026-10-07T19:11:57Z] load site instr 48: src r6 win 2 off 2; last base writer load at 43; writers back to the last injecting one: load@43; shadow writes of r6 per rep: add=6 mad=3 mul=1 mulhi=6 or=3 rotl=2 rotr=4 shfl=6 sub=1 xor=7
[2026-10-07T19:11:57Z] load site instr 53: src r2 win 1 off 0; last base writer add at 51; writers back to the last injecting one: add@51; shadow writes of r2 per rep: add=3 mad=4 mul=6 mulhi=2 or=2 rotl=3 rotr=8 shfl=5 sub=1 xor=2
[2026-10-07T19:11:57Z] load site instr 56: src r1 win 2 off 2; last base writer load at 48; writers back to the last injecting one: load@48; shadow writes of r1 per rep: add=9 mad=2 mul=2 mulhi=3 or=1 rotl=4 rotr=2 shfl=1 sub=3 xor=4
[2026-10-07T19:11:57Z] load site instr 61: src r4 win 0 off 0; last base writer rotr at 54; writers back to the last injecting one: rotr@54 xor@40; shadow writes of r4 per rep: add=5 mad=2 mul=7 mulhi=4 or=1 rotl=4 rotr=2 shfl=4 sub=4 xor=3
[2026-10-07T19:11:57Z] load site instr 62: src r0 win 1 off 1; last base writer load at 53; writers back to the last injecting one: load@53; shadow writes of r0 per rep: add=5 mad=4 mul=2 mulhi=2 or=3 rotl=4 rotr=2 xor=4
[2026-10-07T19:11:57Z] window layer: site item windows (first, items) (0x400000,2^22) (0x800000,2^23) (0x0,2^22) (0x0,2^24) (0x0,2^24) (0x0,2^23) (0x0,2^24) (0x800000,2^23) (0x0,2^24) (0x0,2^24) (0x0,2^23) (0x800000,2^22) (0x0,2^23) (0x800000,2^22) (0x0,2^24) (0x800000,2^23); expected reads per item by quarter 128.000 128.000 160.000 96.000 (flat uniform 128.000)
[2026-10-07T19:13:50Z] 524288 warps (16777216 nonces) interpreted in 113.1 s (6.904 ms per warp per thread); Epoch::hash_warp agreement on 589 warps: 0 mismatches
[2026-10-07T19:13:50Z] p2328-attack-f8 distinct lines per hash: n 16777216 min 983 p1 1008 median 1024 p99 1024 max 1024 mean 1021.8722
[2026-10-07T19:13:50Z] p2328-attack-f8 distinct items per hash: n 16777216 min 123 p1 126 median 128 p99 128 max 128 mean 127.7496
[2026-10-07T19:13:50Z] p2328-attack-f8 distinct lines per warp: n 524288 min 32421 p1 32509 median 32574 p99 32627 max 32670 mean 32572.7498
[2026-10-07T19:13:50Z] p2328-attack-f8 distinct items per warp: n 524288 min 4070 p1 4080 median 4088 p99 4093 max 4096 mean 4087.4869
[2026-10-07T19:13:50Z] uniform expectation: distinct lines per hash 1023.875 of 1024 reads, per warp 32640.3 of 32768 reads (2^22 lines); distinct items per hash 127.9995 of 128, per warp 4095.50 of 4096 (2^24 items)
[2026-10-07T19:13:50Z] positions: largest hi16-bucket (256 items) share 0.0070% at p80 (iteration 5, site 0, instr 2); windowed expectation 0.0061%; largest saturated-source share 0.0000% at p49 (site 1, instr 9)
[2026-10-07T19:13:50Z] acceptance-style (2,048 evaluations, the rule's sample size): the most repeated address at one position 2 of 2048 at p29 (site 13, instr 56); saturated sources at one position 0 of 2048 at p0 (site 0, instr 2); uniform expectation: repeats 1 to 2, saturated 0
[2026-10-07T19:13:50Z] p2328-attack-f8 item histogram (flat): bins 16777216 reads 2147483648 mean 128.000 sigma 11.314 max 228 (bin 9020268) z_max +8.84 min 49 z_min -6.98 chi2/dof 5.03123 chi2_z +11675.68 top0.1% 0.15568% top0.5% 0.74945% top1% 1.47064%
[2026-10-07T19:13:50Z] p2328-attack-f8 item histogram against the window density: full 2^24 chi2/dof 1.03285 largest 154 (item 0xe8eced) at +5.92 sigma smallest at -5.21; buckets64 chi2/dof 2.82182 largest 6650 (bucket 197293) at +6.46 sigma smallest at -5.78
[2026-10-07T19:13:55Z] p2328-attack-f8 WINDOWED CONTROL item histogram (flat): bins 16777216 reads 2147483648 mean 128.000 sigma 11.314 max 226 (bin 9162378) z_max +8.66 min 47 z_min -7.16 chi2/dof 5.00128 chi2_z +11588.94 top0.1% 0.15529% top0.5% 0.74795% top1% 1.46807%
[2026-10-07T19:13:55Z] p2328-attack-f8 WINDOWED CONTROL against the window density: full chi2/dof 1.00064 largest +6.63 sigma; buckets64 chi2/dof 1.00345 largest +4.46 smallest -4.34
[2026-10-07T19:13:55Z] 6-sigma p2328-attack-f8 items buckets64 against the window density: largest bucket +6.46 sigma, smallest -5.78 -> FLAGGED (beyond 6 sigma)
[2026-10-07T19:13:55Z] hot-set p2328-attack-f8 items (windowed control): f 0.1% S_f 0.15568% E_f(control) 0.15529% X_f +0.00039% X_f/f +0.0039 -> no hot set
[2026-10-07T19:13:55Z] hot-set p2328-attack-f8 items (windowed control): f 0.5% S_f 0.74945% E_f(control) 0.74795% X_f +0.00150% X_f/f +0.0030 -> no hot set
[2026-10-07T19:13:55Z] hot-set p2328-attack-f8 items (windowed control): f 1.0% S_f 1.47064% E_f(control) 1.46807% X_f +0.00257% X_f/f +0.0026 -> no hot set
[2026-10-07T19:13:55Z] hot-set p2328-attack-f8 items (windowed control): verdict clear
[2026-10-07T19:14:00Z] p2328-attack-f8 FLAT CONTROL item histogram: bins 16777216 reads 2147483648 mean 128.000 sigma 11.314 max 192 (bin 4923434) z_max +5.66 min 73 z_min -4.86 chi2/dof 1.00020 chi2_z +0.57 top0.1% 0.13107% top0.5% 0.63249% top1% 1.24339%
[2026-10-07T19:14:00Z] hot-set p2328-attack-f8 items (flat control, the auditor's first view): f 0.1% S_f 0.15568% E_f(control) 0.13107% X_f +0.02461% X_f/f +0.2461 -> no hot set
[2026-10-07T19:14:00Z] hot-set p2328-attack-f8 items (flat control, the auditor's first view): f 0.5% S_f 0.74945% E_f(control) 0.63249% X_f +0.11696% X_f/f +0.2339 -> no hot set
[2026-10-07T19:14:00Z] hot-set p2328-attack-f8 items (flat control, the auditor's first view): f 1.0% S_f 1.47064% E_f(control) 1.24339% X_f +0.22725% X_f/f +0.2272 -> no hot set
[2026-10-07T19:14:00Z] hot-set p2328-attack-f8 items (flat control, the auditor's first view): verdict clear
[2026-10-07T19:14:00Z] ratio p2328-attack-f8: top 0.1% / 0.5% / 1% share over the WINDOW-MODEL control 1.0025x / 1.0020x / 1.0017x (gate 1.2x at 0.1%: within); over the FLAT control 1.1877x / 1.1849x / 1.1828x
[2026-10-07T19:14:00Z] hottest item p2328-attack-f8 (0x89a36c): 228 reads (0.0000% of all); predicted source none
[2026-10-07T19:14:00Z] program p2328-attack-f8 DONE: 16777216 nonces; 6-sigma (windowed) FLAGGED; hot-set clear; verdict FLAGGED
[2026-10-07T19:14:00Z] attack-f8 0.1.0 (igneum-pow 4); args ["warps", "--program", "3665", "--nonces", "16777216", "--threads", "32", "--out", "/srv/builds/_adv-adv-accept/live", "--validate", "sample"]
[2026-10-07T19:14:00Z] census warps: programs [3665] day 20730 nonces 16777216 threads 32 plant none validate sample check_every 997 diag false
[2026-10-07T19:14:01Z] day 20730: cache filled in 0.62 s, fnv 448274a57f508cbc
[2026-10-07T19:14:05Z] table: 16777216 items derived with their 8 lines in 3.9 s; library comparison sample (0 mismatches)
[2026-10-07T19:14:09Z] program p3665-attack-f8: epoch seed 37359dac4958d4ba6cbcf7779656e6498ebccd3bc9dd184088d326cd4ad1118b era seed e77e64e946a22c24a6f569c7183103bd6e3c691cc2520e9156ea00a707677770 id 93d022aa76d8df35 attempt 0 class mx8-era1f9fdf34+sh256x27 op mix load=16 add=10 mulhi=8 rotr=6 mad=5 mul=5 rotl=4 shfl=4 xor=3 sub=2 or=1; era stride mul 0xab28834f rot 29 interleave [0, 5, 13, 14] windows 6:2:0 12:2:0 20:1:0 21:1:0 26:1:1 28:2:0 29:1:0 31:2:3 33:2:3 35:2:0 40:1:0 41:0:0 53:0:0 54:0:0 55:2:1 58:0:0
[2026-10-07T19:14:09Z] load site instr 6: src r0 win 2 off 0; last base writer rotr at 5; writers back to the last injecting one: rotr@5 add@59; shadow writes of r0 per rep: add=8 mad=4 mul=3 mulhi=1 or=3 rotl=1 rotr=2 shfl=6 sub=5 xor=2
[2026-10-07T19:14:09Z] load site instr 12: src r4 win 2 off 0; last base writer rotr at 10; writers back to the last injecting one: rotr@10 load@6; shadow writes of r4 per rep: add=5 mad=4 mul=2 mulhi=1 or=1 rotl=3 rotr=2 shfl=3 sub=5 xor=4
[2026-10-07T19:14:09Z] load site instr 20: src r7 win 1 off 0; last base writer load at 12; writers back to the last injecting one: load@12; shadow writes of r7 per rep: add=6 mad=2 mul=1 mulhi=5 or=2 rotl=3 rotr=2 shfl=5 sub=3 xor=2
[2026-10-07T19:14:09Z] load site instr 21: src r4 win 1 off 0; last base writer load at 20; writers back to the last injecting one: load@20; shadow writes of r4 per rep: add=5 mad=4 mul=2 mulhi=1 or=1 rotl=3 rotr=2 shfl=3 sub=5 xor=4
[2026-10-07T19:14:09Z] load site instr 26: src r0 win 1 off 1; last base writer rotl at 25; writers back to the last injecting one: rotl@25 rotr@5 add@59; shadow writes of r0 per rep: add=8 mad=4 mul=3 mulhi=1 or=3 rotl=1 rotr=2 shfl=6 sub=5 xor=2
[2026-10-07T19:14:09Z] load site instr 28: src r1 win 2 off 0; last base writer load at 26; writers back to the last injecting one: load@26; shadow writes of r1 per rep: add=5 mul=3 mulhi=3 or=3 rotl=4 rotr=5 shfl=4 sub=3 xor=2
[2026-10-07T19:14:09Z] load site instr 29: src r2 win 1 off 0; last base writer load at 21; writers back to the last injecting one: load@21; shadow writes of r2 per rep: add=2 mad=2 mul=7 mulhi=4 rotl=3 rotr=1 shfl=2 sub=3 xor=2
[2026-10-07T19:14:09Z] load site instr 31: src r2 win 2 off 3; last base writer shfl at 30; writers back to the last injecting one: shfl@30; shadow writes of r2 per rep: add=2 mad=2 mul=7 mulhi=4 rotl=3 rotr=1 shfl=2 sub=3 xor=2
[2026-10-07T19:14:09Z] load site instr 33: src r3 win 2 off 3; last base writer load at 29; writers back to the last injecting one: load@29; shadow writes of r3 per rep: add=5 mad=4 mul=3 mulhi=1 rotl=4 rotr=6 shfl=5 sub=2 xor=3
[2026-10-07T19:14:09Z] load site instr 35: src r6 win 2 off 0; last base writer add at 32; writers back to the last injecting one: add@32; shadow writes of r6 per rep: add=7 mad=7 mul=3 mulhi=3 or=2 rotl=5 rotr=2 shfl=3 sub=5 xor=5
[2026-10-07T19:14:09Z] load site instr 40: src r5 win 1 off 0; last base writer load at 33; writers back to the last injecting one: load@33; shadow writes of r5 per rep: add=4 mad=7 mul=2 mulhi=2 or=2 rotl=3 rotr=1 shfl=3 sub=1 xor=2
[2026-10-07T19:14:09Z] load site instr 41: src r4 win 0 off 0; last base writer add at 38; writers back to the last injecting one: add@38; shadow writes of r4 per rep: add=5 mad=4 mul=2 mulhi=1 or=1 rotl=3 rotr=2 shfl=3 sub=5 xor=4
[2026-10-07T19:14:09Z] load site instr 53: src r2 win 0 off 0; last base writer shfl at 37; writers back to the last injecting one: shfl@37; shadow writes of r2 per rep: add=2 mad=2 mul=7 mulhi=4 rotl=3 rotr=1 shfl=2 sub=3 xor=2
[2026-10-07T19:14:09Z] load site instr 54: src r5 win 0 off 0; last base writer add at 50; writers back to the last injecting one: add@50; shadow writes of r5 per rep: add=4 mad=7 mul=2 mulhi=2 or=2 rotl=3 rotr=1 shfl=3 sub=1 xor=2
[2026-10-07T19:14:09Z] load site instr 55: src r0 win 2 off 1; last base writer load at 54; writers back to the last injecting one: load@54; shadow writes of r0 per rep: add=8 mad=4 mul=3 mulhi=1 or=3 rotl=1 rotr=2 shfl=6 sub=5 xor=2
[2026-10-07T19:14:09Z] load site instr 58: src r4 win 0 off 0; last base writer add at 56; writers back to the last injecting one: add@56; shadow writes of r4 per rep: add=5 mad=4 mul=2 mulhi=1 or=1 rotl=3 rotr=2 shfl=3 sub=5 xor=4
[2026-10-07T19:14:09Z] window layer: site item windows (first, items) (0x0,2^22) (0x0,2^22) (0x0,2^23) (0x0,2^23) (0x800000,2^23) (0x0,2^22) (0x0,2^23) (0xc00000,2^22) (0xc00000,2^22) (0x0,2^22) (0x0,2^23) (0x0,2^24) (0x0,2^24) (0x0,2^24) (0x400000,2^22) (0x0,2^24); expected reads per item by quarter 224.000 128.000 48.000 112.000 (flat uniform 128.000)
[2026-10-07T19:15:45Z] 524288 warps (16777216 nonces) interpreted in 95.9 s (5.854 ms per warp per thread); Epoch::hash_warp agreement on 589 warps: 0 mismatches
[2026-10-07T19:15:45Z] p3665-attack-f8 distinct lines per hash: n 16777216 min 1008 p1 1023 median 1024 p99 1024 max 1024 mean 1023.8704
[2026-10-07T19:15:45Z] p3665-attack-f8 distinct items per hash: n 16777216 min 126 p1 128 median 128 p99 128 max 128 mean 127.9994
[2026-10-07T19:15:45Z] p3665-attack-f8 distinct lines per warp: n 524288 min 32562 p1 32603 median 32636 p99 32663 max 32687 mean 32635.4019
[2026-10-07T19:15:45Z] p3665-attack-f8 distinct items per warp: n 524288 min 4089 p1 4093 median 4096 p99 4096 max 4096 mean 4095.3787
[2026-10-07T19:15:45Z] uniform expectation: distinct lines per hash 1023.875 of 1024 reads, per warp 32640.3 of 32768 reads (2^22 lines); distinct items per hash 127.9995 of 128, per warp 4095.50 of 4096 (2^24 items)
[2026-10-07T19:15:45Z] positions: largest hi16-bucket (256 items) share 0.0071% at p89 (iteration 5, site 9, instr 35); windowed expectation 0.0061%; largest saturated-source share 0.0000% at p0 (site 0, instr 6)
[2026-10-07T19:15:45Z] acceptance-style (2,048 evaluations, the rule's sample size): the most repeated address at one position 2 of 2048 at p4 (site 4, instr 26); saturated sources at one position 0 of 2048 at p0 (site 0, instr 6); uniform expectation: repeats 1 to 2, saturated 0
[2026-10-07T19:15:45Z] p3665-attack-f8 item histogram (flat): bins 16777216 reads 2147483648 mean 128.000 sigma 11.314 max 303 (bin 4096165) z_max +15.47 min 17 z_min -9.81 chi2/dof 31.99982 chi2_z +89785.07 top0.1% 0.21062% top0.5% 1.01966% top1% 2.00673%
[2026-10-07T19:15:46Z] p3665-attack-f8 item histogram against the window density: full 2^24 chi2/dof 1.00012 largest 87 (item 0x992e54) at +5.63 sigma smallest at -5.10; buckets64 chi2/dof 0.99759 largest 8588 (bucket 122860) at +4.38 sigma smallest at -4.39
[2026-10-07T19:15:53Z] p3665-attack-f8 WINDOWED CONTROL item histogram (flat): bins 16777216 reads 2147483648 mean 128.000 sigma 11.314 max 300 (bin 1071717) z_max +15.20 min 18 z_min -9.72 chi2/dof 31.99804 chi2_z +89779.90 top0.1% 0.21059% top0.5% 1.01966% top1% 2.00681%
[2026-10-07T19:15:53Z] p3665-attack-f8 WINDOWED CONTROL against the window density: full chi2/dof 1.00062 largest +5.48 sigma; buckets64 chi2/dof 1.00273 largest +4.79 smallest -4.36
[2026-10-07T19:15:53Z] 6-sigma p3665-attack-f8 items buckets64 against the window density: largest bucket +4.38 sigma, smallest -4.39 -> within 6 sigma
[2026-10-07T19:15:53Z] hot-set p3665-attack-f8 items (windowed control): f 0.1% S_f 0.21062% E_f(control) 0.21059% X_f +0.00003% X_f/f +0.0003 -> no hot set
[2026-10-07T19:15:53Z] hot-set p3665-attack-f8 items (windowed control): f 0.5% S_f 1.01966% E_f(control) 1.01966% X_f +0.00000% X_f/f +0.0000 -> no hot set
[2026-10-07T19:15:53Z] hot-set p3665-attack-f8 items (windowed control): f 1.0% S_f 2.00673% E_f(control) 2.00681% X_f -0.00008% X_f/f -0.0001 -> no hot set
[2026-10-07T19:15:53Z] hot-set p3665-attack-f8 items (windowed control): verdict clear
[2026-10-07T19:15:57Z] p3665-attack-f8 FLAT CONTROL item histogram: bins 16777216 reads 2147483648 mean 128.000 sigma 11.314 max 194 (bin 12718831) z_max +5.83 min 70 z_min -5.13 chi2/dof 1.00045 chi2_z +1.31 top0.1% 0.13114% top0.5% 0.63266% top1% 1.24359%
[2026-10-07T19:15:57Z] hot-set p3665-attack-f8 items (flat control, the auditor's first view): f 0.1% S_f 0.21062% E_f(control) 0.13114% X_f +0.07948% X_f/f +0.7948 -> no hot set
[2026-10-07T19:15:57Z] hot-set p3665-attack-f8 items (flat control, the auditor's first view): f 0.5% S_f 1.01966% E_f(control) 0.63266% X_f +0.38700% X_f/f +0.7740 -> no hot set
[2026-10-07T19:15:57Z] hot-set p3665-attack-f8 items (flat control, the auditor's first view): f 1.0% S_f 2.00673% E_f(control) 1.24359% X_f +0.76313% X_f/f +0.7631 -> no hot set
[2026-10-07T19:15:57Z] hot-set p3665-attack-f8 items (flat control, the auditor's first view): verdict clear
[2026-10-07T19:15:57Z] ratio p3665-attack-f8: top 0.1% / 0.5% / 1% share over the WINDOW-MODEL control 1.0002x / 1.0000x / 1.0000x (gate 1.2x at 0.1%: within); over the FLAT control 1.6061x / 1.6117x / 1.6136x
[2026-10-07T19:15:57Z] hottest item p3665-attack-f8 (0x3e80a5): 303 reads (0.0000% of all); predicted source none
[2026-10-07T19:15:57Z] program p3665-attack-f8 DONE: 16777216 nonces; 6-sigma (windowed) clear; hot-set clear; verdict PASS (no test fired)
[2026-10-07T19:15:58Z] attack-f8 0.1.0 (igneum-pow 4); args ["warps", "--program", "101643", "--nonces", "16777216", "--threads", "32", "--out", "/srv/builds/_adv-adv-accept/live", "--validate", "sample"]
[2026-10-07T19:15:58Z] census warps: programs [101643] day 20730 nonces 16777216 threads 32 plant none validate sample check_every 997 diag false
[2026-10-07T19:15:58Z] day 20730: cache filled in 0.62 s, fnv 448274a57f508cbc
[2026-10-07T19:16:03Z] table: 16777216 items derived with their 8 lines in 3.8 s; library comparison sample (0 mismatches)
[2026-10-07T19:16:07Z] program p101643-attack-f8: epoch seed b72d46bca1aa32e24634866020de56ed1a848cce9e3b64c0a2bb3747e5e1c22d era seed 435a92078a787476afc5e3bd012ae081606b52e13ae4c453c02efc0f8417eb56 id e9a558df620ce023 attempt 2 class mx8-era1cbe27a7+sh256x27 op mix load=16 mad=10 mul=9 xor=7 rotr=5 add=4 shfl=4 mulhi=3 sub=3 rotl=2 or=1; era stride mul 0xb00c2481 rot 1 interleave [9, 11, 12, 14] windows 3:2:2 5:1:1 10:0:0 19:2:1 20:0:0 29:1:1 30:0:0 34:2:0 37:2:1 39:2:2 40:1:1 43:1:0 53:0:0 57:2:2 59:1:1 63:2:0
[2026-10-07T19:16:07Z] load site instr 3: src r4 win 2 off 2; last base writer mad at 0; writers back to the last injecting one: mad@0; shadow writes of r4 per rep: add=4 mul=1 mulhi=5 or=1 rotl=3 rotr=2 shfl=3 sub=3 xor=1
[2026-10-07T19:16:07Z] load site instr 5: src r0 win 1 off 1; last base writer rotr at 2; writers back to the last injecting one: rotr@2 mad@58; shadow writes of r0 per rep: add=5 mad=5 mul=5 mulhi=1 or=2 rotl=3 rotr=8 shfl=8 sub=1 xor=2
[2026-10-07T19:16:07Z] load site instr 10: src r3 win 0 off 0; last base writer rotr at 6; writers back to the last injecting one: rotr@6 xor@4; shadow writes of r3 per rep: add=6 mad=6 mul=5 mulhi=1 rotl=5 rotr=1 shfl=3 sub=1 xor=7
[2026-10-07T19:16:07Z] load site instr 19: src r2 win 2 off 1; last base writer mad at 15; writers back to the last injecting one: mad@15; shadow writes of r2 per rep: add=4 mad=7 mulhi=1 or=2 rotl=4 rotr=2 shfl=6 sub=1 xor=7
[2026-10-07T19:16:07Z] load site instr 20: src r1 win 0 off 0; last base writer shfl at 12; writers back to the last injecting one: shfl@12; shadow writes of r1 per rep: add=3 mad=1 mul=1 mulhi=5 or=2 rotl=1 rotr=2 shfl=5 xor=5
[2026-10-07T19:16:07Z] load site instr 29: src r0 win 1 off 1; last base writer mad at 21; writers back to the last injecting one: mad@21; shadow writes of r0 per rep: add=5 mad=5 mul=5 mulhi=1 or=2 rotl=3 rotr=8 shfl=8 sub=1 xor=2
[2026-10-07T19:16:07Z] load site instr 30: src r5 win 0 off 0; last base writer mad at 18; writers back to the last injecting one: mad@18; shadow writes of r5 per rep: add=1 mad=2 mul=3 mulhi=1 or=4 rotl=2 rotr=1 shfl=10 sub=3 xor=4
[2026-10-07T19:16:07Z] load site instr 34: src r5 win 2 off 0; last base writer rotl at 32; writers back to the last injecting one: rotl@32 mad@18; shadow writes of r5 per rep: add=1 mad=2 mul=3 mulhi=1 or=4 rotl=2 rotr=1 shfl=10 sub=3 xor=4
[2026-10-07T19:16:07Z] load site instr 37: src r6 win 2 off 1; last base writer load at 29; writers back to the last injecting one: load@29; shadow writes of r6 per rep: add=4 mad=3 mul=3 mulhi=1 or=1 rotl=3 rotr=5 shfl=3 sub=6 xor=3
[2026-10-07T19:16:07Z] load site instr 39: src r4 win 2 off 2; last base writer load at 19; writers back to the last injecting one: load@19; shadow writes of r4 per rep: add=4 mul=1 mulhi=5 or=1 rotl=3 rotr=2 shfl=3 sub=3 xor=1
[2026-10-07T19:16:07Z] load site instr 40: src r6 win 1 off 1; last base writer load at 39; writers back to the last injecting one: load@39; shadow writes of r6 per rep: add=4 mad=3 mul=3 mulhi=1 or=1 rotl=3 rotr=5 shfl=3 sub=6 xor=3
[2026-10-07T19:16:07Z] load site instr 43: src r1 win 1 off 0; last base writer load at 37; writers back to the last injecting one: load@37; shadow writes of r1 per rep: add=3 mad=1 mul=1 mulhi=5 or=2 rotl=1 rotr=2 shfl=5 xor=5
[2026-10-07T19:16:07Z] load site instr 53: src r6 win 0 off 0; last base writer shfl at 50; writers back to the last injecting one: shfl@50; shadow writes of r6 per rep: add=4 mad=3 mul=3 mulhi=1 or=1 rotl=3 rotr=5 shfl=3 sub=6 xor=3
[2026-10-07T19:16:07Z] load site instr 57: src r2 win 2 off 2; last base writer add at 51; writers back to the last injecting one: add@51; shadow writes of r2 per rep: add=4 mad=7 mulhi=1 or=2 rotl=4 rotr=2 shfl=6 sub=1 xor=7
[2026-10-07T19:16:07Z] load site instr 59: src r3 win 1 off 1; last base writer xor at 56; writers back to the last injecting one: xor@56; shadow writes of r3 per rep: add=6 mad=6 mul=5 mulhi=1 rotl=5 rotr=1 shfl=3 sub=1 xor=7
[2026-10-07T19:16:07Z] load site instr 63: src r3 win 2 off 0; last base writer shfl at 60; writers back to the last injecting one: shfl@60; shadow writes of r3 per rep: add=6 mad=6 mul=5 mulhi=1 rotl=5 rotr=1 shfl=3 sub=1 xor=7
[2026-10-07T19:16:07Z] window layer: site item windows (first, items) (0x800000,2^22) (0x800000,2^23) (0x0,2^24) (0x400000,2^22) (0x0,2^24) (0x800000,2^23) (0x0,2^24) (0x0,2^22) (0x400000,2^22) (0x800000,2^22) (0x800000,2^23) (0x0,2^23) (0x0,2^24) (0x800000,2^22) (0x800000,2^23) (0x0,2^22); expected reads per item by quarter 112.000 112.000 192.000 96.000 (flat uniform 128.000)
[2026-10-07T19:17:52Z] 524288 warps (16777216 nonces) interpreted in 105.5 s (6.441 ms per warp per thread); Epoch::hash_warp agreement on 589 warps: 0 mismatches
[2026-10-07T19:17:52Z] p101643-attack-f8 distinct lines per hash: n 16777216 min 1008 p1 1023 median 1024 p99 1024 max 1024 mean 1023.8708
[2026-10-07T19:17:52Z] p101643-attack-f8 distinct items per hash: n 16777216 min 126 p1 128 median 128 p99 128 max 128 mean 127.9995
[2026-10-07T19:17:52Z] p101643-attack-f8 distinct lines per warp: n 524288 min 32567 p1 32605 median 32636 p99 32664 max 32691 mean 32636.0413
[2026-10-07T19:17:52Z] p101643-attack-f8 distinct items per warp: n 524288 min 4089 p1 4093 median 4096 p99 4096 max 4096 mean 4095.4577
[2026-10-07T19:17:52Z] uniform expectation: distinct lines per hash 1023.875 of 1024 reads, per warp 32640.3 of 32768 reads (2^22 lines); distinct items per hash 127.9995 of 128, per warp 4095.50 of 4096 (2^24 items)
[2026-10-07T19:17:52Z] positions: largest hi16-bucket (256 items) share 0.0070% at p115 (iteration 7, site 3, instr 19); windowed expectation 0.0061%; largest saturated-source share 0.0000% at p34 (site 2, instr 10)
[2026-10-07T19:17:52Z] acceptance-style (2,048 evaluations, the rule's sample size): the most repeated address at one position 2 of 2048 at p55 (site 7, instr 34); saturated sources at one position 0 of 2048 at p0 (site 0, instr 3); uniform expectation: repeats 1 to 2, saturated 0
[2026-10-07T19:17:52Z] p101643-attack-f8 item histogram (flat): bins 16777216 reads 2147483648 mean 128.000 sigma 11.314 max 267 (bin 8685295) z_max +12.29 min 51 z_min -6.81 chi2/dof 12.18576 chi2_z +32397.43 top0.1% 0.18336% top0.5% 0.88529% top1% 1.73991%
[2026-10-07T19:17:52Z] p101643-attack-f8 item histogram against the window density: full 2^24 chi2/dof 1.21054 largest 189 (item 0x509211) at +7.28 sigma smallest at -5.29; buckets64 chi2/dof 1.03865 largest 7563 (bucket 127304) at +4.67 sigma smallest at -4.61
[2026-10-07T19:17:58Z] p101643-attack-f8 WINDOWED CONTROL item histogram (flat): bins 16777216 reads 2147483648 mean 128.000 sigma 11.314 max 267 (bin 8664019) z_max +12.29 min 52 z_min -6.72 chi2/dof 11.99933 chi2_z +31857.46 top0.1% 0.18304% top0.5% 0.88407% top1% 1.73790%
[2026-10-07T19:17:58Z] p101643-attack-f8 WINDOWED CONTROL against the window density: full chi2/dof 0.99952 largest +6.33 sigma; buckets64 chi2/dof 1.00038 largest +4.57 smallest -4.36
[2026-10-07T19:17:58Z] 6-sigma p101643-attack-f8 items buckets64 against the window density: largest bucket +4.67 sigma, smallest -4.61 -> within 6 sigma
[2026-10-07T19:17:58Z] hot-set p101643-attack-f8 items (windowed control): f 0.1% S_f 0.18336% E_f(control) 0.18304% X_f +0.00032% X_f/f +0.0032 -> no hot set
[2026-10-07T19:17:58Z] hot-set p101643-attack-f8 items (windowed control): f 0.5% S_f 0.88529% E_f(control) 0.88407% X_f +0.00122% X_f/f +0.0024 -> no hot set
[2026-10-07T19:17:58Z] hot-set p101643-attack-f8 items (windowed control): f 1.0% S_f 1.73991% E_f(control) 1.73790% X_f +0.00201% X_f/f +0.0020 -> no hot set
[2026-10-07T19:17:58Z] hot-set p101643-attack-f8 items (windowed control): verdict clear
[2026-10-07T19:18:02Z] p101643-attack-f8 FLAT CONTROL item histogram: bins 16777216 reads 2147483648 mean 128.000 sigma 11.314 max 194 (bin 12764751) z_max +5.83 min 70 z_min -5.13 chi2/dof 0.99996 chi2_z -0.12 top0.1% 0.13108% top0.5% 0.63252% top1% 1.24340%
[2026-10-07T19:18:02Z] hot-set p101643-attack-f8 items (flat control, the auditor's first view): f 0.1% S_f 0.18336% E_f(control) 0.13108% X_f +0.05227% X_f/f +0.5227 -> no hot set
[2026-10-07T19:18:02Z] hot-set p101643-attack-f8 items (flat control, the auditor's first view): f 0.5% S_f 0.88529% E_f(control) 0.63252% X_f +0.25277% X_f/f +0.5055 -> no hot set
[2026-10-07T19:18:02Z] hot-set p101643-attack-f8 items (flat control, the auditor's first view): f 1.0% S_f 1.73991% E_f(control) 1.24340% X_f +0.49651% X_f/f +0.4965 -> no hot set
[2026-10-07T19:18:02Z] hot-set p101643-attack-f8 items (flat control, the auditor's first view): verdict clear
[2026-10-07T19:18:02Z] ratio p101643-attack-f8: top 0.1% / 0.5% / 1% share over the WINDOW-MODEL control 1.0017x / 1.0014x / 1.0012x (gate 1.2x at 0.1%: within); over the FLAT control 1.3988x / 1.3996x / 1.3993x
[2026-10-07T19:18:02Z] hottest item p101643-attack-f8 (0x8486ef): 267 reads (0.0000% of all); predicted source none
[2026-10-07T19:18:02Z] program p101643-attack-f8 DONE: 16777216 nonces; 6-sigma (windowed) clear; hot-set clear; verdict PASS (no test fired)
[2026-10-07T19:18:02Z] attack-f8 0.1.0 (igneum-pow 4); args ["warps", "--program", "1352", "--nonces", "16777216", "--threads", "32", "--out", "/srv/builds/_adv-adv-accept/live", "--validate", "sample"]
[2026-10-07T19:18:02Z] census warps: programs [1352] day 20730 nonces 16777216 threads 32 plant none validate sample check_every 997 diag false
[2026-10-07T19:18:03Z] day 20730: cache filled in 0.64 s, fnv 448274a57f508cbc
[2026-10-07T19:18:07Z] table: 16777216 items derived with their 8 lines in 3.5 s; library comparison sample (0 mismatches)
[2026-10-07T19:18:11Z] program p1352-attack-f8: epoch seed 7763a71c272124cc5d8cc7803c165b67995f36ede78850aa9c1e8f2d7bd626e3 era seed dd07c7a84a36a44738c572882343ab73c7a0e0850129e8dc3c35485d95dfc5d1 id 806f8974326fe3df attempt 2 class mx8-era42be28bf+sh256x27 op mix load=16 add=7 mad=7 mulhi=7 shfl=6 mul=5 or=5 rotr=4 xor=4 sub=2 rotl=1; era stride mul 0xc434723b rot 18 interleave [2, 5, 9, 10] windows 5:1:1 9:0:0 15:1:1 16:2:1 23:0:0 29:1:0 32:2:2 36:0:0 37:1:0 38:2:0 42:2:3 45:0:0 48:1:1 50:0:0 57:2:3 61:0:0
[2026-10-07T19:18:11Z] load site instr 5: src r3 win 1 off 1; last base writer shfl at 1; writers back to the last injecting one: shfl@1; shadow writes of r3 per rep: add=4 mad=6 mul=3 mulhi=2 or=1 rotl=4 rotr=3 shfl=8 sub=1 xor=1
[2026-10-07T19:18:11Z] load site instr 9: src r0 win 0 off 0; last base writer load at 5; writers back to the last injecting one: load@5; shadow writes of r0 per rep: add=1 mad=1 mul=7 or=1 rotl=1 rotr=2 shfl=4 sub=4 xor=6
[2026-10-07T19:18:11Z] load site instr 15: src r1 win 1 off 1; last base writer sub at 13; writers back to the last injecting one: sub@13; shadow writes of r1 per rep: add=4 mad=5 mul=4 mulhi=1 or=3 rotl=4 rotr=4 shfl=2 sub=2 xor=2
[2026-10-07T19:18:11Z] load site instr 16: src r6 win 2 off 1; last base writer load at 15; writers back to the last injecting one: load@15; shadow writes of r6 per rep: add=3 mad=3 mul=2 mulhi=3 or=2 rotl=9 rotr=2 shfl=3 sub=3 xor=5
[2026-10-07T19:18:11Z] load site instr 23: src r5 win 0 off 0; last base writer shfl at 21; writers back to the last injecting one: shfl@21; shadow writes of r5 per rep: add=9 mad=5 mul=3 mulhi=4 or=2 rotl=6 rotr=2 shfl=5 sub=3 xor=3
[2026-10-07T19:18:11Z] load site instr 29: src r2 win 1 off 0; last base writer shfl at 24; writers back to the last injecting one: shfl@24; shadow writes of r2 per rep: add=7 mad=4 mul=6 mulhi=1 or=4 rotl=2 shfl=3 sub=2 xor=1
[2026-10-07T19:18:11Z] load site instr 32: src r7 win 2 off 2; last base writer add at 31; writers back to the last injecting one: add@31; shadow writes of r7 per rep: add=6 mad=3 mul=3 mulhi=3 rotl=6 shfl=2 sub=3 xor=3
[2026-10-07T19:18:11Z] load site instr 36: src r4 win 0 off 0; last base writer add at 25; writers back to the last injecting one: add@25; shadow writes of r4 per rep: add=5 mad=3 mul=2 mulhi=3 or=1 rotl=1 rotr=2 shfl=4 sub=5 xor=3
[2026-10-07T19:18:11Z] load site instr 37: src r7 win 1 off 0; last base writer add at 35; writers back to the last injecting one: add@35; shadow writes of r7 per rep: add=6 mad=3 mul=3 mulhi=3 rotl=6 shfl=2 sub=3 xor=3
[2026-10-07T19:18:11Z] load site instr 38: src r5 win 2 off 0; last base writer load at 36; writers back to the last injecting one: load@36; shadow writes of r5 per rep: add=9 mad=5 mul=3 mulhi=4 or=2 rotl=6 rotr=2 shfl=5 sub=3 xor=3
[2026-10-07T19:18:11Z] load site instr 42: src r6 win 2 off 3; last base writer load at 38; writers back to the last injecting one: load@38; shadow writes of r6 per rep: add=3 mad=3 mul=2 mulhi=3 or=2 rotl=9 rotr=2 shfl=3 sub=3 xor=5
[2026-10-07T19:18:11Z] load site instr 45: src r1 win 0 off 0; last base writer shfl at 39; writers back to the last injecting one: shfl@39; shadow writes of r1 per rep: add=4 mad=5 mul=4 mulhi=1 or=3 rotl=4 rotr=4 shfl=2 sub=2 xor=2
[2026-10-07T19:18:11Z] load site instr 48: src r3 win 1 off 1; last base writer mad at 43; writers back to the last injecting one: mad@43; shadow writes of r3 per rep: add=4 mad=6 mul=3 mulhi=2 or=1 rotl=4 rotr=3 shfl=8 sub=1 xor=1
[2026-10-07T19:18:11Z] load site instr 50: src r1 win 0 off 0; last base writer mad at 46; writers back to the last injecting one: mad@46; shadow writes of r1 per rep: add=4 mad=5 mul=4 mulhi=1 or=3 rotl=4 rotr=4 shfl=2 sub=2 xor=2
[2026-10-07T19:18:11Z] load site instr 57: src r5 win 2 off 3; last base writer add at 54; writers back to the last injecting one: add@54; shadow writes of r5 per rep: add=9 mad=5 mul=3 mulhi=4 or=2 rotl=6 rotr=2 shfl=5 sub=3 xor=3
[2026-10-07T19:18:11Z] load site instr 61: src r2 win 0 off 0; last base writer rotr at 52; writers back to the last injecting one: rotr@52 load@50; shadow writes of r2 per rep: add=7 mad=4 mul=6 mulhi=1 or=4 rotl=2 shfl=3 sub=2 xor=1
[2026-10-07T19:18:11Z] window layer: site item windows (first, items) (0x800000,2^23) (0x0,2^24) (0x800000,2^23) (0x400000,2^22) (0x0,2^24) (0x0,2^23) (0x800000,2^22) (0x0,2^24) (0x0,2^23) (0x0,2^22) (0xc00000,2^22) (0x0,2^24) (0x800000,2^23) (0x0,2^24) (0xc00000,2^22) (0x0,2^24); expected reads per item by quarter 112.000 112.000 128.000 160.000 (flat uniform 128.000)
[2026-10-07T19:19:58Z] 524288 warps (16777216 nonces) interpreted in 106.6 s (6.507 ms per warp per thread); Epoch::hash_warp agreement on 589 warps: 0 mismatches
[2026-10-07T19:19:58Z] p1352-attack-f8 distinct lines per hash: n 16777216 min 1008 p1 1023 median 1024 p99 1024 max 1024 mean 1023.8706
[2026-10-07T19:19:58Z] p1352-attack-f8 distinct items per hash: n 16777216 min 126 p1 128 median 128 p99 128 max 128 mean 127.9994
[2026-10-07T19:19:58Z] p1352-attack-f8 distinct lines per warp: n 524288 min 32566 p1 32605 median 32637 p99 32664 max 32688 mean 32636.2511
[2026-10-07T19:19:58Z] p1352-attack-f8 distinct items per warp: n 524288 min 4089 p1 4093 median 4096 p99 4096 max 4096 mean 4095.4840
[2026-10-07T19:19:58Z] uniform expectation: distinct lines per hash 1023.875 of 1024 reads, per warp 32640.3 of 32768 reads (2^22 lines); distinct items per hash 127.9995 of 128, per warp 4095.50 of 4096 (2^24 items)
[2026-10-07T19:19:58Z] positions: largest hi16-bucket (256 items) share 0.0101% at p60 (iteration 3, site 12, instr 48); windowed expectation 0.0031%; largest saturated-source share 0.0000% at p0 (site 0, instr 5)
[2026-10-07T19:19:58Z] acceptance-style (2,048 evaluations, the rule's sample size): the most repeated address at one position 2 of 2048 at p50 (site 2, instr 15); saturated sources at one position 0 of 2048 at p0 (site 0, instr 5); uniform expectation: repeats 1 to 2, saturated 0
[2026-10-07T19:19:58Z] p1352-attack-f8 item histogram (flat): bins 16777216 reads 2147483648 mean 128.000 sigma 11.314 max 257 (bin 13728501) z_max +11.40 min 62 z_min -5.83 chi2/dof 4.22824 chi2_z +9349.98 top0.1% 0.16412% top0.5% 0.78026% top1% 1.52188%
[2026-10-07T19:19:58Z] p1352-attack-f8 item histogram against the window density: full 2^24 chi2/dof 1.20444 largest 257 (item 0xd17af5) at +7.67 sigma smallest at -5.21; buckets64 chi2/dof 14.08415 largest 10402 (bucket 181673) at +24.42 sigma smallest at -8.41
[2026-10-07T19:20:06Z] p1352-attack-f8 WINDOWED CONTROL item histogram (flat): bins 16777216 reads 2147483648 mean 128.000 sigma 11.314 max 230 (bin 16621754) z_max +9.02 min 62 z_min -5.83 chi2/dof 3.99972 chi2_z +8688.12 top0.1% 0.15528% top0.5% 0.74785% top1% 1.46779%
[2026-10-07T19:20:06Z] p1352-attack-f8 WINDOWED CONTROL against the window density: full chi2/dof 0.99994 largest +5.67 sigma; buckets64 chi2/dof 1.00025 largest +4.62 smallest -4.67
[2026-10-07T19:20:06Z] 6-sigma p1352-attack-f8 items buckets64 against the window density: largest bucket +24.42 sigma, smallest -8.41 -> FLAGGED (beyond 6 sigma)
[2026-10-07T19:20:06Z] hot-set p1352-attack-f8 items (windowed control): f 0.1% S_f 0.16412% E_f(control) 0.15528% X_f +0.00884% X_f/f +0.0884 -> no hot set
[2026-10-07T19:20:06Z] hot-set p1352-attack-f8 items (windowed control): f 0.5% S_f 0.78026% E_f(control) 0.74785% X_f +0.03241% X_f/f +0.0648 -> no hot set
[2026-10-07T19:20:06Z] hot-set p1352-attack-f8 items (windowed control): f 1.0% S_f 1.52188% E_f(control) 1.46779% X_f +0.05409% X_f/f +0.0541 -> no hot set
[2026-10-07T19:20:06Z] hot-set p1352-attack-f8 items (windowed control): verdict clear
[2026-10-07T19:20:11Z] p1352-attack-f8 FLAT CONTROL item histogram: bins 16777216 reads 2147483648 mean 128.000 sigma 11.314 max 199 (bin 781985) z_max +6.28 min 71 z_min -5.04 chi2/dof 1.00025 chi2_z +0.72 top0.1% 0.13109% top0.5% 0.63252% top1% 1.24338%
[2026-10-07T19:20:11Z] hot-set p1352-attack-f8 items (flat control, the auditor's first view): f 0.1% S_f 0.16412% E_f(control) 0.13109% X_f +0.03302% X_f/f +0.3302 -> no hot set
[2026-10-07T19:20:11Z] hot-set p1352-attack-f8 items (flat control, the auditor's first view): f 0.5% S_f 0.78026% E_f(control) 0.63252% X_f +0.14775% X_f/f +0.2955 -> no hot set
[2026-10-07T19:20:11Z] hot-set p1352-attack-f8 items (flat control, the auditor's first view): f 1.0% S_f 1.52188% E_f(control) 1.24338% X_f +0.27851% X_f/f +0.2785 -> no hot set
[2026-10-07T19:20:11Z] hot-set p1352-attack-f8 items (flat control, the auditor's first view): verdict clear
[2026-10-07T19:20:11Z] ratio p1352-attack-f8: top 0.1% / 0.5% / 1% share over the WINDOW-MODEL control 1.0569x / 1.0433x / 1.0369x (gate 1.2x at 0.1%: within); over the FLAT control 1.2519x / 1.2336x / 1.2240x
[2026-10-07T19:20:11Z] hottest item p1352-attack-f8 (0xf159c4): 257 reads (0.0000% of all); predicted source none
[2026-10-07T19:20:11Z] program p1352-attack-f8 DONE: 16777216 nonces; 6-sigma (windowed) FLAGGED; hot-set clear; verdict FLAGGED
[2026-10-07T19:20:12Z] attack-f8 0.1.0 (igneum-pow 4); args ["warps", "--program", "100521", "--nonces", "16777216", "--threads", "32", "--out", "/srv/builds/_adv-adv-accept/live", "--validate", "sample"]
[2026-10-07T19:20:12Z] census warps: programs [100521] day 20730 nonces 16777216 threads 32 plant none validate sample check_every 997 diag false
[2026-10-07T19:20:12Z] day 20730: cache filled in 0.64 s, fnv 448274a57f508cbc
[2026-10-07T19:20:16Z] table: 16777216 items derived with their 8 lines in 3.9 s; library comparison sample (0 mismatches)
[2026-10-07T19:20:20Z] program p100521-attack-f8: epoch seed 721567a1ba953f153c87013a8f87463bcd6975cc96e29dcd7a33fbaf9d071b6b era seed b5fa469b1e6da9ee3e60337bda004b442fefd4c684d423f067f6bf5c2da2c72d id 8651adc18b85c26d attempt 1 class mx8-erac3cf9cb8+sh256x27 op mix load=16 xor=9 mul=8 add=7 rotr=5 shfl=5 mad=4 rotl=4 sub=3 or=2 mulhi=1; era stride mul 0xfe3adc05 rot 20 interleave [1, 3, 12, 13] windows 4:1:1 8:2:3 10:2:2 11:0:0 14:0:0 17:0:0 26:0:0 29:2:1 31:0:0 33:1:0 34:0:0 37:0:0 43:1:0 44:2:3 58:2:0 60:2:3
[2026-10-07T19:20:20Z] load site instr 4: src r2 win 1 off 1; last base writer mad at 2; writers back to the last injecting one: mad@2; shadow writes of r2 per rep: add=8 mad=4 mul=6 mulhi=1 or=2 rotl=3 rotr=1 shfl=5 sub=1 xor=5
[2026-10-07T19:20:20Z] load site instr 8: src r2 win 2 off 3; last base writer rotr at 5; writers back to the last injecting one: rotr@5 mad@2; shadow writes of r2 per rep: add=8 mad=4 mul=6 mulhi=1 or=2 rotl=3 rotr=1 shfl=5 sub=1 xor=5
[2026-10-07T19:20:20Z] load site instr 10: src r6 win 2 off 2; last base writer load at 4; writers back to the last injecting one: load@4; shadow writes of r6 per rep: add=6 mad=2 mul=3 mulhi=4 or=1 rotl=3 rotr=1 shfl=3 sub=3 xor=6
[2026-10-07T19:20:20Z] load site instr 11: src r4 win 0 off 0; last base writer load at 8; writers back to the last injecting one: load@8; shadow writes of r4 per rep: add=4 mad=2 mul=2 mulhi=1 rotl=4 rotr=1 shfl=7 xor=6
[2026-10-07T19:20:20Z] load site instr 14: src r0 win 0 off 0; last base writer load at 10; writers back to the last injecting one: load@10; shadow writes of r0 per rep: add=6 mad=3 mul=3 mulhi=2 or=3 rotl=2 rotr=2 shfl=3 sub=4 xor=2
[2026-10-07T19:20:20Z] load site instr 17: src r2 win 0 off 0; last base writer load at 14; writers back to the last injecting one: load@14; shadow writes of r2 per rep: add=8 mad=4 mul=6 mulhi=1 or=2 rotl=3 rotr=1 shfl=5 sub=1 xor=5
[2026-10-07T19:20:20Z] load site instr 26: src r1 win 0 off 0; last base writer load at 17; writers back to the last injecting one: load@17; shadow writes of r1 per rep: add=4 mad=4 mul=1 mulhi=6 or=1 rotl=6 rotr=4 shfl=3 sub=1 xor=6
[2026-10-07T19:20:20Z] load site instr 29: src r5 win 2 off 1; last base writer load at 26; writers back to the last injecting one: load@26; shadow writes of r5 per rep: add=5 mad=1 mul=4 mulhi=3 or=3 rotl=6 rotr=1 shfl=4 sub=1 xor=4
[2026-10-07T19:20:20Z] load site instr 31: src r0 win 0 off 0; last base writer shfl at 20; writers back to the last injecting one: shfl@20; shadow writes of r0 per rep: add=6 mad=3 mul=3 mulhi=2 or=3 rotl=2 rotr=2 shfl=3 sub=4 xor=2
[2026-10-07T19:20:20Z] load site instr 33: src r7 win 1 off 0; last base writer load at 31; writers back to the last injecting one: load@31; shadow writes of r7 per rep: add=5 mad=3 mul=3 mulhi=4 rotl=3 rotr=2 sub=5 xor=5
[2026-10-07T19:20:20Z] load site instr 34: src r3 win 0 off 0; last base writer add at 19; writers back to the last injecting one: add@19; shadow writes of r3 per rep: add=9 mad=2 mul=6 mulhi=4 or=4 rotl=2 rotr=1 shfl=1 xor=4
[2026-10-07T19:20:20Z] load site instr 37: src r4 win 0 off 0; last base writer mad at 36; writers back to the last injecting one: mad@36; shadow writes of r4 per rep: add=4 mad=2 mul=2 mulhi=1 rotl=4 rotr=1 shfl=7 xor=6
[2026-10-07T19:20:20Z] load site instr 43: src r0 win 1 off 0; last base writer shfl at 41; writers back to the last injecting one: shfl@41; shadow writes of r0 per rep: add=6 mad=3 mul=3 mulhi=2 or=3 rotl=2 rotr=2 shfl=3 sub=4 xor=2
[2026-10-07T19:20:20Z] load site instr 44: src r7 win 2 off 3; last base writer load at 43; writers back to the last injecting one: load@43; shadow writes of r7 per rep: add=5 mad=3 mul=3 mulhi=4 rotl=3 rotr=2 sub=5 xor=5
[2026-10-07T19:20:20Z] load site instr 58: src r7 win 2 off 0; last base writer rotl at 56; writers back to the last injecting one: rotl@56 load@43; shadow writes of r7 per rep: add=5 mad=3 mul=3 mulhi=4 rotl=3 rotr=2 sub=5 xor=5
[2026-10-07T19:20:20Z] load site instr 60: src r5 win 2 off 3; last base writer xor at 52; writers back to the last injecting one: xor@52; shadow writes of r5 per rep: add=5 mad=1 mul=4 mulhi=3 or=3 rotl=6 rotr=1 shfl=4 sub=1 xor=4
[2026-10-07T19:20:20Z] window layer: site item windows (first, items) (0x800000,2^23) (0xc00000,2^22) (0x800000,2^22) (0x0,2^24) (0x0,2^24) (0x0,2^24) (0x0,2^24) (0x400000,2^22) (0x0,2^24) (0x0,2^23) (0x0,2^24) (0x0,2^24) (0x0,2^23) (0xc00000,2^22) (0x0,2^22) (0xc00000,2^22); expected reads per item by quarter 120.000 120.000 104.000 168.000 (flat uniform 128.000)
lease: 0 of 16 pool cores free (88 leased); waiting
lease: holding 32 pool cores (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, waited 628 s): adv-accept live-random9-16m
[2026-10-07T19:35:39Z] attack-f8 0.1.0 (igneum-pow 4); args ["warps", "--program", "100521", "--nonces", "16777216", "--threads", "32", "--out", "/srv/builds/_adv-adv-accept/live", "--validate", "sample"]
[2026-10-07T19:35:39Z] census warps: programs [100521] day 20730 nonces 16777216 threads 32 plant none validate sample check_every 997 diag false
[2026-10-07T19:35:39Z] day 20730: cache filled in 0.38 s, fnv 448274a57f508cbc
[2026-10-07T19:35:41Z] table: 16777216 items derived with their 8 lines in 1.7 s; library comparison sample (0 mismatches)
[2026-10-07T19:35:43Z] program p100521-attack-f8: epoch seed 721567a1ba953f153c87013a8f87463bcd6975cc96e29dcd7a33fbaf9d071b6b era seed b5fa469b1e6da9ee3e60337bda004b442fefd4c684d423f067f6bf5c2da2c72d id 8651adc18b85c26d attempt 1 class mx8-erac3cf9cb8+sh256x27 op mix load=16 xor=9 mul=8 add=7 rotr=5 shfl=5 mad=4 rotl=4 sub=3 or=2 mulhi=1; era stride mul 0xfe3adc05 rot 20 interleave [1, 3, 12, 13] windows 4:1:1 8:2:3 10:2:2 11:0:0 14:0:0 17:0:0 26:0:0 29:2:1 31:0:0 33:1:0 34:0:0 37:0:0 43:1:0 44:2:3 58:2:0 60:2:3
[2026-10-07T19:35:43Z] load site instr 4: src r2 win 1 off 1; last base writer mad at 2; writers back to the last injecting one: mad@2; shadow writes of r2 per rep: add=8 mad=4 mul=6 mulhi=1 or=2 rotl=3 rotr=1 shfl=5 sub=1 xor=5
[2026-10-07T19:35:43Z] load site instr 8: src r2 win 2 off 3; last base writer rotr at 5; writers back to the last injecting one: rotr@5 mad@2; shadow writes of r2 per rep: add=8 mad=4 mul=6 mulhi=1 or=2 rotl=3 rotr=1 shfl=5 sub=1 xor=5
[2026-10-07T19:35:43Z] load site instr 10: src r6 win 2 off 2; last base writer load at 4; writers back to the last injecting one: load@4; shadow writes of r6 per rep: add=6 mad=2 mul=3 mulhi=4 or=1 rotl=3 rotr=1 shfl=3 sub=3 xor=6
[2026-10-07T19:35:43Z] load site instr 11: src r4 win 0 off 0; last base writer load at 8; writers back to the last injecting one: load@8; shadow writes of r4 per rep: add=4 mad=2 mul=2 mulhi=1 rotl=4 rotr=1 shfl=7 xor=6
[2026-10-07T19:35:43Z] load site instr 14: src r0 win 0 off 0; last base writer load at 10; writers back to the last injecting one: load@10; shadow writes of r0 per rep: add=6 mad=3 mul=3 mulhi=2 or=3 rotl=2 rotr=2 shfl=3 sub=4 xor=2
[2026-10-07T19:35:43Z] load site instr 17: src r2 win 0 off 0; last base writer load at 14; writers back to the last injecting one: load@14; shadow writes of r2 per rep: add=8 mad=4 mul=6 mulhi=1 or=2 rotl=3 rotr=1 shfl=5 sub=1 xor=5
[2026-10-07T19:35:43Z] load site instr 26: src r1 win 0 off 0; last base writer load at 17; writers back to the last injecting one: load@17; shadow writes of r1 per rep: add=4 mad=4 mul=1 mulhi=6 or=1 rotl=6 rotr=4 shfl=3 sub=1 xor=6
[2026-10-07T19:35:43Z] load site instr 29: src r5 win 2 off 1; last base writer load at 26; writers back to the last injecting one: load@26; shadow writes of r5 per rep: add=5 mad=1 mul=4 mulhi=3 or=3 rotl=6 rotr=1 shfl=4 sub=1 xor=4
[2026-10-07T19:35:43Z] load site instr 31: src r0 win 0 off 0; last base writer shfl at 20; writers back to the last injecting one: shfl@20; shadow writes of r0 per rep: add=6 mad=3 mul=3 mulhi=2 or=3 rotl=2 rotr=2 shfl=3 sub=4 xor=2
[2026-10-07T19:35:43Z] load site instr 33: src r7 win 1 off 0; last base writer load at 31; writers back to the last injecting one: load@31; shadow writes of r7 per rep: add=5 mad=3 mul=3 mulhi=4 rotl=3 rotr=2 sub=5 xor=5
[2026-10-07T19:35:43Z] load site instr 34: src r3 win 0 off 0; last base writer add at 19; writers back to the last injecting one: add@19; shadow writes of r3 per rep: add=9 mad=2 mul=6 mulhi=4 or=4 rotl=2 rotr=1 shfl=1 xor=4
[2026-10-07T19:35:43Z] load site instr 37: src r4 win 0 off 0; last base writer mad at 36; writers back to the last injecting one: mad@36; shadow writes of r4 per rep: add=4 mad=2 mul=2 mulhi=1 rotl=4 rotr=1 shfl=7 xor=6
[2026-10-07T19:35:43Z] load site instr 43: src r0 win 1 off 0; last base writer shfl at 41; writers back to the last injecting one: shfl@41; shadow writes of r0 per rep: add=6 mad=3 mul=3 mulhi=2 or=3 rotl=2 rotr=2 shfl=3 sub=4 xor=2
[2026-10-07T19:35:43Z] load site instr 44: src r7 win 2 off 3; last base writer load at 43; writers back to the last injecting one: load@43; shadow writes of r7 per rep: add=5 mad=3 mul=3 mulhi=4 rotl=3 rotr=2 sub=5 xor=5
[2026-10-07T19:35:43Z] load site instr 58: src r7 win 2 off 0; last base writer rotl at 56; writers back to the last injecting one: rotl@56 load@43; shadow writes of r7 per rep: add=5 mad=3 mul=3 mulhi=4 rotl=3 rotr=2 sub=5 xor=5
[2026-10-07T19:35:43Z] load site instr 60: src r5 win 2 off 3; last base writer xor at 52; writers back to the last injecting one: xor@52; shadow writes of r5 per rep: add=5 mad=1 mul=4 mulhi=3 or=3 rotl=6 rotr=1 shfl=4 sub=1 xor=4
[2026-10-07T19:35:43Z] window layer: site item windows (first, items) (0x800000,2^23) (0xc00000,2^22) (0x800000,2^22) (0x0,2^24) (0x0,2^24) (0x0,2^24) (0x0,2^24) (0x400000,2^22) (0x0,2^24) (0x0,2^23) (0x0,2^24) (0x0,2^24) (0x0,2^23) (0xc00000,2^22) (0x0,2^22) (0xc00000,2^22); expected reads per item by quarter 120.000 120.000 104.000 168.000 (flat uniform 128.000)
[2026-10-07T19:36:24Z] 524288 warps (16777216 nonces) interpreted in 40.5 s (2.472 ms per warp per thread); Epoch::hash_warp agreement on 589 warps: 0 mismatches
[2026-10-07T19:36:24Z] p100521-attack-f8 distinct lines per hash: n 16777216 min 990 p1 1015 median 1024 p99 1024 max 1024 mean 1022.8782
[2026-10-07T19:36:24Z] p100521-attack-f8 distinct items per hash: n 16777216 min 124 p1 127 median 128 p99 128 max 128 mean 127.8754
[2026-10-07T19:36:24Z] p100521-attack-f8 distinct lines per warp: n 524288 min 32472 p1 32554 median 32606 p99 32647 max 32681 mean 32604.6998
[2026-10-07T19:36:24Z] p100521-attack-f8 distinct items per warp: n 524288 min 4078 p1 4086 median 4092 p99 4096 max 4096 mean 4091.5089
[2026-10-07T19:36:24Z] uniform expectation: distinct lines per hash 1023.875 of 1024 reads, per warp 32640.3 of 32768 reads (2^22 lines); distinct items per hash 127.9995 of 128, per warp 4095.50 of 4096 (2^24 items)
[2026-10-07T19:36:24Z] positions: largest hi16-bucket (256 items) share 0.0144% at p0 (iteration 0, site 0, instr 4); windowed expectation 0.0031%; largest saturated-source share 0.0000% at p0 (site 0, instr 4)
[2026-10-07T19:36:24Z] acceptance-style (2,048 evaluations, the rule's sample size): the most repeated address at one position 2 of 2048 at p39 (site 7, instr 29); saturated sources at one position 0 of 2048 at p0 (site 0, instr 4); uniform expectation: repeats 1 to 2, saturated 0
[2026-10-07T19:36:24Z] p100521-attack-f8 item histogram (flat): bins 16777216 reads 2147483648 mean 128.000 sigma 11.314 max 289 (bin 12647817) z_max +14.23 min 50 z_min -6.89 chi2/dof 6.03326 chi2_z +14577.87 top0.1% 0.18704% top0.5% 0.87564% top1% 1.68772%
[2026-10-07T19:36:24Z] p100521-attack-f8 item histogram against the window density: full 2^24 chi2/dof 1.54971 largest 210 (item 0x80536a) at +10.39 sigma smallest at -5.48; buckets64 chi2/dof 36.09859 largest 10405 (bucket 131118) at +45.95 sigma smallest at -10.15
[2026-10-07T19:36:26Z] p100521-attack-f8 WINDOWED CONTROL item histogram (flat): bins 16777216 reads 2147483648 mean 128.000 sigma 11.314 max 237 (bin 13229832) z_max +9.63 min 56 z_min -6.36 chi2/dof 5.49947 chi2_z +13031.85 top0.1% 0.16220% top0.5% 0.78190% top1% 1.53522%
[2026-10-07T19:36:26Z] p100521-attack-f8 WINDOWED CONTROL against the window density: full chi2/dof 0.99962 largest +5.32 sigma; buckets64 chi2/dof 1.00181 largest +4.77 smallest -4.30
[2026-10-07T19:36:26Z] 6-sigma p100521-attack-f8 items buckets64 against the window density: largest bucket +45.95 sigma, smallest -10.15 -> FLAGGED (beyond 6 sigma)
[2026-10-07T19:36:26Z] hot-set p100521-attack-f8 items (windowed control): f 0.1% S_f 0.18704% E_f(control) 0.16220% X_f +0.02483% X_f/f +0.2483 -> no hot set
[2026-10-07T19:36:26Z] hot-set p100521-attack-f8 items (windowed control): f 0.5% S_f 0.87564% E_f(control) 0.78190% X_f +0.09374% X_f/f +0.1875 -> no hot set
[2026-10-07T19:36:26Z] hot-set p100521-attack-f8 items (windowed control): f 1.0% S_f 1.68772% E_f(control) 1.53522% X_f +0.15250% X_f/f +0.1525 -> no hot set
[2026-10-07T19:36:26Z] hot-set p100521-attack-f8 items (windowed control): verdict clear
[2026-10-07T19:36:28Z] p100521-attack-f8 FLAT CONTROL item histogram: bins 16777216 reads 2147483648 mean 128.000 sigma 11.314 max 198 (bin 8823736) z_max +6.19 min 73 z_min -4.86 chi2/dof 0.99970 chi2_z -0.88 top0.1% 0.13105% top0.5% 0.63244% top1% 1.24341%
[2026-10-07T19:36:28Z] hot-set p100521-attack-f8 items (flat control, the auditor's first view): f 0.1% S_f 0.18704% E_f(control) 0.13105% X_f +0.05599% X_f/f +0.5599 -> no hot set
[2026-10-07T19:36:28Z] hot-set p100521-attack-f8 items (flat control, the auditor's first view): f 0.5% S_f 0.87564% E_f(control) 0.63244% X_f +0.24319% X_f/f +0.4864 -> no hot set
[2026-10-07T19:36:28Z] hot-set p100521-attack-f8 items (flat control, the auditor's first view): f 1.0% S_f 1.68772% E_f(control) 1.24341% X_f +0.44431% X_f/f +0.4443 -> no hot set
[2026-10-07T19:36:28Z] hot-set p100521-attack-f8 items (flat control, the auditor's first view): verdict clear
[2026-10-07T19:36:28Z] ratio p100521-attack-f8: top 0.1% / 0.5% / 1% share over the WINDOW-MODEL control 1.1531x / 1.1199x / 1.0993x (gate 1.2x at 0.1%: within); over the FLAT control 1.4272x / 1.3845x / 1.3573x
[2026-10-07T19:36:28Z] hottest item p100521-attack-f8 (0xc0fd89): 289 reads (0.0000% of all); predicted source none
[2026-10-07T19:36:28Z] program p100521-attack-f8 DONE: 16777216 nonces; 6-sigma (windowed) FLAGGED; hot-set clear; verdict FLAGGED
[2026-10-07T19:36:29Z] attack-f8 0.1.0 (igneum-pow 4); args ["warps", "--program", "106359", "--nonces", "16777216", "--threads", "32", "--out", "/srv/builds/_adv-adv-accept/live", "--validate", "sample"]
[2026-10-07T19:36:29Z] census warps: programs [106359] day 20730 nonces 16777216 threads 32 plant none validate sample check_every 997 diag false
[2026-10-07T19:36:29Z] day 20730: cache filled in 0.58 s, fnv 448274a57f508cbc
[2026-10-07T19:36:32Z] table: 16777216 items derived with their 8 lines in 2.1 s; library comparison sample (0 mismatches)
[2026-10-07T19:36:35Z] program p106359-attack-f8: epoch seed 1144cc6960ccd5067e9f4401855f45b1ebd392fec220a185b8952e0557f068cb era seed 4150e9d8ced26144064fbd8a1530e3dc17617902a4ecbb7a5ba0ba298b1035de id cfa44e3530a46c89 attempt 12 class mx8-era9a0d4fc4+sh256x27 op mix load=16 add=8 mul=6 rotl=6 rotr=6 xor=5 mad=4 mulhi=4 or=3 shfl=3 sub=3; era stride mul 0xdb95ccc3 rot 27 interleave [3, 4, 5, 10] windows 4:0:0 8:2:3 11:0:0 16:1:0 22:2:2 24:2:1 31:2:1 34:1:0 38:1:1 39:1:1 44:2:3 45:0:0 46:0:0 53:1:0 60:0:0 63:2:3
[2026-10-07T19:36:35Z] load site instr 4: src r4 win 0 off 0; last base writer xor at 2; writers back to the last injecting one: xor@2; shadow writes of r4 per rep: add=5 mad=3 mul=1 mulhi=2 or=1 rotl=3 rotr=4 shfl=2 sub=1 xor=8
[2026-10-07T19:36:35Z] load site instr 8: src r6 win 2 off 3; last base writer xor at 3; writers back to the last injecting one: xor@3; shadow writes of r6 per rep: add=4 mad=8 mul=2 mulhi=5 or=3 rotl=2 rotr=2 shfl=1 sub=2 xor=1
[2026-10-07T19:36:35Z] load site instr 11: src r5 win 0 off 0; last base writer load at 4; writers back to the last injecting one: load@4; shadow writes of r5 per rep: add=5 mad=5 mul=5 mulhi=4 or=2 rotl=1 rotr=7 shfl=2
[2026-10-07T19:36:35Z] load site instr 16: src r1 win 1 off 0; last base writer add at 15; writers back to the last injecting one: add@15; shadow writes of r1 per rep: add=2 mad=2 mul=4 mulhi=1 rotl=4 rotr=2 shfl=3 sub=3 xor=5
[2026-10-07T19:36:35Z] load site instr 22: src r3 win 2 off 2; last base writer rotr at 18; writers back to the last injecting one: rotr@18 load@16; shadow writes of r3 per rep: add=11 mad=3 mul=2 mulhi=2 or=3 rotl=3 rotr=3 shfl=6 sub=2 xor=2
[2026-10-07T19:36:35Z] load site instr 24: src r5 win 2 off 1; last base writer xor at 13; writers back to the last injecting one: xor@13; shadow writes of r5 per rep: add=5 mad=5 mul=5 mulhi=4 or=2 rotl=1 rotr=7 shfl=2
[2026-10-07T19:36:35Z] load site instr 31: src r6 win 2 off 1; last base writer add at 30; writers back to the last injecting one: add@30; shadow writes of r6 per rep: add=4 mad=8 mul=2 mulhi=5 or=3 rotl=2 rotr=2 shfl=1 sub=2 xor=1
[2026-10-07T19:36:35Z] load site instr 34: src r3 win 1 off 0; last base writer shfl at 25; writers back to the last injecting one: shfl@25; shadow writes of r3 per rep: add=11 mad=3 mul=2 mulhi=2 or=3 rotl=3 rotr=3 shfl=6 sub=2 xor=2
[2026-10-07T19:36:35Z] load site instr 38: src r4 win 1 off 1; last base writer mad at 36; writers back to the last injecting one: mad@36; shadow writes of r4 per rep: add=5 mad=3 mul=1 mulhi=2 or=1 rotl=3 rotr=4 shfl=2 sub=1 xor=8
[2026-10-07T19:36:35Z] load site instr 39: src r7 win 1 off 1; last base writer load at 22; writers back to the last injecting one: load@22; shadow writes of r7 per rep: add=4 mad=3 mul=6 mulhi=3 or=1 rotl=3 rotr=5 shfl=3 sub=2 xor=3
[2026-10-07T19:36:35Z] load site instr 44: src r3 win 2 off 3; last base writer load at 39; writers back to the last injecting one: load@39; shadow writes of r3 per rep: add=11 mad=3 mul=2 mulhi=2 or=3 rotl=3 rotr=3 shfl=6 sub=2 xor=2
[2026-10-07T19:36:35Z] load site instr 45: src r7 win 0 off 0; last base writer rotl at 43; writers back to the last injecting one: rotl@43 mad@40; shadow writes of r7 per rep: add=4 mad=3 mul=6 mulhi=3 or=1 rotl=3 rotr=5 shfl=3 sub=2 xor=3
[2026-10-07T19:36:35Z] load site instr 46: src r6 win 0 off 0; last base writer load at 34; writers back to the last injecting one: load@34; shadow writes of r6 per rep: add=4 mad=8 mul=2 mulhi=5 or=3 rotl=2 rotr=2 shfl=1 sub=2 xor=1
[2026-10-07T19:36:35Z] load site instr 53: src r6 win 1 off 0; last base writer rotr at 52; writers back to the last injecting one: rotr@52 rotr@51 rotl@49 rotl@48 load@34; shadow writes of r6 per rep: add=4 mad=8 mul=2 mulhi=5 or=3 rotl=2 rotr=2 shfl=1 sub=2 xor=1
[2026-10-07T19:36:35Z] load site instr 60: src r4 win 0 off 0; last base writer load at 45; writers back to the last injecting one: load@45; shadow writes of r4 per rep: add=5 mad=3 mul=1 mulhi=2 or=1 rotl=3 rotr=4 shfl=2 sub=1 xor=8
[2026-10-07T19:36:35Z] load site instr 63: src r6 win 2 off 3; last base writer rotr at 56; writers back to the last injecting one: rotr@56 rotr@52 rotr@51 rotl@49 rotl@48 load@34; shadow writes of r6 per rep: add=4 mad=8 mul=2 mulhi=5 or=3 rotl=2 rotr=2 shfl=1 sub=2 xor=1
[2026-10-07T19:36:35Z] window layer: site item windows (first, items) (0x0,2^24) (0xc00000,2^22) (0x0,2^24) (0x0,2^23) (0x800000,2^22) (0x400000,2^22) (0x400000,2^22) (0x0,2^23) (0x800000,2^23) (0x800000,2^23) (0xc00000,2^22) (0x0,2^24) (0x0,2^24) (0x0,2^23) (0x0,2^24) (0xc00000,2^22); expected reads per item by quarter 88.000 152.000 104.000 168.000 (flat uniform 128.000)
[2026-10-07T19:37:17Z] 524288 warps (16777216 nonces) interpreted in 41.9 s (2.560 ms per warp per thread); Epoch::hash_warp agreement on 589 warps: 0 mismatches
[2026-10-07T19:37:17Z] p106359-attack-f8 distinct lines per hash: n 16777216 min 984 p1 1008 median 1024 p99 1024 max 1024 mean 1022.3726
[2026-10-07T19:37:17Z] p106359-attack-f8 distinct items per hash: n 16777216 min 123 p1 126 median 128 p99 128 max 128 mean 127.8121
[2026-10-07T19:37:17Z] p106359-attack-f8 distinct lines per warp: n 524288 min 32464 p1 32531 median 32590 p99 32637 max 32675 mean 32588.5297
[2026-10-07T19:37:17Z] p106359-attack-f8 distinct items per warp: n 524288 min 4074 p1 4083 median 4090 p99 4095 max 4096 mean 4089.4731
[2026-10-07T19:37:17Z] uniform expectation: distinct lines per hash 1023.875 of 1024 reads, per warp 32640.3 of 32768 reads (2^22 lines); distinct items per hash 127.9995 of 128, per warp 4095.50 of 4096 (2^24 items)
[2026-10-07T19:37:17Z] positions: largest hi16-bucket (256 items) share 0.0070% at p65 (iteration 4, site 1, instr 8); windowed expectation 0.0061%; largest saturated-source share 0.0000% at p0 (site 0, instr 4)
[2026-10-07T19:37:17Z] acceptance-style (2,048 evaluations, the rule's sample size): the most repeated address at one position 2 of 2048 at p37 (site 5, instr 24); saturated sources at one position 0 of 2048 at p0 (site 0, instr 4); uniform expectation: repeats 1 to 2, saturated 0
[2026-10-07T19:37:17Z] p106359-attack-f8 item histogram (flat): bins 16777216 reads 2147483648 mean 128.000 sigma 11.314 max 235 (bin 16366047) z_max +9.46 min 45 z_min -7.34 chi2/dof 9.50505 chi2_z +24633.27 top0.1% 0.16231% top0.5% 0.78247% top1% 1.53669%
[2026-10-07T19:37:17Z] p106359-attack-f8 item histogram against the window density: full 2^24 chi2/dof 1.00348 largest 140 (item 0x312128) at +5.54 sigma smallest at -5.01; buckets64 chi2/dof 1.00527 largest 5994 (bucket 41984) at +4.82 sigma smallest at -4.71
[2026-10-07T19:37:19Z] p106359-attack-f8 WINDOWED CONTROL item histogram (flat): bins 16777216 reads 2147483648 mean 128.000 sigma 11.314 max 234 (bin 15385497) z_max +9.37 min 48 z_min -7.07 chi2/dof 9.50152 chi2_z +24623.04 top0.1% 0.16230% top0.5% 0.78227% top1% 1.53629%
[2026-10-07T19:37:19Z] p106359-attack-f8 WINDOWED CONTROL against the window density: full chi2/dof 1.00019 largest +5.65 sigma; buckets64 chi2/dof 1.00152 largest +4.24 smallest -4.94
[2026-10-07T19:37:19Z] 6-sigma p106359-attack-f8 items buckets64 against the window density: largest bucket +4.82 sigma, smallest -4.71 -> within 6 sigma
[2026-10-07T19:37:19Z] hot-set p106359-attack-f8 items (windowed control): f 0.1% S_f 0.16231% E_f(control) 0.16230% X_f +0.00001% X_f/f +0.0001 -> no hot set
[2026-10-07T19:37:19Z] hot-set p106359-attack-f8 items (windowed control): f 0.5% S_f 0.78247% E_f(control) 0.78227% X_f +0.00020% X_f/f +0.0004 -> no hot set
[2026-10-07T19:37:19Z] hot-set p106359-attack-f8 items (windowed control): f 1.0% S_f 1.53669% E_f(control) 1.53629% X_f +0.00040% X_f/f +0.0004 -> no hot set
[2026-10-07T19:37:19Z] hot-set p106359-attack-f8 items (windowed control): verdict clear
[2026-10-07T19:37:21Z] p106359-attack-f8 FLAT CONTROL item histogram: bins 16777216 reads 2147483648 mean 128.000 sigma 11.314 max 194 (bin 6341738) z_max +5.83 min 67 z_min -5.39 chi2/dof 0.99947 chi2_z -1.52 top0.1% 0.13106% top0.5% 0.63239% top1% 1.24320%
[2026-10-07T19:37:21Z] hot-set p106359-attack-f8 items (flat control, the auditor's first view): f 0.1% S_f 0.16231% E_f(control) 0.13106% X_f +0.03125% X_f/f +0.3125 -> no hot set
[2026-10-07T19:37:21Z] hot-set p106359-attack-f8 items (flat control, the auditor's first view): f 0.5% S_f 0.78247% E_f(control) 0.63239% X_f +0.15008% X_f/f +0.3002 -> no hot set
[2026-10-07T19:37:21Z] hot-set p106359-attack-f8 items (flat control, the auditor's first view): f 1.0% S_f 1.53669% E_f(control) 1.24320% X_f +0.29349% X_f/f +0.2935 -> no hot set
[2026-10-07T19:37:21Z] hot-set p106359-attack-f8 items (flat control, the auditor's first view): verdict clear
[2026-10-07T19:37:21Z] ratio p106359-attack-f8: top 0.1% / 0.5% / 1% share over the WINDOW-MODEL control 1.0001x / 1.0003x / 1.0003x (gate 1.2x at 0.1%: within); over the FLAT control 1.2384x / 1.2373x / 1.2361x
[2026-10-07T19:37:21Z] hottest item p106359-attack-f8 (0xf9b9df): 235 reads (0.0000% of all); predicted source none
[2026-10-07T19:37:21Z] program p106359-attack-f8 DONE: 16777216 nonces; 6-sigma (windowed) clear; hot-set clear; verdict PASS (no test fired)
[2026-10-07T19:37:21Z] attack-f8 0.1.0 (igneum-pow 4); args ["warps", "--program", "4905", "--nonces", "16777216", "--threads", "32", "--out", "/srv/builds/_adv-adv-accept/live", "--validate", "sample"]
[2026-10-07T19:37:21Z] census warps: programs [4905] day 20730 nonces 16777216 threads 32 plant none validate sample check_every 997 diag false
[2026-10-07T19:37:22Z] day 20730: cache filled in 0.63 s, fnv 448274a57f508cbc
[2026-10-07T19:37:24Z] table: 16777216 items derived with their 8 lines in 1.6 s; library comparison sample (0 mismatches)
[2026-10-07T19:37:28Z] program p4905-attack-f8: epoch seed 86e484ffdd0eaac5cf6962f26007ad30ac8a5928b9c0814095e24c43182a64ff era seed 7eb1119694263a2b0b0e4c263bebb01373736bab1053ff04472b16e5a25ff05f id f38caa367b3d8447 attempt 0 class mx8-era8c0e77af+sh256x27 op mix load=16 add=11 rotl=8 xor=8 mul=5 or=5 mad=3 rotr=3 mulhi=2 sub=2 shfl=1; era stride mul 0x71ec404b rot 9 interleave [2, 3, 5, 6] windows 5:0:0 12:1:0 16:0:0 17:0:0 19:2:0 21:1:1 23:0:0 26:0:0 30:2:3 32:0:0 38:1:0 42:2:0 46:2:1 47:1:1 49:0:0 62:1:1
[2026-10-07T19:37:28Z] load site instr 5: src r4 win 0 off 0; last base writer sub at 4; writers back to the last injecting one: sub@4; shadow writes of r4 per rep: add=4 mad=4 mul=4 mulhi=1 or=1 rotl=3 rotr=1 shfl=2 sub=3 xor=1
[2026-10-07T19:37:28Z] load site instr 12: src r7 win 1 off 0; last base writer add at 7; writers back to the last injecting one: add@7; shadow writes of r7 per rep: add=7 mad=2 mul=3 mulhi=2 or=3 rotl=1 rotr=2 shfl=1 sub=2 xor=4
[2026-10-07T19:37:28Z] load site instr 16: src r1 win 0 off 0; last base writer xor at 14; writers back to the last injecting one: xor@14; shadow writes of r1 per rep: add=4 mad=4 mul=8 or=2 rotl=2 rotr=2 shfl=4 sub=1 xor=9
[2026-10-07T19:37:28Z] load site instr 17: src r0 win 0 off 0; last base writer shfl at 15; writers back to the last injecting one: shfl@15; shadow writes of r0 per rep: add=7 mad=3 mul=3 mulhi=2 rotr=3 shfl=3 sub=4 xor=1
[2026-10-07T19:37:28Z] load site instr 19: src r2 win 2 off 0; last base writer load at 17; writers back to the last injecting one: load@17; shadow writes of r2 per rep: add=8 mad=3 mul=4 mulhi=3 or=6 rotl=4 rotr=3 shfl=7 xor=7
[2026-10-07T19:37:28Z] load site instr 21: src r1 win 1 off 1; last base writer load at 19; writers back to the last injecting one: load@19; shadow writes of r1 per rep: add=4 mad=4 mul=8 or=2 rotl=2 rotr=2 shfl=4 sub=1 xor=9
[2026-10-07T19:37:28Z] load site instr 23: src r4 win 0 off 0; last base writer load at 21; writers back to the last injecting one: load@21; shadow writes of r4 per rep: add=4 mad=4 mul=4 mulhi=1 or=1 rotl=3 rotr=1 shfl=2 sub=3 xor=1
[2026-10-07T19:37:28Z] load site instr 26: src r3 win 0 off 0; last base writer sub at 22; writers back to the last injecting one: sub@22; shadow writes of r3 per rep: add=7 mad=5 mul=3 mulhi=3 or=2 rotr=3 shfl=6 xor=4
[2026-10-07T19:37:28Z] load site instr 30: src r7 win 2 off 3; last base writer rotr at 29; writers back to the last injecting one: rotr@29 add@25; shadow writes of r7 per rep: add=7 mad=2 mul=3 mulhi=2 or=3 rotl=1 rotr=2 shfl=1 sub=2 xor=4
[2026-10-07T19:37:28Z] load site instr 32: src r1 win 0 off 0; last base writer load at 30; writers back to the last injecting one: load@30; shadow writes of r1 per rep: add=4 mad=4 mul=8 or=2 rotl=2 rotr=2 shfl=4 sub=1 xor=9
[2026-10-07T19:37:28Z] load site instr 38: src r5 win 1 off 0; last base writer xor at 34; writers back to the last injecting one: xor@34; shadow writes of r5 per rep: add=3 mad=2 mul=8 mulhi=2 or=2 shfl=3 sub=2 xor=5
[2026-10-07T19:37:28Z] load site instr 42: src r6 win 2 off 0; last base writer load at 32; writers back to the last injecting one: load@32; shadow writes of r6 per rep: add=7 mad=1 mul=2 mulhi=4 or=1 rotl=4 rotr=3 shfl=3 sub=6 xor=7
[2026-10-07T19:37:28Z] load site instr 46: src r7 win 2 off 1; last base writer add at 39; writers back to the last injecting one: add@39; shadow writes of r7 per rep: add=7 mad=2 mul=3 mulhi=2 or=3 rotl=1 rotr=2 shfl=1 sub=2 xor=4
[2026-10-07T19:37:28Z] load site instr 47: src r4 win 1 off 1; last base writer mad at 37; writers back to the last injecting one: mad@37; shadow writes of r4 per rep: add=4 mad=4 mul=4 mulhi=1 or=1 rotl=3 rotr=1 shfl=2 sub=3 xor=1
[2026-10-07T19:37:28Z] load site instr 49: src r2 win 0 off 0; last base writer load at 42; writers back to the last injecting one: load@42; shadow writes of r2 per rep: add=8 mad=3 mul=4 mulhi=3 or=6 rotl=4 rotr=3 shfl=7 xor=7
[2026-10-07T19:37:28Z] load site instr 62: src r0 win 1 off 1; last base writer xor at 53; writers back to the last injecting one: xor@53; shadow writes of r0 per rep: add=7 mad=3 mul=3 mulhi=2 rotr=3 shfl=3 sub=4 xor=1
[2026-10-07T19:37:28Z] window layer: site item windows (first, items) (0x0,2^24) (0x0,2^23) (0x0,2^24) (0x0,2^24) (0x0,2^22) (0x800000,2^23) (0x0,2^24) (0x0,2^24) (0xc00000,2^22) (0x0,2^24) (0x0,2^23) (0x0,2^22) (0x400000,2^22) (0x800000,2^23) (0x0,2^24) (0x800000,2^23); expected reads per item by quarter 152.000 120.000 104.000 136.000 (flat uniform 128.000)
[2026-10-07T19:38:12Z] 524288 warps (16777216 nonces) interpreted in 43.4 s (2.647 ms per warp per thread); Epoch::hash_warp agreement on 589 warps: 0 mismatches
[2026-10-07T19:38:12Z] p4905-attack-f8 distinct lines per hash: n 16777216 min 1007 p1 1023 median 1024 p99 1024 max 1024 mean 1023.8713
[2026-10-07T19:38:12Z] p4905-attack-f8 distinct items per hash: n 16777216 min 126 p1 128 median 128 p99 128 max 128 mean 127.9995
[2026-10-07T19:38:12Z] p4905-attack-f8 distinct lines per warp: n 524288 min 32565 p1 32605 median 32637 p99 32664 max 32697 mean 32636.2817
[2026-10-07T19:38:12Z] p4905-attack-f8 distinct items per warp: n 524288 min 4089 p1 4093 median 4096 p99 4096 max 4096 mean 4095.4889
[2026-10-07T19:38:12Z] uniform expectation: distinct lines per hash 1023.875 of 1024 reads, per warp 32640.3 of 32768 reads (2^22 lines); distinct items per hash 127.9995 of 128, per warp 4095.50 of 4096 (2^24 items)
[2026-10-07T19:38:12Z] positions: largest hi16-bucket (256 items) share 0.0070% at p72 (iteration 4, site 8, instr 30); windowed expectation 0.0061%; largest saturated-source share 0.0000% at p0 (site 0, instr 5)
[2026-10-07T19:38:12Z] acceptance-style (2,048 evaluations, the rule's sample size): the most repeated address at one position 1 of 2048 at p0 (site 0, instr 5); saturated sources at one position 0 of 2048 at p0 (site 0, instr 5); uniform expectation: repeats 1 to 2, saturated 0
[2026-10-07T19:38:12Z] p4905-attack-f8 item histogram (flat): bins 16777216 reads 2147483648 mean 128.000 sigma 11.314 max 228 (bin 1753107) z_max +8.84 min 57 z_min -6.28 chi2/dof 3.59464 chi2_z +7514.88 top0.1% 0.15005% top0.5% 0.71974% top1% 1.41051%
[2026-10-07T19:38:12Z] p4905-attack-f8 item histogram against the window density: full 2^24 chi2/dof 1.09683 largest 191 (item 0x540016) at +6.48 sigma smallest at -4.80; buckets64 chi2/dof 3.12002 largest 7734 (bucket 131072) at +13.21 sigma smallest at -5.68
[2026-10-07T19:38:14Z] p4905-attack-f8 WINDOWED CONTROL item histogram (flat): bins 16777216 reads 2147483648 mean 128.000 sigma 11.314 max 222 (bin 1666649) z_max +8.31 min 55 z_min -6.45 chi2/dof 3.49977 chi2_z +7240.10 top0.1% 0.14828% top0.5% 0.71368% top1% 1.40035%
[2026-10-07T19:38:14Z] p4905-attack-f8 WINDOWED CONTROL against the window density: full chi2/dof 0.99971 largest +6.08 sigma; buckets64 chi2/dof 1.00008 largest +5.07 smallest -4.24
[2026-10-07T19:38:14Z] 6-sigma p4905-attack-f8 items buckets64 against the window density: largest bucket +13.21 sigma, smallest -5.68 -> FLAGGED (beyond 6 sigma)
[2026-10-07T19:38:14Z] hot-set p4905-attack-f8 items (windowed control): f 0.1% S_f 0.15005% E_f(control) 0.14828% X_f +0.00177% X_f/f +0.0177 -> no hot set
[2026-10-07T19:38:14Z] hot-set p4905-attack-f8 items (windowed control): f 0.5% S_f 0.71974% E_f(control) 0.71368% X_f +0.00606% X_f/f +0.0121 -> no hot set
[2026-10-07T19:38:14Z] hot-set p4905-attack-f8 items (windowed control): f 1.0% S_f 1.41051% E_f(control) 1.40035% X_f +0.01016% X_f/f +0.0102 -> no hot set
[2026-10-07T19:38:14Z] hot-set p4905-attack-f8 items (windowed control): verdict clear
[2026-10-07T19:38:17Z] p4905-attack-f8 FLAT CONTROL item histogram: bins 16777216 reads 2147483648 mean 128.000 sigma 11.314 max 195 (bin 10628297) z_max +5.92 min 75 z_min -4.68 chi2/dof 1.00000 chi2_z +0.00 top0.1% 0.13109% top0.5% 0.63249% top1% 1.24335%
[2026-10-07T19:38:17Z] hot-set p4905-attack-f8 items (flat control, the auditor's first view): f 0.1% S_f 0.15005% E_f(control) 0.13109% X_f +0.01896% X_f/f +0.1896 -> no hot set
[2026-10-07T19:38:17Z] hot-set p4905-attack-f8 items (flat control, the auditor's first view): f 0.5% S_f 0.71974% E_f(control) 0.63249% X_f +0.08725% X_f/f +0.1745 -> no hot set
[2026-10-07T19:38:17Z] hot-set p4905-attack-f8 items (flat control, the auditor's first view): f 1.0% S_f 1.41051% E_f(control) 1.24335% X_f +0.16715% X_f/f +0.1672 -> no hot set
[2026-10-07T19:38:17Z] hot-set p4905-attack-f8 items (flat control, the auditor's first view): verdict clear
[2026-10-07T19:38:17Z] ratio p4905-attack-f8: top 0.1% / 0.5% / 1% share over the WINDOW-MODEL control 1.0120x / 1.0085x / 1.0073x (gate 1.2x at 0.1%: within); over the FLAT control 1.1446x / 1.1379x / 1.1344x
[2026-10-07T19:38:17Z] hottest item p4905-attack-f8 (0x1ac013): 228 reads (0.0000% of all); predicted source none
[2026-10-07T19:38:17Z] program p4905-attack-f8 DONE: 16777216 nonces; 6-sigma (windowed) FLAGGED; hot-set clear; verdict FLAGGED
[2026-10-07T19:38:17Z] attack-f8 0.1.0 (igneum-pow 4); args ["warps", "--program", "102519", "--nonces", "16777216", "--threads", "32", "--out", "/srv/builds/_adv-adv-accept/live", "--validate", "sample"]
[2026-10-07T19:38:17Z] census warps: programs [102519] day 20730 nonces 16777216 threads 32 plant none validate sample check_every 997 diag false
[2026-10-07T19:38:18Z] day 20730: cache filled in 0.62 s, fnv 448274a57f508cbc
[2026-10-07T19:38:20Z] table: 16777216 items derived with their 8 lines in 2.0 s; library comparison sample (0 mismatches)
[2026-10-07T19:38:24Z] program p102519-attack-f8: epoch seed c623193f1253dca70f35b41832338f415a70ed0b9cadb7f978a25c4e45b9cb88 era seed 01c6f92b931179fccad0510c58262dd7772b89fff9b2329c009636789872b333 id eeb0153f9228a8a9 attempt 0 class mx8-era1233d672+sh256x27 op mix load=16 shfl=8 mul=7 mulhi=6 xor=6 add=5 mad=4 sub=4 rotl=3 rotr=3 or=2; era stride mul 0x8959b5a1 rot 25 interleave [1, 4, 6, 14] windows 1:2:2 7:0:0 11:2:1 13:0:0 24:1:1 26:2:1 27:1:0 35:0:0 39:1:1 41:2:3 43:2:1 45:0:0 48:1:1 52:0:0 57:1:1 60:1:0
[2026-10-07T19:38:24Z] load site instr 1: src r0 win 2 off 2; last base writer mad at 58; writers back to the last injecting one: mad@58; shadow writes of r0 per rep: add=7 mad=3 mul=2 mulhi=4 rotl=2 shfl=1 sub=3 xor=3
[2026-10-07T19:38:24Z] load site instr 7: src r5 win 0 off 0; last base writer load at 1; writers back to the last injecting one: load@1; shadow writes of r5 per rep: add=4 mad=1 mul=1 mulhi=2 or=1 rotl=4 rotr=4 shfl=5 sub=2 xor=4
[2026-10-07T19:38:24Z] load site instr 11: src r0 win 2 off 1; last base writer shfl at 5; writers back to the last injecting one: shfl@5; shadow writes of r0 per rep: add=7 mad=3 mul=2 mulhi=4 rotl=2 shfl=1 sub=3 xor=3
[2026-10-07T19:38:24Z] load site instr 13: src r4 win 0 off 0; last base writer load at 11; writers back to the last injecting one: load@11; shadow writes of r4 per rep: add=5 mad=5 mul=3 mulhi=2 or=3 rotl=2 rotr=4 shfl=1 sub=2
[2026-10-07T19:38:24Z] load site instr 24: src r7 win 1 off 1; last base writer rotr at 23; writers back to the last injecting one: rotr@23 xor@22; shadow writes of r7 per rep: add=6 mad=4 mul=3 mulhi=1 or=2 rotl=2 rotr=3 shfl=3 sub=3 xor=7
[2026-10-07T19:38:24Z] load site instr 26: src r5 win 2 off 1; last base writer shfl at 19; writers back to the last injecting one: shfl@19; shadow writes of r5 per rep: add=4 mad=1 mul=1 mulhi=2 or=1 rotl=4 rotr=4 shfl=5 sub=2 xor=4
[2026-10-07T19:38:24Z] load site instr 27: src r3 win 1 off 0; last base writer xor at 25; writers back to the last injecting one: xor@25; shadow writes of r3 per rep: add=6 mad=2 mul=3 mulhi=2 or=2 rotl=2 rotr=1 shfl=4 sub=1 xor=6
[2026-10-07T19:38:24Z] load site instr 35: src r4 win 0 off 0; last base writer mad at 34; writers back to the last injecting one: mad@34; shadow writes of r4 per rep: add=5 mad=5 mul=3 mulhi=2 or=3 rotl=2 rotr=4 shfl=1 sub=2
[2026-10-07T19:38:24Z] load site instr 39: src r2 win 1 off 1; last base writer mad at 21; writers back to the last injecting one: mad@21; shadow writes of r2 per rep: add=4 mad=3 mul=8 mulhi=2 or=2 rotl=2 rotr=4 shfl=4 sub=7 xor=7
[2026-10-07T19:38:24Z] load site instr 41: src r7 win 2 off 3; last base writer shfl at 38; writers back to the last injecting one: shfl@38; shadow writes of r7 per rep: add=6 mad=4 mul=3 mulhi=1 or=2 rotl=2 rotr=3 shfl=3 sub=3 xor=7
[2026-10-07T19:38:24Z] load site instr 43: src r3 win 2 off 1; last base writer load at 39; writers back to the last injecting one: load@39; shadow writes of r3 per rep: add=6 mad=2 mul=3 mulhi=2 or=2 rotl=2 rotr=1 shfl=4 sub=1 xor=6
[2026-10-07T19:38:24Z] load site instr 45: src r5 win 0 off 0; last base writer add at 36; writers back to the last injecting one: add@36; shadow writes of r5 per rep: add=4 mad=1 mul=1 mulhi=2 or=1 rotl=4 rotr=4 shfl=5 sub=2 xor=4
[2026-10-07T19:38:24Z] load site instr 48: src r3 win 1 off 1; last base writer sub at 47; writers back to the last injecting one: sub@47; shadow writes of r3 per rep: add=6 mad=2 mul=3 mulhi=2 or=2 rotl=2 rotr=1 shfl=4 sub=1 xor=6
[2026-10-07T19:38:24Z] load site instr 52: src r0 win 0 off 0; last base writer add at 49; writers back to the last injecting one: add@49; shadow writes of r0 per rep: add=7 mad=3 mul=2 mulhi=4 rotl=2 shfl=1 sub=3 xor=3
[2026-10-07T19:38:24Z] load site instr 57: src r4 win 1 off 1; last base writer load at 52; writers back to the last injecting one: load@52; shadow writes of r4 per rep: add=5 mad=5 mul=3 mulhi=2 or=3 rotl=2 rotr=4 shfl=1 sub=2
[2026-10-07T19:38:24Z] load site instr 60: src r6 win 1 off 0; last base writer xor at 44; writers back to the last injecting one: xor@44; shadow writes of r6 per rep: add=4 mad=4 mul=4 mulhi=1 or=3 rotl=5 rotr=4 shfl=5 sub=4 xor=4
[2026-10-07T19:38:24Z] window layer: site item windows (first, items) (0x800000,2^22) (0x0,2^24) (0x400000,2^22) (0x0,2^24) (0x800000,2^23) (0x400000,2^22) (0x0,2^23) (0x0,2^24) (0x800000,2^23) (0xc00000,2^22) (0x400000,2^22) (0x0,2^24) (0x800000,2^23) (0x0,2^24) (0x800000,2^23) (0x0,2^23); expected reads per item by quarter 72.000 168.000 136.000 136.000 (flat uniform 128.000)
[2026-10-07T19:39:06Z] 524288 warps (16777216 nonces) interpreted in 41.6 s (2.540 ms per warp per thread); Epoch::hash_warp agreement on 589 warps: 0 mismatches
[2026-10-07T19:39:06Z] p102519-attack-f8 distinct lines per hash: n 16777216 min 1008 p1 1023 median 1024 p99 1024 max 1024 mean 1023.8701
[2026-10-07T19:39:06Z] p102519-attack-f8 distinct items per hash: n 16777216 min 126 p1 128 median 128 p99 128 max 128 mean 127.9994
[2026-10-07T19:39:06Z] p102519-attack-f8 distinct lines per warp: n 524288 min 32570 p1 32605 median 32636 p99 32664 max 32689 mean 32636.0278
[2026-10-07T19:39:06Z] p102519-attack-f8 distinct items per warp: n 524288 min 4090 p1 4093 median 4096 p99 4096 max 4096 mean 4095.4592
[2026-10-07T19:39:06Z] uniform expectation: distinct lines per hash 1023.875 of 1024 reads, per warp 32640.3 of 32768 reads (2^22 lines); distinct items per hash 127.9995 of 128, per warp 4095.50 of 4096 (2^24 items)
[2026-10-07T19:39:06Z] positions: largest hi16-bucket (256 items) share 0.0072% at p96 (iteration 6, site 0, instr 1); windowed expectation 0.0061%; largest saturated-source share 0.0000% at p4 (site 4, instr 24)
[2026-10-07T19:39:06Z] acceptance-style (2,048 evaluations, the rule's sample size): the most repeated address at one position 2 of 2048 at p22 (site 6, instr 27); saturated sources at one position 0 of 2048 at p0 (site 0, instr 1); uniform expectation: repeats 1 to 2, saturated 0
[2026-10-07T19:39:06Z] p102519-attack-f8 item histogram (flat): bins 16777216 reads 2147483648 mean 128.000 sigma 11.314 max 234 (bin 4479201) z_max +9.37 min 34 z_min -8.31 chi2/dof 10.50210 chi2_z +27521.01 top0.1% 0.16224% top0.5% 0.78208% top1% 1.53562%
[2026-10-07T19:39:06Z] p102519-attack-f8 item histogram against the window density: full 2^24 chi2/dof 1.00337 largest 202 (item 0xc38f9a) at +5.66 sigma smallest at -4.71; buckets64 chi2/dof 1.22417 largest 9185 (bucket 180092) at +5.16 sigma smallest at -4.72
[2026-10-07T19:39:08Z] p102519-attack-f8 WINDOWED CONTROL item histogram (flat): bins 16777216 reads 2147483648 mean 128.000 sigma 11.314 max 242 (bin 4338316) z_max +10.08 min 35 z_min -8.22 chi2/dof 10.50147 chi2_z +27519.20 top0.1% 0.16226% top0.5% 0.78194% top1% 1.53536%
[2026-10-07T19:39:08Z] p102519-attack-f8 WINDOWED CONTROL against the window density: full chi2/dof 0.99992 largest +6.01 sigma; buckets64 chi2/dof 0.99574 largest +4.60 smallest -4.58
[2026-10-07T19:39:08Z] 6-sigma p102519-attack-f8 items buckets64 against the window density: largest bucket +5.16 sigma, smallest -4.72 -> within 6 sigma
[2026-10-07T19:39:08Z] hot-set p102519-attack-f8 items (windowed control): f 0.1% S_f 0.16224% E_f(control) 0.16226% X_f -0.00002% X_f/f -0.0002 -> no hot set
[2026-10-07T19:39:08Z] hot-set p102519-attack-f8 items (windowed control): f 0.5% S_f 0.78208% E_f(control) 0.78194% X_f +0.00014% X_f/f +0.0003 -> no hot set
[2026-10-07T19:39:08Z] hot-set p102519-attack-f8 items (windowed control): f 1.0% S_f 1.53562% E_f(control) 1.53536% X_f +0.00025% X_f/f +0.0003 -> no hot set
[2026-10-07T19:39:08Z] hot-set p102519-attack-f8 items (windowed control): verdict clear
[2026-10-07T19:39:10Z] p102519-attack-f8 FLAT CONTROL item histogram: bins 16777216 reads 2147483648 mean 128.000 sigma 11.314 max 190 (bin 11899073) z_max +5.48 min 71 z_min -5.04 chi2/dof 1.00060 chi2_z +1.73 top0.1% 0.13105% top0.5% 0.63244% top1% 1.24335%
[2026-10-07T19:39:10Z] hot-set p102519-attack-f8 items (flat control, the auditor's first view): f 0.1% S_f 0.16224% E_f(control) 0.13105% X_f +0.03118% X_f/f +0.3118 -> no hot set
[2026-10-07T19:39:10Z] hot-set p102519-attack-f8 items (flat control, the auditor's first view): f 0.5% S_f 0.78208% E_f(control) 0.63244% X_f +0.14964% X_f/f +0.2993 -> no hot set
[2026-10-07T19:39:10Z] hot-set p102519-attack-f8 items (flat control, the auditor's first view): f 1.0% S_f 1.53562% E_f(control) 1.24335% X_f +0.29227% X_f/f +0.2923 -> no hot set
[2026-10-07T19:39:10Z] hot-set p102519-attack-f8 items (flat control, the auditor's first view): verdict clear
[2026-10-07T19:39:10Z] ratio p102519-attack-f8: top 0.1% / 0.5% / 1% share over the WINDOW-MODEL control 0.9999x / 1.0002x / 1.0002x (gate 1.2x at 0.1%: within); over the FLAT control 1.2380x / 1.2366x / 1.2351x
[2026-10-07T19:39:10Z] hottest item p102519-attack-f8 (0x4458e1): 234 reads (0.0000% of all); predicted source none
[2026-10-07T19:39:10Z] program p102519-attack-f8 DONE: 16777216 nonces; 6-sigma (windowed) clear; hot-set clear; verdict PASS (no test fired)
[2026-10-07T19:39:11Z] attack-f8 0.1.0 (igneum-pow 4); args ["warps", "--program", "101697", "--nonces", "16777216", "--threads", "32", "--out", "/srv/builds/_adv-adv-accept/live", "--validate", "sample"]
[2026-10-07T19:39:11Z] census warps: programs [101697] day 20730 nonces 16777216 threads 32 plant none validate sample check_every 997 diag false
[2026-10-07T19:39:11Z] day 20730: cache filled in 0.37 s, fnv 448274a57f508cbc
[2026-10-07T19:39:13Z] table: 16777216 items derived with their 8 lines in 1.5 s; library comparison sample (0 mismatches)
[2026-10-07T19:39:15Z] program p101697-attack-f8: epoch seed f189d1c446fe93043fb10444699cf6f4e03efd94f179fee03491c0e263ec241b era seed 66db038c6a7bf0212a95ff65419a33af4f6369562f015fe4a1e5320c4de2b834 id dc515e6670e7d85e attempt 1 class mx8-eraf716899f+sh256x27 op mix load=16 mul=8 xor=8 shfl=7 add=6 rotr=6 mad=4 rotl=4 sub=4 mulhi=1; era stride mul 0xa1f081e7 rot 25 interleave [1, 2, 9, 15] windows 1:0:0 2:1:1 3:0:0 6:1:0 13:1:1 15:2:2 19:2:1 24:0:0 30:0:0 37:1:0 40:0:0 41:1:1 45:0:0 58:1:0 61:1:1 62:1:1
[2026-10-07T19:39:15Z] load site instr 1: src r3 win 0 off 0; last base writer rotr at 0; writers back to the last injecting one: rotr@0 sub@60; shadow writes of r3 per rep: add=3 mad=1 mul=3 mulhi=2 rotl=6 rotr=3 shfl=6 sub=7 xor=6
[2026-10-07T19:39:15Z] load site instr 2: src r4 win 1 off 1; last base writer load at 1; writers back to the last injecting one: load@1; shadow writes of r4 per rep: add=4 mad=7 mul=2 mulhi=5 or=2 rotl=3 rotr=3 shfl=1 sub=2 xor=8
[2026-10-07T19:39:15Z] load site instr 3: src r5 win 0 off 0; last base writer load at 2; writers back to the last injecting one: load@2; shadow writes of r5 per rep: add=8 mul=4 or=1 rotl=3 rotr=2 shfl=4 sub=2 xor=2
[2026-10-07T19:39:15Z] load site instr 6: src r4 win 1 off 0; last base writer shfl at 4; writers back to the last injecting one: shfl@4; shadow writes of r4 per rep: add=4 mad=7 mul=2 mulhi=5 or=2 rotl=3 rotr=3 shfl=1 sub=2 xor=8
[2026-10-07T19:39:15Z] load site instr 13: src r5 win 1 off 1; last base writer shfl at 12; writers back to the last injecting one: shfl@12; shadow writes of r5 per rep: add=8 mul=4 or=1 rotl=3 rotr=2 shfl=4 sub=2 xor=2
[2026-10-07T19:39:15Z] load site instr 15: src r2 win 2 off 2; last base writer mad at 11; writers back to the last injecting one: mad@11; shadow writes of r2 per rep: add=9 mad=1 mulhi=3 rotl=4 rotr=3 shfl=5 sub=3 xor=3
[2026-10-07T19:39:15Z] load site instr 19: src r6 win 2 off 1; last base writer load at 13; writers back to the last injecting one: load@13; shadow writes of r6 per rep: add=1 mad=1 mul=3 mulhi=2 or=1 rotl=4 rotr=2 shfl=4 xor=3
[2026-10-07T19:39:15Z] load site instr 24: src r5 win 0 off 0; last base writer mad at 20; writers back to the last injecting one: mad@20; shadow writes of r5 per rep: add=8 mul=4 or=1 rotl=3 rotr=2 shfl=4 sub=2 xor=2
[2026-10-07T19:39:15Z] load site instr 30: src r5 win 0 off 0; last base writer xor at 26; writers back to the last injecting one: xor@26; shadow writes of r5 per rep: add=8 mul=4 or=1 rotl=3 rotr=2 shfl=4 sub=2 xor=2
[2026-10-07T19:39:15Z] load site instr 37: src r0 win 1 off 0; last base writer sub at 32; writers back to the last injecting one: sub@32; shadow writes of r0 per rep: add=1 mad=3 mul=5 mulhi=2 or=2 rotl=3 rotr=2 shfl=4 xor=5
[2026-10-07T19:39:15Z] load site instr 40: src r7 win 0 off 0; last base writer load at 24; writers back to the last injecting one: load@24; shadow writes of r7 per rep: add=6 mad=2 mul=4 mulhi=3 or=1 rotl=2 rotr=4 shfl=4 sub=4 xor=5
[2026-10-07T19:39:15Z] load site instr 41: src r6 win 1 off 1; last base writer load at 40; writers back to the last injecting one: load@40; shadow writes of r6 per rep: add=1 mad=1 mul=3 mulhi=2 or=1 rotl=4 rotr=2 shfl=4 xor=3
[2026-10-07T19:39:15Z] load site instr 45: src r4 win 0 off 0; last base writer add at 43; writers back to the last injecting one: add@43; shadow writes of r4 per rep: add=4 mad=7 mul=2 mulhi=5 or=2 rotl=3 rotr=3 shfl=1 sub=2 xor=8
[2026-10-07T19:39:15Z] load site instr 58: src r6 win 1 off 0; last base writer xor at 42; writers back to the last injecting one: xor@42; shadow writes of r6 per rep: add=1 mad=1 mul=3 mulhi=2 or=1 rotl=4 rotr=2 shfl=4 xor=3
[2026-10-07T19:39:15Z] load site instr 61: src r1 win 1 off 1; last base writer rotr at 56; writers back to the last injecting one: rotr@56 shfl@52; shadow writes of r1 per rep: add=14 mad=3 mul=3 mulhi=2 or=3 rotl=1 rotr=3 shfl=3 sub=2 xor=8
[2026-10-07T19:39:15Z] load site instr 62: src r3 win 1 off 1; last base writer sub at 60; writers back to the last injecting one: sub@60; shadow writes of r3 per rep: add=3 mad=1 mul=3 mulhi=2 rotl=6 rotr=3 shfl=6 sub=7 xor=6
[2026-10-07T19:39:15Z] window layer: site item windows (first, items) (0x0,2^24) (0x800000,2^23) (0x0,2^24) (0x0,2^23) (0x800000,2^23) (0x800000,2^22) (0x400000,2^22) (0x0,2^24) (0x0,2^24) (0x0,2^23) (0x0,2^24) (0x800000,2^23) (0x0,2^24) (0x0,2^23) (0x800000,2^23) (0x800000,2^23); expected reads per item by quarter 96.000 128.000 160.000 128.000 (flat uniform 128.000)
[2026-10-07T19:39:48Z] 524288 warps (16777216 nonces) interpreted in 33.4 s (2.042 ms per warp per thread); Epoch::hash_warp agreement on 589 warps: 0 mismatches
[2026-10-07T19:39:48Z] p101697-attack-f8 distinct lines per hash: n 16777216 min 1008 p1 1023 median 1024 p99 1024 max 1024 mean 1023.8711
[2026-10-07T19:39:48Z] p101697-attack-f8 distinct items per hash: n 16777216 min 126 p1 128 median 128 p99 128 max 128 mean 127.9995
[2026-10-07T19:39:48Z] p101697-attack-f8 distinct lines per warp: n 524288 min 32566 p1 32605 median 32637 p99 32664 max 32686 mean 32636.2670
[2026-10-07T19:39:48Z] p101697-attack-f8 distinct items per warp: n 524288 min 4089 p1 4093 median 4096 p99 4096 max 4096 mean 4095.4845
[2026-10-07T19:39:48Z] uniform expectation: distinct lines per hash 1023.875 of 1024 reads, per warp 32640.3 of 32768 reads (2^22 lines); distinct items per hash 127.9995 of 128, per warp 4095.50 of 4096 (2^24 items)
[2026-10-07T19:39:48Z] positions: largest hi16-bucket (256 items) share 0.0085% at p5 (iteration 0, site 5, instr 15); windowed expectation 0.0061%; largest saturated-source share 0.0000% at p0 (site 0, instr 1)
[2026-10-07T19:39:48Z] acceptance-style (2,048 evaluations, the rule's sample size): the most repeated address at one position 2 of 2048 at p3 (site 3, instr 6); saturated sources at one position 0 of 2048 at p0 (site 0, instr 1); uniform expectation: repeats 1 to 2, saturated 0
[2026-10-07T19:39:49Z] p101697-attack-f8 item histogram (flat): bins 16777216 reads 2147483648 mean 128.000 sigma 11.314 max 234 (bin 9400112) z_max +9.37 min 50 z_min -6.89 chi2/dof 5.12638 chi2_z +11951.27 top0.1% 0.15985% top0.5% 0.76802% top1% 1.50518%
[2026-10-07T19:39:49Z] p101697-attack-f8 item histogram against the window density: full 2^24 chi2/dof 1.10040 largest 155 (item 0x5cbf9) at +6.02 sigma smallest at -5.22; buckets64 chi2/dof 7.39860 largest 11208 (bucket 161811) at +9.57 sigma smallest at -8.82
[2026-10-07T19:39:51Z] p101697-attack-f8 WINDOWED CONTROL item histogram (flat): bins 16777216 reads 2147483648 mean 128.000 sigma 11.314 max 229 (bin 9402400) z_max +8.93 min 52 z_min -6.72 chi2/dof 5.00026 chi2_z +11585.99 top0.1% 0.15532% top0.5% 0.74787% top1% 1.46785%
[2026-10-07T19:39:51Z] p101697-attack-f8 WINDOWED CONTROL against the window density: full chi2/dof 0.99991 largest +5.61 sigma; buckets64 chi2/dof 0.99867 largest +4.38 smallest -4.44
[2026-10-07T19:39:51Z] 6-sigma p101697-attack-f8 items buckets64 against the window density: largest bucket +9.57 sigma, smallest -8.82 -> FLAGGED (beyond 6 sigma)
[2026-10-07T19:39:51Z] hot-set p101697-attack-f8 items (windowed control): f 0.1% S_f 0.15985% E_f(control) 0.15532% X_f +0.00452% X_f/f +0.0452 -> no hot set
[2026-10-07T19:39:51Z] hot-set p101697-attack-f8 items (windowed control): f 0.5% S_f 0.76802% E_f(control) 0.74787% X_f +0.02015% X_f/f +0.0403 -> no hot set
[2026-10-07T19:39:51Z] hot-set p101697-attack-f8 items (windowed control): f 1.0% S_f 1.50518% E_f(control) 1.46785% X_f +0.03734% X_f/f +0.0373 -> no hot set
[2026-10-07T19:39:51Z] hot-set p101697-attack-f8 items (windowed control): verdict clear
[2026-10-07T19:39:53Z] p101697-attack-f8 FLAT CONTROL item histogram: bins 16777216 reads 2147483648 mean 128.000 sigma 11.314 max 194 (bin 10939870) z_max +5.83 min 71 z_min -5.04 chi2/dof 0.99947 chi2_z -1.54 top0.1% 0.13106% top0.5% 0.63246% top1% 1.24332%
[2026-10-07T19:39:53Z] hot-set p101697-attack-f8 items (flat control, the auditor's first view): f 0.1% S_f 0.15985% E_f(control) 0.13106% X_f +0.02878% X_f/f +0.2878 -> no hot set
[2026-10-07T19:39:53Z] hot-set p101697-attack-f8 items (flat control, the auditor's first view): f 0.5% S_f 0.76802% E_f(control) 0.63246% X_f +0.13556% X_f/f +0.2711 -> no hot set
[2026-10-07T19:39:53Z] hot-set p101697-attack-f8 items (flat control, the auditor's first view): f 1.0% S_f 1.50518% E_f(control) 1.24332% X_f +0.26187% X_f/f +0.2619 -> no hot set
[2026-10-07T19:39:53Z] hot-set p101697-attack-f8 items (flat control, the auditor's first view): verdict clear
[2026-10-07T19:39:53Z] ratio p101697-attack-f8: top 0.1% / 0.5% / 1% share over the WINDOW-MODEL control 1.0291x / 1.0269x / 1.0254x (gate 1.2x at 0.1%: within); over the FLAT control 1.2196x / 1.2143x / 1.2106x
[2026-10-07T19:39:53Z] hottest item p101697-attack-f8 (0x8f6f30): 234 reads (0.0000% of all); predicted source none
[2026-10-07T19:39:53Z] program p101697-attack-f8 DONE: 16777216 nonces; 6-sigma (windowed) FLAGGED; hot-set clear; verdict FLAGGED
[2026-10-07T19:39:53Z] attack-f8 0.1.0 (igneum-pow 4); args ["warps", "--program", "106740", "--nonces", "16777216", "--threads", "32", "--out", "/srv/builds/_adv-adv-accept/live", "--validate", "sample"]
[2026-10-07T19:39:53Z] census warps: programs [106740] day 20730 nonces 16777216 threads 32 plant none validate sample check_every 997 diag false
[2026-10-07T19:39:54Z] day 20730: cache filled in 0.38 s, fnv 448274a57f508cbc
[2026-10-07T19:39:56Z] table: 16777216 items derived with their 8 lines in 1.5 s; library comparison sample (0 mismatches)
[2026-10-07T19:39:58Z] program p106740-attack-f8: epoch seed 87fdc67bf96e44f8ce0bec73b10082b6680ee0edb88f52b87c7fa0ec02290acf era seed 51e7515713be72dd0bb6e552034a27917961bbc09db018b978c748a768a6f11e id 13c12e6a0c3dfba1 attempt 4 class mx8-eraf2949c7e+sh256x27 op mix load=16 mul=8 mulhi=8 add=7 rotl=7 shfl=6 rotr=5 xor=3 mad=2 or=2; era stride mul 0x3c66c63d rot 20 interleave [1, 5, 10, 14] windows 1:1:0 6:0:0 7:1:1 11:0:0 18:2:3 29:0:0 30:2:2 32:1:0 34:2:3 36:2:0 45:2:3 50:2:2 54:0:0 56:2:0 57:1:1 60:0:0
[2026-10-07T19:39:58Z] load site instr 1: src r6 win 1 off 0; last base writer rotl at 0; writers back to the last injecting one: rotl@0 rotl@47 mul@44 mul@39 mulhi@31 mulhi@26 rotr@24 load@18; shadow writes of r6 per rep: add=11 mad=7 mul=2 or=2 rotl=5 rotr=1 shfl=5 sub=2 xor=3
[2026-10-07T19:39:58Z] load site instr 6: src r1 win 0 off 0; last base writer rotr at 3; writers back to the last injecting one: rotr@3 rotl@43 add@42; shadow writes of r1 per rep: add=7 mad=4 mul=3 mulhi=4 or=1 rotl=2 rotr=3 shfl=4 sub=4 xor=6
[2026-10-07T19:39:58Z] load site instr 7: src r4 win 1 off 1; last base writer add at 2; writers back to the last injecting one: add@2; shadow writes of r4 per rep: add=6 mad=4 mul=4 mulhi=3 or=1 rotl=2 rotr=4 shfl=3 xor=3
[2026-10-07T19:39:58Z] load site instr 11: src r5 win 0 off 0; last base writer load at 7; writers back to the last injecting one: load@7; shadow writes of r5 per rep: add=5 mad=4 mul=5 mulhi=1 or=1 rotl=1 rotr=3 shfl=3 sub=2 xor=4
[2026-10-07T19:39:58Z] load site instr 18: src r2 win 2 off 3; last base writer load at 11; writers back to the last injecting one: load@11; shadow writes of r2 per rep: add=5 mad=4 mul=3 mulhi=2 or=2 rotr=2 shfl=3 sub=3 xor=2
[2026-10-07T19:39:58Z] load site instr 29: src r0 win 0 off 0; last base writer rotl at 22; writers back to the last injecting one: rotl@22 load@56; shadow writes of r0 per rep: add=3 mad=3 mul=1 mulhi=4 or=1 rotl=4 rotr=4 shfl=1 sub=2 xor=4
[2026-10-07T19:39:58Z] load site instr 30: src r4 win 2 off 2; last base writer load at 29; writers back to the last injecting one: load@29; shadow writes of r4 per rep: add=6 mad=4 mul=4 mulhi=3 or=1 rotl=2 rotr=4 shfl=3 xor=3
[2026-10-07T19:39:58Z] load site instr 32: src r0 win 1 off 0; last base writer load at 30; writers back to the last injecting one: load@30; shadow writes of r0 per rep: add=3 mad=3 mul=1 mulhi=4 or=1 rotl=4 rotr=4 shfl=1 sub=2 xor=4
[2026-10-07T19:39:58Z] load site instr 34: src r1 win 2 off 3; last base writer rotr at 33; writers back to the last injecting one: rotr@33 load@32; shadow writes of r1 per rep: add=7 mad=4 mul=3 mulhi=4 or=1 rotl=2 rotr=3 shfl=4 sub=4 xor=6
[2026-10-07T19:39:58Z] load site instr 36: src r3 win 2 off 0; last base writer load at 34; writers back to the last injecting one: load@34; shadow writes of r3 per rep: add=9 mad=7 mul=5 mulhi=1 rotl=1 rotr=2 shfl=4 sub=3 xor=2
[2026-10-07T19:39:58Z] load site instr 45: src r7 win 2 off 3; last base writer shfl at 37; writers back to the last injecting one: shfl@37; shadow writes of r7 per rep: add=5 mad=3 mul=5 mulhi=5 or=1 rotl=5 rotr=1 shfl=3 sub=1 xor=5
[2026-10-07T19:39:58Z] load site instr 50: src r1 win 2 off 2; last base writer rotl at 43; writers back to the last injecting one: rotl@43 add@42; shadow writes of r1 per rep: add=7 mad=4 mul=3 mulhi=4 or=1 rotl=2 rotr=3 shfl=4 sub=4 xor=6
[2026-10-07T19:39:58Z] load site instr 54: src r3 win 0 off 0; last base writer rotr at 49; writers back to the last injecting one: rotr@49 add@48; shadow writes of r3 per rep: add=9 mad=7 mul=5 mulhi=1 rotl=1 rotr=2 shfl=4 sub=3 xor=2
[2026-10-07T19:39:58Z] load site instr 56: src r2 win 2 off 0; last base writer load at 54; writers back to the last injecting one: load@54; shadow writes of r2 per rep: add=5 mad=4 mul=3 mulhi=2 or=2 rotr=2 shfl=3 sub=3 xor=2
[2026-10-07T19:39:58Z] load site instr 57: src r0 win 1 off 1; last base writer load at 56; writers back to the last injecting one: load@56; shadow writes of r0 per rep: add=3 mad=3 mul=1 mulhi=4 or=1 rotl=4 rotr=4 shfl=1 sub=2 xor=4
[2026-10-07T19:39:58Z] load site instr 60: src r5 win 0 off 0; last base writer rotl at 59; writers back to the last injecting one: rotl@59 add@58; shadow writes of r5 per rep: add=5 mad=4 mul=5 mulhi=1 or=1 rotl=1 rotr=3 shfl=3 sub=2 xor=4
[2026-10-07T19:39:58Z] window layer: site item windows (first, items) (0x0,2^23) (0x0,2^24) (0x800000,2^23) (0x0,2^24) (0xc00000,2^22) (0x0,2^24) (0x800000,2^22) (0x0,2^23) (0xc00000,2^22) (0x0,2^22) (0xc00000,2^22) (0x800000,2^22) (0x0,2^24) (0x0,2^22) (0x800000,2^23) (0x0,2^24); expected reads per item by quarter 136.000 72.000 136.000 168.000 (flat uniform 128.000)
[2026-10-07T19:40:31Z] 524288 warps (16777216 nonces) interpreted in 33.6 s (2.051 ms per warp per thread); Epoch::hash_warp agreement on 589 warps: 0 mismatches
[2026-10-07T19:40:31Z] p106740-attack-f8 distinct lines per hash: n 16777216 min 1007 p1 1023 median 1024 p99 1024 max 1024 mean 1023.8711
[2026-10-07T19:40:31Z] p106740-attack-f8 distinct items per hash: n 16777216 min 126 p1 128 median 128 p99 128 max 128 mean 127.9995
[2026-10-07T19:40:31Z] p106740-attack-f8 distinct lines per warp: n 524288 min 32568 p1 32605 median 32636 p99 32664 max 32688 mean 32636.0951
[2026-10-07T19:40:31Z] p106740-attack-f8 distinct items per warp: n 524288 min 4090 p1 4093 median 4096 p99 4096 max 4096 mean 4095.4620
[2026-10-07T19:40:31Z] uniform expectation: distinct lines per hash 1023.875 of 1024 reads, per warp 32640.3 of 32768 reads (2^22 lines); distinct items per hash 127.9995 of 128, per warp 4095.50 of 4096 (2^24 items)
[2026-10-07T19:40:31Z] positions: largest hi16-bucket (256 items) share 0.0070% at p100 (iteration 6, site 4, instr 18); windowed expectation 0.0061%; largest saturated-source share 0.0000% at p21 (site 5, instr 29)
[2026-10-07T19:40:31Z] acceptance-style (2,048 evaluations, the rule's sample size): the most repeated address at one position 2 of 2048 at p30 (site 14, instr 57); saturated sources at one position 0 of 2048 at p0 (site 0, instr 1); uniform expectation: repeats 1 to 2, saturated 0
[2026-10-07T19:40:31Z] p106740-attack-f8 item histogram (flat): bins 16777216 reads 2147483648 mean 128.000 sigma 11.314 max 240 (bin 14554349) z_max +9.90 min 34 z_min -8.31 chi2/dof 10.50125 chi2_z +27518.55 top0.1% 0.16226% top0.5% 0.78204% top1% 1.53544%
[2026-10-07T19:40:32Z] p106740-attack-f8 item histogram against the window density: full 2^24 chi2/dof 1.00126 largest 240 (item 0xde14ed) at +5.55 sigma smallest at -4.97; buckets64 chi2/dof 1.11591 largest 4939 (bucket 128967) at +4.88 sigma smallest at -4.67
[2026-10-07T19:40:34Z] p106740-attack-f8 WINDOWED CONTROL item histogram (flat): bins 16777216 reads 2147483648 mean 128.000 sigma 11.314 max 243 (bin 13609730) z_max +10.16 min 33 z_min -8.40 chi2/dof 10.50116 chi2_z +27518.30 top0.1% 0.16229% top0.5% 0.78198% top1% 1.53538%
[2026-10-07T19:40:34Z] p106740-attack-f8 WINDOWED CONTROL against the window density: full chi2/dof 0.99973 largest +5.89 sigma; buckets64 chi2/dof 1.00204 largest +4.74 smallest -4.50
[2026-10-07T19:40:34Z] 6-sigma p106740-attack-f8 items buckets64 against the window density: largest bucket +4.88 sigma, smallest -4.67 -> within 6 sigma
[2026-10-07T19:40:34Z] hot-set p106740-attack-f8 items (windowed control): f 0.1% S_f 0.16226% E_f(control) 0.16229% X_f -0.00002% X_f/f -0.0002 -> no hot set
[2026-10-07T19:40:34Z] hot-set p106740-attack-f8 items (windowed control): f 0.5% S_f 0.78204% E_f(control) 0.78198% X_f +0.00006% X_f/f +0.0001 -> no hot set
[2026-10-07T19:40:34Z] hot-set p106740-attack-f8 items (windowed control): f 1.0% S_f 1.53544% E_f(control) 1.53538% X_f +0.00006% X_f/f +0.0001 -> no hot set
[2026-10-07T19:40:34Z] hot-set p106740-attack-f8 items (windowed control): verdict clear
[2026-10-07T19:40:36Z] p106740-attack-f8 FLAT CONTROL item histogram: bins 16777216 reads 2147483648 mean 128.000 sigma 11.314 max 201 (bin 13551481) z_max +6.45 min 74 z_min -4.77 chi2/dof 1.00050 chi2_z +1.44 top0.1% 0.13108% top0.5% 0.63249% top1% 1.24337%
[2026-10-07T19:40:36Z] hot-set p106740-attack-f8 items (flat control, the auditor's first view): f 0.1% S_f 0.16226% E_f(control) 0.13108% X_f +0.03118% X_f/f +0.3118 -> no hot set
[2026-10-07T19:40:36Z] hot-set p106740-attack-f8 items (flat control, the auditor's first view): f 0.5% S_f 0.78204% E_f(control) 0.63249% X_f +0.14955% X_f/f +0.2991 -> no hot set
[2026-10-07T19:40:36Z] hot-set p106740-attack-f8 items (flat control, the auditor's first view): f 1.0% S_f 1.53544% E_f(control) 1.24337% X_f +0.29207% X_f/f +0.2921 -> no hot set
[2026-10-07T19:40:36Z] hot-set p106740-attack-f8 items (flat control, the auditor's first view): verdict clear
[2026-10-07T19:40:36Z] ratio p106740-attack-f8: top 0.1% / 0.5% / 1% share over the WINDOW-MODEL control 0.9999x / 1.0001x / 1.0000x (gate 1.2x at 0.1%: within); over the FLAT control 1.2379x / 1.2364x / 1.2349x
[2026-10-07T19:40:36Z] hottest item p106740-attack-f8 (0xde14ed): 240 reads (0.0000% of all); predicted source none
[2026-10-07T19:40:36Z] program p106740-attack-f8 DONE: 16777216 nonces; 6-sigma (windowed) clear; hot-set clear; verdict PASS (no test fired)
[2026-10-07T19:40:36Z] attack-f8 0.1.0 (igneum-pow 4); args ["warps", "--program", "327", "--nonces", "16777216", "--threads", "32", "--out", "/srv/builds/_adv-adv-accept/live", "--validate", "sample"]
[2026-10-07T19:40:36Z] census warps: programs [327] day 20730 nonces 16777216 threads 32 plant none validate sample check_every 997 diag false
[2026-10-07T19:40:37Z] day 20730: cache filled in 0.37 s, fnv 448274a57f508cbc
[2026-10-07T19:40:38Z] table: 16777216 items derived with their 8 lines in 1.5 s; library comparison sample (0 mismatches)
[2026-10-07T19:40:42Z] program p327-attack-f8: epoch seed b303f24523c809225e21043bdc80b8cc749dd03d6d1b367a3e2cd03119caba1b era seed 2eb270290bc26a8c8789afcc9fdcb5a3d27715887a3c99a50503fbba24741287 id db888e977e940bf5 attempt 3 class mx8-eraa58b9f85+sh256x27 op mix load=16 rotl=8 add=7 xor=7 mulhi=6 rotr=6 sub=4 mad=3 mul=3 or=2 shfl=2; era stride mul 0x65fc66b7 rot 4 interleave [4, 8, 10, 13] windows 9:0:0 14:2:0 17:0:0 21:0:0 31:1:1 34:1:1 40:0:0 46:0:0 50:2:3 52:1:1 54:2:3 57:1:1 59:2:0 60:0:0 62:1:0 63:2:1
[2026-10-07T19:40:42Z] load site instr 9: src r3 win 0 off 0; last base writer rotl at 6; writers back to the last injecting one: rotl@6 sub@4; shadow writes of r3 per rep: add=3 mad=3 mul=10 mulhi=2 or=1 rotr=4 shfl=3 sub=2 xor=5
[2026-10-07T19:40:42Z] load site instr 14: src r1 win 2 off 0; last base writer sub at 12; writers back to the last injecting one: sub@12; shadow writes of r1 per rep: add=6 mad=5 mul=1 mulhi=3 or=2 rotl=4 rotr=2 shfl=3 xor=7
[2026-10-07T19:40:42Z] load site instr 17: src r4 win 0 off 0; last base writer load at 14; writers back to the last injecting one: load@14; shadow writes of r4 per rep: add=7 mad=2 mul=4 mulhi=4 or=3 rotl=3 rotr=2 shfl=2 sub=2 xor=3
[2026-10-07T19:40:42Z] load site instr 21: src r1 win 0 off 0; last base writer rotr at 20; writers back to the last injecting one: rotr@20 sub@12; shadow writes of r1 per rep: add=6 mad=5 mul=1 mulhi=3 or=2 rotl=4 rotr=2 shfl=3 xor=7
[2026-10-07T19:40:42Z] load site instr 31: src r4 win 1 off 1; last base writer xor at 30; writers back to the last injecting one: xor@30; shadow writes of r4 per rep: add=7 mad=2 mul=4 mulhi=4 or=3 rotl=3 rotr=2 shfl=2 sub=2 xor=3
[2026-10-07T19:40:42Z] load site instr 34: src r1 win 1 off 1; last base writer add at 27; writers back to the last injecting one: add@27; shadow writes of r1 per rep: add=6 mad=5 mul=1 mulhi=3 or=2 rotl=4 rotr=2 shfl=3 xor=7
[2026-10-07T19:40:42Z] load site instr 40: src r3 win 0 off 0; last base writer mad at 39; writers back to the last injecting one: mad@39; shadow writes of r3 per rep: add=3 mad=3 mul=10 mulhi=2 or=1 rotr=4 shfl=3 sub=2 xor=5
[2026-10-07T19:40:42Z] load site instr 46: src r6 win 0 off 0; last base writer add at 41; writers back to the last injecting one: add@41; shadow writes of r6 per rep: add=12 mad=4 mul=2 mulhi=4 or=1 rotl=2 rotr=3 shfl=4 sub=2 xor=4
[2026-10-07T19:40:42Z] load site instr 50: src r3 win 2 off 3; last base writer rotr at 45; writers back to the last injecting one: rotr@45 mad@39; shadow writes of r3 per rep: add=3 mad=3 mul=10 mulhi=2 or=1 rotr=4 shfl=3 sub=2 xor=5
[2026-10-07T19:40:42Z] load site instr 52: src r2 win 1 off 1; last base writer xor at 48; writers back to the last injecting one: xor@48; shadow writes of r2 per rep: add=5 mad=3 mul=5 mulhi=4 or=1 rotl=6 rotr=1 shfl=2 sub=4 xor=3
[2026-10-07T19:40:42Z] load site instr 54: src r0 win 2 off 3; last base writer load at 50; writers back to the last injecting one: load@50; shadow writes of r0 per rep: add=2 mad=2 mul=5 mulhi=3 rotl=3 rotr=1 shfl=4 sub=1 xor=3
[2026-10-07T19:40:42Z] load site instr 57: src r1 win 1 off 1; last base writer add at 56; writers back to the last injecting one: add@56; shadow writes of r1 per rep: add=6 mad=5 mul=1 mulhi=3 or=2 rotl=4 rotr=2 shfl=3 xor=7
[2026-10-07T19:40:42Z] load site instr 59: src r4 win 2 off 0; last base writer load at 57; writers back to the last injecting one: load@57; shadow writes of r4 per rep: add=7 mad=2 mul=4 mulhi=4 or=3 rotl=3 rotr=2 shfl=2 sub=2 xor=3
[2026-10-07T19:40:42Z] load site instr 60: src r3 win 0 off 0; last base writer load at 54; writers back to the last injecting one: load@54; shadow writes of r3 per rep: add=3 mad=3 mul=10 mulhi=2 or=1 rotr=4 shfl=3 sub=2 xor=5
[2026-10-07T19:40:42Z] load site instr 62: src r7 win 1 off 0; last base writer mad at 61; writers back to the last injecting one: mad@61; shadow writes of r7 per rep: add=4 mad=7 mul=1 mulhi=4 or=2 rotl=2 rotr=3 shfl=3 xor=2
[2026-10-07T19:40:42Z] load site instr 63: src r5 win 2 off 1; last base writer load at 59; writers back to the last injecting one: load@59; shadow writes of r5 per rep: add=8 mad=4 mul=2 mulhi=1 rotl=3 rotr=1 shfl=3 sub=2 xor=10
[2026-10-07T19:40:42Z] window layer: site item windows (first, items) (0x0,2^24) (0x0,2^22) (0x0,2^24) (0x0,2^24) (0x800000,2^23) (0x800000,2^23) (0x0,2^24) (0x0,2^24) (0xc00000,2^22) (0x800000,2^23) (0xc00000,2^22) (0x800000,2^23) (0x0,2^22) (0x0,2^24) (0x0,2^23) (0x400000,2^22); expected reads per item by quarter 128.000 96.000 112.000 176.000 (flat uniform 128.000)
Terminated

View file

@ -0,0 +1,144 @@
lease: holding 32 pool cores (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, waited 0 s, class adv): adv-accept live-random-rest
[2026-10-07T20:13:29Z] attack-f8 0.1.0 (igneum-pow 4); args ["warps", "--program", "327", "--nonces", "16777216", "--threads", "32", "--out", "/srv/builds/_adv-adv-accept/live", "--validate", "sample"]
[2026-10-07T20:13:29Z] census warps: programs [327] day 20730 nonces 16777216 threads 32 plant none validate sample check_every 997 diag false
[2026-10-07T20:13:29Z] day 20730: cache filled in 0.51 s, fnv 448274a57f508cbc
[2026-10-07T20:13:32Z] table: 16777216 items derived with their 8 lines in 1.7 s; library comparison sample (0 mismatches)
[2026-10-07T20:13:36Z] program p327-attack-f8: epoch seed b303f24523c809225e21043bdc80b8cc749dd03d6d1b367a3e2cd03119caba1b era seed 2eb270290bc26a8c8789afcc9fdcb5a3d27715887a3c99a50503fbba24741287 id db888e977e940bf5 attempt 3 class mx8-eraa58b9f85+sh256x27 op mix load=16 rotl=8 add=7 xor=7 mulhi=6 rotr=6 sub=4 mad=3 mul=3 or=2 shfl=2; era stride mul 0x65fc66b7 rot 4 interleave [4, 8, 10, 13] windows 9:0:0 14:2:0 17:0:0 21:0:0 31:1:1 34:1:1 40:0:0 46:0:0 50:2:3 52:1:1 54:2:3 57:1:1 59:2:0 60:0:0 62:1:0 63:2:1
[2026-10-07T20:13:36Z] load site instr 9: src r3 win 0 off 0; last base writer rotl at 6; writers back to the last injecting one: rotl@6 sub@4; shadow writes of r3 per rep: add=3 mad=3 mul=10 mulhi=2 or=1 rotr=4 shfl=3 sub=2 xor=5
[2026-10-07T20:13:36Z] load site instr 14: src r1 win 2 off 0; last base writer sub at 12; writers back to the last injecting one: sub@12; shadow writes of r1 per rep: add=6 mad=5 mul=1 mulhi=3 or=2 rotl=4 rotr=2 shfl=3 xor=7
[2026-10-07T20:13:36Z] load site instr 17: src r4 win 0 off 0; last base writer load at 14; writers back to the last injecting one: load@14; shadow writes of r4 per rep: add=7 mad=2 mul=4 mulhi=4 or=3 rotl=3 rotr=2 shfl=2 sub=2 xor=3
[2026-10-07T20:13:36Z] load site instr 21: src r1 win 0 off 0; last base writer rotr at 20; writers back to the last injecting one: rotr@20 sub@12; shadow writes of r1 per rep: add=6 mad=5 mul=1 mulhi=3 or=2 rotl=4 rotr=2 shfl=3 xor=7
[2026-10-07T20:13:36Z] load site instr 31: src r4 win 1 off 1; last base writer xor at 30; writers back to the last injecting one: xor@30; shadow writes of r4 per rep: add=7 mad=2 mul=4 mulhi=4 or=3 rotl=3 rotr=2 shfl=2 sub=2 xor=3
[2026-10-07T20:13:36Z] load site instr 34: src r1 win 1 off 1; last base writer add at 27; writers back to the last injecting one: add@27; shadow writes of r1 per rep: add=6 mad=5 mul=1 mulhi=3 or=2 rotl=4 rotr=2 shfl=3 xor=7
[2026-10-07T20:13:36Z] load site instr 40: src r3 win 0 off 0; last base writer mad at 39; writers back to the last injecting one: mad@39; shadow writes of r3 per rep: add=3 mad=3 mul=10 mulhi=2 or=1 rotr=4 shfl=3 sub=2 xor=5
[2026-10-07T20:13:36Z] load site instr 46: src r6 win 0 off 0; last base writer add at 41; writers back to the last injecting one: add@41; shadow writes of r6 per rep: add=12 mad=4 mul=2 mulhi=4 or=1 rotl=2 rotr=3 shfl=4 sub=2 xor=4
[2026-10-07T20:13:36Z] load site instr 50: src r3 win 2 off 3; last base writer rotr at 45; writers back to the last injecting one: rotr@45 mad@39; shadow writes of r3 per rep: add=3 mad=3 mul=10 mulhi=2 or=1 rotr=4 shfl=3 sub=2 xor=5
[2026-10-07T20:13:36Z] load site instr 52: src r2 win 1 off 1; last base writer xor at 48; writers back to the last injecting one: xor@48; shadow writes of r2 per rep: add=5 mad=3 mul=5 mulhi=4 or=1 rotl=6 rotr=1 shfl=2 sub=4 xor=3
[2026-10-07T20:13:36Z] load site instr 54: src r0 win 2 off 3; last base writer load at 50; writers back to the last injecting one: load@50; shadow writes of r0 per rep: add=2 mad=2 mul=5 mulhi=3 rotl=3 rotr=1 shfl=4 sub=1 xor=3
[2026-10-07T20:13:36Z] load site instr 57: src r1 win 1 off 1; last base writer add at 56; writers back to the last injecting one: add@56; shadow writes of r1 per rep: add=6 mad=5 mul=1 mulhi=3 or=2 rotl=4 rotr=2 shfl=3 xor=7
[2026-10-07T20:13:36Z] load site instr 59: src r4 win 2 off 0; last base writer load at 57; writers back to the last injecting one: load@57; shadow writes of r4 per rep: add=7 mad=2 mul=4 mulhi=4 or=3 rotl=3 rotr=2 shfl=2 sub=2 xor=3
[2026-10-07T20:13:36Z] load site instr 60: src r3 win 0 off 0; last base writer load at 54; writers back to the last injecting one: load@54; shadow writes of r3 per rep: add=3 mad=3 mul=10 mulhi=2 or=1 rotr=4 shfl=3 sub=2 xor=5
[2026-10-07T20:13:36Z] load site instr 62: src r7 win 1 off 0; last base writer mad at 61; writers back to the last injecting one: mad@61; shadow writes of r7 per rep: add=4 mad=7 mul=1 mulhi=4 or=2 rotl=2 rotr=3 shfl=3 xor=2
[2026-10-07T20:13:36Z] load site instr 63: src r5 win 2 off 1; last base writer load at 59; writers back to the last injecting one: load@59; shadow writes of r5 per rep: add=8 mad=4 mul=2 mulhi=1 rotl=3 rotr=1 shfl=3 sub=2 xor=10
[2026-10-07T20:13:36Z] window layer: site item windows (first, items) (0x0,2^24) (0x0,2^22) (0x0,2^24) (0x0,2^24) (0x800000,2^23) (0x800000,2^23) (0x0,2^24) (0x0,2^24) (0xc00000,2^22) (0x800000,2^23) (0xc00000,2^22) (0x800000,2^23) (0x0,2^22) (0x0,2^24) (0x0,2^23) (0x400000,2^22); expected reads per item by quarter 128.000 96.000 112.000 176.000 (flat uniform 128.000)
[2026-10-07T20:14:19Z] 524288 warps (16777216 nonces) interpreted in 43.3 s (2.644 ms per warp per thread); Epoch::hash_warp agreement on 589 warps: 0 mismatches
[2026-10-07T20:14:19Z] p327-attack-f8 distinct lines per hash: n 16777216 min 976 p1 1008 median 1024 p99 1024 max 1024 mean 1021.7521
[2026-10-07T20:14:19Z] p327-attack-f8 distinct items per hash: n 16777216 min 122 p1 126 median 128 p99 128 max 128 mean 127.7346
[2026-10-07T20:14:19Z] p327-attack-f8 distinct lines per warp: n 524288 min 32413 p1 32504 median 32570 p99 32625 max 32680 mean 32568.9041
[2026-10-07T20:14:19Z] p327-attack-f8 distinct items per warp: n 524288 min 4069 p1 4079 median 4087 p99 4093 max 4096 mean 4086.9966
[2026-10-07T20:14:19Z] uniform expectation: distinct lines per hash 1023.875 of 1024 reads, per warp 32640.3 of 32768 reads (2^22 lines); distinct items per hash 127.9995 of 128, per warp 4095.50 of 4096 (2^24 items)
[2026-10-07T20:14:19Z] positions: largest hi16-bucket (256 items) share 0.0071% at p90 (iteration 5, site 10, instr 54); windowed expectation 0.0061%; largest saturated-source share 0.0000% at p0 (site 0, instr 9)
[2026-10-07T20:14:19Z] acceptance-style (2,048 evaluations, the rule's sample size): the most repeated address at one position 1 of 2048 at p0 (site 0, instr 9); saturated sources at one position 0 of 2048 at p0 (site 0, instr 9); uniform expectation: repeats 1 to 2, saturated 0
[2026-10-07T20:14:19Z] p327-attack-f8 item histogram (flat): bins 16777216 reads 2147483648 mean 128.000 sigma 11.314 max 247 (bin 12693468) z_max +10.52 min 51 z_min -6.81 chi2/dof 8.00367 chi2_z +20284.78 top0.1% 0.16921% top0.5% 0.81619% top1% 1.60326%
[2026-10-07T20:14:19Z] p327-attack-f8 item histogram against the window density: full 2^24 chi2/dof 1.00389 largest 152 (item 0x5a7517) at +5.72 sigma smallest at -4.95; buckets64 chi2/dof 1.00400 largest 8617 (bucket 10854) at +4.70 sigma smallest at -4.41
[2026-10-07T20:14:22Z] p327-attack-f8 WINDOWED CONTROL item histogram (flat): bins 16777216 reads 2147483648 mean 128.000 sigma 11.314 max 247 (bin 13524507) z_max +10.52 min 51 z_min -6.81 chi2/dof 8.00053 chi2_z +20275.71 top0.1% 0.16921% top0.5% 0.81606% top1% 1.60302%
[2026-10-07T20:14:22Z] p327-attack-f8 WINDOWED CONTROL against the window density: full chi2/dof 0.99972 largest +5.76 sigma; buckets64 chi2/dof 0.99608 largest +4.43 smallest -4.27
[2026-10-07T20:14:22Z] 6-sigma p327-attack-f8 items buckets64 against the window density: largest bucket +4.70 sigma, smallest -4.41 -> within 6 sigma
[2026-10-07T20:14:22Z] hot-set p327-attack-f8 items (windowed control): f 0.1% S_f 0.16921% E_f(control) 0.16921% X_f +0.00000% X_f/f +0.0000 -> no hot set
[2026-10-07T20:14:22Z] hot-set p327-attack-f8 items (windowed control): f 0.5% S_f 0.81619% E_f(control) 0.81606% X_f +0.00013% X_f/f +0.0003 -> no hot set
[2026-10-07T20:14:22Z] hot-set p327-attack-f8 items (windowed control): f 1.0% S_f 1.60326% E_f(control) 1.60302% X_f +0.00024% X_f/f +0.0002 -> no hot set
[2026-10-07T20:14:22Z] hot-set p327-attack-f8 items (windowed control): verdict clear
[2026-10-07T20:14:25Z] p327-attack-f8 FLAT CONTROL item histogram: bins 16777216 reads 2147483648 mean 128.000 sigma 11.314 max 199 (bin 1419008) z_max +6.28 min 68 z_min -5.30 chi2/dof 1.00019 chi2_z +0.54 top0.1% 0.13111% top0.5% 0.63248% top1% 1.24330%
[2026-10-07T20:14:25Z] hot-set p327-attack-f8 items (flat control, the auditor's first view): f 0.1% S_f 0.16921% E_f(control) 0.13111% X_f +0.03810% X_f/f +0.3810 -> no hot set
[2026-10-07T20:14:25Z] hot-set p327-attack-f8 items (flat control, the auditor's first view): f 0.5% S_f 0.81619% E_f(control) 0.63248% X_f +0.18371% X_f/f +0.3674 -> no hot set
[2026-10-07T20:14:25Z] hot-set p327-attack-f8 items (flat control, the auditor's first view): f 1.0% S_f 1.60326% E_f(control) 1.24330% X_f +0.35996% X_f/f +0.3600 -> no hot set
[2026-10-07T20:14:25Z] hot-set p327-attack-f8 items (flat control, the auditor's first view): verdict clear
[2026-10-07T20:14:25Z] ratio p327-attack-f8: top 0.1% / 0.5% / 1% share over the WINDOW-MODEL control 1.0000x / 1.0002x / 1.0002x (gate 1.2x at 0.1%: within); over the FLAT control 1.2906x / 1.2905x / 1.2895x
[2026-10-07T20:14:25Z] hottest item p327-attack-f8 (0xe57cc3): 247 reads (0.0000% of all); predicted source none
[2026-10-07T20:14:25Z] program p327-attack-f8 DONE: 16777216 nonces; 6-sigma (windowed) clear; hot-set clear; verdict PASS (no test fired)
[2026-10-07T20:14:25Z] attack-f8 0.1.0 (igneum-pow 4); args ["warps", "--program", "1180", "--nonces", "16777216", "--threads", "32", "--out", "/srv/builds/_adv-adv-accept/live", "--validate", "sample"]
[2026-10-07T20:14:25Z] census warps: programs [1180] day 20730 nonces 16777216 threads 32 plant none validate sample check_every 997 diag false
[2026-10-07T20:14:26Z] day 20730: cache filled in 0.63 s, fnv 448274a57f508cbc
[2026-10-07T20:14:28Z] table: 16777216 items derived with their 8 lines in 2.3 s; library comparison sample (0 mismatches)
[2026-10-07T20:14:33Z] program p1180-attack-f8: epoch seed 46f7ab0b7ff21f62836ec66d0ac8a07ce8c050f69ff48aafb489f34a802954cf era seed fc6a213be3cb6ce16e87a767545bafb0d59a214fff19ebadf692c6895b875889 id d3335cac78d0eb13 attempt 8 class mx8-erae4de7744+sh256x27 op mix load=16 add=13 rotl=8 mad=5 sub=5 mul=4 xor=4 mulhi=3 or=3 shfl=2 rotr=1; era stride mul 0x37575593 rot 11 interleave [0, 3, 7, 11] windows 1:2:3 6:1:0 13:1:0 20:0:0 23:1:1 29:1:1 34:2:0 35:0:0 39:1:0 40:1:1 44:1:0 50:1:0 53:2:0 56:2:2 61:0:0 63:2:2
[2026-10-07T20:14:33Z] load site instr 1: src r2 win 2 off 3; last base writer rotl at 0; writers back to the last injecting one: rotl@0 mulhi@46 load@44; shadow writes of r2 per rep: add=2 mad=3 mul=4 mulhi=4 or=2 rotl=3 rotr=1 shfl=5 sub=1 xor=4
[2026-10-07T20:14:33Z] load site instr 6: src r0 win 1 off 0; last base writer shfl at 2; writers back to the last injecting one: shfl@2; shadow writes of r0 per rep: add=6 mad=2 mul=6 mulhi=1 or=2 rotl=3 rotr=2 sub=3 xor=4
[2026-10-07T20:14:33Z] load site instr 13: src r5 win 1 off 0; last base writer rotl at 11; writers back to the last injecting one: rotl@11 add@9; shadow writes of r5 per rep: add=4 mad=2 mul=2 mulhi=2 or=1 rotl=2 rotr=2 shfl=3 sub=2 xor=3
[2026-10-07T20:14:33Z] load site instr 20: src r5 win 0 off 0; last base writer add at 14; writers back to the last injecting one: add@14; shadow writes of r5 per rep: add=4 mad=2 mul=2 mulhi=2 or=1 rotl=2 rotr=2 shfl=3 sub=2 xor=3
[2026-10-07T20:14:33Z] load site instr 23: src r1 win 1 off 1; last base writer load at 13; writers back to the last injecting one: load@13; shadow writes of r1 per rep: add=9 mad=2 mul=6 mulhi=1 or=2 rotl=4 rotr=8 shfl=2 sub=5 xor=8
[2026-10-07T20:14:33Z] load site instr 29: src r3 win 1 off 1; last base writer load at 23; writers back to the last injecting one: load@23; shadow writes of r3 per rep: add=7 mad=2 mulhi=1 or=2 rotr=3 shfl=3 sub=3 xor=5
[2026-10-07T20:14:33Z] load site instr 34: src r1 win 2 off 0; last base writer sub at 28; writers back to the last injecting one: sub@28; shadow writes of r1 per rep: add=9 mad=2 mul=6 mulhi=1 or=2 rotl=4 rotr=8 shfl=2 sub=5 xor=8
[2026-10-07T20:14:33Z] load site instr 35: src r0 win 0 off 0; last base writer sub at 33; writers back to the last injecting one: sub@33; shadow writes of r0 per rep: add=6 mad=2 mul=6 mulhi=1 or=2 rotl=3 rotr=2 sub=3 xor=4
[2026-10-07T20:14:33Z] load site instr 39: src r6 win 1 off 0; last base writer rotl at 31; writers back to the last injecting one: rotl@31 xor@24; shadow writes of r6 per rep: add=7 mad=6 mul=1 mulhi=2 rotl=3 rotr=5 shfl=4 sub=3 xor=2
[2026-10-07T20:14:33Z] load site instr 40: src r5 win 1 off 1; last base writer mad at 25; writers back to the last injecting one: mad@25; shadow writes of r5 per rep: add=4 mad=2 mul=2 mulhi=2 or=1 rotl=2 rotr=2 shfl=3 sub=2 xor=3
[2026-10-07T20:14:33Z] load site instr 44: src r1 win 1 off 0; last base writer rotr at 37; writers back to the last injecting one: rotr@37 rotl@36 sub@28; shadow writes of r1 per rep: add=9 mad=2 mul=6 mulhi=1 or=2 rotl=4 rotr=8 shfl=2 sub=5 xor=8
[2026-10-07T20:14:33Z] load site instr 50: src r5 win 1 off 0; last base writer add at 49; writers back to the last injecting one: add@49; shadow writes of r5 per rep: add=4 mad=2 mul=2 mulhi=2 or=1 rotl=2 rotr=2 shfl=3 sub=2 xor=3
[2026-10-07T20:14:33Z] load site instr 53: src r0 win 2 off 0; last base writer sub at 51; writers back to the last injecting one: sub@51; shadow writes of r0 per rep: add=6 mad=2 mul=6 mulhi=1 or=2 rotl=3 rotr=2 sub=3 xor=4
[2026-10-07T20:14:33Z] load site instr 56: src r1 win 2 off 2; last base writer load at 50; writers back to the last injecting one: load@50; shadow writes of r1 per rep: add=9 mad=2 mul=6 mulhi=1 or=2 rotl=4 rotr=8 shfl=2 sub=5 xor=8
[2026-10-07T20:14:33Z] load site instr 61: src r5 win 0 off 0; last base writer xor at 60; writers back to the last injecting one: xor@60; shadow writes of r5 per rep: add=4 mad=2 mul=2 mulhi=2 or=1 rotl=2 rotr=2 shfl=3 sub=2 xor=3
[2026-10-07T20:14:33Z] load site instr 63: src r0 win 2 off 2; last base writer load at 61; writers back to the last injecting one: load@61; shadow writes of r0 per rep: add=6 mad=2 mul=6 mulhi=1 or=2 rotl=3 rotr=2 sub=3 xor=4
[2026-10-07T20:14:33Z] window layer: site item windows (first, items) (0xc00000,2^22) (0x0,2^23) (0x0,2^23) (0x0,2^24) (0x800000,2^23) (0x800000,2^23) (0x0,2^22) (0x0,2^24) (0x0,2^23) (0x800000,2^23) (0x0,2^23) (0x0,2^23) (0x0,2^22) (0x800000,2^22) (0x0,2^24) (0x800000,2^22); expected reads per item by quarter 168.000 104.000 136.000 104.000 (flat uniform 128.000)
[2026-10-07T20:15:22Z] 524288 warps (16777216 nonces) interpreted in 48.8 s (2.980 ms per warp per thread); Epoch::hash_warp agreement on 589 warps: 0 mismatches
[2026-10-07T20:15:22Z] p1180-attack-f8 distinct lines per hash: n 16777216 min 991 p1 1015 median 1024 p99 1024 max 1024 mean 1022.8708
[2026-10-07T20:15:22Z] p1180-attack-f8 distinct items per hash: n 16777216 min 124 p1 127 median 128 p99 128 max 128 mean 127.8744
[2026-10-07T20:15:22Z] p1180-attack-f8 distinct lines per warp: n 524288 min 32497 p1 32554 median 32605 p99 32647 max 32679 mean 32604.4163
[2026-10-07T20:15:22Z] p1180-attack-f8 distinct items per warp: n 524288 min 4079 p1 4086 median 4092 p99 4096 max 4096 mean 4091.4769
[2026-10-07T20:15:22Z] uniform expectation: distinct lines per hash 1023.875 of 1024 reads, per warp 32640.3 of 32768 reads (2^22 lines); distinct items per hash 127.9995 of 128, per warp 4095.50 of 4096 (2^24 items)
[2026-10-07T20:15:22Z] positions: largest hi16-bucket (256 items) share 0.0070% at p32 (iteration 2, site 0, instr 1); windowed expectation 0.0061%; largest saturated-source share 0.0000% at p37 (site 5, instr 29)
[2026-10-07T20:15:22Z] acceptance-style (2,048 evaluations, the rule's sample size): the most repeated address at one position 2 of 2048 at p6 (site 6, instr 34); saturated sources at one position 0 of 2048 at p0 (site 0, instr 1); uniform expectation: repeats 1 to 2, saturated 0
[2026-10-07T20:15:22Z] p1180-attack-f8 item histogram (flat): bins 16777216 reads 2147483648 mean 128.000 sigma 11.314 max 237 (bin 3176981) z_max +9.63 min 57 z_min -6.28 chi2/dof 6.50135 chi2_z +15933.61 top0.1% 0.16238% top0.5% 0.78243% top1% 1.53611%
[2026-10-07T20:15:22Z] p1180-attack-f8 item histogram against the window density: full 2^24 chi2/dof 1.00127 largest 168 (item 0xc9fcb6) at +6.28 sigma smallest at -4.89; buckets64 chi2/dof 1.00415 largest 7062 (bucket 206106) at +4.98 sigma smallest at -4.78
[2026-10-07T20:15:25Z] p1180-attack-f8 WINDOWED CONTROL item histogram (flat): bins 16777216 reads 2147483648 mean 128.000 sigma 11.314 max 240 (bin 3572262) z_max +9.90 min 52 z_min -6.72 chi2/dof 6.50084 chi2_z +15932.12 top0.1% 0.16224% top0.5% 0.78195% top1% 1.53537%
[2026-10-07T20:15:25Z] p1180-attack-f8 WINDOWED CONTROL against the window density: full chi2/dof 1.00036 largest +5.88 sigma; buckets64 chi2/dof 1.00234 largest +4.99 smallest -4.38
[2026-10-07T20:15:25Z] 6-sigma p1180-attack-f8 items buckets64 against the window density: largest bucket +4.98 sigma, smallest -4.78 -> within 6 sigma
[2026-10-07T20:15:25Z] hot-set p1180-attack-f8 items (windowed control): f 0.1% S_f 0.16238% E_f(control) 0.16224% X_f +0.00014% X_f/f +0.0014 -> no hot set
[2026-10-07T20:15:25Z] hot-set p1180-attack-f8 items (windowed control): f 0.5% S_f 0.78243% E_f(control) 0.78195% X_f +0.00048% X_f/f +0.0010 -> no hot set
[2026-10-07T20:15:25Z] hot-set p1180-attack-f8 items (windowed control): f 1.0% S_f 1.53611% E_f(control) 1.53537% X_f +0.00074% X_f/f +0.0007 -> no hot set
[2026-10-07T20:15:25Z] hot-set p1180-attack-f8 items (windowed control): verdict clear
[2026-10-07T20:15:27Z] p1180-attack-f8 FLAT CONTROL item histogram: bins 16777216 reads 2147483648 mean 128.000 sigma 11.314 max 192 (bin 15527014) z_max +5.66 min 76 z_min -4.60 chi2/dof 1.00015 chi2_z +0.42 top0.1% 0.13109% top0.5% 0.63248% top1% 1.24334%
[2026-10-07T20:15:27Z] hot-set p1180-attack-f8 items (flat control, the auditor's first view): f 0.1% S_f 0.16238% E_f(control) 0.13109% X_f +0.03129% X_f/f +0.3129 -> no hot set
[2026-10-07T20:15:27Z] hot-set p1180-attack-f8 items (flat control, the auditor's first view): f 0.5% S_f 0.78243% E_f(control) 0.63248% X_f +0.14995% X_f/f +0.2999 -> no hot set
[2026-10-07T20:15:27Z] hot-set p1180-attack-f8 items (flat control, the auditor's first view): f 1.0% S_f 1.53611% E_f(control) 1.24334% X_f +0.29277% X_f/f +0.2928 -> no hot set
[2026-10-07T20:15:27Z] hot-set p1180-attack-f8 items (flat control, the auditor's first view): verdict clear
[2026-10-07T20:15:27Z] ratio p1180-attack-f8: top 0.1% / 0.5% / 1% share over the WINDOW-MODEL control 1.0008x / 1.0006x / 1.0005x (gate 1.2x at 0.1%: within); over the FLAT control 1.2387x / 1.2371x / 1.2355x
[2026-10-07T20:15:27Z] hottest item p1180-attack-f8 (0x307a15): 237 reads (0.0000% of all); predicted source none
[2026-10-07T20:15:27Z] program p1180-attack-f8 DONE: 16777216 nonces; 6-sigma (windowed) clear; hot-set clear; verdict PASS (no test fired)
[2026-10-07T20:15:27Z] attack-f8 0.1.0 (igneum-pow 4); args ["warps", "--program", "101805", "--nonces", "16777216", "--threads", "32", "--out", "/srv/builds/_adv-adv-accept/live", "--validate", "sample"]
[2026-10-07T20:15:27Z] census warps: programs [101805] day 20730 nonces 16777216 threads 32 plant none validate sample check_every 997 diag false
[2026-10-07T20:15:28Z] day 20730: cache filled in 0.62 s, fnv 448274a57f508cbc
[2026-10-07T20:15:30Z] table: 16777216 items derived with their 8 lines in 2.2 s; library comparison sample (0 mismatches)
[2026-10-07T20:15:35Z] program p101805-attack-f8: epoch seed 9d98af2edc063c51d973f1f7562a2e117bd8f156049f5fcaad03a35a4390c51b era seed 666b90d929a7be8418090591a66a5645fffc75144dea3fe933e50a05cbe366c6 id 87b33d12209f4d34 attempt 1 class mx8-erad3a93d5e+sh256x27 op mix load=16 mul=10 add=8 rotr=6 xor=5 mad=4 or=4 shfl=4 mulhi=3 rotl=2 sub=2; era stride mul 0x1be1d99d rot 17 interleave [0, 5, 7, 14] windows 1:0:0 6:2:1 11:2:3 30:1:0 31:0:0 35:1:1 37:2:1 38:1:0 41:2:1 43:1:0 48:1:0 51:1:0 55:1:0 56:0:0 57:1:1 62:2:3
[2026-10-07T20:15:35Z] load site instr 1: src r0 win 0 off 0; last base writer add at 0; writers back to the last injecting one: add@0; shadow writes of r0 per rep: add=3 mad=7 mul=5 mulhi=1 or=1 rotl=3 rotr=4 shfl=1 sub=1 xor=5
[2026-10-07T20:15:35Z] load site instr 6: src r5 win 2 off 1; last base writer mad at 2; writers back to the last injecting one: mad@2; shadow writes of r5 per rep: add=8 mad=5 rotl=3 rotr=2 shfl=4 sub=4 xor=7
[2026-10-07T20:15:35Z] load site instr 11: src r0 win 2 off 3; last base writer add at 10; writers back to the last injecting one: add@10; shadow writes of r0 per rep: add=3 mad=7 mul=5 mulhi=1 or=1 rotl=3 rotr=4 shfl=1 sub=1 xor=5
[2026-10-07T20:15:35Z] load site instr 30: src r7 win 1 off 0; last base writer load at 6; writers back to the last injecting one: load@6; shadow writes of r7 per rep: add=8 mad=5 mul=1 mulhi=2 or=1 rotl=3 rotr=4 shfl=3 sub=3
[2026-10-07T20:15:35Z] load site instr 31: src r3 win 0 off 0; last base writer load at 30; writers back to the last injecting one: load@30; shadow writes of r3 per rep: add=4 mad=3 mul=1 mulhi=2 or=4 rotl=2 rotr=5 shfl=3 sub=3 xor=4
[2026-10-07T20:15:35Z] load site instr 35: src r3 win 1 off 1; last base writer rotl at 33; writers back to the last injecting one: rotl@33 load@30; shadow writes of r3 per rep: add=4 mad=3 mul=1 mulhi=2 or=4 rotl=2 rotr=5 shfl=3 sub=3 xor=4
[2026-10-07T20:15:35Z] load site instr 37: src r5 win 2 off 1; last base writer add at 36; writers back to the last injecting one: add@36; shadow writes of r5 per rep: add=8 mad=5 rotl=3 rotr=2 shfl=4 sub=4 xor=7
[2026-10-07T20:15:35Z] load site instr 38: src r7 win 1 off 0; last base writer load at 37; writers back to the last injecting one: load@37; shadow writes of r7 per rep: add=8 mad=5 mul=1 mulhi=2 or=1 rotl=3 rotr=4 shfl=3 sub=3
[2026-10-07T20:15:35Z] load site instr 41: src r1 win 2 off 1; last base writer load at 38; writers back to the last injecting one: load@38; shadow writes of r1 per rep: add=4 mad=3 mul=5 mulhi=1 or=4 rotr=3 shfl=1 sub=3 xor=2
[2026-10-07T20:15:35Z] load site instr 43: src r4 win 1 off 0; last base writer load at 41; writers back to the last injecting one: load@41; shadow writes of r4 per rep: add=5 mad=2 mul=5 mulhi=4 or=4 rotl=3 rotr=3 shfl=7 sub=1 xor=9
[2026-10-07T20:15:35Z] load site instr 48: src r0 win 1 off 0; last base writer load at 43; writers back to the last injecting one: load@43; shadow writes of r0 per rep: add=3 mad=7 mul=5 mulhi=1 or=1 rotl=3 rotr=4 shfl=1 sub=1 xor=5
[2026-10-07T20:15:35Z] load site instr 51: src r3 win 1 off 0; last base writer shfl at 42; writers back to the last injecting one: shfl@42; shadow writes of r3 per rep: add=4 mad=3 mul=1 mulhi=2 or=4 rotl=2 rotr=5 shfl=3 sub=3 xor=4
[2026-10-07T20:15:35Z] load site instr 55: src r4 win 1 off 0; last base writer load at 48; writers back to the last injecting one: load@48; shadow writes of r4 per rep: add=5 mad=2 mul=5 mulhi=4 or=4 rotl=3 rotr=3 shfl=7 sub=1 xor=9
[2026-10-07T20:15:35Z] load site instr 56: src r3 win 0 off 0; last base writer load at 55; writers back to the last injecting one: load@55; shadow writes of r3 per rep: add=4 mad=3 mul=1 mulhi=2 or=4 rotl=2 rotr=5 shfl=3 sub=3 xor=4
[2026-10-07T20:15:35Z] load site instr 57: src r4 win 1 off 1; last base writer load at 56; writers back to the last injecting one: load@56; shadow writes of r4 per rep: add=5 mad=2 mul=5 mulhi=4 or=4 rotl=3 rotr=3 shfl=7 sub=1 xor=9
[2026-10-07T20:15:35Z] load site instr 62: src r3 win 2 off 3; last base writer load at 57; writers back to the last injecting one: load@57; shadow writes of r3 per rep: add=4 mad=3 mul=1 mulhi=2 or=4 rotl=2 rotr=5 shfl=3 sub=3 xor=4
[2026-10-07T20:15:35Z] window layer: site item windows (first, items) (0x0,2^24) (0x400000,2^22) (0xc00000,2^22) (0x0,2^23) (0x0,2^24) (0x800000,2^23) (0x400000,2^22) (0x0,2^23) (0x400000,2^22) (0x0,2^23) (0x0,2^23) (0x0,2^23) (0x0,2^23) (0x0,2^24) (0x800000,2^23) (0xc00000,2^22); expected reads per item by quarter 120.000 216.000 56.000 120.000 (flat uniform 128.000)
[2026-10-07T20:16:19Z] 524288 warps (16777216 nonces) interpreted in 44.5 s (2.713 ms per warp per thread); Epoch::hash_warp agreement on 589 warps: 0 mismatches
[2026-10-07T20:16:19Z] p101805-attack-f8 distinct lines per hash: n 16777216 min 1007 p1 1023 median 1024 p99 1024 max 1024 mean 1023.8705
[2026-10-07T20:16:19Z] p101805-attack-f8 distinct items per hash: n 16777216 min 126 p1 128 median 128 p99 128 max 128 mean 127.9994
[2026-10-07T20:16:19Z] p101805-attack-f8 distinct lines per warp: n 524288 min 32563 p1 32604 median 32636 p99 32664 max 32688 mean 32635.5928
[2026-10-07T20:16:19Z] p101805-attack-f8 distinct items per warp: n 524288 min 4089 p1 4093 median 4096 p99 4096 max 4096 mean 4095.3991
[2026-10-07T20:16:19Z] uniform expectation: distinct lines per hash 1023.875 of 1024 reads, per warp 32640.3 of 32768 reads (2^22 lines); distinct items per hash 127.9995 of 128, per warp 4095.50 of 4096 (2^24 items)
[2026-10-07T20:16:19Z] positions: largest hi16-bucket (256 items) share 0.0113% at p17 (iteration 1, site 1, instr 6); windowed expectation 0.0061%; largest saturated-source share 0.0000% at p9 (site 9, instr 43)
[2026-10-07T20:16:19Z] acceptance-style (2,048 evaluations, the rule's sample size): the most repeated address at one position 2 of 2048 at p46 (site 14, instr 57); saturated sources at one position 0 of 2048 at p0 (site 0, instr 1); uniform expectation: repeats 1 to 2, saturated 0
[2026-10-07T20:16:19Z] p101805-attack-f8 item histogram (flat): bins 16777216 reads 2147483648 mean 128.000 sigma 11.314 max 310 (bin 4569382) z_max +16.09 min 21 z_min -9.46 chi2/dof 26.75788 chi2_z +74602.79 top0.1% 0.21301% top0.5% 1.02618% top1% 2.01326%
[2026-10-07T20:16:19Z] p101805-attack-f8 item histogram against the window density: full 2^24 chi2/dof 1.15245 largest 310 (item 0x45b926) at +6.40 sigma smallest at -5.17; buckets64 chi2/dof 10.75863 largest 15549 (bucket 77475) at +14.67 sigma smallest at -9.54
[2026-10-07T20:16:22Z] p101805-attack-f8 WINDOWED CONTROL item histogram (flat): bins 16777216 reads 2147483648 mean 128.000 sigma 11.314 max 304 (bin 4592428) z_max +15.56 min 20 z_min -9.55 chi2/dof 26.49698 chi2_z +73847.15 top0.1% 0.20366% top0.5% 0.98584% top1% 1.93958%
[2026-10-07T20:16:22Z] p101805-attack-f8 WINDOWED CONTROL against the window density: full chi2/dof 1.00043 largest +6.82 sigma; buckets64 chi2/dof 1.00437 largest +4.84 smallest -4.49
[2026-10-07T20:16:22Z] 6-sigma p101805-attack-f8 items buckets64 against the window density: largest bucket +14.67 sigma, smallest -9.54 -> FLAGGED (beyond 6 sigma)
[2026-10-07T20:16:22Z] hot-set p101805-attack-f8 items (windowed control): f 0.1% S_f 0.21301% E_f(control) 0.20366% X_f +0.00934% X_f/f +0.0934 -> no hot set
[2026-10-07T20:16:22Z] hot-set p101805-attack-f8 items (windowed control): f 0.5% S_f 1.02618% E_f(control) 0.98584% X_f +0.04034% X_f/f +0.0807 -> no hot set
[2026-10-07T20:16:22Z] hot-set p101805-attack-f8 items (windowed control): f 1.0% S_f 2.01326% E_f(control) 1.93958% X_f +0.07368% X_f/f +0.0737 -> no hot set
[2026-10-07T20:16:22Z] hot-set p101805-attack-f8 items (windowed control): verdict clear
[2026-10-07T20:16:25Z] p101805-attack-f8 FLAT CONTROL item histogram: bins 16777216 reads 2147483648 mean 128.000 sigma 11.314 max 193 (bin 8661176) z_max +5.75 min 72 z_min -4.95 chi2/dof 1.00032 chi2_z +0.92 top0.1% 0.13106% top0.5% 0.63245% top1% 1.24335%
[2026-10-07T20:16:25Z] hot-set p101805-attack-f8 items (flat control, the auditor's first view): f 0.1% S_f 0.21301% E_f(control) 0.13106% X_f +0.08195% X_f/f +0.8195 -> no hot set
[2026-10-07T20:16:25Z] hot-set p101805-attack-f8 items (flat control, the auditor's first view): f 0.5% S_f 1.02618% E_f(control) 0.63245% X_f +0.39373% X_f/f +0.7875 -> no hot set
[2026-10-07T20:16:25Z] hot-set p101805-attack-f8 items (flat control, the auditor's first view): f 1.0% S_f 2.01326% E_f(control) 1.24335% X_f +0.76991% X_f/f +0.7699 -> no hot set
[2026-10-07T20:16:25Z] hot-set p101805-attack-f8 items (flat control, the auditor's first view): verdict clear
[2026-10-07T20:16:25Z] ratio p101805-attack-f8: top 0.1% / 0.5% / 1% share over the WINDOW-MODEL control 1.0459x / 1.0409x / 1.0380x (gate 1.2x at 0.1%: within); over the FLAT control 1.6253x / 1.6225x / 1.6192x
[2026-10-07T20:16:25Z] hottest item p101805-attack-f8 (0x572561): 310 reads (0.0000% of all); predicted source none
[2026-10-07T20:16:25Z] program p101805-attack-f8 DONE: 16777216 nonces; 6-sigma (windowed) FLAGGED; hot-set clear; verdict FLAGGED
Terminated
lease: released 32 pool cores after 176 s, exit 0

View file

@ -0,0 +1,129 @@
lease: 0 of 16 pool cores free (88 leased); waiting
lease: holding 32 pool cores (41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72, waited 628 s): adv-accept v5-exemplar
[2026-10-07T19:35:39Z] state stream /srv/builds/igneum-wt-adv-accept/tools/attack/adv-accept-v5/inputs/v5-dn3-epoch0-state.igsd1: block 4020cb4382e3fe4b281c817c02582e147d8f851f566ae9172b28912b8e68b925 number 0 root 7e37a9fb19b154d32daf5bf30a50d339a75029fbc9eec9ea20e95439dba5a311 records 11 -> 11 leaves fnv f141bfee2a8b11b0
[2026-10-07T19:35:39Z] adv-live-v5 0.1.0 (igneum-pow class v5, generator 5); args ["warps", "--program", "100767", "--nonces", "1000000", "--threads", "32", "--out", "/srv/builds/_adv-adv-accept/live", "--validate", "sample", "--plant", "const-item", "--state", "/srv/builds/igneum-wt-adv-accept/tools/attack/adv-accept-v5/inputs/v5-dn3-epoch0-state.igsd1"]
[2026-10-07T19:35:39Z] census warps: programs [100767] day 20730 nonces 1000000 threads 32 plant const-item validate sample check_every 997 diag false
[2026-10-07T19:35:39Z] class v5: state leaves 11 (fnv f141bfee2a8b11b0), root 7e37a9fb19b154d32daf5bf30a50d339a75029fbc9eec9ea20e95439dba5a311
[2026-10-07T19:35:39Z] day 20730: cache filled in 0.39 s, fnv 448274a57f508cbc
[2026-10-07T19:35:41Z] table: 16777216 items derived with their 8 lines in 1.5 s; library comparison skipped under the plant (0 mismatches)
[2026-10-07T19:35:45Z] program p100767-attack-f8: epoch seed 74484b391756fc49568cdd716bcfd839a55d31a45633c223c65c7f2ab4617fd4 era seed 7a65a05391dcd87b8fdaf7f74813aa17c6e13f7c56a03da2aaa6176987ef038b id 2fd83dbae09c366d attempt 2 class mx8-era763e5847+sh256x27+state op mix load=16 add=8 mad=6 mul=6 rotl=6 mulhi=5 xor=5 rotr=4 shfl=4 or=2 sub=2; era stride mul 0x54387173 rot 28 interleave [4, 11, 13, 15] windows 6:1:0 9:0:0 11:2:1 12:0:0 13:1:1 19:1:1 23:2:0 32:2:0 36:1:1 39:1:1 41:0:0 45:1:0 50:2:3 58:0:0 59:0:0 63:1:0
[2026-10-07T19:35:45Z] load site instr 6: src r6 win 1 off 0; last base writer mad at 4; writers back to the last injecting one: mad@4; shadow writes of r6 per rep: add=5 mad=7 mul=1 mulhi=1 rotl=3 rotr=2 shfl=3 sub=1 xor=6
[2026-10-07T19:35:45Z] load site instr 9: src r7 win 0 off 0; last base writer load at 6; writers back to the last injecting one: load@6; shadow writes of r7 per rep: add=5 mad=5 mul=4 mulhi=5 rotl=1 rotr=5 shfl=3 sub=4 xor=5
[2026-10-07T19:35:45Z] load site instr 11: src r5 win 2 off 1; last base writer xor at 5; writers back to the last injecting one: xor@5; shadow writes of r5 per rep: add=10 mul=5 mulhi=1 rotl=3 rotr=1 shfl=4 sub=3 xor=4
[2026-10-07T19:35:45Z] load site instr 12: src r3 win 0 off 0; last base writer load at 9; writers back to the last injecting one: load@9; shadow writes of r3 per rep: mad=6 mul=2 mulhi=4 or=1 rotl=4 rotr=2 xor=4
[2026-10-07T19:35:45Z] load site instr 13: src r2 win 1 off 1; last base writer load at 12; writers back to the last injecting one: load@12; shadow writes of r2 per rep: add=3 mad=2 mul=4 mulhi=2 or=6 rotl=1 rotr=1 shfl=5 sub=2 xor=4
[2026-10-07T19:35:45Z] load site instr 19: src r4 win 1 off 1; last base writer add at 7; writers back to the last injecting one: add@7; shadow writes of r4 per rep: add=5 mad=5 mul=4 mulhi=5 or=1 rotl=4 rotr=5 shfl=3 sub=5 xor=2
[2026-10-07T19:35:45Z] load site instr 23: src r6 win 2 off 0; last base writer mad at 22; writers back to the last injecting one: mad@22; shadow writes of r6 per rep: add=5 mad=7 mul=1 mulhi=1 rotl=3 rotr=2 shfl=3 sub=1 xor=6
[2026-10-07T19:35:45Z] load site instr 32: src r0 win 2 off 0; last base writer xor at 20; writers back to the last injecting one: xor@20; shadow writes of r0 per rep: add=7 mad=1 mul=3 mulhi=3 or=3 rotl=3 rotr=2 shfl=5 sub=2 xor=3
[2026-10-07T19:35:45Z] load site instr 36: src r7 win 1 off 1; last base writer rotr at 31; writers back to the last injecting one: rotr@31 load@6; shadow writes of r7 per rep: add=5 mad=5 mul=4 mulhi=5 rotl=1 rotr=5 shfl=3 sub=4 xor=5
[2026-10-07T19:35:45Z] load site instr 39: src r7 win 1 off 1; last base writer rotl at 38; writers back to the last injecting one: rotl@38 add@37; shadow writes of r7 per rep: add=5 mad=5 mul=4 mulhi=5 rotl=1 rotr=5 shfl=3 sub=4 xor=5
[2026-10-07T19:35:45Z] load site instr 41: src r4 win 0 off 0; last base writer rotl at 40; writers back to the last injecting one: rotl@40 load@32; shadow writes of r4 per rep: add=5 mad=5 mul=4 mulhi=5 or=1 rotl=4 rotr=5 shfl=3 sub=5 xor=2
[2026-10-07T19:35:45Z] load site instr 45: src r5 win 1 off 0; last base writer rotr at 27; writers back to the last injecting one: rotr@27 shfl@24; shadow writes of r5 per rep: add=10 mul=5 mulhi=1 rotl=3 rotr=1 shfl=4 sub=3 xor=4
[2026-10-07T19:35:45Z] load site instr 50: src r7 win 2 off 3; last base writer load at 45; writers back to the last injecting one: load@45; shadow writes of r7 per rep: add=5 mad=5 mul=4 mulhi=5 rotl=1 rotr=5 shfl=3 sub=4 xor=5
[2026-10-07T19:35:45Z] load site instr 58: src r3 win 0 off 0; last base writer load at 50; writers back to the last injecting one: load@50; shadow writes of r3 per rep: mad=6 mul=2 mulhi=4 or=1 rotl=4 rotr=2 xor=4
[2026-10-07T19:35:45Z] load site instr 59: src r2 win 0 off 0; last base writer xor at 46; writers back to the last injecting one: xor@46; shadow writes of r2 per rep: add=3 mad=2 mul=4 mulhi=2 or=6 rotl=1 rotr=1 shfl=5 sub=2 xor=4
[2026-10-07T19:35:45Z] load site instr 63: src r1 win 1 off 0; last base writer rotr at 62; writers back to the last injecting one: rotr@62 add@56; shadow writes of r1 per rep: add=5 mad=4 mul=6 mulhi=3 or=2 rotl=2 rotr=3 shfl=5 sub=3 xor=2
[2026-10-07T19:35:45Z] window layer: site item windows (first, items) (0x0,2^23) (0x0,2^24) (0x400000,2^22) (0x0,2^24) (0x800000,2^23) (0x800000,2^23) (0x0,2^22) (0x0,2^22) (0x800000,2^23) (0x800000,2^23) (0x0,2^24) (0x0,2^23) (0xc00000,2^22) (0x0,2^24) (0x0,2^24) (0x0,2^23); expected reads per item by quarter 9.060 7.153 6.199 8.106 (flat uniform 7.629)
[2026-10-07T19:35:47Z] 31250 warps (1000000 nonces) interpreted in 2.5 s (2.595 ms per warp per thread); Epoch::hash_warp agreement on 0 warps: 0 mismatches (library comparison skipped under the plant)
[2026-10-07T19:35:47Z] p100767-attack-f8 distinct lines per hash: n 1000000 min 928 p1 952 median 968 p99 968 max 968 mean 965.6766
[2026-10-07T19:35:47Z] p100767-attack-f8 distinct items per hash: n 1000000 min 116 p1 119 median 121 p99 121 max 121 mean 120.7235
[2026-10-07T19:35:47Z] p100767-attack-f8 distinct lines per warp: n 31250 min 30415 p1 30476 median 30543 p99 30597 max 30631 mean 30542.0418
[2026-10-07T19:35:47Z] p100767-attack-f8 distinct items per warp: n 31250 min 3817 p1 3824 median 3832 p99 3838 max 3840 mean 3831.7148
[2026-10-07T19:35:47Z] uniform expectation: distinct lines per hash 1023.875 of 1024 reads, per warp 32640.3 of 32768 reads (2^22 lines); distinct items per hash 127.9995 of 128, per warp 4095.50 of 4096 (2^24 items)
[2026-10-07T19:35:47Z] positions: largest hi16-bucket (256 items) share 100.0000% at p0 (iteration 0, site 0, instr 6); windowed expectation 0.0031%; largest saturated-source share 0.0145% at p118 (site 6, instr 23)
[2026-10-07T19:35:47Z] acceptance-style (2,048 evaluations, the rule's sample size): the most repeated address at one position 2 of 2048 at p43 (site 11, instr 45); saturated sources at one position 1 of 2048 at p54 (site 6, instr 23); uniform expectation: repeats 1 to 2, saturated 0
[2026-10-07T19:35:47Z] p100767-attack-f8 item histogram (flat): bins 16777216 reads 128000000 mean 7.629 sigma 2.762 max 8000004 (bin 4660) z_max +2896308.06 min 0 z_min -2.76 chi2/dof 500000.76099 chi2_z +1448153952.46 top0.1% 6.57882% top0.5% 7.45855% top1% 8.45863%
[2026-10-07T19:35:48Z] p100767-attack-f8 item histogram against the window density: full 2^24 chi2/dof 421053.20520 largest 8000004 (item 0x1234) at +2657834.08 sigma smallest at -3.01; buckets64 chi2/dof 421050.05541 largest 8000496 (bucket 72) at +332225.99 sigma smallest at -7.09
[2026-10-07T19:35:48Z] p100767-attack-f8 WINDOWED CONTROL item histogram (flat): bins 16777216 reads 128000000 mean 7.629 sigma 2.762 max 27 (bin 919726) z_max +7.01 min 0 z_min -2.76 chi2/dof 1.14901 chi2_z +431.58 top0.1% 0.25578% top0.5% 1.15209% top1% 2.18797%
[2026-10-07T19:35:48Z] p100767-attack-f8 WINDOWED CONTROL against the window density: full chi2/dof 1.00017 largest +6.64 sigma; buckets64 chi2/dof 0.99639 largest +4.40 smallest -4.40
[2026-10-07T19:35:48Z] 6-sigma p100767-attack-f8 items buckets64 against the window density: largest bucket +332225.99 sigma, smallest -7.09 -> FLAGGED (beyond 6 sigma)
[2026-10-07T19:35:48Z] hot-set p100767-attack-f8 items (windowed control): f 0.1% S_f 6.57882% E_f(control) 0.25578% X_f +6.32304% X_f/f +63.2304 -> HOT SET
[2026-10-07T19:35:48Z] hot-set p100767-attack-f8 items (windowed control): f 0.5% S_f 7.45855% E_f(control) 1.15209% X_f +6.30646% X_f/f +12.6129 -> HOT SET
[2026-10-07T19:35:48Z] hot-set p100767-attack-f8 items (windowed control): f 1.0% S_f 8.45863% E_f(control) 2.18797% X_f +6.27066% X_f/f +6.2707 -> HOT SET
[2026-10-07T19:35:48Z] hot-set p100767-attack-f8 items (windowed control): verdict FLAGGED
[2026-10-07T19:35:48Z] p100767-attack-f8 FLAT CONTROL item histogram: bins 16777216 reads 128000000 mean 7.629 sigma 2.762 max 26 (bin 10438708) z_max +6.65 min 0 z_min -2.76 chi2/dof 0.99974 chi2_z -0.75 top0.1% 0.24260% top0.5% 1.09881% top1% 2.08683%
[2026-10-07T19:35:48Z] hot-set p100767-attack-f8 items (flat control, the auditor's first view): f 0.1% S_f 6.57882% E_f(control) 0.24260% X_f +6.33622% X_f/f +63.3622 -> HOT SET
[2026-10-07T19:35:48Z] hot-set p100767-attack-f8 items (flat control, the auditor's first view): f 0.5% S_f 7.45855% E_f(control) 1.09881% X_f +6.35974% X_f/f +12.7195 -> HOT SET
[2026-10-07T19:35:48Z] hot-set p100767-attack-f8 items (flat control, the auditor's first view): f 1.0% S_f 8.45863% E_f(control) 2.08683% X_f +6.37180% X_f/f +6.3718 -> HOT SET
[2026-10-07T19:35:48Z] hot-set p100767-attack-f8 items (flat control, the auditor's first view): verdict FLAGGED
[2026-10-07T19:35:48Z] ratio p100767-attack-f8: top 0.1% / 0.5% / 1% share over the WINDOW-MODEL control 25.7206x / 6.4739x / 3.8660x (gate 1.2x at 0.1%: BEYOND); over the FLAT control 27.1176x / 6.7878x / 4.0533x
[2026-10-07T19:35:48Z] hottest item p100767-attack-f8 (0x001234): 8000004 reads (6.2500% of all); predicted source none
[2026-10-07T19:35:48Z] program p100767-attack-f8 DONE: 1000000 nonces; 6-sigma (windowed) FLAGGED; hot-set FLAGGED; verdict FLAGGED
[2026-10-07T19:35:49Z] state stream /srv/builds/igneum-wt-adv-accept/tools/attack/adv-accept-v5/inputs/v5-dn3-epoch0-state.igsd1: block 4020cb4382e3fe4b281c817c02582e147d8f851f566ae9172b28912b8e68b925 number 0 root 7e37a9fb19b154d32daf5bf30a50d339a75029fbc9eec9ea20e95439dba5a311 records 11 -> 11 leaves fnv f141bfee2a8b11b0
[2026-10-07T19:35:49Z] adv-live-v5 0.1.0 (igneum-pow class v5, generator 5); args ["warps", "--program", "100767", "--nonces", "16777216", "--threads", "32", "--out", "/srv/builds/_adv-adv-accept/live", "--validate", "sample", "--diag", "1", "--state", "/srv/builds/igneum-wt-adv-accept/tools/attack/adv-accept-v5/inputs/v5-dn3-epoch0-state.igsd1"]
[2026-10-07T19:35:49Z] census warps: programs [100767] day 20730 nonces 16777216 threads 32 plant none validate sample check_every 997 diag true
[2026-10-07T19:35:49Z] class v5: state leaves 11 (fnv f141bfee2a8b11b0), root 7e37a9fb19b154d32daf5bf30a50d339a75029fbc9eec9ea20e95439dba5a311
[2026-10-07T19:35:49Z] day 20730: cache filled in 0.41 s, fnv 448274a57f508cbc
[2026-10-07T19:35:52Z] table: 16777216 items derived with their 8 lines in 2.1 s; library comparison sample (0 mismatches)
[2026-10-07T19:35:54Z] program p100767-attack-f8: epoch seed 74484b391756fc49568cdd716bcfd839a55d31a45633c223c65c7f2ab4617fd4 era seed 7a65a05391dcd87b8fdaf7f74813aa17c6e13f7c56a03da2aaa6176987ef038b id 2fd83dbae09c366d attempt 2 class mx8-era763e5847+sh256x27+state op mix load=16 add=8 mad=6 mul=6 rotl=6 mulhi=5 xor=5 rotr=4 shfl=4 or=2 sub=2; era stride mul 0x54387173 rot 28 interleave [4, 11, 13, 15] windows 6:1:0 9:0:0 11:2:1 12:0:0 13:1:1 19:1:1 23:2:0 32:2:0 36:1:1 39:1:1 41:0:0 45:1:0 50:2:3 58:0:0 59:0:0 63:1:0
[2026-10-07T19:35:54Z] load site instr 6: src r6 win 1 off 0; last base writer mad at 4; writers back to the last injecting one: mad@4; shadow writes of r6 per rep: add=5 mad=7 mul=1 mulhi=1 rotl=3 rotr=2 shfl=3 sub=1 xor=6
[2026-10-07T19:35:54Z] load site instr 9: src r7 win 0 off 0; last base writer load at 6; writers back to the last injecting one: load@6; shadow writes of r7 per rep: add=5 mad=5 mul=4 mulhi=5 rotl=1 rotr=5 shfl=3 sub=4 xor=5
[2026-10-07T19:35:54Z] load site instr 11: src r5 win 2 off 1; last base writer xor at 5; writers back to the last injecting one: xor@5; shadow writes of r5 per rep: add=10 mul=5 mulhi=1 rotl=3 rotr=1 shfl=4 sub=3 xor=4
[2026-10-07T19:35:54Z] load site instr 12: src r3 win 0 off 0; last base writer load at 9; writers back to the last injecting one: load@9; shadow writes of r3 per rep: mad=6 mul=2 mulhi=4 or=1 rotl=4 rotr=2 xor=4
[2026-10-07T19:35:54Z] load site instr 13: src r2 win 1 off 1; last base writer load at 12; writers back to the last injecting one: load@12; shadow writes of r2 per rep: add=3 mad=2 mul=4 mulhi=2 or=6 rotl=1 rotr=1 shfl=5 sub=2 xor=4
[2026-10-07T19:35:54Z] load site instr 19: src r4 win 1 off 1; last base writer add at 7; writers back to the last injecting one: add@7; shadow writes of r4 per rep: add=5 mad=5 mul=4 mulhi=5 or=1 rotl=4 rotr=5 shfl=3 sub=5 xor=2
[2026-10-07T19:35:54Z] load site instr 23: src r6 win 2 off 0; last base writer mad at 22; writers back to the last injecting one: mad@22; shadow writes of r6 per rep: add=5 mad=7 mul=1 mulhi=1 rotl=3 rotr=2 shfl=3 sub=1 xor=6
[2026-10-07T19:35:54Z] load site instr 32: src r0 win 2 off 0; last base writer xor at 20; writers back to the last injecting one: xor@20; shadow writes of r0 per rep: add=7 mad=1 mul=3 mulhi=3 or=3 rotl=3 rotr=2 shfl=5 sub=2 xor=3
[2026-10-07T19:35:54Z] load site instr 36: src r7 win 1 off 1; last base writer rotr at 31; writers back to the last injecting one: rotr@31 load@6; shadow writes of r7 per rep: add=5 mad=5 mul=4 mulhi=5 rotl=1 rotr=5 shfl=3 sub=4 xor=5
[2026-10-07T19:35:54Z] load site instr 39: src r7 win 1 off 1; last base writer rotl at 38; writers back to the last injecting one: rotl@38 add@37; shadow writes of r7 per rep: add=5 mad=5 mul=4 mulhi=5 rotl=1 rotr=5 shfl=3 sub=4 xor=5
[2026-10-07T19:35:54Z] load site instr 41: src r4 win 0 off 0; last base writer rotl at 40; writers back to the last injecting one: rotl@40 load@32; shadow writes of r4 per rep: add=5 mad=5 mul=4 mulhi=5 or=1 rotl=4 rotr=5 shfl=3 sub=5 xor=2
[2026-10-07T19:35:54Z] load site instr 45: src r5 win 1 off 0; last base writer rotr at 27; writers back to the last injecting one: rotr@27 shfl@24; shadow writes of r5 per rep: add=10 mul=5 mulhi=1 rotl=3 rotr=1 shfl=4 sub=3 xor=4
[2026-10-07T19:35:54Z] load site instr 50: src r7 win 2 off 3; last base writer load at 45; writers back to the last injecting one: load@45; shadow writes of r7 per rep: add=5 mad=5 mul=4 mulhi=5 rotl=1 rotr=5 shfl=3 sub=4 xor=5
[2026-10-07T19:35:54Z] load site instr 58: src r3 win 0 off 0; last base writer load at 50; writers back to the last injecting one: load@50; shadow writes of r3 per rep: mad=6 mul=2 mulhi=4 or=1 rotl=4 rotr=2 xor=4
[2026-10-07T19:35:54Z] load site instr 59: src r2 win 0 off 0; last base writer xor at 46; writers back to the last injecting one: xor@46; shadow writes of r2 per rep: add=3 mad=2 mul=4 mulhi=2 or=6 rotl=1 rotr=1 shfl=5 sub=2 xor=4
[2026-10-07T19:35:54Z] load site instr 63: src r1 win 1 off 0; last base writer rotr at 62; writers back to the last injecting one: rotr@62 add@56; shadow writes of r1 per rep: add=5 mad=4 mul=6 mulhi=3 or=2 rotl=2 rotr=3 shfl=5 sub=3 xor=2
[2026-10-07T19:35:54Z] window layer: site item windows (first, items) (0x0,2^23) (0x0,2^24) (0x400000,2^22) (0x0,2^24) (0x800000,2^23) (0x800000,2^23) (0x0,2^22) (0x0,2^22) (0x800000,2^23) (0x800000,2^23) (0x0,2^24) (0x0,2^23) (0xc00000,2^22) (0x0,2^24) (0x0,2^24) (0x0,2^23); expected reads per item by quarter 152.000 120.000 104.000 136.000 (flat uniform 128.000)
[2026-10-07T19:36:32Z] 524288 warps (16777216 nonces) interpreted in 38.0 s (2.321 ms per warp per thread); Epoch::hash_warp agreement on 589 warps: 0 mismatches
[2026-10-07T19:36:32Z] p100767-attack-f8 distinct lines per hash: n 16777216 min 983 p1 1008 median 1024 p99 1024 max 1024 mean 1021.6620
[2026-10-07T19:36:32Z] p100767-attack-f8 distinct items per hash: n 16777216 min 123 p1 126 median 128 p99 128 max 128 mean 127.7233
[2026-10-07T19:36:32Z] p100767-attack-f8 distinct lines per warp: n 524288 min 32424 p1 32500 median 32567 p99 32622 max 32670 mean 32566.0828
[2026-10-07T19:36:32Z] p100767-attack-f8 distinct items per warp: n 524288 min 4070 p1 4079 median 4087 p99 4093 max 4096 mean 4086.6480
[2026-10-07T19:36:32Z] uniform expectation: distinct lines per hash 1023.875 of 1024 reads, per warp 32640.3 of 32768 reads (2^22 lines); distinct items per hash 127.9995 of 128, per warp 4095.50 of 4096 (2^24 items)
[2026-10-07T19:36:32Z] positions: largest hi16-bucket (256 items) share 0.0286% at p6 (iteration 0, site 6, instr 23); windowed expectation 0.0061%; largest saturated-source share 0.0126% at p38 (site 6, instr 23)
[2026-10-07T19:36:32Z] acceptance-style (2,048 evaluations, the rule's sample size): the most repeated address at one position 3 of 2048 at p6 (site 6, instr 23); saturated sources at one position 2 of 2048 at p6 (site 6, instr 23); uniform expectation: repeats 1 to 2, saturated 0
[2026-10-07T19:36:32Z] p100767-attack-f8 item histogram (flat): bins 16777216 reads 2147483648 mean 128.000 sigma 11.314 max 29722 (bin 0) z_max +2615.76 min 57 z_min -6.28 chi2/dof 5.05098 chi2_z +11732.89 top0.1% 0.30343% top0.5% 0.97966% top1% 1.72521%
[2026-10-07T19:36:32Z] p100767-attack-f8 item histogram against the window density: full 2^24 chi2/dof 2.30691 largest 29722 (item 0x0) at +2398.44 sigma smallest at -5.03; buckets64 chi2/dof 1.85474 largest 39148 (bucket 0) at +298.28 sigma smallest at -4.43
[2026-10-07T19:36:35Z] p100767-attack-f8 WINDOWED CONTROL item histogram (flat): bins 16777216 reads 2147483648 mean 128.000 sigma 11.314 max 215 (bin 2100831) z_max +7.69 min 56 z_min -6.36 chi2/dof 3.49942 chi2_z +7239.08 top0.1% 0.14829% top0.5% 0.71360% top1% 1.40031%
[2026-10-07T19:36:35Z] p100767-attack-f8 WINDOWED CONTROL against the window density: full chi2/dof 0.99988 largest +5.98 sigma; buckets64 chi2/dof 0.99505 largest +5.11 smallest -4.81
[2026-10-07T19:36:35Z] 6-sigma p100767-attack-f8 items buckets64 against the window density: largest bucket +298.28 sigma, smallest -4.43 -> FLAGGED (beyond 6 sigma)
[2026-10-07T19:36:35Z] hot-set p100767-attack-f8 items (windowed control): f 0.1% S_f 0.30343% E_f(control) 0.14829% X_f +0.15514% X_f/f +1.5514 -> HOT SET
[2026-10-07T19:36:35Z] hot-set p100767-attack-f8 items (windowed control): f 0.5% S_f 0.97966% E_f(control) 0.71360% X_f +0.26605% X_f/f +0.5321 -> no hot set
[2026-10-07T19:36:35Z] hot-set p100767-attack-f8 items (windowed control): f 1.0% S_f 1.72521% E_f(control) 1.40031% X_f +0.32490% X_f/f +0.3249 -> no hot set
[2026-10-07T19:36:35Z] hot-set p100767-attack-f8 items (windowed control): verdict FLAGGED
[2026-10-07T19:36:37Z] p100767-attack-f8 FLAT CONTROL item histogram: bins 16777216 reads 2147483648 mean 128.000 sigma 11.314 max 191 (bin 10083710) z_max +5.57 min 71 z_min -5.04 chi2/dof 1.00035 chi2_z +1.01 top0.1% 0.13110% top0.5% 0.63254% top1% 1.24340%
[2026-10-07T19:36:37Z] hot-set p100767-attack-f8 items (flat control, the auditor's first view): f 0.1% S_f 0.30343% E_f(control) 0.13110% X_f +0.17233% X_f/f +1.7233 -> HOT SET
[2026-10-07T19:36:37Z] hot-set p100767-attack-f8 items (flat control, the auditor's first view): f 0.5% S_f 0.97966% E_f(control) 0.63254% X_f +0.34711% X_f/f +0.6942 -> no hot set
[2026-10-07T19:36:37Z] hot-set p100767-attack-f8 items (flat control, the auditor's first view): f 1.0% S_f 1.72521% E_f(control) 1.24340% X_f +0.48180% X_f/f +0.4818 -> no hot set
[2026-10-07T19:36:37Z] hot-set p100767-attack-f8 items (flat control, the auditor's first view): verdict FLAGGED
[2026-10-07T19:36:37Z] ratio p100767-attack-f8: top 0.1% / 0.5% / 1% share over the WINDOW-MODEL control 2.0462x / 1.3728x / 1.2320x (gate 1.2x at 0.1%: BEYOND); over the FLAT control 2.3145x / 1.5488x / 1.3875x
[2026-10-07T19:36:39Z] attribution: hot threshold count >= 257 marks 17086 items (0.1018% of items) holding 6595489 reads (0.3071% of reads); top 8 items t=0x000000:29722 t=0x200000:10078 t=0x300000:7889 t=0x180000:6223 t=0x100000:5739 t=0x0c0000:4809 t=0x080000:4756 t=0x380000:4599
[2026-10-07T19:36:57Z] attribution: reads on hot items per position (flat expectation 0.1018% of each position's 16777216 reads); the 24 largest: p86(it5 s6)=3.360% p6(it0 s6)=3.359% p54(it3 s6)=3.359% p38(it2 s6)=3.359% p118(it7 s6)=3.358% p22(it1 s6)=3.357% p102(it6 s6)=3.355% p70(it4 s6)=3.354% p103(it6 s7)=0.416% p119(it7 s7)=0.416% p23(it1 s7)=0.416% p7(it0 s7)=0.415% p87(it5 s7)=0.415% p39(it2 s7)=0.415% p55(it3 s7)=0.414% p71(it4 s7)=0.414% p0(it0 s0)=0.210% p31(it1 s15)=0.210% p75(it4 s11)=0.209% p11(it0 s11)=0.209% p59(it3 s11)=0.209% p112(it7 s0)=0.209% p95(it5 s15)=0.208% p107(it6 s11)=0.208%
[2026-10-07T19:36:57Z] attribution: hot reads by iteration it0=0.307% it1=0.307% it2=0.307% it3=0.307% it4=0.307% it5=0.307% it6=0.307% it7=0.307% ; by site s0=0.208% s1=0.103% s2=0.000% s3=0.104% s4=0.000% s5=0.000% s6=3.358% s7=0.415% s8=0.000% s9=0.000% s10=0.103% s11=0.208% s12=0.000% s13=0.104% s14=0.104% s15=0.207%
[2026-10-07T19:36:57Z] site 0 (instr 6, src r6, k_off 1 offset 0, window 2^23 items): share of its reads into the top 0.1% 0.2078% (flat expectation 0.1018%); index entropy 15.000 bits of 15 uniform-on-window; saturated source 0.0000%; largest 256-item bucket 0.0033% (window expectation 0.0031%)
[2026-10-07T19:36:57Z] site 1 (instr 9, src r7, k_off 0 offset 0, window 2^24 items): share of its reads into the top 0.1% 0.1032% (flat expectation 0.1018%); index entropy 16.000 bits of 16 uniform-on-window; saturated source 0.0000%; largest 256-item bucket 0.0017% (window expectation 0.0015%)
[2026-10-07T19:36:57Z] site 2 (instr 11, src r5, k_off 2 offset 1, window 2^22 items): share of its reads into the top 0.1% 0.0000% (flat expectation 0.1018%); index entropy 14.000 bits of 14 uniform-on-window; saturated source 0.0000%; largest 256-item bucket 0.0064% (window expectation 0.0061%)
[2026-10-07T19:36:57Z] site 3 (instr 12, src r3, k_off 0 offset 0, window 2^24 items): share of its reads into the top 0.1% 0.1039% (flat expectation 0.1018%); index entropy 16.000 bits of 16 uniform-on-window; saturated source 0.0000%; largest 256-item bucket 0.0017% (window expectation 0.0015%)
[2026-10-07T19:36:57Z] site 4 (instr 13, src r2, k_off 1 offset 1, window 2^23 items): share of its reads into the top 0.1% 0.0000% (flat expectation 0.1018%); index entropy 15.000 bits of 15 uniform-on-window; saturated source 0.0000%; largest 256-item bucket 0.0032% (window expectation 0.0031%)
[2026-10-07T19:36:57Z] site 5 (instr 19, src r4, k_off 1 offset 1, window 2^23 items): share of its reads into the top 0.1% 0.0000% (flat expectation 0.1018%); index entropy 15.000 bits of 15 uniform-on-window; saturated source 0.0000%; largest 256-item bucket 0.0032% (window expectation 0.0031%)
[2026-10-07T19:36:57Z] site 6 (instr 23, src r6, k_off 2 offset 0, window 2^22 items): share of its reads into the top 0.1% 3.3578% (flat expectation 0.1018%); index entropy 13.999 bits of 14 uniform-on-window; saturated source 0.0121%; largest 256-item bucket 0.0279% (window expectation 0.0061%)
[2026-10-07T19:36:57Z] site 7 (instr 32, src r0, k_off 2 offset 0, window 2^22 items): share of its reads into the top 0.1% 0.4151% (flat expectation 0.1018%); index entropy 14.000 bits of 14 uniform-on-window; saturated source 0.0000%; largest 256-item bucket 0.0064% (window expectation 0.0061%)
[2026-10-07T19:36:57Z] site 8 (instr 36, src r7, k_off 1 offset 1, window 2^23 items): share of its reads into the top 0.1% 0.0000% (flat expectation 0.1018%); index entropy 15.000 bits of 15 uniform-on-window; saturated source 0.0000%; largest 256-item bucket 0.0033% (window expectation 0.0031%)
[2026-10-07T19:36:57Z] site 9 (instr 39, src r7, k_off 1 offset 1, window 2^23 items): share of its reads into the top 0.1% 0.0000% (flat expectation 0.1018%); index entropy 15.000 bits of 15 uniform-on-window; saturated source 0.0000%; largest 256-item bucket 0.0032% (window expectation 0.0031%)
[2026-10-07T19:36:57Z] site 10 (instr 41, src r4, k_off 0 offset 0, window 2^24 items): share of its reads into the top 0.1% 0.1035% (flat expectation 0.1018%); index entropy 16.000 bits of 16 uniform-on-window; saturated source 0.0000%; largest 256-item bucket 0.0017% (window expectation 0.0015%)
[2026-10-07T19:36:57Z] site 11 (instr 45, src r5, k_off 1 offset 0, window 2^23 items): share of its reads into the top 0.1% 0.2077% (flat expectation 0.1018%); index entropy 15.000 bits of 15 uniform-on-window; saturated source 0.0000%; largest 256-item bucket 0.0032% (window expectation 0.0031%)
[2026-10-07T19:36:57Z] site 12 (instr 50, src r7, k_off 2 offset 3, window 2^22 items): share of its reads into the top 0.1% 0.0000% (flat expectation 0.1018%); index entropy 14.000 bits of 14 uniform-on-window; saturated source 0.0000%; largest 256-item bucket 0.0064% (window expectation 0.0061%)
[2026-10-07T19:36:57Z] site 13 (instr 58, src r3, k_off 0 offset 0, window 2^24 items): share of its reads into the top 0.1% 0.1039% (flat expectation 0.1018%); index entropy 16.000 bits of 16 uniform-on-window; saturated source 0.0000%; largest 256-item bucket 0.0017% (window expectation 0.0015%)
[2026-10-07T19:36:57Z] site 14 (instr 59, src r2, k_off 0 offset 0, window 2^24 items): share of its reads into the top 0.1% 0.1038% (flat expectation 0.1018%); index entropy 16.000 bits of 16 uniform-on-window; saturated source 0.0000%; largest 256-item bucket 0.0017% (window expectation 0.0015%)
[2026-10-07T19:36:57Z] site 15 (instr 63, src r1, k_off 1 offset 0, window 2^23 items): share of its reads into the top 0.1% 0.2072% (flat expectation 0.1018%); index entropy 15.000 bits of 15 uniform-on-window; saturated source 0.0000%; largest 256-item bucket 0.0033% (window expectation 0.0031%)
[2026-10-07T19:36:57Z] attribution: item 0x000000 (29722 reads) read from positions p38(it2 s6)x3787 p6(it0 s6)x3774 p102(it6 s6)x3732 p86(it5 s6)x3713 p70(it4 s6)x3696 p22(it1 s6)x3673 p54(it3 s6)x3620 p118(it7 s6)x3602 p15(it0 s15)x6 p43(it2 s11)x5 p79(it4 s15)x5 p39(it2 s7)x4
[2026-10-07T19:36:57Z] attribution: item 0x200000 (10078 reads) read from positions p54(it3 s6)x1320 p70(it4 s6)x1305 p102(it6 s6)x1269 p22(it1 s6)x1246 p118(it7 s6)x1242 p86(it5 s6)x1219 p38(it2 s6)x1199 p6(it0 s6)x1171 p119(it7 s7)x5 p27(it1 s11)x5 p71(it4 s7)x5 p80(it5 s0)x5
[2026-10-07T19:36:57Z] attribution: item 0x300000 (7889 reads) read from positions p22(it1 s6)x988 p118(it7 s6)x987 p6(it0 s6)x982 p70(it4 s6)x980 p86(it5 s6)x963 p54(it3 s6)x961 p102(it6 s6)x957 p38(it2 s6)x956 p119(it7 s7)x8 p7(it0 s7)x7 p47(it2 s15)x6 p1(it0 s1)x5
[2026-10-07T19:36:57Z] attribution: item 0x180000 (6223 reads) read from positions p118(it7 s6)x814 p86(it5 s6)x784 p22(it1 s6)x772 p102(it6 s6)x770 p38(it2 s6)x761 p54(it3 s6)x749 p70(it4 s6)x737 p6(it0 s6)x716 p103(it6 s7)x7 p87(it5 s7)x5 p43(it2 s11)x4 p55(it3 s7)x4
[2026-10-07T19:36:57Z] attribution: item 0x100000 (5739 reads) read from positions p38(it2 s6)x725 p102(it6 s6)x723 p86(it5 s6)x707 p70(it4 s6)x699 p6(it0 s6)x697 p22(it1 s6)x688 p54(it3 s6)x687 p118(it7 s6)x681 p11(it0 s11)x6 p7(it0 s7)x4 p23(it1 s7)x4 p58(it3 s10)x4
[2026-10-07T19:36:57Z] attribution: item 0x0c0000 (4809 reads) read from positions p70(it4 s6)x655 p22(it1 s6)x611 p86(it5 s6)x610 p102(it6 s6)x587 p38(it2 s6)x573 p54(it3 s6)x566 p6(it0 s6)x551 p118(it7 s6)x534 p23(it1 s7)x6 p11(it0 s11)x5 p87(it5 s7)x5 p7(it0 s7)x4
[2026-10-07T19:36:57Z] attribution: item 0x080000 (4756 reads) read from positions p102(it6 s6)x593 p70(it4 s6)x590 p118(it7 s6)x581 p38(it2 s6)x578 p22(it1 s6)x577 p6(it0 s6)x573 p54(it3 s6)x569 p86(it5 s6)x563 p7(it0 s7)x10 p119(it7 s7)x6 p71(it4 s7)x6 p103(it6 s7)x6
[2026-10-07T19:36:57Z] attribution: item 0x380000 (4599 reads) read from positions p102(it6 s6)x590 p6(it0 s6)x576 p54(it3 s6)x568 p22(it1 s6)x567 p118(it7 s6)x556 p86(it5 s6)x549 p70(it4 s6)x541 p38(it2 s6)x534 p55(it3 s7)x8 p103(it6 s7)x6 p95(it5 s15)x6 p43(it2 s11)x5
[2026-10-07T19:36:57Z] hottest item p100767-attack-f8 (0x000000): 29722 reads (0.0014% of all); predicted source site-instr6:r6:zero:last-writer-mad@4
[2026-10-07T19:36:57Z] program p100767-attack-f8 DONE: 16777216 nonces; 6-sigma (windowed) FLAGGED; hot-set FLAGGED; verdict FLAGGED
Terminated
lease: released 32 pool cores after 706 s, exit 0

View file

@ -0,0 +1,631 @@
# Report: adversarial pass on the program acceptance rule (class v4 sub-version 3)
internal adversarial pass, not an independent review
- Target commit: 017e70376489251e18564c0abce7e466e606c8b3 (class v4 sub-version 3, object byte 7).
- Crate built: igneum-pow at the frozen commit (this worktree's igneum-pow/ is reset to it; build/master
diverged by 635 deletions and is not used). Harness: tools/attack/adv-accept (depends on igneum-pow by path).
- Re-base (19:3x BST): build/master moved to 7a7caa34 whose igneum-pow IS the frozen object; merged at
8748e955ceb48be5a6cbf7f8718a4884d3de9828; `git diff --quiet 017e7037 HEAD -- igneum-pow` prints IDENTICAL.
Nothing measured here was on a stale tree: igneum-pow/ had been reset to the frozen object before the first build.
- Binary sha256 (first build, box 2): e3d35f4464937f91aac0648e2ee7134f33c85c7aa314b87b33f91059dedc6682 (adv-accept
single-binary build); the two-binary build (adv-accept, adv-live = the unmodified f8 harness) sha256 is logged per
box in the run sections below.
- Boxes: igneum-build-1 (CPU-bound sweeps, by the coordinator's order) and igneum-build-2 (shard 0, already there).
nice 10 on every idle core, the capacity layer's yield (run-box.sh). Logs under
/srv/builds/igneum-wt-adv-accept/adv/ on each box (spared from the checkout clean by .igneum-scratch-spare; the
first 10k log on box 2 was wiped by a rebuild before the spare existed and is void anyway: old labels, old binary).
- Lane scope since 19:2x BST: THE BYPASS (Q1, Q2, Q5). Q3 is lane adv-accept-3's, Q4 lane adv-accept-2's.
- Seed space: the attack-pass F8 label space (program k = seed_words("igneum-attack-f8/program/k"), era
".../era/k"), so `adv-live warps --program k` measures the live hot set of exactly the program the sweep reports.
- rustc 1.99.0 both sides. First results by 8 October 2026 18:00 UTC. GPU: not available, so any per-card
hash-rate confirmation of a gain is BLOCKED and said so.
- Box-hours spent so far: about 0.1 (one 7 s build, three short runs). Budget 8.
## Draw-path validation (must pass before any claim)
The shared devnet epoch-0 class v4 program drawn through Epoch::chain_program(ProgramClass::V4) has
program id a785001687d8688a at attempt 1 (class mx8-erad810f22d+sh256x27), which matches the frozen
pack proto-cuda/packs-ca3-v4/v4-devnet-epoch0/program.json and the brief. So my draw path is the
chain's. Command: `adv-accept derive-check` on box 2. Devnet 3 epoch-0 (id fce15bf61030be57) derive
check is owed once I copy its program.json read-only from build-1.
## Status board
| Q | Method | Known-failed shape (must fire) | Gate | Result | Status |
|---|---|---|---|---|---|
| Q1 | Steering/hot set: the chain's class v4 draw over the F8 label space (shards of 100k seeds; 19:27 BST to 19:4x BST under the SIGSTOP yield, since 19:4x BST nice 10 on cores 8-95, no yield), the stand-in per-site ratio at 256 units as the proxy, the live hot set by the unmodified f8 harness (adv-live) on the lowest-ratio seeds and on a consecutive-seed census | adv-live const-item plant FLAGGED (21.8x, X_1% +6.49); clean control 0.9996x PASS | X_f >= f flags a hot set; gain = implied on-die SRAM copy size | 29,032 accepted programs drawn; three pass the rule and flag the f8 hot-set test at 2^24 nonces (100767 X_0.1% +0.155% 2.05x, 4346 +0.178% 2.24x, 5245 +0.129% 1.86x), 100767 also under the class v5 dataset (+0.155%, the same hot items); 16 lowest stand-in-ratio seeds live: 9 beyond the f8 1.2x gate, 3 hot sets; 17 random: 1 beyond, 0 hot sets; each hot set is 1 MB of items holding 0.28 to 0.33% of reads: gain 1.002x | FINDING, bounded: a program-dataflow distinguisher (site 6, a near-zero source under the 1% (c') limit) that survives the class v5 dataset; not an exploitable bypass; the 256-unit selector is weak (7 of 12 false positives); shards and 23 live rows re-queued in the lease pool |
| Q2 | Stand-in gap: a validated mirror runs the rule's own units on the closed form and on the live dataset; per-site ratio at 2^20 and the (c) metrics compared | zero-dataset plant: live 0.9733 REJECT against closed accept (fired) | any false accept that reads a hot set on the live set | 54 programs: max per-site gap 0.0004 (the 2^20 sampling noise), mean min-ratio gap 0.00002, 0 verdict disagreements, (c) metrics agree to 0.019 of 128 | BOUND |
| Q3 | Handed to lane adv-accept-3 (unspawned); row 90 (exhaustion census: per-part rejections, cap, last resort) claimed by this lane, owner adv-accept-3 | forced-exhaust plant must hit the cap and print the last-resort program | P(exhaust) bounded; last resort characterised | attempts census over 20k seeds RUNNING (box 2); plant RUNNING | RUNNING (owner adv-accept-3, unspawned) |
| Q4 | Handed to lane adv-accept-2 | | | | HANDED OVER |
| Q5 | Generator distinguishers over accepted programs: lossy last write, register-set collapse, the per-site ratio tail against the 0.98 floor | the five lowest-ratio seeds reproduce as live tail programs (done); F8 p15/p18/p19/p56 reproduction owed | a structural shape that lowers the live distinct-item count | first 864: lossy last write in 83%, 0 register collapse, min ratio 0.9986 at 256 units; at 2^20 the tail reaches 0.9832 (floor 0.98) | RUNNING |
| Q6 | Fixed (c) sample grindability; live-size invariance of the (c) verdict | | BOUND unless something fires | not started | PENDING |
The plant (known-failed shape for the harness itself) fired: planting an `or` write of a load's
source register immediately before the load makes the rule reject with "(a') load at 1 reads r4, not
fresh by dataflow in the loop's steady state". So the harness reads the real rule, not a copy.
Command: `adv-accept plant --seed 0` on box 2.
## Q1 and Q5: the accepted-program sweep (RUNNING, sharded)
Ten shards of 100,000 seeds (k = 2..1,000,001 of the F8 label space), each
`adv-accept sweep --seed-start S --seeds 100000 --threads 96 --ratio-units 256 --out
/srv/builds/igneum-wt-adv-accept/adv/sweep-sNN.txt`, started through run-box.sh (nice 10, yield to
builds, pid/pgid/yield pid files beside the log). Shard 00 (S = 2) on box 2, started 19:27 BST. Shard 01
(S = 100,002) on box 1, started 19:30 BST. Shards 02..09 sit as self-contained scripts in
/srv/builds/_adv/accept/queue/ on box 2 (claim by mkdir under claims/), to be run back to back on
whichever box has idle cores. Every row is written as it lands, so a partial shard is data.
Live hot set (the measure the chip model prices): `adv-live warps --program k --nonces N` (the
unmodified f8 harness: the day's items derived into a table, the cross-hash item histogram, the
hot-set test X_f >= f against the window-model control, the 6-sigma test, library agreement checks).
Known-failed shape run first: `--plant const-item` on program 2 at 10^6 nonces (box 1, 19:30 BST, log
adv/live-plant-p2.log) beside its clean control (adv/live-control-p2.log). The plant must be FLAGGED
and the control clear before any live number below is trusted.
Seeds: epoch bytes = LE words of seed_words_from_bytes("igneum-attack-f8/program/k"), era bytes of
".../era/k"; each drawn through the chain path generate_era(V4_CLASS, V3_ALLOWED), which runs the
full attempt loop and the real acceptance rule.
Per accepted program the sweep records: attempt, program id, the closed-form distinct-item mean per
hash (the rule's own (c) metric; 128 is ideal, the rule floor is a mean above 120), the minimum
per-site distinct-index ratio at 256 units (the (c'') metric sampled cheaply; the enforced floor is
0.98 at 2^20 units), the saturated-final count and the output-bias max.
This is the closed-form proxy for Q1 and the headroom characterization for Q5. The live-dataset hot
set (the memory-hard cache, items derived into a table, the cross-hash histogram with the hot-set
test) is the next run and is what the chip model prices; the closed-form distinct mean is a cheap
upper bound on how concentrated an accepted program can be on the stand-in.
Numbers land here when the run finishes (first results by 8 October 18:00 UTC).
## Results as they land
### Tool validation (box 1, 19:30 BST, 10^6 nonces each, about 30 s per run on 32 threads)
| Run | Hot-set test (window-model control) | Top 0.1% share ratio over the window model | 6-sigma | Verdict |
|---|---|---|---|---|
| `adv-live warps --program 2 --plant const-item` (known-failed shape) | f 1%: S_f 8.58%, E_f 2.09%, X_f +6.49% (X_f/f 6.49) HOT SET | 21.80x (flat control 26.85x) | FLAGGED | FLAGGED |
| `adv-live warps --program 2` (clean control) | f 1%: S_f 2.56%, E_f 2.09%, X_f +0.47% (X_f/f 0.47) no hot set | 0.9996x (flat 1.2312x, the window layer) | clear | PASS |
The plant fires and the control is clean, so the live hot-set numbers below are trusted. Logs
adv/live-plant-p2.log and adv/live-control-p2.log on box 1.
### Sweep shard 01, first 864 accepted programs (box 1, seeds 100,002..., read at 19:33 BST)
| Metric | Value |
|---|---|
| Attempt histogram 0..9 | 273, 191, 134, 90, 59, 38, 34, 12, 7, 11; max 26 |
| Min per-site distinct-index ratio at 256 units | 0.9986 (floor 0.98 at 2^20; every row above 0.998) |
| Programs with a lossy (or/mul/mulhi) last write to an output register | 715 of 864 (83%) |
| Programs writing fewer than 8 registers | 0 |
| Last-resort programs | 0 |
| Lowest-ratio seeds (live hot set queued) | 100211 (0.9986), 100629 (0.9987), 100064, 100767 (0.9988), 100159 |
Reading: on the stand-in the accepted population sits 0.02 above the 0.98 floor at this sample size; the
floor leaves headroom (Q5), and no accepted program in this sample comes near it. Whether any of the
lossy-last-write programs concentrate reads on the LIVE set is what the live census answers.
### Rule change in the method column (box-hours honesty)
19:27 BST to 19:4x BST: shards ran under the capacity layer's SIGSTOP yield and were paused almost the whole
time (a build slot held nearly continuously on both boxes). Ruling at 19:4x BST: yield dropped, every sweep at
nice 10 on cores 8-95 (cores 0-7 reserved for release builds, the seed and the observer). Shards 00 and 01
SIGCONTed and re-pinned at 19:4x BST. Box-hours before the ruling: about 0.1 of running time.
### Live hot set of the five lowest-ratio shard-01 programs (box 1, 19:37 BST, 10^6 nonces each)
All five pass the rule (they are the chain's accepted programs). Log logs/adv-accept/live-lowratio-s01.log.
Columns: the f8 gate (top 0.1% share over the window-model control, gate 1.2x), the hot-set excess X_f at
f = 0.1% and 1% (a hot set needs X_f >= f), the windowed 6-sigma test, the hottest item and its traced source.
| Seed | id | attempt | closed ratio (256 u) | top 0.1% over window model | X_0.1% / X_1% | 6-sigma (buckets64) | hottest item, reads, share, source |
|---|---|---|---|---|---|---|---|
| 100211 | d07885a437e237c7 | 0 | 0.9986 | 1.08x | +0.026% / +0.049% | +42.4 sigma FLAGGED | 0x454585, 1238 (0.0010%), site instr 4 reads r0 one-zero-bit, writer load@3 |
| 100629 | 37c849d9741c5994 | 0 | 0.9987 | 1.01x | +0.003% / +0.015% | +5.6 within | 30 reads, none |
| 100064 | 2442abf9d56f6611 | 2 | 0.9988 | 1.17x | +0.044% / +0.189% | +77.3 sigma FLAGGED | 54 reads; the flag is a 256-item bucket at p43 (iteration 2, site 11, instr 33) holding 0.048% of that position's reads against 0.0061% expected (8x) |
| 100767 | 9d68e6286fc817d4 | 2 | 0.9988 | 1.34x BEYOND the 1.2x gate | +0.087% / +0.138% | +68.0 sigma FLAGGED | 0x000000, 1677 (0.0013%), site instr 6 reads r6 = zero, writer mad@4; saturated-source share 0.013% at that position (the (c') limit is 1%) |
| 100159 | 573d650159a8b04e | 3 | 0.9988 | 1.07x | +0.020% / +0.124% | +37.5 sigma FLAGGED | 37 reads, none |
| p2 control (19:30 BST) | f8 seed 2 | | | 0.9996x | +0.00% / +0.47% (flat) | clear | 32 reads |
Reading, as an attacker. (1) The stand-in ratio does correlate with live concentration: four of the five
lowest-ratio seeds flag the windowed 6-sigma test at 10^6 nonces where the random control is clear, and one
sits beyond the f8 gate. (2) The concentration is NOT a hot set a chip can use: the top 0.1% of items (16.7k
items, 1 MB) take at most 0.34% of reads against 0.26% expected; the hottest single item takes 0.0013% of
reads. An on-die copy of these items saves under 0.1% of DRAM reads: no row of chip-model-v3.md moves.
(3) The mechanism is the known one, a near-saturated source (zero, or one bit off all ones) at one site in
one iteration, below the (c') 1% limit (0.013% here), so (c') never fires, and the per-site ratio at 0.98 is
loose enough (these sit at 0.9986) that (c'') never fires either.
### FINDING (bounded): seed 100767 at 2^24 nonces passes the rule and flags the f8 hot-set test (box 1, 19:4x BST)
Reproduce in one command, from the frozen crate (017e7037) with the unmodified f8-uniform harness built as
adv-live (tools/attack/adv-accept, `cargo build --release`):
adv-live warps --program 100767 --nonces 16777216 --threads 32 --diag 1 --validate sample --out <dir>
The program is the chain's class v4 draw for epoch seed bytes = the little-endian words of
seed_words_from_bytes("igneum-attack-f8/program/100767") =
74484b391756fc49568cdd716bcfd839a55d31a45633c223c65c7f2ab4617fd4 and era seed bytes = the same of
"igneum-attack-f8/era/100767" = 7a65a05391dcd87b8fdaf7f74813aa17c6e13f7c56a03da2aaa6176987ef038b
(f8's program_spec(k) for k >= 2; `adv-accept gap --seeds 100767` prints the same id), through
generate_era(V4_CLASS, V3_ALLOWED): attempt 2, program id 9d68e6286fc817d4, class
mx8-era763e5847+sh256x27, day bytes "igneum-day/" || 20730_le64 (f8's default day). The run's log is
logs/adv-accept/live-confirm-16m.log in this branch (copied from box 1,
/srv/builds/_adv-adv-accept/live-confirm-16m.log); the harness checks its mirror against Epoch::hash_warp
on 64 warps plus every 997th (0 mismatches in the log). Accepted by every part of the rule: it is the
program try_generate_class returns for the seed (attempt 0 and 1 rejected).
| Measure | Value | Uniform / control |
|---|---|---|
| Hot-set test f = 0.1% | S_f 0.303%, E_f 0.148%, X_f +0.155%, X_f/f 1.55: HOT SET | X_f >= f fires |
| Hot-set test f = 0.5%, 1% | X_f +0.266% (X/f 0.53), +0.325% (0.33): no hot set | |
| Top 0.1% share over the window-model control | 2.05x (0.5%: 1.37x, 1%: 1.23x); flat control 2.31x | f8 gate 1.2x; population 0.998x to 1.043x (14 random accepted programs, census, 10^6 nonces) |
| Windowed 6-sigma, 64-item buckets | largest bucket +294.8 sigma | population +4.4 to +30.6 at 10^6 nonces |
| Hot items (top 0.1% = 17,034 items, 1.0 MB) | 6,579,906 of 2,147,483,648 reads (0.306%) | 0.148% expected |
| Top 8 items | 0x000000 (29,355 reads), 0x200000, 0x300000, 0x180000, 0x100000, 0x080000, 0x380000, 0x0c0000: multiples of 2^19, read almost only from site 6 in every iteration | |
| Site attribution | site 6 (instr 23, src r6, quarter window) puts 3.35% of its reads into the hot items; site 7 (instr 32, src r0) 0.41%; every other site 0.00 to 0.21% (expected 0.10%) | |
| Site 6 source | r6, last written by mad at instr 4; saturated (zero) in 0.0126% of evaluations at that position (the (c') limit is 1%); the hot items are the images of small source values under the era stride | |
Gain, priced against chip-model-v3.md section 5.7: an on-die copy of the top 0.1% of items (1 MB of SRAM)
serves 0.31% of this program's loads instead of 0.15%, so it removes 0.16% of DRAM reads. The f = 1 chip's
rate is lanes over latency per read; 0.16% fewer reads is a gain of 1.002x. No row moves. The rule has let
through a program with a measurable, attributable hot set, and the hot set is worthless to a chip. The
distinguisher is real; the bypass is not exploitable at this size.
The other three lowest-ratio seeds at 2^24 nonces (same log): all BEYOND the f8 1.2x gate on the live
set, none a hot set by X_f >= f.
| Seed | top 0.1% over window model | X_0.1% (X/f) | 6-sigma | hot-set verdict |
|---|---|---|---|---|
| 100211 | 1.33x | +0.066% (0.66) | FLAGGED | clear |
| 100064 | 1.63x | +0.094% (0.94) | FLAGGED | clear |
| 100159 | 1.29x | +0.048% (0.48) | FLAGGED | clear |
| 23 random accepted programs (census, 10^6 nonces) | 0.998x to 1.043x, 0 over 1.2x | | 5 of 14 flagged weakly (+6 to +31) | |
So the stand-in's per-site ratio, read at 256 units in the sweep, is a working proxy for live concentration:
the five lowest of 4,600 all fail the f8 gate on the live set while the population passes it. A seed-steering
attacker (lane adv-accept-3's question) has a cheap selector. What it buys is the number above: a 1 MB hot
set holding 0.3% of reads.
What a larger search adds: the sweep ranks seeds by the stand-in ratio, and the worst of 4,600 accepted
programs gave X_0.1% = 0.155%. If the tail scales as the extreme of the population, 10^6 seeds reach a few
times that, still under 1% of reads. The census over consecutive seeds (random accepted programs) says how
often the hot-set test fires in the population; that number lands below.
### The selector's base rate (sweep rows read at 20:46 BST: 29,032 accepted programs, shards 00, 01, 01b, 02)
The stand-in per-site ratio at 256 units, over every accepted program so far (one row per seed; every seed
of the F8 label space yields an accepted program through the chain draw):
| Quantile | min | 0.1% | 1% | 10% | median | max |
|---|---|---|---|---|---|---|
| ratio | 0.9945 | 0.9982 | 0.9993 | 0.9998 | 0.9999 | 1.0000 |
| Threshold | Programs under it | Tries per hit |
|---|---|---|
| ratio < 0.9990 | 164 of 29,032 | 1 in 177 |
| ratio < 0.9986 (the five first-confirmed seeds sat here) | 58 | 1 in 501 |
| ratio < 0.9980 | 23 | 1 in 1,262 |
| ratio < 0.9970 | 9 | 1 in 3,226 |
| ratio < 0.9960 | 6 | 1 in 4,839 |
Over the 29,032: accepted attempt 0..11 = 9,302, 6,315, 4,298, 2,855, 2,029, 1,322, 960, 634, 409, 311, 175,
130; max 26; mean 2.128; last-resort programs 0; a lossy last write to an output register in 24,285
(83.6 percent); register-set collapse 0; mean `or` count 2.46 per program.
Cost of the selector: one chain draw per try (about 3 s of one core: the accepted attempt's 2^20 ratio pass
dominates) plus a 256-unit ratio read (milliseconds), so a seed under 0.9986 costs about 25 core-minutes of
grinding, and a seed-steering attacker who can choose among epoch seeds needs about 500 candidate seeds per
hit. The five confirmed hits at that threshold all failed the f8 1.2x gate live; the random sample's live
failure rate is 0 of 27 so far (census), so the gate-failure rate conditional on the selector is 5 of 5
against 0 of 27 unconditional. The widened rows (20 lowest, 20 random, at 2^24 nonces) turn this into a
correlation with its error when they land (live-low20-16m.log on box 1, live-random20-16m.log on box 2).
Attempt histogram over the 16,337 (accepted attempt 0..11): 5,271, 3,602, 2,434, 1,585, 1,110, 740, 521,
368, 211, 166, 100, 72; max 26; mean 2.097; last-resort programs 0. Q5 structure: a lossy last write to an
output register in 13,662 (83.6%), register-set collapse 0.
### Row 90 (owner adv-accept-3, unspawned; claimed): the attempt loop, the cap and the last resort
Known-failed shape fired (box 2, 19:50 BST, `adv-accept attempts --seed-start 2 --seeds 3 --force-exhaust`,
log adv/attempts-plant.log): with every verdict read as a rejection the loop hits its cap and hands the
last-resort program, which the tool prints and re-checks. The three last-resort programs (cap 8 under the
plant): every or, mul and mulhi rewritten to xor (op mix xor 17 to 19, load 16, 0 lossy ops, 8 registers
written), and the real rule accepts each one as drawn (distinct mean 127.86 to 128.00, 0 saturated, bias
max 58 to 66). Reading: the last resort is predictable (a deterministic function of attempt 256's draw) and
is NOT weak by the rule's own measures; it is a program with no lossy op at all, which the live hot-set
measure has not yet been run on (owed). The 20k-seed census of real attempts (per-part rejections, cap
reached, P(exhaust)) is running (attempts-20k.log); its numbers land here.
### The defender's question 3: the concentration at the acceptance's own 2^20 sample (box 2, 20:4x BST)
`adv-accept gap --seeds 100767,100211,100064,100159,100629,2,3664` (lease 32, log logs/adv-accept/gap-rep8.log
when it ends): per site, over the rule's own 4,096 units x 32 lanes x 8 iterations = 2^20 random-nonce
evaluations, the share of the site's reads that land on word indices read 8 or more times (a uniform site on
a 2^26-word window repeats an index 2 or 3 times at most, so this share is 0.000 percent for a clean site).
| Program | the low site | distinct-index ratio closed / live | reads on indices read >= 8 times, closed / live | every other site |
|---|---|---|---|---|
| 100767 (the exemplar) | site 6 (instr 23, r6) | 0.9919 / 0.9920 | 0.168% / 0.151% | 0.000% |
| 100211 | site 9 (instr 31) | 0.9907 / 0.9908 | 0.186% / 0.179% | 0.000% |
| 100064 | min site 0.9832 / 0.9831 | | under 0.01% at every site | |
| 100159 | min site 0.9834 / 0.9832 | | under 0.01% at every site | |
| 100629 | min site 0.9834 / 0.9834 | | under 0.01% at every site | |
| 2 (control) | none under 0.9999 | | 0.000% everywhere | |
| 3664 (the lowest 256-unit read, 0.9945) | min site 6 at 0.9944 / 0.9943 | | under 0.01% | its 256-unit read was not noise: the 2^20 ratio agrees |
All seven done (log logs/adv-accept/gap-rep8.log). Two of the seven carry a site with over 0.1 percent of its
reads on heavily repeated indices (100767 site 6, 100211 site 9); the other low-ratio programs reach 0.983
at 2^20 through spread repeats under 0.01 percent per site, a different shape: a site that is slightly
less than uniform everywhere rather than one hot image.
So the concentration the sequential 2^24 run shows (site 6 putting 3.35 percent of its reads into the top
0.1 percent of ITEMS, 17k items) appears at the acceptance's own random-nonce sample as 0.17 percent of
site 6's reads on heavily repeated WORD indices and a ratio of 0.9919: the two readings agree once items
(16 words each, 2^24 of them) are told from words (2^28), and the rule's sample does see it; its floor at
0.98 is set below it.
### The class v5 floor at 0.995 against the measured concentrations (main's five-program job, box 2, 21:35 BST)
`adv-accept gap --day 20733 --hex <devnet3>:<devnet3>:devnet3-epoch0-v4` and `adv-accept gap --day 20730
--seeds 4346,5245,106924,107022 --hex <era-fixed-20> --hex <era-drawn-2>`, each through `lease pool 8
--min 4` (logs logs/adv-accept/gap-five-d20733.log, gap-five-d20730.log, gap-hot2.log). The minimum per-site
distinct-index ratio at the acceptance's own 2^20 sample, against the class v5 floor (c''') of 0.995:
| Program | id, attempt | min site | ratio closed / live | against 0.995 | live concentration measured |
|---|---|---|---|---|---|
| seed 4346 (this lane) | bbb38e847011c354, 2 | 2 (instr 19) | 0.9840 / 0.9839 | refused | hot set, X_0.1% +0.178%, 2.24x |
| seed 5245 | beaad44840bb9e4e, 5 | 8 (instr 37) | 0.9831 / 0.9833 | refused | hot set, +0.129%, 1.86x |
| seed 106924 | 8aa3c604dba9d11b, 1 | 10 (instr 45) | 0.9821 / 0.9823 | refused | hot set, +0.221%, 2.21x (the second shape) |
| seed 107022 | 0fd1d15a8bd627d4, 1 | 10 (instr 44) | 0.9877 / 0.9876 | refused | hot set, +0.138%, 1.82x (the second shape) |
| seed 100767 (earlier read) | 9d68e6286fc817d4, 2 | 6 (instr 23) | 0.9919 / 0.9920 | refused | hot set, +0.155%, 2.05x |
| seed 1738 (gap-hot3.log, build-1, 21:37 BST) | 33ece54e2df5ea44, 4 | 13 (instr 54) | 0.9868 / 0.9870 | refused | hot set, +0.102%, 1.68x |
| seeds 170 (53a02a7c9c9b86f3) | not yet read at 2^20 | | | | hot set, +0.143%, 2.02x |
| Devnet 3 epoch 0, class v4 | fce15bf61030be57, 0 (day 20733) | 0 (instr 3, src r6) | 0.9992 / 0.9993 | AT OR ABOVE: a residual the floor misses | adv-cache-2: site 0 bit law P(bit 0..2 = 1) = 0.250 / 0.375 / 0.4375, chi2/dof 3.70 at 2^26 |
| adv-cache-2 era-fixed-20 | 11f9f955b21d56c9, 1 | 11 (instr 46) | 0.9997 / 0.9997 | AT OR ABOVE: a residual | adv-cache-2: top 0.1% 1.26x its window control, one item read 512 times |
| adv-cache-2 era-drawn-2 | 7ceb797d31eedb3e, 0 | 13 (instr 55) | 0.9992 / 0.9993 | AT OR ABOVE: a residual | adv-cache-2: chi2/dof 2.04, top 0.1% 1.27x |
Reading. The floor at 0.995 refuses every program whose live hot set passes the f8 test X_f >= f (six of
this lane's seven read so far, minimum sites 0.9821 to 0.9919; seed 170's read is queued), and does not
reach the three milder concentrations (top 0.1
percent share 1.26x to 1.27x, chi2/dof 2 to 3.7) whose minimum site reads 0.9992 to 0.9997, inside the clean
population's spread at 2^20 (clean median 0.9999, clean first percentile about 0.9993 over 29,032 programs).
Devnet 3's own first program is one of those three. What those residuals are worth to a chip: a 1.26x share
of the top 0.1 percent of items is 0.19 percent of reads on 1 MB against 0.15 expected, a gain of 1.0004x;
they are distinguishers at the chi-square level, not hot sets, and no floor on the distinct-index ratio that
keeps the clean rejection rate near 2.4 percent reaches them. The 1738 hot set's ratio (gap-hot3 on build-1)
lands when its lease gets cores.
### Q2, the stand-in gap: first bound (box 2, 19:46 BST, `adv-accept gap`)
Tool: a mirror interpreter with per-site index capture, run on the rule's own base nonces (seed-keyed
acceptance stream) with init words = seed words, once on the closed-form dataset and once on the LIVE
memory-hard dataset (day 20730, the kit's day). Validation on every program: the mirror's 32 hashes equal
the library's hash_warp on 8 units on both datasets, and the mirror's closed-form per-site distinct counts
equal the library's distinct_indices_v4 on all 4096 units. Known-failed shape `--plant zero-dataset`
(every live word 0): live min ratio 0.9733, verdict live REJECT against closed accept, live distinct
mean 115.99 against 128.00: the tool reports a gap when there is one. Logs adv/gap-plant.log, gap-first.log.
| Seed | id | min per-site ratio closed (2^20) | min live (2^20) | largest site gap | (c) on 64 units: distinct mean, saturated, bias max (closed / live) | verdict closed / live |
|---|---|---|---|---|---|---|
| 100767 (the finding) | 9d68e6286fc817d4 | 0.9919 | 0.9920 | +0.0002 | 127.714, 0, 82 / 127.730, 1, 53 | accept / accept |
| 2 (control) | 8a0047b2eb071ade | 0.9999 | 0.9999 | -0.0002 | 128.000, 1, 56 / 128.000, 0, 57 | accept / accept |
| 100211 | d07885a437e237c7 | 0.9907 | 0.9908 | +0.0002 | 128.000, 0, 61 / 128.000, 0, 57 | accept / accept |
| 100064 | 2442abf9d56f6611 | 0.9832 | 0.9831 | +0.0002 | 128.000, 11, 64 / 128.000, 6, 51 | accept / accept |
Reading. The per-site index distribution is set by the program and the register init, and the dataset words
it folds in act as fresh randomness on both sides: the closed form and the live set give the same ratio to
2 parts in 10,000 at 2^20 evaluations, and the same (c) verdicts. No stand-in gap to steer into on these four.
Also: the cheap 256-unit proxy did rank real tail programs, and 100064 sits 0.0032 above the 0.98 floor at
2^20, so the floor is live in the population tail, not idle.
Q2 BOUND over 50 consecutive accepted programs (seeds 3..52, box 2, 20:0x BST, `adv-accept gap --seeds 3,...,52
--threads 32`, log logs/adv-accept/gap-50.log; about 10 s per program):
| Measure over 50 programs, 800 site rows, 2^20 evaluations per site | Value |
|---|---|
| Largest closed-vs-live gap in any site's distinct-index ratio | 0.0004 |
| Mean of (closed min ratio - live min ratio) | 0.00002 |
| Verdict disagreements under the 0.98 floor | 0 of 50 (min closed 0.9927, min live 0.9928) |
| (c) on 64 units: largest closed-vs-live gap in distinct mean per hash | 0.019 of 128 |
| (c) saturated finals: sum of (closed - live) over 50 | -21 of 16,384 x 50 (noise about the 0 line) |
| Either side over the saturation limit (164) or the bias limit (136) | 0 |
Bound: on 54 accepted programs the stand-in and the live dataset agree on every verdict and on every
per-site ratio to 4 parts in 10,000, which is the sampling noise of a 2^20 draw (one standard deviation of
the distinct count is about 90 of 1,040,000, or 0.0001 in the ratio). The threshold-edge disagreements the
spec reports (39 in 100,000) are consistent with this spread; a program would have to sit within 0.0004 of
the floor for the two sides to disagree, and nothing an attacker chooses moves the live side away from the
closed side by more than that, because the words folded in are uniform on both. Steering through the gap is
not available. What a longer pass adds: more programs near the floor to count the edge cases, which the
sweep's ratio column already locates (rows under 0.9810 at 256 units, then a 2^20 gap read on each).
### Widened live confirmation: the 20 lowest and 20 random (RUNNING, 2^24 nonces each)
- box 1, 19:5x BST: `adv-live warps --program k --nonces 16777216 --threads 48 --diag 1` for the 20 lowest
stand-in-ratio seeds of the 16,337 (3664, 103378, 105756, 6610, 106474, 4765, 106700, 4346, 5245,
101905, 1605, 1738, 105371, 6842, 838, 3387, 103265, 170, 106924, 107022; ratios 0.9945 to 0.9980), log
live-low20-16m.log. This row answers the defender's false-positive question: of the lowest 20 (plus the
five already confirmed), how many are NOT beyond 1.2x live.
- box 2, 19:5x BST: the same at 32 threads for 20 random accepted seeds (4107, 101710, 101886, 6132,
105915, 5133, 1932, 2328, 3665, 101643, 1352, 100521, 106359, 4905, 102519, 101697, 106740, 327, 1180,
101805; ratios 0.9994 to 0.9999), log live-random20-16m.log: the control for the correlation.
| Seed | stand-in ratio (256 u) | live top 0.1% over window model | X_0.1% (X/f) | hot set |
|---|---|---|---|---|
| 3664 (lowest of 16,337) | 0.9945 | 1.311x BEYOND | +0.074% (0.74) | clear |
| 103378 | 0.9960 | 1.157x within | +0.028% (0.28) | clear |
| 105756 | 0.9960 | 0.9996x within | -0.000% (0.00) | clear |
| 6610 | 0.9960 | 1.062x within | +0.010% (0.10) | clear |
| 106474 | 0.9960 | 0.9996x within | -0.000% (0.00) | clear |
| 4765 | 0.9960 | 1.020x within | +0.003% (0.03) | clear |
| 106700 | 0.9960 | 1.0006x within | +0.000% (0.00) | clear |
| 4346 | 0.9968 | 2.241x BEYOND | +0.178% (1.78) | HOT SET |
| 5245 | 0.9970 | 1.857x BEYOND | +0.129% (1.29) | HOT SET |
| 101905 | 0.9973 | 1.336x BEYOND | +0.050% (0.50) | clear |
| 1605 | 0.9976 | 1.367x BEYOND | +0.054% (0.54) | clear |
| 1738 | 0.9977 | 1.678x BEYOND | +0.102% (1.02) | HOT SET |
| 105371 | 0.9977 | 1.369x BEYOND | +0.070% (0.70) | clear |
| 6842 | 0.9979 | 1.205x BEYOND | +0.036% (0.36) | clear |
| 838 | 0.9979 | 1.331x BEYOND | +0.054% (0.54) | clear |
| 327 (random) | 0.9999 | 1.0000x within | +0.000% | clear |
| 1180 (random) | 0.9999 | 1.0008x within | +0.000% | clear |
| 101805 (random) | 0.9999 | 1.046x within | +0.009% | clear |
Tally at 21:17 BST, 20 random rows complete and 20 of the lowest 25 measured, all at 2^24 nonces:
| Set | n | beyond the f8 1.2x gate | hot set (X_f >= f) |
|---|---|---|---|
| lowest stand-in-ratio seeds (the selector) | 20 | 13 (65%) | 4 (100767, 4346, 5245, 1738) |
| random accepted seeds (the control) | 20 | 1 (5%) | 0 |
Selector enrichment 13x on the gate (65 against 5 percent, binomial error about 11 points at n = 20) and
4 of 20 against 0 of 20 on the hot-set test. The false-positive rate of the 256-unit selector against the
gate is 7 of 20.
The chain's last six (21:27 BST), completing the lowest 25:
| Seed | stand-in ratio (256 u) | live top 0.1% over window model | X_0.1% (X/f) | hot set |
|---|---|---|---|---|
| 3387 | 0.9979 | 1.670x BEYOND | +0.092% (0.92) | clear |
| 103265 | 0.9980 | 1.2000x at the gate (within) | +0.035% (0.35) | clear |
| 170 | 0.9980 | 2.016x BEYOND | +0.143% (1.43) | HOT SET |
| 106924 | 0.9980 | 2.208x BEYOND | +0.221% (2.21) | HOT SET |
| 107022 | 0.9980 | 1.816x BEYOND | +0.138% (1.38) | HOT SET |
| 100629 (re-read at 2^24) | 0.9987 | 1.119x within | +0.018% (0.18) | clear |
Final tally at 2^24 nonces (21:30 BST):
| Set | n | beyond the f8 1.2x gate | hot set (X_f >= f) | largest X_0.1% |
|---|---|---|---|---|
| lowest 25 stand-in-ratio seeds of 29,032 (the selector) | 25 | 17 (68%) | 7 (100767, 4346, 5245, 1738, 170, 106924, 107022) | +0.221% (106924) |
| random accepted seeds (the control) | 20 | 1 (5%) | 0 | +0.065% (105915) |
So the stand-in tail is where the live hot sets live: 7 of 25 against 0 of 20 (the binomial error at n = 20
puts the control's rate under 15 percent). Every hot set is of the same size class: the top 0.1 percent of
items (about 1 MB) holding 0.28 to 0.37 percent of reads against 0.15 expected. Gain to a chip holding that
1 MB on die: 1.002x at the largest. The selector's false-positive rate against the gate: 8 of 25.
Reading at 21:1x BST (the re-submitted chain's first four, build-1, 2^24 nonces, --diag 1): two more hot sets.
The lowest-16 live set now reads 9 beyond the f8 gate of 16 (56 percent) and 3 hot sets by X_f >= f (100767,
4346, 5245) against 1 beyond of 17 random and 0 hot sets; the hot-set rate among the stand-in tail is 3 of 16
against 0 of 17. Seed 4346's excess (+0.178 percent at f = 0.1 percent) is the largest seen: still a 1 MB
item set holding about 0.33 percent of reads, gain about 1.002x. The distinguisher is real and repeatable;
its price does not move.
Attribution of the two new hot sets (log live-low14-16m.log, copied to logs/adv-accept/ at the chain's end):
| Seed, id, attempt | hot items (top 0.1%) and their reads | hottest item and traced source | sites carrying it |
|---|---|---|---|
| 4346, bbb38e847011c354, attempt 2 | 17,103 items, 0.326% of reads | 0x000000 with 97,943 reads (0.0046% of all); site instr 4 reads r4 = zero, last writer mad@1 | site 2 (instr 19, src r1, full window) puts 2.17% of its reads into the hot set; sites 8 and 9 (instrs 44 and 49) 0.67% each; largest saturated-source share 0.044% at site 2 |
| 5245, beaad44840bb9e4e, attempt 5 | 16,899 items, 0.281% of reads | 0x000000 with 47,936 reads (0.0022% of all); site instr 7 reads r2 = zero, last writer load@6 | site 8 (instr 37, src r2, quarter window) puts 3.36% of its reads into the hot set; the top 8 items are again multiples of 2^19 |
The same mechanism each time: one load site whose source register reaches zero (or a value near zero or
all-ones) in a few hundredths of a percent of evaluations, under the (c') 1 percent limit, with the era
stride mapping those values to a fixed item set; item 0x000000 is the hottest in all three programs.
The four hot sets of the chain's second half (same log), two of each shape:
| Seed, id, attempt | hot items (top 0.1%) and their reads | hottest item and traced source | the site | shape |
|---|---|---|---|---|
| 1738, 33ece54e2df5ea44, attempt 4 | 17,107 items, 0.256% of reads | 0xc00000, 38,597 reads; site instr 7 reads r3 one bit set, last writer load@6 | site 13 (instr 54, src r6, quarter window) 2.34% of its reads; saturated source 0.012% | near-saturated source |
| 170, 53a02a7c9c9b86f3, attempt 4 | 16,792 items, 0.285% | 0x000000, 37,780 reads; site instr 8 reads r2 = zero, last writer sub@6 | site 2 (instr 11, src r1, half window) 3.04%; saturated 0.016% | near-saturated source |
| 106924, 8aa3c604dba9d11b, attempt 1 | 16,951 items, 0.407% of reads (the largest) | 0x6e9c4c, 19,020 reads; NO saturated or one-bit source maps to it | site 10 (instr 45, src r4, full window) 4.70% of its reads; saturated source 0.000% | a second shape: a low-entropy source band that is not saturation |
| 107022, 0fd1d15a8bd627d4, attempt 1 | 16,782 items, 0.307% | 0xbd2a43, 24,317 reads; no saturated source maps to it | site 10 (instr 44, src r3, half window) 2.84%; saturated 0.000% | the second shape |
The second shape matters for the rule's design: in 106924 and 107022 the hot items are not the images of
zero or all-ones, so the (c') saturated-source count reads 0.000 percent at the site and only the per-site
distinct-index ratio (c'') sees them; a floor set on that ratio is the one instrument that catches both
shapes. Their 2^20 ratios are in the gap reads below when they land.
| 1352 (random) | 0.9999 | 1.057x within | +0.009% | clear |
| 100521 (random) | 0.9999 | 1.153x within | +0.025% (0.25) | clear |
| 106359 (random) | 0.9999 | 1.0001x within | +0.000% | clear |
| 4905 (random) | 0.9999 | 1.012x within | +0.002% | clear |
| 102519 (random) | 0.9999 | 0.9999x within | -0.000% | clear |
| 4107 (random) | 0.9999 | 1.0004x within | +0.000% | clear |
| 101710 (random) | 0.9998 | 1.0034x within | +0.001% | clear |
| 101886 (random) | 0.9998 | 1.0000x within | +0.000% | clear |
| 6132 (random) | 0.9999 | 0.9996x within | -0.000% | clear |
| 105915 (random, the lowest ratio of the random 20) | 0.9994 | 1.399x BEYOND | +0.065% (0.65) | clear |
| 5133 (random) | 0.9999 | 1.0215x within | +0.004% | clear |
| 1932 (random) | 0.9999 | 1.0024x within | +0.000% | clear |
| 2328 (random) | 0.9999 | 1.0025x within | +0.000% | clear |
| 3665 (random) | 0.9998 | 1.0002x within | +0.000% | clear |
| 101643 (random) | 0.9999 | 1.0017x within | +0.000% | clear |
| (17 lowest and 10 random rows land as the runs end, 20:2x BST) | | | | |
Base rate, corrected at 20:20 BST: at 2^24 nonces the f8 gate fires on random accepted programs too. Of the
first 10 random seeds, 1 (105915) is beyond 1.2x at 1.40x, and it is the one with the lowest stand-in ratio
of the random set (0.9994 against 0.9998 to 0.9999 for the other nine). So "beyond 1.2x at 2^24" has a base
rate near 1 in 10 among accepted programs (the 10^6-nonce census read 0 of 47 beyond because the gate is
sharper at 2^24), and the selector's 6 of 8 is an enrichment of about 6x over that base rate, not a clean
separation. The hot-set test proper (X_f >= f) has fired on 1 of 18 programs measured at 2^24 (100767).
Reading at 20:25 BST (final for tonight's rows; corrected: 100629 was within at 10^6, 1.011x), honestly:
the 256-unit selector is weak. Of the 12 lowest-ratio seeds measured live (100211, 100064, 100767, 100159,
100629, then 3664, 103378, 105756, 6610, 106474, 4765, 106700), 5 are beyond the f8 1.2x gate and 7 are not;
the random control is 1 of 11 beyond (105915 at 1.40x). The five that are beyond are four of the first
five (256-unit ratios 0.9986 to 0.9988, 2^20 ratios 0.9832 to 0.9919) and 3664 (0.9945); the seven that are
not include five that sit LOWER on the 256-unit read (0.9960), which says the 256-unit read is noise-dominated
at that level (one standard deviation of a 65,536-evaluation distinct count is about 0.001 in the ratio) and
the real selector is the 2^20 ratio the rule itself computes (2.8 s per candidate: 100064's 0.9832,
100211's 0.9907 and 100767's 0.9919 are genuinely low; 3664's 2^20 ratio is in the re-queued gap read). So:
selector enrichment about 4.6x over the base rate (42 percent beyond against 9 percent), false-positive rate
7 of 12 on the 256-unit read; the error on both is binomial at n = 12 and n = 11, about plus or minus 14
points. The hot-set test proper (X_f >= f) fired on 1 of 22 programs measured at 2^24 (100767), and on none
of the 11 random.
### Confirming row for the class v5 acceptance floor (c'''): pre-floor draw against post-floor refusal (box 2, 20:36 BST)
Not a class v5 finding. Does seed 100767 (id 9d68e6286fc817d4 under class v4) still read hot when the
dataset is class v5's state-derived one? Tool: tools/attack/adv-accept-v5 (the same f8 harness over the
vendored igneum-pow of branch class-v5 at 25c8063f, read-only input, which is the class v5 crate BEFORE
commit ab6f980b: it has no per-site floor (c''') yet). Under that pre-floor crate the class v5 draw of the
seed lands on attempt 2, id 2fd83dbae09c366d, the same base program and era as the v4 id. Under the frozen
class v5 rule (ab6f980b and later) the defender reports the same seed is REFUSED at attempt 2 by the new
per-site floor (c'''), which names site 6 at 0.991, and the v5 draw lands on attempt 4, id 734fbb8e3e4cd20f
(stated by the class v5 lane; not derived here). So this row measures the pre-floor program on the v5
dataset and shows what the floor was built to refuse: generator 5; the dataset XORs the window's state leaf
into every item before the first mixer. State stream: the Devnet 3 v5 pack's state.igsd1 (inputs/v5-dn3-epoch0-state.igsd1, 11
records, root 7e37a9fb...a311, leaves fnv f141bfee2a8b11b0), the only public state stream. Commands, through
the lease pool (lease 32, 16 cores taken), log logs/adv-accept/v5-exemplar.log:
adv-live-v5 warps --program 100767 --nonces 1000000 --plant const-item --state <stream> (known-failed shape)
adv-live-v5 warps --program 100767 --nonces 16777216 --diag 1 --validate sample --state <stream>
| Measure | class v4 (live-confirm-16m.log) | class v5 with the state leaves | plant (const-item, 10^6) |
|---|---|---|---|
| Hash agreement with the library's Epoch::hash_warp | 0 mismatches | 589 warps, 0 mismatches | skipped under the plant |
| Hot-set test f = 0.1% | X_f +0.15503%, X/f 1.55, HOT SET | X_f +0.15514%, X/f 1.55, HOT SET | X_f +6.32%, X/f 63 |
| Top 0.1% share over the window model | 2.0455x | 2.0462x | 25.7x |
| Windowed 6-sigma, largest 64-item bucket | +294.8 | +298.3 | +332,226 |
| Hot items (top 0.1%) and their reads | 17,034 items, 0.3064% of reads | 17,086 items, 0.3071% of reads | |
| Top 8 items | 0x000000 (29,355), 0x200000, 0x300000, 0x180000, 0x100000, 0x080000, 0x380000, 0x0c0000 | the same eight: 0x000000 (29,722), 0x200000, 0x300000, 0x180000, 0x100000, 0x0c0000, 0x080000, 0x380000 | 0x001234 (the plant) |
| Site attribution | site 6 3.350%, site 7 0.414% | site 6 3.358%, site 7 0.415% | |
| Hottest item's traced source | site instr 6, r6 = zero, writer mad@4 | the same | |
Reading. The state leaf changes every dataset WORD, and the hot set does not move by a part in a thousand:
the concentration is a property of the program's register dataflow at site 6 (r6 reaching zero through the
mad at instruction 4 in about 0.013 percent of evaluations, then the era stride mapping small values to
items at multiples of 2^19), not of the dataset's values. Any dataset keyed the same way through the same
load address function inherits it. So the class v5 change does not touch this finding; what would is a rule
on the program (the (c') saturation limit at 1 percent sits 80x above this program's 0.013 percent, and the
0.98 per-site floor sits 0.012 below its 0.9919) or a load address that does not map small sources to a
fixed item set. Price unchanged: 1 MB of on-die items serves 0.31 percent of loads, gain 1.002x, no row of
chip-model-v3.md moves under either class.
### Rule change 19:55 BST (box-hours honesty)
The bounded class became 88 cores per box in total across all lanes: no new sweep starts except under the
per-box lock `flock /srv/builds/_adv/locks/sweep.lock`, one sweep per box at a time; the running shards 00
and 01 finish as they are; my adv-live confirmations and the row-90 census count against the ceiling, so
nothing new starts until they end. Shards 02 to 09, the class-v5 check and any re-run go through the lock.
### Live hot-set census (RUNNING)
- box 2, 19:5x BST: `adv-live census --programs 2..201 --nonces 1000000 --threads 32` (200 consecutive accepted
programs of shard 00's range: the random sample), log adv/live-census-s00-2-201.log.
- box 1, 19:5x BST: `adv-live warps --program k --nonces 1000000` for the five lowest-ratio shard-01 seeds, log
adv/live-lowratio-s01.log.
## Ledger: the kill of 20:21 BST and the re-queue through the lease
Main's rule (relayed 20:2x BST): no sweep, census or verdict run on a box except through the build-server
lane's `lease pool <threads> -- cmd` (landing within the quarter hour); hand-started binaries killed by their
pid files now, not left to finish; release builds and the class v5 suites outrank every sweep tonight.
| Run | Box | Killed at (UK) | Reached | Lost | Re-queue |
|---|---|---|---|---|---|
| sweep shard 00 (seeds 3847..) | build-2 | 20:21:20 | 7,944 rows (plus 3,812 of part 0) | the rest of the shard | lease pool, from the frontier seed |
| sweep shard 01 (seeds 104649..) | build-1 | 20:21:13 | 6,943 rows (plus 4,622 of part 0) | the rest of the shard | lease pool, from the frontier seed |
| live census, 10^6 nonces, programs 2..201 | build-2 | 20:21:18 | 51 programs (32 in the mirror copy, 19 after) | programs 53..201 | lease pool |
| 20 lowest at 2^24 | build-1 | 20:21:12 | 6 of 20 | 14 rows | lease pool |
| 20 random at 2^24 | build-2 | 20:21:19 | 11 of 20 | 9 rows | lease pool |
| row 90 attempts census, 20k seeds | build-2 | 20:21:17 | no summary (prints at the end) | the whole run | lease pool, with progress lines added first |
| class v5 exemplar (queue 10), repeated-index read (queue 11) | build-2 | 20:21:52 | never ran (waiting on the sweep lock) | nothing | lease pool |
Accepted programs in hand after the kill: 23,319 distinct seeds (11,755 of shard 00 up to seed 11829;
11,564 of shard 01 up to 111630; 138 seeds in flight at the kills are gaps below the frontiers). Every
partial row above stays in this report as partial. Box-hours running before the kill: about 2.9.
Re-queue through `lease pool` (live on both boxes from 20:22 BST; every lease at most 48 cores, --min 16;
the pool rule: release builds and the class v5 suites outrank every sweep, and a waiter labelled "v5 gate"
or "v5 kit" means finish the shard in hand and release):
| Order | Run | Box | Queued (UK) | Lease |
|---|---|---|---|---|
| 1 | 14 remaining lowest-ratio seeds plus 100629, 2^24, --diag 1 | build-1 | 20:25:04 | 48 / min 16 |
| 1 | 9 remaining random seeds, 2^24 | build-2 | 20:25:11 | 32 / 16 |
| 2 | class v5 exemplar: const-item plant at 10^6, then 100767 at 2^24 with --diag 1, state = the Devnet 3 v5 pack's stream | build-2 | 20:25:11 | 32 / 16 |
| 3 | repeated-index gap read (seeds 100767, 100211, 100064, 100159, 100629, 2, 3664) | build-2 | 20:25:11 | 32 / 16 |
| 4 | row 90 attempts census, 20k seeds (after the rebuild with progress lines) | build-1 | 20:27:12 | 48 / 16 |
| 5 | shard 00 from seed 11830 (88,172 seeds); shards 02, 04, 06, 08 | build-2 | 20:2x | 32 / 16 each |
| 5 | shard 01 from seed 111631 (88,371 seeds); shards 03, 05, 07, 09 | build-1 | 20:2x | 32 / 16 each |
At 20:25 BST the pool on build-2 had 0 free cores (adv-accept-3 and another lane ahead in the queue); my
leases wait their turn. At 20:28 BST: all 15 of my leases wait with 0 free cores on both boxes (build-1: 12
leases of other lanes holding, 10 waiting; build-2: 3 holding, 11 waiting; load 100 and 89). Nothing of
mine runs; the lease waits up to 2 h and then gives up, so a lease that never gets cores by 22:25 BST is
re-queued again and says so here. The 00:00 BST reading carries the partial rows above if no cores free.
Yield rule widened at 20:3x BST: whenever `lease status` shows a waiter whose owner is class-v5 or whose
label contains "v5" (the v5 census is queued as "class v5 c3 census"), any run of mine HOLDING pool cores is
ended by its pgid file and re-queued at the back of the pool (a sweep from its frontier seed, its rows kept;
a live chain minus the programs already done). I do this by hand from the status polls; nothing changes
while my leases are waiters. Refined at 20:3x BST: the test is by OWNER: yield to a waiter whose owner is
class-v5, or whose owner is attack-pass with "v5" in its label; never to a waiter whose owner starts with
adv- (so my own "v5-exemplar" label and the sibling lanes' leases are not yield triggers).
Yield executed 20:41 BST on box 2 (the class v5 (c''') census, owner class-v5, 88 cores, waiting since
20:39 behind my leases): ended by pgid file live-random9-16m (6 of 9 done), gap-rep8 (7 of 7 done, nothing
lost) and sweep-s02 (2,474 rows kept, frontier 202482); withdrawn by pid the four waiting shards and the
re-queues made a moment earlier; box 2 then showed 0 holders and 0 waiters of mine at 20:41:38. By main's
order I take no lease on box 2 until the census is confirmed running; the box-2 order then resumes (3 random
seeds, shard 02 from 202482, shard 00 from 11830, shards 04/06/08). Build-1 unchanged.
Ranked lease (build-server lane, 20:40 BST, lease sha 5d84d644): classes release > v5 > measure > adv; an
adv holder above 32 threads is pre-empted after a higher class has waited 120 s; holders at 32 or fewer
never are; waiters started under the old tool are unranked. So at 20:42:52 BST on build-1 I killed my six
old waiters by pgid file and re-submitted each once at 32 threads with --min 16 (the 14-seed live chain,
row 90, shards 03/05/07/09); the holder sweep-s01b (32 cores, 2,134 rows at that moment) stays. No label
of mine contains a promoted word; the "v5-exemplar" tag is retired (its run is complete) and any re-run
will be tagged class5-exemplar.
20:44 BST: box 2 shows the class v5 census holding 48 of 88 pool cores since 20:41:55 (10 s after my
release). My box-2 queue stayed withdrawn until the coordinator's word.
21:13 BST: box 2 opened to adv-* (the census ended, no pool lease there, load 11); the box-2 queue
re-submitted through the ranked lease at 32/16 in order: the 3 remaining random seeds, shard 02 from
202482, shard 00 from 11830, shards 04/06/08. The yield stays mechanical: a class-v5 or attack-pass
v5-labelled waiter means release at shard end unasked.
21:26 to 21:36 BST, clearances for the decisive 2^20 reads (main's five-program job and my 1738 read were
starved behind my own shard holders): box 2, ended sweep-s00b (4,482 rows kept as part 1, frontier 16319)
and withdrew the waiting shards, then ended sweep-s02 (9,642 rows kept, frontier 212128) and withdrew again,
so gap-hot2 took 8 cores at 21:31 and the two five-program leases ran at 21:32 to 21:35; re-queued at 21:36:
s02c from 212128, s00c from 16319, s04/06/08. Box 1, ended sweep-s05 (2,124 rows kept, frontier 502127) and
withdrew attempts-20k and the shards, then ended sweep-s01b (27,131 rows kept as part 1, frontier 138766),
re-queued s01c from 138766 plus attempts-20k, s05 from 502127, s03/07/09; gap-hot3 still waited at 21:36
(other lanes' adv waiters ahead by arrival). Every end was by pgid file; no rows were lost (every sweep
writes its rows as they land); the inline-deletion rule of 21:33 BST touches nothing here (run-box.sh has no
rm and no truncation inside a bash -c string; the clearances renamed logs with mv).
## Where the pass stands (for the 00:00 BST reading; numbers refreshed as rows land)
| Item | Reading (20:50 BST; rows that land later are added above this table) |
|---|---|
| Box-hours spent (running time, both boxes, nice 10) | about 3.3: the two shards at 88 threads for 1.9 h of wall under contention (20:27 to 21:21 BST and the re-launch), two adv-live confirmation chains, the 10^6-nonce census (51 programs), the gap tool (61 programs), the row-90 plant, the class v5 check, and shard 01b at 32 cores since 20:40; pod-hours 0 (no GPU, no pod). Runs killed at 20:21 BST by main's order and re-queued through the lease are counted to their kill |
| Q1 bound reached | 29,032 accepted programs drawn through the chain path, of the 10^6 planned (shards 00b, 02 to 09 queued in the lease pool, 0 free cores at 20:48 BST). Live at 2^24 nonces: 12 lowest stand-in-ratio seeds, 5 beyond the f8 1.2x gate and 7 within; 17 random, 1 beyond; the hot-set test X_f >= f fired on 1 of 29 (seed 100767, X_0.1% +0.155%, 2.05x), and that hot set is 1 MB of items holding 0.31 percent of reads: gain 1.002x, no row of chip-model-v3.md moves. It survives the class v5 dataset unchanged (pre-floor draw; the frozen v5 floor (c''') refuses it at attempt 2) |
| Q2 bound reached | 54 programs: no stand-in gap above the 2^20 sampling noise (max 0.0004 per site), 0 verdict disagreements; the zero-dataset plant fires |
| Q5 | lossy last write in 83.6 percent of 29,032 accepted programs with no live effect found beyond Q1's; register-set collapse 0; the 0.98 floor is live in the tail (0.9832 at 2^20 seen); the 256-unit proxy is a weak selector (7 of 12 false positives against the f8 gate), the 2^20 ratio the real one |
| Row 90 (owner adv-accept-3, unspawned; claimed) | plant fired (a rule that rejects everything reaches the cap and hands the last resort, printed and re-checked: accepted as drawn, no lossy op, distinct mean 127.9 to 128.0); the 20k-seed census of real attempts is queued on build-1 (killed at 20:21 before any summary, re-submitted 20:42) |
| BLOCKED | per-card hash-rate confirmation of any gain (no GPU tonight); priced analytically against chip-model-v3.md instead |
| Partial, named as partial | 29,032 of 10^6 seeds; 12 of 25 lowest-ratio live rows; 17 of 20 random live rows; row 90 census not run; shards 02 to 09 not run beyond 2,474 rows of 02 |
| What a longer pass adds | the other 97 percent of the 10^6 seeds (the tail by the 2^20 ratio the rule computes, not the 256-unit proxy), the live row for every seed under 0.985 at 2^20, and the 20k-seed attempts census: more rows of the same shape, not a different answer unless a seed reads a hot set over 1 percent of reads, which 29,032 draws and 29 live rows did not produce |
## Running notes
- Box-hours and commands are logged in each section with the seed, so every claim is reproducible by
re-running the exact command on box 2.
- No cargo on the Mac. Pushes to the build mirror only. Commits as igneum-labs.

View file

@ -0,0 +1,313 @@
# Attack plan: the program acceptance rule and its generator (class v4 sub-version 3)
internal adversarial pass, not an independent review
Author lane: adv-accept. Date: 7 October 2026, 19:xx BST. Branch: adv-accept off build/master.
Target commit: 017e70376489251e18564c0abce7e466e606c8b3 (class v4 sub-version 3, object byte 7).
Box: igneum-build-2, core band 0-31, nice 10, one slot at a time.
I am an outside attacker with the public kit. I have never worked on the hash code. Everything
below is priced against the chip model of docs/analysis/chip-model-v3.md.
## 0. Frozen-crate check (the outsider rule)
The brief said build/master's igneum-pow/ is byte-identical to the frozen commit and that
`git diff --stat 017e7037 HEAD -- igneum-pow` must print nothing. It does NOT print nothing.
git diff --stat 017e70376489251e18564c0abce7e466e606c8b3 3f0afcd5 -- igneum-pow
6 files changed, 30 insertions(+), 635 deletions(-)
(accept.rs 292 lines changed, generator.rs 320, emit.rs, packcheck.rs, tests/mixer.rs, tests/recheck.rs)
So build/master (HEAD 3f0afcd5) has moved past the frozen commit and has stripped most of the
class v4 sub-version-3 acceptance and generator code. To obey the outsider rule I pinned my
worktree to the frozen crate and packs:
git checkout 017e70376489251e18564c0abce7e466e606c8b3 -- igneum-pow proto-cuda/packs-ca3-v4
git diff --stat 017e7037 -- igneum-pow proto-cuda/packs-ca3-v4 # prints nothing: my tree == frozen
Every build and run in this pass is against the frozen crate. My harness crate depends on it by
path (../../../igneum-pow), as f8-uniform does.
Re-base (coordinator's order, 19:3x BST): build/master moved to 7a7caa34, whose igneum-pow/ IS the
frozen object. Merged into this branch at 8748e955ceb48be5a6cbf7f8718a4884d3de9828;
`git diff --quiet 017e7037 HEAD -- igneum-pow` prints IDENTICAL, and the same check against
build/master 7a7caa34 prints IDENTICAL. Nothing I built or measured was on the stale tree: this
worktree's igneum-pow/ had already been reset to the frozen object (byte-identical) before the first
build, so the harness binaries are of the frozen crate; they are rebuilt at the merged HEAD anyway.
## 1. Files I opened
Only the public kit, read at the frozen commit unless marked HEAD:
- igneum-pow/src/accept.rs, generator.rs, verify.rs, seed.rs, memhard.rs, bind.rs, main.rs, lib.rs
- igneum-pow/Cargo.toml, Cargo.lock
- docs/spec/01-lottery-hash.md (sections 1.3, 1.4, 1.4.6, 1.5, 1.6, 1.7, 1.8.5, 1.11, 1.12, 1.13.1, 1.13.3, 1.14-1.17)
- docs/analysis/chip-model-v3.md (HEAD; sections 1, 2, 5, 6)
- proto-cuda/packs-ca3-v4/ program.json of all eight packs; v4-devnet-epoch0 and v4-era-0 headers and seeds.txt
- tools/attack/f8-uniform/src/main.rs, Cargo.toml (copied from the Mac worktree, originals untouched)
- tools/attack/f4-weakday/src/main.rs, Cargo.toml (from build/attack-pass)
- tools/build-remote.sh, infra/build-server/lib.sh, infra/build-server/remote-run.sh
I did not open anything else under docs/, no site/, no proto-metal/, no other branch's source, no
git log. I extracted emit.rs to scratch but did not need to read it.
Kit zip check owed: the brief gives sha256 4f2445c5...f829154 for packs-ca3-v4-sub3; I verify the
on-disk packs match the frozen tree by git, not the zip (I was not handed the zip). Devnet class v4
epoch-0 program id in the pack is a785001687d8688a, which matches the brief. Devnet 3's epoch-0 id
fce15bf61030be57 is my derive check in Q3.
Second public-kit input (relayed by the adv-cache lane, 7 October 2026, public-kit class): the
Devnet 3 epoch-0 pack, v4-devnet3-epoch0.zip sha256
e025750f71175ed14d6e2a24e387ebbf1979b1cd0faee9139c41a7671165b334, program_id 0xfce15bf61030be57 at
attempt 0 (sub-version 3), day bytes le64(20733), 2^24 fingerprint from base 0 e510ad92b4d24846. A
second REAL program accepted at attempt 0 under the frozen rule, beside the shared devnet's (which is
attempt 1). I treat it as data, verify the sha before any use, and use it only as a known-passing
program for Q1 (hot set) and Q3 (derive check: my draw of Devnet 3 epoch 0 must give id
fce15bf61030be57 and fingerprint e510ad92b4d24846, else my draw path is wrong). It lives on build-1;
I copy the file read-only, I do not build or run on box 1.
## 2. The target, in my own words
### 2.1 The generator (spec 1.4, generator.rs candidate_from_words_class with V4_CLASS)
An epoch seed (32 bytes) gives seed words S[0..7] = seed_words_from_bytes(seed) for attempt 0, or
seed_words_from_bytes(seed || k_le32) for attempt k. The program stream is SplitMix64 seeded with
(S0 | S1<<32) XOR ((S2 | S3<<32) * 0x9E3779B97F4A7C15).
Class v4 = class v3 (mx8, era draw) plus a 256-instruction shadow block run 27 times per iteration.
Draw order:
1. 16 load slots: partial Fisher-Yates over instruction indices 1..63 (slot 0 is never a load).
2. 64 instructions, 9 draws each (op by weight, dst, src, src2, imm, imm2, rot, bit, mask), plus the
class v3/v4 width roll (consumed, width pinned to 4 bytes) and two era window draws (win=below(3),
off). A load's src is drawn only from registers that are FRESH by dataflow: written by an earlier
instruction, no load has read since, and (v4) the last writer kept entropy. Freshness value rule:
load/scratch/hot keep fresh iff source fresh; add/sub/xor/mad/shfl fresh iff dst or src fresh;
rotl/rotr fresh iff dst fresh; or/mul/mulhi never fresh. A shared-operand idiom (or-then-xor,
or-then-sub, xor-then-or on one operand) marks the result not fresh.
3. 256 shadow instructions, all ALU, drawn from the same stream after the base program.
### 2.2 The acceptance rule (spec 1.4.6, accept.rs check)
A candidate passes iff:
- (a) check_stale_loads: no load reads a register unwritten since the previous load from it, cyclic
over the 64 base instructions (two passes to close the wrap).
- (b) check_injecting_writes: every r0..r7 is the dst of an injecting op (add, sub, xor, mad, shfl,
load/variants).
- (a') check_fresh_sources_v4 (v4 shape only): run the freshness fixpoint over base||shadow to its
fixpoint (<=9 passes), then one checking pass; every load's source must be fresh.
- (c) check_dynamic: interpret 64 units x 32 lanes = 2,048 evaluations on the closed-form dataset
dataset_elem(idx, S0, S1) at 2^28 words, init words = S, base nonces low32(next()) & ~31 from
SplitMix64(FNV-1a("igneum-accept/" || S as LE bytes)). The shadow block IS executed (sub-version 3
fix). Tests: no register bit constant across all 2,048 finals; no load site reads one address in
all 32 lanes of any unit; <164 of 16,384 final regs saturated (0 or 2^32-1); every output bit ones
within 136 of 1,024; distinct masked addresses per lane per eval, summed, > 245,760 (mean >120/128).
- (c') SaturatedSource (v4): per load site, count of evaluations whose source value was 0/all-ones
< 164 over 16,384.
- (c'') (v4): LowEntropySite = per-site distinct dataset word indices over 2^20 evaluations
(ACCEPT_UNITS_DISTINCT_V4=4096 units) against uniform expectation N - N^2/2W on the site window,
ratio must reach MIN_DISTINCT_RATIO_V4 = 0.98. The RepeatedSource / most_repeated path (limit 8)
is present but NOT wired into check() (the finding is caught by the ratio instead).
Redraw: attempt 0,1,2,... up to MAX_ATTEMPTS_V4 = 256 for the v4 shape (32 otherwise). If all 256
fail, last_resort_v4 rewrites every or/mul/mulhi in base and shadow to xor and returns it, accepted
as drawn (no further check). Reached with probability about (2/3)^256.
### 2.3 What the rule is defending (chip model)
The live dataset is memory-hard (256 MiB cache, 8 dependent reads per item, mixer x8). The stand-in
is a pure closed form. The lottery is fair only if an accepted program reads a near-uniform, wide set
of dataset items on the LIVE dataset, so no on-die SRAM copy of a hot subset lets a chip skip the
memory. chip-model-v3.md section 5 prices the on-die-cache recompute chip at 0.92x and the stored
(f=1) chip over 2x per joule; a hot-set that concentrates reads would hand a chip exactly what
section 5.7's "hot set" lever asks about. Items per hash target: 128 distinct of 128 loads.
## 2.4 Re-scope (main, 7 October 2026, 19:2x BST) and the operating changes
The acceptance rule now has three lanes. This lane (adv-accept) is THE BYPASS: a program that passes
(a) to (c'') on the closed-form stand-in and has exploitable locality on the LIVE dataset. That is Q1
(the 10^6-seed passing-program search with the hot-set measure), Q2 (the stand-in gap reproduced and
bounded) and Q5 (the generator distinguishers that pass the rule). Q4 (header grinding) is lane
adv-accept-2's and Q3 (exhaustion and steering of the draw, the 256 cap, the last resort, the program
id) is lane adv-accept-3's; their methods below stay as written for the record and are handed over,
not run here. Shared queue for spill-over: /srv/builds/_adv/accept/queue/ on build-2, claimed by
mkdir under claims/. Operating changes from the coordinator: both boxes, nice 10 on every idle core
(no core band), the capacity layer's yield (SIGSTOP the run's process group while any build slot or
hold is taken, SIGCONT when clear; copied into run-box.sh), sweeps queued back to back, 8 box-hours
is a reading not a stop (ask line 16), first results by 00:00 BST tonight.
The seed space of the sweep is the attack-pass F8 harness's own label space
("igneum-attack-f8/program/k", ".../era/k"), so the unmodified f8 harness (built here as adv-live)
measures the live hot set of exactly the program my sweep reports for seed k.
## 3. The questions, in my order
Q1 (rank 1). Steering: a program that passes every part of the rule but concentrates its 128 live
loads on a small hot set of items/lines. The rule checks the CLOSED-FORM stand-in; the live set can
differ. This is the break that matters most, because it is the one the chip model prices.
Q2. The stand-in gap: closed-form verdict vs live-dataset verdict disagree. Bound the count and
whether any disagreement is exploitable (an accept that should be a reject on the live set).
Q3. Attempt grinding: whoever influences or predicts the epoch seed grinds attempt k from seed||k
for a favourable program. What the 256 cap and last_resort_v4 hand an attacker.
Q4. Header grinding for locality: the miner picks header bytes behind the pre-PoW hash, which only
enter the init words I (bind.rs), not the program. Can a cheap header search cluster a 32-lane
group's loads into fewer DRAM rows/lines.
Q5. Generator distinguishers: structural weaknesses of drawn programs that pass the rule (a lossy
last write, a contraction, register-set collapse, low-entropy sites the 0.98 floor still admits).
Q6. Anything else.
## 4. Method per question, with the known-failed shape each tool must fire on
All harness code: tools/attack/adv-accept/ (own crate, depends on igneum-pow by path). I reuse the
real draw and the real accept::check through the library; I never re-implement the rule. Where I need
the live dataset I build it through Epoch::chain_dataset_day(ProgramClass::V4), as f8-uniform does.
### Q1. Steering / hot set on the live dataset
Method. Over >= 10^6 epoch seeds, draw the chain's class v4 program (generate_era over V4_CLASS with
V3_ALLOWED, the era seed = a second label-derived seed, as f8 does), keep only accepted programs
(accept::check Ok). For each accepted program, run its 128 loads per hash over many nonces on the
LIVE memory-hard dataset (one day's cache, items derived into a table as a GPU holds them, the
f8-uniform warps census path), build the cross-hash item histogram and the per-site histogram, and
measure the hot set: the share S_f of reads taken by the top f of items for f in {0.1%, 1%} against a
uniform (and window-model) control, excess X_f = S_f - E_f, flag when X_f >= f. Also the per-site
distinct-index entropy and the distinct items/lines per hash and per warp. Rank seeds by X_0.1% and
by hottest-item share. f8-uniform already does most of this for its 64 labelled seeds; I extend the
seed sweep to >= 10^6 and keep the accept filter and the hot-set metric.
Known-failed shape. f8-uniform's --plant const-item feeds one constant item at the first load site;
--plant quarter-lines / half-lines mask the line index to a quarter/half. My sweep must FLAG the
planted program (X_f large, hot-set FLAGGED) and must leave the clean control within noise. If the
plant does not fire, the metric is wrong and nothing else counts.
Gain. The hot set measured as the fraction of items taking 0.1% and 1% of reads vs uniform, turned
into the chip's on-die copy size (section 5.7): a hot set holding share p of reads in q of the items
lets a chip store q items in SRAM and serve p of loads on die. I report p and q and the implied
SRAM MB and the gain row it lands on.
Box-hours. Seed sweep at 10^6 seeds, accept-filtered, ratio pass is the dear part: accept::check on a
v4 program is about 2.8 s per chosen candidate (the 2^20 ratio pass dominates) per the code comment,
but the cheap filter is (a)(b)(a')(c)(c') first; most seeds die before the ratio. I run the draw+
static+cheap-dynamic filter at ~10^6 seeds (a few core-hours on 32 cores) and the full live-dataset
histogram only on the top few hundred by a cheap proxy (per-site closed-form distinct count). Budget:
3 box-hours for Q1 (one build, one long nohup run, poll the log).
### Q2. The stand-in gap (closed form vs live)
Method. For accepted programs, compare the (c) verdict metrics computed on the closed form against
the same metrics computed on the live memory-hard dataset at 2^28: the distinct-address sum, the
saturation counts, the output bias, and the per-site distinct-index ratio. Count programs where the
live metric would reject but the closed-form accepts (a false accept) or vice versa. The spec claims
the two agree on all but 39 of 100,000 threshold-edge cases; I re-measure on my sweep and look for a
systematic (not threshold) disagreement I can steer into.
Known-failed shape. Construct a program by hand whose closed-form distinct count sits just above the
245,760 floor but whose live distinct count I force low by planting a source that is near-constant on
the live dataset only (e.g. a load whose source on the live set collapses because the live item map
folds it). The tool must report that planted program as a closed-form accept / live reject.
Gain / bound. Either a BREAK (a seed family that is a false accept and reads a hot set on the live
set — folds into Q1) or a BOUND: the measured disagreement count and margin over my sweep, stated
with the seed count.
Box-hours. Rides on Q1's live-dataset build (the cache fill is the cost, shared). 1 box-hour.
### Q3. Attempt grinding and the last resort
Method. Analytic plus a measured sweep. (a) The attempt stream: attempt k uses
seed_words_from_bytes(seed || k_le32); the program is a deterministic function of (seed, k). An
attacker who sets the epoch seed picks the (seed, k=first-accept) pair; an attacker who only predicts
it cannot change it. I quantify: over many seeds, how much does the hot-set metric of Q1 vary across
the first N accepted attempts of ONE seed vs across seeds, i.e. can grinding k (without changing the
seed) reach a worse program than attempt 0. Since k changes the whole seed-word set, each attempt is
an independent draw, so grinding k is just grinding seeds at a fixed epoch seed only if the attacker
controls nothing; if the attacker controls the epoch seed, k adds no freedom beyond the seed. (b)
The 256 cap and last_resort_v4: I drive a seed that exhausts (the test names igneum-f9/331672) and
measure what last_resort_v4 produces — is it predictable (yes, a deterministic function of attempt
256's draw with or/mul/mulhi->xor) and is it weak (every register fresh by construction, but does it
read a hot set or fail (c) on the live set though (a') passes). last_resort has NO (c)/(c'')/(c')
check, so it is the one accepted program the hot-set rule never sees.
Known-failed shape. I force the last-resort path on a planted exhausting seed (or by calling
last_resort_v4 directly on a rejected candidate, as the crate's own test does) and run its live hot
set through the Q1 metric. The tool fires if the last-resort program's hot set beats the floor the
rule enforces on normal programs.
Derive check. I derive Devnet 3's epoch-0 program id and confirm it equals fce15bf61030be57 (the
brief's check); a mismatch means my draw path is wrong and Q3 is void until fixed.
Box-hours. 1 box-hour (mostly the exhausting-seed search and the last-resort live run).
### Q4. Header grinding for locality
Method. The header bytes enter only the init words I = seed_words_from_bytes("igneum-block/" || H ||
nonce_hi) (bind.rs), not the program and not the dataset. A 32-lane group's 128 loads per lane are a
function of (program, I, base lane nonce). I measure, for one fixed accepted program and one live
dataset, how the distinct DRAM rows / cache lines touched by a 32-lane group vary over header
choices (vary H and nonce_hi), and whether a cheap search finds a header whose group clusters into
materially fewer lines than the mean. Cost vs gain: the search is hashing headers and running the
warp; the gain is fewer lines per group. I bound the best clustering found over a header budget and
the search cost in hashes per unit of clustering.
Known-failed shape. Plant a program whose loads are already clustered (reuse Q1's const-item plant)
so the per-group line count is low for every header; the tool must show the low count and show that
header choice does not move it (clustering is a program property, not a header one) — the control
that header grinding gives nothing. The positive known-fail: artificially make the address a function
of I alone (a one-line patch in my harness mirror, never in the library) and show the search then
finds a clustering header, so the search itself works.
Box-hours. 1 box-hour (one program, one cache, a header sweep).
### Q5. Generator distinguishers
Method. Over the Q1 sweep of accepted programs, count structural shapes: a lossy op (or/mul/mulhi)
as the last write to an output register; a contraction (mul/mulhi) feeding the fold; the register-set
reachability (does the program collapse to fewer than 8 live registers at the fold); low-entropy load
sites that pass the 0.98 ratio floor but sit in its tail (the open F8 seeds p4/p8/p10/p34 at 0.9927
to 0.9963). For each shape I ask whether it lowers the live distinct-item count or raises the hot
set. The 0.98 floor itself: I measure the distribution of the per-site ratio over accepted programs
and the gap between the floor and the clean median, to see how much low-entropy headroom the rule
leaves.
Known-failed shape. The crate's own diag tests name the band: F8's p23 (shared-operand andnot),
p15/p18/p19/p56 (fail the ratio), p4/p8/p10/p34 (open tail). My tool must reproduce the ratio verdict
on p15/p18/p19/p56 (rejected) and p23 attempt 1 (accepted), matching the crate's test, before I
trust any new finding.
Box-hours. Rides on Q1. 0.5 box-hours.
### Q6. Anything else
Free lane: the (c) base-nonce stream is keyed only on the seed words, not the day or the header, so
every node runs the SAME 2,048 acceptance evaluations for a seed forever; I check whether that fixed
sample is itself grindable (a program tuned to pass the 2,048 fixed nonces but fail off-sample). The
closed-form dataset is fixed at 2^28 whatever the live size; I check whether the live size change
(growth doublings) moves any accepted program off its (c) verdict. Bounds only unless something fires.
## 5. Box-hour budget
| Step | Box-hours | What |
|---|---|---|
| Build the harness (release) | 0.3 | one build-remote.sh --box 2 build |
| Q1 seed sweep + live hot set | 3.0 | nohup long run, poll |
| Q2 stand-in gap | 1.0 | rides on Q1 cache |
| Q3 attempt grind + last resort | 1.0 | |
| Q4 header locality | 1.0 | |
| Q5 distinguishers | 0.5 | rides on Q1 |
| Q6 + re-runs | 1.0 | |
| Total | 7.8 | within the 8 box-hour budget for first results |
GPU is not available tonight, so any per-card hash-rate confirmation of a hot-set gain is BLOCKED and
said so; I report the hot set and the implied SRAM size analytically against chip-model-v3.md.
## 6. Running rules I follow
Build: from tools/attack/adv-accept, `tools/build-remote.sh --box 2 -- build --release`. Long runs:
build first, then nohup the built binary on the box under nice 10 taskset 0-31, pid file beside the
log, logs under /srv/builds/igneum-wt-adv-accept/adv/, poll the log, kill by pid file only. One box
slot at a time. Commit as igneum-labs, push only to the build mirror (git push build adv-accept),
never origin. No cargo on this Mac.

112
tools/attack/adv-accept-v5/Cargo.lock generated Normal file
View file

@ -0,0 +1,112 @@
# This file is automatically @generated by Cargo.
# It is not intended for manual editing.
version = 4
[[package]]
name = "adv-accept-v5"
version = "0.1.0"
dependencies = [
"igneum-pow",
]
[[package]]
name = "igneum-pow"
version = "0.2.0"
dependencies = [
"serde_json",
]
[[package]]
name = "itoa"
version = "1.0.18"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682"
[[package]]
name = "memchr"
version = "2.8.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cf8baf1c55e62ffcace7a9f06f4bd9cd3f0c4beb022d3b367256b91b87513d98"
[[package]]
name = "proc-macro2"
version = "1.0.107"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "985e7ec9bb745e6ce6535b544d84d6cd6f7ad8bd711c398938ae983b91a766d9"
dependencies = [
"unicode-ident",
]
[[package]]
name = "quote"
version = "1.0.47"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1fbf4db142a473a8d80c26bbf18454ed458bf8d26c8219c331daecfdbd079001"
dependencies = [
"proc-macro2",
]
[[package]]
name = "serde"
version = "1.0.229"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4148590afebada386688f18773da617792bf2ef03ffc1e4cbd2b1d45b023e0ba"
dependencies = [
"serde_core",
]
[[package]]
name = "serde_core"
version = "1.0.229"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "67dca2c9c51e58a4791a4b1ed58308b39c64224d349a935ab5039aa360942a48"
dependencies = [
"serde_derive",
]
[[package]]
name = "serde_derive"
version = "1.0.229"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e7a5d71263a5a7d47b41f6b3f06ba276f10cc18b0931f1799f710578e2309348"
dependencies = [
"proc-macro2",
"quote",
"syn",
]
[[package]]
name = "serde_json"
version = "1.0.151"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c841b55ecdae098c80dcae9cf767f6f8a0c2cdb3416bbef72181df4d0fe73f14"
dependencies = [
"itoa",
"memchr",
"serde",
"serde_core",
"zmij",
]
[[package]]
name = "syn"
version = "3.0.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8593e8e72159ed2257d083c7a454a85cbf854f37a0966d8d483aff8c8a3ebcee"
dependencies = [
"proc-macro2",
"quote",
"unicode-ident",
]
[[package]]
name = "unicode-ident"
version = "1.0.26"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d245f478577f809a851594d02313b640fb437e0bb33866753cff937863096954"
[[package]]
name = "zmij"
version = "1.0.23"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "29666d0abbfad1e3dc4dcf6144730dd3a3ab225bbbdac83319345b1b44ccfc1b"

View file

@ -0,0 +1,21 @@
[package]
name = "adv-accept-v5"
version = "0.1.0"
edition = "2021"
description = "adv-accept lane: the f8 hot-set harness over class v5 (vendored igneum-pow of branch class-v5, the dataset keyed by the window's state leaves), to ask whether a class v4 finding still reads hot under class v5"
license = "MIT"
publish = false
[[bin]]
name = "adv-live-v5"
path = "src/live.rs"
[dependencies]
igneum-pow = { path = "igneum-pow" }
[workspace]
[profile.release]
opt-level = 3
lto = true
codegen-units = 1

View file

@ -0,0 +1 @@
target/

View file

@ -0,0 +1,105 @@
# This file is automatically @generated by Cargo.
# It is not intended for manual editing.
version = 4
[[package]]
name = "igneum-pow"
version = "0.2.0"
dependencies = [
"serde_json",
]
[[package]]
name = "itoa"
version = "1.0.18"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682"
[[package]]
name = "memchr"
version = "2.8.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cf8baf1c55e62ffcace7a9f06f4bd9cd3f0c4beb022d3b367256b91b87513d98"
[[package]]
name = "proc-macro2"
version = "1.0.107"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "985e7ec9bb745e6ce6535b544d84d6cd6f7ad8bd711c398938ae983b91a766d9"
dependencies = [
"unicode-ident",
]
[[package]]
name = "quote"
version = "1.0.47"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1fbf4db142a473a8d80c26bbf18454ed458bf8d26c8219c331daecfdbd079001"
dependencies = [
"proc-macro2",
]
[[package]]
name = "serde"
version = "1.0.229"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4148590afebada386688f18773da617792bf2ef03ffc1e4cbd2b1d45b023e0ba"
dependencies = [
"serde_core",
]
[[package]]
name = "serde_core"
version = "1.0.229"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "67dca2c9c51e58a4791a4b1ed58308b39c64224d349a935ab5039aa360942a48"
dependencies = [
"serde_derive",
]
[[package]]
name = "serde_derive"
version = "1.0.229"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e7a5d71263a5a7d47b41f6b3f06ba276f10cc18b0931f1799f710578e2309348"
dependencies = [
"proc-macro2",
"quote",
"syn",
]
[[package]]
name = "serde_json"
version = "1.0.151"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c841b55ecdae098c80dcae9cf767f6f8a0c2cdb3416bbef72181df4d0fe73f14"
dependencies = [
"itoa",
"memchr",
"serde",
"serde_core",
"zmij",
]
[[package]]
name = "syn"
version = "3.0.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8593e8e72159ed2257d083c7a454a85cbf854f37a0966d8d483aff8c8a3ebcee"
dependencies = [
"proc-macro2",
"quote",
"unicode-ident",
]
[[package]]
name = "unicode-ident"
version = "1.0.26"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d245f478577f809a851594d02313b640fb437e0bb33866753cff937863096954"
[[package]]
name = "zmij"
version = "1.0.23"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "29666d0abbfad1e3dc4dcf6144730dd3a3ab225bbbdac83319345b1b44ccfc1b"

View file

@ -0,0 +1,30 @@
[package]
name = "igneum-pow"
version = "0.2.0"
edition = "2021"
description = "Igneum random-program GPU proof-of-work: seed, program generator (version 2: fixed load count, fresh sources, acceptance rule), memory-hard dataset, CPU warp verifier and kernel emitters; the source of every program pack"
license = "MIT"
publish = false
[lib]
name = "igneum_pow"
path = "src/lib.rs"
[[bin]]
name = "igneum-pow"
path = "src/main.rs"
[dependencies]
[dev-dependencies]
serde_json = "1"
# The cache fill is 2^22 ChaCha12 blocks and the vector tests derive thousands of items.
# Unoptimised builds would make `cargo test` take minutes, so the dev profile is optimised too.
[profile.dev]
opt-level = 3
[profile.release]
opt-level = 3
lto = true
codegen-units = 1

View file

@ -0,0 +1,181 @@
# igneum-pow
The Igneum lottery hash in Rust: the generator, the acceptance rule, the memory-hard dataset, the CPU verifier and the
kernel emitters. This is the crate the rusty-kaspa fork calls (`docs/fork-map.md`, rows a1 to a3) and, since
4 October 2026, the source of every program pack in `proto-cuda/packs/`. No dependency outside the standard
library; `serde_json` is a dev-dependency for reading the packs in the tests.
Dates: 3 October 2026 (crate, bit-exact with the Swift prototype), 4 October 2026 (generator version 2 and the
acceptance rule; every vector re-cut). Toolchain: rustc 1.99.0 via rustup (the Homebrew 1.69 on PATH is too old;
use `~/.cargo/bin/cargo`). Crate version 0.2.0.
## Modules
| Module | What it is | Swift namesake |
|---|---|---|
| `seed` | 32-byte seed words from bytes (FNV-1a 64, four salts, finalised); `seed_words_from_bytes` is the boundary where the chain feeds the epoch seed; SplitMix64 | `seedWordsBytes`, `SplitMix64` |
| `generator` | version 2: 16 load slots drawn first from instructions 1..63, fresh-source loads, the other 48 ops from the ten non-load weights; attempts `k = 0, 1, ...` of a seed; the program id. The retired version 1 generator stays as `generate_v1` for the census and the lever measurements | `generateProgramV2`, `candidateProgram`, `generateProgramV1` |
| `accept` | the acceptance rule of spec 01 section 1.4.6: two static tests and the 64-unit dynamic test on the seed-keyed closed-form dataset | `acceptProgram` |
| `memhard` | 256 MiB cache (2^16 chains of 64 ChaCha12 blocks), mixer parameters, 8-round item derivation with the 32 lanes interleaved, `MemhardCpu::fetch` | `cpuFillCache`, `MixParams`, `deriveItems`, `MemhardCPU` |
| `verify` | the 32-lane warp interpreter, `DatasetMode::{ClosedForm, MemoryHard}`, `Epoch`, `hash_warp`, `verify_block` | `cpuWarp`, `DatasetSource` |
| `emit` | Metal, CUDA and OpenCL source, program.h, memhard.h, vectors.h, program.json, vectors.json, the header-bound kernels, `export_pack` | `generateMSL`, `generateCUDA`, `generateOpenCL`, `exportPack` |
| `bind` | header binding (spec 01 section 1.6): init words from `"igneum-block/" \|\| H \|\| nonce_hi_le32`, bound hash API on `Epoch`, the 256-bit pow mapping, the interim day seed bytes | `blockInitWords` |
## Generator version 2 (4 October 2026)
Adopted from `docs/analysis/weak-program-census-2026-10-03.md` (ledger M5 and M6). Three parts, all in this crate
and mirrored in `proto-metal/main.swift` so the Metal worker derives the same program from the same seed:
| Part | Rule | Where |
|---|---|---|
| G1, exact load count | 16 `load` instructions per program, a uniform 16-subset of slots 1..63 drawn first by partial Fisher-Yates over the program stream; the other 48 ops from `add 12, xor 10, mul 8, mad 8, shfl 8, rotl 7, sub 6, mulhi 6, rotr 6, or 4` (sum 75). 128 loads per hash, 4,096 items per unit | `generator::candidate_from_words` |
| G2, fresh source | a load's source is drawn from the registers other than `dst` written by an earlier instruction and not read by a load since, so no load repeats an earlier load's address in the hash | same |
| R, acceptance | (a) no load whose source is unwritten since the previous load from it, cyclically; (b) every register has an `add`, `sub`, `xor`, `mad`, `shfl` or `load` write; (c) 64 units at base nonces from `SplitMix64(FNV-1a-64("igneum-accept/" \|\| seed words LE))`, init words = seed words, closed-form dataset `dataset_elem(idx, S[0], S[1])` at 2^28 words: no constant register bit, no lane-constant load site in any unit, fewer than 164 saturated final values, every output bit within 136 of 1,024, distinct addresses above 245,760 over the 2,048 hashes | `accept::check` |
| Attempts | a rejected candidate is replaced by `seed_words_from_bytes(seed \|\| k_le32)` for `k = 1, 2, ...`; 32 consecutive rejections are a consensus fault (probability below 2^-136 at the measured 5 percent rate) | `generator::generate_from_seed_bytes` |
| Program id | `FNV-1a-64("igneum-program/" \|\| 2_le32 \|\| seed words LE \|\| attempt_le32)`, written into program.json and program.h with the generator version and the attempt, so a version 1 pack or another attempt can never pass for the current program | `Program::program_id` |
Measured on this crate (`igneum-pow accept`): `igneum-genesis` attempt 0 accepted, program id `bcc1248b10cc90f2`,
op mix `load=16 add=8 shfl=8 xor=6 mad=5 mul=5 mulhi=5 sub=4 rotl=3 rotr=3 or=1`, 128.000 distinct addresses per
hash; `igneum-hourly` attempt 0, id `a4c4d00961c855df`; seeds `igneum-census-2026-10-03/22`, `/37` and `/51` have
attempt 0 rejected ((b) r7 without an injecting write; (c) 119.74 distinct addresses; (b) r4) and attempt 1
accepted (ids `22ed0609d079f4cf`, `947705cc4eb1df0a`, `9869afcc028bf9f1`); those three are the conformance vectors
for the attempt rule. The rule costs 1.3 to 3.4 ms per seed on one core. The 20,000-program census under this
generator is in `docs/bench-log.md` (4 October 2026 entry).
## The API the fork calls
```rust
use igneum_pow::{Epoch, DatasetMode};
// Once per epoch and day: derives the accepted program and fills the 256 MiB cache (about 0.2 s on one core).
let epoch = Epoch::memory_hard("igneum-genesis", "2026-10-03");
let h: u64 = epoch.hash(nonce); // one nonce (computes its aligned 32-nonce warp)
let w: [u64; 32] = epoch.hash_warp(base_nonce); // one warp
let ok: bool = epoch.verify_block(nonce, target_u64);
// Miner programs for the epoch: the pack every worker compiles.
let pack = igneum_pow::emit::export_pack(&epoch, "2026-10-03", "igneum node");
pack.write_to(std::path::Path::new("out"))?; // kernel.cu, kernel.cl, program.metal, memhard.h, ...
```
## The header-bound form (what the chain uses)
The pack form above initialises the lane registers from the program's own seed words, so one nonce has one
hash per epoch whatever block is mined. On the chain the init words commit to the block (spec 01 section 1.6,
`src/bind.rs`):
```
H = header hash with the nonce field zeroed, every other field as mined
(rusty-kaspa hash_override_nonce_time(header, 0, header.timestamp))
nonce = 64 bits; lane nonce n = low 32 bits; nonce_hi = high 32 bits
I = seed_words_from_bytes("igneum-block/" || H || nonce_hi_le32) (49 bytes in)
hash = interpret(program, I, n) (section 1.7 of the spec)
pow256 = hash in the top 64 bits, low 192 bits zero (little-endian bytes 24..32)
valid = pow256 <= target256, which is exactly hash <= target256 >> 192
```
`H` keeps the timestamp (Kaspa zeroes it in the pre-PoW hash and absorbs it in cSHAKE afterwards; the lane hash has
no afterwards, so a nonce would otherwise be reusable across timestamps). The interim day seed is
`"igneum-day/" || day_le64` with `day = timestamp_ms / 86,400,000`. The epoch seed bytes are the 32 bytes of the
epoch block hash (devnet); the program is `generate_from_seed_bytes(epoch_seed)`, attempts included.
```rust
use igneum_pow::{bind, Epoch};
let epoch = Epoch::from_seed_bytes(epoch_hash.as_bytes(), &bind::day_bytes(day), "label");
let lane: u64 = epoch.hash_bound(&prehash, nonce); // one 64-bit nonce
let warp: [u64; 32] = epoch.hash_warp_bound(&prehash, nonce); // its aligned 32-nonce group
let init = bind::block_init_words(&prehash, nonce); // what a GPU kernel takes as its argument
let same = epoch.hash_warp_init(&init, nonce as u32 & !31); // == warp
let pow: [u8; 32] = epoch.pow_bound(&prehash, nonce);
let ok = epoch.verify_block_bound(&prehash, nonce, bind::target64_from_le256(&target_le));
```
On the GPU the init words are a kernel argument: `igneum_hash_bound` in `program_bound.metal` takes
`constant uint* initw [[buffer(3)]]`, `kernel_bound.cu` takes `IgneumInitWords iw` by value, `kernel_bound.cl` an
`initw` buffer. All three differ from `igneum_hash` only in the kernel name, the argument and the eight init lines.
Bound vectors (seed `igneum-genesis`, day `2026-10-03`, memory-hard, 2^28 words, generator v2; `igneum-pow hash-bound`):
| H | nonce | hash_bound |
|---|---|---|
| 32 zero bytes | 0 | `746c567b090acf6a` |
| 32 zero bytes | 1 | `45a619f860880c73` |
| 32 zero bytes | 31 | `9aa495e43dedbfe6` |
| 32 zero bytes | 4096 | `2e6ffd7624d3cba2` |
| 32 zero bytes | 4294967296 (1 << 32) | `38a5cea1fb01431a` |
| bytes 00 01 02 .. 1f | 0 | `2a79c5e4797bf6aa` |
| bytes 00 01 02 .. 1f | 4294967301 ((1 << 32) + 5) | `a243e0c61aa1b82e` |
| bytes 00 01 02 .. 1f | 18446744073709551615 (u64::MAX) | `9c7bbfbd064fe1a4` |
Init words for H = 32 zero bytes, nonce 0: `595a8f8a 37647e95 faadade1 cbbcf2a4 54f7cc13 f6851b5e 8c68ca04 7991ea9c`
(unchanged by v2: the binding does not depend on the program). The eight are pinned in `bind::tests::bound_vectors`.
The version 1 bound vectors of 3 October 2026 are retired.
`Epoch` is `Send + Sync`; build one and share it. `DatasetMode::ClosedForm` is the interpreter regression dataset
of the packs `igneum-genesis` and `igneum-hourly` and is not memory-hard.
## CLI
```
cargo build --release
./target/release/igneum-pow bench --seed igneum-genesis [--warps 20] [--closed-form] [--day 2026-10-03]
./target/release/igneum-pow export --seed igneum-genesis --out <dir> [--closed-form]
./target/release/igneum-pow export --epoch-hex <64 hex> --day-hex <hex> --out <dir> the chain's byte seeds
./target/release/igneum-pow hash --seed igneum-genesis --nonce 4103
./target/release/igneum-pow hash-bound --seed igneum-genesis --prehash <64 hex> --nonce <u64>
./target/release/igneum-pow accept --seed igneum-census-2026-10-03/22 every candidate with its verdict
./target/release/igneum-pow show --seed igneum-genesis the accepted program, one line per instruction
```
The packs were regenerated on 4 October 2026 with exactly these commands:
```
igneum-pow export --closed-form --seed igneum-genesis --out ../proto-cuda/packs/igneum-genesis
igneum-pow export --closed-form --seed igneum-hourly --out ../proto-cuda/packs/igneum-hourly
igneum-pow export --seed igneum-genesis --out ../proto-cuda/packs/igneum-genesis-mh
igneum-pow export --epoch-hex edc4fa844da9dc98d37e965176f6558a31560e40502ab3ae5491b21aaaabfb07 \
--day-hex 69676e65756d2d6461792ffa50000000000000 --out ../proto-cuda/packs/igneum-devnet-v4-epoch0
```
The last is the chain's own derivation for devnet v4 epoch 0: the devnet genesis hash as the epoch seed and
`bind::day_bytes(20730)` (2026-10-04) as the day bytes.
## Tests
`cargo test --release` (39 tests, about 2 s after compile; the dev profile is optimised so the cache fill is quick):
| Check | Pack | Result |
|---|---|---|
| program.json instruction by instruction from `seed_bytes`, generator 2, attempt, program id, op mix, 128 loads, acceptance | all four | match |
| Mixer parameters (key, rot, mul, rc) | igneum-genesis-mh, igneum-devnet-v4-epoch0 | match |
| Cache head, last line, FNV-1a 64 (`48c4f5bf24166b2e` for day 2026-10-03, `448274a57f508cbc` for day bytes 20730) | the two memory-hard packs | match |
| Dataset head (16), `[MASK]`, 64 sampled words | all four | match |
| 96 hash vectors (3 warps x 32 lanes) | all four | 96/96 each |
| kernel.cu, kernel_bound.cu, program.metal, program_bound.metal, kernel.cl, kernel_bound.cl, program.h, program.json byte-identical; 16 masked loads per kernel | all four | identical |
| memhard.h, memhard.metal byte-identical | the two memory-hard packs | identical |
| vectors.json, vectors.h byte-identical; no stale file in any pack directory | all four | identical |
| bound vectors (8), bound warp == bound single, H and nonce_hi enter the hash | igneum-genesis-mh | pass |
| the devnet pack equals `Epoch::from_seed_bytes(genesis, day_bytes(20730))` | igneum-devnet-v4-epoch0 | pass |
| acceptance: instrumented interpreter == `hash_warp`, cyclic stale-load detection, injecting-write detection, rejection under 12.5 percent and distinct loads above 127 on 400 census seeds, version 1 programs mostly rejected | unit tests | pass |
| generator: 16 loads, none at instruction 0, contract on 200 candidates; fresh sources; attempt words; program ids separate versions and attempts | unit tests | pass |
## Measured, Apple M5 Max, one core, release build
| Step | 3 October 2026 (v1, 104 loads) | 4 October 2026 (v2, 128 loads, 4,096 items) |
|---|---|---|
| Cache fill, 256 MiB | 175 to 181 ms | 179 ms |
| CPU verify per warp, igneum-genesis, avg of 20 | 0.441 ms (3,328 items) | 0.631 ms |
| Cold single warps (bases 0, 4096, 1000000) | 0.41 to 0.87 ms | 0.67 to 0.81 ms |
| Acceptance rule per candidate | | 1.3 to 3.4 ms |
| Closed form, igneum-genesis | 0.002 ms | 0.002 ms |
The 10 ms gate holds with a margin of about 16x steady on this core. Every verified unit now derives exactly 4,096
items, the design bound of spec section 1.11.
## Not done here
- No GPU. The vectors tie this crate to the Metal, CUDA and OpenCL results through the packs; nothing here runs a kernel.
- The epoch seed enters at `Epoch::from_seed_bytes` (the epoch block hash on devnet); the VDF output replaces it there.
- The dynamic acceptance test is specified on the closed-form dataset at 2^28 words; if the prototype mask ever changes, the rule's constant stays at 2^28.

View file

@ -0,0 +1 @@
class-v5 igneum-pow at commit 25c8063ff38e248b7a92d91575e975a81d953894

View file

@ -0,0 +1,2 @@
max_width = 120
use_small_heuristics = "Max"

View file

@ -0,0 +1,869 @@
//! Program acceptance (spec 01 section 1.4.6, adopted 4 October 2026 from the weak-program census of
//! `docs/analysis/weak-program-census-2026-10-03.md`, section 6).
//!
//! A candidate program is accepted only if every test below holds. Every conforming implementation evaluates
//! exactly these tests on exactly these inputs, so every node skips the same seeds.
//!
//! | Part | Test |
//! |---|---|
//! | (a) static | for every `load`, some instruction between the previous `load` from the same source register and this one, in cyclic order over the 64 instructions, writes that register |
//! | (b) static | every register `r0..r7` is the destination of at least one `add`, `sub`, `xor`, `mad`, `shfl` or `load` |
//! | (c) dynamic | the program is interpreted for [`ACCEPT_UNITS`] (64) units of 32 lanes at base nonces drawn from SplitMix64 seeded with `FNV-1a-64("igneum-accept/" \|\| seed words as little-endian bytes)`, each `low32(next()) AND NOT 31`, with init words equal to the seed words and the closed-form dataset `dataset_elem(idx, S[0], S[1])` at [`ACCEPT_DATASET_LOG2`] (2^28 words) in place of the memory-hard dataset. Over the 2,048 evaluations: no register has a bit equal in every final value; no load site (iteration, instruction) reads one address in all 32 lanes of any unit; fewer than [`MAX_SATURATED`] (164, 1 percent of 16,384) final register values are 0 or 2^32 - 1; every output bit's ones count is within [`BIAS_TOLERANCE`] (136, 6 sigma) of 1,024; the distinct masked addresses read by one lane in one evaluation, summed over the 2,048 evaluations, exceed [`MIN_DISTINCT_SUM`] (245,760, a mean above 120 of the 128 loads) |
//!
//! The dynamic test uses the closed form so that it is a pure function of the program (no cache, no day) and
//! costs about a millisecond on one core. A hot-table load (`docs/plans/hot-table.md`) reads the closed form keyed by
//! seed words 2 and 3 at its multiply-shift index, a second pure table beside the dataset stand-in (words 0 and 1). The census (section 7.3) checked on 100,000 programs that the
//! closed-form verdict agrees with the memory-hard one on all but 39 threshold-edge cases.
use crate::generator::{Instr, LoadClass, Op, Program, ShadowClass, INSTR_COUNT, ITERATIONS, LANES, V4_CLASS, V4_SHADOW_INSTRS};
use crate::seed::{fnv1a64, SplitMix64};
use crate::memhard::hot_index;
use crate::verify::{dataset_elem, fold_words, load_index, splitmix32, ScratchModel};
/// Units (32-lane warps) the dynamic test interprets.
pub const ACCEPT_UNITS: usize = 64;
/// Class v4 sub-version 3, rule (c''): the per-site distinct-index RATIO (AP-F8-1's low-entropy-band class, 7 October
/// 2026, the attack-pass gate's numbers through main), keyed on the class v4 shape. Over [`ACCEPT_UNITS_DISTINCT_V4`]
/// units (2^20 evaluations per site) the count of distinct dataset word indices a load site reads, against the
/// expectation of a uniform source on the site's window (N - N^2 / 2W), must reach [`MIN_DISTINCT_RATIO_V4`]. The
/// floor sits between the 55 clean F8 seeds' minimum over their site rows (0.9960; the clean p1 0.9990, the median
/// 1.0000) and the strong failing seeds' maximum (p56 0.9654; p23 0.8361, p18 0.9274, p19 0.9335, p15 0.9432),
/// 0.015 from each. The open tail: F8's p4, p8, p10 and p34 (1.22x to 1.50x on the gate) read 0.9927 to 0.9963 at
/// 2^20, inside the clean spread, and a 2^24 pass does not separate them either (p34 0.9181, p4 0.9614, p8 0.9630,
/// p10 0.9612 against the clean p44 0.9612, p52 0.9613, p3 0.9971, p2 and p5 1.0004); they stay unattributed and
/// chased in `docs/fud-ledger.md` AP-F8-1. A candidate under the floor is rejected and the next attempt drawn under
/// the 256 cap and the last resort. Measured on one box-2 core with the shadow executed: 2.8 s per chosen candidate.
pub const ACCEPT_UNITS_DISTINCT_V4: usize = 4096;
/// The ratio floor at 2^20.
pub const MIN_DISTINCT_RATIO_V4: f64 = 0.98;
/// Kept for the record and the driver, not wired: the most repeated source value per site over the (c) units'
/// 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;
/// Hashes the dynamic test evaluates: 2,048.
pub const ACCEPT_HASHES: usize = ACCEPT_UNITS * LANES;
/// Domain tag of the base-nonce stream.
pub const ACCEPT_TAG: &[u8] = b"igneum-accept/";
/// log2 of the closed-form dataset the test addresses: the prototype's 2^28 words, MASK 0x0fffffff.
pub const ACCEPT_DATASET_LOG2: u32 = 28;
/// Final register values equal to 0 or 2^32 - 1 must number fewer than this (1 percent of 8 x 2,048).
pub const MAX_SATURATED: u32 = 164;
/// Every output bit's ones count must be within this of 1,024 (6 x sqrt(2048) / 2, rounded).
pub const BIAS_TOLERANCE: u32 = 136;
/// Distinct addresses per lane per evaluation, summed over 2,048 evaluations, must exceed this (mean above 120).
pub const MIN_DISTINCT_SUM: u64 = 245_760;
/// The distinct-address bound for a program with `loads` dataset loads per hash: the same 120 of 128 ratio, so
/// [`MIN_DISTINCT_SUM`] for the lottery hash and `loads x 1,920` for the read-width classes with other counts.
/// Variant 5's scratch read-modify-writes are not dataset loads: their slots repeat by design (a later
/// read-modify-write sees an earlier write), so they are neither counted nor bounded here.
pub fn min_distinct_sum(loads: usize) -> u64 {
loads as u64 * ACCEPT_HASHES as u64 * 120 / 128
}
/// Why a candidate was rejected. The verdict (accept or reject) is what consensus depends on; the reason is the
/// first failing test in the order of the module table.
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum Reject {
/// (a): instruction `instr` loads from `reg`, which no instruction wrote since the previous load from it.
StaleLoadSource { instr: u8, reg: u8 },
/// (b): no injecting op writes `reg`.
NoInjectingWrite { reg: u8 },
/// (c): `reg` has `bits` bits equal in all 2,048 final values.
ConstantBit { reg: u8, bits: u8 },
/// (c): the load at `instr` in `iteration` read one address in all 32 lanes of `unit`.
LaneConstantSite { iteration: u8, instr: u8, unit: u8 },
/// (c): `count` final register values were 0 or all ones.
Saturated { count: u32 },
/// (a'), class v4 sub-version 2 (AP-F8-1): the load at `instr` reads `reg`, which is not fresh by dataflow in the
/// steady state of the loop (the freshness fixpoint over the base program and the shadow block).
UnfreshLoadSource { instr: u8, reg: u8 },
/// (c'), class v4 sub-version 2 (AP-F8-1): the load at `site` read a source value of 0 or all ones in `count` of
/// its 16,384 evaluations (64 units x 32 lanes x 8 iterations); limit [`MAX_SATURATED`] - 1, the same 1 percent as (c).
SaturatedSource { site: u8, count: u32 },
/// (c'') (B), class v4 sub-version 3: the load at `site` read the value `value` in `count` of its 16,384 (c)
/// evaluations (limit [`MAX_SOURCE_REPEAT_V4`] - 1): one constant upstream that the lineage rule cannot see.
RepeatedSource { site: u8, value: u32, count: u32 },
/// (c''), class v4 sub-version 3: the load at `site` read `distinct` distinct dataset word indices over
/// `evaluations`, `ratio_milli` / 1000 of a uniform source on its window, under the floor: a low-entropy index band
/// (F8's p23, p18, p19, p15, p56).
LowEntropySite { site: u8, distinct: u32, evaluations: u32, ratio_milli: u32 },
/// (c): output bit `bit` was set in `ones` of 2,048 hashes.
OutputBias { bit: u8, ones: u32 },
/// (c): the distinct-address sum was `sum`.
DistinctAddresses { sum: u64 },
}
impl std::fmt::Display for Reject {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
Reject::StaleLoadSource { instr, reg } => {
write!(f, "(a) load at instruction {instr} reads r{reg}, unwritten since the previous load from it")
}
Reject::NoInjectingWrite { reg } => write!(f, "(b) r{reg} has no add, sub, xor, mad, shfl or load write"),
Reject::ConstantBit { reg, bits } => write!(f, "(c) r{reg} has {bits} nonce-independent bits"),
Reject::LaneConstantSite { iteration, instr, unit } => {
write!(f, "(c) load at iteration {iteration} instruction {instr} reads one address in all lanes of unit {unit}")
}
Reject::Saturated { count } => write!(f, "(c) {count} of 16384 final register values saturated (limit 163)"),
Reject::UnfreshLoadSource { instr, reg } => write!(f, "(a') load at {instr} reads r{reg}, not fresh by dataflow in the loop's steady state (class v4 sub-version 2)"),
Reject::RepeatedSource { site, value, count } => write!(f, "(c'') load site {site} read the value {value:#010x} in {count} of 16384 evaluations (limit {})", MAX_SOURCE_REPEAT_V4 - 1),
Reject::LowEntropySite { site, distinct, evaluations, ratio_milli } => write!(f, "(c'') load site {site} read {distinct} distinct word indices over {evaluations} evaluations, {}.{:03} of a uniform source on its window (floor {MIN_DISTINCT_RATIO_V4} at 2^20)", ratio_milli / 1000, ratio_milli % 1000),
Reject::SaturatedSource { site, count } => write!(f, "(c') load site {site} read a saturated source value in {count} of 16384 evaluations (limit 163)"),
Reject::OutputBias { bit, ones } => write!(f, "(c) output bit {bit} set in {ones} of 2048 hashes"),
Reject::DistinctAddresses { sum } => {
write!(f, "(c) distinct dataset addresses {sum} over 2048 hashes (mean {:.2}, needs above 120 of 128 of the dataset loads)", *sum as f64 / 2048.0)
}
}
}
}
/// What the dynamic test measured on an accepted program.
#[derive(Clone, Copy, Debug, Default, PartialEq, Eq)]
pub struct AcceptReport {
/// Distinct masked addresses per lane per evaluation, summed over the 2,048 evaluations.
pub distinct_sum: u64,
/// Final register values equal to 0 or all ones.
pub saturated: u32,
/// The largest `|ones - 1024|` over the 64 output bits.
pub bias_max: u32,
}
impl AcceptReport {
/// Mean distinct addresses per hash (128 at most).
pub fn distinct_mean(&self) -> f64 {
self.distinct_sum as f64 / ACCEPT_HASHES as f64
}
}
/// Part (a): no load whose source is unwritten since the previous load from it, cyclically.
fn check_stale_loads(instrs: &[Instr]) -> Result<(), Reject> {
// `pending[r]`: a load has read r and nothing has written r since. Two passes over the list so the second
// pass sees the state carried over the iteration boundary.
let mut pending = [false; 8];
for _pass in 0..2 {
for (k, ins) in instrs.iter().enumerate() {
if ins.op.is_load() && pending[ins.src as usize] {
return Err(Reject::StaleLoadSource { instr: k as u8, reg: ins.src });
}
pending[ins.dst as usize] = false;
if ins.op.is_load() {
pending[ins.src as usize] = true;
}
}
}
Ok(())
}
/// Part (b): every register has an injecting write.
fn check_injecting_writes(instrs: &[Instr]) -> Result<(), Reject> {
let mut injected = [false; 8];
for ins in instrs {
if ins.op.injects() {
injected[ins.dst as usize] = true;
}
}
for (reg, ok) in injected.iter().enumerate() {
if !ok {
return Err(Reject::NoInjectingWrite { reg: reg as u8 });
}
}
Ok(())
}
/// The most repeated value of `values` (sorted in place) and that value: (B), kept for the driver, not wired.
#[allow(dead_code)]
fn most_repeated(values: &mut [u32]) -> (u32, u32) {
values.sort_unstable();
let (mut best, mut best_v, mut run) = (0u32, 0u32, 0u32);
for i in 0..values.len() {
run = if i > 0 && values[i] == values[i - 1] { run + 1 } else { 1 };
if run > best {
best = run;
best_v = values[i];
}
}
(best, best_v)
}
/// (c''), class v4 sub-version 3: the 2^20 ratio pass on the chosen candidate (the constants above).
pub fn check_distinct_indices_v4(p: &Program) -> Result<(), Reject> {
distinct_ratio_pass(p, ACCEPT_UNITS_DISTINCT_V4, MIN_DISTINCT_RATIO_V4).map(|_| ())
}
/// One ratio pass over `units`: every load site's distinct word indices against the uniform expectation on its
/// window (`N - N^2 / 2W`, the window `2^28 >> min(win, 2)` words of the closed-form dataset), `Err` at the first
/// site under `floor`, else the minimum ratio and its site.
pub fn distinct_ratio_pass(p: &Program, units: usize, floor: f64) -> Result<(f64, usize), Reject> {
let n = (units * LANES * ITERATIONS) as f64;
let d = distinct_indices_v4(p, units)?;
let mut min = (f64::MAX, 0usize);
let mut site = 0usize;
for i in &p.instrs {
if !i.op.is_load() {
continue;
}
let wsize = ((1u64 << ACCEPT_DATASET_LOG2) >> (i.win as u64).min(2)) as f64;
let ratio = d[site] as f64 / (n - n * n / (2.0 * wsize));
if ratio < floor {
return Err(Reject::LowEntropySite { site: site as u8, distinct: d[site], evaluations: n as u32, ratio_milli: (ratio * 1000.0) as u32 });
}
if ratio < min.0 {
min = (ratio, site);
}
site += 1;
}
Ok(min)
}
/// The distinct dataset word indices every load site reads over `units` units of the seed's acceptance stream on
/// the closed-form words (the sample caps the count near `units x 32 x 8`, so a site's index entropy is read only
/// below about log2 of that).
pub fn distinct_indices_v4(p: &Program, units: usize) -> Result<Vec<u32>, Reject> {
let loads = p.loads_per_hash();
let sites = loads / ITERATIONS;
let mut acc = Acc {
sources: None,
indices: Some(vec![Vec::with_capacity(units * LANES * ITERATIONS); sites]),
sat_source: vec![0; sites],
and_acc: [u32::MAX; 8],
or_acc: [0; 8],
saturated: 0,
bit_ones: [0; 64],
distinct_sum: 0,
};
let mut lane_addrs = vec![0u32; LANES * loads];
for (unit, &base) in accept_base_nonces_n(&p.seed, units).iter().enumerate() {
run_unit(p, unit, base, &mut acc, &mut lane_addrs)?;
}
let mut out = Vec::with_capacity(sites);
for ix in acc.indices.take().unwrap().iter_mut() {
ix.sort_unstable();
ix.dedup();
out.push(ix.len() as u32);
}
Ok(out)
}
/// Whether `class` is the class v4 shape (the 256-instruction shadow block over the class v3 base, the pass count and
/// the era set aside): the shape the sub-version 2 rules (a') and (c') apply to, on every draw path.
pub fn is_class_v4_shape(class: &LoadClass) -> bool {
matches!(class.shadow, Some(ShadowClass { instrs: V4_SHADOW_INSTRS, .. }))
// class v5 (docs/design/class-v5-stored-state.md) is judged under the same rules: its state flag is set aside
&& LoadClass { era: None, shadow: None, state: false, ..*class } == LoadClass { shadow: None, ..V4_CLASS }
}
/// One pass of the dataflow freshness over the base program then the shadow block (the order of one iteration),
/// from `fresh`; `check` reports the first load that reads a register that is not fresh. The rule (AP-F8-1,
/// `docs/analysis/ca3-v4-uniform.md`): a load leaves its destination fresh only if its source was (a saturated
/// source reads one fixed word); add, sub, xor, mad and shfl if either operand was; rotl and rotr if the operand
/// was (a rotate maps all-ones and zero to themselves); or, mul and mulhi never.
fn freshness_pass(p: &Program, fresh: &mut [bool; 8], pair_op: &mut [Option<(Op, usize)>; 8], check: bool) -> Result<(), Reject> {
for (k, i) in p.instrs.iter().chain(p.shadow.iter()).enumerate() {
let (d, a) = (i.dst as usize, i.src as usize);
if check && i.op.is_load() && !fresh[a] {
return Err(Reject::UnfreshLoadSource { instr: k as u8, reg: i.src });
}
// the shared-operand idiom (sub-version 3): or-then-xor or or-then-sub on one operand is `d & ~s`, xor-then-or
// is `d | s`: lossy, though the second op would inject on its own (F8's p23: `or r6 |= r4; xor r6 ^= r4`)
let masked = matches!((pair_op[d], i.op), (Some((Op::Or, s)), Op::Xor) | (Some((Op::Or, s)), Op::Sub) | (Some((Op::Xor, s)), Op::Or) if s == a);
fresh[d] = !masked
&& match i.op {
Op::Load | Op::WLoad | Op::Scratch | Op::Hot => fresh[a],
Op::Add | Op::Sub | Op::Xor | Op::Mad | Op::Shfl => fresh[d] || fresh[a],
Op::Rotl | Op::Rotr => fresh[d],
Op::Or | Op::Mul | Op::MulHi => false,
};
pair_op[d] = if matches!(i.op, Op::Or | Op::Xor) && !masked { Some((i.op, a)) } else { None };
for r in 0..8 {
if r != d {
if let Some((_, s)) = pair_op[r] {
if s == d {
pair_op[r] = None;
}
}
}
}
}
Ok(())
}
/// Part (a'), class v4 sub-version 2: every load's source is fresh by dataflow in the loop's steady state. The draw
/// of `candidate_from_words_class` keeps in-pass sources fresh; this closes the iteration boundary (a source last
/// written late in the previous iteration or in the shadow block, which the draw's no-eligible fallback can pick:
/// F8's p11, an `or` at 63 feeding a load at 1). The state starts all fresh (the init words are a per-lane hash of
/// the nonce) and is run to its fixpoint (it only ever falls, so at most 8 passes change it), then one checking pass.
pub fn check_fresh_sources_v4(p: &Program) -> Result<(), Reject> {
if !is_class_v4_shape(&p.class) {
return Ok(());
}
let mut fresh = [true; 8];
let mut pair_op: [Option<(Op, usize)>; 8] = [None; 8];
for _ in 0..9 {
let before = (fresh, pair_op);
freshness_pass(p, &mut fresh, &mut pair_op, false)?;
if (fresh, pair_op) == before {
break;
}
}
freshness_pass(p, &mut fresh, &mut pair_op, true)
}
/// Parts (a), (b) and, for class v4 sub-version 2, (a').
pub fn check_static(p: &Program) -> Result<(), Reject> {
if p.instrs.len() != INSTR_COUNT {
panic!("acceptance needs a {INSTR_COUNT}-instruction program");
}
check_stale_loads(&p.instrs)?;
check_injecting_writes(&p.instrs)?;
check_fresh_sources_v4(p)
}
/// The 64 base nonces of the dynamic test for seed words `seed`.
pub fn accept_base_nonces(seed: &[u32; 8]) -> [u32; ACCEPT_UNITS] {
let v = accept_base_nonces_n(seed, ACCEPT_UNITS);
let mut out = [0u32; ACCEPT_UNITS];
out.copy_from_slice(&v);
out
}
/// The first `n` base nonces of the seed's acceptance stream (the (c) units are the first [`ACCEPT_UNITS`]).
pub fn accept_base_nonces_n(seed: &[u32; 8], n: usize) -> Vec<u32> {
let mut b = Vec::with_capacity(ACCEPT_TAG.len() + 32);
b.extend_from_slice(ACCEPT_TAG);
for w in seed {
b.extend_from_slice(&w.to_le_bytes());
}
let mut rng = SplitMix64::new(fnv1a64(&b));
(0..n).map(|_| (rng.next() as u32) & !31).collect()
}
#[inline(always)]
fn mulhi32(a: u32, b: u32) -> u32 {
((a as u64 * b as u64) >> 32) as u32
}
/// Accumulators of the dynamic test over the 64 units.
struct Acc {
/// (c'') (B): every load's source value per site, recorded when present.
sources: Option<Vec<Vec<u32>>>,
/// (c'') (A): every load's dataset index per site, recorded when present (the distinct-index pass only).
indices: Option<Vec<Vec<u32>>>,
/// (c'): per load site (the load's index within the iteration), how many of its evaluations read a source value
/// of 0 or all ones (class v4 sub-version 2; counted for every class, judged for class v4 only).
sat_source: Vec<u32>,
and_acc: [u32; 8],
or_acc: [u32; 8],
saturated: u32,
bit_ones: [u32; 64],
distinct_sum: u64,
}
/// One unit of the dynamic test: the interpreter of `verify.rs` with the closed-form dataset, instrumented.
/// Returns the first lane-constant load site, if any.
fn run_unit(p: &Program, unit: usize, base: u32, acc: &mut Acc, lane_addrs: &mut [u32]) -> Result<(), Reject> {
let seed = &p.seed;
let mask: u32 = (1u32 << ACCEPT_DATASET_LOG2) - 1;
let (d0, d1) = (seed[0], seed[1]);
let (h0, h1) = (seed[2], seed[3]);
let hot_words = p.hot_words();
let loads = p.loads_per_hash();
let mut r = [[0u32; LANES]; 8];
for lane in 0..LANES {
let nonce = base.wrapping_add(lane as u32);
for i in 0..8 {
let mut x = nonce ^ seed[i];
x = x.wrapping_add(0x9e3779b9u32.wrapping_mul(i as u32 + 1));
x = splitmix32(x);
r[i][lane] = x ^ seed[(i + 1) & 7];
}
}
let mut idx = [0u32; LANES];
let mut nload = 0usize;
let mut scratch = if p.has_scratch() { Some(ScratchModel::new(p.class.scratch_slots_per_lane())) } else { None };
let slot_mask = p.class.scratch_slot_mask();
let era = p.class.era;
// Class v4 sub-version 3 (AP-F8-3, 7 October 2026): the acceptance interpreter runs the latency-shadow block
// after instruction 63 of every iteration, `reps` times with the iteration's `sel`, exactly as the hash does
// (verify.rs). Until this commit it ran the 64 base instructions only, so every dynamic test (c) judged a class v4
// program the chain never hashes. The shadow block holds no load, so its instructions take the same arms.
let shadow_reps = p.shadow_reps();
for it in 0..ITERATIONS {
let sel = r[0];
let shadow_pass = (0..shadow_reps).flat_map(|_| p.shadow.iter().enumerate().map(|(k, i)| (INSTR_COUNT + k, i)));
for (k, ins) in p.instrs.iter().enumerate().chain(shadow_pass) {
let d = ins.dst as usize;
let a = ins.src as usize;
match ins.op {
Op::Scratch => {
// Variant 5: the slot stands in for the address (bit 31 set so it never aliases a dataset word).
let m = scratch.as_mut().expect("a scratch op needs a scratch class");
for lane in 0..LANES {
idx[lane] = r[a][lane] & slot_mask;
}
if idx.iter().all(|&x| x == idx[0]) {
return Err(Reject::LaneConstantSite { iteration: it as u8, instr: k as u8, unit: unit as u8 });
}
for lane in 0..LANES {
r[d][lane] = m.rmw(&p.seed, base, lane, idx[lane], r[d][lane]);
lane_addrs[lane * loads + nload] = 0x8000_0000 | idx[lane];
}
nload += 1;
}
Op::Add => {
let (imm, imm2, bit) = (ins.imm, ins.imm2, ins.bit as u32);
let src = r[a];
for lane in 0..LANES {
let s = (sel[lane] >> bit) & 1;
let c = if s != 0 { imm2 } else { imm };
r[d][lane] = r[d][lane].wrapping_add(src[lane]).wrapping_add(c);
}
}
Op::Sub => {
let src = r[a];
for lane in 0..LANES {
r[d][lane] = r[d][lane].wrapping_sub(src[lane]);
}
}
Op::Mul => {
let src = r[a];
for lane in 0..LANES {
r[d][lane] = r[d][lane].wrapping_mul(src[lane]);
}
}
Op::MulHi => {
let src = r[a];
for lane in 0..LANES {
r[d][lane] = mulhi32(r[d][lane], src[lane]);
}
}
Op::Xor => {
let src = r[a];
for lane in 0..LANES {
r[d][lane] ^= src[lane];
}
}
Op::Or => {
let src = r[a];
for lane in 0..LANES {
r[d][lane] |= src[lane];
}
}
Op::Rotl => {
let n = ins.rot;
for lane in 0..LANES {
r[d][lane] = r[d][lane].rotate_left(n);
}
}
Op::Rotr => {
let src = r[a];
for lane in 0..LANES {
r[d][lane] = r[d][lane].rotate_right(src[lane] & 31);
}
}
Op::Mad => {
let src = r[a];
let src2 = r[ins.src2 as usize];
for lane in 0..LANES {
r[d][lane] = src[lane].wrapping_mul(src2[lane]).wrapping_add(r[d][lane]);
}
}
Op::Shfl => {
let src = r[a];
let m = ins.mask as usize;
for lane in 0..LANES {
r[d][lane] ^= src[lane ^ m];
}
}
Op::Load => {
// Read-width experiment: a load of `width` words reads from the aligned address and folds every
// word (verify::fold_words); width 1 is the lottery hash's xor of one word.
let width = ins.width as usize;
let align = !(ins.width as u32 - 1);
let site = nload % (loads / ITERATIONS);
for lane in 0..LANES {
let v = r[a][lane];
acc.sat_source[site] += (v == 0 || v == u32::MAX) as u32;
if let Some(src) = acc.sources.as_mut() {
src[site].push(v);
}
idx[lane] = load_index(era.as_ref(), ins, v, mask, ACCEPT_DATASET_LOG2) & align;
if let Some(ix) = acc.indices.as_mut() {
ix[site].push(idx[lane]);
}
}
if idx.iter().all(|&x| x == idx[0]) {
return Err(Reject::LaneConstantSite { iteration: it as u8, instr: k as u8, unit: unit as u8 });
}
for lane in 0..LANES {
if width == 1 {
r[d][lane] ^= dataset_elem(idx[lane], d0, d1);
} else {
let mut w = [0u32; 16];
for j in 0..width {
w[j] = dataset_elem(idx[lane] + j as u32, d0, d1);
}
r[d][lane] = fold_words(r[d][lane], &w[..width]);
}
lane_addrs[lane * loads + nload] = idx[lane];
}
nload += 1;
}
Op::Hot => {
// Hot table: the stand-in is dataset_elem keyed by seed words 2 and 3; the address is tagged with
// bit 30 so a hot word and a dataset word at one index count as two addresses.
for lane in 0..LANES {
idx[lane] = hot_index(r[a][lane], hot_words);
}
if idx.iter().all(|&x| x == idx[0]) {
return Err(Reject::LaneConstantSite { iteration: it as u8, instr: k as u8, unit: unit as u8 });
}
for lane in 0..LANES {
r[d][lane] ^= dataset_elem(idx[lane], h0, h1);
lane_addrs[lane * loads + nload] = 0x4000_0000 | idx[lane];
}
nload += 1;
}
Op::WLoad => {
let b = (r[a][0] & mask) & !31;
for lane in 0..LANES {
idx[lane] = b + lane as u32;
r[d][lane] ^= dataset_elem(idx[lane], d0, d1);
lane_addrs[lane * loads + nload] = idx[lane];
}
nload += 1;
}
}
}
}
for i in 0..8 {
for lane in 0..LANES {
let v = r[i][lane];
acc.and_acc[i] &= v;
acc.or_acc[i] |= v;
acc.saturated += (v == 0 || v == u32::MAX) as u32;
}
}
for lane in 0..LANES {
let lo = r[0][lane] ^ r[1][lane].rotate_left(7) ^ r[2][lane].rotate_left(14) ^ r[3][lane].rotate_left(21);
let hi = r[4][lane] ^ r[5][lane].rotate_left(9) ^ r[6][lane].rotate_left(18) ^ r[7][lane].rotate_left(27);
let h = ((hi as u64) << 32) | lo as u64;
for j in 0..64 {
acc.bit_ones[j] += ((h >> j) & 1) as u32;
}
let sl = &mut lane_addrs[lane * loads..(lane + 1) * loads];
sl.sort_unstable();
let mut distinct = 0u64;
for k in 0..loads {
// scratch slots carry bit 31 (variant 5) and are not dataset addresses
if sl[k] & 0x8000_0000 == 0 && (k == 0 || sl[k] != sl[k - 1]) {
distinct += 1;
}
}
acc.distinct_sum += distinct;
}
Ok(())
}
/// Part (c).
pub fn check_dynamic(p: &Program) -> Result<AcceptReport, Reject> {
let loads = p.loads_per_hash();
let v4 = is_class_v4_shape(&p.class);
let sites = loads / ITERATIONS;
let mut acc = Acc {
sources: None,
indices: None,
sat_source: vec![0; sites],
and_acc: [u32::MAX; 8],
or_acc: [0; 8],
saturated: 0,
bit_ones: [0; 64],
distinct_sum: 0,
};
let mut lane_addrs = vec![0u32; LANES * loads];
for (unit, &base) in accept_base_nonces(&p.seed).iter().enumerate() {
run_unit(p, unit, base, &mut acc, &mut lane_addrs)?;
}
for reg in 0..8 {
let bits = (acc.and_acc[reg] | !acc.or_acc[reg]).count_ones();
if bits != 0 {
return Err(Reject::ConstantBit { reg: reg as u8, bits: bits as u8 });
}
}
if acc.saturated >= MAX_SATURATED {
return Err(Reject::Saturated { count: acc.saturated });
}
// (c'), class v4 sub-version 2 (AP-F8-1, 7 October 2026): a load whose source is saturated reads one fixed word,
// whatever delivered the saturation (an or-written value, a rotate of one, a load after a saturated load); the
// source rule of the draw removes the writers it can see and this count catches every delivery. Keyed on the
// class v4 shape as the draw's rule is, so v2 and v3 verdicts do not move.
if v4 {
if let Some((site, &count)) = acc.sat_source.iter().enumerate().find(|(_, &c)| c >= MAX_SATURATED) {
return Err(Reject::SaturatedSource { site: site as u8, count });
}
// (c''), the ratio on the candidate that passed everything else (the draw's last and dearest test)
check_distinct_indices_v4(p)?;
}
let half = (ACCEPT_HASHES / 2) as u32;
let mut bias_max = 0u32;
for (bit, &ones) in acc.bit_ones.iter().enumerate() {
let d = ones.abs_diff(half);
if d > BIAS_TOLERANCE {
return Err(Reject::OutputBias { bit: bit as u8, ones });
}
bias_max = bias_max.max(d);
}
if acc.distinct_sum <= min_distinct_sum(loads - p.scratch_ops_per_hash()) {
return Err(Reject::DistinctAddresses { sum: acc.distinct_sum });
}
Ok(AcceptReport { distinct_sum: acc.distinct_sum, saturated: acc.saturated, bias_max })
}
/// The whole rule: (a), (b), then (c).
pub fn check(p: &Program) -> Result<AcceptReport, Reject> {
check_static(p)?;
check_dynamic(p)
}
#[cfg(test)]
mod tests {
use super::*;
use crate::generator::{candidate, candidate_class, generate, generate_class, GeneratorConfig, generate_v1, LoadClass};
use crate::verify::{DatasetMode, DatasetSource};
#[test]
fn distinct_bound_scales_with_the_load_count() {
assert_eq!(min_distinct_sum(128), MIN_DISTINCT_SUM);
assert_eq!(min_distinct_sum(32), 61_440);
}
/// The read-width classes pass the rule at about the version 2 rate, and the instrumented interpreter agrees
/// with `verify.rs` on every class (the fold is shared, the addresses are aligned the same way).
#[test]
fn classes_pass_and_match_verify() {
for name in ["w16", "w64", "w64x4", "50,35,15", "25,50,25", "scr2k32", "scr8k128"] {
let c = LoadClass::parse(name).unwrap();
let p = generate_class("igneum-genesis", c);
assert!(check(&p).is_ok(), "{name}");
let mut rejected = 0;
for i in 0..60u32 {
let s = format!("igneum-rw-accept/{i}");
let q = candidate_class(&s, s.as_bytes(), 0, c);
if check(&q).is_err() {
rejected += 1;
}
}
assert!(rejected < 15, "{name}: {rejected} of 60 rejected");
let ds = DatasetSource::from_key(p.seed, DatasetMode::ClosedForm, ACCEPT_DATASET_LOG2);
let bases = accept_base_nonces(&p.seed);
let loads = p.loads_per_hash();
let mut acc = Acc { sources: None, indices: None, sat_source: vec![0; 64], and_acc: [u32::MAX; 8], or_acc: [0; 8], saturated: 0, bit_ones: [0; 64], distinct_sum: 0 };
let mut la = vec![0u32; LANES * loads];
let mut ones = [0u32; 64];
for (u, &b) in bases.iter().enumerate() {
run_unit(&p, u, b, &mut acc, &mut la).unwrap();
for h in crate::verify::hash_warp(&p, b, &ds) {
for j in 0..64 {
ones[j] += ((h >> j) & 1) as u32;
}
}
}
assert_eq!(acc.bit_ones, ones, "{name}: bit counts match the reference interpreter");
}
}
/// AP-F8-3 (7 October 2026): the acceptance's execution and `verify.rs` agree on a class v4 program WITH its
/// shadow block (the output bit counts over the 64 units on the closed-form dataset, the same sel per iteration),
/// so the two paths cannot diverge again: until sub-version 3 the acceptance ran the base program only and judged
/// a program the chain never hashes. The devnet epoch-0 seed and the six test eras, 8 x 256 x 27 shadow
/// instructions per hash each; the same program with its shadow stripped gives other counts.
#[test]
fn acceptance_executes_the_shadow_block_as_the_verifier_does() {
use crate::generator::{generate_era, EraParams, V3_ALLOWED, V4_CLASS};
let hx = |h: &str| -> Vec<u8> { (0..h.len()).step_by(2).map(|i| u8::from_str_radix(&h[i..i + 2], 16).unwrap()).collect() };
let g = hx("edc4fa844da9dc98d37e965176f6558a31560e40502ab3ae5491b21aaaabfb07");
let mut eras = vec![g.clone()];
for n in 0..6 {
eras.push(EraParams::test_era_bytes(&format!("igneum-era-test/{n}")).to_vec());
}
for era in &eras {
let p = generate_era("igneum-epoch/edc4fa844da9dc98d37e965176f6558a31560e40502ab3ae5491b21aaaabfb07", &g, V4_CLASS, era, &V3_ALLOWED);
assert_eq!(p.shadow.len(), 256);
assert_eq!(p.shadow_reps(), 27);
let ds = DatasetSource::from_key(p.seed, DatasetMode::ClosedForm, ACCEPT_DATASET_LOG2);
let bases = accept_base_nonces(&p.seed);
let mut acc = Acc { sources: None, indices: None, sat_source: vec![0; 64], and_acc: [u32::MAX; 8], or_acc: [0; 8], saturated: 0, bit_ones: [0; 64], distinct_sum: 0 };
let mut la = vec![0u32; LANES * p.loads_per_hash()];
let mut ones = [0u32; 64];
for (u, &b) in bases.iter().enumerate() {
run_unit(&p, u, b, &mut acc, &mut la).unwrap();
for h in crate::verify::hash_warp(&p, b, &ds) {
for j in 0..64 {
ones[j] += ((h >> j) & 1) as u32;
}
}
}
assert_eq!(acc.bit_ones, ones, "the acceptance's execution of a class v4 program (shadow block included) matches the verifier's hashes");
// and the same program with its shadow stripped hashes differently: the shadow is executed, not skipped
let mut bare = p.clone();
bare.shadow.clear();
let mut acc2 = Acc { sources: None, indices: None, sat_source: vec![0; 64], and_acc: [u32::MAX; 8], or_acc: [0; 8], saturated: 0, bit_ones: [0; 64], distinct_sum: 0 };
for (u, &b) in bases.iter().enumerate() {
let _ = run_unit(&bare, u, b, &mut acc2, &mut la);
}
assert_ne!(acc.bit_ones, acc2.bit_ones, "the shadow block changes the acceptance's execution");
}
}
/// The instrumented interpreter agrees with `verify.rs` on the closed-form dataset keyed by the seed words.
#[test]
fn instrumented_interpreter_matches_verify() {
for i in 0..20u32 {
let s = format!("igneum-accept-test/{i}");
let p = candidate(&s, s.as_bytes(), 0);
let ds = DatasetSource::from_key(p.seed, DatasetMode::ClosedForm, ACCEPT_DATASET_LOG2);
let bases = accept_base_nonces(&p.seed);
let mut acc = Acc { sources: None, indices: None, sat_source: vec![0; 64], and_acc: [u32::MAX; 8], or_acc: [0; 8], saturated: 0, bit_ones: [0; 64], distinct_sum: 0 };
let mut la = vec![0u32; LANES * p.loads_per_hash()];
let mut ones = [0u32; 64];
let mut any = false;
for (u, &b) in bases.iter().enumerate() {
if run_unit(&p, u, b, &mut acc, &mut la).is_err() {
continue;
}
any = true;
let w = crate::verify::hash_warp(&p, b, &ds);
for h in w {
for j in 0..64 {
ones[j] += ((h >> j) & 1) as u32;
}
}
}
if any {
assert_eq!(acc.bit_ones, ones, "bit counts of {s} match the reference interpreter's hashes");
}
}
}
/// Hot-table experiment: the hot classes pass the rule at about the version 2 rate, and the hot addresses are
/// uniform over the table (16 buckets of the index over 64 units x 32 lanes x 32 hot loads).
#[test]
fn hot_classes_pass_and_hot_loads_are_uniform() {
for name in ["hot32k4", "hot64k4", "hot96k4", "hot64k2", "hot64k8", "scr4k32+hot64k4", "hot32k4a", "hot64k4a", "hot96k4a"] {
let c = LoadClass::parse(name).unwrap();
let p = generate_class("igneum-genesis", c);
assert!(check(&p).is_ok(), "{name}");
let mut rejected = 0;
for i in 0..60u32 {
let s = format!("igneum-hot-accept/{i}");
let q = candidate_class(&s, s.as_bytes(), 0, c);
if check(&q).is_err() {
rejected += 1;
}
}
assert!(rejected < 15, "{name}: {rejected} of 60 rejected");
}
let p = generate_class("igneum-genesis", LoadClass::hot(96, 4));
let words = p.hot_words();
let loads = p.loads_per_hash();
let mut acc = Acc { sources: None, indices: None, sat_source: vec![0; 64], and_acc: [u32::MAX; 8], or_acc: [0; 8], saturated: 0, bit_ones: [0; 64], distinct_sum: 0 };
let mut la = vec![0u32; LANES * loads];
let mut buckets = [0u64; 16];
let mut hot_count = 0u64;
for (u, &b) in accept_base_nonces(&p.seed).iter().enumerate() {
run_unit(&p, u, b, &mut acc, &mut la).unwrap();
for &a in &la {
if a & 0xC000_0000 == 0x4000_0000 {
let idx = a & 0x3FFF_FFFF;
assert!(idx < words);
buckets[(idx as u64 * 16 / words as u64) as usize] += 1;
hot_count += 1;
}
}
}
assert_eq!(hot_count, 64 * 32 * 32, "32 hot loads per hash over 2,048 hashes");
let mean = hot_count as f64 / 16.0;
for (i, &b) in buckets.iter().enumerate() {
assert!((b as f64 - mean).abs() < 0.15 * mean, "bucket {i}: {b} against a mean of {mean}");
}
// the dataset distinct count still holds for the dataset loads alone
let r = check(&p).unwrap();
assert!(r.distinct_mean() > 120.0);
}
#[test]
fn base_nonces_are_aligned_and_seed_dependent() {
let a = accept_base_nonces(&[1, 2, 3, 4, 5, 6, 7, 8]);
let b = accept_base_nonces(&[1, 2, 3, 4, 5, 6, 7, 9]);
assert!(a.iter().all(|x| x & 31 == 0));
assert_ne!(a, b);
assert_eq!(a, accept_base_nonces(&[1, 2, 3, 4, 5, 6, 7, 8]));
}
#[test]
fn stale_load_detection_is_cyclic() {
let mut p = candidate("igneum-genesis", b"igneum-genesis", 0);
assert!(check_stale_loads(&p.instrs).is_ok(), "an accepted candidate has no stale load");
// Make the last instruction a load from r3 and the first a load from r3 with no write between (wrap).
let (first, last) = (0usize, INSTR_COUNT - 1);
p.instrs[last].op = Op::Load;
p.instrs[last].src = 3;
p.instrs[last].dst = 4;
p.instrs[first].op = Op::Load;
p.instrs[first].src = 3;
p.instrs[first].dst = 5;
assert_eq!(check_stale_loads(&p.instrs), Err(Reject::StaleLoadSource { instr: 0, reg: 3 }));
}
#[test]
fn injecting_write_detection() {
let mut p = candidate("igneum-genesis", b"igneum-genesis", 0);
for ins in p.instrs.iter_mut() {
if ins.dst == 6 && ins.op.injects() {
ins.op = Op::Rotl;
}
}
assert_eq!(check_injecting_writes(&p.instrs), Err(Reject::NoInjectingWrite { reg: 6 }));
}
/// The census's measured rates: about 5 percent of candidates rejected, 128 distinct loads for the rest.
#[test]
fn rejection_rate_and_distinct_loads_on_a_sample() {
let mut rejected = 0;
let mut dsum = 0.0;
let mut accepted = 0;
for i in 0..400u32 {
let s = format!("igneum-census-2026-10-03/{i}");
match check(&candidate(&s, s.as_bytes(), 0)) {
Ok(r) => {
accepted += 1;
dsum += r.distinct_mean();
assert!(r.distinct_mean() > 120.0);
}
Err(_) => rejected += 1,
}
}
assert!(rejected < 50, "{rejected} of 400 rejected");
assert!(dsum / accepted as f64 > 127.0, "mean distinct {}", dsum / accepted as f64);
}
/// The retired generator fails the rule on nearly every program (the census: 95 percent).
#[test]
fn v1_programs_are_mostly_rejected() {
let mut rejected = 0;
for i in 0..100u32 {
let s = format!("igneum-census-2026-10-03/{i}");
if check(&generate_v1(&s, &GeneratorConfig::default())).is_err() {
rejected += 1;
}
}
assert!(rejected > 80, "{rejected} of 100 rejected");
}
#[test]
fn generated_programs_pass() {
for s in ["igneum-genesis", "igneum-hourly", "igneum-second-seed"] {
assert!(check(&generate(s)).is_ok());
}
}
}

View file

@ -0,0 +1,234 @@
//! Header binding: the init words of the lottery hash commit to the block being mined.
//!
//! `docs/spec/01-lottery-hash.md` section 1.6 (open item O-1.9) proposes the rule implemented here:
//!
//! * The header nonce is 64 bits. Its low 32 bits are the lane nonce `n` (the per-thread nonce of the kernel).
//! * Its high 32 bits and the 256-bit pre-PoW header hash `H` form the init words:
//! `I = seed_words_from_bytes("igneum-block/" || H || nonce_hi_le32)`.
//! * `I` is a kernel argument, not a compile-time constant. The program (from the epoch seed) is compiled once per
//! epoch; `I` changes per block template.
//!
//! Choices the spec leaves open, fixed here (3 October 2026):
//!
//! | Choice | Rule | Why |
//! |---|---|---|
//! | `H` | the header hash with the nonce field set to zero and every other field as mined (rusty-kaspa `hash_override_nonce_time(header, 0, header.timestamp)`) | Kaspa's pre-PoW hash also zeroes the timestamp and absorbs it later in cSHAKE. The lane hash has no later step, so the timestamp must be inside `H` or a miner could reuse one nonce for many timestamps |
//! | 256-bit pow value | lane hash in the top 64 bits (little-endian bytes 24..32), low 192 bits zero | `pow <= target256` is then exactly `lane <= target256 >> 192` (section 1.10 candidate), so a GPU worker and the node compare the same 64-bit numbers; the block level is `leading_zeros(lane)` shifted |
//! | Day seed bytes (O-1.10 interim) | `"igneum-day/" || day_le64` with `day = header.timestamp_ms / 86,400,000` | The spec's proposal ties the day key to the first epoch seed of the day, which needs the VDF schedule. The interim rule keeps one 256 MiB cache per calendar day and needs no chain walk |
//! | Epoch seed bytes | the 32 bytes of the epoch block hash (devnet v0: the last selected-chain block below the epoch's start DAA score, genesis for epoch 0) | Section 1.12: `S_e = seed_words_from_bytes(program_seed_e)`; the VDF output replaces the block hash later without touching this crate |
//!
//! The packs' vectors (init words equal to the program seed) stay the conformance vectors for the generator,
//! interpreter and dataset. The bound vectors are in `README.md` and in the tests below (re-cut for generator
//! version 2 on 4 October 2026).
use crate::generator::LANES;
use crate::seed::seed_words_from_bytes;
use crate::verify::{interpret_warp_init, Epoch, WarpResult};
/// Domain tag of the init words.
pub const BLOCK_TAG: &[u8] = b"igneum-block/";
/// Domain tag of the interim day seed.
pub const DAY_TAG: &[u8] = b"igneum-day/";
/// Milliseconds per day, the clock of the interim day seed.
pub const DAY_MS: u64 = 86_400_000;
/// The lane nonce: low 32 bits of the header nonce.
#[inline]
pub fn lane_nonce(nonce: u64) -> u32 {
nonce as u32
}
/// The high 32 bits of the header nonce (the extra nonce that enters the init words).
#[inline]
pub fn nonce_hi(nonce: u64) -> u32 {
(nonce >> 32) as u32
}
/// `"igneum-block/" || H || nonce_hi_le32`, the bytes the init words are derived from.
pub fn block_init_bytes(header_prehash: &[u8; 32], nonce: u64) -> [u8; 49] {
let mut b = [0u8; 49];
b[..13].copy_from_slice(BLOCK_TAG);
b[13..45].copy_from_slice(header_prehash);
b[45..49].copy_from_slice(&nonce_hi(nonce).to_le_bytes());
b
}
/// The init words `I` for a header and a 64-bit nonce (only the high 32 bits of the nonce matter).
pub fn block_init_words(header_prehash: &[u8; 32], nonce: u64) -> [u32; 8] {
seed_words_from_bytes(&block_init_bytes(header_prehash, nonce))
}
/// Interim day seed bytes: `"igneum-day/" || day_le64`.
pub fn day_bytes(day_index: u64) -> [u8; 19] {
let mut b = [0u8; 19];
b[..11].copy_from_slice(DAY_TAG);
b[11..19].copy_from_slice(&day_index.to_le_bytes());
b
}
/// Day index of a header timestamp in milliseconds.
#[inline]
pub fn day_index(timestamp_ms: u64) -> u64 {
timestamp_ms / DAY_MS
}
/// The 256-bit pow value as little-endian bytes: the lane hash in bytes 24..32, zero elsewhere.
pub fn pow256_from_lane(lane: u64) -> [u8; 32] {
let mut b = [0u8; 32];
b[24..32].copy_from_slice(&lane.to_le_bytes());
b
}
/// The 64-bit target from a little-endian 256-bit target: its top 64 bits.
pub fn target64_from_le256(target: &[u8; 32]) -> u64 {
u64::from_le_bytes(target[24..32].try_into().unwrap())
}
/// Lower-case hex of bytes.
pub fn hex(bytes: &[u8]) -> String {
bytes.iter().map(|b| format!("{b:02x}")).collect()
}
/// Bytes from hex (either case). `None` on odd length or a bad digit.
pub fn unhex(s: &str) -> Option<Vec<u8>> {
if s.len() % 2 != 0 {
return None;
}
(0..s.len()).step_by(2).map(|i| u8::from_str_radix(&s[i..i + 2], 16).ok()).collect()
}
impl Epoch {
/// The 32 bound hashes of the aligned warp that contains `nonce`: lane `l` is the hash of
/// `(nonce_hi << 32) | ((lane_nonce & !31) + l)`.
pub fn hash_warp_bound(&self, header_prehash: &[u8; 32], nonce: u64) -> [u64; LANES] {
self.interpret_warp_bound(header_prehash, nonce).hashes
}
pub fn interpret_warp_bound(&self, header_prehash: &[u8; 32], nonce: u64) -> WarpResult {
let init = block_init_words(header_prehash, nonce);
interpret_warp_init(&self.program, &init, lane_nonce(nonce) & !31, &self.dataset)
}
/// The 32 bound hashes for already-derived init words (what a GPU worker computes per dispatch).
pub fn hash_warp_init(&self, init: &[u32; 8], base_lane_nonce: u32) -> [u64; LANES] {
interpret_warp_init(&self.program, init, base_lane_nonce, &self.dataset).hashes
}
/// The bound 64-bit lane hash of one header nonce.
pub fn hash_bound(&self, header_prehash: &[u8; 32], nonce: u64) -> u64 {
self.hash_warp_bound(header_prehash, nonce)[(lane_nonce(nonce) & 31) as usize]
}
/// The bound 256-bit pow value (little-endian): the lane hash in the top 64 bits.
pub fn pow_bound(&self, header_prehash: &[u8; 32], nonce: u64) -> [u8; 32] {
pow256_from_lane(self.hash_bound(header_prehash, nonce))
}
/// `hash_bound(H, nonce) <= target64`.
pub fn verify_block_bound(&self, header_prehash: &[u8; 32], nonce: u64, target64: u64) -> bool {
self.hash_bound(header_prehash, nonce) <= target64
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::verify::DatasetMode;
use std::sync::OnceLock;
fn epoch() -> &'static Epoch {
static E: OnceLock<Epoch> = OnceLock::new();
E.get_or_init(|| Epoch::memory_hard("igneum-genesis", "2026-10-03"))
}
fn prehash_a() -> [u8; 32] {
[0u8; 32]
}
fn prehash_b() -> [u8; 32] {
let mut h = [0u8; 32];
for (i, b) in h.iter_mut().enumerate() {
*b = i as u8;
}
h
}
#[test]
fn init_bytes_layout() {
let b = block_init_bytes(&prehash_b(), 0x0000_0102_0000_0007);
assert_eq!(&b[..13], b"igneum-block/");
assert_eq!(&b[13..45], &prehash_b());
assert_eq!(&b[45..49], &[0x02, 0x01, 0x00, 0x00]);
assert_eq!(
block_init_words(&prehash_b(), 0x0000_0102_0000_0007),
block_init_words(&prehash_b(), 0x0000_0102_ffff_ffff)
);
assert_ne!(block_init_words(&prehash_b(), 0), block_init_words(&prehash_b(), 1 << 32));
}
#[test]
fn day_bytes_layout() {
let b = day_bytes(20_729);
assert_eq!(&b[..11], b"igneum-day/");
assert_eq!(&b[11..], &20_729u64.to_le_bytes());
assert_eq!(day_index(0x1a0ff0f7c00), 20_729);
}
#[test]
fn pow256_and_target64() {
let p = pow256_from_lane(0x0123_4567_89ab_cdef);
assert_eq!(&p[..24], &[0u8; 24]);
assert_eq!(target64_from_le256(&p), 0x0123_4567_89ab_cdef);
assert_eq!(hex(&p[24..]), "efcdab8967452301");
assert_eq!(unhex("efcdab8967452301").unwrap(), p[24..].to_vec());
assert!(unhex("abc").is_none());
}
/// The bound form is a different hash from the unbound one, depends on H and on the high nonce bits, and the
/// single-nonce form agrees with the warp form.
#[test]
fn bound_hash_properties() {
let e = epoch();
let a = prehash_a();
let b = prehash_b();
assert_ne!(e.hash_bound(&a, 0), e.hash(0), "bound differs from the pack vector");
assert_ne!(e.hash_bound(&a, 0), e.hash_bound(&b, 0), "H enters the hash");
assert_ne!(e.hash_bound(&a, 0), e.hash_bound(&a, 1 << 32), "nonce_hi enters the hash");
let w = e.hash_warp_bound(&a, (1 << 32) | 37);
assert_eq!(w[5], e.hash_bound(&a, (1 << 32) | 37));
assert_eq!(w[0], e.hash_bound(&a, 1 << 32 | 32));
let init = block_init_words(&a, 1 << 32);
assert_eq!(e.hash_warp_init(&init, 32), w);
let t = e.hash_bound(&a, 7);
assert!(e.verify_block_bound(&a, 7, t));
assert!(!e.verify_block_bound(&a, 7, t - 1));
assert_eq!(e.pow_bound(&a, 7), pow256_from_lane(t));
}
/// The 8 bound vectors printed in README.md (seed igneum-genesis, day 2026-10-03, memory-hard, 2^28 words,
/// generator v2 since 4 October 2026).
#[test]
fn bound_vectors() {
let e = epoch();
let a = prehash_a();
let b = prehash_b();
let cases: [(&[u8; 32], u64, u64); 8] = [
(&a, 0, 0x746c567b090acf6a),
(&a, 1, 0x45a619f860880c73),
(&a, 31, 0x9aa495e43dedbfe6),
(&a, 4096, 0x2e6ffd7624d3cba2),
(&a, 1 << 32, 0x38a5cea1fb01431a),
(&b, 0, 0x2a79c5e4797bf6aa),
(&b, (1 << 32) | 5, 0xa243e0c61aa1b82e),
(&b, u64::MAX, 0x9c7bbfbd064fe1a4),
];
for (h, nonce, want) in cases {
assert_eq!(e.hash_bound(h, nonce), want, "H {} nonce {nonce}", hex(h));
}
}
#[test]
fn closed_form_bound_also_works() {
let e = Epoch::new("igneum-genesis", "2026-10-03", DatasetMode::ClosedForm, 28);
assert_ne!(e.hash_bound(&prehash_a(), 0), e.hash(0));
}
}

View file

@ -0,0 +1,152 @@
//! BLAKE2b (RFC 7693), the chain's own hash family (spec 01 section 0.6), written out here so the crate keeps its
//! rule of no dependency outside the standard library. Used by class v5's state leaves (`crate::state`):
//! `blake2b_512` for a leaf digest, `blake2b_256` for the sample order. Unkeyed, no salt, no personalisation.
//! Checked against the RFC's "abc" vector and the empty-input vector in the tests.
const IV: [u64; 8] = [
0x6a09e667f3bcc908,
0xbb67ae8584caa73b,
0x3c6ef372fe94f82b,
0xa54ff53a5f1d36f1,
0x510e527fade682d1,
0x9b05688c2b3e6c1f,
0x1f83d9abfb41bd6b,
0x5be0cd19137e2179,
];
const SIGMA: [[usize; 16]; 12] = [
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15],
[14, 10, 4, 8, 9, 15, 13, 6, 1, 12, 0, 2, 11, 7, 5, 3],
[11, 8, 12, 0, 5, 2, 15, 13, 10, 14, 3, 6, 7, 1, 9, 4],
[7, 9, 3, 1, 13, 12, 11, 14, 2, 6, 5, 10, 4, 0, 15, 8],
[9, 0, 5, 7, 2, 4, 10, 15, 14, 1, 11, 12, 6, 8, 3, 13],
[2, 12, 6, 10, 0, 11, 8, 3, 4, 13, 7, 5, 15, 14, 1, 9],
[12, 5, 1, 15, 14, 13, 4, 10, 0, 7, 6, 3, 9, 2, 8, 11],
[13, 11, 7, 14, 12, 1, 3, 9, 5, 0, 15, 4, 8, 6, 2, 10],
[6, 15, 14, 9, 11, 3, 0, 8, 12, 2, 13, 7, 1, 4, 10, 5],
[10, 2, 8, 4, 7, 6, 1, 5, 15, 11, 9, 14, 3, 12, 13, 0],
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15],
[14, 10, 4, 8, 9, 15, 13, 6, 1, 12, 0, 2, 11, 7, 5, 3],
];
#[inline(always)]
fn g(v: &mut [u64; 16], a: usize, b: usize, c: usize, d: usize, x: u64, y: u64) {
v[a] = v[a].wrapping_add(v[b]).wrapping_add(x);
v[d] = (v[d] ^ v[a]).rotate_right(32);
v[c] = v[c].wrapping_add(v[d]);
v[b] = (v[b] ^ v[c]).rotate_right(24);
v[a] = v[a].wrapping_add(v[b]).wrapping_add(y);
v[d] = (v[d] ^ v[a]).rotate_right(16);
v[c] = v[c].wrapping_add(v[d]);
v[b] = (v[b] ^ v[c]).rotate_right(63);
}
fn compress(h: &mut [u64; 8], block: &[u8; 128], t: u128, last: bool) {
let mut m = [0u64; 16];
for (i, w) in m.iter_mut().enumerate() {
*w = u64::from_le_bytes(block[i * 8..i * 8 + 8].try_into().unwrap());
}
let mut v = [0u64; 16];
v[..8].copy_from_slice(h);
v[8..].copy_from_slice(&IV);
v[12] ^= t as u64;
v[13] ^= (t >> 64) as u64;
if last {
v[14] = !v[14];
}
for s in SIGMA.iter() {
g(&mut v, 0, 4, 8, 12, m[s[0]], m[s[1]]);
g(&mut v, 1, 5, 9, 13, m[s[2]], m[s[3]]);
g(&mut v, 2, 6, 10, 14, m[s[4]], m[s[5]]);
g(&mut v, 3, 7, 11, 15, m[s[6]], m[s[7]]);
g(&mut v, 0, 5, 10, 15, m[s[8]], m[s[9]]);
g(&mut v, 1, 6, 11, 12, m[s[10]], m[s[11]]);
g(&mut v, 2, 7, 8, 13, m[s[12]], m[s[13]]);
g(&mut v, 3, 4, 9, 14, m[s[14]], m[s[15]]);
}
for i in 0..8 {
h[i] ^= v[i] ^ v[i + 8];
}
}
/// Unkeyed BLAKE2b of `data` with an output of `out_len` bytes (1..=64), written into `out[..out_len]`.
pub fn blake2b(out: &mut [u8], out_len: usize, data: &[u8]) {
assert!((1..=64).contains(&out_len) && out.len() >= out_len);
let mut h = IV;
h[0] ^= 0x0101_0000 ^ out_len as u64;
let mut t: u128 = 0;
let n = data.len();
// every full block but the last; the last block (possibly empty) is compressed with the final flag
let full = if n == 0 { 0 } else { (n - 1) / 128 };
for i in 0..full {
let block: &[u8; 128] = data[i * 128..i * 128 + 128].try_into().unwrap();
t += 128;
compress(&mut h, block, t, false);
}
let mut last = [0u8; 128];
let rest = &data[full * 128..];
last[..rest.len()].copy_from_slice(rest);
t += rest.len() as u128;
compress(&mut h, &last, t, true);
let mut bytes = [0u8; 64];
for (i, w) in h.iter().enumerate() {
bytes[i * 8..i * 8 + 8].copy_from_slice(&w.to_le_bytes());
}
out[..out_len].copy_from_slice(&bytes[..out_len]);
}
/// BLAKE2b-512 of the concatenation of `parts`.
pub fn blake2b_512(parts: &[&[u8]]) -> [u8; 64] {
let mut data = Vec::with_capacity(parts.iter().map(|p| p.len()).sum());
for p in parts {
data.extend_from_slice(p);
}
let mut out = [0u8; 64];
blake2b(&mut out, 64, &data);
out
}
/// BLAKE2b-256 of the concatenation of `parts`.
pub fn blake2b_256(parts: &[&[u8]]) -> [u8; 32] {
let mut data = Vec::with_capacity(parts.iter().map(|p| p.len()).sum());
for p in parts {
data.extend_from_slice(p);
}
let mut out = [0u8; 32];
blake2b(&mut out, 32, &data);
out
}
#[cfg(test)]
mod tests {
use super::*;
fn hex(b: &[u8]) -> String {
b.iter().map(|x| format!("{x:02x}")).collect()
}
/// RFC 7693 appendix A ("abc"), the empty input, and a two-block input against the reference implementation's
/// known values (the three-block "The quick brown fox" vector of the BLAKE2 test suite).
#[test]
fn rfc_7693_vectors() {
assert_eq!(
hex(&blake2b_512(&[b"abc"])),
"ba80a53f981c4d0d6a2797b69f12f6e94c212f14685ac4b74b12bb6fdbffa2d17d87c5392aab792dc252d5de4533cc9518d38aa8dbf1925ab92386edd4009923"
);
assert_eq!(
hex(&blake2b_512(&[b""])),
"786a02f742015903c6c6fd852552d272912f4740e15847618a86e217f71f5419d25e1031afee585313896444934eb04b903a685b1448b755d56f701afe9be2ce"
);
assert_eq!(hex(&blake2b_256(&[b"abc"])), "bddd813c634239723171ef3fee98579b94964e3bb1cb3e427262c8c068d52319");
assert_eq!(hex(&blake2b_256(&[b""])), "0e5751c026e543b2e8ab2eb06099daa1d1e5df47778f7787faab45cdf12fe3a8");
// a 128-byte input is exactly one full block compressed as the last; 129 bytes takes two
let one = [0x61u8; 128];
let two = [0x61u8; 129];
assert_ne!(blake2b_512(&[&one]), blake2b_512(&[&two]));
assert_eq!(blake2b_512(&[&one[..64], &one[64..]]), blake2b_512(&[&one]), "parts concatenate");
assert_eq!(
hex(&blake2b_512(&[b"The quick brown fox jumps over the lazy dog"])),
"a8add4bdddfd93e4877d2746e62817b116364a1fa7bc148d95090bc7333b3673f82401cf7aa2e4cb1ecd90296e3f14cb5413f8ed77be73045b13914cdcd6a918"
);
}
}

View file

@ -0,0 +1,978 @@
//! The per-day item-derivation program (Counter ASIC 3.0 item 2, `docs/plans/counter-asic-3-derivation.md`):
//! RandomX's SuperscalarHash idea (`vendor/RandomX/src/superscalar.cpp`, read 6 October 2026 at commit 7607fb2)
//! rebuilt for a 16-word item on a GPU. In place of the fixed-shape mixer `M_r` of spec 01 section 1.8.4, each of
//! the nine mixer slots of an item (one before each of the 8 dependent cache reads, one after the last) runs a
//! straight-line program of [`DERIVE_LEN`] instructions drawn once a day from the day key stream, from a fixed
//! set of twelve two-register forms. The 8 dependent cache reads per item are untouched.
//!
//! Rules of the draw (the dependency chain of SuperscalarHash, made strict):
//! * every instruction reads the chain register `c`, the register the previous instruction wrote (`s[0]`, the
//! address word, at the start of each round program), and writes a register `d != c`, which becomes the chain;
//! so no two instructions of a program can run in parallel, and no two consecutive instructions write one
//! register (the "ror r,C1; ror r,C2" and "xor r,r2; xor r,r2" merges of SuperscalarHash's `selectDestination`
//! cannot arise);
//! * every form is a bijection on the 16-word state (the old `d` enters through `+=`, `-=`, `^=`, an odd multiply,
//! or a rotation of itself), so a program loses no entropy, the property `M_r` has;
//! * the forms are integer only, modulo 2^32, with rotations by 1..31: bit-exact on Metal, CUDA and OpenCL by the
//! same argument as the lottery hash's families (spec 01 section 1.14); no division, no float, no branch;
//! * four draws per instruction in a fixed order, so the stream position of every draw is fixed by the index.
//!
//! The acceptance test ([`DeriveProgram::check`]) rejects a degenerate draw and the next attempt is drawn from the
//! continuation of the stream, the rule the program generator uses (spec 01 section 1.4.6).
use crate::memhard::ITEM_ROUNDS;
use crate::seed::SplitMix64;
/// Registers of the item state (the item is 16 words).
pub const DERIVE_REGS: usize = 16;
/// Round programs per item: one before each cache read and one after the last (`ITEM_ROUNDS + 1`).
pub const DERIVE_PROGRAMS: usize = ITEM_ROUNDS + 1;
/// Instructions per round program for the x8-equivalent operation count (the candidate, class "dr736"): 9 x 736
/// = 6,624 instructions per item at a mean of 1.62 GPU operations (1.52 chip operations) each, about 10,730 GPU
/// operations, 10,070 chip operations and 1,460 multiplies per item. The x8 mixer, counted from the code
/// (`memhard::mixer`, 16 x (xor, add, mul) + 8 quarter rounds x 12 = 144 operations as written, 128 with the
/// `RC + rk` adds hoisted as constants, 16 multiplies; `chip-model-v3.md` section 1 prices 130 from the spec text):
/// 72 applications = 10,368 as written, 9,216 hoisted, 1,152 multiplies. The floors below are those three.
pub const DERIVE_LEN_X8: u32 = 736;
/// Draws per instruction: the op roll, the destination roll, the second-source roll and the immediate.
pub const DRAWS_PER_INSTR: u64 = 4;
/// The floor of chip operations per item (the x8 mixer with its constants hoisted: 72 x 128).
pub const OPS_FLOOR_X8: u64 = 9_216;
/// The floor of GPU operations per item (the x8 mixer as written: 72 x 144).
pub const GPU_OPS_FLOOR_X8: u64 = 10_368;
/// The floor of multiplies per item (the x8 mixer's 72 x 16).
pub const MULS_FLOOR_X8: u64 = 1_152;
/// Distinct rotation amounts an item's programs must use, at least.
pub const DISTINCT_ROTS_FLOOR: usize = 8;
/// Attempts before the generator gives up (never reached: see [`DeriveProgram::draw`]).
pub const MAX_ATTEMPTS: u32 = 64;
/// The twelve forms. `c` is the chain register (the previous destination), `d` the destination (`d != c`), `b` a
/// third register (`b != d`, `b != c`), `k` a rotation in 1..31, `i` a 32-bit constant (odd for `MulC`).
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
#[repr(u8)]
pub enum DOp {
/// `d += c`
Add = 0,
/// `d -= c`
Sub = 1,
/// `d ^= c`
Xor = 2,
/// `d *= (c OR 1)`: the multiply-lo form, odd so it is a bijection on `d`
Mul = 3,
/// `d = rotl(d, k) + c`
Rot = 4,
/// `d = rotl(d ^ c, k)`
XRot = 5,
/// `d += c + i`
AddC = 6,
/// `d ^= c ^ i`
XorC = 7,
/// `d = (d ^ c) * i`, `i` odd: the per-word form of `M_r` with the chain in place of the round constant
MulC = 8,
/// `d = d * i + c`, `i` odd
MulC2 = 9,
/// `d ^= (c AND b)`
AndX = 10,
/// `d += (c OR b)`
OrX = 11,
}
/// The op weights in percent, in draw order (sum 100). Fixed at genesis; only the order, the registers and the
/// constants are drawn.
pub const DOP_WEIGHTS: [(DOp, u64); 12] = [
(DOp::Add, 14),
(DOp::Sub, 10),
(DOp::Xor, 14),
(DOp::Mul, 10),
(DOp::Rot, 10),
(DOp::XRot, 10),
(DOp::AddC, 6),
(DOp::XorC, 6),
(DOp::MulC, 8),
(DOp::MulC2, 4),
(DOp::AndX, 4),
(DOp::OrX, 4),
];
impl DOp {
pub fn from_u8(v: u8) -> Option<DOp> {
DOP_WEIGHTS.iter().map(|(o, _)| *o).find(|o| *o as u8 == v)
}
pub fn name(self) -> &'static str {
match self {
DOp::Add => "add",
DOp::Sub => "sub",
DOp::Xor => "xor",
DOp::Mul => "mul",
DOp::Rot => "rot",
DOp::XRot => "xrot",
DOp::AddC => "addc",
DOp::XorC => "xorc",
DOp::MulC => "mulc",
DOp::MulC2 => "mulc2",
DOp::AndX => "andx",
DOp::OrX => "orx",
}
}
/// Integer operations as a GPU executes the form (every `|`, `&`, `+`, `^`, `*`, rotate counts one).
pub fn gpu_ops(self) -> u64 {
match self {
DOp::Add | DOp::Sub | DOp::Xor => 1,
_ => 2,
}
}
/// Integer operations as the chip model counts them (`c OR 1` is a wire on a chip, so `Mul` is one multiply;
/// a constant folded into a chain value is still an add or an xor, so every other two-op form stays two).
pub fn chip_ops(self) -> u64 {
match self {
DOp::Add | DOp::Sub | DOp::Xor | DOp::Mul => 1,
_ => 2,
}
}
pub fn is_mul(self) -> bool {
matches!(self, DOp::Mul | DOp::MulC | DOp::MulC2)
}
pub fn has_rot(self) -> bool {
matches!(self, DOp::Rot | DOp::XRot)
}
pub fn has_third(self) -> bool {
matches!(self, DOp::AndX | DOp::OrX)
}
pub fn has_imm(self) -> bool {
matches!(self, DOp::AddC | DOp::XorC | DOp::MulC | DOp::MulC2)
}
/// The op of a roll in 0..99.
pub fn for_roll(roll: u64) -> DOp {
let mut acc = 0u64;
for (op, w) in DOP_WEIGHTS {
acc += w;
if roll < acc {
return op;
}
}
DOp::OrX
}
}
/// One instruction. `src` is the chain register (carried so the interpreter and the emitter need no state).
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
pub struct DInstr {
pub op: DOp,
pub dst: u8,
pub src: u8,
/// The third register of `AndX` and `OrX`; 0 on every other form (drawn and unused).
pub src2: u8,
/// The rotation 1..31 of `Rot` and `XRot`, else 0.
pub rot: u8,
/// The constant of `AddC`, `XorC` (any), `MulC` and `MulC2` (odd); 0 on every other form.
pub imm: u32,
}
/// The nine round programs of an item for one day, with the attempt that passed the acceptance test.
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct DeriveProgram {
pub len: u32,
pub attempt: u32,
pub rounds: Vec<Vec<DInstr>>,
}
/// Why a candidate was rejected.
#[derive(Clone, Debug, PartialEq, Eq)]
pub enum DeriveReject {
/// A register no instruction of round program `round` writes.
RegisterNeverWritten { round: usize, reg: u8 },
/// Fewer than [`DISTINCT_ROTS_FLOOR`] distinct rotation amounts over the item's programs.
RotationsDegenerate { distinct: usize },
/// Chip operations per item under [`OPS_FLOOR_X8`] scaled to the length.
OpsUnderFloor { ops: u64, floor: u64 },
/// GPU operations per item under [`GPU_OPS_FLOOR_X8`] scaled to the length.
GpuOpsUnderFloor { ops: u64, floor: u64 },
/// Multiplies per item under [`MULS_FLOOR_X8`] scaled to the length.
MulsUnderFloor { muls: u64, floor: u64 },
}
impl std::fmt::Display for DeriveReject {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
DeriveReject::RegisterNeverWritten { round, reg } => write!(f, "register {reg} never written in round program {round}"),
DeriveReject::RotationsDegenerate { distinct } => write!(f, "only {distinct} distinct rotation amounts"),
DeriveReject::OpsUnderFloor { ops, floor } => write!(f, "{ops} chip operations per item, floor {floor}"),
DeriveReject::GpuOpsUnderFloor { ops, floor } => write!(f, "{ops} GPU operations per item, floor {floor}"),
DeriveReject::MulsUnderFloor { muls, floor } => write!(f, "{muls} multiplies per item, floor {floor}"),
}
}
}
impl DeriveProgram {
/// Draw one candidate of `len` instructions per round program from `rng` (four draws per instruction).
pub fn draw_candidate(rng: &mut SplitMix64, len: u32, attempt: u32) -> DeriveProgram {
let mut rounds = Vec::with_capacity(DERIVE_PROGRAMS);
for _ in 0..DERIVE_PROGRAMS {
let mut prog = Vec::with_capacity(len as usize);
let mut chain = 0u8;
for _ in 0..len {
let op = DOp::for_roll(rng.below(100));
// the destination: the 15 registers other than the chain, in ascending order
let d_roll = rng.below((DERIVE_REGS - 1) as u64) as u8;
let dst = if d_roll >= chain { d_roll + 1 } else { d_roll };
// the third register: the 14 registers other than dst and the chain, in ascending order
let b_roll = rng.below((DERIVE_REGS - 2) as u64) as u8;
let (lo, hi) = if dst < chain { (dst, chain) } else { (chain, dst) };
let mut b = b_roll;
if b >= lo {
b += 1;
}
if b >= hi {
b += 1;
}
let x = rng.next() as u32;
let mut ins = DInstr { op, dst, src: chain, src2: 0, rot: 0, imm: 0 };
if op.has_third() {
ins.src2 = b;
}
if op.has_rot() {
ins.rot = 1 + (x % 31) as u8;
}
if op.has_imm() {
ins.imm = if matches!(op, DOp::MulC | DOp::MulC2) { x | 1 } else { x };
}
prog.push(ins);
chain = dst;
}
rounds.push(prog);
}
DeriveProgram { len, attempt, rounds }
}
/// Draw the program of a day: candidates from `rng` in turn until one passes [`DeriveProgram::check`].
/// Panics after [`MAX_ATTEMPTS`] (the floors sit more than 7 standard deviations under the expected counts, so
/// a rejection is a rare event and 64 in a row is not one that happens).
pub fn draw(rng: &mut SplitMix64, len: u32) -> DeriveProgram {
for attempt in 0..MAX_ATTEMPTS {
let p = Self::draw_candidate(rng, len, attempt);
if p.check().is_ok() {
return p;
}
}
panic!("derivation program: {MAX_ATTEMPTS} candidates rejected in a row");
}
/// The floors for this length (chip operations, GPU operations, multiplies): the x8 floors scaled by
/// `len / DERIVE_LEN_X8`, so a shorter class, measured as a fallback, has its own proportional floors.
pub fn floors(len: u32) -> (u64, u64, u64) {
let scale = |f: u64| f * len as u64 / DERIVE_LEN_X8 as u64;
(scale(OPS_FLOOR_X8), scale(GPU_OPS_FLOOR_X8), scale(MULS_FLOOR_X8))
}
/// The acceptance test: every register written in every round program; at least [`DISTINCT_ROTS_FLOOR`]
/// distinct rotation amounts; chip operations, GPU operations and multiplies per item at or above the floors
/// (the x8 mixer's counts from the code). The structural
/// rules (`dst != src`, the third register distinct, rotations in 1..31, odd multiplier constants) hold by
/// construction and are asserted.
pub fn check(&self) -> Result<(), DeriveReject> {
let mut rots = [false; 32];
for (r, prog) in self.rounds.iter().enumerate() {
let mut written = [false; DERIVE_REGS];
let mut chain = 0u8;
for ins in prog {
assert!(ins.src == chain && ins.dst != ins.src && (ins.dst as usize) < DERIVE_REGS, "chain rule");
if ins.op.has_third() {
assert!(ins.src2 != ins.dst && ins.src2 != ins.src && (ins.src2 as usize) < DERIVE_REGS, "third register");
}
if ins.op.has_rot() {
assert!((1..=31).contains(&ins.rot), "rotation");
rots[ins.rot as usize] = true;
}
if matches!(ins.op, DOp::MulC | DOp::MulC2) {
assert!(ins.imm & 1 == 1, "odd multiplier");
}
written[ins.dst as usize] = true;
chain = ins.dst;
}
if let Some(reg) = written.iter().position(|w| !w) {
return Err(DeriveReject::RegisterNeverWritten { round: r, reg: reg as u8 });
}
}
let distinct = rots.iter().filter(|r| **r).count();
if distinct < DISTINCT_ROTS_FLOOR {
return Err(DeriveReject::RotationsDegenerate { distinct });
}
let (ops_floor, gpu_floor, muls_floor) = Self::floors(self.len);
let ops = self.chip_ops();
if ops < ops_floor {
return Err(DeriveReject::OpsUnderFloor { ops, floor: ops_floor });
}
let gpu = self.gpu_ops();
if gpu < gpu_floor {
return Err(DeriveReject::GpuOpsUnderFloor { ops: gpu, floor: gpu_floor });
}
let muls = self.muls();
if muls < muls_floor {
return Err(DeriveReject::MulsUnderFloor { muls, floor: muls_floor });
}
Ok(())
}
pub fn instr_count(&self) -> u64 {
self.rounds.iter().map(|p| p.len() as u64).sum()
}
pub fn gpu_ops(&self) -> u64 {
self.rounds.iter().flatten().map(|i| i.op.gpu_ops()).sum()
}
pub fn chip_ops(&self) -> u64 {
self.rounds.iter().flatten().map(|i| i.op.chip_ops()).sum()
}
pub fn muls(&self) -> u64 {
self.rounds.iter().flatten().filter(|i| i.op.is_mul()).count() as u64
}
/// Count per op, in [`DOP_WEIGHTS`] order.
pub fn op_counts(&self) -> [u64; 12] {
let mut c = [0u64; 12];
for i in self.rounds.iter().flatten() {
c[i.op as usize] += 1;
}
c
}
/// "add=887 sub=..." in weight order.
pub fn op_mix(&self) -> String {
let c = self.op_counts();
DOP_WEIGHTS.iter().map(|(o, _)| format!("{}={}", o.name(), c[*o as usize])).collect::<Vec<_>>().join(" ")
}
/// FNV-1a 64 over the instruction stream (op, dst, src, src2, rot, imm as bytes): the program's fingerprint
/// for packs and logs.
pub fn fingerprint(&self) -> u64 {
let mut b = Vec::with_capacity(self.instr_count() as usize * 9);
for i in self.rounds.iter().flatten() {
b.push(i.op as u8);
b.push(i.dst);
b.push(i.src);
b.push(i.src2);
b.push(i.rot);
b.extend_from_slice(&i.imm.to_le_bytes());
}
crate::seed::fnv1a64(&b)
}
}
/// Lanes of the SoA interpreter: the verifier derives up to 32 distinct items per load (one per lane of the
/// unit), so each instruction runs across 32 item states at once and the dispatch is paid once per 32 items.
pub const SOA_LANES: usize = 32;
/// The item states of a batch, word-major: `st[reg][lane]`.
pub type SoaState = [[u32; SOA_LANES]; DERIVE_REGS];
#[inline(always)]
fn rotl(x: u32, n: u32) -> u32 {
x.rotate_left(n)
}
/// The twelve forms over a batch, one function each, every one a straight loop over the lanes the compiler
/// vectorises. The destination row and the source rows are distinct by the chain rule (`dst != src`, and the third
/// register distinct from both: asserted by [`DeriveProgram::check`] and checked here in debug builds), so the
/// rows are addressed through raw pointers rather than copied out of the state.
mod forms {
use super::{rotl, DInstr, SoaState, SOA_LANES};
#[inline(always)]
pub fn add(ins: &DInstr, st: &mut SoaState) {
debug_assert!(ins.dst != ins.src);
// SAFETY: dst, src (and src2) are distinct registers below DERIVE_REGS, so the rows do not alias and the
// pointers stay inside `st`.
unsafe {
let dp = st.as_mut_ptr().add(ins.dst as usize) as *mut u32;
let cp = st.as_ptr().add(ins.src as usize) as *const u32;
for k in 0..SOA_LANES {
let d = &mut *dp.add(k);
let c = &*cp.add(k);
*d = d.wrapping_add(*c);
}
}
}
#[inline(always)]
pub fn sub(ins: &DInstr, st: &mut SoaState) {
debug_assert!(ins.dst != ins.src);
// SAFETY: dst, src (and src2) are distinct registers below DERIVE_REGS, so the rows do not alias and the
// pointers stay inside `st`.
unsafe {
let dp = st.as_mut_ptr().add(ins.dst as usize) as *mut u32;
let cp = st.as_ptr().add(ins.src as usize) as *const u32;
for k in 0..SOA_LANES {
let d = &mut *dp.add(k);
let c = &*cp.add(k);
*d = d.wrapping_sub(*c);
}
}
}
#[inline(always)]
pub fn xor(ins: &DInstr, st: &mut SoaState) {
debug_assert!(ins.dst != ins.src);
// SAFETY: dst, src (and src2) are distinct registers below DERIVE_REGS, so the rows do not alias and the
// pointers stay inside `st`.
unsafe {
let dp = st.as_mut_ptr().add(ins.dst as usize) as *mut u32;
let cp = st.as_ptr().add(ins.src as usize) as *const u32;
for k in 0..SOA_LANES {
let d = &mut *dp.add(k);
let c = &*cp.add(k);
*d ^= *c;
}
}
}
#[inline(always)]
pub fn mul(ins: &DInstr, st: &mut SoaState) {
debug_assert!(ins.dst != ins.src);
// SAFETY: dst, src (and src2) are distinct registers below DERIVE_REGS, so the rows do not alias and the
// pointers stay inside `st`.
unsafe {
let dp = st.as_mut_ptr().add(ins.dst as usize) as *mut u32;
let cp = st.as_ptr().add(ins.src as usize) as *const u32;
for k in 0..SOA_LANES {
let d = &mut *dp.add(k);
let c = &*cp.add(k);
*d = d.wrapping_mul(*c | 1);
}
}
}
#[inline(always)]
pub fn rot(ins: &DInstr, st: &mut SoaState) {
debug_assert!(ins.dst != ins.src);
let r = ins.rot as u32;
// SAFETY: dst, src (and src2) are distinct registers below DERIVE_REGS, so the rows do not alias and the
// pointers stay inside `st`.
unsafe {
let dp = st.as_mut_ptr().add(ins.dst as usize) as *mut u32;
let cp = st.as_ptr().add(ins.src as usize) as *const u32;
for k in 0..SOA_LANES {
let d = &mut *dp.add(k);
let c = &*cp.add(k);
*d = rotl(*d, r).wrapping_add(*c);
}
}
}
#[inline(always)]
pub fn xrot(ins: &DInstr, st: &mut SoaState) {
debug_assert!(ins.dst != ins.src);
let r = ins.rot as u32;
// SAFETY: dst, src (and src2) are distinct registers below DERIVE_REGS, so the rows do not alias and the
// pointers stay inside `st`.
unsafe {
let dp = st.as_mut_ptr().add(ins.dst as usize) as *mut u32;
let cp = st.as_ptr().add(ins.src as usize) as *const u32;
for k in 0..SOA_LANES {
let d = &mut *dp.add(k);
let c = &*cp.add(k);
*d = rotl(*d ^ *c, r);
}
}
}
#[inline(always)]
pub fn addc(ins: &DInstr, st: &mut SoaState) {
debug_assert!(ins.dst != ins.src);
let i = ins.imm;
// SAFETY: dst, src (and src2) are distinct registers below DERIVE_REGS, so the rows do not alias and the
// pointers stay inside `st`.
unsafe {
let dp = st.as_mut_ptr().add(ins.dst as usize) as *mut u32;
let cp = st.as_ptr().add(ins.src as usize) as *const u32;
for k in 0..SOA_LANES {
let d = &mut *dp.add(k);
let c = &*cp.add(k);
*d = d.wrapping_add(c.wrapping_add(i));
}
}
}
#[inline(always)]
pub fn xorc(ins: &DInstr, st: &mut SoaState) {
debug_assert!(ins.dst != ins.src);
let i = ins.imm;
// SAFETY: dst, src (and src2) are distinct registers below DERIVE_REGS, so the rows do not alias and the
// pointers stay inside `st`.
unsafe {
let dp = st.as_mut_ptr().add(ins.dst as usize) as *mut u32;
let cp = st.as_ptr().add(ins.src as usize) as *const u32;
for k in 0..SOA_LANES {
let d = &mut *dp.add(k);
let c = &*cp.add(k);
*d ^= *c ^ i;
}
}
}
#[inline(always)]
pub fn mulc(ins: &DInstr, st: &mut SoaState) {
debug_assert!(ins.dst != ins.src);
let i = ins.imm;
// SAFETY: dst, src (and src2) are distinct registers below DERIVE_REGS, so the rows do not alias and the
// pointers stay inside `st`.
unsafe {
let dp = st.as_mut_ptr().add(ins.dst as usize) as *mut u32;
let cp = st.as_ptr().add(ins.src as usize) as *const u32;
for k in 0..SOA_LANES {
let d = &mut *dp.add(k);
let c = &*cp.add(k);
*d = (*d ^ *c).wrapping_mul(i);
}
}
}
#[inline(always)]
pub fn mulc2(ins: &DInstr, st: &mut SoaState) {
debug_assert!(ins.dst != ins.src);
let i = ins.imm;
// SAFETY: dst, src (and src2) are distinct registers below DERIVE_REGS, so the rows do not alias and the
// pointers stay inside `st`.
unsafe {
let dp = st.as_mut_ptr().add(ins.dst as usize) as *mut u32;
let cp = st.as_ptr().add(ins.src as usize) as *const u32;
for k in 0..SOA_LANES {
let d = &mut *dp.add(k);
let c = &*cp.add(k);
*d = d.wrapping_mul(i).wrapping_add(*c);
}
}
}
#[inline(always)]
pub fn andx(ins: &DInstr, st: &mut SoaState) {
debug_assert!(ins.dst != ins.src && ins.src2 != ins.dst && ins.src2 != ins.src);
// SAFETY: dst, src (and src2) are distinct registers below DERIVE_REGS, so the rows do not alias and the
// pointers stay inside `st`.
unsafe {
let dp = st.as_mut_ptr().add(ins.dst as usize) as *mut u32;
let cp = st.as_ptr().add(ins.src as usize) as *const u32;
let bp = st.as_ptr().add(ins.src2 as usize) as *const u32;
for k in 0..SOA_LANES {
let d = &mut *dp.add(k);
let c = &*cp.add(k);
let b = &*bp.add(k);
*d ^= *c & *b;
}
}
}
#[inline(always)]
pub fn orx(ins: &DInstr, st: &mut SoaState) {
debug_assert!(ins.dst != ins.src && ins.src2 != ins.dst && ins.src2 != ins.src);
// SAFETY: dst, src (and src2) are distinct registers below DERIVE_REGS, so the rows do not alias and the
// pointers stay inside `st`.
unsafe {
let dp = st.as_mut_ptr().add(ins.dst as usize) as *mut u32;
let cp = st.as_ptr().add(ins.src as usize) as *const u32;
let bp = st.as_ptr().add(ins.src2 as usize) as *const u32;
for k in 0..SOA_LANES {
let d = &mut *dp.add(k);
let c = &*cp.add(k);
let b = &*bp.add(k);
*d = d.wrapping_add(*c | *b);
}
}
}
}
/// One instruction over the batch (the single dispatch; [`run_round`] dispatches on pairs).
#[inline(always)]
pub fn run_instr(ins: &DInstr, st: &mut SoaState) {
match ins.op {
DOp::Add => forms::add(ins, st),
DOp::Sub => forms::sub(ins, st),
DOp::Xor => forms::xor(ins, st),
DOp::Mul => forms::mul(ins, st),
DOp::Rot => forms::rot(ins, st),
DOp::XRot => forms::xrot(ins, st),
DOp::AddC => forms::addc(ins, st),
DOp::XorC => forms::xorc(ins, st),
DOp::MulC => forms::mulc(ins, st),
DOp::MulC2 => forms::mulc2(ins, st),
DOp::AndX => forms::andx(ins, st),
DOp::OrX => forms::orx(ins, st),
}
}
/// Run one round program over the batch. The dispatch is on PAIRS of instructions (144 arms, one indirect branch
/// per two instructions): the op sequence of a drawn program is random, so the branch predictor misses most
/// dispatches, and the miss (about 3.7 ns of the 7.2 ns an instruction cost per batch on one M5 Max core, measured
/// with `examples/derive_perf.rs` on 6 October 2026, a functional run) is paid once per pair instead of once per
/// instruction. The result is bit for bit that of [`run_instr`] in sequence.
#[inline(never)]
pub fn run_round(prog: &[DInstr], st: &mut SoaState) {
let mut it = prog.chunks_exact(2);
for pair in &mut it {
let (a, b) = (&pair[0], &pair[1]);
match (a.op as u8) * 12 + b.op as u8 {
0 => { forms::add(a, st); forms::add(b, st); }
1 => { forms::add(a, st); forms::sub(b, st); }
2 => { forms::add(a, st); forms::xor(b, st); }
3 => { forms::add(a, st); forms::mul(b, st); }
4 => { forms::add(a, st); forms::rot(b, st); }
5 => { forms::add(a, st); forms::xrot(b, st); }
6 => { forms::add(a, st); forms::addc(b, st); }
7 => { forms::add(a, st); forms::xorc(b, st); }
8 => { forms::add(a, st); forms::mulc(b, st); }
9 => { forms::add(a, st); forms::mulc2(b, st); }
10 => { forms::add(a, st); forms::andx(b, st); }
11 => { forms::add(a, st); forms::orx(b, st); }
12 => { forms::sub(a, st); forms::add(b, st); }
13 => { forms::sub(a, st); forms::sub(b, st); }
14 => { forms::sub(a, st); forms::xor(b, st); }
15 => { forms::sub(a, st); forms::mul(b, st); }
16 => { forms::sub(a, st); forms::rot(b, st); }
17 => { forms::sub(a, st); forms::xrot(b, st); }
18 => { forms::sub(a, st); forms::addc(b, st); }
19 => { forms::sub(a, st); forms::xorc(b, st); }
20 => { forms::sub(a, st); forms::mulc(b, st); }
21 => { forms::sub(a, st); forms::mulc2(b, st); }
22 => { forms::sub(a, st); forms::andx(b, st); }
23 => { forms::sub(a, st); forms::orx(b, st); }
24 => { forms::xor(a, st); forms::add(b, st); }
25 => { forms::xor(a, st); forms::sub(b, st); }
26 => { forms::xor(a, st); forms::xor(b, st); }
27 => { forms::xor(a, st); forms::mul(b, st); }
28 => { forms::xor(a, st); forms::rot(b, st); }
29 => { forms::xor(a, st); forms::xrot(b, st); }
30 => { forms::xor(a, st); forms::addc(b, st); }
31 => { forms::xor(a, st); forms::xorc(b, st); }
32 => { forms::xor(a, st); forms::mulc(b, st); }
33 => { forms::xor(a, st); forms::mulc2(b, st); }
34 => { forms::xor(a, st); forms::andx(b, st); }
35 => { forms::xor(a, st); forms::orx(b, st); }
36 => { forms::mul(a, st); forms::add(b, st); }
37 => { forms::mul(a, st); forms::sub(b, st); }
38 => { forms::mul(a, st); forms::xor(b, st); }
39 => { forms::mul(a, st); forms::mul(b, st); }
40 => { forms::mul(a, st); forms::rot(b, st); }
41 => { forms::mul(a, st); forms::xrot(b, st); }
42 => { forms::mul(a, st); forms::addc(b, st); }
43 => { forms::mul(a, st); forms::xorc(b, st); }
44 => { forms::mul(a, st); forms::mulc(b, st); }
45 => { forms::mul(a, st); forms::mulc2(b, st); }
46 => { forms::mul(a, st); forms::andx(b, st); }
47 => { forms::mul(a, st); forms::orx(b, st); }
48 => { forms::rot(a, st); forms::add(b, st); }
49 => { forms::rot(a, st); forms::sub(b, st); }
50 => { forms::rot(a, st); forms::xor(b, st); }
51 => { forms::rot(a, st); forms::mul(b, st); }
52 => { forms::rot(a, st); forms::rot(b, st); }
53 => { forms::rot(a, st); forms::xrot(b, st); }
54 => { forms::rot(a, st); forms::addc(b, st); }
55 => { forms::rot(a, st); forms::xorc(b, st); }
56 => { forms::rot(a, st); forms::mulc(b, st); }
57 => { forms::rot(a, st); forms::mulc2(b, st); }
58 => { forms::rot(a, st); forms::andx(b, st); }
59 => { forms::rot(a, st); forms::orx(b, st); }
60 => { forms::xrot(a, st); forms::add(b, st); }
61 => { forms::xrot(a, st); forms::sub(b, st); }
62 => { forms::xrot(a, st); forms::xor(b, st); }
63 => { forms::xrot(a, st); forms::mul(b, st); }
64 => { forms::xrot(a, st); forms::rot(b, st); }
65 => { forms::xrot(a, st); forms::xrot(b, st); }
66 => { forms::xrot(a, st); forms::addc(b, st); }
67 => { forms::xrot(a, st); forms::xorc(b, st); }
68 => { forms::xrot(a, st); forms::mulc(b, st); }
69 => { forms::xrot(a, st); forms::mulc2(b, st); }
70 => { forms::xrot(a, st); forms::andx(b, st); }
71 => { forms::xrot(a, st); forms::orx(b, st); }
72 => { forms::addc(a, st); forms::add(b, st); }
73 => { forms::addc(a, st); forms::sub(b, st); }
74 => { forms::addc(a, st); forms::xor(b, st); }
75 => { forms::addc(a, st); forms::mul(b, st); }
76 => { forms::addc(a, st); forms::rot(b, st); }
77 => { forms::addc(a, st); forms::xrot(b, st); }
78 => { forms::addc(a, st); forms::addc(b, st); }
79 => { forms::addc(a, st); forms::xorc(b, st); }
80 => { forms::addc(a, st); forms::mulc(b, st); }
81 => { forms::addc(a, st); forms::mulc2(b, st); }
82 => { forms::addc(a, st); forms::andx(b, st); }
83 => { forms::addc(a, st); forms::orx(b, st); }
84 => { forms::xorc(a, st); forms::add(b, st); }
85 => { forms::xorc(a, st); forms::sub(b, st); }
86 => { forms::xorc(a, st); forms::xor(b, st); }
87 => { forms::xorc(a, st); forms::mul(b, st); }
88 => { forms::xorc(a, st); forms::rot(b, st); }
89 => { forms::xorc(a, st); forms::xrot(b, st); }
90 => { forms::xorc(a, st); forms::addc(b, st); }
91 => { forms::xorc(a, st); forms::xorc(b, st); }
92 => { forms::xorc(a, st); forms::mulc(b, st); }
93 => { forms::xorc(a, st); forms::mulc2(b, st); }
94 => { forms::xorc(a, st); forms::andx(b, st); }
95 => { forms::xorc(a, st); forms::orx(b, st); }
96 => { forms::mulc(a, st); forms::add(b, st); }
97 => { forms::mulc(a, st); forms::sub(b, st); }
98 => { forms::mulc(a, st); forms::xor(b, st); }
99 => { forms::mulc(a, st); forms::mul(b, st); }
100 => { forms::mulc(a, st); forms::rot(b, st); }
101 => { forms::mulc(a, st); forms::xrot(b, st); }
102 => { forms::mulc(a, st); forms::addc(b, st); }
103 => { forms::mulc(a, st); forms::xorc(b, st); }
104 => { forms::mulc(a, st); forms::mulc(b, st); }
105 => { forms::mulc(a, st); forms::mulc2(b, st); }
106 => { forms::mulc(a, st); forms::andx(b, st); }
107 => { forms::mulc(a, st); forms::orx(b, st); }
108 => { forms::mulc2(a, st); forms::add(b, st); }
109 => { forms::mulc2(a, st); forms::sub(b, st); }
110 => { forms::mulc2(a, st); forms::xor(b, st); }
111 => { forms::mulc2(a, st); forms::mul(b, st); }
112 => { forms::mulc2(a, st); forms::rot(b, st); }
113 => { forms::mulc2(a, st); forms::xrot(b, st); }
114 => { forms::mulc2(a, st); forms::addc(b, st); }
115 => { forms::mulc2(a, st); forms::xorc(b, st); }
116 => { forms::mulc2(a, st); forms::mulc(b, st); }
117 => { forms::mulc2(a, st); forms::mulc2(b, st); }
118 => { forms::mulc2(a, st); forms::andx(b, st); }
119 => { forms::mulc2(a, st); forms::orx(b, st); }
120 => { forms::andx(a, st); forms::add(b, st); }
121 => { forms::andx(a, st); forms::sub(b, st); }
122 => { forms::andx(a, st); forms::xor(b, st); }
123 => { forms::andx(a, st); forms::mul(b, st); }
124 => { forms::andx(a, st); forms::rot(b, st); }
125 => { forms::andx(a, st); forms::xrot(b, st); }
126 => { forms::andx(a, st); forms::addc(b, st); }
127 => { forms::andx(a, st); forms::xorc(b, st); }
128 => { forms::andx(a, st); forms::mulc(b, st); }
129 => { forms::andx(a, st); forms::mulc2(b, st); }
130 => { forms::andx(a, st); forms::andx(b, st); }
131 => { forms::andx(a, st); forms::orx(b, st); }
132 => { forms::orx(a, st); forms::add(b, st); }
133 => { forms::orx(a, st); forms::sub(b, st); }
134 => { forms::orx(a, st); forms::xor(b, st); }
135 => { forms::orx(a, st); forms::mul(b, st); }
136 => { forms::orx(a, st); forms::rot(b, st); }
137 => { forms::orx(a, st); forms::xrot(b, st); }
138 => { forms::orx(a, st); forms::addc(b, st); }
139 => { forms::orx(a, st); forms::xorc(b, st); }
140 => { forms::orx(a, st); forms::mulc(b, st); }
141 => { forms::orx(a, st); forms::mulc2(b, st); }
142 => { forms::orx(a, st); forms::andx(b, st); }
143 => { forms::orx(a, st); forms::orx(b, st); }
_ => unreachable!(),
}
}
for ins in it.remainder() {
run_instr(ins, st);
}
}
/// The scalar reference: one instruction on one 16-word state, the text the kernels carry (`emit.rs`,
/// `derive_instr_text`) restated in Rust. The tests pin the SoA interpreter against it.
pub fn run_round_scalar(prog: &[DInstr], s: &mut [u32; DERIVE_REGS]) {
for ins in prog {
let d = ins.dst as usize;
let c = s[ins.src as usize];
match ins.op {
DOp::Add => s[d] = s[d].wrapping_add(c),
DOp::Sub => s[d] = s[d].wrapping_sub(c),
DOp::Xor => s[d] ^= c,
DOp::Mul => s[d] = s[d].wrapping_mul(c | 1),
DOp::Rot => s[d] = rotl(s[d], ins.rot as u32).wrapping_add(c),
DOp::XRot => s[d] = rotl(s[d] ^ c, ins.rot as u32),
DOp::AddC => s[d] = s[d].wrapping_add(c.wrapping_add(ins.imm)),
DOp::XorC => s[d] ^= c ^ ins.imm,
DOp::MulC => s[d] = (s[d] ^ c).wrapping_mul(ins.imm),
DOp::MulC2 => s[d] = s[d].wrapping_mul(ins.imm).wrapping_add(c),
DOp::AndX => s[d] ^= c & s[ins.src2 as usize],
DOp::OrX => s[d] = s[d].wrapping_add(c | s[ins.src2 as usize]),
}
}
}
/// The source text of one instruction in the C-family dialects (the same text in Metal, CUDA C and OpenCL C:
/// `s` is the 16-word state, `mh_rotl` the rotate of the memhard core).
pub fn instr_text(ins: &DInstr) -> String {
let (d, c, b) = (ins.dst, ins.src, ins.src2);
match ins.op {
DOp::Add => format!("s[{d}] += s[{c}];"),
DOp::Sub => format!("s[{d}] -= s[{c}];"),
DOp::Xor => format!("s[{d}] ^= s[{c}];"),
DOp::Mul => format!("s[{d}] *= (s[{c}] | 1u);"),
DOp::Rot => format!("s[{d}] = mh_rotl(s[{d}], {}u) + s[{c}];", ins.rot),
DOp::XRot => format!("s[{d}] = mh_rotl(s[{d}] ^ s[{c}], {}u);", ins.rot),
DOp::AddC => format!("s[{d}] += s[{c}] + {:#010x}u;", ins.imm),
DOp::XorC => format!("s[{d}] ^= s[{c}] ^ {:#010x}u;", ins.imm),
DOp::MulC => format!("s[{d}] = (s[{d}] ^ s[{c}]) * {:#010x}u;", ins.imm),
DOp::MulC2 => format!("s[{d}] = s[{d}] * {:#010x}u + s[{c}];", ins.imm),
DOp::AndX => format!("s[{d}] ^= (s[{c}] & s[{b}]);"),
DOp::OrX => format!("s[{d}] += (s[{c}] | s[{b}]);"),
}
}
/// One instruction as a line of program.json: `"add d=3 c=0"`, `"mulc d=5 c=3 imm=0x..."`.
pub fn instr_line(ins: &DInstr) -> String {
let mut s = format!("{} d={} c={}", ins.op.name(), ins.dst, ins.src);
if ins.op.has_third() {
s.push_str(&format!(" b={}", ins.src2));
}
if ins.op.has_rot() {
s.push_str(&format!(" k={}", ins.rot));
}
if ins.op.has_imm() {
s.push_str(&format!(" imm={:#010x}", ins.imm));
}
s
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn weights_sum_and_ops() {
assert_eq!(DOP_WEIGHTS.iter().map(|(_, w)| w).sum::<u64>(), 100);
for (i, (op, _)) in DOP_WEIGHTS.iter().enumerate() {
assert_eq!(*op as usize, i);
assert_eq!(DOp::from_u8(i as u8), Some(*op));
}
assert_eq!(DOp::for_roll(0), DOp::Add);
assert_eq!(DOp::for_roll(13), DOp::Add);
assert_eq!(DOp::for_roll(14), DOp::Sub);
assert_eq!(DOp::for_roll(99), DOp::OrX);
// the expected chip operations per instruction, 1.52 (1.62 on a GPU), put 736 x 9 over the x8 floors
let mean: f64 = DOP_WEIGHTS.iter().map(|(o, w)| o.chip_ops() as f64 * *w as f64 / 100.0).sum();
assert!((mean - 1.52).abs() < 1e-9, "{mean}");
let gpu_mean: f64 = DOP_WEIGHTS.iter().map(|(o, w)| o.gpu_ops() as f64 * *w as f64 / 100.0).sum();
assert!((gpu_mean - 1.62).abs() < 1e-9, "{gpu_mean}");
assert!(9.0 * DERIVE_LEN_X8 as f64 * mean > OPS_FLOOR_X8 as f64);
assert!(9.0 * DERIVE_LEN_X8 as f64 * gpu_mean > GPU_OPS_FLOOR_X8 as f64);
assert_eq!(DeriveProgram::floors(DERIVE_LEN_X8), (9_216, 10_368, 1_152));
assert_eq!(DeriveProgram::floors(368), (4_608, 5_184, 576));
let mul_share: f64 = DOP_WEIGHTS.iter().filter(|(o, _)| o.is_mul()).map(|(_, w)| *w as f64 / 100.0).sum();
assert!(9.0 * DERIVE_LEN_X8 as f64 * mul_share > MULS_FLOOR_X8 as f64);
}
#[test]
fn draw_is_structural_and_accepted() {
let mut rng = SplitMix64::new(0x1234_5678_9abc_def0);
let p = DeriveProgram::draw(&mut rng, DERIVE_LEN_X8);
assert_eq!(p.attempt, 0, "the first candidate of this seed passes");
assert_eq!(p.rounds.len(), DERIVE_PROGRAMS);
assert_eq!(p.instr_count(), 9 * DERIVE_LEN_X8 as u64);
assert!(p.check().is_ok());
assert!(p.chip_ops() >= OPS_FLOOR_X8 && p.gpu_ops() >= GPU_OPS_FLOOR_X8 && p.muls() >= MULS_FLOOR_X8);
assert!(p.gpu_ops() > p.chip_ops());
// every instruction consumes the newest result
for prog in &p.rounds {
let mut chain = 0u8;
for ins in prog {
assert_eq!(ins.src, chain);
assert_ne!(ins.dst, chain);
chain = ins.dst;
}
}
// four draws per instruction: the same program again from the same seed, and a different one one draw on
let mut rng2 = SplitMix64::new(0x1234_5678_9abc_def0);
assert_eq!(DeriveProgram::draw(&mut rng2, DERIVE_LEN_X8), p);
let mut rng3 = SplitMix64::new(0x1234_5678_9abc_def0);
rng3.next();
assert_ne!(DeriveProgram::draw(&mut rng3, DERIVE_LEN_X8), p);
}
#[test]
fn soa_matches_scalar_and_is_a_bijection() {
let mut rng = SplitMix64::new(7);
let p = DeriveProgram::draw(&mut rng, 64);
let mut st: SoaState = [[0u32; SOA_LANES]; DERIVE_REGS];
let mut scalars = [[0u32; DERIVE_REGS]; SOA_LANES];
let mut x = SplitMix64::new(99);
for k in 0..SOA_LANES {
for r in 0..DERIVE_REGS {
let v = x.next() as u32;
st[r][k] = v;
scalars[k][r] = v;
}
}
let before = scalars;
for prog in &p.rounds {
run_round(prog, &mut st);
for k in 0..SOA_LANES {
run_round_scalar(prog, &mut scalars[k]);
}
}
for k in 0..SOA_LANES {
for r in 0..DERIVE_REGS {
assert_eq!(st[r][k], scalars[k][r], "lane {k} reg {r}");
}
}
// distinct inputs stay distinct (a bijection on the state, spot-checked: 32 lanes, no collision)
for a in 0..SOA_LANES {
for b in a + 1..SOA_LANES {
assert_ne!(scalars[a], scalars[b]);
assert_ne!(before[a], before[b]);
}
}
}
#[test]
fn acceptance_rejects_degenerate_draws() {
let mut rng = SplitMix64::new(3);
let mut p = DeriveProgram::draw(&mut rng, 64);
// a register never written: make every write of round 2 go to the chain's neighbour
let mut q = p.clone();
for ins in q.rounds[2].iter_mut() {
ins.dst = if ins.src == 1 { 2 } else { 1 };
}
let mut chain = 0u8;
for ins in q.rounds[2].iter_mut() {
ins.src = chain;
ins.dst = if chain == 1 { 2 } else { 1 };
chain = ins.dst;
}
assert!(matches!(q.check(), Err(DeriveReject::RegisterNeverWritten { round: 2, .. })));
// all rotations equal
let mut q = p.clone();
for ins in q.rounds.iter_mut().flatten() {
if ins.op.has_rot() {
ins.rot = 5;
}
}
assert!(matches!(q.check(), Err(DeriveReject::RotationsDegenerate { distinct: 1 })));
// every op an add apart from the xor-rotates (so the rotations stay distinct): under the ops floor
for ins in p.rounds.iter_mut().flatten() {
if ins.op != DOp::XRot {
ins.op = DOp::Add;
ins.rot = 0;
ins.imm = 0;
ins.src2 = 0;
}
}
assert!(matches!(p.check(), Err(DeriveReject::OpsUnderFloor { .. })), "{:?}", p.check());
// no multiplies at all but the ops floor met: under the multiply floor
let mut q = DeriveProgram::draw(&mut SplitMix64::new(11), 64);
for ins in q.rounds.iter_mut().flatten() {
if ins.op.is_mul() {
ins.op = DOp::AddC;
}
}
assert!(matches!(q.check(), Err(DeriveReject::MulsUnderFloor { .. })), "{:?}", q.check());
}
#[test]
fn text_forms() {
let i = DInstr { op: DOp::MulC, dst: 5, src: 3, src2: 0, rot: 0, imm: 0x9e37_79b9 };
assert_eq!(instr_text(&i), "s[5] = (s[5] ^ s[3]) * 0x9e3779b9u;");
assert_eq!(instr_line(&i), "mulc d=5 c=3 imm=0x9e3779b9");
let i = DInstr { op: DOp::XRot, dst: 0, src: 15, src2: 0, rot: 17, imm: 0 };
assert_eq!(instr_text(&i), "s[0] = mh_rotl(s[0] ^ s[15], 17u);");
let i = DInstr { op: DOp::AndX, dst: 2, src: 9, src2: 14, rot: 0, imm: 0 };
assert_eq!(instr_text(&i), "s[2] ^= (s[9] & s[14]);");
}
}

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,43 @@
//! igneum-pow: the Igneum lottery hash, bit-exact with the Swift prototype in `proto-metal/main.swift`.
//!
//! The crate has five parts, each mirroring one section of the prototype:
//!
//! * [`seed`]: the 32-byte seed words from a string (FNV-1a 64, four salts) and the SplitMix64 stream.
//! * [`generator`]: the 64-instruction program drawn from a seed (version 2: 16 load slots, fresh sources).
//! * [`accept`]: the acceptance rule every candidate program must pass; a rejected candidate is replaced by the
//! next attempt of the same seed.
//! * [`memhard`]: the 256 MiB ChaCha12 cache and the 8-round dataset item derivation (`proto-metal/MEMHARD.md`).
//! * [`derive`]: the per-day item-derivation program of Counter ASIC 3.0 item 2 (a prototype behind a load class).
//! * [`verify`]: the 32-lane warp interpreter that computes the 64-bit hash on the CPU, deriving dataset
//! words on demand from the cache (or from the closed form, for the old packs).
//! * [`emit`]: the Metal, CUDA and OpenCL kernel text for a program, byte-identical to the Swift exporter.
//! * [`bind`]: the header binding (init words from the pre-PoW header hash and the nonce) and the 256-bit mapping.
//!
//! Nothing here depends on a crate outside the standard library. The integration points for the
//! rusty-kaspa fork (`docs/fork-map.md`) are [`verify::Epoch`], [`verify::Epoch::verify_block`] and
//! [`verify::Epoch::hash_warp`]; the node hands [`emit::Pack`] files to miners.
// The lane loops are written index style on purpose so they read like the kernels they mirror, and the
// SplitMix64 `next` keeps the Swift name.
#![allow(clippy::needless_range_loop, clippy::should_implement_trait, clippy::large_enum_variant)]
#![allow(clippy::manual_slice_size_calculation, clippy::too_many_arguments)]
pub mod accept;
pub mod bind;
pub mod blake2b;
pub mod derive;
pub mod emit;
pub mod generator;
pub mod memhard;
pub mod packcheck;
pub mod seed;
pub mod state;
pub mod verify;
pub use bind::{block_init_words, day_bytes, pow256_from_lane, target64_from_le256};
pub use accept::{check as accept_program, AcceptReport, Reject};
pub use generator::{generate, generate_from_seed_bytes, generate_from_seed_bytes_program_class, generate_from_seed_bytes_program_class_shadow, v4_class_at, v4_counted_ops, v4_rung_reps, v5_class_at, v5_rung_reps, Instr, LoadClass, Op, Program, ProgramClass, GENERATOR_VERSION, GENERATOR_VERSION_V3, GENERATOR_VERSION_V4, GENERATOR_VERSION_V5, V3_CLASS, V4_CLASS, V4_SHADOW_INSTRS, V4_SHADOW_REPS, V5_CLASS, PROGRAM_SUBVERSION_V4};
pub use memhard::{cache_log2_words, dataset_log2_words, days_since_genesis, growth_doublings, Cache, MemhardCpu, MixParams, Shape};
pub use seed::{fnv1a64, seed_words, SplitMix64};
pub use state::{StateLeaves, StateStream};
pub use verify::{hash_warp, interpret_warp_init, verify_block, DatasetMode, DatasetSource, Epoch};

View file

@ -0,0 +1,502 @@
//! igneum-pow CLI.
//!
//! igneum-pow bench --seed <s> [--day <d>] [--closed-form] [--dataset-log2 28] [--warps 20]
//! igneum-pow export --seed <s> --out <dir> [--day <d>] [--closed-form] [--dataset-log2 28] [--epoch-hex <64 hex> --day-hex <hex>]
//! igneum-pow hash --seed <s> --nonce <n> [--day <d>] [--closed-form] [--dataset-log2 28]
//! igneum-pow hash-bound --seed <s> --prehash <64 hex> --nonce <u64> [--day <d>] [--closed-form] [--dataset-log2 28]
//! [--epoch-hex <64 hex> --day-hex <hex>] byte seeds instead of strings (Epoch::from_seed_bytes)
//! igneum-pow accept --seed <s> [--epoch-hex <64 hex>] every candidate of the seed with its verdict (spec 01 section 1.4.6)
//! igneum-pow show --seed <s> [--epoch-hex <64 hex>] the accepted program, one instruction per line
//!
//! Read-width experiment (5 October 2026, docs/plans/read-width.md): `--class v2|w4|w16|w64|w64x4|p4,p16,p64[xN]`
//! on every command selects the load class (default v2, the lottery hash). Nothing in a v2 run changes.
//!
//! Era layout (5 October 2026, docs/plans/era-layout.md): `--era igneum-era-test/<n>` (a test era seed: the 32 bytes
//! of seed_words_from_bytes of the string, era index n) or `--era <n>:<64 hex>` (the chain's 32-byte era seed E_n)
//! turns the chosen class into its era class; `--era-widths 4` (default: the read-width decision of 5 October 2026
//! keeps v2's 4-byte load) is the allowed width set the era draws from; `4,16,64` lets the era draw the width.
use igneum_pow::generator::{EraParams, GENERATOR_VERSION_V3};
use igneum_pow::emit::export_pack;
use igneum_pow::generator::{LoadClass, ProgramClass};
use igneum_pow::memhard::{Cache, Shape};
use igneum_pow::seed::day_key;
use igneum_pow::verify::{DatasetMode, DatasetSource, Epoch, DEFAULT_DATASET_LOG2};
use std::time::Instant;
struct Args {
cmd: String,
seed: String,
day: String,
out: Option<String>,
closed_form: bool,
dataset_log2: u32,
warps: usize,
nonce: u64,
/// `hash-bound --count N`: N consecutive nonces from --nonce, one epoch build (gate G2, 5 October 2026).
count: u64,
prehash: String,
epoch_hex: Option<String>,
day_hex: Option<String>,
/// Class v5: the window's state stream file (`--state <file>`, the IGSD1 format of `igneum_pow::state`), whose
/// leaves every item of the dataset is keyed by.
state: Option<String>,
class: LoadClass,
/// Days since genesis for the cache growth rule of a class with `growth` (0: the genesis cache).
days: u64,
/// The program class (Counter ASIC 2.0 seam): v2 (default), v3 (V3_CLASS, generator 3) or v4 (V4_CLASS, generator 4).
program_class: Option<ProgramClass>,
/// The shadow pass count of a class v4 program at a rung of the latency ladder (`--shadow-reps`, 0 = the class's
/// own 27; `docs/design/latency-ladder.md`); read under `--program-class v4` only.
shadow_reps: u16,
/// The era seed bytes a class v3 chain program records (`--era-hex`).
era_hex: Option<String>,
/// Era layout: `--era igneum-era-test/<n>` or `--era <n>:<64 hex>` composes the era class over `--class` with
/// generator 3 and the era bytes recorded (the measurement packs: v2's mixer under the era layout).
era: Option<(u64, Vec<u8>, String)>,
era_widths: Vec<u8>,
}
/// `igneum-era-test/<n>` or `<n>:<64 hex>` -> (index, 32 era bytes, label).
fn parse_era(s: &str) -> Option<(u64, Vec<u8>, String)> {
if let Some(n) = s.strip_prefix("igneum-era-test/") {
let index: u64 = n.parse().ok()?;
return Some((index, EraParams::test_era_bytes(s).to_vec(), s.to_string()));
}
let (n, hex) = s.split_once(':')?;
let index: u64 = n.parse().ok()?;
let bytes = igneum_pow::bind::unhex(hex)?;
if bytes.len() != 32 {
return None;
}
Some((index, bytes, format!("igneum-era/{index}/{hex}")))
}
/// "4,16,64" (bytes) -> ascending words.
fn parse_widths(s: &str) -> Option<Vec<u8>> {
let mut v: Vec<u8> = s
.split(',')
.map(|x| match x.trim() {
"4" => Some(1u8),
"16" => Some(4),
"64" => Some(16),
_ => None,
})
.collect::<Option<Vec<_>>>()?;
v.sort_unstable();
v.dedup();
if v.is_empty() {
return None;
}
Some(v)
}
fn usage() -> ! {
eprintln!(
"igneum-pow <bench|export|hash> --seed <string> [--day 2026-10-03] [--closed-form] [--dataset-log2 28]\n\
\x20 bench [--warps 20] fill the cache, then time the CPU verifier per 32-lane warp\n\
\x20 export --out <dir> write the program pack (kernel.cu, kernel.cl, program.metal, memhard.h, ...)\n\
\x20 hash --nonce <n> print the 64-bit hash of one nonce (pack form, init words = seed words)\n\
\x20 hash-bound --prehash <64 hex> --nonce <u64> [--count N] print the header-bound hash (bind.rs) of one 64-bit nonce (N consecutive: \"nonce hash\" lines)\n\
\x20 accept every candidate of the seed (or --epoch-hex) with its acceptance verdict\n\
\x20 show the accepted program, one instruction per line\n\
\x20 --class C load class: v2 (default), mx4, mx8 (class v3: mixer x8, cache growth), dr<len> (Counter ASIC 3.0 item 2: the per-day derivation program, dr736 = the x8-equivalent), w4, w16, w64, w64x4, p4,p16,p64[xN], <class>m<mult>[g]\n\
\x20 also: w4, w16, w64, w64x4, p4,p16,p64[xN], <class>m<mult>[g], <class>+sh<S>x<R> (latency-shadow block of S ALU instructions x R passes per iteration, Counter ASIC 3.0 item 8)\n\
\x20 --days N days since genesis for the cache growth rule of a class with it (default 0: the 2^26-word cache)\n\
\x20 --program-class v2|v3|v4|v5 the program class of the seam (v3 = generator 3 on V3_CLASS, v4 = generator 4 on V4_CLASS = mx8+sh256x27, v5 = generator 5 on V5_CLASS = mx8+sh256x27+state, the chain's own derivation; --era-hex records the era seed)\n\
\x20 --state <file> class v5 (or any --class ...+state): the window's state stream (IGSD1 file, igneum-day-stream --out), whose leaves key every item\n\
\x20 --shadow-reps N class v4 at a rung of the latency ladder: the shadow block's pass count (0 = the class's own 27; docs/design/latency-ladder.md), with --program-class v4\n\
\x20 --era E era layout over --class: igneum-era-test/<n> or <n>:<64 hex> (the 32-byte era seed E_n)\n\
\x20 --era-widths 4[,16,64] the width set the era draws from, in bytes (default 4: pinned; more lets the era draw it)"
);
std::process::exit(2)
}
fn parse() -> Args {
let mut a = Args {
cmd: String::new(),
seed: "igneum-genesis".into(),
day: "2026-10-03".into(),
out: None,
closed_form: false,
state: None,
dataset_log2: DEFAULT_DATASET_LOG2,
warps: 20,
nonce: 0,
count: 1,
prehash: "00".repeat(32),
epoch_hex: None,
day_hex: None,
class: LoadClass::V2,
days: 0,
program_class: None,
era_hex: None,
shadow_reps: 0,
era: None,
era_widths: vec![1],
};
let mut it = std::env::args().skip(1);
a.cmd = it.next().unwrap_or_else(|| usage());
while let Some(k) = it.next() {
let mut val = || it.next().unwrap_or_else(|| usage());
match k.as_str() {
"--seed" => a.seed = val(),
"--day" => a.day = val(),
"--out" => a.out = Some(val()),
"--closed-form" => a.closed_form = true,
"--dataset-log2" => a.dataset_log2 = val().parse().unwrap_or_else(|_| usage()),
"--warps" => a.warps = val().parse().unwrap_or_else(|_| usage()),
"--nonce" => a.nonce = val().parse().unwrap_or_else(|_| usage()),
"--count" => a.count = val().parse().unwrap_or_else(|_| usage()),
"--prehash" => a.prehash = val(),
"--epoch-hex" => a.epoch_hex = Some(val()),
"--day-hex" => a.day_hex = Some(val()),
"--class" => a.class = LoadClass::parse(&val()).unwrap_or_else(|| usage()),
"--days" => a.days = val().parse().unwrap_or_else(|_| usage()),
"--program-class" => a.program_class = Some(ProgramClass::parse(&val()).unwrap_or_else(|| usage())),
"--state" => a.state = Some(val()),
"--era-hex" => a.era_hex = Some(val()),
"--shadow-reps" => a.shadow_reps = val().parse().unwrap_or_else(|_| usage()),
"--era" => a.era = Some(parse_era(&val()).unwrap_or_else(|| usage())),
"--era-widths" => a.era_widths = parse_widths(&val()).unwrap_or_else(|| usage()),
_ => usage(),
}
}
if let Some((_, bytes, _)) = &a.era {
a.class = LoadClass::era(a.class, bytes, &a.era_widths);
}
a
}
/// An era program is a class v3 program: generator 3 and the era bytes recorded (what the chain's
/// `Epoch::from_chain_seeds` does); the pack then carries IGNEUM_PROGRAM_CLASS "v3" and IGNEUM_ERA_SEED_HEX.
fn stamp_era(e: &mut Epoch, a: &Args) {
if let Some((_, bytes, _)) = &a.era {
// generator 4 on V4_CLASS (class v4, Counter ASIC 3.0), 3 on every other era program
e.program.generator = igneum_pow::generator::era_generator_of(&e.program.class);
e.program.era_bytes = Some(bytes.clone());
}
}
fn main() {
let a = parse();
let mode = if a.closed_form { DatasetMode::ClosedForm } else { DatasetMode::MemoryHard };
match a.cmd.as_str() {
"bench" => bench(&a, mode),
"export" => export(&a, mode),
"accept" => accept(&a),
"show" => show(&a),
"hash" => {
let (e, _) = epoch_of(&a, mode);
println!("{:016x}", e.hash(a.nonce as u32));
}
"hash-bound" => {
let bytes = igneum_pow::bind::unhex(&a.prehash).unwrap_or_else(|| usage());
let prehash: [u8; 32] = bytes.as_slice().try_into().unwrap_or_else(|_| usage());
// --epoch-hex / --day-hex: the chain's byte seeds (Epoch::from_seed_bytes), as the worker protocol carries them
let (e, _) = epoch_of(&a, mode);
if a.count > 1 {
// gate G2 (5 October 2026, ported from branch ca2-era for the class v4 gate run): `--count N` prints
// "nonce hash" for N consecutive 64-bit nonces from --nonce, one epoch build, to re-hash a worker's
// found lines (the same prehash, target ff..ff)
for k in 0..a.count {
let n = a.nonce.wrapping_add(k);
println!("{n} {:016x}", e.hash_bound(&prehash, n));
}
return;
}
let init = igneum_pow::bind::block_init_words(&prehash, a.nonce);
println!("init words {}", init.iter().map(|w| format!("{w:08x}")).collect::<Vec<_>>().join(" "));
println!("{:016x}", e.hash_bound(&prehash, a.nonce));
}
_ => usage(),
}
}
/// The epoch every command works on, and the day label for packs. `--epoch-hex`/`--day-hex` give the chain's byte
/// seeds (the day label then names the day bytes); else the string seed and day. `--program-class v3` draws the
/// program through the seam (generator 3 on `V3_CLASS`, the era bytes of `--era-hex` recorded) and sizes the
/// dataset for `--days` through `Epoch::chain_dataset_day`; `--class` is ignored under a program class (the class
/// names the load class). Closed-form mode is only for string seeds under the default class.
fn epoch_of(a: &Args, mode: DatasetMode) -> (Epoch, String) {
let (mut e, label) = epoch_of_class(a, mode);
stamp_era(&mut e, a);
// class v5: the leaves of --state, built for the dataset's size; a state class without --state is refused here
// rather than at the first derivation
if e.program.class.state {
let Some(path) = &a.state else {
eprintln!("class {} keys every item by the window's state: give --state <stream file> (igneum-day-stream --out)", e.program.class.name());
std::process::exit(2);
};
let stream = igneum_pow::state::StateStream::read_file(std::path::Path::new(path)).unwrap_or_else(|err| {
eprintln!("{err}");
std::process::exit(2)
});
let leaves = igneum_pow::state::StateLeaves::from_stream(&stream, e.dataset.log2_words);
eprintln!(
"state stream {}: chain block {} {}, root {}, {} records, {} leaves{}",
path,
stream.number,
igneum_pow::emit::hex_bytes(&stream.block),
igneum_pow::emit::hex_bytes(&stream.root),
stream.records.len(),
leaves.n(),
if leaves.sampled { " (sampled)" } else { "" }
);
e.dataset = e.dataset.with_leaves(std::sync::Arc::new(leaves));
} else if a.state.is_some() {
eprintln!("--state given for a class without state leaves ({}); use --program-class v5 or --class <class>+state", e.program.class.name());
std::process::exit(2);
}
(e, label)
}
fn epoch_of_class(a: &Args, mode: DatasetMode) -> (Epoch, String) {
let era = a.era_hex.as_ref().map(|h| igneum_pow::bind::unhex(h).unwrap_or_else(|| usage()));
match (&a.epoch_hex, &a.day_hex) {
(Some(eh), Some(dh)) => {
let eb = igneum_pow::bind::unhex(eh).unwrap_or_else(|| usage());
let db = igneum_pow::bind::unhex(dh).unwrap_or_else(|| usage());
let label = format!("igneum-epoch/{eh}/day/{dh}");
let e = match a.program_class {
Some(pc) => Epoch {
program: Epoch::chain_program_shadow(&eb, era.as_deref(), pc, a.shadow_reps, &label),
dataset: Epoch::chain_dataset_day(&db, pc, a.days, a.dataset_log2),
},
None => Epoch::from_seed_bytes_day(&eb, &db, &label, a.class, a.days, a.dataset_log2),
};
(e, format!("bytes:{dh}"))
}
_ => {
let e = match a.program_class {
Some(pc) => {
let program = igneum_pow::generator::generate_from_seed_bytes_program_class_shadow(&a.seed, a.seed.as_bytes(), pc, era.as_deref(), a.shadow_reps);
let lc = pc.load_class();
let shape = Shape::for_class_day(&lc, a.days);
let log2 = if lc.growth { igneum_pow::memhard::dataset_log2_words(a.dataset_log2, a.days) } else { a.dataset_log2 };
Epoch { program, dataset: DatasetSource::new_shape(&a.day, mode, log2, shape) }
}
None => Epoch::new_class_day(&a.seed, &a.day, mode, a.dataset_log2, a.class, a.days),
};
(e, a.day.clone())
}
}
}
fn bench(a: &Args, mode: DatasetMode) {
println!(
"igneum-pow bench: seed \"{}\", day \"{}\", dataset 2^{} words ({})",
a.seed,
a.day,
a.dataset_log2,
mode.name()
);
let shape = Shape::for_class_day(&a.program_class.map(|pc| pc.load_class()).unwrap_or(a.class), a.days);
if mode == DatasetMode::MemoryHard {
// Time the cache fill on its own first (one core), then build the epoch (which fills it again).
let t0 = Instant::now();
let c = Cache::fill_log2(day_key(&a.day), shape.cache_log2_words);
let fill_ms = t0.elapsed().as_secs_f64() * 1e3;
println!(
"cache: fill {fill_ms:.1} ms on one core (2^{} words, {} MiB, {} chains of 64 ChaCha12 blocks), FNV-1a 64 {:016x}",
shape.cache_log2_words,
shape.cache_words() * 4 / (1 << 20),
c.segments(),
c.fnv1a64()
);
drop(c);
}
if let Some(h) = a.class.hot {
// the hot table of the epoch on its own first (one core), then the epoch (which fills it again)
let t0 = Instant::now();
let t = igneum_pow::memhard::HotTable::for_seed_bytes(a.seed.as_bytes(), h.mb as u32);
let fill_ms = t0.elapsed().as_secs_f64() * 1e3;
println!("hot table: {} MiB filled in {fill_ms:.1} ms on one core ({} chains of 64 ChaCha12 blocks), FNV-1a 64 {:016x}", h.mb, igneum_pow::memhard::hot_segments(h.mb as u32), t.fnv1a64());
}
let t0 = Instant::now();
let (e, _) = epoch_of(a, mode);
let build_ms = t0.elapsed().as_secs_f64() * 1e3;
println!(
"program: class {}, {} loads/hash, {} bytes/hash, widths (1,4,16 words) {:?}, {} items/warp, mixer x{} ({} mixers/item), cache 2^{} words, op mix {}; epoch built in {build_ms:.1} ms",
e.program.class.name(),
e.program.loads_per_hash(),
e.program.bytes_per_hash(),
e.program.width_counts(),
e.program.items_per_warp(),
shape.mixer_mult,
shape.mixers_per_item(),
shape.cache_log2_words,
e.program.op_mix()
);
if let Some(dp) = e.dataset.memhard().and_then(|m| m.params.derive.as_ref()) {
// Counter ASIC 3.0 item 2: the day's derivation program
println!(
"derivation program: {} instructions per round program, {} per item ({} GPU ops, {} chip ops, {} multiplies per item), attempt {}, fingerprint {:016x}, op mix {}",
dp.len,
dp.instr_count(),
dp.gpu_ops(),
dp.chip_ops(),
dp.muls(),
dp.attempt,
dp.fingerprint(),
dp.op_mix()
);
}
if e.program.has_shadow() {
println!(
"shadow: {} instructions x {} passes per iteration, {} shadow instructions per hash, op mix {}",
e.program.shadow.len(),
e.program.shadow_reps(),
e.program.shadow_instrs_per_hash(),
e.program.shadow_op_mix()
);
}
let bases = [0u32, 4096, 1_000_000];
for &b in &bases {
let t = Instant::now();
let r = e.interpret_warp(b);
let ms = t.elapsed().as_secs_f64() * 1e3;
println!(
"warp base {b}: single cold run {ms:.3} ms, {} items derived, lane0 {:016x} lane31 {:016x}",
r.items_derived, r.hashes[0], r.hashes[31]
);
}
let n = a.warps.max(1);
let t = Instant::now();
let mut sink = 0u64;
for i in 0..n {
let w = e.hash_warp((i as u32) * 32 + 65536);
sink ^= w[0];
}
let avg = t.elapsed().as_secs_f64() * 1e3 / n as f64;
println!("CPU verify: {avg:.3} ms per 32-lane warp, avg of {n} (checksum {sink:016x})");
}
fn export(a: &Args, mode: DatasetMode) {
let out = a.out.clone().unwrap_or_else(|| usage());
let t0 = Instant::now();
// --epoch-hex / --day-hex: the chain's byte seeds; the day label then names the day bytes
let (e, day_label) = epoch_of(a, mode);
let build_ms = t0.elapsed().as_secs_f64() * 1e3;
println!("igneum-pow export {out}");
println!(
"seed \"{}\", day \"{}\", dataset 2^{} words ({}), generator v{} attempt {} program id {:016x}, loads/hash {}; epoch built in {build_ms:.1} ms",
e.program.seed_string,
day_label,
e.dataset.log2_words,
e.dataset.mode().name(),
e.program.generator,
e.program.attempt,
e.program.program_id(),
e.program.loads_per_hash()
);
println!("op mix: {}; class {}, {} bytes/hash, widths (1,4,16 words) {:?}", e.program.op_mix(), e.program.class.name(), e.program.bytes_per_hash(), e.program.width_counts());
let source = format!("igneum-pow (Rust) CPU interpreter, generator v{}, {} dataset", e.program.generator, e.dataset.mode().name());
let pack = export_pack(&e, &day_label, &source);
let dir = std::path::Path::new(&out);
if let Err(err) = pack.write_to(dir) {
eprintln!("FAIL: write error {err}");
std::process::exit(1);
}
for (name, text) in &pack.files {
println!("wrote {}/{name} ({} bytes)", dir.display(), text.len());
}
for (i, b) in pack.bases.iter().enumerate() {
println!("vector warp base {b}: lane0 {:016x} lane31 {:016x}", pack.outs[i][0], pack.outs[i][31]);
}
if e.dataset.mode() == DatasetMode::MemoryHard {
println!("cache FNV-1a 64 {:016x}", pack.vectors.cache_fnv);
}
println!("OVERALL: PASS (pack written)");
}
fn seed_bytes_of(a: &Args) -> (String, Vec<u8>) {
match &a.epoch_hex {
Some(eh) => (format!("igneum-epoch/{eh}"), igneum_pow::bind::unhex(eh).unwrap_or_else(|| usage())),
None => (a.seed.clone(), a.seed.as_bytes().to_vec()),
}
}
fn accept(a: &Args) {
let (label, bytes) = seed_bytes_of(a);
let t0 = Instant::now();
let tries = igneum_pow::generator::attempts_class(&label, &bytes, a.class);
let ms = t0.elapsed().as_secs_f64() * 1e3;
for (p, verdict) in &tries {
match verdict {
Ok(()) => {
let r = igneum_pow::accept::check(p).unwrap();
println!(
"attempt {}: ACCEPTED program id {:016x}, op mix {}, distinct {:.3} per hash, saturated {}, bias max {}",
p.attempt,
p.program_id(),
p.op_mix(),
r.distinct_mean(),
r.saturated,
r.bias_max
);
}
Err(r) => println!("attempt {}: rejected, {r}", p.attempt),
}
}
println!("{} candidates in {ms:.2} ms", tries.len());
}
fn show(a: &Args) {
let (label, bytes) = seed_bytes_of(a);
// --program-class: the chain's own derivation (the era from --era-hex), as the node and the miner draw it; else
// the load class of --class, the era of --era composed over it
let era_hex_bytes = a.era_hex.as_deref().map(|h| igneum_pow::bind::unhex(h).unwrap_or_else(|| usage()));
let mut p = match a.program_class {
Some(pc) => igneum_pow::generator::generate_from_seed_bytes_program_class_shadow(&label, &bytes, pc, era_hex_bytes.as_deref(), a.shadow_reps),
None => igneum_pow::generator::generate_from_seed_bytes_class(&label, &bytes, a.class),
};
if let (None, Some((_, eb, _))) = (a.program_class, &a.era) {
p.generator = igneum_pow::generator::era_generator_of(&p.class);
p.era_bytes = Some(eb.clone());
}
println!(
"seed \"{}\" generator v{} class {} attempt {} program id {:016x} seed words {}",
p.seed_string,
p.generator,
p.class.name(),
p.attempt,
p.program_id(),
p.seed.iter().map(|w| format!("{w:08x}")).collect::<Vec<_>>().join(" ")
);
println!("op mix {} loads/hash {} bytes/hash {}", p.op_mix(), p.loads_per_hash(), p.bytes_per_hash());
if let Some(e) = p.class.era {
println!(
"era {} ({}): width {} B, stride mul {:#010x} rot {}, interleave {:?}, windows (site:shrink:offset) {}",
e.label(),
a.era.as_ref().map(|x| x.2.as_str()).unwrap_or("?"),
e.width_words as u32 * 4,
e.stride_mul,
e.stride_rot,
e.pos,
p.instrs
.iter()
.enumerate()
.filter(|(_, i)| i.op == igneum_pow::generator::Op::Load)
.map(|(k, i)| format!("{k}:{}:{}", i.win, i.off))
.collect::<Vec<_>>()
.join(" ")
);
}
for (k, i) in p.instrs.iter().enumerate() {
println!(
"{k:2}: {:5} dst={} src={} src2={} imm={:#010x} imm2={:#010x} rot={} bit={} mask={}{}",
i.op.name(),
i.dst,
i.src,
i.src2,
i.imm,
i.imm2,
i.rot,
i.bit,
i.mask,
if i.op == igneum_pow::generator::Op::Load && i.width > 1 { format!(" width={}B", i.width as u32 * 4) } else { String::new() }
);
}
}

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,464 @@
//! A program pack on disk, read the way the one-click workers read it (`proto-cuda/nvrtc/packfile.h`, `pf_load`),
//! and checked against the seeds the node is on.
//!
//! The rule (5 October 2026, the epoch 34 incident on both PCs): a pack's `IGNEUM_SEEDW_INIT` is the seed words of
//! the program's ATTEMPT, `attempt_words(epoch_seed, IGNEUM_PROGRAM_ATTEMPT)`, not the words of the bare seed. The
//! generator retries a rejected candidate with `seed || k_le32` (spec 01 section 1.4.6), so from attempt 1 on the
//! bare-seed words and the pack's words differ. The workers derived the expected words from the bare seed, refused
//! every pack of a retried program ("the epoch seed bytes do not give the pack's IGNEUM_SEEDW_INIT") and the miner
//! and the app restarted them forever. Epoch 34 (seed `009858237e11...`) was the first live epoch whose program is
//! a later attempt. This module is the one place that rule is written in Rust; the miner checks every pack it
//! writes with it before a worker sees the pack, and the tests pin the attempt vectors the C side also pins.
use crate::generator::{attempt_words, ProgramClass};
use crate::seed::seed_words_from_bytes;
use std::fmt;
use std::path::Path;
/// What a pack says about itself.
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct PackIdentity {
pub epoch_hex: String,
pub day_hex: String,
pub attempt: u32,
pub seedw: [u32; 8],
pub keyw: [u32; 8],
/// `IGNEUM_GENERATOR` (2, 3 or 4; a pack without the line is generator 1, which no worker runs).
pub generator: u32,
/// The program class the generator version names (Counter ASIC 2.0).
pub class: ProgramClass,
/// `IGNEUM_ERA_SEED_HEX` when the pack carries one (class v3 chain packs).
pub era_hex: Option<String>,
/// `IGNEUM_STATE_ROOT_HEX` of a class v5 pack (the window's state root the leaves derive from).
pub state_root_hex: Option<String>,
}
/// Why a pack is not the one a worker should mine with. `Display` is the plain-words line the logs carry.
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum PackFault {
/// program.h or seeds.txt is missing or does not parse.
Unreadable(String),
/// A well-formed pack for other seeds than the node's: the pack is stale (or the node moved on).
OutOfDate { pack_epoch: String, pack_day: String, want_epoch: String, want_day: String },
/// The files of one pack contradict each other (seeds.txt against program.h, or the init words against the
/// seeds and the attempt): a half-written or hand-edited pack, or a worker and an exporter on different rules.
Disagree(String),
/// The pack is of another program class than the one the chain is on (spec 01 section 1.4.5: an implementation
/// refuses a pack whose generator version is not its own), or its era seed is not the era the job names.
WrongClass(String),
}
impl fmt::Display for PackFault {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
PackFault::Unreadable(w) => write!(f, "program pack unreadable: {w}"),
PackFault::OutOfDate { pack_epoch, pack_day, want_epoch, want_day } => write!(
f,
"program pack out of date: the pack is for epoch {} day {}, the node is on epoch {} day {}",
short(pack_epoch),
day_label(pack_day),
short(want_epoch),
day_label(want_day)
),
PackFault::Disagree(w) => write!(f, "program pack and its seeds disagree: {w}"),
PackFault::WrongClass(w) => write!(f, "program pack of the wrong class: {w}"),
}
}
}
impl std::error::Error for PackFault {}
fn short(hex: &str) -> &str {
if hex.len() >= 16 {
&hex[..16]
} else {
hex
}
}
/// The day bytes are `igneum-day/` followed by the little-endian day index (`bind::day_bytes`); print the index
/// when the hex has that shape, else the hex.
fn day_label(hex: &str) -> String {
const PREFIX: &str = "69676e65756d2d6461792f"; // "igneum-day/"
if let Some(rest) = hex.strip_prefix(PREFIX) {
if let Some(bytes) = unhex(rest) {
let mut v = 0u64;
for (i, b) in bytes.iter().enumerate().take(8) {
v |= (*b as u64) << (8 * i);
}
return v.to_string();
}
}
hex.to_string()
}
pub fn hex(bytes: &[u8]) -> String {
bytes.iter().map(|b| format!("{b:02x}")).collect()
}
fn unhex(s: &str) -> Option<Vec<u8>> {
if s.len() % 2 != 0 {
return None;
}
(0..s.len()).step_by(2).map(|i| u8::from_str_radix(&s[i..i + 2], 16).ok()).collect()
}
/// `#define NAME <rest of line>` in a header; the value as text, trimmed, with a trailing `//` comment removed.
fn define(text: &str, name: &str) -> Option<String> {
for line in text.lines() {
let t = line.trim_start();
let Some(rest) = t.strip_prefix("#define ") else { continue };
let rest = rest.trim_start();
let Some(after) = rest.strip_prefix(name) else { continue };
if !after.starts_with(|c: char| c.is_whitespace()) {
continue;
}
let v = after.trim();
let v = v.split("//").next().unwrap_or("").trim();
return Some(v.to_string());
}
None
}
fn define_str(text: &str, name: &str) -> Option<String> {
let v = define(text, name)?;
let v = v.strip_prefix('"')?.strip_suffix('"')?;
Some(v.to_string())
}
fn define_u32(text: &str, name: &str) -> Option<u32> {
let v = define(text, name)?;
let v = v.trim_end_matches('u');
if let Some(h) = v.strip_prefix("0x") {
u32::from_str_radix(h, 16).ok()
} else {
v.parse().ok()
}
}
fn define_words(text: &str, name: &str) -> Option<[u32; 8]> {
let v = define(text, name)?;
let inner = v.trim().strip_prefix('{')?.strip_suffix('}')?;
let mut out = [0u32; 8];
let mut n = 0;
for part in inner.split(',') {
let p = part.trim().trim_end_matches('u');
if p.is_empty() {
continue;
}
if n >= 8 {
return None;
}
out[n] = if let Some(h) = p.strip_prefix("0x") { u32::from_str_radix(h, 16).ok()? } else { p.parse().ok()? };
n += 1;
}
(n == 8).then_some(out)
}
/// One `key value` line of seeds.txt.
fn seeds_line(text: &str, key: &str) -> Option<String> {
text.lines().find_map(|l| l.strip_prefix(key).and_then(|r| r.strip_prefix(' ')).map(|v| v.trim().to_string()))
}
/// Checks the texts of a pack (program.h, and seeds.txt when it exists) against the seeds a worker will be asked
/// to mine with. Pure: the miner and the tests call it with file contents.
pub fn verify_pack_texts(program_h: &str, seeds_txt: Option<&str>, want_epoch: &[u8], want_day: &[u8]) -> Result<PackIdentity, PackFault> {
verify_pack_texts_chain(program_h, seeds_txt, want_epoch, want_day, None, None)
}
/// [`verify_pack_texts`] that also demands a program class and, for class v3 and v4, the era seed the chain is on
/// (Counter ASIC 2.0, 5 October 2026; class v4 Counter ASIC 3.0, 6 October 2026). `want_class` `None` accepts any
/// class; `want_era` `None` skips the era. A pack whose `IGNEUM_GENERATOR` is not 2, 3 or 4 is refused whatever is wanted.
pub fn verify_pack_texts_chain(
program_h: &str,
seeds_txt: Option<&str>,
want_epoch: &[u8],
want_day: &[u8],
want_class: Option<ProgramClass>,
want_era: Option<&[u8]>,
) -> Result<PackIdentity, PackFault> {
let generator = define_u32(program_h, "IGNEUM_GENERATOR").unwrap_or(1);
let Some(class) = ProgramClass::from_generator(generator) else {
return Err(PackFault::WrongClass(format!("IGNEUM_GENERATOR {generator} is not a generator version this software runs (2, 3 or 4)")));
};
// IGNEUM_PROGRAM_CLASS, when present, must name the class the generator version names
if let Some(named) = define_str(program_h, "IGNEUM_PROGRAM_CLASS") {
if ProgramClass::parse(&named) != Some(class) {
return Err(PackFault::Disagree(format!("IGNEUM_PROGRAM_CLASS {named:?} does not match IGNEUM_GENERATOR {generator}")));
}
}
let era_hex = define_str(program_h, "IGNEUM_ERA_SEED_HEX").map(|h| h.to_ascii_lowercase());
// Counter ASIC 3.0 (6 October 2026): the shadow block is the mark of class v4, so a generator 4 pack carries
// IGNEUM_SHADOW_INSTRS and a generator 3 pack does not; a pack exported as class v4 but stamped generator 3 (the
// seven gate packs of 6 October, which carried the v3 control's program id because `program_id(3, ..)` is
// class-independent) is refused here instead of mining as class v3 under the wrong id, and a generator 4 pack
// without the block is no v4 pack. A generator 2 pack with a shadow (the measurement ladder of
// proto-cuda/packs-ca3-shadow) carries a class-bearing id and stays loadable.
let shadow = define_u32(program_h, "IGNEUM_SHADOW_INSTRS").unwrap_or(0);
// Class v5 (docs/design/class-v5-stored-state.md): the state lines are the mark of class v5, so a generator 5 pack
// carries IGNEUM_STATE_ROOT_HEX (and the shadow block of v4) and no other generator does.
let state_root_hex = define_str(program_h, "IGNEUM_STATE_ROOT_HEX");
match (class, state_root_hex.is_some()) {
(ProgramClass::V5, false) => return Err(PackFault::Disagree("IGNEUM_GENERATOR 5 (class v5) without IGNEUM_STATE_ROOT_HEX: not a class v5 pack".into())),
(ProgramClass::V5, true) => {}
(_, true) => return Err(PackFault::Disagree(format!("IGNEUM_GENERATOR {generator} with class v5 state lines: a program over state leaves is generator 5 (export the pack as class v5)"))),
_ => {}
}
match (class, shadow > 0) {
(ProgramClass::V4, false) => return Err(PackFault::Disagree("IGNEUM_GENERATOR 4 (class v4) without IGNEUM_SHADOW_INSTRS: not a class v4 pack".into())),
(ProgramClass::V5, false) => return Err(PackFault::Disagree("IGNEUM_GENERATOR 5 (class v5) without IGNEUM_SHADOW_INSTRS: not a class v5 pack".into())),
// the class v4 stream sub-version (AP-F8-1 amendment, 7 October 2026): a generator 4 pack from before the
// load-source rule carries no IGNEUM_PROGRAM_SUBVERSION and its program id is another stream's; refused
(ProgramClass::V4, true) if define_u32(program_h, "IGNEUM_PROGRAM_SUBVERSION") != Some(u32::from(crate::generator::PROGRAM_SUBVERSION_V4)) => {
return Err(PackFault::Disagree(format!(
"IGNEUM_GENERATOR 4 (class v4) with IGNEUM_PROGRAM_SUBVERSION {}: this software runs sub-version {} (a class v4 pack from before the load-source rule, or after another amendment)",
define_u32(program_h, "IGNEUM_PROGRAM_SUBVERSION").map(|v| v.to_string()).unwrap_or_else(|| "absent".into()),
crate::generator::PROGRAM_SUBVERSION_V4
)))
}
(ProgramClass::V3, true) => {
return Err(PackFault::Disagree(format!("IGNEUM_GENERATOR 3 (class v3) with a shadow block (IGNEUM_SHADOW_INSTRS {shadow}): a class v4 program is generator 4 (export the pack as class v4)")))
}
_ => {}
}
if let Some(want) = want_class {
if want != class {
return Err(PackFault::WrongClass(format!("the pack is program class {} (generator {generator}), the chain is on class {}", class.name(), want.name())));
}
}
if let (Some(want), true) = (want_era, class.has_era()) {
let want_hex = hex(want);
match &era_hex {
Some(h) if *h == want_hex => {}
Some(h) => return Err(PackFault::WrongClass(format!("the pack's era seed {} is not the era seed {} the job names", short(h), short(&want_hex)))),
None => return Err(PackFault::WrongClass(format!("a class {} pack without IGNEUM_ERA_SEED_HEX; the job names an era seed", class.name()))),
}
}
let seedw = define_words(program_h, "IGNEUM_SEEDW_INIT").ok_or_else(|| PackFault::Unreadable("program.h has no IGNEUM_SEEDW_INIT with 8 words".into()))?;
let keyw = define_words(program_h, "IGNEUM_KEY_INIT").ok_or_else(|| PackFault::Unreadable("program.h has no IGNEUM_KEY_INIT with 8 words".into()))?;
let attempt = define_u32(program_h, "IGNEUM_PROGRAM_ATTEMPT").unwrap_or(0);
let mut epoch_hex = define_str(program_h, "IGNEUM_SEED_BYTES_HEX").unwrap_or_default();
let mut day_hex = define_str(program_h, "IGNEUM_DAY_BYTES_HEX").unwrap_or_default();
if let Some(s) = seeds_txt {
let e = seeds_line(s, "epoch_seed_hex").ok_or_else(|| PackFault::Unreadable("seeds.txt has no epoch_seed_hex line".into()))?;
let d = seeds_line(s, "day_seed_hex").ok_or_else(|| PackFault::Unreadable("seeds.txt has no day_seed_hex line".into()))?;
if !epoch_hex.is_empty() && !epoch_hex.eq_ignore_ascii_case(&e) {
return Err(PackFault::Disagree(format!("seeds.txt names epoch {} but program.h was generated for epoch {} (a pack half rewritten?)", short(&e), short(&epoch_hex))));
}
if !day_hex.is_empty() && !day_hex.eq_ignore_ascii_case(&d) {
return Err(PackFault::Disagree(format!("seeds.txt names day {} but program.h was generated for day {}", day_label(&d), day_label(&day_hex))));
}
epoch_hex = e.to_ascii_lowercase();
day_hex = d.to_ascii_lowercase();
}
if epoch_hex.is_empty() || day_hex.is_empty() {
return Err(PackFault::Unreadable("no seeds: neither seeds.txt nor IGNEUM_SEED_BYTES_HEX / IGNEUM_DAY_BYTES_HEX in program.h".into()));
}
let epoch_bytes = unhex(&epoch_hex).filter(|b| b.len() == 32).ok_or_else(|| PackFault::Unreadable("the epoch seed is not 32 bytes of hex".into()))?;
let day_bytes = unhex(&day_hex).ok_or_else(|| PackFault::Unreadable("the day seed hex is malformed".into()))?;
// The pack's own consistency first: a pack that contradicts itself is never "out of date", it is broken
let want_w = attempt_words(&epoch_bytes, attempt);
if want_w != seedw {
return Err(PackFault::Disagree(format!(
"IGNEUM_SEEDW_INIT is not attempt {attempt} of the epoch seed {} (the words of attempt {attempt} are {:08x} {:08x} ..., the pack has {:08x} {:08x} ...)",
short(&epoch_hex),
want_w[0],
want_w[1],
seedw[0],
seedw[1]
)));
}
let want_k = seed_words_from_bytes(&day_bytes);
if want_k != keyw {
return Err(PackFault::Disagree(format!("IGNEUM_KEY_INIT is not the key of the day seed {} ", day_label(&day_hex))));
}
let want_epoch_hex = hex(want_epoch);
let want_day_hex = hex(want_day);
if epoch_hex != want_epoch_hex || day_hex != want_day_hex {
return Err(PackFault::OutOfDate { pack_epoch: epoch_hex, pack_day: day_hex, want_epoch: want_epoch_hex, want_day: want_day_hex });
}
Ok(PackIdentity { epoch_hex, day_hex, attempt, seedw, keyw, generator, class, era_hex, state_root_hex })
}
/// [`verify_pack_texts`] over a pack directory.
pub fn verify_pack_dir(dir: &Path, want_epoch: &[u8], want_day: &[u8]) -> Result<PackIdentity, PackFault> {
verify_pack_dir_chain(dir, want_epoch, want_day, None, None)
}
/// [`verify_pack_texts_chain`] over a pack directory.
pub fn verify_pack_dir_chain(dir: &Path, want_epoch: &[u8], want_day: &[u8], want_class: Option<ProgramClass>, want_era: Option<&[u8]>) -> Result<PackIdentity, PackFault> {
let program_h = std::fs::read_to_string(dir.join("program.h")).map_err(|e| PackFault::Unreadable(format!("cannot read {}/program.h: {e}", dir.display())))?;
let seeds = std::fs::read_to_string(dir.join("seeds.txt")).ok();
verify_pack_texts_chain(&program_h, seeds.as_deref(), want_epoch, want_day, want_class, want_era)
}
#[cfg(test)]
mod tests {
use super::*;
use crate::emit::program_header;
use crate::generator::generate_from_seed_bytes;
use crate::verify::Epoch;
// The two live devnet epochs of 5 October 2026 (epoch 33 mined, epoch 34 refused by the one-click workers)
const EPOCH_33: &str = "bed7ab62cbece66cf791485336d81d90fa1452ffed28ecd8a7416960ef64164c";
const EPOCH_34: &str = "009858237e118f69abc8d096e9b1af21c24539eaecdfd1b896588825660a69ec";
// "igneum-day/" || le64(20731)
const DAY_20731: &str = "69676e65756d2d6461792ffb50000000000000";
fn bytes(h: &str) -> Vec<u8> {
unhex(h).unwrap()
}
/// The attempt vectors the C side pins too (proto-cuda/nvrtc/emu/packfile-test.c): a change to either
/// derivation fails on one side first.
#[test]
fn attempt_words_vectors_shared_with_the_workers() {
let e = bytes(EPOCH_34);
assert_eq!(attempt_words(&e, 0), [0x06af2a61, 0x4d67274e, 0x4ebda738, 0xad1dea73, 0x6233cd8c, 0x50371601, 0x39d0b873, 0x6af024a2]);
assert_eq!(attempt_words(&e, 1), [0x0dcff56b, 0x6b1beb0d, 0x234dc70c, 0xe4016fa9, 0x72397152, 0xb558aa79, 0x3ffb3299, 0x72b9962e]);
// epoch 33's bare words, as the CUDA worker printed them on 5 October ("seed words be5983a6 f750dab7 ...")
assert_eq!(attempt_words(&bytes(EPOCH_33), 0)[..2], [0xbe5983a6, 0xf750dab7]);
}
/// The incident: epoch 34's program is a later attempt, epoch 33's is the bare seed. A worker that derives the
/// words from the bare seed accepts 33 and refuses 34.
#[test]
fn epoch_34_program_is_a_later_attempt() {
let p34 = generate_from_seed_bytes("epoch 34", &bytes(EPOCH_34));
assert!(p34.attempt >= 1, "epoch 34 must be a retried program for the incident to reproduce; attempt {}", p34.attempt);
assert_eq!(p34.seed, attempt_words(&bytes(EPOCH_34), p34.attempt));
assert_ne!(p34.seed, attempt_words(&bytes(EPOCH_34), 0));
let p33 = generate_from_seed_bytes("epoch 33", &bytes(EPOCH_33));
assert_eq!(p33.attempt, 0);
}
fn pack_texts(epoch_hex: &str, day_hex: &str) -> (String, String, u32) {
let (e, d) = (bytes(epoch_hex), bytes(day_hex));
let epoch = Epoch::from_seed_bytes(&e, &d, "test");
let h = program_header(&epoch.program, "test day", &epoch.dataset);
let s = format!("epoch_seed_hex {epoch_hex}\nday_seed_hex {day_hex}\nday_index 20731\n");
(h, s, epoch.program.attempt)
}
/// Known-good: the pack of a retried program verifies against its own seeds, with its attempt.
#[test]
fn known_good_pack_of_a_later_attempt_verifies() {
let (h, s, attempt) = pack_texts(EPOCH_34, DAY_20731);
assert!(attempt >= 1);
let id = verify_pack_texts(&h, Some(&s), &bytes(EPOCH_34), &bytes(DAY_20731)).expect("the pack verifies");
assert_eq!(id.attempt, attempt);
assert_eq!(id.epoch_hex, EPOCH_34);
assert_eq!(id.seedw, attempt_words(&bytes(EPOCH_34), attempt));
// without seeds.txt program.h's own bytes carry the pack
assert!(verify_pack_texts(&h, None, &bytes(EPOCH_34), &bytes(DAY_20731)).is_ok());
}
/// Known-mismatched: a well-formed pack for the previous epoch is "out of date" against the new one, in plain
/// words with both epochs named.
#[test]
fn known_mismatched_pack_is_out_of_date() {
let (h, s, _) = pack_texts(EPOCH_33, DAY_20731);
let err = verify_pack_texts(&h, Some(&s), &bytes(EPOCH_34), &bytes(DAY_20731)).unwrap_err();
assert!(matches!(err, PackFault::OutOfDate { .. }), "{err}");
assert_eq!(err.to_string(), "program pack out of date: the pack is for epoch bed7ab62cbece66c day 20731, the node is on epoch 009858237e118f69 day 20731");
}
/// A pack that contradicts itself is "disagree", never "out of date": seeds.txt of one epoch with program.h of
/// another (a half rewritten directory), or init words that are not the attempt's words (a worker on the old
/// rule would have produced this verdict for every retried program).
#[test]
fn inconsistent_pack_disagrees() {
let (h33, _, _) = pack_texts(EPOCH_33, DAY_20731);
let s34 = format!("epoch_seed_hex {EPOCH_34}\nday_seed_hex {DAY_20731}\n");
let err = verify_pack_texts(&h33, Some(&s34), &bytes(EPOCH_34), &bytes(DAY_20731)).unwrap_err();
assert!(matches!(err, PackFault::Disagree(_)), "{err}");
assert!(err.to_string().starts_with("program pack and its seeds disagree: seeds.txt names epoch 009858237e118f69"), "{err}");
let (h34, s, _) = pack_texts(EPOCH_34, DAY_20731);
let bare = attempt_words(&bytes(EPOCH_34), 0);
let edited = h34.lines().map(|l| if l.starts_with("#define IGNEUM_SEEDW_INIT") { format!("#define IGNEUM_SEEDW_INIT {{ {} }}", bare.iter().map(|w| format!("0x{w:08x}")).collect::<Vec<_>>().join(", ")) } else { l.to_string() }).collect::<Vec<_>>().join("\n");
let err = verify_pack_texts(&edited, Some(&s), &bytes(EPOCH_34), &bytes(DAY_20731)).unwrap_err();
assert!(err.to_string().contains("IGNEUM_SEEDW_INIT is not attempt"), "{err}");
// and a pack with no attempt line at all is read as attempt 0 (the packs before generator version 2)
let no_attempt = h34.lines().filter(|l| !l.starts_with("#define IGNEUM_PROGRAM_ATTEMPT")).collect::<Vec<_>>().join("\n");
assert!(verify_pack_texts(&no_attempt, Some(&s), &bytes(EPOCH_34), &bytes(DAY_20731)).is_err());
}
#[test]
fn day_label_reads_the_index() {
assert_eq!(day_label(DAY_20731), "20731");
assert_eq!(day_label("abcd"), "abcd");
}
/// Counter ASIC 2.0: a class v3 chain pack carries generator 3, the class line and the era seed; it is refused
/// when the chain wants class v2, when the era differs, and a v2 pack is refused when the chain wants v3; a
/// generator this software does not run is refused whatever is wanted.
#[test]
fn program_class_and_era_are_checked() {
let e = bytes(EPOCH_34);
let d = bytes(DAY_20731);
let era = [0x5au8; 32];
let v3 = Epoch::from_chain_seeds(&e, &d, Some(&era), ProgramClass::V3, "class test");
let h3 = program_header(&v3.program, "test day", &v3.dataset);
assert!(h3.contains("#define IGNEUM_GENERATOR 3\n"));
assert!(h3.contains("#define IGNEUM_PROGRAM_CLASS \"v3\"\n"));
assert!(h3.contains(&format!("#define IGNEUM_ERA_SEED_HEX \"{}\"\n", hex(&era))));
let id = verify_pack_texts_chain(&h3, None, &e, &d, Some(ProgramClass::V3), Some(&era)).unwrap();
assert_eq!((id.generator, id.class, id.era_hex.as_deref()), (3, ProgramClass::V3, Some(hex(&era).as_str())));
assert_eq!(id.attempt, v3.program.attempt);
assert!(verify_pack_texts(&h3, None, &e, &d).is_ok(), "no class wanted: either class passes");
let err = verify_pack_texts_chain(&h3, None, &e, &d, Some(ProgramClass::V2), None).unwrap_err();
assert!(matches!(err, PackFault::WrongClass(_)), "{err}");
assert!(err.to_string().contains("program pack of the wrong class"), "{err}");
let err = verify_pack_texts_chain(&h3, None, &e, &d, Some(ProgramClass::V3), Some(&[1u8; 32])).unwrap_err();
assert!(err.to_string().contains("era seed"), "{err}");
// the v2 pack of the same seeds: generator 2, no class line, no era line, refused when v3 is wanted
let v2 = Epoch::from_chain_seeds(&e, &d, Some(&era), ProgramClass::V2, "class test");
let h2 = program_header(&v2.program, "test day", &v2.dataset);
assert!(h2.contains("#define IGNEUM_GENERATOR 2\n"));
assert!(!h2.contains("IGNEUM_PROGRAM_CLASS") && !h2.contains("IGNEUM_ERA_SEED_HEX"));
let plain = Epoch::from_seed_bytes(&e, &d, "class test");
assert_eq!(program_header(&plain.program, "test day", &plain.dataset), h2, "class v2 from the chain is the v2 export byte for byte");
let id = verify_pack_texts_chain(&h2, None, &e, &d, Some(ProgramClass::V2), Some(&era)).unwrap();
assert_eq!((id.generator, id.class, id.era_hex), (2, ProgramClass::V2, None));
assert!(matches!(verify_pack_texts_chain(&h2, None, &e, &d, Some(ProgramClass::V3), None), Err(PackFault::WrongClass(_))));
// a generator nobody runs
let h9 = h2.replace("#define IGNEUM_GENERATOR 2\n", "#define IGNEUM_GENERATOR 9\n");
assert!(matches!(verify_pack_texts(&h9, None, &e, &d), Err(PackFault::WrongClass(_))));
// a class line that contradicts the generator
let bad = h3.replace("#define IGNEUM_PROGRAM_CLASS \"v3\"\n", "#define IGNEUM_PROGRAM_CLASS \"v2\"\n");
assert!(matches!(verify_pack_texts(&bad, None, &e, &d), Err(PackFault::Disagree(_))));
// Counter ASIC 3.0: a class v4 chain pack carries generator 4, the class line and the era seed; it is refused
// when v3 (or v2) is wanted, and a v3 pack is refused when v4 is wanted; the era rule applies to v4 as to v3
let v4 = Epoch::from_chain_seeds(&e, &d, Some(&era), ProgramClass::V4, "class test");
let h4 = program_header(&v4.program, "test day", &v4.dataset);
assert!(h4.contains("#define IGNEUM_GENERATOR 4\n"));
assert!(h4.contains("#define IGNEUM_PROGRAM_CLASS \"v4\"\n"));
assert!(h4.contains(&format!("#define IGNEUM_ERA_SEED_HEX \"{}\"\n", hex(&era))));
assert!(h4.contains("#define IGNEUM_SHADOW_INSTRS 256\n") && h4.contains("#define IGNEUM_SHADOW_REPS 27\n"), "{h4}");
let id = verify_pack_texts_chain(&h4, None, &e, &d, Some(ProgramClass::V4), Some(&era)).unwrap();
assert_eq!((id.generator, id.class, id.era_hex.as_deref()), (4, ProgramClass::V4, Some(hex(&era).as_str())));
assert_eq!(id.attempt, v3.program.attempt, "the v4 attempt is the v3 attempt of the same seed");
assert!(verify_pack_texts(&h4, None, &e, &d).is_ok(), "no class wanted: any class passes");
assert!(matches!(verify_pack_texts_chain(&h4, None, &e, &d, Some(ProgramClass::V3), None), Err(PackFault::WrongClass(_))));
assert!(matches!(verify_pack_texts_chain(&h4, None, &e, &d, Some(ProgramClass::V2), None), Err(PackFault::WrongClass(_))));
assert!(matches!(verify_pack_texts_chain(&h3, None, &e, &d, Some(ProgramClass::V4), None), Err(PackFault::WrongClass(_))));
assert!(matches!(verify_pack_texts_chain(&h2, None, &e, &d, Some(ProgramClass::V4), None), Err(PackFault::WrongClass(_))));
let err = verify_pack_texts_chain(&h4, None, &e, &d, Some(ProgramClass::V4), Some(&[1u8; 32])).unwrap_err();
assert!(err.to_string().contains("era seed"), "{err}");
let no_era = h4.replace(&format!("#define IGNEUM_ERA_SEED_HEX \"{}\"\n", hex(&era)), "");
let err = verify_pack_texts_chain(&no_era, None, &e, &d, Some(ProgramClass::V4), Some(&era)).unwrap_err();
assert!(err.to_string().contains("class v4 pack without IGNEUM_ERA_SEED_HEX"), "{err}");
// the v3 pack of the same seeds is unchanged by the v4 class existing
assert_eq!(program_header(&v3.program, "test day", &v3.dataset), h3);
// the 6 October trap: a v4 program stamped generator 3 (the CLI's old --era path) is refused for its shadow
// block, whatever class is wanted; and a generator 4 header without the block is refused too
let stamped3 = h4.replace("#define IGNEUM_GENERATOR 4\n", "#define IGNEUM_GENERATOR 3\n").replace("#define IGNEUM_PROGRAM_CLASS \"v4\"\n", "#define IGNEUM_PROGRAM_CLASS \"v3\"\n");
let err = verify_pack_texts(&stamped3, None, &e, &d).unwrap_err();
assert!(matches!(err, PackFault::Disagree(_)) && err.to_string().contains("shadow block"), "{err}");
assert!(verify_pack_texts_chain(&stamped3, None, &e, &d, Some(ProgramClass::V3), Some(&era)).is_err());
let no_shadow = h4.replace("#define IGNEUM_SHADOW_INSTRS 256\n", "");
let err = verify_pack_texts(&no_shadow, None, &e, &d).unwrap_err();
assert!(matches!(err, PackFault::Disagree(_)) && err.to_string().contains("without IGNEUM_SHADOW_INSTRS"), "{err}");
}
}

View file

@ -0,0 +1,114 @@
//! Seed derivation and the SplitMix64 stream, exactly as `proto-metal/main.swift` does them.
//!
//! Today a seed is a string ("igneum-genesis", "day/2026-10-03"). On the chain the epoch seed will be the
//! output of a class-group VDF over a certified checkpoint hash. [`seed_words_from_bytes`] is the function
//! boundary for that: whatever bytes the chain settles on go through the same FNV-1a construction, so the
//! generator and the day key never need to know where the bytes came from.
/// FNV-1a 64 over `bytes` with the standard basis. Used for the cache fingerprint in the packs.
pub fn fnv1a64(bytes: &[u8]) -> u64 {
fnv1a64_with_basis(0xcbf29ce484222325, bytes)
}
#[inline]
fn fnv1a64_with_basis(basis: u64, bytes: &[u8]) -> u64 {
let mut h = basis;
for &b in bytes {
h ^= b as u64;
h = h.wrapping_mul(0x100000001b3);
}
h
}
/// FNV-1a 64 over 32-bit words in little-endian byte order (the cache is hashed as raw memory).
pub fn fnv1a64_words(words: &[u32]) -> u64 {
let mut h: u64 = 0xcbf29ce484222325;
for &w in words {
for b in w.to_le_bytes() {
h ^= b as u64;
h = h.wrapping_mul(0x100000001b3);
}
}
h
}
/// The 32-byte seed (8 x u32) from arbitrary bytes: FNV-1a 64 with four salts, each finalised with the
/// murmur-style mix `h ^= h >> 33; h *= 0xff51afd7ed558ccd; h ^= h >> 33`; low word then high word.
pub fn seed_words_from_bytes(bytes: &[u8]) -> [u32; 8] {
let mut words = [0u32; 8];
for salt in 0..4u64 {
let basis = 0xcbf29ce484222325u64 ^ salt.wrapping_mul(0x9E3779B97F4A7C15);
let mut h = fnv1a64_with_basis(basis, bytes);
h ^= h >> 33;
h = h.wrapping_mul(0xff51afd7ed558ccd);
h ^= h >> 33;
words[2 * salt as usize] = h as u32;
words[2 * salt as usize + 1] = (h >> 32) as u32;
}
words
}
/// The 32-byte seed from a string (its UTF-8 bytes). `seedWords` in the Swift.
pub fn seed_words(s: &str) -> [u32; 8] {
seed_words_from_bytes(s.as_bytes())
}
/// The day key: the 8 words of `seed_words("day/" + day)`. `K` in MEMHARD.md; `d0, d1` are `K[0], K[1]`.
pub fn day_key(day: &str) -> [u32; 8] {
seed_words(&format!("day/{day}"))
}
/// SplitMix64, the one deterministic stream every draw in the prototype comes from.
#[derive(Clone, Copy, Debug)]
pub struct SplitMix64 {
pub s: u64,
}
impl SplitMix64 {
pub fn new(s: u64) -> Self {
Self { s }
}
#[inline]
pub fn next(&mut self) -> u64 {
self.s = self.s.wrapping_add(0x9E3779B97F4A7C15);
let mut z = self.s;
z = (z ^ (z >> 30)).wrapping_mul(0xBF58476D1CE4E5B9);
z = (z ^ (z >> 27)).wrapping_mul(0x94D049BB133111EB);
z ^ (z >> 31)
}
/// `next() % n` as the Swift `below` does it (modulo, not rejection sampling).
#[inline]
pub fn below(&mut self, n: u64) -> u64 {
self.next() % n
}
}
/// The generator's stream for a seed: `(w0 | w1 << 32) ^ ((w2 | w3 << 32) * 0x9E3779B97F4A7C15)`.
pub fn program_rng(seed: &[u32; 8]) -> SplitMix64 {
let lo = seed[0] as u64 | ((seed[1] as u64) << 32);
let hi = seed[2] as u64 | ((seed[3] as u64) << 32);
SplitMix64::new(lo ^ hi.wrapping_mul(0x9E3779B97F4A7C15))
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn genesis_seed_words() {
// From proto-cuda/packs/igneum-genesis/program.json.
assert_eq!(
seed_words("igneum-genesis"),
[0x67a9a7be, 0x1a155b25, 0xfddfb732, 0x4b5af2e8, 0xc55caf33, 0xa27c13b7, 0x06628a48, 0x03852469]
);
}
#[test]
fn day_key_2026_10_03() {
// MEMHARD.md section 1.1.
assert_eq!(
day_key("2026-10-03"),
[0x3067619f, 0x3c269176, 0x84a03b03, 0xf8c63294, 0xff977c5b, 0xe60def3e, 0x63630141, 0xb8fbcb58]
);
}
}

View file

@ -0,0 +1,287 @@
//! Class v5, proof of stored state and of following (`docs/design/class-v5-stored-state.md`, 7 October 2026): the
//! leaves the item derivation XORs in (section 2 of the page), built from the canonical state stream of the
//! window's reference block.
//!
//! `D[i] = Blake2b-512("igneum-sd1/" || root || i_le32 || record_i)` for the `n` records of the stream, and item
//! `t` takes `leaf(t) = D[t mod n]`: every item is keyed by the state, so a hasher without it is wrong on every
//! item (the known-failed case, the first test). When the stream has more records than the dataset has items, the
//! records are ordered by `Blake2b-256("igneum-sd1-sample/" || root || record)` and the first `items` are taken, a
//! sample nobody can choose without the whole state and the root.
//!
//! The stream file (`StateStream`): the plain format every side reads without a serialisation library, `IGSD1\0`,
//! the chain block number (le64) and hash (32), the state root (32), the record count (le32), then each record as
//! its length (le32) and bytes. The node's executor writes it (`igneum/exec/src/day_stream.rs`), the miner fetches
//! it, the CLI's `--state` reads it, and a pack carries the leaves it yields as `leaves.bin`.
use crate::blake2b::{blake2b_256, blake2b_512};
use crate::seed::fnv1a64_words;
pub const LEAF_TAG: &[u8] = b"igneum-sd1/";
pub const SAMPLE_TAG: &[u8] = b"igneum-sd1-sample/";
pub const STREAM_MAGIC: &[u8; 6] = b"IGSD1\0";
/// The canonical state stream at one chain block: what the executor serialises and what the leaves derive from.
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct StateStream {
pub number: u64,
pub block: [u8; 32],
pub root: [u8; 32],
pub records: Vec<Vec<u8>>,
}
impl StateStream {
pub fn encode(&self) -> Vec<u8> {
let mut b = Vec::with_capacity(6 + 8 + 32 + 32 + 4 + self.records.iter().map(|r| 4 + r.len()).sum::<usize>());
b.extend_from_slice(STREAM_MAGIC);
b.extend_from_slice(&self.number.to_le_bytes());
b.extend_from_slice(&self.block);
b.extend_from_slice(&self.root);
b.extend_from_slice(&(self.records.len() as u32).to_le_bytes());
for r in &self.records {
b.extend_from_slice(&(r.len() as u32).to_le_bytes());
b.extend_from_slice(r);
}
b
}
pub fn decode(bytes: &[u8]) -> Result<StateStream, String> {
if bytes.len() < 6 + 8 + 32 + 32 + 4 || &bytes[..6] != STREAM_MAGIC {
return Err("not a state stream file (magic IGSD1)".into());
}
let mut at = 6;
let number = u64::from_le_bytes(bytes[at..at + 8].try_into().unwrap());
at += 8;
let block: [u8; 32] = bytes[at..at + 32].try_into().unwrap();
at += 32;
let root: [u8; 32] = bytes[at..at + 32].try_into().unwrap();
at += 32;
let n = u32::from_le_bytes(bytes[at..at + 4].try_into().unwrap()) as usize;
at += 4;
let mut records = Vec::with_capacity(n.min(1 << 20));
for i in 0..n {
if at + 4 > bytes.len() {
return Err(format!("state stream truncated at record {i} of {n}"));
}
let len = u32::from_le_bytes(bytes[at..at + 4].try_into().unwrap()) as usize;
at += 4;
if at + len > bytes.len() {
return Err(format!("state stream truncated inside record {i} of {n}"));
}
records.push(bytes[at..at + len].to_vec());
at += len;
}
if at != bytes.len() {
return Err(format!("state stream has {} trailing bytes", bytes.len() - at));
}
Ok(StateStream { number, block, root, records })
}
pub fn read_file(path: &std::path::Path) -> Result<StateStream, String> {
let bytes = std::fs::read(path).map_err(|e| format!("read {}: {e}", path.display()))?;
Self::decode(&bytes)
}
}
/// `D[i]`: the 64-byte digest of record `i` under `root`, as 16 little-endian words.
pub fn leaf_digest(root: &[u8; 32], i: u32, record: &[u8]) -> [u32; 16] {
let d = blake2b_512(&[LEAF_TAG, root, &i.to_le_bytes(), record]);
let mut w = [0u32; 16];
for (k, x) in w.iter_mut().enumerate() {
*x = u32::from_le_bytes(d[k * 4..k * 4 + 4].try_into().unwrap());
}
w
}
/// The sample order key of a record under `root`.
pub fn sample_key(root: &[u8; 32], record: &[u8]) -> [u8; 32] {
blake2b_256(&[SAMPLE_TAG, root, record])
}
/// The leaves of one window (or day) of class v5: `n` digests of 64 bytes, `leaf(t) = D[t mod n]`.
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct StateLeaves {
pub root: [u8; 32],
pub block: [u8; 32],
pub number: u64,
/// Records in the stream before any sample.
pub records_total: u64,
/// Whether the stream had more records than the dataset has items (the sample rule applied).
pub sampled: bool,
leaves: Vec<[u32; 16]>,
}
impl StateLeaves {
/// The items a dataset of `2^log2_words` words has: `2^(log2_words - 4)`.
pub fn items_of(log2_words: u32) -> u64 {
1u64 << log2_words.saturating_sub(4)
}
/// The leaves of `records` (canonical order) under `root` for a dataset of `2^log2_words` words. An empty stream
/// yields one leaf, the digest of the empty record, so `n` is never 0.
pub fn build(root: [u8; 32], block: [u8; 32], number: u64, records: &[Vec<u8>], log2_words: u32) -> StateLeaves {
let items = Self::items_of(log2_words);
let records_total = records.len() as u64;
let empty: Vec<Vec<u8>> = vec![Vec::new()];
let records = if records.is_empty() { &empty[..] } else { records };
let sampled = records.len() as u64 > items;
let chosen: Vec<&Vec<u8>> = if sampled {
let mut keyed: Vec<([u8; 32], &Vec<u8>)> = records.iter().map(|r| (sample_key(&root, r), r)).collect();
keyed.sort_unstable_by(|a, b| a.0.cmp(&b.0).then_with(|| a.1.cmp(b.1)));
keyed.into_iter().take(items as usize).map(|(_, r)| r).collect()
} else {
records.iter().collect()
};
let leaves = chosen.iter().enumerate().map(|(i, r)| leaf_digest(&root, i as u32, r)).collect();
StateLeaves { root, block, number, records_total, sampled, leaves }
}
pub fn from_stream(s: &StateStream, log2_words: u32) -> StateLeaves {
Self::build(s.root, s.block, s.number, &s.records, log2_words)
}
/// Leaves from the raw words of a `leaves.bin` (16 words per leaf), for a worker or a test that holds no stream.
pub fn from_words(root: [u8; 32], block: [u8; 32], number: u64, words: &[u32]) -> StateLeaves {
assert!(!words.is_empty() && words.len() % 16 == 0, "leaves are 16 words each");
let leaves = words.chunks_exact(16).map(|c| c.try_into().unwrap()).collect::<Vec<[u32; 16]>>();
StateLeaves { root, block, number, records_total: leaves.len() as u64, sampled: false, leaves }
}
#[inline(always)]
pub fn n(&self) -> u32 {
self.leaves.len() as u32
}
/// `leaf(t) = D[t mod n]`.
#[inline(always)]
pub fn leaf(&self, t: u32) -> &[u32; 16] {
&self.leaves[(t % self.n()) as usize]
}
pub fn leaves(&self) -> &[[u32; 16]] {
&self.leaves
}
/// The flat words of `leaves.bin`.
pub fn words(&self) -> Vec<u32> {
self.leaves.iter().flat_map(|l| l.iter().copied()).collect()
}
/// The bytes of `leaves.bin` (little-endian words).
pub fn bytes(&self) -> Vec<u8> {
self.words().iter().flat_map(|w| w.to_le_bytes()).collect()
}
/// FNV-1a 64 over the leaves as little-endian bytes (the pack's `IGNEUM_STATE_LEAVES_FNV64`).
pub fn fnv1a64(&self) -> u64 {
fnv1a64_words(&self.words())
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::generator::{generate_class, V5_CLASS};
use crate::memhard::{derive_item_leaves, Cache, MixParams, Shape};
use crate::seed::day_key;
use crate::verify::{hash_warp, DatasetMode, DatasetSource};
use std::sync::Arc;
fn records(n: usize, salt: u8) -> Vec<Vec<u8>> {
(0..n).map(|i| vec![salt, i as u8, (i >> 8) as u8, 7]).collect()
}
fn leaves(root: u8, n: usize, log2_words: u32) -> Arc<StateLeaves> {
Arc::new(StateLeaves::build([root; 32], [0x22; 32], 5, &records(n, root), log2_words))
}
/// The known-failed case, first: a hasher without the state (no leaves, the leaves of another root, the leaves
/// of a stream one record short, the previous window's leaves) is wrong on every item and every lane.
#[test]
fn a_stateless_hasher_is_wrong_on_every_item() {
let key = day_key("2026-10-03");
let shape = Shape { mixer_mult: 8, cache_log2_words: 16, derive_len: 0, state: true };
let cache = Arc::new(Cache::fill_log2(key, 16));
let mp = MixParams::with_shape(key, shape);
let good = leaves(0x11, 93, 20);
let other_root = leaves(0x12, 93, 20);
let one_short = Arc::new(StateLeaves::build([0x13; 32], [0x22; 32], 5, &records(92, 0x11), 20)); // a record short means another root
let previous_window = leaves(0x10, 93, 20);
for (name, bad) in [("another root", other_root.clone()), ("one record short", one_short.clone()), ("the previous window", previous_window.clone())] {
let equal = (0..64u32).filter(|&t| derive_item_leaves(t * 7919, &mp, &cache, Some(&good)) == derive_item_leaves(t * 7919, &mp, &cache, Some(&bad))).count();
assert_eq!(equal, 0, "{name}: {equal} of 64 items equal");
}
let stateless = Shape { state: false, ..shape };
let mp_stateless = MixParams::with_shape(key, stateless);
let equal = (0..64u32).filter(|&t| derive_item_leaves(t * 7919, &mp, &cache, Some(&good)) == derive_item_leaves(t * 7919, &mp_stateless, &cache, None)).count();
assert_eq!(equal, 0, "no leaves at all: {equal} of 64 items equal");
// the warp: a class v5 program over a small dataset, the same program and cache, other leaves
let program = generate_class("igneum-genesis", V5_CLASS);
let ds = DatasetSource::new_shape("2026-10-03", DatasetMode::MemoryHard, 20, shape).with_leaves(good.clone());
let ds_other = DatasetSource::new_shape("2026-10-03", DatasetMode::MemoryHard, 20, shape).with_leaves(previous_window.clone());
let a = hash_warp(&program, 0, &ds);
let b = hash_warp(&program, 0, &ds_other);
assert_eq!(a.iter().zip(b.iter()).filter(|(x, y)| x == y).count(), 0, "0 of 32 lanes agree");
assert_eq!(hash_warp(&program, 0, &ds), a, "the same leaves hash the same");
}
/// Every item takes a leaf: `leaf(t) = D[t mod n]`, so items `t` and `t + n` share a leaf and still differ.
#[test]
fn every_item_is_keyed_and_the_leaf_wraps() {
let l = leaves(0x11, 93, 28);
assert_eq!(l.n(), 93);
assert!(!l.sampled);
assert_eq!(l.records_total, 93);
for t in [0u32, 1, 92, 93, 94, 1_000_000, u32::MAX] {
assert_eq!(l.leaf(t), l.leaf(t % 93));
assert_eq!(*l.leaf(t), leaf_digest(&[0x11; 32], t % 93, &records(93, 0x11)[(t % 93) as usize]));
}
let key = day_key("2026-10-03");
let shape = Shape { mixer_mult: 8, cache_log2_words: 16, derive_len: 0, state: true };
let cache = Cache::fill_log2(key, 16);
let mp = MixParams::with_shape(key, shape);
assert_ne!(derive_item_leaves(5, &mp, &cache, Some(&l)), derive_item_leaves(5 + 93, &mp, &cache, Some(&l)));
// an empty stream yields one leaf (the digest of the empty record), never a division by zero
let empty = StateLeaves::build([0x11; 32], [0; 32], 0, &[], 28);
assert_eq!(empty.n(), 1);
assert_eq!(empty.records_total, 0);
assert_eq!(*empty.leaf(12_345), leaf_digest(&[0x11; 32], 0, &[]));
}
/// Above the dataset size the records are sampled in the keyed order: a different root picks a different set,
/// and the set cannot be the first `items` records of the stream.
#[test]
fn the_sample_above_the_dataset_size_is_keyed_by_the_root() {
let recs = records(40, 0x33);
let a = StateLeaves::build([0x11; 32], [0; 32], 0, &recs, 8);
let b = StateLeaves::build([0x12; 32], [0; 32], 0, &recs, 8);
assert_eq!(StateLeaves::items_of(8), 16);
assert_eq!((a.n(), a.sampled, a.records_total), (16, true, 40));
assert_ne!(a.leaves(), b.leaves(), "another root, another sample");
// the positional first 16 are not the sample (with overwhelming probability for 40 choose 16)
let positional = StateLeaves::build([0x11; 32], [0; 32], 0, &recs[..16], 8);
assert_ne!(a.leaves(), positional.leaves());
// the same inputs sample the same
assert_eq!(StateLeaves::build([0x11; 32], [0; 32], 0, &recs, 8), a);
// at the dataset size exactly, no sample
let c = StateLeaves::build([0x11; 32], [0; 32], 0, &recs[..16], 8);
assert!(!c.sampled && c.n() == 16);
}
#[test]
fn stream_file_round_trip_and_refusals() {
let s = StateStream { number: 159_357, block: [0xaf; 32], root: [0x1c; 32], records: records(93, 1) };
let bytes = s.encode();
assert_eq!(&bytes[..6], STREAM_MAGIC);
assert_eq!(StateStream::decode(&bytes).unwrap(), s);
assert!(StateStream::decode(&bytes[..bytes.len() - 1]).is_err(), "truncated");
let mut trailing = bytes.clone();
trailing.push(0);
assert!(StateStream::decode(&trailing).is_err(), "trailing bytes");
assert!(StateStream::decode(b"IGSD0\0").is_err(), "wrong magic");
let l = StateLeaves::from_stream(&s, 28);
let back = StateLeaves::from_words(s.root, s.block, s.number, &l.words());
assert_eq!(back.leaves(), l.leaves());
assert_eq!(l.bytes().len(), 93 * 64);
assert_eq!(l.fnv1a64(), back.fnv1a64());
}
}

View file

@ -0,0 +1,935 @@
//! The CPU reference interpreter for one 32-lane warp (`cpuWarpTraced` in the Swift) and the API the node
//! calls. Dataset words come from the memory-hard cache (default) or from the closed form (old packs).
use crate::generator::{generate, generate_class, EraParams, Instr, LoadClass, Op, Program, ProgramClass, ITERATIONS, LANES};
use crate::memhard::{hot_index, HotTable, Layout, MemhardCpu, Shape};
use crate::seed::day_key;
/// The load address of an era program (`docs/plans/era-layout.md` section 1.3): `y = rotl(x * M, R)`, then the
/// window of the load site, `k = min(win, D - 26)` (0 when `D <= 26`), `idx = ((y & (MASK >> k)) | ((off &
/// (2^k - 1)) << (D - k))) & MASK`. For every other class `idx = x & MASK`, the lottery hash's address. `mask` is
/// `2^D - 1`. The acceptance mirror calls this at the rule's constant `D = 28`.
#[inline(always)]
pub fn load_index(era: Option<&EraParams>, ins: &Instr, x: u32, mask: u32, log2: u32) -> u32 {
match era {
None => x & mask,
Some(e) => {
let (wm, off) = window(ins, mask, log2);
let y = x.wrapping_mul(e.stride_mul).rotate_left(e.stride_rot);
((y & wm) | off) & mask
}
}
}
/// The window of a load site at a dataset of `2^log2` words: `(window mask, offset)` such that
/// `idx = (y & window mask) | offset` lies in the site's aligned window of `2^(log2 - k)` words.
#[inline(always)]
pub fn window(ins: &Instr, mask: u32, log2: u32) -> (u32, u32) {
let k = (ins.win as u32).min(log2.saturating_sub(26));
let wm = mask >> k;
let off = ((ins.off as u32) & ((1u32 << k) - 1)) << (log2 - k);
(wm, off)
}
/// Read-width experiment (5 October 2026): a `load` of `W` words folds every word into `dst`:
/// `x = dst XOR w[0]; for j in 1..W: x = (rotl(x, FOLD_ROT) * FOLD_MUL) XOR w[j]; dst = x`. For `W = 1` this is the
/// lottery hash's `dst XOR dataset[...]`. The fold is state-dependent (the rotate-multiply sits between the words),
/// so no function of the line alone replaces it: two different lines give two different maps of `dst`, and a
/// dataset of folded lines cannot be stored in place of the dataset (see `docs/plans/read-width.md`).
pub const FOLD_ROT: u32 = 11;
pub const FOLD_MUL: u32 = 0x9E3779B1;
/// The fold of `words` into `dst` (at least one word).
#[inline(always)]
pub fn fold_words(dst: u32, words: &[u32]) -> u32 {
let mut x = dst ^ words[0];
for &w in &words[1..] {
x = x.rotate_left(FOLD_ROT).wrapping_mul(FOLD_MUL) ^ w;
}
x
}
/// Variant 5 (scratch): the fill value of word `j` (0..2) of slot `slot` of lane `lane` of the unit at base nonce
/// `base`, under program seed words `seed`. The scratch of a unit starts as these values; a slot written during
/// the unit's hash holds what was written. Mirrored as `scr_fill` in every emitted kernel.
#[inline(always)]
pub fn scratch_fill(seed: &[u32; 8], base: u32, lane: u32, slot: u32, j: u32) -> u32 {
splitmix32(
(base.wrapping_add(lane) ^ seed[j as usize])
.wrapping_add(slot.wrapping_mul(0x9E3779B1))
.wrapping_add((j + 1).wrapping_mul(0x85EBCA77)),
)
}
/// Variant 5: the 16-byte slot after a read-modify-write that read `w` and folded to `x`: `(x ^ w1, rotl(x, 7) ^ w2,
/// x + w0)` behind the slot's tag.
#[inline(always)]
pub fn scratch_rewrite(x: u32, w: &[u32; 3]) -> [u32; 3] {
[x ^ w[1], x.rotate_left(7) ^ w[2], x.wrapping_add(w[0])]
}
/// The CPU model of one unit's scratch (variant 5): per lane, the written slots and their words. Unwritten slots
/// read as [`scratch_fill`]. A unit touches at most `scratch ops x 32` slots; a GPU keeps the real scratch per
/// resident warp with a per-unit tag per slot.
pub struct ScratchModel {
slots: usize,
written: Vec<bool>,
data: Vec<[u32; 3]>,
pub reads: usize,
pub writes: usize,
/// Soundness tests (`tests/scratch.rs`, `docs/analysis/scratch-soundness.md`): when `Some`, every
/// read-modify-write is appended as it happened. `None` on every verification path.
pub trace: Option<Vec<ScratchEvent>>,
}
/// One scratch read-modify-write as the interpreter saw it (variant 5 soundness tests).
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub struct ScratchEvent {
pub lane: u8,
pub slot: u32,
/// The slot had been written earlier in this unit (a re-hit): the words read were a rewrite, not the fill.
pub hit: bool,
pub read: [u32; 3],
/// The fold result, the new value of `dst`.
pub x: u32,
pub written: [u32; 3],
}
impl ScratchModel {
pub fn new(slots_per_lane: usize) -> Self {
Self {
slots: slots_per_lane,
written: vec![false; LANES * slots_per_lane],
data: vec![[0; 3]; LANES * slots_per_lane],
reads: 0,
writes: 0,
trace: None,
}
}
/// Read slot `slot` of `lane`, then rewrite it from the fold result `x`. Returns the three words read.
#[inline]
pub fn rmw(&mut self, seed: &[u32; 8], base: u32, lane: usize, slot: u32, dst: u32) -> u32 {
let i = lane * self.slots + slot as usize;
let w = if self.written[i] {
self.data[i]
} else {
[
scratch_fill(seed, base, lane as u32, slot, 0),
scratch_fill(seed, base, lane as u32, slot, 1),
scratch_fill(seed, base, lane as u32, slot, 2),
]
};
let x = fold_words(dst, &w);
let out = scratch_rewrite(x, &w);
if let Some(t) = self.trace.as_mut() {
t.push(ScratchEvent { lane: lane as u8, slot, hit: self.written[i], read: w, x, written: out });
}
self.data[i] = out;
self.written[i] = true;
self.reads += 1;
self.writes += 1;
x
}
}
/// Dataset element, closed form of (day words, index). The original prototype's six-operation element.
#[inline(always)]
pub fn dataset_elem(i: u32, d0: u32, d1: u32) -> u32 {
let mut x = i ^ d0;
x = x.wrapping_mul(0x9E3779B1);
x ^= x >> 15;
x = x.wrapping_add(d1);
x = x.wrapping_mul(0x85EBCA77);
x ^= x >> 13;
x = x.wrapping_mul(0xC2B2AE3D);
x ^= x >> 16;
x
}
/// splitmix32, used for the register init.
#[inline(always)]
pub fn splitmix32(v: u32) -> u32 {
let mut x = v;
x ^= x >> 16;
x = x.wrapping_mul(0x7feb352d);
x ^= x >> 15;
x = x.wrapping_mul(0x846ca68b);
x ^= x >> 16;
x
}
/// Which construction fills the dataset words.
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum DatasetMode {
/// The six-operation closed form (packs igneum-genesis and igneum-hourly). Not memory-hard.
ClosedForm,
/// The 256 MiB cache and 8 dependent reads per item (pack igneum-genesis-mh, MEMHARD.md). The default.
MemoryHard,
}
impl DatasetMode {
pub fn name(self) -> &'static str {
match self {
DatasetMode::ClosedForm => "closed-form",
DatasetMode::MemoryHard => "memory-hard",
}
}
}
/// Where the interpreter reads dataset words from.
pub enum Dataset {
ClosedForm { d0: u32, d1: u32 },
MemoryHard(MemhardCpu),
}
/// A dataset of `2^log2` words plus the construction that fills it.
pub struct DatasetSource {
pub log2_words: u32,
pub mask: u32,
/// The day key `K`; `d0, d1 = K[0], K[1]`.
pub key: [u32; 8],
/// The bytes `K` was derived from (`"day/<day>"` for a string day, `bind::day_bytes` on the chain), recorded
/// in packs so any implementation can rebuild the key. Empty when the key was given directly.
pub key_bytes: Vec<u8>,
pub dataset: Dataset,
/// The hot table of the epoch (hot-table experiment, `docs/plans/hot-table.md`): `Some` when the program's
/// class has one; filled by [`Epoch::new_class`] and [`Epoch::from_seed_bytes_class`] from the program's seed
/// bytes. A hot load reads `hot[hot_index(src, words)]`.
pub hot: Option<HotTable>,
}
impl DatasetSource {
/// Build the source for a day. Memory-hard mode fills the 256 MiB cache on the calling thread.
pub fn new(day: &str, mode: DatasetMode, log2_words: u32) -> Self {
Self::new_shape(day, mode, log2_words, Shape::V2)
}
/// [`DatasetSource::new`] with the construction's shape (mixer multiplier, cache size; Counter ASIC 2.0).
pub fn new_shape(day: &str, mode: DatasetMode, log2_words: u32, shape: Shape) -> Self {
let mut ds = Self::from_key_shape(day_key(day), mode, log2_words, shape);
ds.key_bytes = format!("day/{day}").into_bytes();
ds
}
pub fn from_key(key: [u32; 8], mode: DatasetMode, log2_words: u32) -> Self {
Self::from_key_shape(key, mode, log2_words, Shape::V2)
}
/// [`DatasetSource::from_key`] with the construction's shape. Memory-hard mode fills a cache of
/// `2^shape.cache_log2_words` words on the calling thread.
pub fn from_key_shape(key: [u32; 8], mode: DatasetMode, log2_words: u32, shape: Shape) -> Self {
assert!((4..=32).contains(&log2_words), "dataset log2 must be in 4..=32");
let mask = if log2_words == 32 { u32::MAX } else { (1u32 << log2_words) - 1 };
let dataset = match mode {
DatasetMode::ClosedForm => Dataset::ClosedForm { d0: key[0], d1: key[1] },
DatasetMode::MemoryHard => Dataset::MemoryHard(MemhardCpu::with_shape(key, shape)),
};
Self { log2_words, mask, key, key_bytes: Vec::new(), dataset, hot: None }
}
/// This source with the window's state leaves (class v5, `docs/design/class-v5-stored-state.md`): memory-hard mode
/// under a shape with `state` only.
pub fn with_leaves(mut self, leaves: std::sync::Arc<crate::state::StateLeaves>) -> Self {
match &mut self.dataset {
Dataset::MemoryHard(m) => {
assert!(m.params.shape.state, "state leaves on a dataset whose shape has no state");
m.leaves = Some(leaves);
}
Dataset::ClosedForm { .. } => panic!("state leaves on a closed-form dataset"),
}
self
}
/// A source of the same day with other leaves, the 256 MiB cache shared (the class v5 window refresh).
pub fn refreshed(&self, leaves: std::sync::Arc<crate::state::StateLeaves>) -> Self {
let dataset = match &self.dataset {
Dataset::MemoryHard(m) => Dataset::MemoryHard(m.refreshed(leaves)),
Dataset::ClosedForm { .. } => panic!("state leaves on a closed-form dataset"),
};
Self { log2_words: self.log2_words, mask: self.mask, key: self.key, key_bytes: self.key_bytes.clone(), dataset, hot: None }
}
/// A copy of this source sharing its cache (and leaves), for a caller that needs an owned source from a shared one.
pub fn refreshed_or_clone(&self) -> Self {
let dataset = match &self.dataset {
Dataset::MemoryHard(m) => Dataset::MemoryHard(crate::memhard::MemhardCpu { params: m.params.clone(), cache: m.cache.clone(), leaves: m.leaves.clone() }),
Dataset::ClosedForm { d0, d1 } => Dataset::ClosedForm { d0: *d0, d1: *d1 },
};
Self { log2_words: self.log2_words, mask: self.mask, key: self.key, key_bytes: self.key_bytes.clone(), dataset, hot: None }
}
/// The window's state leaves, when the source carries them.
pub fn leaves(&self) -> Option<&std::sync::Arc<crate::state::StateLeaves>> {
self.memhard().and_then(|m| m.leaves.as_ref())
}
/// This source with the hot table of the epoch whose program seed bytes are `seed_bytes` (`mb` MiB).
pub fn with_hot(mut self, seed_bytes: &[u8], mb: u32) -> Self {
self.hot = Some(HotTable::for_seed_bytes(seed_bytes, mb));
self
}
/// The hot table of a program's class, filled from its seed bytes (none for a class without one).
pub fn attach_hot_for(&mut self, program: &Program) {
self.hot = program.class.hot.map(|h| HotTable::for_seed_bytes(&program.seed_bytes, h.mb as u32));
}
/// The shape of the memory-hard construction ([`Shape::V2`] for the closed form, which has none).
pub fn shape(&self) -> Shape {
self.memhard().map(|m| m.shape()).unwrap_or(Shape::V2)
}
pub fn mode(&self) -> DatasetMode {
match self.dataset {
Dataset::ClosedForm { .. } => DatasetMode::ClosedForm,
Dataset::MemoryHard(_) => DatasetMode::MemoryHard,
}
}
pub fn memhard(&self) -> Option<&MemhardCpu> {
match &self.dataset {
Dataset::MemoryHard(m) => Some(m),
_ => None,
}
}
/// `dataset[w & mask]` under the linear layout (the lottery hash).
pub fn word(&self, w: u32) -> u32 {
self.word_at(Layout::LINEAR, w)
}
/// `dataset[w & mask]` under a program's layout (era layout). The closed form has no items and ignores it.
pub fn word_at(&self, layout: Layout, w: u32) -> u32 {
let w = w & self.mask;
match &self.dataset {
Dataset::ClosedForm { d0, d1 } => dataset_elem(w, *d0, *d1),
Dataset::MemoryHard(m) => m.word_at(layout, w),
}
}
/// `out[k] = dataset[idx[k]]`; indices are already masked. Returns items derived (0 for the closed form).
#[inline]
fn fetch(&self, idx: &[u32; LANES], out: &mut [u32; LANES], layout: Layout) -> usize {
match &self.dataset {
Dataset::ClosedForm { d0, d1 } => {
for k in 0..LANES {
out[k] = dataset_elem(idx[k], *d0, *d1);
}
0
}
Dataset::MemoryHard(m) => m.fetch(idx, out, layout),
}
}
/// `out[k][j] = dataset[base[k] + j]` for `j < width`; bases are masked and aligned to `width` words
/// (`width` 4 or 16, so a lane's words lie in one item). Returns items derived (0 for the closed form).
#[inline]
fn fetch_wide(&self, base: &[u32; LANES], width: usize, out: &mut [[u32; 16]; LANES], layout: Layout) -> usize {
match &self.dataset {
Dataset::ClosedForm { d0, d1 } => {
for k in 0..LANES {
for j in 0..width {
out[k][j] = dataset_elem(base[k] + j as u32, *d0, *d1);
}
}
0
}
Dataset::MemoryHard(m) => m.fetch_wide(base, width, out, layout),
}
}
}
/// The result of interpreting one warp.
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub struct WarpResult {
pub hashes: [u64; LANES],
/// Distinct dataset items derived from the cache (0 in closed-form mode).
pub items_derived: usize,
}
#[inline(always)]
fn mulhi32(a: u32, b: u32) -> u32 {
((a as u64 * b as u64) >> 32) as u32
}
/// Interpret `program` for the 32 nonces `base_nonce .. base_nonce + 31` (wrapping). Registers are kept
/// register-major (`r[reg][lane]`) so the per-lane loops vectorise; the semantics are those of the Metal
/// and CUDA kernels instruction for instruction.
pub fn interpret_warp(program: &Program, base_nonce: u32, ds: &DatasetSource) -> WarpResult {
interpret_warp_init(program, &program.seed, base_nonce, ds)
}
/// [`interpret_warp`] with explicit init words `I` (section 1.6 of the spec). The packs use `I = program.seed`;
/// a block uses `I = bind::block_init_words(H, nonce)`.
pub fn interpret_warp_init(program: &Program, seed: &[u32; 8], base_nonce: u32, ds: &DatasetSource) -> WarpResult {
interpret_warp_scratch(program, seed, base_nonce, ds, false).0
}
/// [`interpret_warp_init`] that also returns every scratch read-modify-write of the unit in execution order
/// (lane-minor within an instruction, as the interpreter runs them) when `trace` is set; empty otherwise and for
/// a class without a scratch. For the soundness tests of variant 5 only.
pub fn interpret_warp_scratch(
program: &Program,
seed: &[u32; 8],
base_nonce: u32,
ds: &DatasetSource,
trace: bool,
) -> (WarpResult, Vec<ScratchEvent>) {
let mask = ds.mask;
let log2 = ds.log2_words;
let era = program.class.era;
let layout = program.class.layout();
let mut r = [[0u32; LANES]; 8];
for lane in 0..LANES {
let nonce = base_nonce.wrapping_add(lane as u32);
for i in 0..8 {
let mut x = nonce ^ seed[i];
x = x.wrapping_add(0x9e3779b9u32.wrapping_mul(i as u32 + 1));
x = splitmix32(x);
r[i][lane] = x ^ seed[(i + 1) & 7];
}
}
let mut items_derived = 0usize;
let mut idx = [0u32; LANES];
let mut val = [0u32; LANES];
let mut scratch = if program.has_scratch() { Some(ScratchModel::new(program.class.scratch_slots_per_lane())) } else { None };
if trace {
if let Some(m) = scratch.as_mut() {
m.trace = Some(Vec::new());
}
}
let slot_mask = program.class.scratch_slot_mask();
if program.has_hot() {
let h = ds.hot.as_ref().expect("a hot-table program needs the epoch's hot table on the dataset source");
assert_eq!(h.n_words(), program.hot_words(), "the hot table's size is the class's");
}
for _ in 0..ITERATIONS {
let sel = r[0];
for ins in &program.instrs {
step(ins, &mut r, &sel, mask, log2, era.as_ref(), layout, ds, &mut idx, &mut val, &mut items_derived);
if ins.op == Op::Scratch {
let m = scratch.as_mut().expect("a scratch op needs a scratch class");
let (d, a) = (ins.dst as usize, ins.src as usize);
for lane in 0..LANES {
let slot = r[a][lane] & slot_mask;
r[d][lane] = m.rmw(&program.seed, base_nonce, lane, slot, r[d][lane]);
}
}
}
// Latency-shadow block (Counter ASIC 3.0 item 8): the block runs `reps` times after instruction 63 with the
// iteration's `sel`; it is empty on every class without a shadow, so version 2 and class v3 run nothing here.
for _ in 0..program.shadow_reps() {
for ins in &program.shadow {
step(ins, &mut r, &sel, mask, log2, era.as_ref(), layout, ds, &mut idx, &mut val, &mut items_derived);
}
}
}
let mut hashes = [0u64; LANES];
for lane in 0..LANES {
let lo = r[0][lane] ^ r[1][lane].rotate_left(7) ^ r[2][lane].rotate_left(14) ^ r[3][lane].rotate_left(21);
let hi = r[4][lane] ^ r[5][lane].rotate_left(9) ^ r[6][lane].rotate_left(18) ^ r[7][lane].rotate_left(27);
hashes[lane] = ((hi as u64) << 32) | lo as u64;
}
let events = scratch.and_then(|m| m.trace).unwrap_or_default();
(WarpResult { hashes, items_derived }, events)
}
#[inline(always)]
#[allow(clippy::too_many_arguments)]
fn step(
ins: &Instr,
r: &mut [[u32; LANES]; 8],
sel: &[u32; LANES],
mask: u32,
log2: u32,
era: Option<&EraParams>,
layout: Layout,
ds: &DatasetSource,
idx: &mut [u32; LANES],
val: &mut [u32; LANES],
items_derived: &mut usize,
) {
let d = ins.dst as usize;
let a = ins.src as usize;
match ins.op {
Op::Add => {
let (imm, imm2, bit) = (ins.imm, ins.imm2, ins.bit as u32);
let src = r[a];
for lane in 0..LANES {
let s = (sel[lane] >> bit) & 1;
let c = if s != 0 { imm2 } else { imm };
r[d][lane] = r[d][lane].wrapping_add(src[lane]).wrapping_add(c);
}
}
Op::Sub => {
let src = r[a];
for lane in 0..LANES {
r[d][lane] = r[d][lane].wrapping_sub(src[lane]);
}
}
Op::Mul => {
let src = r[a];
for lane in 0..LANES {
r[d][lane] = r[d][lane].wrapping_mul(src[lane]);
}
}
Op::MulHi => {
let src = r[a];
for lane in 0..LANES {
r[d][lane] = mulhi32(r[d][lane], src[lane]);
}
}
Op::Xor => {
let src = r[a];
for lane in 0..LANES {
r[d][lane] ^= src[lane];
}
}
Op::Or => {
let src = r[a];
for lane in 0..LANES {
r[d][lane] |= src[lane];
}
}
Op::Rotl => {
let n = ins.rot;
for lane in 0..LANES {
r[d][lane] = r[d][lane].rotate_left(n);
}
}
Op::Rotr => {
let src = r[a];
for lane in 0..LANES {
r[d][lane] = r[d][lane].rotate_right(src[lane] & 31);
}
}
Op::Mad => {
let src = r[a];
let src2 = r[ins.src2 as usize];
for lane in 0..LANES {
r[d][lane] = src[lane].wrapping_mul(src2[lane]).wrapping_add(r[d][lane]);
}
}
Op::Shfl => {
let src = r[a];
let m = ins.mask as usize;
for lane in 0..LANES {
r[d][lane] ^= src[lane ^ m];
}
}
Op::Load if ins.width == 1 => {
for lane in 0..LANES {
idx[lane] = load_index(era, ins, r[a][lane], mask, log2);
}
*items_derived += ds.fetch(idx, val, layout);
for lane in 0..LANES {
r[d][lane] ^= val[lane];
}
}
Op::Load => {
// Read-width experiment: `width` words from the aligned address, every word folded into dst.
let width = ins.width as usize;
let align = !(ins.width as u32 - 1);
for lane in 0..LANES {
idx[lane] = load_index(era, ins, r[a][lane], mask, log2) & align;
}
let mut vals = [[0u32; 16]; LANES];
*items_derived += ds.fetch_wide(idx, width, &mut vals, layout);
for lane in 0..LANES {
r[d][lane] = fold_words(r[d][lane], &vals[lane][..width]);
}
}
Op::Scratch => {
// handled by the caller (interpret_warp_init), which owns the unit's scratch model
}
Op::Hot => {
// Hot-table experiment: one word of the epoch table at the multiply-shift index, plain xor fold.
let h = ds.hot.as_ref().expect("a hot load needs the hot table");
let n = h.n_words();
for lane in 0..LANES {
r[d][lane] ^= h.at(hot_index(r[a][lane], n));
}
}
Op::WLoad => {
// Lane 0's register, masked, aligned down to 32 words; lane l reads word base + l.
let base = (r[a][0] & mask) & !31;
for lane in 0..LANES {
idx[lane] = base + lane as u32;
}
*items_derived += ds.fetch(idx, val, Layout::LINEAR);
for lane in 0..LANES {
r[d][lane] ^= val[lane];
}
}
}
}
/// The 32 hashes of one warp (`cpuWarp` in the Swift).
pub fn hash_warp(program: &Program, base_nonce: u32, ds: &DatasetSource) -> [u64; LANES] {
interpret_warp(program, base_nonce, ds).hashes
}
/// Everything a node needs to verify blocks of one epoch on one day: the program for the epoch seed and the
/// dataset source for the day key. Building one in memory-hard mode fills the 256 MiB cache (about 0.2 s on
/// one core); keep it for the whole epoch and share it between threads (`&Epoch` is `Send + Sync`).
pub struct Epoch {
pub program: Program,
pub dataset: DatasetSource,
}
/// Default dataset size: 2^28 words = 1 GiB.
pub const DEFAULT_DATASET_LOG2: u32 = 28;
/// Days a day index lies after the network's genesis day (0 for the genesis day and any day before it). The node's
/// entry; the same function as `memhard::days_since_genesis`.
pub fn days_since_genesis(day_index: u64, genesis_day_index: u64) -> u64 {
crate::memhard::days_since_genesis(day_index, genesis_day_index)
}
impl Epoch {
pub fn new(seed: &str, day: &str, mode: DatasetMode, dataset_log2: u32) -> Self {
Self { program: generate(seed), dataset: DatasetSource::new(day, mode, dataset_log2) }
}
/// [`Epoch::new`] with a load class (read-width experiment; Counter ASIC 2.0: the class's mixer multiplier
/// shapes the dataset, the cache is the genesis size since a string day has no day index).
pub fn new_class(seed: &str, day: &str, mode: DatasetMode, dataset_log2: u32, class: LoadClass) -> Self {
Self::new_class_day(seed, day, mode, dataset_log2, class, 0)
}
/// [`Epoch::new_class`] on day `days_since_genesis` of the growth schedule (the cache of
/// `memhard::cache_log2_words` for a class with the growth rule; the dataset size is the caller's).
pub fn new_class_day(seed: &str, day: &str, mode: DatasetMode, dataset_log2: u32, class: LoadClass, days_since_genesis: u64) -> Self {
let shape = Shape::for_class_day(&class, days_since_genesis);
let program = generate_class(seed, class);
let mut dataset = DatasetSource::new_shape(day, mode, dataset_log2, shape);
// hot-table experiment: a hot class fills its table from the seed bytes
dataset.attach_hot_for(&program);
Self { program, dataset }
}
/// `dataset[w]` as this epoch's program reads it: under the program's layout (era layout; linear for v2).
pub fn dataset_word(&self, w: u32) -> u32 {
self.dataset.word_at(self.program.class.layout(), w)
}
/// The production shape: memory-hard, 1 GiB dataset.
pub fn memory_hard(seed: &str, day: &str) -> Self {
Self::new(seed, day, DatasetMode::MemoryHard, DEFAULT_DATASET_LOG2)
}
/// The chain's shape: program from the 32-byte epoch seed (devnet: the epoch block hash; later the VDF
/// output) through the version 2 generator and its acceptance rule, and the cache from
/// `seed_words_from_bytes(day_bytes)` (`bind::day_bytes`). Memory-hard, 1 GiB dataset. `label` is only
/// recorded in emitted packs.
pub fn from_seed_bytes(epoch_seed: &[u8], day_bytes: &[u8], label: &str) -> Self {
Self::from_seed_bytes_class(epoch_seed, day_bytes, label, LoadClass::V2)
}
/// [`Epoch::from_seed_bytes`] with a load class (read-width experiment; Counter ASIC 2.0: the class's mixer
/// multiplier shapes the dataset). Day 0 of the growth schedule: the 2^26-word cache and the 2^28-word dataset,
/// which is every devnet pack and vector. A node past the first doubling calls [`Epoch::from_seed_bytes_day`].
pub fn from_seed_bytes_class(epoch_seed: &[u8], day_bytes: &[u8], label: &str, class: LoadClass) -> Self {
Self::from_seed_bytes_day(epoch_seed, day_bytes, label, class, 0, DEFAULT_DATASET_LOG2)
}
/// The chain's shape on day `days_since_genesis` (`memhard::days_since_genesis(day_index(header), day_index(genesis))`,
/// the node's two day indices): the program of the class, and under the class's growth rule the cache of
/// `memhard::cache_log2_words(d)` and the dataset of `memhard::dataset_log2_words(genesis_dataset_log2, d)`
/// (the genesis size is 28 for the 1 GiB devnet, 29 for the designed 2 GiB). Without the growth rule the cache
/// is 2^26 words and the dataset `2^genesis_dataset_log2` on every day.
pub fn from_seed_bytes_day(epoch_seed: &[u8], day_bytes: &[u8], label: &str, class: LoadClass, days_since_genesis: u64, genesis_dataset_log2: u32) -> Self {
let program = crate::generator::generate_from_seed_bytes_class(label, epoch_seed, class);
let key = crate::seed::seed_words_from_bytes(day_bytes);
let shape = Shape::for_class_day(&class, days_since_genesis);
let dataset_log2 = if class.growth { crate::memhard::dataset_log2_words(genesis_dataset_log2, days_since_genesis) } else { genesis_dataset_log2 };
let mut dataset = DatasetSource::from_key_shape(key, DatasetMode::MemoryHard, dataset_log2, shape);
dataset.key_bytes = day_bytes.to_vec();
dataset.attach_hot_for(&program);
Self { program, dataset }
}
/// The chain's shape with the program class (Counter ASIC 2.0, 5 October 2026): what the node's engine and the
/// miner's pack export build from the seeds a block template carries. Class v2 is [`Epoch::from_seed_bytes`]
/// exactly (the era bytes are ignored and not recorded); class v3 draws from [`crate::generator::V3_CLASS`]
/// with generator version 3 and records the era seed bytes (`E_n`) in the program for the pack.
pub fn from_chain_seeds(epoch_seed: &[u8], day_bytes: &[u8], era_bytes: Option<&[u8]>, class: ProgramClass, label: &str) -> Self {
Self { program: Self::chain_program(epoch_seed, era_bytes, class, label), dataset: Self::chain_dataset(day_bytes, class) }
}
/// The program alone of [`Epoch::from_chain_seeds`] (no cache fill): for an engine that shares the day's cache.
pub fn chain_program(epoch_seed: &[u8], era_bytes: Option<&[u8]>, class: ProgramClass, label: &str) -> Program {
crate::generator::generate_from_seed_bytes_program_class(label, epoch_seed, class, era_bytes)
}
/// [`Epoch::chain_program`] at a rung of the latency ladder (`docs/design/latency-ladder.md`): `shadow_reps` is
/// the shadow pass count the chain's step gives the epoch (0 = the class's own, which is [`Epoch::chain_program`]
/// byte for byte). The node's engine and the miner's pack export call this with the step the template names.
pub fn chain_program_shadow(epoch_seed: &[u8], era_bytes: Option<&[u8]>, class: ProgramClass, shadow_reps: u16, label: &str) -> Program {
crate::generator::generate_from_seed_bytes_program_class_shadow(label, epoch_seed, class, era_bytes, shadow_reps)
}
/// The day's cache and dataset of [`Epoch::from_chain_seeds`], the one entry the node's engine builds a day
/// cache through. The class is an argument because the Counter ASIC 2.0 integration gives class v3 its own item
/// construction (the mixer multiplier) and cache size schedule (ca2-mixer); today both classes build the day of
/// [`Epoch::from_seed_bytes`], and the engine keys its day caches on `(day, class)` so the two never share one.
pub fn chain_dataset(day_bytes: &[u8], class: ProgramClass) -> DatasetSource {
Self::chain_dataset_day(day_bytes, class, 0, DEFAULT_DATASET_LOG2)
}
/// [`Epoch::chain_dataset`] with the day's position since genesis and the network's genesis dataset size: the
/// entry the node's engine and the miner's export build every day cache through, so the cache growth schedule
/// of spec 01 section 1.13.3 has one place to act (ca2-mixer, 5 October 2026, `docs/plans/mixer-x4.md`): the
/// class's load class gives the mixer multiplier and whether the growth rule applies (`Shape::for_class_day`);
/// under the rule the cache is `2^memhard::cache_log2_words(d)` words and the dataset
/// `2^memhard::dataset_log2_words(genesis_dataset_log2, d)`; without it (class v2) the cache is 2^26 words and
/// the dataset the genesis size on every day. `days_since_genesis` is [`days_since_genesis`] of the block's and
/// the genesis header's day indices.
pub fn chain_dataset_day(day_bytes: &[u8], class: ProgramClass, days_since_genesis: u64, genesis_dataset_log2: u32) -> DatasetSource {
let lc = class.load_class();
let shape = Shape::for_class_day(&lc, days_since_genesis);
let dataset_log2 = if lc.growth { crate::memhard::dataset_log2_words(genesis_dataset_log2, days_since_genesis) } else { genesis_dataset_log2 };
let key = crate::seed::seed_words_from_bytes(day_bytes);
let mut dataset = DatasetSource::from_key_shape(key, DatasetMode::MemoryHard, dataset_log2, shape);
dataset.key_bytes = day_bytes.to_vec();
dataset
}
/// The 32 hashes of the warp starting at `base_nonce`.
pub fn hash_warp(&self, base_nonce: u32) -> [u64; LANES] {
hash_warp(&self.program, base_nonce, &self.dataset)
}
pub fn interpret_warp(&self, base_nonce: u32) -> WarpResult {
interpret_warp(&self.program, base_nonce, &self.dataset)
}
/// The hash of one nonce. The verification unit is a warp, so the 31 sibling nonces of the aligned
/// 32-nonce group are computed too (the shuffles couple the lanes).
pub fn hash(&self, nonce: u32) -> u64 {
self.hash_warp(nonce & !31)[(nonce & 31) as usize]
}
/// `hash(nonce) <= target`. The hash is 64 bits; the fork maps it into its 256-bit target space.
pub fn verify_block(&self, nonce: u32, target: u64) -> bool {
self.hash(nonce) <= target
}
}
/// One-shot `verify_block(seed, nonce, target)`: builds the epoch (cache fill included) and checks. For a
/// node use [`Epoch`] and keep it; this exists for scripts and tests.
pub fn verify_block(seed: &str, day: &str, nonce: u32, target: u64) -> bool {
Epoch::memory_hard(seed, day).verify_block(nonce, target)
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn closed_form_head_matches_pack() {
// vectors.json dataset_head for igneum-genesis (closed form), day 2026-10-03.
let ds = DatasetSource::new("2026-10-03", DatasetMode::ClosedForm, 28);
assert_eq!(ds.word(0), 0x82174c0f);
assert_eq!(ds.word(1), 0x577bdb9c);
assert_eq!(ds.word(0x0fffffff), 0xf78c84a4);
}
/// Read-width experiment: the fold for one word is a plain xor; a wide fetch hands each lane the words the
/// scalar path would; two distinct lines give two distinct maps of dst (one point suffices as a smoke check).
#[test]
fn fold_and_wide_fetch() {
assert_eq!(fold_words(0x1234_5678, &[0xdead_beef]), 0x1234_5678 ^ 0xdead_beef);
let w = [1u32, 2, 3, 4];
let x = fold_words(7, &w);
let mut y: u32 = 7 ^ 1;
for &v in &w[1..] {
y = y.rotate_left(FOLD_ROT).wrapping_mul(FOLD_MUL) ^ v;
}
assert_eq!(x, y);
assert_ne!(fold_words(7, &[1, 2, 3, 4]), fold_words(7, &[1, 2, 3, 5]));
let ds = DatasetSource::new("2026-10-03", DatasetMode::MemoryHard, 20);
let mut base = [0u32; LANES];
for (k, b) in base.iter_mut().enumerate() {
*b = ((k as u32).wrapping_mul(0x9E37_79B1) & ds.mask) & !15;
}
let mut out = [[0u32; 16]; LANES];
let items = ds.fetch_wide(&base, 16, &mut out, Layout::LINEAR);
assert!(items >= 1 && items <= LANES);
for k in 0..LANES {
for j in 0..16 {
assert_eq!(out[k][j], ds.word(base[k] + j as u32), "lane {k} word {j}");
}
}
let mut base4 = base;
for b in base4.iter_mut() {
*b += 8;
}
let items4 = ds.fetch_wide(&base4, 4, &mut out, Layout::LINEAR);
assert_eq!(items4, items);
for k in 0..LANES {
for j in 0..4 {
assert_eq!(out[k][j], ds.word(base4[k] + j as u32));
}
}
}
/// A wide-load program interprets identically on the closed form and through the memory-hard path's fold
/// (the same fold code), and a mixed-class epoch builds and hashes.
/// Variant 5: a fill word is deterministic, a rewrite changes the slot, and a second read of a written slot
/// returns the rewrite, not the fill.
#[test]
fn scratch_model() {
let seed = [1u32, 2, 3, 4, 5, 6, 7, 8];
assert_eq!(scratch_fill(&seed, 32, 3, 100, 1), scratch_fill(&seed, 32, 3, 100, 1));
assert_ne!(scratch_fill(&seed, 32, 3, 100, 1), scratch_fill(&seed, 32, 3, 100, 2));
assert_ne!(scratch_fill(&seed, 32, 3, 100, 1), scratch_fill(&seed, 64, 3, 100, 1));
let mut m = ScratchModel::new(256);
let w = [scratch_fill(&seed, 32, 3, 100, 0), scratch_fill(&seed, 32, 3, 100, 1), scratch_fill(&seed, 32, 3, 100, 2)];
let x = m.rmw(&seed, 32, 3, 100, 0xabcd);
assert_eq!(x, fold_words(0xabcd, &w));
let x2 = m.rmw(&seed, 32, 3, 100, 0xabcd);
assert_eq!(x2, fold_words(0xabcd, &scratch_rewrite(x, &w)));
assert_eq!(m.reads, 2);
let e = Epoch::new_class("igneum-genesis", "2026-10-03", DatasetMode::ClosedForm, 20, LoadClass::scratch(4, 128));
assert_eq!(e.program.scratch_ops_per_hash(), 32);
assert_eq!(e.hash_warp(0), e.hash_warp(0));
}
/// Era layout: the load address stays inside the site's window and below the mask at every dataset size (the
/// window floor of 2^26 words clamps the shrink), the interleaved memory-hard dataset reads item(t(w))[j(w)] and
/// is the same prefix at 2^20 and 2^22 words, the wide fetch agrees word for word, and an era epoch hashes
/// deterministically through the interpreter and the single-nonce API.
#[test]
fn era_windows_layout_and_epochs() {
let eb = EraParams::test_era_bytes("igneum-era-test/1");
let c = LoadClass::era(LoadClass::V2, &eb, &[1]);
let e = c.era.unwrap();
let mut ins = Instr { op: Op::Load, dst: 0, src: 1, src2: 0, imm: 0, imm2: 0, rot: 1, bit: 0, mask: 1, width: 1, win: 2, off: 3 };
let mut s = crate::seed::SplitMix64::new(7);
for log2 in [20u32, 26, 27, 28, 29] {
let mask = (1u64 << log2) as u32 - 1;
let k = ins.win.min(log2.saturating_sub(26) as u8) as u32;
for _ in 0..1000 {
let x = s.next() as u32;
let idx = load_index(Some(&e), &ins, x, mask, log2);
assert!(idx <= mask);
let (wm, off) = window(&ins, mask, log2);
assert_eq!(idx & !wm, off, "log2 {log2}");
assert_eq!(wm, mask >> k);
assert_eq!(idx, ((x.wrapping_mul(e.stride_mul).rotate_left(e.stride_rot) & wm) | off) & mask);
}
}
ins.win = 0;
assert_eq!(load_index(None, &ins, 0xdead_beef, 0x0fff_ffff, 28), 0xdead_beef & 0x0fff_ffff);
// the interleaved dataset: one day cache, the layout per program
let l = e.layout();
assert_eq!(l.pos, [1, 3, 8, 13]);
let small = DatasetSource::new("2026-10-03", DatasetMode::MemoryHard, 20);
let big = DatasetSource::new("2026-10-03", DatasetMode::MemoryHard, 22);
let m = small.memhard().unwrap();
for w in [0u32, 1, 4, 5, 255, 256, 4095, 8192, 0x0f_ffff] {
let (t, j) = l.split(w);
assert_eq!(small.word_at(l, w), crate::memhard::derive_item(t, &m.params, &m.cache)[j as usize], "w {w}");
assert_eq!(small.word_at(l, w), big.word_at(l, w), "prefix at w {w}");
assert_eq!(small.word(w), small.word_at(Layout::LINEAR, w));
}
let mut idx = [0u32; LANES];
for (k, i) in idx.iter_mut().enumerate() {
*i = (k as u32).wrapping_mul(0x9E37_79B1) & small.mask;
}
let mut out = [0u32; LANES];
small.fetch(&idx, &mut out, l);
for k in 0..LANES {
assert_eq!(out[k], small.word_at(l, idx[k]));
}
// a 16-byte era: the wide fetch keeps a lane's four words in one item
let eb3 = EraParams::test_era_bytes("igneum-era-test/3");
let c3 = LoadClass::era(LoadClass::fixed(4, 16), &eb3, &[4]);
let l3 = c3.layout();
assert_eq!(l3.pos[..2], [0, 1]);
let mut base = [0u32; LANES];
for (k, b) in base.iter_mut().enumerate() {
*b = ((k as u32).wrapping_mul(0x9E37_79B1) & small.mask) & !3;
}
let mut wide = [[0u32; 16]; LANES];
small.fetch_wide(&base, 4, &mut wide, l3);
for k in 0..LANES {
for j in 0..4 {
assert_eq!(wide[k][j], small.word_at(l3, base[k] + j as u32), "lane {k} word {j}");
}
}
// era epochs hash deterministically, differ per era, and the single-nonce API agrees with the warp
let mut seen = std::collections::HashSet::new();
for (n, c) in [(1u64, c), (3, c3)] {
let ep = Epoch::new_class("igneum-genesis", "2026-10-03", DatasetMode::MemoryHard, 20, c);
assert_eq!(ep.dataset_word(5), ep.dataset.word_at(c.layout(), 5));
let a = ep.hash_warp(64);
assert_eq!(a, ep.hash_warp(64));
assert_eq!(ep.hash(64 + 5), a[5]);
assert!(seen.insert(a[0]), "era {n}");
let closed = Epoch::new_class("igneum-genesis", "2026-10-03", DatasetMode::ClosedForm, 20, c);
assert_ne!(closed.hash_warp(64), a);
}
}
/// Hot-table experiment: an epoch of a hot class carries the table, hashes deterministically and differs from
/// version 2; the reference interpreter agrees with a hand-stepped hot load; a hot program without its table is
/// refused.
#[test]
fn hot_epochs_hash() {
let e = Epoch::new_class("igneum-genesis", "2026-10-03", DatasetMode::ClosedForm, 20, LoadClass::hot(32, 4));
let h = e.dataset.hot.as_ref().expect("the epoch fills the hot table");
assert_eq!(h.n_words(), 1 << 23);
assert_eq!(h.key, crate::memhard::hot_key(b"igneum-genesis"));
let v2 = Epoch::new_class("igneum-genesis", "2026-10-03", DatasetMode::ClosedForm, 20, LoadClass::V2);
let a = e.hash_warp(0);
assert_eq!(a, e.hash_warp(0));
assert_ne!(a, v2.hash_warp(0));
assert_ne!(a[0], a[1]);
// the same program under a 64 MiB table reads other words
let e64 = Epoch::new_class("igneum-genesis", "2026-10-03", DatasetMode::ClosedForm, 20, LoadClass::hot(64, 4));
assert_eq!(e64.program.instrs, e.program.instrs);
assert_ne!(e64.hash_warp(0), a);
// from seed bytes, the chain's shape, with a hot class
let genesis = crate::bind::unhex("edc4fa844da9dc98d37e965176f6558a31560e40502ab3ae5491b21aaaabfb07").unwrap();
let ec = Epoch::from_seed_bytes_class(&genesis, &crate::bind::day_bytes(20_730), "devnet", LoadClass::hot(32, 2));
assert_eq!(ec.dataset.hot.as_ref().unwrap().key, crate::memhard::hot_key(&genesis));
assert_eq!(ec.hash_warp(0), ec.hash_warp(0));
}
#[test]
#[should_panic(expected = "needs the epoch's hot table")]
fn hot_program_without_a_table_is_refused() {
let p = generate_class("igneum-genesis", LoadClass::hot(32, 4));
let ds = DatasetSource::new("2026-10-03", DatasetMode::ClosedForm, 20);
let _ = hash_warp(&p, 0, &ds);
}
#[test]
fn wide_class_epochs_hash() {
for name in ["w16", "w64x4", "50,35,15"] {
let c = LoadClass::parse(name).unwrap();
let e = Epoch::new_class("igneum-genesis", "2026-10-03", DatasetMode::ClosedForm, 20, c);
assert_eq!(e.program.class, c);
let a = e.hash_warp(0);
let b = e.hash_warp(0);
assert_eq!(a, b);
assert_ne!(a[0], a[1]);
}
}
#[test]
fn closed_form_genesis_vector_lane0() {
// Generator v2 vectors (4 October 2026), proto-cuda/packs/igneum-genesis/vectors.json.
let e = Epoch::new("igneum-genesis", "2026-10-03", DatasetMode::ClosedForm, 28);
let w = e.hash_warp(0);
assert_eq!(w[0], 0x31e7555c3dfd007f);
assert_eq!(w[31], 0xaab617183923ab2a);
assert_eq!(e.hash(0), w[0]);
assert_eq!(e.hash(31), w[31]);
assert!(e.verify_block(0, u64::MAX));
assert!(e.verify_block(0, w[0]));
assert!(!e.verify_block(0, w[0] - 1));
}
}

View file

@ -0,0 +1,275 @@
//! The per-day item-derivation program (Counter ASIC 3.0 item 2, `docs/plans/counter-asic-3-derivation.md`): the
//! soundness runs on the CPU.
//!
//! 1. By hand: the derived item of class dr736 restated with the scalar reference on a small cache equals the
//! verifier's batched (SoA) derivation, at the item boundary and the index wrap.
//! 2. The v2 and v3 paths are untouched: the derivation field is 0 on both, their items are the fixed-mixer items.
//! 3. Determinism and the stream: two epochs agree on every vector and file; the program is the continuation of the
//! mixer's stream (the first draw of the program follows the 40 mixer draws); a different day draws a different
//! program; the class is in the program id and the name.
//! 4. Stats beside x8: bit balance and single-bit avalanche of the derived items and of the hash, on the same seeds.
//! 5. A program whose text is the kernels': every instruction's C text evaluated by hand on one state matches the
//! scalar reference (the text forms are what Metal, CUDA and OpenCL compile).
use igneum_pow::derive::{instr_text, run_round_scalar, DOp, DeriveProgram, DERIVE_LEN_X8, DERIVE_PROGRAMS};
use igneum_pow::emit::export_pack;
use igneum_pow::generator::{generate_from_seed_bytes_class, LoadClass, V3_CLASS};
use igneum_pow::memhard::{derive_item, derive_items, mixer, round_key, Cache, MixParams, Shape, ITEM_ROUNDS};
use igneum_pow::seed::{day_key, SplitMix64};
use igneum_pow::verify::{DatasetMode, DatasetSource, Epoch};
const DAY: &str = "2026-10-03";
/// The item of a derivation class restated by hand with the scalar reference.
fn item_by_hand(t: u32, mp: &MixParams, cache: &Cache) -> [u32; 16] {
let prog = mp.derive.as_ref().expect("a derivation class");
let mut s = [0u32; 16];
s[..8].copy_from_slice(&mp.key);
for i in 0..8 {
s[8 + i] = t.wrapping_mul(mp.mul[i]).wrapping_add(mp.rc[i]);
}
for r in 0..ITEM_ROUNDS {
run_round_scalar(&prog.rounds[r], &mut s);
let line = cache.line(s[0]);
for i in 0..16 {
s[i] ^= line[i];
}
}
run_round_scalar(&prog.rounds[ITEM_ROUNDS], &mut s);
s
}
#[test]
fn derived_item_by_hand_and_in_batches() {
let key = day_key(DAY);
let cache = Cache::fill_log2(key, 16);
let shape = Shape { mixer_mult: 1, cache_log2_words: 16, derive_len: DERIVE_LEN_X8, state: false };
let mp = MixParams::with_shape(key, shape);
let prog = mp.derive.as_ref().unwrap();
assert_eq!(prog.rounds.len(), DERIVE_PROGRAMS);
assert!(prog.check().is_ok());
assert_eq!(shape.derive_instrs_per_item(), 9 * DERIVE_LEN_X8);
assert_eq!(shape.mixers_per_item(), 0);
for t in [0u32, 1, 2, 15, 16, 17, 12_345, (1 << 28) - 1, u32::MAX - 1, u32::MAX] {
assert_eq!(derive_item(t, &mp, &cache), item_by_hand(t, &mp, &cache), "t {t}");
}
// a batch of 32 distinct items against one at a time, and a short batch
let ts: Vec<u32> = (0..32).map(|k| k * 7_919 + 3).collect();
let mut out = [[0u32; 16]; 32];
derive_items(&ts, &mp, &cache, &mut out);
for (k, &t) in ts.iter().enumerate() {
assert_eq!(out[k], item_by_hand(t, &mp, &cache), "batch slot {k}");
}
let mut out5 = [[0u32; 16]; 5];
derive_items(&ts[..5], &mp, &cache, &mut out5);
assert_eq!(&out5[..], &out[..5]);
// the fixed mixer of the same key gives other items
let v3 = MixParams::with_shape(key, Shape { mixer_mult: 8, cache_log2_words: 16, derive_len: 0, state: false });
assert!(v3.derive.is_none());
assert_ne!(derive_item(0, &v3, &cache), derive_item(0, &mp, &cache));
}
#[test]
fn v2_and_v3_are_untouched() {
assert_eq!(LoadClass::V2.derive_len, 0);
assert_eq!(V3_CLASS.derive_len, 0);
assert_eq!(LoadClass::MX8.derive_len, 0);
assert_eq!(Shape::V2.derive_len, 0);
assert!(!Shape::for_class(&V3_CLASS).is_derived());
let key = day_key(DAY);
let cache = Cache::fill_log2(key, 16);
// the version 2 item restated by hand (the mixer_mult_by_hand test of memhard.rs, m = 1)
let v2 = MixParams::with_shape(key, Shape { mixer_mult: 1, cache_log2_words: 16, derive_len: 0, state: false });
let t = 12_345u32;
let mut s = [0u32; 16];
s[..8].copy_from_slice(&key);
for i in 0..8 {
s[8 + i] = t.wrapping_mul(v2.mul[i]).wrapping_add(v2.rc[i]);
}
for r in 0..8usize {
mixer(&mut s, round_key(r), &v2);
let line = cache.line(s[0]);
for i in 0..16 {
s[i] ^= line[i];
}
}
mixer(&mut s, round_key(8), &v2);
assert_eq!(derive_item(t, &v2, &cache), s);
// the mixer constants of the derivation class are the v2 draws (the stream continues after them)
let dr = MixParams::with_shape(key, Shape { mixer_mult: 1, cache_log2_words: 16, derive_len: DERIVE_LEN_X8, state: false });
assert_eq!((dr.rot, dr.mul, dr.rc), (v2.rot, v2.mul, v2.rc));
}
#[test]
fn stream_class_name_and_id() {
let key = day_key(DAY);
// the program is the continuation of the mixer stream: 40 draws, then the program
let mut rng = SplitMix64::new(key[0] as u64 | ((key[1] as u64) << 32));
for _ in 0..40 {
rng.next();
}
let expect = DeriveProgram::draw(&mut rng, DERIVE_LEN_X8);
let mp = MixParams::with_shape(key, Shape { mixer_mult: 1, cache_log2_words: 26, derive_len: DERIVE_LEN_X8, state: false });
assert_eq!(mp.derive.as_ref().unwrap(), &expect);
// another day, another program; another length, another program
let other = MixParams::with_shape(day_key("2026-10-04"), Shape { mixer_mult: 1, cache_log2_words: 26, derive_len: DERIVE_LEN_X8, state: false });
assert_ne!(other.derive.as_ref().unwrap().fingerprint(), expect.fingerprint());
let short = MixParams::with_shape(key, Shape { mixer_mult: 1, cache_log2_words: 26, derive_len: 368, state: false });
assert_eq!(short.derive.as_ref().unwrap().instr_count(), 9 * 368);
// the class: name, parse, id, and the v2 program stream (v2 loads, no width roll)
let c = LoadClass::DR736;
assert_eq!(c.name(), "dr736");
assert_eq!(LoadClass::parse("dr736"), Some(c));
assert_eq!(LoadClass::parse("dr368"), Some(LoadClass::MX4.with_derive(368)));
assert_eq!(LoadClass::parse("dr0"), None);
assert_eq!(LoadClass::parse("dr5000"), None);
assert!(c.v2_loads() && !c.takes_width_roll() && c.growth && c.mixer_mult == 1 && c.is_derived());
let p = generate_from_seed_bytes_class("igneum-genesis", b"igneum-genesis", c);
let v2 = generate_from_seed_bytes_class("igneum-genesis", b"igneum-genesis", LoadClass::V2);
let mx8 = generate_from_seed_bytes_class("igneum-genesis", b"igneum-genesis", LoadClass::MX8);
assert_eq!(p.instrs, v2.instrs, "the v2 program of the seed");
assert_ne!(p.program_id(), v2.program_id());
assert_ne!(p.program_id(), mx8.program_id());
assert_ne!(
generate_from_seed_bytes_class("igneum-genesis", b"igneum-genesis", LoadClass::MX4.with_derive(368)).program_id(),
p.program_id()
);
}
#[test]
fn determinism_and_pack_text() {
let a = Epoch::new_class("igneum-genesis", DAY, DatasetMode::MemoryHard, 20, LoadClass::DR736);
let b = Epoch::new_class("igneum-genesis", DAY, DatasetMode::MemoryHard, 20, LoadClass::DR736);
let pa = export_pack(&a, DAY, "test");
let pb = export_pack(&b, DAY, "test");
assert_eq!(pa.outs, pb.outs);
assert_eq!(pa.files, pb.files);
let names: Vec<&str> = pa.files.iter().map(|(n, _)| n.as_str()).collect();
assert!(names.contains(&"memhard.h") && names.contains(&"memhard.metal"));
for (name, text) in &pa.files {
if name == "memhard.h" || name == "memhard.metal" || name == "kernel.cl" {
for r in 0..DERIVE_PROGRAMS {
assert!(text.contains(&format!("mh_round_{r}(")), "{name} carries round program {r}");
}
assert!(!text.contains("mh_mixer(s,"), "{name}: no mixer application under a derivation program");
let dp = a.dataset.memhard().unwrap().params.derive.as_ref().unwrap();
// every instruction's text appears, in order, inside the round functions
let first = instr_text(&dp.rounds[0][0]);
assert!(text.contains(&first), "{name} carries the first instruction {first}");
}
if name == "program.h" {
assert!(text.contains("#define IGNEUM_LOAD_CLASS \"dr736\""));
assert!(text.contains("#define IGNEUM_DERIVE_LEN 736"));
assert!(text.contains("#define IGNEUM_CLASS_DERIVE_LEN 736"));
assert!(!text.contains("#define IGNEUM_MIXER_MULT"));
assert!(text.contains("#define IGNEUM_GENERATOR 2"));
}
if name == "program.json" {
assert!(text.contains("\"derive_len\": 736"));
assert!(text.contains("\"programs\": ["));
serde_json::from_str::<serde_json::Value>(text).expect("valid JSON");
}
}
// the vectors are the interpreter's
assert_eq!(pa.outs[0], a.hash_warp(0));
}
/// Bit balance and single-bit avalanche of the derived items (t flipped one bit) and of the hash, beside x8.
#[test]
fn stats_beside_x8() {
let key = day_key(DAY);
let cache = Cache::fill_log2(key, 18);
let dr = MixParams::with_shape(key, Shape { mixer_mult: 1, cache_log2_words: 18, derive_len: DERIVE_LEN_X8, state: false });
let x8 = MixParams::with_shape(key, Shape { mixer_mult: 8, cache_log2_words: 18, derive_len: 0, state: false });
for (label, mp) in [("dr736", &dr), ("x8", &x8)] {
let n = 2048u32;
let mut ones = [0u32; 512];
let mut flips = 0u64;
let mut flip_n = 0u64;
let mut seen = std::collections::HashSet::new();
for t in 0..n {
let a = derive_item(t * 2_654_435_761, mp, &cache);
assert!(seen.insert(a), "{label}: duplicate item");
for i in 0..16 {
for b in 0..32 {
ones[i * 32 + b] += (a[i] >> b) & 1;
}
}
let bit = t % 32;
let c = derive_item((t * 2_654_435_761) ^ (1 << bit), mp, &cache);
for i in 0..16 {
flips += (a[i] ^ c[i]).count_ones() as u64;
}
flip_n += 512;
}
let avalanche = flips as f64 / flip_n as f64 * 100.0;
let worst_z = ones.iter().map(|&o| ((o as f64 - n as f64 / 2.0) / (n as f64 / 4.0).sqrt()).abs()).fold(0.0, f64::max);
println!("{label}: avalanche {avalanche:.2} percent, worst bit z {worst_z:.2}");
assert!((48.5..=51.5).contains(&avalanche), "{label}: avalanche {avalanche}");
assert!(worst_z < 4.5, "{label}: worst bit z {worst_z}");
}
// the hash on the same seeds: avalanche across a nonce flip within the unit
let e = Epoch::new_class("igneum-genesis", DAY, DatasetMode::MemoryHard, 20, LoadClass::DR736);
let w0 = e.hash_warp(0);
let w1 = e.hash_warp(32);
let mut d = 0u64;
for l in 0..32 {
d += (w0[l] ^ w1[l]).count_ones() as u64;
}
let av = d as f64 / (32.0 * 64.0) * 100.0;
println!("hash unit 0 against unit 1: {av:.2} percent of bits differ");
assert!((44.0..=56.0).contains(&av));
}
/// The kernels' text forms: every form's C text, read back into the scalar reference's arithmetic by hand.
#[test]
fn text_forms_match_scalar_reference() {
let mut rng = SplitMix64::new(42);
let p = DeriveProgram::draw_candidate(&mut rng, 64, 0);
let mut s = [0u32; 16];
for (i, v) in s.iter_mut().enumerate() {
*v = 0x9e37_79b9u32.wrapping_mul(i as u32 + 1);
}
let mut seen = [false; 12];
for ins in p.rounds.iter().flatten() {
seen[ins.op as usize] = true;
let before = s;
run_round_scalar(std::slice::from_ref(ins), &mut s);
let (d, c, b) = (ins.dst as usize, ins.src as usize, ins.src2 as usize);
let (dv, cv, bv) = (before[d], before[c], before[b]);
let want = match ins.op {
DOp::Add => dv.wrapping_add(cv),
DOp::Sub => dv.wrapping_sub(cv),
DOp::Xor => dv ^ cv,
DOp::Mul => dv.wrapping_mul(cv | 1),
DOp::Rot => dv.rotate_left(ins.rot as u32).wrapping_add(cv),
DOp::XRot => (dv ^ cv).rotate_left(ins.rot as u32),
DOp::AddC => dv.wrapping_add(cv.wrapping_add(ins.imm)),
DOp::XorC => dv ^ cv ^ ins.imm,
DOp::MulC => (dv ^ cv).wrapping_mul(ins.imm),
DOp::MulC2 => dv.wrapping_mul(ins.imm).wrapping_add(cv),
DOp::AndX => dv ^ (cv & bv),
DOp::OrX => dv.wrapping_add(cv | bv),
};
assert_eq!(s[d], want, "{}", instr_text(ins));
for i in 0..16 {
if i != d {
assert_eq!(s[i], before[i], "only the destination changes: {}", instr_text(ins));
}
}
assert!(instr_text(ins).starts_with(&format!("s[{d}]")));
}
assert!(seen.iter().all(|s| *s), "64 x 9 draws cover every form");
}
/// The dataset source of the class on a day: the verifier's `word` path derives through the program.
#[test]
fn dataset_source_word_path() {
let ds = DatasetSource::new_shape(DAY, DatasetMode::MemoryHard, 20, Shape { mixer_mult: 1, cache_log2_words: 16, derive_len: DERIVE_LEN_X8, state: false });
let m = ds.memhard().unwrap();
let item = derive_item(3, &m.params, &m.cache);
for j in 0..16u32 {
assert_eq!(ds.word(3 * 16 + j), item[j as usize]);
}
assert_eq!(ds.word((1 << 20) + 5), ds.word(5), "the mask");
}

View file

@ -0,0 +1,356 @@
//! The class v3 dataset construction (mixer x4, cache growth option C; `docs/plans/mixer-x4.md`): the soundness
//! runs the brief asks for, on the CPU, with the packs for the GPU runs written on request.
//!
//! 1. Fuzz: `IGNEUM_MIXER_FUZZ` (default 200) programs through the seam (`ProgramClass::V3`), the contract on every
//! instruction (the v2 program of the seed, instruction for instruction), 4 units each across the 32-bit range
//! including the wrap, interpreted twice on the CPU; with `IGNEUM_MIXER_PACKS_OUT=<dir>` every program is written
//! as a pack with its 4 bases in vectors.json for `packbench` and the OpenCL host (the Metal fuzz).
//! 2. Stats: bit balance and single-bit-flip avalanche of the v3 hash against v2 on the same programs and nonces.
//! 3. Edge: the dataset at word 0, word MASK and the item boundary, derived through the interpreter's fetch path and
//! by hand at every multiplier 1, 2, 4, 8, on a small cache.
//! 4. Determinism: two independent epochs of the same seed and day agree on every vector and every emitted file.
//!
//! Counter ASIC 3.0 gate run (6 October 2026): `IGNEUM_MIXER_CLASS=<class>` (a `LoadClass::parse` name, for example
//! `mx8+sh256x27`) runs the fuzz, the stats and the determinism test on that class instead of `V3_CLASS`;
//! `IGNEUM_MIXER_ERA=igneum-era-test/<n>` composes that era over the class as the chain composes it inside class v3
//! (`LoadClass::era(class, E_n, &V3_ALLOWED)`, generator 3). The fuzz contract on a shadow class also checks the block:
//! `S` instructions, none a load, every field in range, and the 64 base instructions equal to the class's without the
//! shadow, draw for draw. The edge test is the dataset's alone (the shadow touches no dataset word) and takes no class.
use igneum_pow::emit::{export_pack, vectors_json};
use igneum_pow::generator::{era_generator_of, generate_era, generate_from_seed_bytes, generate_from_seed_bytes_class, generate_from_seed_bytes_program_class, EraParams, LoadClass, Op, Program, ProgramClass, GENERATOR_VERSION_V3, GENERATOR_VERSION_V4, INSTR_COUNT, V3_ALLOWED, V3_CLASS, V4_CLASS, V4_SHADOW_INSTRS};
use igneum_pow::memhard::{derive_item, mixer, round_key, Cache, MixParams, Shape};
use igneum_pow::seed::{day_key, SplitMix64};
use igneum_pow::verify::{DatasetMode, DatasetSource, Epoch};
use std::collections::HashMap;
use std::path::PathBuf;
const DAY: &str = "2026-10-03";
/// The class under test (`IGNEUM_MIXER_CLASS`, default `V3_CLASS`) and the era composed over it (`IGNEUM_MIXER_ERA`,
/// `igneum-era-test/<n>`, default none). With an era the class returned is the era class (the name carries `-era<hex>`).
fn class_under_test() -> (LoadClass, Option<[u8; 32]>) {
let class = std::env::var("IGNEUM_MIXER_CLASS").ok().map(|s| LoadClass::parse(&s).expect("a load class")).unwrap_or(V3_CLASS);
let era = std::env::var("IGNEUM_MIXER_ERA").ok().map(|s| {
assert!(s.starts_with("igneum-era-test/"), "IGNEUM_MIXER_ERA is igneum-era-test/<n>");
EraParams::test_era_bytes(&s)
});
match era {
Some(eb) => (LoadClass::era(class, &eb, &V3_ALLOWED), Some(eb)),
None => (class, None),
}
}
/// The program of `seed` under `class` (an era class carries its era bytes): the seam for `V3_CLASS`, `generate_era`
/// for an era class, the plain class generator otherwise.
fn program_of(seed: &str, class: LoadClass, era: Option<[u8; 32]>) -> Program {
match era {
Some(eb) => generate_era(seed, seed.as_bytes(), LoadClass { era: None, ..class }, &eb, &V3_ALLOWED),
None if class == V3_CLASS => generate_from_seed_bytes_program_class(seed, seed.as_bytes(), ProgramClass::V3, None),
None => generate_from_seed_bytes_class(seed, seed.as_bytes(), class),
}
}
fn contract(p: &Program, seed: &str, class: LoadClass, era: Option<[u8; 32]>) {
if class == V3_CLASS {
assert_eq!(p.generator, GENERATOR_VERSION_V3);
} else if era.is_some() {
// the generator of an era class is the class's (ca3-v4-node 7c22d0d): 4 on V4_CLASS, 3 otherwise
assert_eq!(p.generator, era_generator_of(&LoadClass { era: None, ..class }));
}
assert_eq!(p.class, class);
assert_eq!(p.instrs.len(), INSTR_COUNT);
assert_eq!(p.instrs.iter().filter(|i| i.op == Op::Load).count(), 16);
for (k, i) in p.instrs.iter().enumerate() {
assert!(i.src != i.dst, "#{k}: src == dst");
assert!((1..=31).contains(&i.rot), "#{k}: rot {}", i.rot);
assert!([1u8, 2, 4, 8, 16].contains(&i.mask), "#{k}: mask {}", i.mask);
assert!(i.dst < 8 && i.src < 8 && i.src2 < 8);
assert_eq!(i.width, 1, "#{k}: a v3 load reads one word");
}
assert!(igneum_pow::accept::check(p).is_ok(), "an accepted program");
if era.is_none() {
// no era: the base program is the v2 program of the seed (the mixer and the shadow draw nothing before it)
let v2 = generate_from_seed_bytes(seed, seed.as_bytes());
assert_eq!(p.instrs, v2.instrs, "the v2 program of the seed under the v3 construction");
assert_eq!(p.attempt, v2.attempt);
}
match class.shadow {
None => assert!(p.shadow.is_empty() && !p.has_shadow()),
Some(sh) => {
// the latency-shadow block (Counter ASIC 3.0 item 8): S ALU instructions, no load, every field in range,
// and the base program is the class's without the shadow, draw for draw (the block is drawn after it)
assert_eq!(p.shadow.len(), sh.instrs as usize, "{seed}: shadow block length");
assert!(p.has_shadow());
assert_eq!(p.shadow_instrs_per_hash(), sh.instrs as usize * sh.reps as usize * 8);
for (k, i) in p.shadow.iter().enumerate() {
assert!(!i.op.is_load() && i.op != Op::WLoad, "shadow #{k}: a load");
assert!(i.src != i.dst, "shadow #{k}: src == dst");
assert!((1..=31).contains(&i.rot), "shadow #{k}: rot {}", i.rot);
assert!([1u8, 2, 4, 8, 16].contains(&i.mask), "shadow #{k}: mask {}", i.mask);
assert!(i.dst < 8 && i.src < 8 && i.src2 < 8 && i.bit < 32, "shadow #{k}: register or bit out of range");
assert_eq!((i.width, i.win, i.off), (1, 0, 0), "shadow #{k}: no load fields");
}
let base = program_of(seed, LoadClass { shadow: None, ..class }, era);
let v4_shape = LoadClass { era: None, shadow: None, ..class } == LoadClass { shadow: None, ..V4_CLASS } && sh.instrs == V4_SHADOW_INSTRS;
if v4_shape {
// the amended class v4 (AP-F8-1, sub-version 2): on every draw path a load's source is a register
// fresh by dataflow (a load keeps freshness only from a fresh source; add, sub, xor, mad, shfl from
// either operand; rotates from their operand; or, mul, mulhi never), so its base program is its own
// stream, not class v3's; what holds is the rule itself, checked here on every load site in draw order
let mut fresh = [true; 8];
for (k, i) in p.instrs.iter().enumerate() {
let (d, a) = (i.dst as usize, i.src as usize);
if i.op.is_load() {
assert!(fresh[a], "{seed}: load #{k} reads r{} which is not fresh by dataflow", i.src);
}
fresh[d] = match i.op {
Op::Load | Op::WLoad | Op::Scratch | Op::Hot => fresh[a],
Op::Add | Op::Sub | Op::Xor | Op::Mad | Op::Shfl => fresh[d] || fresh[a],
Op::Rotl | Op::Rotr => fresh[d],
Op::Or | Op::Mul | Op::MulHi => false,
};
}
} else {
assert_eq!(p.instrs, base.instrs, "{seed}: the base program is the class's without the shadow");
assert_eq!(p.attempt, base.attempt);
}
if era.is_none() || p.generator == GENERATOR_VERSION_V4 {
// a generator-2 program carries the shadow in its id bytes; a class v4 program is generator 4
// (ca3-v4-node 7c22d0d), so its id differs from the generator-3 id of the same seeds
assert_ne!(p.program_id(), base.program_id(), "{seed}: the shadow is in the program id");
} else {
// a generator-3 program's id is program_id(3, seed, attempt), class-independent by construction
// (generator.rs program_id): under the chain's path a class v4 program shares its id with the class
// v3 program of the same seeds until the v4 seam gives it its own generator or puts the class in the
// id (Counter ASIC 3.0 gate run, 6 October 2026: an item for gates G4 and G6, not a hash fault)
assert_eq!(p.generator, GENERATOR_VERSION_V3);
if p.program_id() == base.program_id() {
println!("{seed}: generator-3 program id {:016x} is the same with and without the shadow (the v4 seam item)", p.program_id());
}
}
}
}
}
/// Write a pack whose vectors.json carries `bases` instead of the three standard bases (packbench and the OpenCL
/// host check every unit standalone and the ones inside the batch window).
fn write_pack_with_bases(dir: &PathBuf, e: &Epoch, day: &str, bases: &[u32], source: &str) {
let mut pack = export_pack(e, day, source);
let outs: Vec<[u64; 32]> = bases.iter().map(|&b| e.hash_warp(b)).collect();
let vj = vectors_json(&e.program, day, e.dataset.log2_words, bases, &outs, &pack.vectors, e.dataset.mask, source, true);
for f in pack.files.iter_mut() {
if f.0 == "vectors.json" {
f.1 = vj.clone();
}
}
pack.write_to(dir).unwrap();
}
#[test]
fn fuzz_v3_programs_cpu() {
let n: usize = std::env::var("IGNEUM_MIXER_FUZZ").ok().and_then(|s| s.parse().ok()).unwrap_or(200);
// IGNEUM_FUZZ_SEED_BASE (default 0) offsets the seed index so a continuous fuzzer (the box's capacity layer,
// infra/build-server/capacity) walks fresh programs round after round; the default run is unchanged
let base: usize = std::env::var("IGNEUM_FUZZ_SEED_BASE").ok().and_then(|s| s.parse().ok()).unwrap_or(0);
let out = std::env::var("IGNEUM_MIXER_PACKS_OUT").ok().map(PathBuf::from);
// IGNEUM_MIXER_CLASS=mx8 fuzzes the x8 candidate as a load class (generator 2 with the class in the id); the
// default is V3_CLASS through the seam; IGNEUM_MIXER_ERA composes a test era over the class (class_under_test)
let (class, era) = class_under_test();
let mut rng = SplitMix64::new(0x6967_6e65_756d_2d6d); // "igneum-m"
let shape = Shape::for_class(&class);
assert_eq!(shape.cache_log2_words, 26);
assert!(shape.mixer_mult > 1);
// one memory-hard source per dataset size (the 256 MiB cache fill is 0.2 s each)
let mut mh: HashMap<u32, DatasetSource> = HashMap::new();
let mut manifest = String::from("pack\tlog2\tprogram_id\tbases\n");
let mut units = 0usize;
let mut wraps = 0usize;
for i in base..base + n {
let seed = format!("igneum-mixer-fuzz/{i}");
let p = program_of(&seed, class, era);
contract(&p, &seed, class, era);
let b0 = (rng.below(8) as u32) * 32;
let b1 = 0x8000_0000u32.wrapping_sub(256).wrapping_add((rng.below(16) as u32) * 32);
let b2 = 0xffff_ff00u32.wrapping_add((rng.below(8) as u32) * 32);
let b3 = (rng.next() as u32) & !31;
let bases = [b0, b1, b2, b3];
wraps += bases.iter().filter(|&&b| b >= 0xffff_ff00).count();
let log2 = [24u32, 26, 28][rng.below(3) as usize];
let ds = mh.remove(&log2).unwrap_or_else(|| DatasetSource::new_shape(DAY, DatasetMode::MemoryHard, log2, shape));
let e = Epoch { program: p, dataset: ds };
for &b in &bases {
let r1 = e.interpret_warp(b);
let r2 = e.interpret_warp(b);
assert_eq!(r1.hashes, r2.hashes);
assert!(r1.items_derived >= 120 * 32 / 32 && r1.items_derived <= 4_096, "{seed}: {} items", r1.items_derived);
units += 1;
}
if let Some(dir) = &out {
let pack_name = format!("fuzz-{i:03}-{}-l{log2}", class.name());
write_pack_with_bases(&dir.join(&pack_name), &e, DAY, &bases, "igneum-pow tests/mixer.rs fuzz");
manifest.push_str(&format!(
"{pack_name}\t{log2}\t{:016x}\t{}\n",
e.program.program_id(),
bases.iter().map(|b| format!("{b}")).collect::<Vec<_>>().join(",")
));
}
mh.insert(log2, e.dataset);
}
println!("fuzz: {n} {} programs, {units} units on the CPU, {wraps} units in the top 256 nonces, seeds {base}..{}", class.name(), base + n);
assert_eq!(units, 4 * n);
assert_eq!(wraps, n);
if let Some(dir) = &out {
std::fs::create_dir_all(dir).unwrap();
std::fs::write(dir.join("manifest.tsv"), manifest).unwrap();
println!("packs written to {}", dir.display());
}
}
/// Bit balance and avalanche of the v3 hash beside v2 on the same program (the TESTS.md section 3 shape, on the
/// CPU, 2^13 nonces per seed): every output bit within 5 sigma of half ones; a single nonce-bit flip moves 50 percent
/// of the output bits within 2 points; no duplicate among the outputs.
#[test]
fn stats_v3_against_v2() {
let n_warps = 256usize; // 8,192 nonces
let (class, era) = class_under_test();
let class_name = if class == V3_CLASS { "v3".to_string() } else { class.name() };
for seed in ["igneum-genesis", "igneum-genesis/stats1"] {
let v3 = Epoch {
program: program_of(seed, class, era),
dataset: DatasetSource::new_shape(DAY, DatasetMode::MemoryHard, 24, Shape::for_class(&class)),
};
let v2 = Epoch::new(seed, DAY, DatasetMode::MemoryHard, 24);
for (name, e) in [(class_name.as_str(), &v3), ("v2", &v2)] {
let mut ones = [0u64; 64];
let mut outs = Vec::with_capacity(n_warps * 32);
for w in 0..n_warps {
let h = e.hash_warp(w as u32 * 32);
for &x in &h {
outs.push(x);
for b in 0..64 {
ones[b] += (x >> b) & 1;
}
}
}
let total = (n_warps * 32) as f64;
let sigma = (total / 4.0).sqrt();
for (b, &c) in ones.iter().enumerate() {
let z = (c as f64 - total / 2.0).abs() / sigma;
assert!(z < 5.0, "{seed} {name}: bit {b} ones {c} of {total}, z {z:.2}");
}
// avalanche: flip one bit of the nonce within the unit (lanes 0..31 differ in the low 5 bits) and across
// units (bit 5 and up): compare lane l of unit u with lane l ^ (1 << k) and with unit u ^ (1 << k)
let mut flips = 0u64;
let mut moved = 0u64;
for w in 0..64usize {
let h = e.hash_warp(w as u32 * 32);
for k in 0..5 {
for l in 0..32usize {
moved += (h[l] ^ h[l ^ (1 << k)]).count_ones() as u64;
flips += 1;
}
}
let h2 = e.hash_warp((w ^ 1) as u32 * 32);
for l in 0..32usize {
moved += (h[l] ^ h2[l]).count_ones() as u64;
flips += 1;
}
}
let avg = moved as f64 / flips as f64 / 64.0 * 100.0;
assert!((avg - 50.0).abs() < 2.0, "{seed} {name}: avalanche {avg:.2} percent");
outs.sort_unstable();
let dups = outs.windows(2).filter(|p| p[0] == p[1]).count();
assert_eq!(dups, 0, "{seed} {name}: duplicate outputs");
println!("{seed} {name}: {} outputs, avalanche {avg:.2} percent, worst bit z {:.2}", outs.len(), ones.iter().map(|&c| (c as f64 - total / 2.0).abs() / sigma).fold(0.0, f64::max));
}
assert_ne!(v3.hash_warp(0), v2.hash_warp(0));
}
}
/// The dataset edges under every multiplier on a small cache: word 0, word MASK, the last word of item 0 and the
/// first of item 1, through `DatasetSource::word` and by hand.
#[test]
fn edge_items_every_multiplier() {
let key = day_key(DAY);
let cache = Cache::fill_log2(key, 14);
for m in [1u32, 2, 4, 8] {
let mp = MixParams::with_shape(key, Shape { mixer_mult: m, cache_log2_words: 14, derive_len: 0, state: false });
let by_hand = |t: u32| -> [u32; 16] {
let mut s = [0u32; 16];
s[..8].copy_from_slice(&key);
for i in 0..8 {
s[8 + i] = t.wrapping_mul(mp.mul[i]).wrapping_add(mp.rc[i]);
}
for r in 0..8usize {
for j in 0..m as usize {
mixer(&mut s, round_key(r * m as usize + j), &mp);
}
let line = cache.line(s[0]);
for i in 0..16 {
s[i] ^= line[i];
}
}
for j in 0..m as usize {
mixer(&mut s, round_key(8 * m as usize + j), &mp);
}
s
};
for t in [0u32, 1, 0x0fff_ffff, 0xffff_ffff] {
assert_eq!(derive_item(t, &mp, &cache), by_hand(t), "m {m} item {t}");
}
}
// the interpreter's fetch path at the genesis cache: words 0, 15, 16 and MASK of a 2^20-word dataset agree with
// the item derivation, under v3
let ds = DatasetSource::new_shape(DAY, DatasetMode::MemoryHard, 20, Shape::for_class(&V3_CLASS));
let m = ds.memhard().unwrap();
for w in [0u32, 15, 16, 17, ds.mask - 1, ds.mask] {
assert_eq!(ds.word(w), derive_item(w >> 4, &m.params, &m.cache)[(w & 15) as usize]);
assert_eq!(ds.word(w), m.word(w));
}
// a load at an out-of-range register masks to the dataset: the word at mask + 1 is the word at 0
assert_eq!(ds.word(ds.mask.wrapping_add(1)), ds.word(0));
}
/// Two independent epochs of the same seed and day: every vector and every emitted file identical; the pinned v3
/// pack is what a third export writes.
#[test]
fn determinism_v3() {
let (class, era) = class_under_test();
let build = || Epoch {
program: program_of("igneum-genesis", class, era),
dataset: DatasetSource::new_shape(DAY, DatasetMode::MemoryHard, 28, Shape::for_class(&class)),
};
let a = build();
let b = build();
let pa = export_pack(&a, DAY, "a");
let pb = export_pack(&b, DAY, "a");
assert_eq!(pa.outs, pb.outs);
assert_eq!(pa.vectors, pb.vectors);
assert_eq!(pa.files, pb.files);
for (w, warp) in [(0u32, 0usize), (4096, 1), (1_000_000, 2)] {
assert_eq!(a.hash_warp(w), pa.outs[warp]);
}
// the pinned pack of the class: mx8-genesis for V3_CLASS, packs-ca3-shadow/<block> for a shadow class over mx8
// (igneum-genesis, the same day); a class with no pinned pack skips the on-disk comparison and says so
let pinned = if class == V3_CLASS {
Some("../proto-cuda/packs-ca2-mixer/mx8-genesis".to_string())
} else {
class.name().strip_prefix("mx8+").map(|b| format!("../proto-cuda/packs-ca3-shadow/{b}"))
};
let dir = match pinned.map(|d| PathBuf::from(env!("CARGO_MANIFEST_DIR")).join(d)).filter(|d| d.is_dir()) {
Some(d) => d,
None => {
println!("determinism {}: two builds equal; no pinned pack on disk for this class", class.name());
return;
}
};
println!("determinism {}: two builds equal, against the pinned pack {}", class.name(), dir.display());
for (name, text) in &pa.files {
if name == "vectors.json" || name == "vectors.h" {
continue; // the source string differs ("a" here)
}
let on_disk = std::fs::read_to_string(dir.join(name)).unwrap();
assert_eq!(&on_disk, text, "{name}");
}
}

View file

@ -0,0 +1,999 @@
//! The checked-in packs under proto-cuda/packs/ against this crate (their source since generator version 2,
//! 4 October 2026): every program instruction by instruction from its seed bytes, the generator version, attempt
//! and program id, the dataset and cache self-test words, the 96 hash vectors per pack, and every emitted file
//! byte for byte. A pack that drifts from the emitters, or a generator change that moves a vector, fails here.
//!
//! Packs: igneum-genesis-mh and igneum-devnet-v4-epoch0 (memory-hard; the latter from the devnet genesis hash as
//! the epoch seed and the day bytes of 2026-10-04), igneum-genesis and igneum-hourly (closed-form dataset,
//! interpreter regression only); and, under `proto-cuda/packs-ca2-mixer/`, the class v3 packs mx8-genesis and
//! mx8-devnet-epoch0 (Counter ASIC 2.0, 5 October 2026: generator 3 on `V3_CLASS` = mixer x8 with the cache growth
//! rule, decided 22:05 UTC under the delegated rule; the same seeds and days as the two memory-hard v2 packs, so the
//! v2 program and cache carry over and only the dataset words and the hashes change) and the x4 candidate's packs
//! mx4-genesis and mx4-devnet-epoch0 (generator 2 with the load class in the id, the record of the x4 rows).
use igneum_pow::accept;
use igneum_pow::emit::{
cuda_kernel, cuda_kernel_bound, cuda_memhard_header, export_pack, metal_memhard, metal_memhard_for, metal_program,
metal_program_bound, opencl_kernel, opencl_kernel_bound, program_header, program_json, LoadSource,
};
use igneum_pow::generator::{generate_from_seed_bytes, generate_from_seed_bytes_class, generate_from_seed_bytes_program_class, LoadClass, Op, ProgramClass, GENERATOR_VERSION, GENERATOR_VERSION_V3, LOAD_SLOTS, V3_CLASS};
use igneum_pow::memhard::{Shape, CACHE_WORDS};
use igneum_pow::verify::{DatasetMode, DatasetSource, Epoch};
use serde_json::Value;
use std::path::PathBuf;
use std::sync::OnceLock;
const PACKS: [&str; 8] = [
"igneum-genesis-mh",
"igneum-devnet-v4-epoch0",
"igneum-genesis",
"igneum-hourly",
"mx8-genesis",
"mx8-devnet-epoch0",
"mx4-genesis",
"mx4-devnet-epoch0",
];
/// The class v3 packs (generator 3 through the seam).
const PACKS_V3: [&str; 2] = ["mx8-genesis", "mx8-devnet-epoch0"];
fn packs_dir() -> PathBuf {
PathBuf::from(env!("CARGO_MANIFEST_DIR")).join("../proto-cuda/packs")
}
/// The directory a pack lives in: the class v3 packs under packs-ca2-mixer, the rest under packs.
fn pack_dir(pack: &str) -> PathBuf {
if pack.starts_with("mx4-") || pack.starts_with("mx8-") {
PathBuf::from(env!("CARGO_MANIFEST_DIR")).join("../proto-cuda/packs-ca2-mixer").join(pack)
} else {
packs_dir().join(pack)
}
}
fn read(pack: &str, file: &str) -> String {
let p = pack_dir(pack).join(file);
std::fs::read_to_string(&p).unwrap_or_else(|e| panic!("read {}: {e}", p.display()))
}
fn json(pack: &str, file: &str) -> Value {
serde_json::from_str(&read(pack, file)).unwrap_or_else(|e| panic!("{pack}/{file}: {e}"))
}
fn hex32(v: &Value) -> u32 {
u32::from_str_radix(v.as_str().unwrap().trim_start_matches("0x"), 16).unwrap()
}
fn hex64(v: &Value) -> u64 {
u64::from_str_radix(v.as_str().unwrap().trim_start_matches("0x"), 16).unwrap()
}
fn unhex(v: &Value) -> Vec<u8> {
igneum_pow::bind::unhex(v.as_str().unwrap()).unwrap()
}
/// The epoch a pack describes, rebuilt from program.json alone: the program from `seed_bytes`, the dataset from
/// `dataset.day_bytes` in the pack's mode and size. Memory-hard packs fill a 256 MiB cache (about 0.2 s), so
/// each is built once.
fn epoch(pack: &str) -> &'static Epoch {
static E: OnceLock<Vec<(String, Epoch)>> = OnceLock::new();
let all = E.get_or_init(|| {
PACKS
.iter()
.map(|p| {
let j = json(p, "program.json");
let seed = j["seed"].as_str().unwrap();
let seed_bytes = unhex(&j["seed_bytes"]);
let day_bytes = unhex(&j["dataset"]["day_bytes"]);
let mode = match j["dataset_mode"].as_str().unwrap() {
"memory-hard" => DatasetMode::MemoryHard,
_ => DatasetMode::ClosedForm,
};
let log2 = j["dataset"]["log2_words"].as_u64().unwrap() as u32;
// a class v3 pack: generator 3 on V3_CLASS through the seam, the era bytes it records, the dataset
// in the class's shape on day 0 (the growth rule's genesis cache: every pinned pack is a day-0 size)
let program = match j["generator"].as_u64().unwrap() as u32 {
GENERATOR_VERSION_V3 => {
let era = j.get("era_seed_bytes").map(unhex);
generate_from_seed_bytes_program_class(seed, &seed_bytes, ProgramClass::V3, era.as_deref())
}
// a generator 2 pack with a load class (the x4 candidate's packs): the class from program.json
_ => match j.get("load_class").and_then(|c| c.as_str()) {
Some(c) => generate_from_seed_bytes_class(seed, &seed_bytes, LoadClass::parse(c).expect("a load class name")),
None => generate_from_seed_bytes(seed, &seed_bytes),
},
};
let shape = Shape::for_class(&program.class);
let mut dataset =
DatasetSource::from_key_shape(igneum_pow::seed::seed_words_from_bytes(&day_bytes), mode, log2, shape);
dataset.key_bytes = day_bytes;
(p.to_string(), Epoch { program, dataset })
})
.collect()
});
&all.iter().find(|(n, _)| n == pack).unwrap().1
}
fn day_label(pack: &str) -> String {
json(pack, "program.json")["dataset"]["day"].as_str().unwrap().to_string()
}
fn check_program_json(pack: &str) {
let j = json(pack, "program.json");
let p = &epoch(pack).program;
assert_eq!(j["format"].as_str().unwrap(), "igneum-program-pack-3");
assert_eq!(j["generator"].as_u64().unwrap() as u32, p.generator, "{pack}: generator version");
assert_eq!(p.generator, if PACKS_V3.contains(&pack) { GENERATOR_VERSION_V3 } else { GENERATOR_VERSION });
assert_eq!(j["attempt"].as_u64().unwrap() as u32, p.attempt, "{pack}: attempt");
assert_eq!(hex64(&j["program_id"]), p.program_id(), "{pack}: program id");
let sw: Vec<u32> = j["seed_words"].as_array().unwrap().iter().map(hex32).collect();
assert_eq!(p.seed.to_vec(), sw, "{pack}: seed words");
assert_eq!(p.loads_per_hash() as u64, j["loads_per_hash"].as_u64().unwrap(), "{pack}: loads per hash");
assert_eq!(p.loads_per_hash(), 8 * LOAD_SLOTS);
assert!(accept::check(p).is_ok(), "{pack}: the pack's program passes the acceptance rule");
let instrs = j["instructions"].as_array().unwrap();
assert_eq!(instrs.len(), p.instrs.len(), "{pack}: instruction count");
for (k, (ins, ji)) in p.instrs.iter().zip(instrs).enumerate() {
assert_eq!(ji["i"].as_u64().unwrap() as usize, k);
assert_eq!(Op::from_name(ji["op"].as_str().unwrap()).unwrap(), ins.op, "{pack} #{k} op");
assert_eq!(ji["dst"].as_u64().unwrap(), ins.dst as u64, "{pack} #{k} dst");
assert_eq!(ji["src"].as_u64().unwrap(), ins.src as u64, "{pack} #{k} src");
assert_eq!(ji["src2"].as_u64().unwrap(), ins.src2 as u64, "{pack} #{k} src2");
assert_eq!(hex32(&ji["imm"]), ins.imm, "{pack} #{k} imm");
assert_eq!(hex32(&ji["imm2"]), ins.imm2, "{pack} #{k} imm2");
assert_eq!(ji["rot"].as_u64().unwrap(), ins.rot as u64, "{pack} #{k} rot");
assert_eq!(ji["bit"].as_u64().unwrap(), ins.bit as u64, "{pack} #{k} bit");
assert_eq!(ji["mask"].as_u64().unwrap(), ins.mask as u64, "{pack} #{k} mask");
}
let mix = j["op_mix"].as_object().unwrap();
for (name, count) in p.histogram() {
assert_eq!(mix[name].as_u64().unwrap() as usize, count, "{pack}: op_mix {name}");
}
assert_eq!(mix.len(), p.histogram().len());
}
#[test]
fn program_json_matches_all_packs() {
for pack in PACKS {
check_program_json(pack);
}
}
/// The genesis program of generator v2 (spec 01 section 1.4.3 vector).
#[test]
fn genesis_program_shape() {
let p = &epoch("igneum-genesis-mh").program;
assert_eq!(p.attempt, 0);
assert_eq!(p.op_mix(), "load=16 add=8 shfl=8 xor=6 mad=5 mul=5 mulhi=5 sub=4 rotl=3 rotr=3 or=1");
assert_eq!(p.program_id(), 0xbcc1248b10cc90f2);
assert_eq!(&epoch("igneum-genesis").program, p, "closed-form and memory-hard packs share the program");
}
#[test]
fn mixer_params_match_pack() {
for pack in ["igneum-genesis-mh", "igneum-devnet-v4-epoch0", "mx8-genesis", "mx8-devnet-epoch0", "mx4-genesis", "mx4-devnet-epoch0"] {
let j = json(pack, "program.json");
let mp = &epoch(pack).dataset.memhard().unwrap().params;
let key: Vec<u32> = j["dataset"]["key"].as_array().unwrap().iter().map(hex32).collect();
assert_eq!(mp.key.to_vec(), key);
let rot: Vec<u32> =
j["dataset"]["mixer"]["rot"].as_array().unwrap().iter().map(|v| v.as_u64().unwrap() as u32).collect();
assert_eq!(mp.rot.to_vec(), rot);
let mul: Vec<u32> = j["dataset"]["mixer"]["mul"].as_array().unwrap().iter().map(hex32).collect();
assert_eq!(mp.mul.to_vec(), mul);
let rc: Vec<u32> = j["dataset"]["mixer"]["rc"].as_array().unwrap().iter().map(hex32).collect();
assert_eq!(mp.rc.to_vec(), rc);
assert_eq!(hex32(&j["dataset"]["d0"]), mp.key[0]);
assert_eq!(hex32(&j["dataset"]["d1"]), mp.key[1]);
}
}
#[test]
fn cache_matches_vectors() {
let v = json("igneum-genesis-mh", "vectors.json");
let m = epoch("igneum-genesis-mh").dataset.memhard().unwrap();
let w = m.cache.words();
assert_eq!(w.len(), CACHE_WORDS);
let head: Vec<u32> = v["cache_head"].as_array().unwrap().iter().map(hex32).collect();
assert_eq!(&w[..16], &head[..]);
let last: Vec<u32> = v["cache_last_line"].as_array().unwrap().iter().map(hex32).collect();
assert_eq!(&w[CACHE_WORDS - 16..], &last[..]);
assert_eq!(m.cache.fnv1a64(), 0x48c4f5bf24166b2e, "cache FNV-1a 64 of day 2026-10-03 (MEMHARD.md), unchanged by v2");
assert_eq!(m.cache.fnv1a64(), hex64(&v["cache_fnv1a64"]));
let v = json("igneum-devnet-v4-epoch0", "vectors.json");
let m = epoch("igneum-devnet-v4-epoch0").dataset.memhard().unwrap();
assert_eq!(m.cache.fnv1a64(), hex64(&v["cache_fnv1a64"]));
assert_eq!(m.cache.fnv1a64(), 0x448274a57f508cbc, "cache FNV-1a 64 of day bytes igneum-day/20730");
}
fn check_dataset_words(pack: &str) {
let v = json(pack, "vectors.json");
let e = epoch(pack);
let ds = &e.dataset;
// a pack's self-test words are read under its program's layout (the era layout; linear for every v2 pack)
let head: Vec<u32> = v["dataset_head"].as_array().unwrap().iter().map(hex32).collect();
for (i, h) in head.iter().enumerate() {
assert_eq!(e.dataset_word(i as u32), *h, "{pack}: dataset[{i}]");
}
let last_index = v["dataset_last_index"].as_u64().unwrap() as u32;
assert_eq!(last_index, ds.mask);
assert_eq!(e.dataset_word(last_index), hex32(&v["dataset_last"]), "{pack}: dataset[MASK]");
let samples = v["dataset_samples"].as_array().unwrap();
assert_eq!(samples.len(), 64);
for s in samples {
let idx = s["index"].as_u64().unwrap() as u32;
assert_eq!(e.dataset_word(idx), hex32(&s["value"]), "{pack}: dataset[{idx}]");
}
}
#[test]
fn dataset_words_match_all_packs() {
for pack in PACKS {
check_dataset_words(pack);
}
}
/// Returns the number of hashes compared (3 warps x 32 lanes = 96).
fn check_vectors(pack: &str) -> usize {
let v = json(pack, "vectors.json");
let e = epoch(pack);
assert_eq!(v["dataset_mode"].as_str().unwrap(), e.dataset.mode().name());
assert_eq!(v["dataset_log2_words"].as_u64().unwrap() as u32, e.dataset.log2_words);
let warps = v["warps"].as_array().unwrap();
assert_eq!(warps.len(), 3);
let mut n = 0;
for w in warps {
let base = w["base_nonce"].as_u64().unwrap() as u32;
let expected: Vec<u64> = w["expected"].as_array().unwrap().iter().map(hex64).collect();
let got = e.hash_warp(base);
for lane in 0..32 {
assert_eq!(got[lane], expected[lane], "{pack}: base {base} lane {lane}");
n += 1;
}
// The single-nonce API agrees with the warp.
assert_eq!(e.hash(base + 7), expected[7]);
assert!(e.verify_block(base + 7, expected[7]));
assert!(!e.verify_block(base + 7, expected[7] - 1));
}
n
}
#[test]
fn vectors_96_per_pack() {
for pack in PACKS {
assert_eq!(check_vectors(pack), 96, "{pack}");
}
}
/// The spec 01 section 1.17 vectors (igneum-genesis-mh, generator v2).
#[test]
fn spec_vectors_genesis_mh() {
let e = epoch("igneum-genesis-mh");
let w = e.hash_warp(0);
assert_eq!(w[0], 0x42246ba99fc58e4f);
assert_eq!(w[31], 0xb08446b1f2de7793);
assert_eq!(e.hash_warp(4096)[0], 0x3d3903e310ca038f);
assert_eq!(e.hash_warp(1_000_000)[0], 0xf218c1bd58e6dfe0);
}
fn assert_same_text(pack: &str, file: &str, got: &str) {
let want = read(pack, file);
if got != want {
let (gl, wl): (Vec<&str>, Vec<&str>) = (got.lines().collect(), want.lines().collect());
for i in 0..gl.len().max(wl.len()) {
let g = gl.get(i).copied().unwrap_or("<eof>");
let w = wl.get(i).copied().unwrap_or("<eof>");
if g != w {
panic!("{pack}/{file} differs at line {}:\n pack: {w}\n rust: {g}", i + 1);
}
}
panic!("{pack}/{file} differs only in trailing bytes (len {} vs {})", got.len(), want.len());
}
}
fn check_sources(pack: &str) {
let e = epoch(pack);
let p = &e.program;
let day = day_label(pack);
let mp = e.dataset.memhard().map(|m| &m.params);
assert_same_text(pack, "kernel.cu", &cuda_kernel(p, mp));
assert_same_text(pack, "kernel_bound.cu", &cuda_kernel_bound(p, mp));
assert_same_text(pack, "program.metal", &metal_program(p, e.dataset.log2_words, LoadSource::Stored));
assert_same_text(pack, "program_bound.metal", &metal_program_bound(p, e.dataset.log2_words));
assert_same_text(pack, "kernel.cl", &opencl_kernel(p, mp));
assert_same_text(pack, "kernel_bound.cl", &opencl_kernel_bound(p, mp));
assert_same_text(pack, "program.h", &program_header(p, &day, &e.dataset));
if let Some(mp) = mp {
assert_same_text(pack, "memhard.h", &cuda_memhard_header(p, mp));
assert_same_text(pack, "memhard.metal", &igneum_pow::emit::metal_memhard_layout(mp, p.class.layout()));
}
let got = program_json(p, &day, &e.dataset);
assert_same_text(pack, "program.json", &got);
let _: Value = serde_json::from_str(&got).expect("program.json is valid JSON");
// Every load in every emitted hash kernel has the masked form, and there are exactly 16 of them (a class with
// the era layout inside has the era form instead: `((rotl_imm(rN * M, R) & WM) | OFF) & mask`, checked by
// era_emitted_sources_match_and_loads_have_the_era_form over the era packs, and here by the same count).
let era_load = if p.class.era.is_some() { "((rotl_imm(r" } else { "" };
for (file, load, masked) in [
("kernel.cu", "ds[r", " & mask]"),
("kernel_bound.cu", "ds[r", " & mask]"),
("program.metal", "dataset[r", " & MASK]"),
("program_bound.metal", "dataset[r", " & MASK]"),
] {
let text = read(pack, file);
let load = if era_load.is_empty() { load } else { era_load };
assert_eq!(text.matches(load).count(), LOAD_SLOTS, "{pack}/{file}: 16 loads");
assert_eq!(text.matches(masked).count(), LOAD_SLOTS, "{pack}/{file}: 16 masked loads");
}
}
#[test]
fn emitted_sources_match_all_packs() {
for pack in PACKS {
check_sources(pack);
}
}
/// The whole pack as `export` writes it: vectors.json and vectors.h match, and the file list is the full set.
/// The class v3 packs (Counter ASIC 2.0, `docs/plans/mixer-x4.md`): generator 3 on V3_CLASS = mx8; the program of
/// each is the v2 program of the same seed instruction for instruction (v2 loads take no width roll); the cache is
/// the v2 cache (day 0 of the growth rule: 2^26 words, the same FNV-1a 64); the dataset words differ from v2's;
/// program.json, program.h and the emitted memhard core say so; the id carries generator 3.
#[test]
fn v3_packs_are_the_v2_seeds_under_mixer_x8() {
assert_eq!(V3_CLASS.name(), "mx8");
assert_eq!(V3_CLASS.mixer_mult, 8);
assert!(V3_CLASS.growth);
assert_eq!(LoadClass { mixer_mult: 4, ..V3_CLASS }, LoadClass::MX4, "the x4 candidate differs from v3 in the multiplier alone");
for (v3, v2) in [("mx8-genesis", "igneum-genesis-mh"), ("mx8-devnet-epoch0", "igneum-devnet-v4-epoch0")] {
let e3 = epoch(v3);
let e2 = epoch(v2);
let j = json(v3, "program.json");
assert_eq!(j["program_class"].as_str().unwrap(), "v3");
assert!(j["load_class"].as_str().unwrap().starts_with("mx8"), "{v3}: mx8, or mx8 with the era inside");
assert_eq!(j["mixer_mult"].as_u64().unwrap(), 8);
assert_eq!(j["cache_growth"].as_bool().unwrap(), true);
assert_eq!(j["dataset"]["mixer_mult"].as_u64().unwrap(), 8);
assert_eq!(j["dataset"]["cache"]["log2_words"].as_u64().unwrap(), 26);
assert_eq!(e3.program.generator, GENERATOR_VERSION_V3);
if e3.program.era_bytes.is_some() {
// the era layout composed into class v3 (docs/plans/era-layout.md, 5 October 2026): a chain pack carries an
// era, so its class is V3_CLASS with the era drawn inside and its stream takes two window draws per
// instruction; the v2 program carries over only in the seed, the attempt and the day
assert_eq!(LoadClass { era: None, ..e3.program.class }, V3_CLASS, "{v3}: the composed class");
assert!(e3.program.class.era.is_some());
assert_ne!(e3.program.instrs, e2.program.instrs, "{v3}: the era windows change the stream");
} else {
assert_eq!(e3.program.class, V3_CLASS);
assert_eq!(e3.program.instrs, e2.program.instrs, "{v3}: the v2 program under the v3 construction");
}
assert_eq!(e3.program.seed, e2.program.seed);
assert_eq!(e3.program.attempt, e2.program.attempt);
assert_ne!(e3.program.program_id(), e2.program.program_id());
assert_eq!(e3.program.program_id(), igneum_pow::generator::program_id(GENERATOR_VERSION_V3, &e3.program.seed, e3.program.attempt));
let m3 = e3.dataset.memhard().unwrap();
let m2 = e2.dataset.memhard().unwrap();
assert_eq!(m3.shape(), Shape { mixer_mult: 8, cache_log2_words: 26, derive_len: 0, state: false });
assert_eq!(m3.cache.fnv1a64(), m2.cache.fnv1a64(), "{v3}: the same cache as v2 on day 0");
assert_eq!(m3.params.rot, m2.params.rot);
assert_eq!(e3.dataset.log2_words, 28);
assert_ne!(e3.dataset.word(0), e2.dataset.word(0), "{v3}: the dataset words differ");
assert_ne!(e3.hash_warp(0), e2.hash_warp(0));
let h = read(v3, "program.h");
assert!(h.contains("#define IGNEUM_GENERATOR 3\n"));
assert!(h.contains("#define IGNEUM_PROGRAM_CLASS \"v3\"\n"));
assert!(h.contains("#define IGNEUM_MIXER_MULT 8"));
assert!(h.contains("#define IGNEUM_CACHE_GROWTH 1"));
assert!(h.contains("#define IGNEUM_CACHE_LOG2_WORDS 26\n"));
assert!(h.contains("#define IGNEUM_LOAD_CLASS \"mx8"), "mx8, or mx8 with the era inside");
for file in ["memhard.h", "memhard.metal", "kernel.cl"] {
let text = read(v3, file);
assert_eq!(text.matches("j < 8u; ++j) mh_mixer(s, 0x9E3779B9u * (r * 8u + j + 1u))").count(), 1, "{v3}/{file}");
assert_eq!(text.matches("j < 8u; ++j) mh_mixer(s, 0x9E3779B9u * (64u + j + 1u))").count(), 1, "{v3}/{file}");
}
for file in ["memhard.h", "memhard.metal", "kernel.cl"] {
let text = read(v2, file);
assert_eq!(text.matches("j < 8u").count(), 0, "{v2}/{file}: the v2 text has no multiplier loop");
}
}
// the devnet v3 pack records era 0's stand-in, the devnet genesis hash
let j = json("mx8-devnet-epoch0", "program.json");
assert_eq!(unhex(&j["era_seed_bytes"]), unhex(&j["seed_bytes"]));
assert!(read("mx8-devnet-epoch0", "program.h").contains("#define IGNEUM_ERA_SEED_HEX \"edc4fa844da9dc98"));
assert!(json("mx8-genesis", "program.json").get("era_seed_bytes").is_none());
// the x4 candidate's packs: generator 2, the class in the id, the v2 program of the seed, mixer x4
for (x4, v2) in [("mx4-genesis", "igneum-genesis-mh"), ("mx4-devnet-epoch0", "igneum-devnet-v4-epoch0")] {
let e4 = epoch(x4);
let j = json(x4, "program.json");
assert_eq!(e4.program.generator, GENERATOR_VERSION);
assert_eq!(j["load_class"].as_str().unwrap(), "mx4");
assert_eq!(e4.program.class, LoadClass::MX4);
assert_eq!(e4.program.instrs, epoch(v2).program.instrs);
assert_eq!(e4.dataset.memhard().unwrap().shape(), Shape { mixer_mult: 4, cache_log2_words: 26, derive_len: 0, state: false });
assert!(read(x4, "memhard.h").contains("j < 4u; ++j) mh_mixer(s, 0x9E3779B9u * (r * 4u + j + 1u))"));
}
}
fn check_export(pack: &str) {
let e = epoch(pack);
let v = json(pack, "vectors.json");
let source = v["source"].as_str().unwrap();
let out = export_pack(e, &day_label(pack), source);
let file = |name: &str| -> &str { &out.files.iter().find(|(n, _)| n == name).unwrap().1 };
assert_same_text(pack, "vectors.json", file("vectors.json"));
assert_same_text(pack, "vectors.h", file("vectors.h"));
let mut expected = vec![
"program.json",
"vectors.json",
"kernel.cu",
"kernel.cl",
"program.h",
"vectors.h",
"program.metal",
"program_bound.metal",
"kernel_bound.cu",
"kernel_bound.cl",
];
if e.dataset.mode() == DatasetMode::MemoryHard {
expected.extend(["memhard.h", "memhard.metal"]);
}
assert_eq!(out.files.iter().map(|(n, _)| n.as_str()).collect::<Vec<_>>(), expected);
let mut on_disk: Vec<String> = std::fs::read_dir(pack_dir(pack))
.unwrap()
.map(|d| d.unwrap().file_name().to_string_lossy().to_string())
.filter(|n| !n.starts_with('.'))
.collect();
on_disk.sort();
let mut want: Vec<String> = expected.iter().map(|s| s.to_string()).collect();
want.sort();
assert_eq!(on_disk, want, "{pack}: no stale file in the pack directory");
}
#[test]
fn export_pack_matches_all_packs() {
for pack in PACKS {
check_export(pack);
}
}
#[test]
fn item_is_independent_of_dataset_size() {
// MEMHARD.md 1.7: a smaller dataset is a prefix of items, so dataset[w] is the same at every size.
let big = &epoch("igneum-genesis-mh").dataset;
let m = big.memhard().unwrap();
for w in [0u32, 1, 15, 16, 17, 0x00ff_ffff, 0x03ff_ffff] {
assert_eq!(big.word(w), m.word(w));
}
}
/// The devnet pack is the chain's own derivation: epoch seed = the devnet genesis hash, day bytes = `bind::day_bytes(20730)`.
#[test]
fn devnet_pack_is_the_chain_derivation() {
let j = json("igneum-devnet-v4-epoch0", "program.json");
let genesis = igneum_pow::bind::unhex("edc4fa844da9dc98d37e965176f6558a31560e40502ab3ae5491b21aaaabfb07").unwrap();
assert_eq!(unhex(&j["seed_bytes"]), genesis);
assert_eq!(unhex(&j["dataset"]["day_bytes"]), igneum_pow::bind::day_bytes(20_730).to_vec());
let e = Epoch::from_seed_bytes(&genesis, &igneum_pow::bind::day_bytes(20_730), "devnet");
assert_eq!(e.program.instrs, epoch("igneum-devnet-v4-epoch0").program.instrs);
assert_eq!(e.hash_warp(0), epoch("igneum-devnet-v4-epoch0").hash_warp(0));
}
// ---------------------------------------------------------------------------------------------------------
// Era layout packs (5 October 2026, docs/plans/era-layout.md): proto-cuda/packs-ca2-era/era-<n>, n in 0..5, the
// devnet epoch seed and day bytes under the era class of test era seed igneum-era-test/<n>, the width pinned at
// 4 bytes (allowed_widths in program.json). Checked like the pinned packs, plus the one load form of 1.3 by text search.
// ---------------------------------------------------------------------------------------------------------
use igneum_pow::generator::{generate_era, EraParams, V3_ALLOWED};
const ERA_PACKS: [&str; 6] = ["era-0", "era-1", "era-2", "era-3", "era-4", "era-5"];
fn era_packs_dir() -> PathBuf {
PathBuf::from(env!("CARGO_MANIFEST_DIR")).join("../proto-cuda/packs-ca2-era")
}
fn era_read(pack: &str, file: &str) -> String {
let p = era_packs_dir().join(pack).join(file);
std::fs::read_to_string(&p).unwrap_or_else(|e| panic!("read {}: {e}", p.display()))
}
fn era_json(pack: &str, file: &str) -> Value {
serde_json::from_str(&era_read(pack, file)).unwrap_or_else(|e| panic!("{pack}/{file}: {e}"))
}
/// The era class of a pack: the era bytes from program.json (`era_seed_bytes`, the chain's `E_n`; the test seed
/// `igneum-era-test/<n>` of the pack's number gives the same bytes), the allowed set from `era.allowed_widths`
/// (class v3's `V3_ALLOWED`); the pack's recorded stream words and draw must be the class's.
fn era_class(pack: &str) -> LoadClass {
let j = era_json(pack, "program.json");
let n: u64 = pack.trim_start_matches("era-").parse().unwrap();
let eb = unhex(&j["era_seed_bytes"]);
assert_eq!(eb, EraParams::test_era_bytes(&format!("igneum-era-test/{n}")).to_vec(), "{pack}: the era bytes of test seed {n}");
let allowed: Vec<u8> = j["era"]["allowed_widths"].as_array().unwrap().iter().map(|v| v.as_u64().unwrap() as u8).collect();
assert_eq!(allowed, V3_ALLOWED.to_vec(), "{pack}: class v3's width set");
// the measurement packs of 5 October 2026: the era layout over version 2's construction (mixer x1, the genesis
// cache), generator 3 and the era bytes recorded; the chain's class v3 composes the same draw over LoadClass::MX4
// (generator tests era_programs_are_accepted and program_classes), and the integration re-exports these packs
let c = LoadClass::era(LoadClass::V2, &eb, &allowed);
let e = c.era.unwrap();
let words: Vec<u32> = j["era"]["seed_words"].as_array().unwrap().iter().map(hex32).collect();
assert_eq!(e.words.to_vec(), words, "{pack}: era seed words");
assert_eq!(e.width_words as u64, j["era"]["width_words"].as_u64().unwrap(), "{pack}: width");
assert_eq!(e.stride_mul, hex32(&j["era"]["stride_mul"]), "{pack}: stride mul");
assert_eq!(e.stride_rot as u64, j["era"]["stride_rot"].as_u64().unwrap(), "{pack}: stride rot");
let pos: Vec<u8> = j["era"]["interleave"].as_array().unwrap().iter().map(|v| v.as_u64().unwrap() as u8).collect();
assert_eq!(e.pos.to_vec(), pos, "{pack}: interleave");
c
}
fn era_epoch(pack: &str) -> &'static Epoch {
static E: OnceLock<Vec<(String, Epoch)>> = OnceLock::new();
let all = E.get_or_init(|| {
ERA_PACKS
.iter()
.map(|p| {
let j = era_json(p, "program.json");
let seed = j["seed"].as_str().unwrap();
let seed_bytes = unhex(&j["seed_bytes"]);
let day_bytes = unhex(&j["dataset"]["day_bytes"]);
assert_eq!(j["dataset_mode"].as_str().unwrap(), "memory-hard");
let log2 = j["dataset"]["log2_words"].as_u64().unwrap() as u32;
let class = era_class(p);
assert_eq!(log2, igneum_pow::verify::DEFAULT_DATASET_LOG2);
let eb = unhex(&j["era_seed_bytes"]);
let program = generate_era(seed, &seed_bytes, LoadClass::V2, &eb, &V3_ALLOWED);
assert_eq!(program.class, class, "{p}: the pack's era class");
assert_eq!(program.generator, GENERATOR_VERSION_V3);
assert_eq!(program.era_bytes.as_deref(), Some(&eb[..]));
let mut dataset = DatasetSource::from_key(igneum_pow::seed::seed_words_from_bytes(&day_bytes), DatasetMode::MemoryHard, log2);
dataset.key_bytes = day_bytes;
(p.to_string(), Epoch { program, dataset })
})
.collect()
});
&all.iter().find(|(n, _)| n == pack).unwrap().1
}
/// program.json of an era pack: generator, attempt, id, class, every instruction with width, win and off, and the
/// program passes the acceptance rule.
#[test]
fn era_program_json_matches() {
for pack in ERA_PACKS {
let j = era_json(pack, "program.json");
let p = &era_epoch(pack).program;
assert_eq!(j["generator"].as_u64().unwrap() as u32, GENERATOR_VERSION_V3, "{pack}: a class v3 pack");
assert_eq!(j["program_class"].as_str().unwrap(), "v3");
assert_eq!(j["attempt"].as_u64().unwrap() as u32, p.attempt, "{pack}: attempt");
assert_eq!(hex64(&j["program_id"]), p.program_id(), "{pack}: program id");
assert_eq!(j["load_class"].as_str().unwrap(), p.class.name(), "{pack}: class");
assert_eq!(j["bytes_per_hash"].as_u64().unwrap() as usize, p.bytes_per_hash());
assert_eq!(p.loads_per_hash(), 8 * LOAD_SLOTS);
assert!(accept::check(p).is_ok(), "{pack}: acceptance");
let instrs = j["instructions"].as_array().unwrap();
assert_eq!(instrs.len(), p.instrs.len());
for (k, (ins, ji)) in p.instrs.iter().zip(instrs).enumerate() {
assert_eq!(Op::from_name(ji["op"].as_str().unwrap()).unwrap(), ins.op, "{pack} #{k} op");
assert_eq!(ji["dst"].as_u64().unwrap(), ins.dst as u64);
assert_eq!(ji["src"].as_u64().unwrap(), ins.src as u64);
assert_eq!(hex32(&ji["imm"]), ins.imm);
assert_eq!(ji["width"].as_u64().unwrap(), ins.width as u64, "{pack} #{k} width");
assert_eq!(ji["win"].as_u64().unwrap(), ins.win as u64, "{pack} #{k} win");
assert_eq!(ji["off"].as_u64().unwrap(), ins.off as u64, "{pack} #{k} off");
if ins.op == Op::Load {
assert_eq!(ins.width, p.class.era.unwrap().width_words);
assert!(ins.win <= 2 && (ins.off as u32) < (1u32 << ins.win));
}
}
}
}
/// The six era packs are the same program seed under six draws: the instruction lists agree, the widths and layouts
/// follow the draw, and the dataset words differ from the linear layout exactly when the interleave is not linear.
#[test]
fn era_packs_share_the_program_and_differ_in_layout() {
let linear = &epoch("igneum-devnet-v4-epoch0").dataset;
for pack in ERA_PACKS {
let e = era_epoch(pack);
assert_eq!(e.program.seed_bytes, epoch("igneum-devnet-v4-epoch0").program.seed_bytes, "{pack}: the devnet seed");
let strip = |p: &igneum_pow::generator::Program| {
p.instrs.iter().map(|i| (i.op, i.dst, i.src, i.src2, i.imm, i.imm2, i.rot, i.bit, i.mask, i.win, i.off)).collect::<Vec<_>>()
};
assert_eq!(strip(&e.program), strip(&era_epoch("era-0").program), "{pack}: same stream as era-0");
let l = e.program.class.layout();
let same_at_1 = (0..64u32).all(|w| e.dataset_word(w * 977 + 1) == linear.word(w * 977 + 1));
assert_eq!(same_at_1, l.is_linear(), "{pack}: layout {:?}", l.pos);
assert_eq!(e.dataset_word(0), linear.word(0), "{pack}: word 0 is item 0 word 0 in every layout");
// the chain's shared day cache serves every era: the day's dataset source is the pinned pack's, bit for bit
assert_eq!(e.dataset.key, linear.key);
assert_eq!(e.dataset.memhard().unwrap().cache.fnv1a64(), linear.memhard().unwrap().cache.fnv1a64());
}
}
#[test]
fn era_dataset_words_and_vectors_match() {
for pack in ERA_PACKS {
let v = era_json(pack, "vectors.json");
let e = era_epoch(pack);
let ds = &e.dataset;
let head: Vec<u32> = v["dataset_head"].as_array().unwrap().iter().map(hex32).collect();
for (i, h) in head.iter().enumerate() {
assert_eq!(e.dataset_word(i as u32), *h, "{pack}: dataset[{i}]");
}
assert_eq!(e.dataset_word(ds.mask), hex32(&v["dataset_last"]), "{pack}: dataset[MASK]");
for s in v["dataset_samples"].as_array().unwrap() {
let idx = s["index"].as_u64().unwrap() as u32;
assert_eq!(e.dataset_word(idx), hex32(&s["value"]), "{pack}: dataset[{idx}]");
}
assert_eq!(ds.memhard().unwrap().cache.fnv1a64(), hex64(&v["cache_fnv1a64"]));
let mut n = 0;
for w in v["warps"].as_array().unwrap() {
let base = w["base_nonce"].as_u64().unwrap() as u32;
let expected: Vec<u64> = w["expected"].as_array().unwrap().iter().map(hex64).collect();
let got = e.hash_warp(base);
for lane in 0..32 {
assert_eq!(got[lane], expected[lane], "{pack}: base {base} lane {lane}");
n += 1;
}
assert_eq!(e.hash(base + 7), expected[7]);
}
assert_eq!(n, 96, "{pack}");
}
}
/// Every emitted file of every era pack matches the emitters byte for byte, the export reproduces vectors.json and
/// vectors.h, and every dataset load in every hash kernel has the one era form (no plain `ds[rN & mask]` remains).
#[test]
fn era_emitted_sources_match_and_loads_have_the_era_form() {
for pack in ERA_PACKS {
let e = era_epoch(pack);
let day = era_json(pack, "program.json")["dataset"]["day"].as_str().unwrap().to_string();
let source = era_json(pack, "vectors.json")["source"].as_str().unwrap().to_string();
let out = export_pack(e, &day, &source);
for (name, text) in &out.files {
let want = era_read(pack, name);
assert!(text == &want, "{pack}/{name} differs from the emitter");
}
let mut on_disk: Vec<String> = std::fs::read_dir(era_packs_dir().join(pack))
.unwrap()
.map(|d| d.unwrap().file_name().to_string_lossy().to_string())
.filter(|n| !n.starts_with('.') && n != "seeds.txt")
.collect();
on_disk.sort();
let mut want: Vec<String> = out.files.iter().map(|(n, _)| n.clone()).collect();
want.sort();
assert_eq!(on_disk, want, "{pack}: the pack holds the export's files and seeds.txt only");
let era = e.program.class.era.unwrap();
let mul = format!("0x{:08x}u", era.stride_mul);
for (file, mask) in [
("kernel.cu", "mask"),
("kernel_bound.cu", "mask"),
("kernel.cl", "mask"),
("kernel_bound.cl", "mask"),
("program.metal", "MASK"),
("program_bound.metal", "MASK"),
] {
let text = era_read(pack, file);
let kernels = if file.starts_with("kernel_bound") || file == "kernel.cu" || file == "kernel.cl" || file.starts_with("program") { 1 } else { 1 };
// kernel_bound.cl carries igneum_hash and igneum_hash_bound: two kernels
let kernels = if file == "kernel_bound.cl" { 2 } else { kernels };
let era_form: usize = text
.lines()
.filter(|l| l.contains("rotl_imm(r") && l.contains(&format!(" * {mul}, {}u) & ", era.stride_rot)) && l.contains(&format!(") & {mask}")))
.filter(|l| l.contains("ds[") || l.contains("dataset[") || l.contains("b_ = "))
.count();
assert_eq!(era_form, LOAD_SLOTS * kernels, "{pack}/{file}: {} loads of the era form", LOAD_SLOTS * kernels);
let plain = text.lines().filter(|l| l.contains("ds[r") || l.contains("dataset[r")).count();
assert_eq!(plain, 0, "{pack}/{file}: a load without the era form");
}
// the layout helpers appear exactly when the layout is not linear
let mh = era_read(pack, "memhard.h");
assert_eq!(mh.contains("mh_addr("), !era.layout().is_linear(), "{pack}: memhard.h layout helpers");
}
}
/// An era pack's dataset is a prefix at every size of at least 2^16 words: the 2^20-word source gives the pack's
/// words below 2^20.
#[test]
fn era_dataset_is_a_prefix_at_smaller_sizes() {
for pack in ["era-1", "era-3"] {
let e = era_epoch(pack);
let small = DatasetSource::from_key(e.dataset.key, DatasetMode::MemoryHard, 20);
let l = e.program.class.layout();
for w in [0u32, 1, 2, 3, 16, 255, 4096, 65_535, 65_536, 0x000f_ffff] {
assert_eq!(small.word_at(l, w), e.dataset_word(w), "{pack}: w {w}");
}
}
}
// ---------------------------------------------------------------------------------------------------------
// Hot-table experiment (5 October 2026, docs/plans/hot-table.md): the five packs under proto-cuda/packs-ca2-hot/ are
// pinned the same way (program, vectors, every emitted file byte for byte), plus the hot table's fingerprint and the
// one-form load check: exactly 16 - k masked dataset loads and exactly k hot loads in every hash kernel.
// ---------------------------------------------------------------------------------------------------------
const HOT_PACKS: [&str; 8] = ["hot32k4", "hot64k4", "hot96k4", "hot64k2", "hot64k8", "hot32k4a", "hot64k4a", "hot96k4a"];
fn hot_packs_dir() -> PathBuf {
PathBuf::from(env!("CARGO_MANIFEST_DIR")).join("../proto-cuda/packs-ca2-hot")
}
fn hread(pack: &str, file: &str) -> String {
let p = hot_packs_dir().join(pack).join(file);
std::fs::read_to_string(&p).unwrap_or_else(|e| panic!("read {}: {e}", p.display()))
}
fn hjson(pack: &str, file: &str) -> Value {
serde_json::from_str(&hread(pack, file)).unwrap_or_else(|e| panic!("{pack}/{file}: {e}"))
}
/// The epoch of a hot pack from program.json alone: the class from `load_class`, the program from the seed bytes,
/// the dataset from the day bytes, the hot table from the seed bytes (what `Epoch::from_seed_bytes_class` does).
fn hepoch(pack: &str) -> &'static Epoch {
static E: OnceLock<Vec<(String, Epoch)>> = OnceLock::new();
let all = E.get_or_init(|| {
HOT_PACKS
.iter()
.map(|p| {
let j = hjson(p, "program.json");
let seed = j["seed"].as_str().unwrap();
let seed_bytes = unhex(&j["seed_bytes"]);
let day_bytes = unhex(&j["dataset"]["day_bytes"]);
assert_eq!(j["dataset_mode"].as_str().unwrap(), "memory-hard");
let class = LoadClass::parse(j["load_class"].as_str().unwrap()).unwrap();
assert_eq!(class.name(), *p, "the pack directory is the class name");
let log2 = j["dataset"]["log2_words"].as_u64().unwrap() as u32;
let program = generate_from_seed_bytes_class(seed, &seed_bytes, class);
let mut dataset =
DatasetSource::from_key(igneum_pow::seed::seed_words_from_bytes(&day_bytes), DatasetMode::MemoryHard, log2);
dataset.key_bytes = day_bytes;
dataset.attach_hot_for(&program);
(p.to_string(), Epoch { program, dataset })
})
.collect()
});
&all.iter().find(|(n, _)| n == pack).unwrap().1
}
fn hassert_same_text(pack: &str, file: &str, got: &str) {
let want = hread(pack, file);
if got != want {
let (gl, wl): (Vec<&str>, Vec<&str>) = (got.lines().collect(), want.lines().collect());
for i in 0..gl.len().max(wl.len()) {
let g = gl.get(i).copied().unwrap_or("<eof>");
let w = wl.get(i).copied().unwrap_or("<eof>");
if g != w {
panic!("{pack}/{file} differs at line {}:\n pack: {w}\n rust: {g}", i + 1);
}
}
panic!("{pack}/{file} differs only in trailing bytes (len {} vs {})", got.len(), want.len());
}
}
#[test]
fn hot_packs_program_and_vectors() {
for pack in HOT_PACKS {
let e = hepoch(pack);
let p = &e.program;
let j = hjson(pack, "program.json");
let h = p.class.hot.unwrap();
assert_eq!(j["generator"].as_u64().unwrap() as u32, GENERATOR_VERSION);
assert_eq!(j["attempt"].as_u64().unwrap() as u32, p.attempt);
assert_eq!(hex64(&j["program_id"]), p.program_id(), "{pack}: program id");
let dataset_slots = if h.added { 16 } else { 16 - h.k as usize };
assert_eq!(j["loads_per_hash"].as_u64().unwrap() as usize, (dataset_slots + h.k as usize) * 8);
assert_eq!(j["hot_table"]["mb"].as_u64().unwrap(), h.mb as u64);
assert_eq!(j["hot_table"]["slots"].as_u64().unwrap(), h.k as u64);
assert_eq!(j["hot_table"]["dataset_slots"].as_u64().unwrap() as usize, dataset_slots);
assert_eq!(j["hot_table"]["words"].as_u64().unwrap() as u32, p.hot_words());
assert_eq!(j["op_mix"]["hot"].as_u64().unwrap(), h.k as u64, "{pack}: k hot instructions");
assert_eq!(j["op_mix"]["load"].as_u64().unwrap() as usize, dataset_slots);
assert_eq!(p.items_per_warp(), dataset_slots * 8 * 32);
assert!(accept::check(p).is_ok(), "{pack}: passes the acceptance rule");
let v2 = &epoch("igneum-genesis-mh").program;
if !h.added {
// replaced form: the version 2 genesis program with k loads redirected (attempt 0 on both)
assert_eq!(p.attempt, v2.attempt);
for (a, b) in p.instrs.iter().zip(v2.instrs.iter()) {
if a.op == Op::Hot {
assert_eq!(b.op, Op::Load);
} else {
assert_eq!(a, b);
}
}
} else {
// added form: 16 + k load slots, so another slot draw and another program; 16 dataset loads stay
assert_ne!(p.instrs, v2.instrs);
assert_eq!(p.instrs.iter().filter(|i| i.op == Op::Load).count(), 16);
assert!(p.instrs.iter().all(|i| i.width == 1));
}
// the hot table: the pack's head, last line and fingerprint
let v = hjson(pack, "vectors.json");
let t = e.dataset.hot.as_ref().unwrap();
assert_eq!(t.n_words(), p.hot_words());
let head: Vec<u32> = v["hot_head"].as_array().unwrap().iter().map(hex32).collect();
assert_eq!(&t.words()[..16], &head[..]);
let last: Vec<u32> = v["hot_last_line"].as_array().unwrap().iter().map(hex32).collect();
assert_eq!(&t.words()[t.words().len() - 16..], &last[..]);
assert_eq!(t.fnv1a64(), hex64(&v["hot_fnv1a64"]), "{pack}: hot_fnv1a64");
assert_eq!(t.key, igneum_pow::memhard::hot_key(&p.seed_bytes));
// the cache is the day's, unchanged by the class
assert_eq!(e.dataset.memhard().unwrap().cache.fnv1a64(), 0x48c4f5bf24166b2e);
// 96 vectors
let warps = v["warps"].as_array().unwrap();
assert_eq!(warps.len(), 3);
for w in warps {
let base = w["base_nonce"].as_u64().unwrap() as u32;
let expected: Vec<u64> = w["expected"].as_array().unwrap().iter().map(hex64).collect();
let got = e.hash_warp(base);
for lane in 0..32 {
assert_eq!(got[lane], expected[lane], "{pack}: base {base} lane {lane}");
}
assert_eq!(e.hash(base + 5), expected[5]);
}
// the dataset words are the day's
let head: Vec<u32> = v["dataset_head"].as_array().unwrap().iter().map(hex32).collect();
for (i, hd) in head.iter().enumerate() {
assert_eq!(e.dataset.word(i as u32), *hd);
}
}
// the same k at three sizes: identical programs, three fingerprints, three vector sets
let a = hepoch("hot32k4");
let b = hepoch("hot64k4");
let c = hepoch("hot96k4");
assert_eq!(a.program.instrs, b.program.instrs);
assert_eq!(b.program.instrs, c.program.instrs);
assert_ne!(a.hash_warp(0), b.hash_warp(0));
assert_ne!(b.hash_warp(0), c.hash_warp(0));
}
#[test]
fn hot_packs_emitted_sources_and_load_forms() {
for pack in HOT_PACKS {
let e = hepoch(pack);
let p = &e.program;
let k = p.class.hot.unwrap().k as usize;
let dataset_loads = p.class.dataset_slots();
let day = hjson(pack, "program.json")["dataset"]["day"].as_str().unwrap().to_string();
let mp = &e.dataset.memhard().unwrap().params;
hassert_same_text(pack, "kernel.cu", &cuda_kernel(p, Some(mp)));
hassert_same_text(pack, "kernel_bound.cu", &cuda_kernel_bound(p, Some(mp)));
hassert_same_text(pack, "program.metal", &metal_program(p, e.dataset.log2_words, LoadSource::Stored));
hassert_same_text(pack, "program_bound.metal", &metal_program_bound(p, e.dataset.log2_words));
hassert_same_text(pack, "kernel.cl", &opencl_kernel(p, Some(mp)));
hassert_same_text(pack, "kernel_bound.cl", &opencl_kernel_bound(p, Some(mp)));
hassert_same_text(pack, "program.h", &program_header(p, &day, &e.dataset));
hassert_same_text(pack, "memhard.h", &cuda_memhard_header(p, mp));
hassert_same_text(pack, "memhard.metal", &metal_memhard_for(p, mp));
assert_ne!(metal_memhard_for(p, mp), metal_memhard(mp), "{pack}: the hot fill kernel is in memhard.metal");
let got = program_json(p, &day, &e.dataset);
hassert_same_text(pack, "program.json", &got);
let _: Value = serde_json::from_str(&got).expect("program.json is valid JSON");
let v = hjson(pack, "vectors.json");
let out = export_pack(e, &day, v["source"].as_str().unwrap());
let file = |name: &str| -> &str { &out.files.iter().find(|(n, _)| n == name).unwrap().1 };
hassert_same_text(pack, "vectors.json", file("vectors.json"));
hassert_same_text(pack, "vectors.h", file("vectors.h"));
assert_eq!(out.files.len(), 12);
// One form per dialect, exactly 16 - k masked dataset loads and k hot loads in every hash kernel; the fill
// kernel is present once per source that builds the table.
for (file, load, masked, hot) in [
("kernel.cu", "ds[r", " & mask]", "hot[__umulhi(r"),
("kernel_bound.cu", "ds[r", " & mask]", "hot[__umulhi(r"),
("program.metal", "dataset[r", " & MASK]", "hot[mulhi(r"),
("program_bound.metal", "dataset[r", " & MASK]", "hot[mulhi(r"),
("kernel.cl", "ds[r", " & mask]", "hot[mul_hi(r"),
] {
let text = hread(pack, file);
assert_eq!(text.matches(load).count(), dataset_loads, "{pack}/{file}: {dataset_loads} dataset loads");
assert_eq!(text.matches(masked).count(), dataset_loads, "{pack}/{file}: masked loads");
assert_eq!(text.matches(hot).count(), k, "{pack}/{file}: {k} hot loads");
assert!(text.contains(&format!("#define HOT_WORDS 0x{:08x}u", p.hot_words())), "{pack}/{file}: HOT_WORDS literal");
}
// kernel_bound.cl carries both kernels
let text = hread(pack, "kernel_bound.cl");
assert_eq!(text.matches("hot[mul_hi(r").count(), 2 * k);
assert_eq!(text.matches("ds[r").count(), 2 * dataset_loads);
for file in ["kernel.cu", "kernel.cl", "kernel_bound.cl", "memhard.metal"] {
assert_eq!(hread(pack, file).matches("igneum_hot_fill(").count(), 1, "{pack}/{file}: one hot fill kernel");
}
assert_eq!(hread(pack, "memhard.h").matches("void ht_segment(").count(), 1);
let ph = hread(pack, "program.h");
assert!(ph.contains(&format!("#define IGNEUM_HOT_MB {}", p.class.hot.unwrap().mb)));
assert!(ph.contains(&format!("#define IGNEUM_HOT_SLOTS {k}")));
assert!(ph.contains("igneum_launch_hot_fill("));
}
}
// ---------------------------------------------------------------------------------------------------------------
// Class v5 (docs/design/class-v5-stored-state.md, 7 October 2026): the pinned pack under proto-cuda/packs-ca3-v5/
// ---------------------------------------------------------------------------------------------------------------
fn v5_packs_dir() -> PathBuf {
PathBuf::from(env!("CARGO_MANIFEST_DIR")).join("../proto-cuda/packs-ca3-v5")
}
fn v5_read(pack: &str, file: &str) -> String {
std::fs::read_to_string(v5_packs_dir().join(pack).join(file)).unwrap_or_else(|e| panic!("{pack}/{file}: {e}"))
}
fn v5_json(pack: &str, file: &str) -> Value {
serde_json::from_str(&v5_read(pack, file)).unwrap()
}
/// The epoch of a pinned class v4 or v5 pack of the string seed and day: the program through the seam, the dataset at
/// the day-0 size, and for a v5 pack the leaves of its `state.igsd1` (the devnet's state stream of 7 October 2026,
/// node 1's exec snapshot at chain block 159,357: 93 records, root 0x1c583d35...).
fn v5_epoch(pack: &str) -> Epoch {
let j = v5_json(pack, "program.json");
let seed = j["seed"].as_str().unwrap();
let class = ProgramClass::parse(j["program_class"].as_str().unwrap()).unwrap();
let program = generate_from_seed_bytes_program_class(seed, seed.as_bytes(), class, None);
let day = j["dataset"]["day"].as_str().unwrap();
let log2 = j["dataset"]["log2_words"].as_u64().unwrap() as u32;
let shape = Shape::for_class(&program.class);
let mut dataset = DatasetSource::new_shape(day, DatasetMode::MemoryHard, log2, shape);
if class == ProgramClass::V5 {
let stream = igneum_pow::StateStream::read_file(&v5_packs_dir().join(pack).join("state.igsd1")).unwrap();
dataset = dataset.with_leaves(std::sync::Arc::new(igneum_pow::StateLeaves::from_stream(&stream, log2)));
}
Epoch { program, dataset }
}
/// The class v5 pack is the class v4 program of the same seed over the state leaves: generator 5 and
/// `program_id(5, seed, attempt)`, the base program, the shadow block and the dataset's cache equal to the v4 pack's,
/// every vector and dataset word different, every emitted file byte for byte what the crate exports (leaves.bin
/// included, its FNV in program.h), and the hash kernel text of kernel.cu equal to the v4 pack's but for the build
/// kernel and the class lines. The known-failed case first: the v4 control pack's vectors under the v5 epoch agree on
/// no lane.
#[test]
fn v5_pack_is_the_v4_program_over_the_state_leaves() {
let e5 = v5_epoch("v5-genesis");
let e4 = v5_epoch("v4-genesis");
let v4 = v5_json("v4-genesis", "vectors.json");
// the known-failed case: the v4 pack's hashes are not the v5 epoch's on any lane
let out4: Vec<u64> = v4["warps"][0]["expected"].as_array().unwrap().iter().map(hex64).collect();
let got5 = e5.hash_warp(0);
assert_eq!(out4.iter().zip(got5.iter()).filter(|(a, b)| a == b).count(), 0, "0 of 32 lanes of the v4 pack agree with the v5 epoch");
assert_eq!(e4.hash_warp(0).to_vec(), out4, "the v4 control pack is the v4 epoch");
// the program: v4's draw, generator 5, the state in the class and the id
assert_eq!(e5.program.generator, igneum_pow::GENERATOR_VERSION_V5);
assert_eq!(e5.program.class, igneum_pow::V5_CLASS);
assert_eq!(e5.program.class.name(), "mx8+sh256x27+state");
assert_eq!(e5.program.instrs, e4.program.instrs);
assert_eq!(e5.program.shadow, e4.program.shadow);
assert_eq!((e5.program.seed, e5.program.attempt), (e4.program.seed, e4.program.attempt));
assert_eq!(e5.program.program_id(), igneum_pow::generator::program_id(igneum_pow::GENERATOR_VERSION_V5, &e5.program.seed, e5.program.attempt));
assert_ne!(e5.program.program_id(), e4.program.program_id());
// the dataset: the same cache, other items
let m5 = e5.dataset.memhard().unwrap();
let m4 = e4.dataset.memhard().unwrap();
assert_eq!(m5.cache.fnv1a64(), m4.cache.fnv1a64(), "one day cache");
assert!(m5.shape().state && !m4.shape().state);
let leaves = e5.dataset.leaves().unwrap();
assert_eq!((leaves.n(), leaves.records_total, leaves.sampled), (93, 93, false));
assert_ne!(e5.dataset_word(0), e4.dataset_word(0));
// every file as the crate exports it, leaves.bin included
for pack in ["v4-genesis", "v5-genesis"] {
let e = if pack == "v5-genesis" { &e5 } else { &e4 };
let v = v5_json(pack, "vectors.json");
let out = export_pack(e, v["day"].as_str().unwrap(), v["source"].as_str().unwrap());
for (name, text) in &out.files {
assert_eq!(v5_read(pack, name), *text, "{pack}/{name} differs from the export");
}
for (name, bytes) in &out.binaries {
assert_eq!(std::fs::read(v5_packs_dir().join(pack).join(name)).unwrap(), *bytes, "{pack}/{name}");
}
assert_eq!(out.binaries.len(), (pack == "v5-genesis") as usize);
}
let h5 = v5_read("v5-genesis", "program.h");
assert!(h5.contains("#define IGNEUM_PROGRAM_CLASS \"v5\"") && h5.contains("#define IGNEUM_STATE_LEAVES 93") && h5.contains(&format!("#define IGNEUM_STATE_LEAVES_FNV64 {}", igneum_pow::emit::hex64(leaves.fnv1a64()))));
assert!(h5.contains("igneum_launch_build(uint32_t* ds, const uint32_t* cache, const uint32_t* leaves, uint32_t nLeaves, uint32_t nItems)"));
// the hash kernel text is class v4's byte for byte; the build kernel and the class lines are what differ
let hash_text = |s: &str| {
let a = s.find("__global__ void igneum_hash(").unwrap();
let b = s.find("// Host-side launch wrappers").unwrap();
s[a..b].to_string()
};
let k5 = v5_read("v5-genesis", "kernel.cu");
let k4 = v5_read("v4-genesis", "kernel.cu");
assert_eq!(hash_text(&k5), hash_text(&k4), "the hash kernel is class v4's");
assert!(k5.contains("mh_item(cache, mh_leaf(leaves, nLeaves, t), t, s)") && !k4.contains("mh_leaf"));
let mh5 = v5_read("v5-genesis", "memhard.h");
assert!(mh5.contains("s[i] ^= leaf[i]"), "the leaf XOR before the first mixer");
}

View file

@ -0,0 +1,143 @@
//! The miner's CPU re-check against the worker's reference path, class v3 and class v4 (6 October 2026).
//!
//! The fleet's 10-member pool run (18:14Z to 18:24Z): 0 shares accepted in ten minutes, every GPU answer refused as
//! `WORKER MISMATCH`, because the pool fork's miner re-hashed each share with a fixed class v2 program while the 0.3.14
//! CUDA worker hashed the class v3 program of the epoch. The rule since: the re-check builds its program through the
//! chain seam (`Epoch::chain_program` and `Epoch::chain_dataset_day`, what the node's `IgneumEngine` calls) from the
//! template's `(epoch seed, day, program class, era seed)`, never from a fixed class.
//!
//! This test pins that seam against the worker's reference for both classes the packs carry: the program the pack's
//! kernels were emitted from (program.json, generator 3 or 4, with its id) and the pack's 96 vectors; then one known
//! nonce through the worker's path (`block_init_words` plus `interpret_warp_init` on the pack's program) and through
//! the re-check's path (the same on the seam's program and dataset) must agree, and the other class's program and
//! the fixed-v2 program of the same seed must disagree (the mismatch the fleet saw).
use igneum_pow::bind::{block_init_words, lane_nonce, unhex};
use igneum_pow::verify::DatasetSource;
use igneum_pow::{interpret_warp_init, DatasetMode, Epoch, ProgramClass, Shape};
use serde_json::Value;
use std::path::PathBuf;
fn pack_dir(rel: &str) -> PathBuf {
let p = PathBuf::from(env!("CARGO_MANIFEST_DIR")).join("../proto-cuda").join(rel);
assert!(p.join("program.json").is_file(), "pack {} is missing; this test never skips", p.display());
p
}
fn json(dir: &std::path::Path, f: &str) -> Value {
serde_json::from_str(&std::fs::read_to_string(dir.join(f)).unwrap_or_else(|e| panic!("{}: {e}", dir.join(f).display()))).unwrap()
}
fn hex64(v: &Value) -> u64 {
u64::from_str_radix(v.as_str().unwrap().trim_start_matches("0x"), 16).unwrap()
}
struct PackRef {
class: ProgramClass,
seed_label: String,
seed_bytes: Vec<u8>,
era: Vec<u8>,
day_bytes: Vec<u8>,
log2: u32,
/// The worker's reference: the pack's program and day dataset, checked against the pack's vectors
reference: Epoch,
}
/// The pack as the worker sees it: program.json's program (generator, id and class as recorded) over the pack's
/// day dataset, trusted only after its 96 vectors reproduce.
fn load(rel: &str, want: ProgramClass) -> PackRef {
let dir = pack_dir(rel);
let j = json(&dir, "program.json");
let class = match j["program_class"].as_str().unwrap() {
"v3" => ProgramClass::V3,
"v4" => ProgramClass::V4,
other => panic!("{rel}: class {other}"),
};
assert_eq!(class, want, "{rel}: the pack's class");
let seed_label = j["seed"].as_str().unwrap().to_string();
let seed_bytes = unhex(j["seed_bytes"].as_str().unwrap()).unwrap();
let era = unhex(j["era_seed_bytes"].as_str().unwrap()).unwrap();
let day_bytes = unhex(j["dataset"]["day_bytes"].as_str().unwrap()).unwrap();
let log2 = j["dataset"]["log2_words"].as_u64().unwrap() as u32;
let program = igneum_pow::generate_from_seed_bytes_program_class(&seed_label, &seed_bytes, class, Some(&era));
assert_eq!(program.generator, j["generator"].as_u64().unwrap() as u32, "{rel}: generator");
assert_eq!(program.generator, class.generator_version(), "{rel}: the generator is the class's");
assert_eq!(program.program_id(), hex64(&j["program_id"]), "{rel}: program id");
let shape = Shape::for_class(&program.class);
let mut dataset = DatasetSource::from_key_shape(igneum_pow::seed::seed_words_from_bytes(&day_bytes), DatasetMode::MemoryHard, log2, shape);
dataset.key_bytes = day_bytes.clone();
let reference = Epoch { program, dataset };
let v = json(&dir, "vectors.json");
let warps = v["warps"].as_array().unwrap();
assert_eq!(warps.len(), 3, "{rel}: three vector warps");
for w in warps {
let base = w["base_nonce"].as_u64().unwrap() as u32;
let got = reference.hash_warp(base);
for (lane, e) in w["expected"].as_array().unwrap().iter().enumerate() {
assert_eq!(got[lane], hex64(e), "{rel}: vector base {base} lane {lane}");
}
}
PackRef { class, seed_label, seed_bytes, era, day_bytes, log2, reference }
}
/// The re-check's epoch: the chain seam the node engine and the miner call, from the template's four values.
/// The packs are day-0 caches, so days since genesis is 0 and the genesis dataset size is the pack's.
fn recheck_epoch(p: &PackRef) -> Epoch {
Epoch { program: Epoch::chain_program(&p.seed_bytes, Some(&p.era), p.class, &p.seed_label), dataset: Epoch::chain_dataset_day(&p.day_bytes, p.class, 0, p.log2) }
}
const PREHASH: [u8; 32] = [0x5a; 32];
const NONCE: u64 = 0x1234_5678_0000_0bb7; // high word 0x12345678, lane 0x0bb7 (warp base 0x0ba0, lane 23)
/// The bound lane hash of one nonce on an epoch, the way a worker computes it (init words from the prehash and the
/// nonce's high word, the warp at the lane's base) and the way `EpochRef::hash_bound` re-checks it.
fn bound(e: &Epoch, prehash: &[u8; 32], nonce: u64) -> u64 {
let init = block_init_words(prehash, nonce);
let lane = lane_nonce(nonce);
interpret_warp_init(&e.program, &init, lane & !31, &e.dataset).hashes[(lane & 31) as usize]
}
#[test]
fn cpu_recheck_equals_the_worker_reference_for_class_v3_and_class_v4() {
let v3 = load("packs-ca2-mixer/mx8-devnet-epoch0", ProgramClass::V3);
let v4 = load("packs-ca3-v4/v4-devnet-epoch0", ProgramClass::V4);
assert_eq!(v3.seed_bytes, v4.seed_bytes, "the two packs share the epoch seed (devnet genesis), so only the class differs");
assert_eq!(v3.era, v4.era);
let mut hashes = Vec::new();
for p in [&v3, &v4] {
let re = recheck_epoch(p);
assert_eq!(re.program.program_id(), p.reference.program.program_id(), "{:?}: the seam's program is the pack's", p.class);
assert_eq!(re.program.generator, p.reference.program.generator);
assert_eq!(re.program.instrs.len(), p.reference.program.instrs.len());
let worker = bound(&p.reference, &PREHASH, NONCE);
let cpu = bound(&re, &PREHASH, NONCE);
assert_eq!(cpu, worker, "{:?}: CPU re-check {cpu:016x} against the worker's reference {worker:016x}", p.class);
// the same nonce through a second prehash, so the agreement is not one lucky lane
let (w2, c2) = (bound(&p.reference, &[0xa5; 32], NONCE ^ 0x1f), bound(&re, &[0xa5; 32], NONCE ^ 0x1f));
assert_eq!(c2, w2, "{:?}: second nonce", p.class);
hashes.push(cpu);
}
assert_ne!(hashes[0], hashes[1], "class v3 and class v4 programs of one seed hash a nonce differently");
// the fleet's mismatch: a fixed class v2 program on the class v3 epoch's seed
let v2 = Epoch { program: Epoch::chain_program(&v3.seed_bytes, None, ProgramClass::V2, &v3.seed_label), dataset: Epoch::chain_dataset_day(&v3.day_bytes, ProgramClass::V2, 0, v3.log2) };
assert_ne!(bound(&v2, &PREHASH, NONCE), hashes[0], "a class v2 re-check refuses a class v3 share");
assert_ne!(bound(&v2, &PREHASH, NONCE), hashes[1], "a class v2 re-check refuses a class v4 share");
}
/// The generator-4 program id rule (counter-asic-3-status.md, the blocker closed 6 October 2026): the v4 program of
/// a seed carries another id than the v3 program of the same seed, so a stale worker across the activation sees the
/// mismatch, while v2 and v3 ids stay as the packs pinned them.
#[test]
fn program_ids_differ_between_class_v3_and_class_v4_of_one_seed() {
let v3 = load("packs-ca2-mixer/mx8-devnet-epoch0", ProgramClass::V3);
let v4 = load("packs-ca3-v4/v4-devnet-epoch0", ProgramClass::V4);
assert_eq!(v3.reference.program.program_id(), 0x73bc_bfe8_ccf9_88f1, "the v3 control's id as pinned");
// the amended class v4 (AP-F8-1, AP-F8-3): sub-version 3 (object byte 7; the acceptance executes the shadow block)
// is the pinned id below; c120d7963abdcd96 (the 6 October stream, byte 4), 1a4230699a6b9c60 (sub-version 1, the
// one-writer rule, 0.3.20's and 0.3.21's byte 5) and a788661687db4bb3 (sub-version 2, never shipped) must differ
assert_ne!(v4.reference.program.program_id(), 0xc120_d796_3abd_cd96, "the pre-amendment v4 id must differ");
assert_ne!(v4.reference.program.program_id(), 0x1a42_3069_9a6b_9c60, "the sub-version-1 id must differ");
assert_ne!(v4.reference.program.program_id(), 0xa788_6616_87db_4bb3, "the sub-version-2 id must differ");
assert_eq!(v4.reference.program.program_id(), 0xa785_0016_87d8_688a, "the sub-version-3 v4 id as pinned");
assert_ne!(v3.reference.program.program_id(), v4.reference.program.program_id());
}

View file

@ -0,0 +1,769 @@
//! Soundness tests of layer 3 of `docs/plans/counter-asic-2.md`: the per-warp scratch with read-modify-writes
//! (variant 5 of the read-width experiment, `LoadClass::scratch(k, kb)`). Analysis and results:
//! `docs/analysis/scratch-soundness.md`. Every test is parametric over the class's slot count
//! (`scratch_slots_per_lane()`), so the 32 and 128 KiB geometries and any later one run the same checks.
//!
//! What runs under plain `cargo test`:
//! 1. `rewrite_is_a_bijection_of_the_fold_value`, `fill_is_a_bijection_of_the_nonce`: the written words as
//! functions (question 1).
//! 2. `written_words_unbiased_and_rehit_rates`: bit bias of every written word over 2^11 units x 3 seeds per class
//! (the TESTS.md section 3 shape), and the measured slot re-hit rate against the birthday formula (question 2).
//! 3. `edge_programs_match_the_hand_model`: hand-built programs that drive every read-modify-write of a hash to
//! slot 0, slot MASK, through out-of-range registers, to one slot per lane, alternating two slots, and 16
//! read-modify-writes per iteration on one slot; the interpreter against an independent hand model, and the
//! hand model shown to have teeth (question 3, CPU half).
//! 4. `scr_packs_regenerate_and_pass_the_static_scratch_check`: every emitted kernel of every scr pack under
//! `proto-cuda/packs-readwidth` regenerates from its program.json and passes the static scratch-mask check;
//! the check is shown to fail on four deliberate breaks (question 4).
//! 5. `fuzz_scr_programs_cpu`: 200 generated scratch programs over the six classes, generator contract on every
//! instruction, 4 units each at base nonces across the 32-bit range including the wrap; with
//! `IGNEUM_SCRATCH_PACKS_OUT=<dir>` it also writes the packs (and the edge packs) for the Metal runs of
//! `proto-metal/packbench` (question 3 GPU half, question 4, `TESTS.md` section 9 shape).
use igneum_pow::emit::{
cuda_kernel, cuda_kernel_bound, export_pack, metal_program, metal_program_bound, opencl_kernel,
opencl_kernel_bound, vectors_json, LoadSource,
};
use igneum_pow::generator::{
generate_class, generate_from_seed_bytes_class, Instr, LoadClass, Op, Program, GENERATOR_VERSION, INSTR_COUNT,
ITERATIONS, LANES,
};
use igneum_pow::seed::{seed_words_from_bytes, SplitMix64};
use igneum_pow::verify::{
fold_words, interpret_warp_scratch, scratch_fill, scratch_rewrite, splitmix32, DatasetMode, DatasetSource,
Epoch, ScratchEvent, FOLD_MUL, FOLD_ROT,
};
use serde_json::Value;
use std::collections::HashMap;
use std::path::PathBuf;
/// The classes under study: the two capped geometries (32 and 128 KiB per warp: 64 and 256 slots per lane) at the
/// RMW shares the readwidth branch measures.
const CLASSES: [&str; 6] = ["scr2k32", "scr4k32", "scr8k32", "scr2k128", "scr4k128", "scr8k128"];
fn class(name: &str) -> LoadClass {
LoadClass::parse(name).unwrap_or_else(|| panic!("class {name}"))
}
// ---------------------------------------------------------------------------------------------------------------
// 1. The written words as functions (question 1)
// ---------------------------------------------------------------------------------------------------------------
/// For a fixed slot content `w`, each of the three rewritten words is a bijection of the fold value `x`
/// (`x ^ w1`, `rotl(x, 7) ^ w2`, `x + w0`), so the rewrite is injective in `x` and a uniform `x` gives a uniform
/// word in every position. Checked over 2^16 consecutive `x` for 16 random `w`.
#[test]
fn rewrite_is_a_bijection_of_the_fold_value() {
let mut rng = SplitMix64::new(0x7363_7261_7463_6801);
for _ in 0..16 {
let w = [rng.next() as u32, rng.next() as u32, rng.next() as u32];
let x0 = rng.next() as u32;
let mut seen = [vec![false; 1 << 16], vec![false; 1 << 16], vec![false; 1 << 16]];
for i in 0..(1u32 << 16) {
let x = x0.wrapping_add(i);
let out = scratch_rewrite(x, &w);
for j in 0..3 {
// a bijection of x maps 2^16 consecutive x to 2^16 distinct words; the low 16 bits alone are
// distinct for the xor words (x ^ c) and for the add word (x + c), since both act on the low 16
// bits as bijections of the low 16 bits of x; the rotl word is checked on its rotated-back bits
let key = if j == 1 { out[j].rotate_right(7) & 0xffff } else { out[j] & 0xffff };
assert!(!seen[j][key as usize], "word {j} repeats inside 2^16 consecutive x");
seen[j][key as usize] = true;
}
}
}
// The rewrite inverts: from the old content and any ONE written word the fold value is recovered, so a
// rewritten slot carries exactly 32 bits of new state (the point of question 2's arithmetic).
let w = [0x1234_5678, 0x9abc_def0, 0x0fed_cba9];
let x = 0xdead_beef;
let out = scratch_rewrite(x, &w);
assert_eq!(out[0] ^ w[1], x);
assert_eq!((out[1] ^ w[2]).rotate_right(7), x);
assert_eq!(out[2].wrapping_sub(w[0]), x);
}
/// For a fixed (seed, slot, j) the fill is a bijection of the lane nonce: `splitmix32` is a bijection of its
/// 32-bit input and the input `((base + lane) ^ s) + c` is a bijection of `base + lane`. Over 2^16 consecutive
/// nonces no fill word repeats, for 8 slots x 3 words.
#[test]
fn fill_is_a_bijection_of_the_nonce() {
let seed = seed_words_from_bytes(b"igneum-genesis");
for slot in [0u32, 1, 63, 64, 255, 1023, 2047] {
for j in 0..3u32 {
let mut words: Vec<u32> = (0..(1u32 << 16)).map(|n| scratch_fill(&seed, n, 0, slot, j)).collect();
words.sort_unstable();
words.dedup();
assert_eq!(words.len(), 1 << 16, "slot {slot} word {j}: fill words of 2^16 consecutive nonces are distinct");
}
}
// base + lane is the lane nonce: the fill of lane l at base b is the fill of lane 0 at base b + l
assert_eq!(scratch_fill(&seed, 0x1000, 7, 5, 2), scratch_fill(&seed, 0x1007, 0, 5, 2));
// and it wraps with the nonce: base 0xffffffe0, lane 31 is nonce 0xffffffff; lane 32 would be nonce 0
assert_eq!(scratch_fill(&seed, 0xffff_ffe0, 32, 5, 2), scratch_fill(&seed, 0, 0, 5, 2));
// the three word positions of one slot and nonce are three different permutation outputs
let f: Vec<u32> = (0..3).map(|j| scratch_fill(&seed, 12345, 7, 17, j)).collect();
assert!(f[0] != f[1] && f[1] != f[2] && f[0] != f[2]);
}
// ---------------------------------------------------------------------------------------------------------------
// 2. Uniformity of the written words and the slot re-hit rate (questions 1 and 2)
// ---------------------------------------------------------------------------------------------------------------
/// Birthday arithmetic: the expected number of distinct slots after `n` uniform draws from `s` slots.
fn expected_distinct(s: usize, n: usize) -> f64 {
let s = s as f64;
s * (1.0 - (1.0 - 1.0 / s).powi(n as i32))
}
struct ClassStats {
units: usize,
events: usize,
hits: usize,
/// ones count per bit of the written words, 3 x 32
ones: [[u64; 32]; 3],
/// ones count per bit of written XOR read (the change the rewrite makes to the slot)
delta_ones: [[u64; 32]; 3],
/// re-hit depth histogram: how many earlier RMWs the slot had seen in this unit (0 = first touch)
depth: Vec<usize>,
max_depth: usize,
/// how often each slot index was addressed (the slot comes from a register's low bits)
slot_hist: Vec<u64>,
}
fn class_stats(name: &str, seeds: &[&str], units_per_seed: usize) -> ClassStats {
let c = class(name);
let mut st = ClassStats {
units: 0,
events: 0,
hits: 0,
ones: [[0; 32]; 3],
delta_ones: [[0; 32]; 3],
depth: vec![0; 256],
max_depth: 0,
slot_hist: vec![0; c.scratch_slots_per_lane()],
};
let ds = DatasetSource::new("2026-10-03", DatasetMode::ClosedForm, 28);
for seed in seeds {
let p = generate_class(seed, c);
assert_eq!(p.scratch_ops_per_hash(), c.scratch_slots() * ITERATIONS);
for u in 0..units_per_seed {
let base = (u as u32).wrapping_mul(32).wrapping_add(0x4000_0000);
let (_, ev) = interpret_warp_scratch(&p, &p.seed, base, &ds, true);
assert_eq!(ev.len(), p.scratch_ops_per_hash() * LANES);
let mut count: HashMap<(u8, u32), usize> = HashMap::new();
for e in &ev {
assert!(e.slot < c.scratch_slots_per_lane() as u32, "slot inside the lane's scratch");
let d = count.entry((e.lane, e.slot)).or_insert(0);
assert_eq!(e.hit, *d > 0, "hit flag agrees with the unit's own history");
assert_eq!(e.written, scratch_rewrite(e.x, &e.read));
if !e.hit {
let fill = [
scratch_fill(&p.seed, base, e.lane as u32, e.slot, 0),
scratch_fill(&p.seed, base, e.lane as u32, e.slot, 1),
scratch_fill(&p.seed, base, e.lane as u32, e.slot, 2),
];
assert_eq!(e.read, fill, "a first touch reads the fill");
}
st.depth[(*d).min(255)] += 1;
st.max_depth = st.max_depth.max(*d);
st.slot_hist[e.slot as usize] += 1;
*d += 1;
st.events += 1;
st.hits += e.hit as usize;
for j in 0..3 {
for b in 0..32 {
st.ones[j][b] += ((e.written[j] >> b) & 1) as u64;
st.delta_ones[j][b] += (((e.written[j] ^ e.read[j]) >> b) & 1) as u64;
}
}
}
st.units += 1;
}
}
st
}
/// Bit bias of every written word (and of the change each rewrite makes) within 6 sigma of a fair coin, over
/// 3 seeds x 2^11 units per class (131,072 hashes per seed set); the slot re-hit rate against the birthday
/// formula within 3 percent relative. The table printed here is the one in the analysis.
#[test]
fn written_words_unbiased_and_rehit_rates() {
let seeds = ["igneum-genesis", "igneum-genesis/stats1", "igneum-genesis/stats2"];
let units = 1usize << 11;
println!("class | slots/lane | RMW/hash | events | re-hits | re-hit % | birthday % | slot chi2 z (spread) | max depth | max bias sigma | max delta bias sigma");
for name in CLASSES {
let c = class(name);
let st = class_stats(name, &seeds, units);
let n = st.events as f64;
let sigma = (n / 4.0).sqrt();
let mut worst = 0.0f64;
let mut worst_delta = 0.0f64;
for j in 0..3 {
for b in 0..32 {
let z = (st.ones[j][b] as f64 - n / 2.0).abs() / sigma;
let zd = (st.delta_ones[j][b] as f64 - n / 2.0).abs() / sigma;
assert!(z <= 6.0, "{name}: written word {j} bit {b} biased: {z:.2} sigma");
assert!(zd <= 6.0, "{name}: rewrite delta word {j} bit {b} biased: {zd:.2} sigma");
worst = worst.max(z);
worst_delta = worst_delta.max(zd);
}
}
let per_lane_hash = c.scratch_slots() * ITERATIONS;
let s = c.scratch_slots_per_lane();
let exp_hits = per_lane_hash as f64 - expected_distinct(s, per_lane_hash);
let exp_pct = 100.0 * exp_hits / per_lane_hash as f64;
let got_pct = 100.0 * st.hits as f64 / st.events as f64;
// chi-square of the slot histogram against uniform (df = s - 1): the slot is a register's low bits, and
// the measured re-hit rate runs above the uniform birthday rate (the finding of the analysis, question 2)
let expect_per_slot = n / s as f64;
let chi2: f64 = st.slot_hist.iter().map(|&h| (h as f64 - expect_per_slot).powi(2) / expect_per_slot).sum();
let chi2_z = (chi2 - (s as f64 - 1.0)) / (2.0 * (s as f64 - 1.0)).sqrt();
let hot = *st.slot_hist.iter().max().unwrap() as f64 / expect_per_slot;
let cold = *st.slot_hist.iter().min().unwrap() as f64 / expect_per_slot;
println!(
"{name} | {s} | {per_lane_hash} | {} | {} | {got_pct:.2} | {exp_pct:.2} | {chi2_z:.1} (hottest slot {hot:.2}x, coldest {cold:.2}x) | {} | {worst:.2} | {worst_delta:.2}",
st.events, st.hits, st.max_depth
);
// a regression band, not a uniformity claim: the rate sits between the uniform birthday rate and twice it
assert!(
got_pct >= 0.9 * exp_pct && got_pct <= 2.0 * exp_pct,
"{name}: re-hit rate {got_pct:.2}% against birthday {exp_pct:.2}%"
);
// depth histogram: the number of earlier RMWs a re-hit slot had seen in the unit
let shown: Vec<String> = st.depth.iter().take(st.max_depth + 1).enumerate().map(|(d, n)| format!("{d}:{n}")).collect();
println!(" depth histogram {}", shown.join(" "));
}
}
// ---------------------------------------------------------------------------------------------------------------
// 3. Hand-built edge programs against an independent hand model (question 3, CPU half)
// ---------------------------------------------------------------------------------------------------------------
fn ins(op: Op, dst: u8, src: u8) -> Instr {
Instr { op, dst, src, src2: 0, imm: 0, imm2: 0, rot: 1, bit: 0, mask: 1, width: 1, win: 0, off: 0 }
}
fn add_imm(dst: u8, src: u8, imm: u32) -> Instr {
Instr { op: Op::Add, dst, src, src2: 0, imm, imm2: imm, rot: 1, bit: 0, mask: 1, width: 1, win: 0, off: 0 }
}
/// A hand-built program of class `c` named `name` (its seed is the name, so its fill words and init words are
/// its own). These bypass the generator and the acceptance rule, like `TESTS.md` section 2; `sub r, r` zeroes a
/// register as the Swift edge set does.
fn edge(name: &str, c: LoadClass, instrs: Vec<Instr>) -> Program {
let seed_string = format!("igneum-scratch-edge/{name}");
let seed_bytes = seed_string.as_bytes().to_vec();
let k = instrs.iter().filter(|i| i.op == Op::Scratch).count();
assert_eq!(k, c.scratch_slots(), "{name}: the class carries the program's scratch count");
Program {
seed: seed_words_from_bytes(&seed_bytes),
seed_string,
seed_bytes,
generator: GENERATOR_VERSION,
attempt: 0,
class: c,
era_bytes: None,
instrs,
shadow: Vec::new(),
}
}
/// The edge set for a scratch of `kb` KiB per warp. Each entry: (name, what it drives, program).
fn edge_programs(kb: u8) -> Vec<(String, &'static str, Program)> {
let m = LoadClass::scratch(1, kb).scratch_slot_mask();
let dsts = [2u8, 3, 4, 5, 6, 7, 0, 2, 3, 4, 5, 6, 7, 0, 2, 3];
let scr = |n: usize, src: u8| -> Vec<Instr> { (0..n).map(|i| ins(Op::Scratch, dsts[i], src)).collect() };
let mut v = Vec::new();
// every RMW of the hash to slot 0 through a zero register: 64 dependent RMWs on one slot per lane
let mut p = vec![ins(Op::Sub, 1, 1)];
p.extend(scr(8, 1));
v.push(("slot0".to_string(), "r1 = 0: every RMW to slot 0", edge(&format!("slot0/k{kb}"), LoadClass::scratch(8, kb), p)));
// slot MASK through the in-range register MASK
let mut p = vec![ins(Op::Sub, 1, 1), ins(Op::Sub, 2, 2), add_imm(1, 2, m)];
p.extend(scr(8, 1));
v.push(("slotmask".to_string(), "r1 = MASK: every RMW to the last slot", edge(&format!("slotmask/k{kb}"), LoadClass::scratch(8, kb), p)));
// slot MASK through the out-of-range register 0xffffffff
let mut p = vec![ins(Op::Sub, 1, 1), ins(Op::Sub, 2, 2), add_imm(2, 1, 1), ins(Op::Sub, 1, 2)];
p.extend(scr(8, 1));
v.push(("ones".to_string(), "r1 = 0xffffffff: masked to the last slot", edge(&format!("ones/k{kb}"), LoadClass::scratch(8, kb), p)));
// slot 0 through the out-of-range register MASK + 1
let mut p = vec![ins(Op::Sub, 1, 1), ins(Op::Sub, 2, 2), add_imm(1, 2, m.wrapping_add(1))];
p.extend(scr(8, 1));
v.push(("maskplus1".to_string(), "r1 = MASK + 1: masked to slot 0", edge(&format!("maskplus1/k{kb}"), LoadClass::scratch(8, kb), p)));
// 16 RMWs per iteration on slot 0: 128 dependent RMWs on one slot per lane per hash
let mut p = vec![ins(Op::Sub, 1, 1)];
p.extend(scr(16, 1));
v.push(("sixteen".to_string(), "16 RMWs per iteration on slot 0", edge(&format!("sixteen/k{kb}"), LoadClass::scratch(16, kb), p)));
// one slot per lane from the init words: lanes with equal slots would show any cross-lane aliasing
// (r5 is the slot register and is never a destination here)
let p: Vec<Instr> = [0u8, 1, 2, 3, 4, 6, 7, 0].iter().map(|&d| ins(Op::Scratch, d, 5)).collect();
v.push(("lanevar".to_string(), "r5 never written: one init-dependent slot per lane", edge(&format!("lanevar/k{kb}"), LoadClass::scratch(8, kb), p)));
// alternating slot 0 and slot MASK inside one iteration
let mut p = vec![ins(Op::Sub, 1, 1), ins(Op::Sub, 2, 2), add_imm(2, 1, m)];
for (i, &d) in [3u8, 4, 5, 6, 7, 0, 3, 4].iter().enumerate() {
// r1 and r2 hold the two slots and are never destinations
p.push(ins(Op::Scratch, d, if i % 2 == 0 { 1 } else { 2 }));
}
v.push(("twoslots".to_string(), "slot 0 and slot MASK alternating", edge(&format!("twoslots/k{kb}"), LoadClass::scratch(8, kb), p)));
v
}
/// The hand model: a second, minimal interpreter for the ops the edge programs use (sub, add, scratch), with its
/// own slot store keyed by (lane, slot). `mutate` swaps the rewrite's words to show the comparison has teeth.
fn hand_model(p: &Program, base: u32, mutate: bool) -> [u64; 32] {
let seed = &p.seed;
let m = p.class.scratch_slot_mask();
let mut r = [[0u32; LANES]; 8];
for lane in 0..LANES {
let nonce = base.wrapping_add(lane as u32);
for i in 0..8 {
let mut x = nonce ^ seed[i];
x = x.wrapping_add(0x9e3779b9u32.wrapping_mul(i as u32 + 1));
x = splitmix32(x);
r[i][lane] = x ^ seed[(i + 1) & 7];
}
}
let mut store: HashMap<(usize, u32), [u32; 3]> = HashMap::new();
for _ in 0..ITERATIONS {
let sel = r[0];
for ins in &p.instrs {
let (d, a) = (ins.dst as usize, ins.src as usize);
match ins.op {
Op::Sub => {
for lane in 0..LANES {
r[d][lane] = r[d][lane].wrapping_sub(r[a][lane]);
}
}
Op::Add => {
for lane in 0..LANES {
let c = if (sel[lane] >> ins.bit) & 1 != 0 { ins.imm2 } else { ins.imm };
r[d][lane] = r[d][lane].wrapping_add(r[a][lane]).wrapping_add(c);
}
}
Op::Scratch => {
for lane in 0..LANES {
let slot = r[a][lane] & m;
let w = *store.entry((lane, slot)).or_insert_with(|| {
let mut f = [0u32; 3];
for j in 0..3u32 {
// the fill, written out in full rather than through verify::scratch_fill
let n = base.wrapping_add(lane as u32);
f[j as usize] = splitmix32(
(n ^ seed[j as usize])
.wrapping_add(slot.wrapping_mul(0x9E37_79B1))
.wrapping_add((j + 1).wrapping_mul(0x85EB_CA77)),
);
}
f
});
let mut x = r[d][lane] ^ w[0];
x = x.rotate_left(FOLD_ROT).wrapping_mul(FOLD_MUL) ^ w[1];
x = x.rotate_left(FOLD_ROT).wrapping_mul(FOLD_MUL) ^ w[2];
r[d][lane] = x;
let out = if mutate {
[x.rotate_left(7) ^ w[2], x ^ w[1], x.wrapping_add(w[0])]
} else {
[x ^ w[1], x.rotate_left(7) ^ w[2], x.wrapping_add(w[0])]
};
store.insert((lane, slot), out);
}
}
other => panic!("the hand model does not implement {other:?}"),
}
}
}
let mut out = [0u64; 32];
for lane in 0..LANES {
let lo = r[0][lane] ^ r[1][lane].rotate_left(7) ^ r[2][lane].rotate_left(14) ^ r[3][lane].rotate_left(21);
let hi = r[4][lane] ^ r[5][lane].rotate_left(9) ^ r[6][lane].rotate_left(18) ^ r[7][lane].rotate_left(27);
out[lane] = ((hi as u64) << 32) | lo as u64;
}
out
}
/// The four unit bases of every edge vector: 0 and 32 (two consecutive units, the pair a one-warp persistent
/// launch runs on one arena), a unit straddling 2^31, and the unit that wraps past 2^32.
const EDGE_BASES: [u32; 4] = [0, 32, 0x7fff_fff0, 0xffff_ffe0];
#[test]
fn edge_programs_match_the_hand_model() {
let ds = DatasetSource::new("2026-10-03", DatasetMode::ClosedForm, 24);
let mut cases = 0;
for kb in [32u8, 128] {
for (name, what, p) in edge_programs(kb) {
let slots = p.class.scratch_slots_per_lane();
for base in EDGE_BASES {
let (res, ev) = interpret_warp_scratch(&p, &p.seed, base, &ds, true);
let hand = hand_model(&p, base, false);
assert_eq!(res.hashes, hand, "{name} k{kb} base {base:#x}: interpreter against the hand model ({what})");
assert_ne!(res.hashes, hand_model(&p, base, true), "{name} k{kb}: the comparison has teeth");
// the slots the trace saw are the ones the program was built to drive
let slot_set: std::collections::BTreeSet<u32> = ev.iter().map(|e| e.slot).collect();
let m = (slots - 1) as u32;
match name.as_str() {
"slot0" | "maskplus1" | "sixteen" => assert_eq!(slot_set.into_iter().collect::<Vec<_>>(), vec![0]),
"slotmask" | "ones" => assert_eq!(slot_set.into_iter().collect::<Vec<_>>(), vec![m]),
"twoslots" => assert_eq!(slot_set.into_iter().collect::<Vec<_>>(), vec![0, m]),
"lanevar" => {
for e in &ev {
assert!(e.slot <= m);
}
}
_ => unreachable!(),
}
// the chain depth on the driven slot: every RMW after the first per lane is a re-hit
let per_lane = p.scratch_ops_per_hash();
let hits = ev.iter().filter(|e| e.hit).count();
let expected_hits = match name.as_str() {
"twoslots" => (per_lane - 2) * LANES,
_ => (per_lane - 1) * LANES,
};
assert_eq!(hits, expected_hits, "{name} k{kb}: re-hits");
cases += 1;
}
}
}
assert_eq!(cases, 2 * 7 * 4);
}
// ---------------------------------------------------------------------------------------------------------------
// 4. The static scratch check over every emitted kernel of every scr pack (question 4)
// ---------------------------------------------------------------------------------------------------------------
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum Dialect {
Metal,
Cuda,
OpenCl,
}
/// The static scratch check: every scratch read-modify-write in an emitted kernel has the one masked form the
/// emitter writes, the arena is the lane's own `slots x 4` words, the tag is `salt + unit`, and nothing else
/// touches the scratch. Like the dataset mask check of `TESTS.md` section 5 and `tests/packs.rs`, a text check:
/// the guarantee is that the emitter has one template and it masks.
pub fn scratch_text_check(text: &str, dialect: Dialect, k: usize, slots: usize, kernels: usize) -> Result<(), String> {
assert!(kernels >= 1);
// every count below is per hash kernel; an OpenCL bound file carries igneum_hash and igneum_hash_bound
let k = k * kernels;
assert!(slots.is_power_of_two() && slots >= 1);
let mask = (slots - 1) as u32;
let wpl = slots * 4;
let (u, load, store, ptr) = match dialect {
Dialect::Metal => ("uint", "uint4 v_ = *(device const uint4*)(arena + s_ * 4u);", "*(device uint4*)(arena + s_ * 4u) = uint4(tag, x_ ^ w1_, rotl_imm(x_, 7u) ^ w2_, x_ + w0_); }", "device uint* arena"),
Dialect::Cuda => ("uint32_t", "uint4 v_ = *(const uint4*)(arena + s_ * 4u);", "*(uint4*)(arena + s_ * 4u) = make_uint4(tag, x_ ^ w1_, rotl_imm(x_, 7u) ^ w2_, x_ + w0_); }", "uint32_t* arena"),
Dialect::OpenCl => ("uint", "uint4 v_ = vload4(s_, arena);", "vstore4(IGNEUM_U4(tag, x_ ^ w1_, rotl_imm(x_, 7u) ^ w2_, x_ + w0_), s_, arena); }", "__global uint* arena"),
};
let count = |needle: &str| text.matches(needle).count();
let mut errs = Vec::new();
let mut expect = |what: &str, got: usize, want: usize| {
if got != want {
errs.push(format!("{what}: {got}, expected {want}"));
}
};
// k slot computations, each masked with exactly the class's mask and immediately followed by the one load form
expect("slot definitions `{ u s_ = r`", count(&format!("{{ {u} s_ = r")), k);
expect("masked slot followed by the load", count(&format!(" & {mask}u; {load}")), k);
expect("stores of the tagged slot", count(store), k);
expect("tag compares", count("(v_.x == tag)"), k);
expect("fill calls (three per RMW)", count("scr_fill(gbase, lane, s_, "), 3 * k);
// the arena: one definition with the class's words per lane, and 2k uses (one load, one store per RMW)
expect("arena definition", count(&format!("{ptr} = scratch + ((size_t)warp_ * 32u + lane) * {wpl}u;")), kernels);
expect("arena mentions (definition + load + store per RMW)", count("arena"), kernels + 2 * k);
expect("tag definition `tag = salt + g_`", count(&format!("{u} tag = salt + g_;")), kernels);
expect("direct scratch indexing", count("scratch["), 0);
expect("scratch pointer arithmetic outside the arena definition", count("scratch +"), kernels);
// no other mask value on a slot: every `s_ = r` line carries the class mask and nothing else carries ` & Nu; uint4 v_`
let any_mask_load = count(&format!("u; {load}"));
expect("loads preceded by some mask (must all be the class mask)", any_mask_load, k);
if errs.is_empty() {
Ok(())
} else {
Err(errs.join("; "))
}
}
fn packs_rw_dir() -> PathBuf {
PathBuf::from(env!("CARGO_MANIFEST_DIR")).join("../proto-cuda/packs-readwidth")
}
fn scr_packs() -> Vec<String> {
let mut v: Vec<String> = std::fs::read_dir(packs_rw_dir())
.unwrap()
.map(|d| d.unwrap().file_name().to_string_lossy().to_string())
.filter(|n| n.starts_with("scr"))
.collect();
v.sort();
v
}
fn read_pack(pack: &str, file: &str) -> String {
let p = packs_rw_dir().join(pack).join(file);
std::fs::read_to_string(&p).unwrap_or_else(|e| panic!("read {}: {e}", p.display()))
}
/// Every scr pack regenerates from its program.json (seed bytes, class, day bytes, size) to the same six kernel
/// texts, byte for byte, and every one of those texts passes the static scratch check for the class's k and slot
/// count; the check fails on four deliberate breaks of a copy of the Metal text (mask dropped, mask changed, arena
/// stride changed, a stray scratch access) and on the OpenCL and CUDA twins of the first.
#[test]
fn scr_packs_regenerate_and_pass_the_static_scratch_check() {
let packs = scr_packs();
assert!(packs.len() >= 6, "the scr packs: {packs:?}");
let mut checked = 0;
let mut sample_metal = String::new();
let mut sample_cl = String::new();
let mut sample_cu = String::new();
let mut sample_k = 0;
let mut sample_slots = 0;
for pack in &packs {
let j: Value = serde_json::from_str(&read_pack(pack, "program.json")).unwrap();
let name = j["load_class"].as_str().unwrap();
let c = class(name);
assert_eq!(&format!("{name}"), pack, "pack directory named after its class");
let seed = j["seed"].as_str().unwrap();
let seed_bytes = igneum_pow::bind::unhex(j["seed_bytes"].as_str().unwrap()).unwrap();
let day_bytes = igneum_pow::bind::unhex(j["dataset"]["day_bytes"].as_str().unwrap()).unwrap();
let log2 = j["dataset"]["log2_words"].as_u64().unwrap() as u32;
assert_eq!(j["dataset_mode"].as_str().unwrap(), "memory-hard");
let program = generate_from_seed_bytes_class(seed, &seed_bytes, c);
assert_eq!(program.class, c);
assert_eq!(program.program_id(), u64::from_str_radix(j["program_id"].as_str().unwrap().trim_start_matches("0x"), 16).unwrap());
let mut dataset = DatasetSource::from_key(seed_words_from_bytes(&day_bytes), DatasetMode::MemoryHard, log2);
dataset.key_bytes = day_bytes;
let e = Epoch { program, dataset };
let p = &e.program;
let mp = e.dataset.memhard().map(|m| &m.params);
let k = c.scratch_slots();
let slots = c.scratch_slots_per_lane();
assert_eq!(p.scratch_ops_per_hash(), k * ITERATIONS);
for (file, text, dialect, kernels) in [
("program.metal", metal_program(p, log2, LoadSource::Stored), Dialect::Metal, 1),
("program_bound.metal", metal_program_bound(p, log2), Dialect::Metal, 1),
("kernel.cu", cuda_kernel(p, mp), Dialect::Cuda, 1),
("kernel_bound.cu", cuda_kernel_bound(p, mp), Dialect::Cuda, 1),
("kernel.cl", opencl_kernel(p, mp), Dialect::OpenCl, 1),
// the OpenCL bound file carries igneum_hash and igneum_hash_bound
("kernel_bound.cl", opencl_kernel_bound(p, mp), Dialect::OpenCl, 2),
] {
let on_disk = read_pack(pack, file);
assert_eq!(on_disk, text, "{pack}/{file}: the pack is the emitter's text");
// scr0 is the persistent control: an arena and a tag, no read-modify-write; the check holds with k = 0
scratch_text_check(&on_disk, dialect, k, slots, kernels).unwrap_or_else(|e| panic!("{pack}/{file}: {e}"));
checked += 1;
}
// the vectors of the pack are the CPU's
let v: Value = serde_json::from_str(&read_pack(pack, "vectors.json")).unwrap();
for w in v["warps"].as_array().unwrap() {
let base = w["base_nonce"].as_u64().unwrap() as u32;
let got = e.hash_warp(base);
for (lane, x) in w["expected"].as_array().unwrap().iter().enumerate() {
let want = u64::from_str_radix(x.as_str().unwrap().trim_start_matches("0x"), 16).unwrap();
assert_eq!(got[lane], want, "{pack}: base {base} lane {lane}");
}
}
if k == 4 && slots == 64 {
sample_metal = read_pack(pack, "program.metal");
sample_cl = read_pack(pack, "kernel.cl");
sample_cu = read_pack(pack, "kernel.cu");
sample_k = k;
sample_slots = slots;
}
}
assert_eq!(checked, packs.len() * 6);
println!("static scratch check: {checked} kernels over {} scr packs", packs.len());
// The deliberate breaks (the watcher rule of CLAUDE.md: a check is trusted once it fails on a known-broken
// case). Each must be caught; the message names what.
assert!(sample_k == 4 && sample_slots == 64, "scr4k32 is in the pack set");
let mask = format!(" & {}u; uint4 v_", sample_slots - 1);
let broken_mask = sample_metal.replacen(&mask, "; uint4 v_", 1);
assert_ne!(broken_mask, sample_metal);
let e = scratch_text_check(&broken_mask, Dialect::Metal, 4, 64, 1).unwrap_err();
assert!(e.contains("masked slot followed by the load: 3, expected 4"), "{e}");
println!("break 1 (one mask dropped, Metal): {e}");
let wrong_mask = sample_metal.replace(" & 63u;", " & 127u;");
let e = scratch_text_check(&wrong_mask, Dialect::Metal, 4, 64, 1).unwrap_err();
assert!(e.contains("masked slot followed by the load: 0, expected 4"), "{e}");
println!("break 2 (mask 63 -> 127 on every RMW, Metal): {e}");
let wrong_stride = sample_metal.replace("* 256u;", "* 128u;");
let e = scratch_text_check(&wrong_stride, Dialect::Metal, 4, 64, 1).unwrap_err();
assert!(e.contains("arena definition: 0, expected 1"), "{e}");
println!("break 3 (arena stride 256 -> 128 words, Metal): {e}");
let stray = format!("{sample_metal}\n// stray\n// arena[0] = 0u; scratch[1] = 1u;\n");
let e = scratch_text_check(&stray, Dialect::Metal, 4, 64, 1).unwrap_err();
assert!(e.contains("arena mentions") && e.contains("direct scratch indexing: 1, expected 0"), "{e}");
println!("break 4 (a stray arena and scratch access, Metal): {e}");
let e = scratch_text_check(&sample_cl.replacen(" & 63u; uint4 v_ = vload4", "; uint4 v_ = vload4", 1), Dialect::OpenCl, 4, 64, 1).unwrap_err();
assert!(e.contains("masked slot followed by the load: 3, expected 4"), "{e}");
println!("break 5 (one mask dropped, OpenCL): {e}");
let e = scratch_text_check(&sample_cu.replacen(" & 63u; uint4 v_ = *(const uint4*)", "; uint4 v_ = *(const uint4*)", 1), Dialect::Cuda, 4, 64, 1).unwrap_err();
assert!(e.contains("masked slot followed by the load: 3, expected 4"), "{e}");
println!("break 6 (one mask dropped, CUDA): {e}");
// and the unbroken texts pass under the same calls
scratch_text_check(&sample_metal, Dialect::Metal, 4, 64, 1).unwrap();
scratch_text_check(&sample_cl, Dialect::OpenCl, 4, 64, 1).unwrap();
scratch_text_check(&sample_cu, Dialect::Cuda, 4, 64, 1).unwrap();
// a wrong slot count, RMW count or kernel count against a right text fails too (the check is tied to the class)
assert!(scratch_text_check(&sample_metal, Dialect::Metal, 4, 256, 1).is_err());
assert!(scratch_text_check(&sample_metal, Dialect::Metal, 3, 64, 1).is_err());
assert!(scratch_text_check(&sample_metal, Dialect::Metal, 4, 64, 2).is_err());
}
// ---------------------------------------------------------------------------------------------------------------
// 5. The fuzz: 200 generated scratch programs, contract on every instruction, 4 units each across the 32-bit
// range including the wrap; with IGNEUM_SCRATCH_PACKS_OUT the packs for the Metal runs (question 3, 4)
// ---------------------------------------------------------------------------------------------------------------
/// Write a pack whose vectors.json carries `bases` (any number of units) instead of the three standard bases.
fn write_pack_with_bases(dir: &PathBuf, e: &Epoch, day: &str, bases: &[u32], source: &str) -> Vec<[u64; 32]> {
let mut pack = export_pack(e, day, source);
let outs: Vec<[u64; 32]> = bases.iter().map(|&b| e.hash_warp(b)).collect();
let vj = vectors_json(&e.program, day, e.dataset.log2_words, bases, &outs, &pack.vectors, e.dataset.mask, source, true);
for f in pack.files.iter_mut() {
if f.0 == "vectors.json" {
f.1 = vj.clone();
}
}
pack.write_to(dir).unwrap();
outs
}
fn contract(p: &Program) {
assert_eq!(p.instrs.len(), INSTR_COUNT);
assert_eq!(p.instrs.iter().filter(|i| i.op == Op::Load).count() + p.instrs.iter().filter(|i| i.op == Op::Scratch).count(), 16);
assert_eq!(p.instrs.iter().filter(|i| i.op == Op::Scratch).count(), p.class.scratch_slots());
assert!(p.instrs[0].op != Op::Load && p.instrs[0].op != Op::Scratch, "instruction 0 is never a memory op");
for (k, i) in p.instrs.iter().enumerate() {
assert!(i.src != i.dst, "#{k}: src == dst");
assert!((1..=31).contains(&i.rot), "#{k}: rot {}", i.rot);
assert!([1u8, 2, 4, 8, 16].contains(&i.mask), "#{k}: mask {}", i.mask);
assert!(i.dst < 8 && i.src < 8 && i.src2 < 8);
assert_eq!(i.width, 1, "#{k}: a scratch class reads one-word loads");
}
assert!(igneum_pow::accept::check(p).is_ok(), "an accepted program");
}
#[test]
fn fuzz_scr_programs_cpu() {
let n: usize = std::env::var("IGNEUM_SCRATCH_FUZZ").ok().and_then(|s| s.parse().ok()).unwrap_or(200);
// IGNEUM_FUZZ_SEED_BASE (default 0): the seed index offset for the continuous fuzzer (infra/build-server/capacity)
let base: usize = std::env::var("IGNEUM_FUZZ_SEED_BASE").ok().and_then(|s| s.parse().ok()).unwrap_or(0);
let out = std::env::var("IGNEUM_SCRATCH_PACKS_OUT").ok().map(PathBuf::from);
let mut rng = SplitMix64::new(0x6967_6e65_756d_2d73); // "igneum-s"
let day = "2026-10-03";
let closed = DatasetSource::new(day, DatasetMode::ClosedForm, 28);
// memory-hard sources per size, built once each (the cache fill is 0.2 s); only when packs are written
let mut mh: HashMap<u32, DatasetSource> = HashMap::new();
let mut manifest = String::from("pack\tclass\tlog2\tprogram_id\tscratch_ops_per_hash\tbases\n");
let mut per_class: HashMap<String, usize> = HashMap::new();
let mut units = 0usize;
let mut wraps = 0usize;
if let Some(dir) = &out {
std::fs::create_dir_all(dir).unwrap();
// the edge packs first: 64 MiB datasets (no dataset load in them), the four edge bases
for kb in [32u8, 128] {
for (name, _what, p) in edge_programs(kb) {
let log2 = 24;
let ds = mh.remove(&log2).unwrap_or_else(|| DatasetSource::new(day, DatasetMode::MemoryHard, log2));
let e = Epoch { program: p, dataset: ds };
let pack_name = format!("edge-{name}-k{kb}");
write_pack_with_bases(&dir.join(&pack_name), &e, day, &EDGE_BASES, "igneum-pow tests/scratch.rs edge");
manifest.push_str(&format!(
"{pack_name}\t{}\t{log2}\t{:016x}\t{}\t{}\n",
e.program.class.name(),
e.program.program_id(),
e.program.scratch_ops_per_hash(),
EDGE_BASES.iter().map(|b| format!("{b}")).collect::<Vec<_>>().join(",")
));
mh.insert(log2, e.dataset);
}
}
}
for i in base..base + n {
let name = CLASSES[rng.below(CLASSES.len() as u64) as usize];
let c = class(name);
let seed = format!("igneum-scratch-fuzz/{i}");
let p = generate_class(&seed, c);
contract(&p);
*per_class.entry(name.to_string()).or_insert(0) += 1;
// four bases: one inside a 256-nonce batch (in-batch check on the GPU), one straddling 2^31, one in
// the last 256 nonces (the unit wraps past 2^32 or ends on it), one uniform
let b0 = (rng.below(8) as u32) * 32;
let b1 = 0x8000_0000u32.wrapping_sub(256).wrapping_add((rng.below(16) as u32) * 32);
let b2 = 0xffff_ff00u32.wrapping_add((rng.below(8) as u32) * 32);
let b3 = (rng.next() as u32) & !31;
let bases = [b0, b1, b2, b3];
// an aligned unit never straddles 2^32 (spec 1.9); the top unit ends on 0xffffffff and the persistent
// kernel's unit sequence wraps inside a launch, which the Metal run checks with packbench --batch-base
wraps += bases.iter().filter(|&&b| b >= 0xffff_ff00).count();
// the CPU: the interpreter is deterministic and every scratch event is inside the lane's slots
for &b in &bases {
let (r1, ev) = interpret_warp_scratch(&p, &p.seed, b, &closed, true);
let r2 = interpret_warp_scratch(&p, &p.seed, b, &closed, false).0;
assert_eq!(r1.hashes, r2.hashes);
assert_eq!(ev.len(), p.scratch_ops_per_hash() * LANES);
assert!(ev.iter().all(|e: &ScratchEvent| e.slot < c.scratch_slots_per_lane() as u32));
units += 1;
}
if let Some(dir) = &out {
let log2 = [24u32, 26, 28][rng.below(3) as usize];
let ds = mh.remove(&log2).unwrap_or_else(|| DatasetSource::new(day, DatasetMode::MemoryHard, log2));
let e = Epoch { program: p, dataset: ds };
let pack_name = format!("fuzz-{i:03}-{name}-l{log2}");
write_pack_with_bases(&dir.join(&pack_name), &e, day, &bases, "igneum-pow tests/scratch.rs fuzz");
manifest.push_str(&format!(
"{pack_name}\t{name}\t{log2}\t{:016x}\t{}\t{}\n",
e.program.program_id(),
e.program.scratch_ops_per_hash(),
bases.iter().map(|b| format!("{b}")).collect::<Vec<_>>().join(",")
));
mh.insert(log2, e.dataset);
} else {
let _ = rng.below(3);
}
}
let mut classes: Vec<_> = per_class.iter().collect();
classes.sort();
println!("fuzz: {n} programs, {units} units on the CPU, {wraps} units in the top 256 nonces, classes {classes:?}, seeds {base}..{}", base + n);
assert_eq!(units, 4 * n);
assert_eq!(wraps, n, "every program has a unit in the top 256 nonces");
if let Some(dir) = &out {
std::fs::write(dir.join("manifest.tsv"), manifest).unwrap();
println!("packs written to {}", dir.display());
}
}
/// The fold and rewrite, restated: a slot after `d` dependent RMWs holds 96 bits that are a function of the fill
/// (3 words, a pure function of nonce, slot and seed) and the `d` fold values; a chip that keeps the `d` fold
/// values (32 bits each) instead of the 96-bit slot recomputes the slot in `d` rewrites. This test pins the
/// arithmetic the analysis uses (question 2): the replay from the fold values reproduces the slot.
#[test]
fn slot_is_replayable_from_its_fold_values() {
let seed = seed_words_from_bytes(b"igneum-genesis");
let (base, lane, slot) = (0x1234_5600u32, 5u32, 17u32);
let fill = [scratch_fill(&seed, base, lane, slot, 0), scratch_fill(&seed, base, lane, slot, 1), scratch_fill(&seed, base, lane, slot, 2)];
let mut rng = SplitMix64::new(99);
let dsts: Vec<u32> = (0..64).map(|_| rng.next() as u32).collect();
// the honest sequence: read, fold, rewrite, 64 times
let mut w = fill;
let mut xs = Vec::new();
for &d in &dsts {
let x = fold_words(d, &w);
xs.push(x);
w = scratch_rewrite(x, &w);
}
// the replay: from the fill and the stored fold values alone
let mut w2 = fill;
for &x in &xs {
w2 = scratch_rewrite(x, &w2);
}
assert_eq!(w, w2);
// and nothing shorter: the fold value at step d depends on the slot content at step d, which depends on
// every earlier fold value (drop one and the chain diverges)
let mut w3 = fill;
for (i, &x) in xs.iter().enumerate() {
if i != 10 {
w3 = scratch_rewrite(x, &w3);
}
}
assert_ne!(w, w3);
}

View file

@ -0,0 +1,416 @@
{
"format": "igneum-program-pack-3",
"generator": 5,
"attempt": 0,
"program_id": "0xe5a4ac5978462156",
"program_id_derivation": "FNV-1a 64 over 'igneum-program/' || generator_le32 || seed_words as little-endian bytes || attempt_le32",
"dataset_mode": "memory-hard",
"seed": "igneum-epoch/4020cb4382e3fe4b281c817c02582e147d8f851f566ae9172b28912b8e68b925/day/69676e65756d2d6461792ffd50000000000000",
"seed_bytes": "4020cb4382e3fe4b281c817c02582e147d8f851f566ae9172b28912b8e68b925",
"seed_words": ["0xbe8c5a0c", "0x7646e626", "0x508e29d0", "0xfb8a5b4a", "0x53c50955", "0x685d62fc", "0x6065c013", "0x881096eb"],
"seed_derivation": "seed_words = FNV-1a 64 over seed_bytes (attempt 0) or seed_bytes || attempt_le32 (attempt k >= 1), basis ^ (salt * 0x9E3779B97F4A7C15) for salt 0..3, then h ^= h>>33; h *= 0xff51afd7ed558ccd; h ^= h>>33; words[2*salt] = low 32, words[2*salt+1] = high 32",
"generator_rule": "version 2: exactly 16 load slots drawn first from instructions 1..63 (partial Fisher-Yates), the other 48 ops from the ten non-load weights (sum 75); a load's source is drawn from the registers other than dst written by an earlier instruction and not read by a load since; the candidate must pass the acceptance rule of spec 01 section 1.4.6 (static: no cyclically stale load source, every register has an injecting write; dynamic: 64 units on the seed-keyed closed-form dataset with no constant register bit, no lane-constant load site, under 164 saturated final values, every output bit within 136 of 1024, distinct addresses above 245760), else the next attempt of the seed is tried",
"lanes": 32,
"registers": 8,
"iterations": 8,
"instruction_count": 64,
"loads_per_hash": 128,
"program_class": "v5",
"era_seed_bytes": "4020cb4382e3fe4b281c817c02582e147d8f851f566ae9172b28912b8e68b925",
"state": {
"block": "4020cb4382e3fe4b281c817c02582e147d8f851f566ae9172b28912b8e68b925",
"block_number": 0,
"root": "7e37a9fb19b154d32daf5bf30a50d339a75029fbc9eec9ea20e95439dba5a311",
"leaves": 11,
"records": 11,
"sampled": false,
"leaves_fnv1a64": "0xf141bfee2a8b11b0",
"leaf_derivation": "leaves[i] = Blake2b-512('igneum-sd1/' || root || i_le32 || record_i) as 16 little-endian words; item t XORs leaves[t mod leaves] into its 16 initial words before the first mixer",
"file": "leaves.bin"
},
"load_class": "mx8-eraaf3a9139+sh256x27+state",
"mixer_mult": 8,
"cache_growth": true,
"mixer": "class v3 (Counter ASIC 2.0, 5 October 2026, docs/plans/mixer-x4.md): every mixer application of the item derivation is 8 applications with round keys (r * 8 + j + 1) * 0x9E3779B9, the 8 dependent cache reads per item unchanged; cache growth rule option C: cache words = 2^(26 + doublings(day)), dataset words = 2^(genesis_log2 + doublings(day)), doublings(day) = floor(log2(1 + day / 1460)) for day = days since genesis",
"load_slots": 16,
"load_mix_percent_4_16_64": [100, 0, 0],
"load_width_counts_4_16_64": [16, 0, 0],
"bytes_per_hash": 512,
"wide_load": "read-width experiment (5 October 2026, docs/plans/read-width.md), NOT the lottery hash: a load of W words (width field, 4 or 16) reads dataset[b .. b + W) with b = (src & mask) & ~(W - 1) and folds every word into dst: x = dst ^ w[0]; for j in 1..W: x = (rotl(x, 11) * 0x9e3779b1) ^ w[j]; dst = x; width 1 is the plain load; the width is drawn per instruction from the class mix with one extra below(100) draw after the nine of version 2, and the program id is FNV-1a 64 over 'igneum-program-rw/' || generator_le32 || seed words || attempt_le32 || mix[3] || load_slots",
"era": {
"label": "af3a9139",
"seed_words": ["0xaf3a9139", "0x894db311", "0xd6173573", "0xc346bc0f", "0x2d547cec", "0xd5634ab8", "0xb9584827", "0x305d030e"],
"draw": "docs/plans/era-layout.md 1.1: SplitMix64 seeded with seed_words[0] | seed_words[1] << 32 of seed_words_from_bytes('igneum-era/' || n_le64 || E_n); width = allowed[below(|allowed|)], stride_mul = low32(next()) | 1, stride_rot = 1 + below(31), then four next() draws for a partial Fisher-Yates over positions log2(W)..15 of which 4 - log2(W) are used",
"allowed_widths": [1],
"width_words": 1,
"stride_mul": "0x2cb18b35",
"stride_rot": 9,
"interleave": [1, 9, 13, 14],
"address": "y = rotl(src * stride_mul, stride_rot); k = min(win, D - 26); idx = ((y & (mask >> k)) | ((off & (2^k - 1)) << (D - k))) & mask; a wide load aligns idx down to W words",
"windows": "per instruction, after the width roll: win = below(3), off = low32(next()) & (2^win - 1); used on a load slot (the instruction's win and off fields)",
"dataset_word": "dataset[w] = item(t(w))[j(w)]: j(w) gathers the bits of w at the interleave positions, t(w) is w with those bits removed",
"program_id_suffix": "'era/' || allowed[3] || width_words || stride_mul_le32 || stride_rot_le32 || interleave[4]"
},
"op_mix": {"load": 16, "add": 11, "shfl": 7, "mad": 6, "xor": 6, "mul": 4, "mulhi": 4, "rotr": 4, "rotl": 3, "sub": 2, "or": 1},
"register_init": "for i in 0..7: x = nonce ^ seed_words[i]; x += 0x9e3779b9 * (i+1) (mod 2^32); x = splitmix32(x); r[i] = x ^ seed_words[(i+1) & 7]",
"splitmix32": "x ^= x>>16; x *= 0x7feb352d; x ^= x>>15; x *= 0x846ca68b; x ^= x>>16",
"iteration": "sel = r0 sampled once at the top of each iteration, then all instructions in order",
"output": "lo = r0 ^ rotl(r1,7) ^ rotl(r2,14) ^ rotl(r3,21); hi = r4 ^ rotl(r5,9) ^ rotl(r6,18) ^ rotl(r7,27); out = (hi << 32) | lo",
"op_semantics": {
"add": "dst = dst + src + (bit `bit` of sel ? imm2 : imm)",
"sub": "dst = dst - src",
"mul": "dst = dst * src (low 32)",
"mulhi": "dst = high 32 bits of dst * src",
"xor": "dst = dst ^ src",
"or": "dst = dst | src",
"rotl": "dst = rotl(dst, rot), rot in 1..31",
"rotr": "dst = rotr(dst, src & 31)",
"mad": "dst = src * src2 + dst",
"shfl": "dst = dst ^ (src of lane (lane ^ mask)), mask in {1,2,4,8,16}, within the 32-lane warp",
"load": "dst = dst ^ dataset[src & dataset.mask]",
"wload": "base = (src of lane 0 & dataset.mask) & ~31; dst = dst ^ dataset[base + lane] (warp-coalesced 128-byte load, lever b, only when --wide-frac > 0)"
},
"dataset": {
"log2_words": 28,
"bytes": 1073741824,
"mask": "0x0fffffff",
"day": "bytes:69676e65756d2d6461792ffd50000000000000",
"day_bytes": "69676e65756d2d6461792ffd50000000000000",
"day_words_from": "seed_words_from_bytes(day_bytes)",
"d0": "0xe23f9008",
"d1": "0xde33e763",
"mode": "memory-hard",
"spec": "proto-metal/MEMHARD.md",
"key": ["0xe23f9008", "0xde33e763", "0xc5ba415d", "0x8ddf6786", "0x59f4a4be", "0x8a3bc680", "0x701b8e40", "0x3b59025a"],
"key_derivation": "the 8 words of seed_words_from_bytes(day_bytes); d0, d1 are key[0], key[1]",
"cache": {"log2_words": 26, "bytes": 268435456, "line_words": 16, "segment_lines": 64, "segments": 65536, "block": "ChaCha12 core + feed-forward, rotations 16 12 8 7", "sigma": ["0x61707865", "0x3320646e", "0x79622d32", "0x6b206574"], "tag": ["0x49676e65", "0x756d4d48"], "chain": "in_j = prev_line ^ (sigma[0..3] || key[0..7] || seg || j || tag[0..1]); line_j = block(in_j); prev_0 = 0"},
"mixer": {"draw": "SplitMix64 seeded with key[0] | key[1] << 32: rot[0..7] = 1 + next() % 31, mul[0..15] = low32(next()) | 1, rc[0..15] = low32(next())", "rot": [28, 11, 18, 18, 13, 28, 5, 13], "mul": ["0xd1d79e7f", "0xbcb61f8b", "0x970e91ab", "0xd749d96d", "0x143d7339", "0x2cde0d69", "0x12d0a8c1", "0x2d335be9", "0x80a8aae9", "0x7ac896c7", "0x9de23db7", "0xc362827d", "0x5f4cdb5b", "0xfc6c5097", "0x6f547f83", "0x1ac31b47"], "rc": ["0xe5bef5a3", "0xdb2a7d90", "0xcd1fa7e1", "0x30289419", "0x0a730d58", "0x432f8579", "0x6ab978a5", "0x8c984f49", "0x788c3c9e", "0x051eef02", "0x05e77db9", "0x8b3cd4f3", "0x6948d6cf", "0x0d8677f6", "0xf9505c8c", "0x4513c163"], "round": "for i in 0..15: s[i] = (s[i] ^ (rc[i] + (r+1) * 0x9E3779B9)) * mul[i]; then quarter rounds on columns (0,4,8,12) (1,5,9,13) (2,6,10,14) (3,7,11,15) with rot[0..3] and diagonals (0,5,10,15) (1,6,11,12) (2,7,8,13) (3,4,9,14) with rot[4..7]", "quarter_round": "a += b; d ^= a; d = rotl(d, r1); c += d; b ^= c; b = rotl(b, r2); a += b; d ^= a; d = rotl(d, r3); c += d; b ^= c; b = rotl(b, r4)"},
"mixer_mult": 8,
"item": "s[0..7] = key; s[8+i] = t * mul[i] + rc[i] for i in 0..7; for r in 0..7: for j in 0..7: s = M(s, rk = (r * 8 + j + 1) * 0x9E3779B9); line = s[0] & 0x003fffff; s[i] ^= cache[line * 16 + i]; then for j in 0..7: s = M(s, rk = (64 + j + 1) * 0x9E3779B9); item(t) = s",
"word": "dataset[w] = item(w >> 4)[w & 15]"
},
"shadow": {"instrs": 256, "reps": 27, "instrs_per_hash": 55296, "op_mix": {"add": 45, "mad": 31, "shfl": 31, "xor": 30, "rotl": 28, "mul": 22, "or": 18, "mulhi": 17, "rotr": 17, "sub": 17}, "rule": "Counter ASIC 3.0 item 8 (docs/analysis/latency-shadow-2026-10-06.md): after the 64 base instructions the program stream draws instrs more ALU instructions (the non-load table, nine draws each, the source as on an ALU slot); the block runs reps times at the end of every iteration with the iteration's sel; the acceptance rule interprets the base program only", "program_id_suffix": "'shadow/' || instrs_le16 || reps_le16", "instructions": [
{"i": 0, "op": "or", "dst": 6, "src": 0, "src2": 2, "imm": "0xc1eb1523", "imm2": "0x925958ea", "rot": 14, "bit": 14, "mask": 8},
{"i": 1, "op": "mul", "dst": 7, "src": 3, "src2": 4, "imm": "0xc7044334", "imm2": "0x755566b6", "rot": 19, "bit": 17, "mask": 8},
{"i": 2, "op": "mad", "dst": 3, "src": 5, "src2": 5, "imm": "0x33b52f17", "imm2": "0xcc459a7a", "rot": 5, "bit": 19, "mask": 16},
{"i": 3, "op": "add", "dst": 7, "src": 4, "src2": 4, "imm": "0x97d3d105", "imm2": "0x38e58a06", "rot": 11, "bit": 6, "mask": 1},
{"i": 4, "op": "add", "dst": 6, "src": 0, "src2": 6, "imm": "0x29b87b9a", "imm2": "0x9629673d", "rot": 16, "bit": 20, "mask": 8},
{"i": 5, "op": "shfl", "dst": 6, "src": 2, "src2": 5, "imm": "0xb61f2e77", "imm2": "0x30e3807c", "rot": 1, "bit": 7, "mask": 1},
{"i": 6, "op": "mad", "dst": 5, "src": 3, "src2": 5, "imm": "0x0de66253", "imm2": "0xfdfdd03e", "rot": 4, "bit": 27, "mask": 4},
{"i": 7, "op": "rotl", "dst": 3, "src": 7, "src2": 1, "imm": "0x688514dd", "imm2": "0x139d08b5", "rot": 5, "bit": 1, "mask": 1},
{"i": 8, "op": "add", "dst": 0, "src": 7, "src2": 3, "imm": "0xa7c1fb0f", "imm2": "0x4a5f55e1", "rot": 15, "bit": 12, "mask": 1},
{"i": 9, "op": "mul", "dst": 5, "src": 7, "src2": 2, "imm": "0x1a64de5a", "imm2": "0xe37b0875", "rot": 5, "bit": 27, "mask": 16},
{"i": 10, "op": "xor", "dst": 4, "src": 5, "src2": 3, "imm": "0x750d4f1a", "imm2": "0x2f3d9402", "rot": 3, "bit": 14, "mask": 2},
{"i": 11, "op": "mulhi", "dst": 6, "src": 4, "src2": 5, "imm": "0x2eaa86c6", "imm2": "0x9fd5b22f", "rot": 30, "bit": 10, "mask": 1},
{"i": 12, "op": "rotl", "dst": 5, "src": 2, "src2": 4, "imm": "0x8df50473", "imm2": "0x23d780ce", "rot": 13, "bit": 9, "mask": 1},
{"i": 13, "op": "mad", "dst": 0, "src": 2, "src2": 1, "imm": "0xa956a7e6", "imm2": "0x58dbb356", "rot": 31, "bit": 11, "mask": 8},
{"i": 14, "op": "mulhi", "dst": 2, "src": 4, "src2": 6, "imm": "0x6fbfb145", "imm2": "0x064eb015", "rot": 20, "bit": 2, "mask": 4},
{"i": 15, "op": "or", "dst": 3, "src": 1, "src2": 5, "imm": "0xd313bc27", "imm2": "0x9f0fc235", "rot": 17, "bit": 16, "mask": 1},
{"i": 16, "op": "sub", "dst": 0, "src": 5, "src2": 0, "imm": "0x86cbd336", "imm2": "0x94715167", "rot": 17, "bit": 31, "mask": 8},
{"i": 17, "op": "mul", "dst": 0, "src": 6, "src2": 3, "imm": "0x95911c6b", "imm2": "0x816cea32", "rot": 23, "bit": 1, "mask": 2},
{"i": 18, "op": "shfl", "dst": 5, "src": 1, "src2": 3, "imm": "0xf563dcad", "imm2": "0xb2889856", "rot": 14, "bit": 24, "mask": 4},
{"i": 19, "op": "or", "dst": 3, "src": 4, "src2": 2, "imm": "0x7bb48d19", "imm2": "0xbf95ad6f", "rot": 8, "bit": 30, "mask": 16},
{"i": 20, "op": "mad", "dst": 6, "src": 3, "src2": 2, "imm": "0xeb686a8d", "imm2": "0x8bda9f8a", "rot": 11, "bit": 18, "mask": 1},
{"i": 21, "op": "rotl", "dst": 0, "src": 6, "src2": 0, "imm": "0x0915df51", "imm2": "0xa1365cda", "rot": 11, "bit": 25, "mask": 1},
{"i": 22, "op": "rotl", "dst": 3, "src": 0, "src2": 3, "imm": "0xc09e4cdc", "imm2": "0x50c1369d", "rot": 25, "bit": 31, "mask": 2},
{"i": 23, "op": "xor", "dst": 6, "src": 4, "src2": 1, "imm": "0xce01abec", "imm2": "0x5ff8c52e", "rot": 30, "bit": 19, "mask": 8},
{"i": 24, "op": "or", "dst": 4, "src": 2, "src2": 4, "imm": "0xdacf9e4b", "imm2": "0x086a5684", "rot": 2, "bit": 10, "mask": 2},
{"i": 25, "op": "add", "dst": 1, "src": 6, "src2": 3, "imm": "0x53e74799", "imm2": "0xfc2f6d17", "rot": 8, "bit": 7, "mask": 16},
{"i": 26, "op": "rotr", "dst": 7, "src": 6, "src2": 7, "imm": "0xc89a75a0", "imm2": "0x67813253", "rot": 24, "bit": 13, "mask": 1},
{"i": 27, "op": "add", "dst": 7, "src": 5, "src2": 4, "imm": "0xb8fae90e", "imm2": "0x787048dc", "rot": 26, "bit": 27, "mask": 1},
{"i": 28, "op": "xor", "dst": 4, "src": 1, "src2": 0, "imm": "0x4c90c2ea", "imm2": "0x2ce7865b", "rot": 4, "bit": 7, "mask": 2},
{"i": 29, "op": "xor", "dst": 6, "src": 1, "src2": 6, "imm": "0x6131ab08", "imm2": "0xd1825676", "rot": 4, "bit": 30, "mask": 2},
{"i": 30, "op": "mulhi", "dst": 2, "src": 0, "src2": 1, "imm": "0xbe4a545f", "imm2": "0xdc29e823", "rot": 17, "bit": 5, "mask": 8},
{"i": 31, "op": "rotr", "dst": 1, "src": 4, "src2": 1, "imm": "0x4d2f9cdc", "imm2": "0xdee1cc73", "rot": 5, "bit": 16, "mask": 4},
{"i": 32, "op": "xor", "dst": 7, "src": 4, "src2": 5, "imm": "0x9d277aaa", "imm2": "0xa902fca5", "rot": 11, "bit": 3, "mask": 1},
{"i": 33, "op": "mad", "dst": 3, "src": 2, "src2": 6, "imm": "0x7db09644", "imm2": "0x077bf3d9", "rot": 30, "bit": 19, "mask": 2},
{"i": 34, "op": "add", "dst": 3, "src": 1, "src2": 1, "imm": "0xd2dc42eb", "imm2": "0x9ffd510b", "rot": 17, "bit": 12, "mask": 2},
{"i": 35, "op": "add", "dst": 4, "src": 7, "src2": 0, "imm": "0xad8eda6f", "imm2": "0xf871ba37", "rot": 24, "bit": 7, "mask": 4},
{"i": 36, "op": "add", "dst": 7, "src": 4, "src2": 3, "imm": "0xb0cef8f4", "imm2": "0xd02d30ca", "rot": 22, "bit": 3, "mask": 16},
{"i": 37, "op": "mad", "dst": 4, "src": 3, "src2": 2, "imm": "0x6ed99a66", "imm2": "0x83dc97c0", "rot": 4, "bit": 1, "mask": 4},
{"i": 38, "op": "mad", "dst": 5, "src": 7, "src2": 7, "imm": "0xe24fdd24", "imm2": "0x360f5c8b", "rot": 19, "bit": 9, "mask": 8},
{"i": 39, "op": "add", "dst": 3, "src": 6, "src2": 4, "imm": "0x2bd506e2", "imm2": "0x82e98a22", "rot": 28, "bit": 26, "mask": 1},
{"i": 40, "op": "rotl", "dst": 0, "src": 2, "src2": 1, "imm": "0xdb1faed3", "imm2": "0xf968a20d", "rot": 21, "bit": 30, "mask": 16},
{"i": 41, "op": "or", "dst": 1, "src": 0, "src2": 1, "imm": "0xe6dfe522", "imm2": "0xb75813da", "rot": 10, "bit": 13, "mask": 1},
{"i": 42, "op": "add", "dst": 7, "src": 5, "src2": 7, "imm": "0xc0386e49", "imm2": "0x6435f6d8", "rot": 26, "bit": 28, "mask": 16},
{"i": 43, "op": "mulhi", "dst": 1, "src": 0, "src2": 4, "imm": "0xda497f7d", "imm2": "0xc4b748f4", "rot": 30, "bit": 10, "mask": 4},
{"i": 44, "op": "add", "dst": 5, "src": 6, "src2": 0, "imm": "0x3a8921a4", "imm2": "0x1f682c68", "rot": 12, "bit": 12, "mask": 1},
{"i": 45, "op": "add", "dst": 4, "src": 5, "src2": 6, "imm": "0xeeca4334", "imm2": "0xf246e180", "rot": 26, "bit": 1, "mask": 1},
{"i": 46, "op": "xor", "dst": 2, "src": 3, "src2": 5, "imm": "0x052178c3", "imm2": "0xaab31f10", "rot": 28, "bit": 16, "mask": 8},
{"i": 47, "op": "xor", "dst": 2, "src": 5, "src2": 0, "imm": "0x91fd7273", "imm2": "0xacc42b07", "rot": 22, "bit": 27, "mask": 4},
{"i": 48, "op": "mad", "dst": 7, "src": 4, "src2": 1, "imm": "0x05a2970f", "imm2": "0x14876824", "rot": 10, "bit": 5, "mask": 1},
{"i": 49, "op": "mad", "dst": 2, "src": 6, "src2": 1, "imm": "0x4440d6de", "imm2": "0x352023f9", "rot": 10, "bit": 25, "mask": 8},
{"i": 50, "op": "mad", "dst": 7, "src": 0, "src2": 7, "imm": "0xa6f82633", "imm2": "0x78465772", "rot": 13, "bit": 8, "mask": 4},
{"i": 51, "op": "add", "dst": 5, "src": 6, "src2": 5, "imm": "0x745776d8", "imm2": "0x41bd68cc", "rot": 29, "bit": 26, "mask": 1},
{"i": 52, "op": "shfl", "dst": 3, "src": 0, "src2": 6, "imm": "0x8f94ebac", "imm2": "0xe4a208a0", "rot": 5, "bit": 16, "mask": 1},
{"i": 53, "op": "or", "dst": 4, "src": 0, "src2": 5, "imm": "0x7b1235f3", "imm2": "0x408b4ea9", "rot": 27, "bit": 19, "mask": 8},
{"i": 54, "op": "mad", "dst": 0, "src": 2, "src2": 4, "imm": "0x30114050", "imm2": "0xe71dff8f", "rot": 6, "bit": 30, "mask": 1},
{"i": 55, "op": "rotl", "dst": 5, "src": 1, "src2": 7, "imm": "0x69f92198", "imm2": "0x65496f29", "rot": 9, "bit": 20, "mask": 4},
{"i": 56, "op": "mul", "dst": 5, "src": 7, "src2": 6, "imm": "0x88b884d4", "imm2": "0x041b67f7", "rot": 25, "bit": 8, "mask": 16},
{"i": 57, "op": "rotl", "dst": 7, "src": 5, "src2": 6, "imm": "0x7d1e18bc", "imm2": "0xf54ade27", "rot": 27, "bit": 20, "mask": 1},
{"i": 58, "op": "sub", "dst": 7, "src": 6, "src2": 4, "imm": "0xa457bbab", "imm2": "0x4b05eb29", "rot": 6, "bit": 6, "mask": 4},
{"i": 59, "op": "rotl", "dst": 2, "src": 7, "src2": 7, "imm": "0x4890bdda", "imm2": "0xadcb3d99", "rot": 22, "bit": 26, "mask": 16},
{"i": 60, "op": "shfl", "dst": 7, "src": 1, "src2": 7, "imm": "0xe4da58eb", "imm2": "0x1d50080d", "rot": 22, "bit": 26, "mask": 2},
{"i": 61, "op": "add", "dst": 4, "src": 0, "src2": 5, "imm": "0x60d0ff55", "imm2": "0xcba6a161", "rot": 6, "bit": 7, "mask": 8},
{"i": 62, "op": "mul", "dst": 1, "src": 5, "src2": 1, "imm": "0x0fdc702e", "imm2": "0x6b1bd03a", "rot": 9, "bit": 23, "mask": 4},
{"i": 63, "op": "mulhi", "dst": 7, "src": 6, "src2": 1, "imm": "0xcc44ed62", "imm2": "0x931dd006", "rot": 1, "bit": 0, "mask": 2},
{"i": 64, "op": "mul", "dst": 5, "src": 0, "src2": 7, "imm": "0x448c3aba", "imm2": "0x1136818a", "rot": 23, "bit": 7, "mask": 1},
{"i": 65, "op": "rotr", "dst": 2, "src": 5, "src2": 1, "imm": "0xb520dfb8", "imm2": "0xdce7d8f4", "rot": 22, "bit": 10, "mask": 8},
{"i": 66, "op": "mulhi", "dst": 0, "src": 3, "src2": 4, "imm": "0x19fada48", "imm2": "0x3cc04e0e", "rot": 1, "bit": 24, "mask": 16},
{"i": 67, "op": "or", "dst": 0, "src": 7, "src2": 3, "imm": "0x1c5905b4", "imm2": "0xf896dfb7", "rot": 31, "bit": 30, "mask": 8},
{"i": 68, "op": "rotl", "dst": 0, "src": 1, "src2": 5, "imm": "0xa28511c1", "imm2": "0xbf649695", "rot": 19, "bit": 27, "mask": 1},
{"i": 69, "op": "rotl", "dst": 0, "src": 7, "src2": 5, "imm": "0x22e2fef3", "imm2": "0x468bec9e", "rot": 1, "bit": 28, "mask": 1},
{"i": 70, "op": "or", "dst": 2, "src": 3, "src2": 6, "imm": "0xcb542821", "imm2": "0xe084cf11", "rot": 15, "bit": 5, "mask": 8},
{"i": 71, "op": "mad", "dst": 3, "src": 7, "src2": 5, "imm": "0xf06b8f6a", "imm2": "0x7382e15f", "rot": 6, "bit": 28, "mask": 16},
{"i": 72, "op": "mad", "dst": 7, "src": 0, "src2": 4, "imm": "0x4f64c588", "imm2": "0x47b63ee9", "rot": 8, "bit": 10, "mask": 2},
{"i": 73, "op": "or", "dst": 4, "src": 3, "src2": 2, "imm": "0xff138eea", "imm2": "0x6fd90eda", "rot": 23, "bit": 3, "mask": 16},
{"i": 74, "op": "xor", "dst": 3, "src": 1, "src2": 0, "imm": "0x6011ece1", "imm2": "0x89579f15", "rot": 11, "bit": 2, "mask": 4},
{"i": 75, "op": "add", "dst": 1, "src": 3, "src2": 4, "imm": "0x3f4ffea2", "imm2": "0x8e35924e", "rot": 12, "bit": 15, "mask": 2},
{"i": 76, "op": "mul", "dst": 1, "src": 3, "src2": 7, "imm": "0x15efa846", "imm2": "0xa1c971f1", "rot": 14, "bit": 20, "mask": 1},
{"i": 77, "op": "mad", "dst": 0, "src": 3, "src2": 2, "imm": "0x8660530a", "imm2": "0xa013524b", "rot": 14, "bit": 12, "mask": 8},
{"i": 78, "op": "shfl", "dst": 2, "src": 0, "src2": 0, "imm": "0xcc2e96bd", "imm2": "0xe32c6f87", "rot": 10, "bit": 11, "mask": 16},
{"i": 79, "op": "mulhi", "dst": 1, "src": 0, "src2": 6, "imm": "0x61931e3f", "imm2": "0x86383e7f", "rot": 17, "bit": 3, "mask": 1},
{"i": 80, "op": "mulhi", "dst": 0, "src": 4, "src2": 7, "imm": "0xd9991afc", "imm2": "0xd00e8678", "rot": 24, "bit": 15, "mask": 16},
{"i": 81, "op": "mul", "dst": 4, "src": 2, "src2": 3, "imm": "0x472f70f4", "imm2": "0x9fde4236", "rot": 10, "bit": 5, "mask": 4},
{"i": 82, "op": "sub", "dst": 5, "src": 7, "src2": 6, "imm": "0x55a7acb1", "imm2": "0x9fde8df1", "rot": 30, "bit": 29, "mask": 16},
{"i": 83, "op": "mad", "dst": 0, "src": 2, "src2": 3, "imm": "0x1c487c40", "imm2": "0xd9d9a1c3", "rot": 9, "bit": 5, "mask": 4},
{"i": 84, "op": "sub", "dst": 7, "src": 2, "src2": 4, "imm": "0x515c0a72", "imm2": "0x6df5c83d", "rot": 28, "bit": 21, "mask": 4},
{"i": 85, "op": "xor", "dst": 1, "src": 2, "src2": 4, "imm": "0x917f1174", "imm2": "0x8e72e519", "rot": 9, "bit": 18, "mask": 16},
{"i": 86, "op": "shfl", "dst": 6, "src": 3, "src2": 3, "imm": "0xda856cc2", "imm2": "0x932ae8d8", "rot": 28, "bit": 1, "mask": 16},
{"i": 87, "op": "mad", "dst": 3, "src": 0, "src2": 0, "imm": "0x4ef22321", "imm2": "0x5666ada3", "rot": 4, "bit": 4, "mask": 1},
{"i": 88, "op": "rotl", "dst": 0, "src": 1, "src2": 3, "imm": "0xbb3ec00c", "imm2": "0xffe78937", "rot": 20, "bit": 19, "mask": 4},
{"i": 89, "op": "sub", "dst": 1, "src": 5, "src2": 4, "imm": "0x8f295708", "imm2": "0x6608577f", "rot": 17, "bit": 18, "mask": 16},
{"i": 90, "op": "shfl", "dst": 6, "src": 4, "src2": 5, "imm": "0xd953aa15", "imm2": "0x4ef9f062", "rot": 19, "bit": 9, "mask": 16},
{"i": 91, "op": "xor", "dst": 5, "src": 1, "src2": 5, "imm": "0x6c02cde2", "imm2": "0x118dbd2b", "rot": 2, "bit": 20, "mask": 16},
{"i": 92, "op": "rotl", "dst": 5, "src": 0, "src2": 5, "imm": "0x9f0b0c61", "imm2": "0xe26dbe7a", "rot": 12, "bit": 17, "mask": 2},
{"i": 93, "op": "mad", "dst": 6, "src": 1, "src2": 2, "imm": "0x78a44a91", "imm2": "0x3ce118a9", "rot": 18, "bit": 16, "mask": 16},
{"i": 94, "op": "rotr", "dst": 2, "src": 5, "src2": 3, "imm": "0x02295fcb", "imm2": "0xc3353c64", "rot": 5, "bit": 31, "mask": 16},
{"i": 95, "op": "or", "dst": 0, "src": 4, "src2": 4, "imm": "0x727120c3", "imm2": "0x528f4416", "rot": 6, "bit": 20, "mask": 8},
{"i": 96, "op": "mul", "dst": 7, "src": 3, "src2": 4, "imm": "0x919c42ea", "imm2": "0x87526aa5", "rot": 28, "bit": 1, "mask": 8},
{"i": 97, "op": "or", "dst": 5, "src": 0, "src2": 7, "imm": "0x8a0a100c", "imm2": "0xb2c65cc3", "rot": 13, "bit": 7, "mask": 4},
{"i": 98, "op": "add", "dst": 3, "src": 1, "src2": 1, "imm": "0xbcfdd8a7", "imm2": "0x386bb642", "rot": 8, "bit": 13, "mask": 8},
{"i": 99, "op": "add", "dst": 0, "src": 6, "src2": 7, "imm": "0xc921a021", "imm2": "0xa3962d03", "rot": 31, "bit": 9, "mask": 1},
{"i": 100, "op": "rotr", "dst": 1, "src": 0, "src2": 3, "imm": "0x918c6f69", "imm2": "0x1a125801", "rot": 18, "bit": 29, "mask": 16},
{"i": 101, "op": "add", "dst": 2, "src": 4, "src2": 1, "imm": "0x70da4067", "imm2": "0xc5990c5c", "rot": 3, "bit": 18, "mask": 4},
{"i": 102, "op": "rotl", "dst": 2, "src": 7, "src2": 0, "imm": "0x9048d081", "imm2": "0xc25a9f56", "rot": 3, "bit": 25, "mask": 16},
{"i": 103, "op": "shfl", "dst": 1, "src": 4, "src2": 7, "imm": "0x70ca1427", "imm2": "0x6632093d", "rot": 18, "bit": 28, "mask": 4},
{"i": 104, "op": "xor", "dst": 0, "src": 2, "src2": 0, "imm": "0x0637204c", "imm2": "0x3b1b7f94", "rot": 1, "bit": 12, "mask": 2},
{"i": 105, "op": "add", "dst": 4, "src": 3, "src2": 5, "imm": "0x1a5880cb", "imm2": "0xb15aec75", "rot": 31, "bit": 28, "mask": 1},
{"i": 106, "op": "shfl", "dst": 4, "src": 0, "src2": 4, "imm": "0x7c22cb00", "imm2": "0xc4df7949", "rot": 3, "bit": 15, "mask": 2},
{"i": 107, "op": "shfl", "dst": 7, "src": 0, "src2": 0, "imm": "0xd43c76ca", "imm2": "0x8d5b9751", "rot": 31, "bit": 28, "mask": 4},
{"i": 108, "op": "mad", "dst": 1, "src": 7, "src2": 3, "imm": "0x69879993", "imm2": "0x3c4e18b0", "rot": 19, "bit": 25, "mask": 4},
{"i": 109, "op": "mad", "dst": 0, "src": 2, "src2": 3, "imm": "0x8ce3a4a6", "imm2": "0x1b3f0b74", "rot": 19, "bit": 8, "mask": 2},
{"i": 110, "op": "or", "dst": 2, "src": 4, "src2": 5, "imm": "0xcdbdac98", "imm2": "0x8d0e9f92", "rot": 19, "bit": 13, "mask": 1},
{"i": 111, "op": "shfl", "dst": 6, "src": 1, "src2": 1, "imm": "0xe74157f6", "imm2": "0xf92dead6", "rot": 4, "bit": 14, "mask": 1},
{"i": 112, "op": "mad", "dst": 2, "src": 5, "src2": 3, "imm": "0x200831bc", "imm2": "0x1ee98048", "rot": 29, "bit": 14, "mask": 1},
{"i": 113, "op": "mulhi", "dst": 4, "src": 0, "src2": 7, "imm": "0xd6827ead", "imm2": "0xc0ee1933", "rot": 26, "bit": 23, "mask": 16},
{"i": 114, "op": "rotl", "dst": 7, "src": 2, "src2": 2, "imm": "0x6ae1be2b", "imm2": "0x83216a4e", "rot": 29, "bit": 25, "mask": 16},
{"i": 115, "op": "sub", "dst": 3, "src": 7, "src2": 1, "imm": "0xa1d1646e", "imm2": "0x6fa998ce", "rot": 15, "bit": 29, "mask": 2},
{"i": 116, "op": "mulhi", "dst": 0, "src": 1, "src2": 4, "imm": "0xd7921c15", "imm2": "0x8b2345a7", "rot": 10, "bit": 19, "mask": 4},
{"i": 117, "op": "rotl", "dst": 4, "src": 0, "src2": 4, "imm": "0xc1b1b0ab", "imm2": "0xd19b3f39", "rot": 12, "bit": 16, "mask": 1},
{"i": 118, "op": "add", "dst": 1, "src": 4, "src2": 5, "imm": "0x24494ad3", "imm2": "0xc5e98ee5", "rot": 22, "bit": 7, "mask": 16},
{"i": 119, "op": "add", "dst": 0, "src": 4, "src2": 6, "imm": "0x1b2d1c83", "imm2": "0xa97bc949", "rot": 8, "bit": 4, "mask": 16},
{"i": 120, "op": "shfl", "dst": 5, "src": 4, "src2": 7, "imm": "0xb93015ff", "imm2": "0xc22366cd", "rot": 23, "bit": 16, "mask": 4},
{"i": 121, "op": "shfl", "dst": 3, "src": 2, "src2": 5, "imm": "0xc0aaacdb", "imm2": "0xaaa7d229", "rot": 31, "bit": 29, "mask": 8},
{"i": 122, "op": "rotl", "dst": 7, "src": 1, "src2": 3, "imm": "0xcce6a73f", "imm2": "0x517b6b86", "rot": 3, "bit": 16, "mask": 8},
{"i": 123, "op": "rotr", "dst": 4, "src": 6, "src2": 0, "imm": "0x8e156aca", "imm2": "0x0a894b3e", "rot": 2, "bit": 12, "mask": 2},
{"i": 124, "op": "shfl", "dst": 6, "src": 5, "src2": 2, "imm": "0xd88c8446", "imm2": "0xf49fedf3", "rot": 3, "bit": 23, "mask": 1},
{"i": 125, "op": "rotl", "dst": 5, "src": 2, "src2": 0, "imm": "0xd10b27cf", "imm2": "0x2dde1faa", "rot": 21, "bit": 7, "mask": 2},
{"i": 126, "op": "mad", "dst": 0, "src": 3, "src2": 1, "imm": "0x619e1818", "imm2": "0x62add310", "rot": 26, "bit": 1, "mask": 4},
{"i": 127, "op": "add", "dst": 0, "src": 3, "src2": 6, "imm": "0xff14c08d", "imm2": "0xa7f6bb54", "rot": 25, "bit": 24, "mask": 4},
{"i": 128, "op": "xor", "dst": 7, "src": 4, "src2": 4, "imm": "0x34224086", "imm2": "0x5e9f858e", "rot": 4, "bit": 16, "mask": 8},
{"i": 129, "op": "mulhi", "dst": 3, "src": 5, "src2": 6, "imm": "0x89c3cbdd", "imm2": "0x4e80334c", "rot": 29, "bit": 4, "mask": 1},
{"i": 130, "op": "shfl", "dst": 5, "src": 7, "src2": 1, "imm": "0x37d4c3e2", "imm2": "0xbd54378c", "rot": 14, "bit": 26, "mask": 8},
{"i": 131, "op": "mulhi", "dst": 6, "src": 4, "src2": 3, "imm": "0x4f5fac7c", "imm2": "0x74070028", "rot": 5, "bit": 25, "mask": 8},
{"i": 132, "op": "xor", "dst": 5, "src": 3, "src2": 0, "imm": "0x690eb003", "imm2": "0x8516a581", "rot": 20, "bit": 21, "mask": 2},
{"i": 133, "op": "rotl", "dst": 0, "src": 5, "src2": 7, "imm": "0x42b31885", "imm2": "0x08249acb", "rot": 19, "bit": 6, "mask": 8},
{"i": 134, "op": "rotr", "dst": 4, "src": 3, "src2": 3, "imm": "0x07d729ed", "imm2": "0xf564da8a", "rot": 17, "bit": 9, "mask": 16},
{"i": 135, "op": "shfl", "dst": 1, "src": 2, "src2": 0, "imm": "0x19130ef2", "imm2": "0xf59815e5", "rot": 17, "bit": 12, "mask": 16},
{"i": 136, "op": "sub", "dst": 5, "src": 2, "src2": 5, "imm": "0xdeb56168", "imm2": "0x871104c4", "rot": 13, "bit": 17, "mask": 16},
{"i": 137, "op": "xor", "dst": 3, "src": 5, "src2": 4, "imm": "0x884fc7da", "imm2": "0x83a4a5bf", "rot": 23, "bit": 12, "mask": 4},
{"i": 138, "op": "sub", "dst": 0, "src": 2, "src2": 6, "imm": "0x3e67a6fd", "imm2": "0x844d2039", "rot": 3, "bit": 24, "mask": 4},
{"i": 139, "op": "mul", "dst": 3, "src": 7, "src2": 7, "imm": "0x965933b4", "imm2": "0xf37ef93d", "rot": 6, "bit": 9, "mask": 4},
{"i": 140, "op": "add", "dst": 5, "src": 3, "src2": 3, "imm": "0x82ab98f4", "imm2": "0x2d465ca8", "rot": 11, "bit": 24, "mask": 1},
{"i": 141, "op": "add", "dst": 4, "src": 1, "src2": 7, "imm": "0x80594390", "imm2": "0x237a9d8e", "rot": 14, "bit": 11, "mask": 8},
{"i": 142, "op": "mad", "dst": 3, "src": 7, "src2": 0, "imm": "0xd37861a1", "imm2": "0x2fe70eae", "rot": 2, "bit": 11, "mask": 16},
{"i": 143, "op": "or", "dst": 0, "src": 3, "src2": 5, "imm": "0x1a018e2c", "imm2": "0x301aa5f6", "rot": 15, "bit": 26, "mask": 1},
{"i": 144, "op": "mulhi", "dst": 0, "src": 1, "src2": 5, "imm": "0x69d22dfc", "imm2": "0x4a90cb1e", "rot": 21, "bit": 9, "mask": 16},
{"i": 145, "op": "xor", "dst": 6, "src": 2, "src2": 0, "imm": "0xf3f41f47", "imm2": "0xdf8d33e9", "rot": 22, "bit": 0, "mask": 8},
{"i": 146, "op": "shfl", "dst": 7, "src": 1, "src2": 1, "imm": "0xf8a52377", "imm2": "0x0613ef41", "rot": 24, "bit": 12, "mask": 16},
{"i": 147, "op": "add", "dst": 0, "src": 1, "src2": 3, "imm": "0x07f15148", "imm2": "0xe68cf57e", "rot": 2, "bit": 18, "mask": 4},
{"i": 148, "op": "or", "dst": 7, "src": 3, "src2": 0, "imm": "0xbfd39b49", "imm2": "0xc7f6e97c", "rot": 13, "bit": 27, "mask": 2},
{"i": 149, "op": "xor", "dst": 4, "src": 2, "src2": 7, "imm": "0x47409e43", "imm2": "0x04ef7db9", "rot": 8, "bit": 6, "mask": 4},
{"i": 150, "op": "xor", "dst": 7, "src": 1, "src2": 1, "imm": "0x5d42a156", "imm2": "0xc2f77c48", "rot": 27, "bit": 17, "mask": 4},
{"i": 151, "op": "rotr", "dst": 5, "src": 2, "src2": 7, "imm": "0x7c170030", "imm2": "0xa3102916", "rot": 5, "bit": 6, "mask": 1},
{"i": 152, "op": "mul", "dst": 0, "src": 7, "src2": 5, "imm": "0x16d009af", "imm2": "0x2a89533b", "rot": 26, "bit": 8, "mask": 4},
{"i": 153, "op": "rotl", "dst": 4, "src": 5, "src2": 0, "imm": "0x6e54eb71", "imm2": "0xe2d27256", "rot": 16, "bit": 18, "mask": 1},
{"i": 154, "op": "rotr", "dst": 6, "src": 4, "src2": 5, "imm": "0x128f24a4", "imm2": "0x59888463", "rot": 15, "bit": 17, "mask": 16},
{"i": 155, "op": "xor", "dst": 6, "src": 1, "src2": 2, "imm": "0x34f276ff", "imm2": "0xef5086b4", "rot": 2, "bit": 10, "mask": 4},
{"i": 156, "op": "or", "dst": 6, "src": 3, "src2": 4, "imm": "0x16cc2c2f", "imm2": "0xfae5a09b", "rot": 12, "bit": 31, "mask": 4},
{"i": 157, "op": "add", "dst": 1, "src": 6, "src2": 7, "imm": "0x14878c5a", "imm2": "0x84c2a09d", "rot": 30, "bit": 19, "mask": 8},
{"i": 158, "op": "sub", "dst": 4, "src": 1, "src2": 0, "imm": "0xfe18e4b0", "imm2": "0x239df0cc", "rot": 14, "bit": 20, "mask": 2},
{"i": 159, "op": "mad", "dst": 4, "src": 6, "src2": 7, "imm": "0xbdfcc4e0", "imm2": "0x0870dee8", "rot": 1, "bit": 7, "mask": 8},
{"i": 160, "op": "mul", "dst": 1, "src": 5, "src2": 1, "imm": "0xc837b43d", "imm2": "0x027ac950", "rot": 4, "bit": 22, "mask": 16},
{"i": 161, "op": "or", "dst": 4, "src": 0, "src2": 2, "imm": "0x9c28f8f6", "imm2": "0x3db71fe6", "rot": 11, "bit": 6, "mask": 16},
{"i": 162, "op": "rotl", "dst": 7, "src": 3, "src2": 6, "imm": "0xb6e56f55", "imm2": "0x5fcbd27c", "rot": 21, "bit": 10, "mask": 1},
{"i": 163, "op": "sub", "dst": 0, "src": 1, "src2": 4, "imm": "0x8d95ae70", "imm2": "0xd4f10284", "rot": 15, "bit": 12, "mask": 8},
{"i": 164, "op": "mul", "dst": 1, "src": 0, "src2": 6, "imm": "0xa9bdf99e", "imm2": "0x1f3dceb6", "rot": 21, "bit": 20, "mask": 16},
{"i": 165, "op": "sub", "dst": 2, "src": 1, "src2": 4, "imm": "0xda245058", "imm2": "0x2038e7f6", "rot": 30, "bit": 11, "mask": 2},
{"i": 166, "op": "shfl", "dst": 0, "src": 6, "src2": 3, "imm": "0xbbc8eee8", "imm2": "0xa73472fb", "rot": 23, "bit": 4, "mask": 2},
{"i": 167, "op": "sub", "dst": 0, "src": 4, "src2": 2, "imm": "0x43540d69", "imm2": "0xb3f116ca", "rot": 28, "bit": 2, "mask": 2},
{"i": 168, "op": "rotr", "dst": 1, "src": 6, "src2": 6, "imm": "0x57cea752", "imm2": "0xc1136e71", "rot": 25, "bit": 3, "mask": 8},
{"i": 169, "op": "rotr", "dst": 7, "src": 1, "src2": 5, "imm": "0x4550a465", "imm2": "0x14362935", "rot": 25, "bit": 9, "mask": 16},
{"i": 170, "op": "mad", "dst": 3, "src": 1, "src2": 3, "imm": "0x8c961d80", "imm2": "0x7de2e1db", "rot": 10, "bit": 6, "mask": 4},
{"i": 171, "op": "shfl", "dst": 2, "src": 0, "src2": 0, "imm": "0xda047fca", "imm2": "0x459e17ab", "rot": 22, "bit": 26, "mask": 4},
{"i": 172, "op": "sub", "dst": 2, "src": 1, "src2": 2, "imm": "0xbcc341fd", "imm2": "0x17a3b229", "rot": 8, "bit": 25, "mask": 8},
{"i": 173, "op": "xor", "dst": 7, "src": 6, "src2": 7, "imm": "0x2302b424", "imm2": "0x78780982", "rot": 23, "bit": 7, "mask": 8},
{"i": 174, "op": "rotr", "dst": 4, "src": 1, "src2": 2, "imm": "0xcad6fb5f", "imm2": "0x1807628e", "rot": 8, "bit": 21, "mask": 4},
{"i": 175, "op": "shfl", "dst": 4, "src": 7, "src2": 7, "imm": "0xf5057e8e", "imm2": "0xd14d6cc5", "rot": 3, "bit": 12, "mask": 2},
{"i": 176, "op": "mul", "dst": 6, "src": 2, "src2": 1, "imm": "0xc2926356", "imm2": "0xae74dc32", "rot": 1, "bit": 21, "mask": 8},
{"i": 177, "op": "shfl", "dst": 0, "src": 2, "src2": 7, "imm": "0x8d94d98e", "imm2": "0x7bd6f4dc", "rot": 27, "bit": 14, "mask": 4},
{"i": 178, "op": "add", "dst": 6, "src": 4, "src2": 6, "imm": "0x4fa43965", "imm2": "0x509871e6", "rot": 28, "bit": 21, "mask": 4},
{"i": 179, "op": "xor", "dst": 0, "src": 6, "src2": 6, "imm": "0xe278fe6c", "imm2": "0x75d8a63f", "rot": 21, "bit": 15, "mask": 2},
{"i": 180, "op": "add", "dst": 5, "src": 7, "src2": 7, "imm": "0xfb3c4bd8", "imm2": "0xb95b8a53", "rot": 22, "bit": 0, "mask": 4},
{"i": 181, "op": "mul", "dst": 6, "src": 3, "src2": 2, "imm": "0x5a1347ec", "imm2": "0x3ccc5389", "rot": 27, "bit": 26, "mask": 4},
{"i": 182, "op": "rotl", "dst": 7, "src": 4, "src2": 7, "imm": "0xdc6db2f7", "imm2": "0x7cdff0c6", "rot": 1, "bit": 2, "mask": 4},
{"i": 183, "op": "add", "dst": 0, "src": 7, "src2": 7, "imm": "0xc448a197", "imm2": "0x7047b7cf", "rot": 24, "bit": 11, "mask": 8},
{"i": 184, "op": "mul", "dst": 3, "src": 5, "src2": 0, "imm": "0xa5c0e492", "imm2": "0xaf7d8a86", "rot": 11, "bit": 16, "mask": 8},
{"i": 185, "op": "shfl", "dst": 5, "src": 7, "src2": 1, "imm": "0x5965794b", "imm2": "0x36ddca6b", "rot": 7, "bit": 25, "mask": 1},
{"i": 186, "op": "mul", "dst": 0, "src": 2, "src2": 5, "imm": "0xdfdbcc0f", "imm2": "0xac7b7091", "rot": 11, "bit": 31, "mask": 8},
{"i": 187, "op": "mulhi", "dst": 4, "src": 7, "src2": 5, "imm": "0x3d8999e9", "imm2": "0xf1848db8", "rot": 15, "bit": 21, "mask": 8},
{"i": 188, "op": "mad", "dst": 2, "src": 7, "src2": 2, "imm": "0xda3af48c", "imm2": "0x8e33a97c", "rot": 6, "bit": 30, "mask": 4},
{"i": 189, "op": "sub", "dst": 7, "src": 2, "src2": 4, "imm": "0xa32da8c1", "imm2": "0xf7486d06", "rot": 25, "bit": 16, "mask": 4},
{"i": 190, "op": "add", "dst": 2, "src": 5, "src2": 1, "imm": "0x2fceaf49", "imm2": "0x5caccc5d", "rot": 24, "bit": 19, "mask": 2},
{"i": 191, "op": "shfl", "dst": 1, "src": 2, "src2": 2, "imm": "0x2a71f5e6", "imm2": "0xb9b51e89", "rot": 31, "bit": 25, "mask": 1},
{"i": 192, "op": "add", "dst": 7, "src": 1, "src2": 7, "imm": "0xba0cee62", "imm2": "0x857bb5fe", "rot": 4, "bit": 20, "mask": 2},
{"i": 193, "op": "rotl", "dst": 6, "src": 3, "src2": 3, "imm": "0xc7fe35cf", "imm2": "0x515c1201", "rot": 22, "bit": 7, "mask": 16},
{"i": 194, "op": "xor", "dst": 3, "src": 7, "src2": 4, "imm": "0xe496d1f1", "imm2": "0x11046e3e", "rot": 16, "bit": 9, "mask": 4},
{"i": 195, "op": "mul", "dst": 7, "src": 0, "src2": 2, "imm": "0xc7d5c4c2", "imm2": "0x077e940b", "rot": 23, "bit": 29, "mask": 4},
{"i": 196, "op": "xor", "dst": 3, "src": 5, "src2": 3, "imm": "0xbe6db14a", "imm2": "0xf736da5a", "rot": 19, "bit": 6, "mask": 2},
{"i": 197, "op": "add", "dst": 5, "src": 1, "src2": 5, "imm": "0x8519428c", "imm2": "0xeae84577", "rot": 18, "bit": 29, "mask": 1},
{"i": 198, "op": "mad", "dst": 7, "src": 4, "src2": 4, "imm": "0xb272a029", "imm2": "0x071f6a5c", "rot": 5, "bit": 28, "mask": 8},
{"i": 199, "op": "add", "dst": 3, "src": 6, "src2": 3, "imm": "0x468639d3", "imm2": "0x0bfdbfa1", "rot": 20, "bit": 8, "mask": 16},
{"i": 200, "op": "mad", "dst": 5, "src": 3, "src2": 4, "imm": "0xffba18b7", "imm2": "0xbdcf9e81", "rot": 13, "bit": 31, "mask": 8},
{"i": 201, "op": "shfl", "dst": 2, "src": 7, "src2": 7, "imm": "0xb7533191", "imm2": "0x8d58cc8c", "rot": 7, "bit": 29, "mask": 4},
{"i": 202, "op": "add", "dst": 7, "src": 4, "src2": 6, "imm": "0x18ec9a69", "imm2": "0x53ee8e50", "rot": 12, "bit": 23, "mask": 16},
{"i": 203, "op": "xor", "dst": 6, "src": 0, "src2": 5, "imm": "0x12011ff1", "imm2": "0xfbb57ac6", "rot": 16, "bit": 25, "mask": 16},
{"i": 204, "op": "add", "dst": 4, "src": 5, "src2": 3, "imm": "0x3e81485b", "imm2": "0xac63376e", "rot": 1, "bit": 4, "mask": 1},
{"i": 205, "op": "mad", "dst": 7, "src": 1, "src2": 4, "imm": "0xeb9eee5c", "imm2": "0x3f1daecd", "rot": 19, "bit": 29, "mask": 4},
{"i": 206, "op": "shfl", "dst": 1, "src": 5, "src2": 2, "imm": "0x4fc50d06", "imm2": "0xb5533b31", "rot": 22, "bit": 27, "mask": 16},
{"i": 207, "op": "mul", "dst": 4, "src": 0, "src2": 5, "imm": "0x202d6001", "imm2": "0x50388f85", "rot": 5, "bit": 18, "mask": 16},
{"i": 208, "op": "or", "dst": 1, "src": 6, "src2": 7, "imm": "0x8743c0d4", "imm2": "0x9df69539", "rot": 14, "bit": 16, "mask": 1},
{"i": 209, "op": "add", "dst": 6, "src": 4, "src2": 6, "imm": "0x66ccb75d", "imm2": "0x5b745519", "rot": 28, "bit": 28, "mask": 8},
{"i": 210, "op": "rotr", "dst": 1, "src": 3, "src2": 1, "imm": "0xe9933132", "imm2": "0x6702fe85", "rot": 16, "bit": 19, "mask": 1},
{"i": 211, "op": "sub", "dst": 5, "src": 4, "src2": 4, "imm": "0xfe04b942", "imm2": "0x40dd2ce8", "rot": 24, "bit": 8, "mask": 4},
{"i": 212, "op": "xor", "dst": 4, "src": 7, "src2": 7, "imm": "0x10827878", "imm2": "0xef0de8fc", "rot": 17, "bit": 11, "mask": 8},
{"i": 213, "op": "add", "dst": 1, "src": 7, "src2": 1, "imm": "0x0ce0553d", "imm2": "0x1c3dccf7", "rot": 26, "bit": 8, "mask": 1},
{"i": 214, "op": "mulhi", "dst": 0, "src": 1, "src2": 1, "imm": "0xa71d7581", "imm2": "0xe567c74c", "rot": 2, "bit": 29, "mask": 2},
{"i": 215, "op": "add", "dst": 3, "src": 6, "src2": 2, "imm": "0x96bfec89", "imm2": "0xfadc9205", "rot": 30, "bit": 9, "mask": 16},
{"i": 216, "op": "rotl", "dst": 0, "src": 2, "src2": 5, "imm": "0x947ca474", "imm2": "0xd2a1b650", "rot": 4, "bit": 1, "mask": 1},
{"i": 217, "op": "xor", "dst": 6, "src": 4, "src2": 5, "imm": "0x0b7617de", "imm2": "0xc6c0a9a2", "rot": 31, "bit": 15, "mask": 2},
{"i": 218, "op": "shfl", "dst": 6, "src": 7, "src2": 1, "imm": "0x738f0a8f", "imm2": "0xfc868560", "rot": 2, "bit": 20, "mask": 2},
{"i": 219, "op": "mad", "dst": 7, "src": 0, "src2": 1, "imm": "0x2960f2bc", "imm2": "0x7e9ef9b7", "rot": 21, "bit": 4, "mask": 16},
{"i": 220, "op": "mul", "dst": 4, "src": 0, "src2": 2, "imm": "0x6014d800", "imm2": "0xd19ac7d1", "rot": 1, "bit": 13, "mask": 1},
{"i": 221, "op": "mad", "dst": 2, "src": 6, "src2": 0, "imm": "0x4b558fc2", "imm2": "0x2d48bd3c", "rot": 18, "bit": 31, "mask": 2},
{"i": 222, "op": "xor", "dst": 5, "src": 4, "src2": 6, "imm": "0x0260f3ab", "imm2": "0x8fce22f1", "rot": 21, "bit": 26, "mask": 16},
{"i": 223, "op": "mul", "dst": 0, "src": 5, "src2": 0, "imm": "0xe07ab58f", "imm2": "0x5349a41d", "rot": 20, "bit": 3, "mask": 1},
{"i": 224, "op": "add", "dst": 2, "src": 0, "src2": 5, "imm": "0x61495681", "imm2": "0x66b15c04", "rot": 24, "bit": 9, "mask": 16},
{"i": 225, "op": "rotr", "dst": 3, "src": 2, "src2": 5, "imm": "0x291268bd", "imm2": "0xf046aa79", "rot": 27, "bit": 15, "mask": 4},
{"i": 226, "op": "mad", "dst": 2, "src": 3, "src2": 3, "imm": "0xfd6dfa6c", "imm2": "0x2c0db93d", "rot": 29, "bit": 2, "mask": 16},
{"i": 227, "op": "xor", "dst": 6, "src": 0, "src2": 4, "imm": "0xd4ae1ee2", "imm2": "0xe6a67972", "rot": 26, "bit": 1, "mask": 4},
{"i": 228, "op": "rotl", "dst": 4, "src": 7, "src2": 3, "imm": "0xf6627a9d", "imm2": "0x99078da3", "rot": 30, "bit": 5, "mask": 16},
{"i": 229, "op": "add", "dst": 2, "src": 3, "src2": 7, "imm": "0x70d05c34", "imm2": "0x25bc17c2", "rot": 20, "bit": 29, "mask": 4},
{"i": 230, "op": "rotr", "dst": 1, "src": 5, "src2": 2, "imm": "0xef874bea", "imm2": "0x3bfbfecc", "rot": 17, "bit": 2, "mask": 2},
{"i": 231, "op": "add", "dst": 1, "src": 4, "src2": 5, "imm": "0x32a28384", "imm2": "0x2d8728f3", "rot": 1, "bit": 8, "mask": 8},
{"i": 232, "op": "rotl", "dst": 1, "src": 6, "src2": 3, "imm": "0x877c54ab", "imm2": "0x1d5e5014", "rot": 6, "bit": 24, "mask": 2},
{"i": 233, "op": "add", "dst": 2, "src": 0, "src2": 5, "imm": "0xcf0949f1", "imm2": "0x61e81fe6", "rot": 2, "bit": 21, "mask": 16},
{"i": 234, "op": "rotl", "dst": 4, "src": 5, "src2": 5, "imm": "0x5017c32c", "imm2": "0x1ab34dfe", "rot": 2, "bit": 1, "mask": 2},
{"i": 235, "op": "sub", "dst": 2, "src": 6, "src2": 2, "imm": "0xadbdb811", "imm2": "0x2c2d4f2b", "rot": 30, "bit": 29, "mask": 8},
{"i": 236, "op": "or", "dst": 6, "src": 3, "src2": 4, "imm": "0x700e204f", "imm2": "0x27294e7b", "rot": 13, "bit": 0, "mask": 4},
{"i": 237, "op": "shfl", "dst": 7, "src": 5, "src2": 4, "imm": "0xc39f71ba", "imm2": "0x9a90263d", "rot": 28, "bit": 9, "mask": 4},
{"i": 238, "op": "xor", "dst": 1, "src": 3, "src2": 6, "imm": "0x9f84a5b3", "imm2": "0x95691d15", "rot": 14, "bit": 22, "mask": 1},
{"i": 239, "op": "rotl", "dst": 2, "src": 4, "src2": 0, "imm": "0xa3b79ed5", "imm2": "0x05f568bc", "rot": 1, "bit": 15, "mask": 4},
{"i": 240, "op": "rotr", "dst": 5, "src": 2, "src2": 7, "imm": "0xaaabbb0d", "imm2": "0x71ce4cd6", "rot": 2, "bit": 26, "mask": 4},
{"i": 241, "op": "rotl", "dst": 4, "src": 1, "src2": 7, "imm": "0x8146fbd3", "imm2": "0xde65fc31", "rot": 10, "bit": 9, "mask": 4},
{"i": 242, "op": "add", "dst": 6, "src": 2, "src2": 7, "imm": "0xe204fb50", "imm2": "0x0a67565d", "rot": 5, "bit": 16, "mask": 1},
{"i": 243, "op": "shfl", "dst": 1, "src": 3, "src2": 7, "imm": "0xcb7a3c1b", "imm2": "0x863f002c", "rot": 18, "bit": 1, "mask": 2},
{"i": 244, "op": "shfl", "dst": 0, "src": 1, "src2": 3, "imm": "0x92eb030c", "imm2": "0x3cff4c6d", "rot": 1, "bit": 22, "mask": 16},
{"i": 245, "op": "shfl", "dst": 5, "src": 7, "src2": 6, "imm": "0x046c969c", "imm2": "0xd21d7e76", "rot": 5, "bit": 31, "mask": 2},
{"i": 246, "op": "xor", "dst": 4, "src": 5, "src2": 1, "imm": "0x2e3015f0", "imm2": "0x1b305a5c", "rot": 22, "bit": 16, "mask": 8},
{"i": 247, "op": "xor", "dst": 7, "src": 2, "src2": 0, "imm": "0x8238cf71", "imm2": "0xb7874d94", "rot": 9, "bit": 1, "mask": 2},
{"i": 248, "op": "shfl", "dst": 0, "src": 6, "src2": 7, "imm": "0x437cbc99", "imm2": "0x7fb41fed", "rot": 17, "bit": 1, "mask": 16},
{"i": 249, "op": "mulhi", "dst": 1, "src": 3, "src2": 2, "imm": "0xeb293d88", "imm2": "0xb92f5968", "rot": 3, "bit": 20, "mask": 2},
{"i": 250, "op": "add", "dst": 7, "src": 5, "src2": 3, "imm": "0x3d6daffd", "imm2": "0x5a79fd6f", "rot": 6, "bit": 31, "mask": 2},
{"i": 251, "op": "add", "dst": 6, "src": 0, "src2": 3, "imm": "0x84334aea", "imm2": "0x6beb28c2", "rot": 27, "bit": 28, "mask": 2},
{"i": 252, "op": "sub", "dst": 7, "src": 1, "src2": 6, "imm": "0xe6177638", "imm2": "0x814d3fc5", "rot": 25, "bit": 2, "mask": 2},
{"i": 253, "op": "rotr", "dst": 5, "src": 2, "src2": 7, "imm": "0x95560bac", "imm2": "0xbf8b01a9", "rot": 14, "bit": 5, "mask": 16},
{"i": 254, "op": "mulhi", "dst": 2, "src": 5, "src2": 1, "imm": "0x318956e5", "imm2": "0x7c20b373", "rot": 13, "bit": 30, "mask": 2},
{"i": 255, "op": "mul", "dst": 6, "src": 3, "src2": 3, "imm": "0xe1998e49", "imm2": "0x59353e5a", "rot": 15, "bit": 2, "mask": 4}
]},
"instructions": [
{"i": 0, "op": "sub", "dst": 6, "src": 3, "src2": 3, "imm": "0x77dfbe60", "imm2": "0x404c8b9c", "rot": 24, "bit": 8, "mask": 2, "width": 1, "win": 0, "off": 0},
{"i": 1, "op": "or", "dst": 2, "src": 6, "src2": 7, "imm": "0xb2e79058", "imm2": "0xc2485073", "rot": 21, "bit": 23, "mask": 8, "width": 1, "win": 0, "off": 0},
{"i": 2, "op": "add", "dst": 4, "src": 0, "src2": 6, "imm": "0x1a579b38", "imm2": "0x7731324b", "rot": 6, "bit": 4, "mask": 2, "width": 1, "win": 0, "off": 0},
{"i": 3, "op": "load", "dst": 3, "src": 6, "src2": 0, "imm": "0x683f5bc5", "imm2": "0xc8a218fe", "rot": 25, "bit": 4, "mask": 1, "width": 1, "win": 0, "off": 0},
{"i": 4, "op": "shfl", "dst": 0, "src": 6, "src2": 4, "imm": "0x4d7cdcbb", "imm2": "0x1a5bf1a4", "rot": 8, "bit": 28, "mask": 1, "width": 1, "win": 0, "off": 0},
{"i": 5, "op": "xor", "dst": 4, "src": 1, "src2": 0, "imm": "0xa2b86827", "imm2": "0x94a44439", "rot": 21, "bit": 22, "mask": 2, "width": 1, "win": 0, "off": 0},
{"i": 6, "op": "mad", "dst": 3, "src": 5, "src2": 3, "imm": "0x58a4ea3f", "imm2": "0x467879fa", "rot": 6, "bit": 31, "mask": 8, "width": 1, "win": 0, "off": 0},
{"i": 7, "op": "mul", "dst": 1, "src": 6, "src2": 1, "imm": "0x31fcc19c", "imm2": "0x176cb88f", "rot": 1, "bit": 11, "mask": 1, "width": 1, "win": 0, "off": 0},
{"i": 8, "op": "load", "dst": 2, "src": 0, "src2": 3, "imm": "0x89b12386", "imm2": "0x661ed5e5", "rot": 11, "bit": 13, "mask": 2, "width": 1, "win": 2, "off": 2},
{"i": 9, "op": "xor", "dst": 0, "src": 4, "src2": 1, "imm": "0x69150105", "imm2": "0x8e1f04b9", "rot": 3, "bit": 30, "mask": 2, "width": 1, "win": 0, "off": 0},
{"i": 10, "op": "add", "dst": 0, "src": 7, "src2": 5, "imm": "0xee083919", "imm2": "0xb10fcef8", "rot": 9, "bit": 30, "mask": 16, "width": 1, "win": 0, "off": 0},
{"i": 11, "op": "mulhi", "dst": 0, "src": 2, "src2": 3, "imm": "0x99ac7c83", "imm2": "0x34eb2845", "rot": 18, "bit": 12, "mask": 16, "width": 1, "win": 0, "off": 0},
{"i": 12, "op": "xor", "dst": 5, "src": 4, "src2": 0, "imm": "0x97cfc887", "imm2": "0x0458f053", "rot": 28, "bit": 24, "mask": 2, "width": 1, "win": 0, "off": 0},
{"i": 13, "op": "mad", "dst": 7, "src": 3, "src2": 0, "imm": "0x503e87b4", "imm2": "0x2c5d2617", "rot": 3, "bit": 15, "mask": 1, "width": 1, "win": 0, "off": 0},
{"i": 14, "op": "load", "dst": 3, "src": 4, "src2": 4, "imm": "0xfae98035", "imm2": "0x6c127281", "rot": 19, "bit": 29, "mask": 4, "width": 1, "win": 1, "off": 0},
{"i": 15, "op": "load", "dst": 2, "src": 5, "src2": 2, "imm": "0x67601ed5", "imm2": "0x3c546ed1", "rot": 28, "bit": 28, "mask": 4, "width": 1, "win": 0, "off": 0},
{"i": 16, "op": "shfl", "dst": 7, "src": 5, "src2": 6, "imm": "0x7789be79", "imm2": "0x87496b8e", "rot": 22, "bit": 2, "mask": 16, "width": 1, "win": 0, "off": 0},
{"i": 17, "op": "mul", "dst": 7, "src": 6, "src2": 2, "imm": "0x559099bb", "imm2": "0x6a72e1a6", "rot": 1, "bit": 11, "mask": 16, "width": 1, "win": 0, "off": 0},
{"i": 18, "op": "mad", "dst": 2, "src": 3, "src2": 1, "imm": "0x4f5bae5e", "imm2": "0x4c8c5762", "rot": 27, "bit": 31, "mask": 4, "width": 1, "win": 0, "off": 0},
{"i": 19, "op": "rotr", "dst": 5, "src": 2, "src2": 4, "imm": "0x5dc5e6bf", "imm2": "0x36bc207d", "rot": 9, "bit": 4, "mask": 2, "width": 1, "win": 0, "off": 0},
{"i": 20, "op": "load", "dst": 5, "src": 3, "src2": 7, "imm": "0x4a278885", "imm2": "0xcd1044b0", "rot": 30, "bit": 0, "mask": 4, "width": 1, "win": 1, "off": 1},
{"i": 21, "op": "shfl", "dst": 6, "src": 4, "src2": 3, "imm": "0x48b94ffc", "imm2": "0xd8e14d80", "rot": 2, "bit": 31, "mask": 16, "width": 1, "win": 0, "off": 0},
{"i": 22, "op": "mulhi", "dst": 1, "src": 2, "src2": 7, "imm": "0x47bd8492", "imm2": "0x28fa8d0b", "rot": 19, "bit": 26, "mask": 4, "width": 1, "win": 0, "off": 0},
{"i": 23, "op": "xor", "dst": 6, "src": 5, "src2": 1, "imm": "0x4ed6baf4", "imm2": "0xa8c31f74", "rot": 30, "bit": 2, "mask": 2, "width": 1, "win": 0, "off": 0},
{"i": 24, "op": "mad", "dst": 5, "src": 2, "src2": 0, "imm": "0x6174747d", "imm2": "0xfc912524", "rot": 18, "bit": 29, "mask": 2, "width": 1, "win": 0, "off": 0},
{"i": 25, "op": "mad", "dst": 6, "src": 3, "src2": 7, "imm": "0x113a6442", "imm2": "0xbe52ec57", "rot": 15, "bit": 15, "mask": 1, "width": 1, "win": 0, "off": 0},
{"i": 26, "op": "load", "dst": 6, "src": 5, "src2": 1, "imm": "0x9d3eb1cc", "imm2": "0x375c73bb", "rot": 29, "bit": 7, "mask": 8, "width": 1, "win": 1, "off": 1},
{"i": 27, "op": "mad", "dst": 1, "src": 5, "src2": 5, "imm": "0x150088c3", "imm2": "0x7f17e789", "rot": 8, "bit": 25, "mask": 8, "width": 1, "win": 0, "off": 0},
{"i": 28, "op": "load", "dst": 0, "src": 6, "src2": 3, "imm": "0x4b412223", "imm2": "0x9192ceeb", "rot": 16, "bit": 28, "mask": 1, "width": 1, "win": 1, "off": 1},
{"i": 29, "op": "add", "dst": 7, "src": 4, "src2": 6, "imm": "0xd5e6c37c", "imm2": "0x0b1f02c7", "rot": 2, "bit": 7, "mask": 8, "width": 1, "win": 0, "off": 0},
{"i": 30, "op": "add", "dst": 7, "src": 0, "src2": 6, "imm": "0x4e45ba51", "imm2": "0x2d6e8bd1", "rot": 7, "bit": 0, "mask": 8, "width": 1, "win": 0, "off": 0},
{"i": 31, "op": "xor", "dst": 0, "src": 2, "src2": 7, "imm": "0xef601d89", "imm2": "0x805402db", "rot": 7, "bit": 28, "mask": 2, "width": 1, "win": 0, "off": 0},
{"i": 32, "op": "add", "dst": 6, "src": 2, "src2": 3, "imm": "0x1c91b2a1", "imm2": "0x351422d2", "rot": 1, "bit": 13, "mask": 2, "width": 1, "win": 0, "off": 0},
{"i": 33, "op": "mulhi", "dst": 4, "src": 5, "src2": 7, "imm": "0x7cf21567", "imm2": "0x1075ee0d", "rot": 26, "bit": 17, "mask": 16, "width": 1, "win": 0, "off": 0},
{"i": 34, "op": "rotr", "dst": 3, "src": 5, "src2": 6, "imm": "0x60d8f191", "imm2": "0x40523707", "rot": 3, "bit": 10, "mask": 4, "width": 1, "win": 0, "off": 0},
{"i": 35, "op": "load", "dst": 3, "src": 0, "src2": 5, "imm": "0xb1dc3f6e", "imm2": "0x74440531", "rot": 21, "bit": 10, "mask": 1, "width": 1, "win": 0, "off": 0},
{"i": 36, "op": "rotl", "dst": 4, "src": 6, "src2": 4, "imm": "0xf0d17569", "imm2": "0xd281fd01", "rot": 13, "bit": 4, "mask": 8, "width": 1, "win": 0, "off": 0},
{"i": 37, "op": "add", "dst": 6, "src": 1, "src2": 6, "imm": "0x3f2970f7", "imm2": "0x64a28251", "rot": 4, "bit": 7, "mask": 8, "width": 1, "win": 0, "off": 0},
{"i": 38, "op": "mul", "dst": 2, "src": 0, "src2": 3, "imm": "0x6463770c", "imm2": "0xb85d603f", "rot": 27, "bit": 1, "mask": 1, "width": 1, "win": 0, "off": 0},
{"i": 39, "op": "add", "dst": 3, "src": 4, "src2": 3, "imm": "0x3b7b3317", "imm2": "0x7378c955", "rot": 28, "bit": 15, "mask": 2, "width": 1, "win": 0, "off": 0},
{"i": 40, "op": "load", "dst": 0, "src": 7, "src2": 3, "imm": "0xd0fb5982", "imm2": "0x2e4d31a8", "rot": 25, "bit": 27, "mask": 4, "width": 1, "win": 2, "off": 3},
{"i": 41, "op": "xor", "dst": 6, "src": 5, "src2": 0, "imm": "0xe96a9e6e", "imm2": "0x8d73cc3e", "rot": 17, "bit": 11, "mask": 16, "width": 1, "win": 0, "off": 0},
{"i": 42, "op": "add", "dst": 3, "src": 0, "src2": 6, "imm": "0x6678b059", "imm2": "0xb31f6a64", "rot": 11, "bit": 2, "mask": 2, "width": 1, "win": 0, "off": 0},
{"i": 43, "op": "load", "dst": 7, "src": 3, "src2": 2, "imm": "0x65a841c5", "imm2": "0x6aae1403", "rot": 9, "bit": 9, "mask": 1, "width": 1, "win": 1, "off": 0},
{"i": 44, "op": "shfl", "dst": 3, "src": 7, "src2": 6, "imm": "0x650ba38d", "imm2": "0x07218508", "rot": 12, "bit": 13, "mask": 4, "width": 1, "win": 0, "off": 0},
{"i": 45, "op": "mulhi", "dst": 1, "src": 5, "src2": 7, "imm": "0x18736788", "imm2": "0x9f820eed", "rot": 13, "bit": 29, "mask": 1, "width": 1, "win": 0, "off": 0},
{"i": 46, "op": "rotl", "dst": 0, "src": 1, "src2": 5, "imm": "0x48deba75", "imm2": "0xefc508fa", "rot": 6, "bit": 6, "mask": 2, "width": 1, "win": 0, "off": 0},
{"i": 47, "op": "load", "dst": 1, "src": 7, "src2": 4, "imm": "0x28a04384", "imm2": "0xc67cb0ac", "rot": 5, "bit": 5, "mask": 2, "width": 1, "win": 1, "off": 1},
{"i": 48, "op": "add", "dst": 4, "src": 0, "src2": 5, "imm": "0x43095946", "imm2": "0x5feccee6", "rot": 22, "bit": 17, "mask": 1, "width": 1, "win": 0, "off": 0},
{"i": 49, "op": "load", "dst": 2, "src": 0, "src2": 2, "imm": "0x3e78cdd8", "imm2": "0x7c170311", "rot": 10, "bit": 5, "mask": 16, "width": 1, "win": 0, "off": 0},
{"i": 50, "op": "sub", "dst": 2, "src": 3, "src2": 7, "imm": "0xaff0cdb2", "imm2": "0xde0b7ee0", "rot": 21, "bit": 11, "mask": 8, "width": 1, "win": 0, "off": 0},
{"i": 51, "op": "add", "dst": 7, "src": 2, "src2": 1, "imm": "0xf45ecdf8", "imm2": "0x26e2b582", "rot": 28, "bit": 24, "mask": 4, "width": 1, "win": 0, "off": 0},
{"i": 52, "op": "load", "dst": 5, "src": 7, "src2": 7, "imm": "0x67353e69", "imm2": "0xb2d56082", "rot": 27, "bit": 14, "mask": 2, "width": 1, "win": 2, "off": 3},
{"i": 53, "op": "load", "dst": 6, "src": 3, "src2": 1, "imm": "0x5a58c787", "imm2": "0x53a0467b", "rot": 6, "bit": 16, "mask": 16, "width": 1, "win": 0, "off": 0},
{"i": 54, "op": "shfl", "dst": 7, "src": 5, "src2": 4, "imm": "0x3c237ad5", "imm2": "0xf2681187", "rot": 14, "bit": 26, "mask": 4, "width": 1, "win": 0, "off": 0},
{"i": 55, "op": "rotr", "dst": 1, "src": 2, "src2": 3, "imm": "0x1c25c077", "imm2": "0x125de1ff", "rot": 13, "bit": 13, "mask": 2, "width": 1, "win": 0, "off": 0},
{"i": 56, "op": "shfl", "dst": 0, "src": 5, "src2": 0, "imm": "0x6465afe2", "imm2": "0x23b41d56", "rot": 31, "bit": 28, "mask": 16, "width": 1, "win": 0, "off": 0},
{"i": 57, "op": "rotl", "dst": 5, "src": 0, "src2": 2, "imm": "0xa427ff6e", "imm2": "0x014a0deb", "rot": 12, "bit": 28, "mask": 8, "width": 1, "win": 0, "off": 0},
{"i": 58, "op": "add", "dst": 5, "src": 3, "src2": 7, "imm": "0x6b4f35e8", "imm2": "0x473b1718", "rot": 25, "bit": 4, "mask": 8, "width": 1, "win": 0, "off": 0},
{"i": 59, "op": "rotr", "dst": 4, "src": 1, "src2": 3, "imm": "0x66cc96ef", "imm2": "0xcb8c8e56", "rot": 7, "bit": 6, "mask": 4, "width": 1, "win": 0, "off": 0},
{"i": 60, "op": "shfl", "dst": 4, "src": 5, "src2": 5, "imm": "0x461bbf9f", "imm2": "0xc1ffd350", "rot": 19, "bit": 2, "mask": 1, "width": 1, "win": 0, "off": 0},
{"i": 61, "op": "load", "dst": 7, "src": 0, "src2": 1, "imm": "0x4d893571", "imm2": "0x5583e644", "rot": 19, "bit": 19, "mask": 8, "width": 1, "win": 1, "off": 1},
{"i": 62, "op": "load", "dst": 5, "src": 7, "src2": 3, "imm": "0x7a9049b4", "imm2": "0xbb7ebdf8", "rot": 15, "bit": 11, "mask": 8, "width": 1, "win": 1, "off": 1},
{"i": 63, "op": "mul", "dst": 4, "src": 1, "src2": 7, "imm": "0xe7ae8a83", "imm2": "0x1ded64e8", "rot": 21, "bit": 1, "mask": 8, "width": 1, "win": 0, "off": 0}
]
}

File diff suppressed because it is too large Load diff

14
tools/attack/adv-accept/Cargo.lock generated Normal file
View file

@ -0,0 +1,14 @@
# This file is automatically @generated by Cargo.
# It is not intended for manual editing.
version = 4
[[package]]
name = "adv-accept"
version = "0.1.0"
dependencies = [
"igneum-pow",
]
[[package]]
name = "igneum-pow"
version = "0.2.0"

View file

@ -0,0 +1,25 @@
[package]
name = "adv-accept"
version = "0.1.0"
edition = "2021"
description = "Internal adversarial pass on the program acceptance rule and its generator (class v4 sub-version 3, frozen commit 017e7037): draw-path check, accepted-program sweep, closed-form distinct and per-site ratio, with plant hooks"
license = "MIT"
publish = false
[[bin]]
name = "adv-accept"
path = "src/main.rs"
[dependencies]
igneum-pow = { path = "../../../igneum-pow" }
[workspace]
[profile.release]
opt-level = 3
lto = true
codegen-units = 1
[[bin]]
name = "adv-live"
path = "src/live.rs"

View file

@ -0,0 +1,406 @@
{
"format": "igneum-program-pack-3",
"generator": 4,
"attempt": 0,
"program_id": "0xfce15bf61030be57",
"program_id_derivation": "FNV-1a 64 over 'igneum-program/' || generator_le32 || seed_words as little-endian bytes || attempt_le32",
"dataset_mode": "memory-hard",
"seed": "igneum-epoch/4020cb4382e3fe4b281c817c02582e147d8f851f566ae9172b28912b8e68b925/day/69676e65756d2d6461792ffd50000000000000",
"seed_bytes": "4020cb4382e3fe4b281c817c02582e147d8f851f566ae9172b28912b8e68b925",
"seed_words": ["0xbe8c5a0c", "0x7646e626", "0x508e29d0", "0xfb8a5b4a", "0x53c50955", "0x685d62fc", "0x6065c013", "0x881096eb"],
"seed_derivation": "seed_words = FNV-1a 64 over seed_bytes (attempt 0) or seed_bytes || attempt_le32 (attempt k >= 1), basis ^ (salt * 0x9E3779B97F4A7C15) for salt 0..3, then h ^= h>>33; h *= 0xff51afd7ed558ccd; h ^= h>>33; words[2*salt] = low 32, words[2*salt+1] = high 32",
"generator_rule": "version 2: exactly 16 load slots drawn first from instructions 1..63 (partial Fisher-Yates), the other 48 ops from the ten non-load weights (sum 75); a load's source is drawn from the registers other than dst written by an earlier instruction and not read by a load since; the candidate must pass the acceptance rule of spec 01 section 1.4.6 (static: no cyclically stale load source, every register has an injecting write; dynamic: 64 units on the seed-keyed closed-form dataset with no constant register bit, no lane-constant load site, under 164 saturated final values, every output bit within 136 of 1024, distinct addresses above 245760), else the next attempt of the seed is tried",
"lanes": 32,
"registers": 8,
"iterations": 8,
"instruction_count": 64,
"loads_per_hash": 128,
"program_class": "v4",
"sub_version": 3,
"era_seed_bytes": "4020cb4382e3fe4b281c817c02582e147d8f851f566ae9172b28912b8e68b925",
"load_class": "mx8-eraaf3a9139+sh256x27",
"mixer_mult": 8,
"cache_growth": true,
"mixer": "class v3 (Counter ASIC 2.0, 5 October 2026, docs/plans/mixer-x4.md): every mixer application of the item derivation is 8 applications with round keys (r * 8 + j + 1) * 0x9E3779B9, the 8 dependent cache reads per item unchanged; cache growth rule option C: cache words = 2^(26 + doublings(day)), dataset words = 2^(genesis_log2 + doublings(day)), doublings(day) = floor(log2(1 + day / 1460)) for day = days since genesis",
"load_slots": 16,
"load_mix_percent_4_16_64": [100, 0, 0],
"load_width_counts_4_16_64": [16, 0, 0],
"bytes_per_hash": 512,
"wide_load": "read-width experiment (5 October 2026, docs/plans/read-width.md), NOT the lottery hash: a load of W words (width field, 4 or 16) reads dataset[b .. b + W) with b = (src & mask) & ~(W - 1) and folds every word into dst: x = dst ^ w[0]; for j in 1..W: x = (rotl(x, 11) * 0x9e3779b1) ^ w[j]; dst = x; width 1 is the plain load; the width is drawn per instruction from the class mix with one extra below(100) draw after the nine of version 2, and the program id is FNV-1a 64 over 'igneum-program-rw/' || generator_le32 || seed words || attempt_le32 || mix[3] || load_slots",
"era": {
"label": "af3a9139",
"seed_words": ["0xaf3a9139", "0x894db311", "0xd6173573", "0xc346bc0f", "0x2d547cec", "0xd5634ab8", "0xb9584827", "0x305d030e"],
"draw": "docs/plans/era-layout.md 1.1: SplitMix64 seeded with seed_words[0] | seed_words[1] << 32 of seed_words_from_bytes('igneum-era/' || n_le64 || E_n); width = allowed[below(|allowed|)], stride_mul = low32(next()) | 1, stride_rot = 1 + below(31), then four next() draws for a partial Fisher-Yates over positions log2(W)..15 of which 4 - log2(W) are used",
"allowed_widths": [1],
"width_words": 1,
"stride_mul": "0x2cb18b35",
"stride_rot": 9,
"interleave": [1, 9, 13, 14],
"address": "y = rotl(src * stride_mul, stride_rot); k = min(win, D - 26); idx = ((y & (mask >> k)) | ((off & (2^k - 1)) << (D - k))) & mask; a wide load aligns idx down to W words",
"windows": "per instruction, after the width roll: win = below(3), off = low32(next()) & (2^win - 1); used on a load slot (the instruction's win and off fields)",
"dataset_word": "dataset[w] = item(t(w))[j(w)]: j(w) gathers the bits of w at the interleave positions, t(w) is w with those bits removed",
"program_id_suffix": "'era/' || allowed[3] || width_words || stride_mul_le32 || stride_rot_le32 || interleave[4]"
},
"op_mix": {"load": 16, "add": 11, "shfl": 7, "mad": 6, "xor": 6, "mul": 4, "mulhi": 4, "rotr": 4, "rotl": 3, "sub": 2, "or": 1},
"register_init": "for i in 0..7: x = nonce ^ seed_words[i]; x += 0x9e3779b9 * (i+1) (mod 2^32); x = splitmix32(x); r[i] = x ^ seed_words[(i+1) & 7]",
"splitmix32": "x ^= x>>16; x *= 0x7feb352d; x ^= x>>15; x *= 0x846ca68b; x ^= x>>16",
"iteration": "sel = r0 sampled once at the top of each iteration, then all instructions in order",
"output": "lo = r0 ^ rotl(r1,7) ^ rotl(r2,14) ^ rotl(r3,21); hi = r4 ^ rotl(r5,9) ^ rotl(r6,18) ^ rotl(r7,27); out = (hi << 32) | lo",
"op_semantics": {
"add": "dst = dst + src + (bit `bit` of sel ? imm2 : imm)",
"sub": "dst = dst - src",
"mul": "dst = dst * src (low 32)",
"mulhi": "dst = high 32 bits of dst * src",
"xor": "dst = dst ^ src",
"or": "dst = dst | src",
"rotl": "dst = rotl(dst, rot), rot in 1..31",
"rotr": "dst = rotr(dst, src & 31)",
"mad": "dst = src * src2 + dst",
"shfl": "dst = dst ^ (src of lane (lane ^ mask)), mask in {1,2,4,8,16}, within the 32-lane warp",
"load": "dst = dst ^ dataset[src & dataset.mask]",
"wload": "base = (src of lane 0 & dataset.mask) & ~31; dst = dst ^ dataset[base + lane] (warp-coalesced 128-byte load, lever b, only when --wide-frac > 0)"
},
"dataset": {
"log2_words": 28,
"bytes": 1073741824,
"mask": "0x0fffffff",
"day": "bytes:69676e65756d2d6461792ffd50000000000000",
"day_bytes": "69676e65756d2d6461792ffd50000000000000",
"day_words_from": "seed_words_from_bytes(day_bytes)",
"d0": "0xe23f9008",
"d1": "0xde33e763",
"mode": "memory-hard",
"spec": "proto-metal/MEMHARD.md",
"key": ["0xe23f9008", "0xde33e763", "0xc5ba415d", "0x8ddf6786", "0x59f4a4be", "0x8a3bc680", "0x701b8e40", "0x3b59025a"],
"key_derivation": "the 8 words of seed_words_from_bytes(day_bytes); d0, d1 are key[0], key[1]",
"cache": {"log2_words": 26, "bytes": 268435456, "line_words": 16, "segment_lines": 64, "segments": 65536, "block": "ChaCha12 core + feed-forward, rotations 16 12 8 7", "sigma": ["0x61707865", "0x3320646e", "0x79622d32", "0x6b206574"], "tag": ["0x49676e65", "0x756d4d48"], "chain": "in_j = prev_line ^ (sigma[0..3] || key[0..7] || seg || j || tag[0..1]); line_j = block(in_j); prev_0 = 0"},
"mixer": {"draw": "SplitMix64 seeded with key[0] | key[1] << 32: rot[0..7] = 1 + next() % 31, mul[0..15] = low32(next()) | 1, rc[0..15] = low32(next())", "rot": [28, 11, 18, 18, 13, 28, 5, 13], "mul": ["0xd1d79e7f", "0xbcb61f8b", "0x970e91ab", "0xd749d96d", "0x143d7339", "0x2cde0d69", "0x12d0a8c1", "0x2d335be9", "0x80a8aae9", "0x7ac896c7", "0x9de23db7", "0xc362827d", "0x5f4cdb5b", "0xfc6c5097", "0x6f547f83", "0x1ac31b47"], "rc": ["0xe5bef5a3", "0xdb2a7d90", "0xcd1fa7e1", "0x30289419", "0x0a730d58", "0x432f8579", "0x6ab978a5", "0x8c984f49", "0x788c3c9e", "0x051eef02", "0x05e77db9", "0x8b3cd4f3", "0x6948d6cf", "0x0d8677f6", "0xf9505c8c", "0x4513c163"], "round": "for i in 0..15: s[i] = (s[i] ^ (rc[i] + (r+1) * 0x9E3779B9)) * mul[i]; then quarter rounds on columns (0,4,8,12) (1,5,9,13) (2,6,10,14) (3,7,11,15) with rot[0..3] and diagonals (0,5,10,15) (1,6,11,12) (2,7,8,13) (3,4,9,14) with rot[4..7]", "quarter_round": "a += b; d ^= a; d = rotl(d, r1); c += d; b ^= c; b = rotl(b, r2); a += b; d ^= a; d = rotl(d, r3); c += d; b ^= c; b = rotl(b, r4)"},
"mixer_mult": 8,
"item": "s[0..7] = key; s[8+i] = t * mul[i] + rc[i] for i in 0..7; for r in 0..7: for j in 0..7: s = M(s, rk = (r * 8 + j + 1) * 0x9E3779B9); line = s[0] & 0x003fffff; s[i] ^= cache[line * 16 + i]; then for j in 0..7: s = M(s, rk = (64 + j + 1) * 0x9E3779B9); item(t) = s",
"word": "dataset[w] = item(w >> 4)[w & 15]"
},
"shadow": {"instrs": 256, "reps": 27, "instrs_per_hash": 55296, "op_mix": {"add": 45, "mad": 31, "shfl": 31, "xor": 30, "rotl": 28, "mul": 22, "or": 18, "mulhi": 17, "rotr": 17, "sub": 17}, "rule": "Counter ASIC 3.0 item 8 (docs/analysis/latency-shadow-2026-10-06.md): after the 64 base instructions the program stream draws instrs more ALU instructions (the non-load table, nine draws each, the source as on an ALU slot); the block runs reps times at the end of every iteration with the iteration's sel; the acceptance rule interprets the base program only", "program_id_suffix": "'shadow/' || instrs_le16 || reps_le16", "instructions": [
{"i": 0, "op": "or", "dst": 6, "src": 0, "src2": 2, "imm": "0xc1eb1523", "imm2": "0x925958ea", "rot": 14, "bit": 14, "mask": 8},
{"i": 1, "op": "mul", "dst": 7, "src": 3, "src2": 4, "imm": "0xc7044334", "imm2": "0x755566b6", "rot": 19, "bit": 17, "mask": 8},
{"i": 2, "op": "mad", "dst": 3, "src": 5, "src2": 5, "imm": "0x33b52f17", "imm2": "0xcc459a7a", "rot": 5, "bit": 19, "mask": 16},
{"i": 3, "op": "add", "dst": 7, "src": 4, "src2": 4, "imm": "0x97d3d105", "imm2": "0x38e58a06", "rot": 11, "bit": 6, "mask": 1},
{"i": 4, "op": "add", "dst": 6, "src": 0, "src2": 6, "imm": "0x29b87b9a", "imm2": "0x9629673d", "rot": 16, "bit": 20, "mask": 8},
{"i": 5, "op": "shfl", "dst": 6, "src": 2, "src2": 5, "imm": "0xb61f2e77", "imm2": "0x30e3807c", "rot": 1, "bit": 7, "mask": 1},
{"i": 6, "op": "mad", "dst": 5, "src": 3, "src2": 5, "imm": "0x0de66253", "imm2": "0xfdfdd03e", "rot": 4, "bit": 27, "mask": 4},
{"i": 7, "op": "rotl", "dst": 3, "src": 7, "src2": 1, "imm": "0x688514dd", "imm2": "0x139d08b5", "rot": 5, "bit": 1, "mask": 1},
{"i": 8, "op": "add", "dst": 0, "src": 7, "src2": 3, "imm": "0xa7c1fb0f", "imm2": "0x4a5f55e1", "rot": 15, "bit": 12, "mask": 1},
{"i": 9, "op": "mul", "dst": 5, "src": 7, "src2": 2, "imm": "0x1a64de5a", "imm2": "0xe37b0875", "rot": 5, "bit": 27, "mask": 16},
{"i": 10, "op": "xor", "dst": 4, "src": 5, "src2": 3, "imm": "0x750d4f1a", "imm2": "0x2f3d9402", "rot": 3, "bit": 14, "mask": 2},
{"i": 11, "op": "mulhi", "dst": 6, "src": 4, "src2": 5, "imm": "0x2eaa86c6", "imm2": "0x9fd5b22f", "rot": 30, "bit": 10, "mask": 1},
{"i": 12, "op": "rotl", "dst": 5, "src": 2, "src2": 4, "imm": "0x8df50473", "imm2": "0x23d780ce", "rot": 13, "bit": 9, "mask": 1},
{"i": 13, "op": "mad", "dst": 0, "src": 2, "src2": 1, "imm": "0xa956a7e6", "imm2": "0x58dbb356", "rot": 31, "bit": 11, "mask": 8},
{"i": 14, "op": "mulhi", "dst": 2, "src": 4, "src2": 6, "imm": "0x6fbfb145", "imm2": "0x064eb015", "rot": 20, "bit": 2, "mask": 4},
{"i": 15, "op": "or", "dst": 3, "src": 1, "src2": 5, "imm": "0xd313bc27", "imm2": "0x9f0fc235", "rot": 17, "bit": 16, "mask": 1},
{"i": 16, "op": "sub", "dst": 0, "src": 5, "src2": 0, "imm": "0x86cbd336", "imm2": "0x94715167", "rot": 17, "bit": 31, "mask": 8},
{"i": 17, "op": "mul", "dst": 0, "src": 6, "src2": 3, "imm": "0x95911c6b", "imm2": "0x816cea32", "rot": 23, "bit": 1, "mask": 2},
{"i": 18, "op": "shfl", "dst": 5, "src": 1, "src2": 3, "imm": "0xf563dcad", "imm2": "0xb2889856", "rot": 14, "bit": 24, "mask": 4},
{"i": 19, "op": "or", "dst": 3, "src": 4, "src2": 2, "imm": "0x7bb48d19", "imm2": "0xbf95ad6f", "rot": 8, "bit": 30, "mask": 16},
{"i": 20, "op": "mad", "dst": 6, "src": 3, "src2": 2, "imm": "0xeb686a8d", "imm2": "0x8bda9f8a", "rot": 11, "bit": 18, "mask": 1},
{"i": 21, "op": "rotl", "dst": 0, "src": 6, "src2": 0, "imm": "0x0915df51", "imm2": "0xa1365cda", "rot": 11, "bit": 25, "mask": 1},
{"i": 22, "op": "rotl", "dst": 3, "src": 0, "src2": 3, "imm": "0xc09e4cdc", "imm2": "0x50c1369d", "rot": 25, "bit": 31, "mask": 2},
{"i": 23, "op": "xor", "dst": 6, "src": 4, "src2": 1, "imm": "0xce01abec", "imm2": "0x5ff8c52e", "rot": 30, "bit": 19, "mask": 8},
{"i": 24, "op": "or", "dst": 4, "src": 2, "src2": 4, "imm": "0xdacf9e4b", "imm2": "0x086a5684", "rot": 2, "bit": 10, "mask": 2},
{"i": 25, "op": "add", "dst": 1, "src": 6, "src2": 3, "imm": "0x53e74799", "imm2": "0xfc2f6d17", "rot": 8, "bit": 7, "mask": 16},
{"i": 26, "op": "rotr", "dst": 7, "src": 6, "src2": 7, "imm": "0xc89a75a0", "imm2": "0x67813253", "rot": 24, "bit": 13, "mask": 1},
{"i": 27, "op": "add", "dst": 7, "src": 5, "src2": 4, "imm": "0xb8fae90e", "imm2": "0x787048dc", "rot": 26, "bit": 27, "mask": 1},
{"i": 28, "op": "xor", "dst": 4, "src": 1, "src2": 0, "imm": "0x4c90c2ea", "imm2": "0x2ce7865b", "rot": 4, "bit": 7, "mask": 2},
{"i": 29, "op": "xor", "dst": 6, "src": 1, "src2": 6, "imm": "0x6131ab08", "imm2": "0xd1825676", "rot": 4, "bit": 30, "mask": 2},
{"i": 30, "op": "mulhi", "dst": 2, "src": 0, "src2": 1, "imm": "0xbe4a545f", "imm2": "0xdc29e823", "rot": 17, "bit": 5, "mask": 8},
{"i": 31, "op": "rotr", "dst": 1, "src": 4, "src2": 1, "imm": "0x4d2f9cdc", "imm2": "0xdee1cc73", "rot": 5, "bit": 16, "mask": 4},
{"i": 32, "op": "xor", "dst": 7, "src": 4, "src2": 5, "imm": "0x9d277aaa", "imm2": "0xa902fca5", "rot": 11, "bit": 3, "mask": 1},
{"i": 33, "op": "mad", "dst": 3, "src": 2, "src2": 6, "imm": "0x7db09644", "imm2": "0x077bf3d9", "rot": 30, "bit": 19, "mask": 2},
{"i": 34, "op": "add", "dst": 3, "src": 1, "src2": 1, "imm": "0xd2dc42eb", "imm2": "0x9ffd510b", "rot": 17, "bit": 12, "mask": 2},
{"i": 35, "op": "add", "dst": 4, "src": 7, "src2": 0, "imm": "0xad8eda6f", "imm2": "0xf871ba37", "rot": 24, "bit": 7, "mask": 4},
{"i": 36, "op": "add", "dst": 7, "src": 4, "src2": 3, "imm": "0xb0cef8f4", "imm2": "0xd02d30ca", "rot": 22, "bit": 3, "mask": 16},
{"i": 37, "op": "mad", "dst": 4, "src": 3, "src2": 2, "imm": "0x6ed99a66", "imm2": "0x83dc97c0", "rot": 4, "bit": 1, "mask": 4},
{"i": 38, "op": "mad", "dst": 5, "src": 7, "src2": 7, "imm": "0xe24fdd24", "imm2": "0x360f5c8b", "rot": 19, "bit": 9, "mask": 8},
{"i": 39, "op": "add", "dst": 3, "src": 6, "src2": 4, "imm": "0x2bd506e2", "imm2": "0x82e98a22", "rot": 28, "bit": 26, "mask": 1},
{"i": 40, "op": "rotl", "dst": 0, "src": 2, "src2": 1, "imm": "0xdb1faed3", "imm2": "0xf968a20d", "rot": 21, "bit": 30, "mask": 16},
{"i": 41, "op": "or", "dst": 1, "src": 0, "src2": 1, "imm": "0xe6dfe522", "imm2": "0xb75813da", "rot": 10, "bit": 13, "mask": 1},
{"i": 42, "op": "add", "dst": 7, "src": 5, "src2": 7, "imm": "0xc0386e49", "imm2": "0x6435f6d8", "rot": 26, "bit": 28, "mask": 16},
{"i": 43, "op": "mulhi", "dst": 1, "src": 0, "src2": 4, "imm": "0xda497f7d", "imm2": "0xc4b748f4", "rot": 30, "bit": 10, "mask": 4},
{"i": 44, "op": "add", "dst": 5, "src": 6, "src2": 0, "imm": "0x3a8921a4", "imm2": "0x1f682c68", "rot": 12, "bit": 12, "mask": 1},
{"i": 45, "op": "add", "dst": 4, "src": 5, "src2": 6, "imm": "0xeeca4334", "imm2": "0xf246e180", "rot": 26, "bit": 1, "mask": 1},
{"i": 46, "op": "xor", "dst": 2, "src": 3, "src2": 5, "imm": "0x052178c3", "imm2": "0xaab31f10", "rot": 28, "bit": 16, "mask": 8},
{"i": 47, "op": "xor", "dst": 2, "src": 5, "src2": 0, "imm": "0x91fd7273", "imm2": "0xacc42b07", "rot": 22, "bit": 27, "mask": 4},
{"i": 48, "op": "mad", "dst": 7, "src": 4, "src2": 1, "imm": "0x05a2970f", "imm2": "0x14876824", "rot": 10, "bit": 5, "mask": 1},
{"i": 49, "op": "mad", "dst": 2, "src": 6, "src2": 1, "imm": "0x4440d6de", "imm2": "0x352023f9", "rot": 10, "bit": 25, "mask": 8},
{"i": 50, "op": "mad", "dst": 7, "src": 0, "src2": 7, "imm": "0xa6f82633", "imm2": "0x78465772", "rot": 13, "bit": 8, "mask": 4},
{"i": 51, "op": "add", "dst": 5, "src": 6, "src2": 5, "imm": "0x745776d8", "imm2": "0x41bd68cc", "rot": 29, "bit": 26, "mask": 1},
{"i": 52, "op": "shfl", "dst": 3, "src": 0, "src2": 6, "imm": "0x8f94ebac", "imm2": "0xe4a208a0", "rot": 5, "bit": 16, "mask": 1},
{"i": 53, "op": "or", "dst": 4, "src": 0, "src2": 5, "imm": "0x7b1235f3", "imm2": "0x408b4ea9", "rot": 27, "bit": 19, "mask": 8},
{"i": 54, "op": "mad", "dst": 0, "src": 2, "src2": 4, "imm": "0x30114050", "imm2": "0xe71dff8f", "rot": 6, "bit": 30, "mask": 1},
{"i": 55, "op": "rotl", "dst": 5, "src": 1, "src2": 7, "imm": "0x69f92198", "imm2": "0x65496f29", "rot": 9, "bit": 20, "mask": 4},
{"i": 56, "op": "mul", "dst": 5, "src": 7, "src2": 6, "imm": "0x88b884d4", "imm2": "0x041b67f7", "rot": 25, "bit": 8, "mask": 16},
{"i": 57, "op": "rotl", "dst": 7, "src": 5, "src2": 6, "imm": "0x7d1e18bc", "imm2": "0xf54ade27", "rot": 27, "bit": 20, "mask": 1},
{"i": 58, "op": "sub", "dst": 7, "src": 6, "src2": 4, "imm": "0xa457bbab", "imm2": "0x4b05eb29", "rot": 6, "bit": 6, "mask": 4},
{"i": 59, "op": "rotl", "dst": 2, "src": 7, "src2": 7, "imm": "0x4890bdda", "imm2": "0xadcb3d99", "rot": 22, "bit": 26, "mask": 16},
{"i": 60, "op": "shfl", "dst": 7, "src": 1, "src2": 7, "imm": "0xe4da58eb", "imm2": "0x1d50080d", "rot": 22, "bit": 26, "mask": 2},
{"i": 61, "op": "add", "dst": 4, "src": 0, "src2": 5, "imm": "0x60d0ff55", "imm2": "0xcba6a161", "rot": 6, "bit": 7, "mask": 8},
{"i": 62, "op": "mul", "dst": 1, "src": 5, "src2": 1, "imm": "0x0fdc702e", "imm2": "0x6b1bd03a", "rot": 9, "bit": 23, "mask": 4},
{"i": 63, "op": "mulhi", "dst": 7, "src": 6, "src2": 1, "imm": "0xcc44ed62", "imm2": "0x931dd006", "rot": 1, "bit": 0, "mask": 2},
{"i": 64, "op": "mul", "dst": 5, "src": 0, "src2": 7, "imm": "0x448c3aba", "imm2": "0x1136818a", "rot": 23, "bit": 7, "mask": 1},
{"i": 65, "op": "rotr", "dst": 2, "src": 5, "src2": 1, "imm": "0xb520dfb8", "imm2": "0xdce7d8f4", "rot": 22, "bit": 10, "mask": 8},
{"i": 66, "op": "mulhi", "dst": 0, "src": 3, "src2": 4, "imm": "0x19fada48", "imm2": "0x3cc04e0e", "rot": 1, "bit": 24, "mask": 16},
{"i": 67, "op": "or", "dst": 0, "src": 7, "src2": 3, "imm": "0x1c5905b4", "imm2": "0xf896dfb7", "rot": 31, "bit": 30, "mask": 8},
{"i": 68, "op": "rotl", "dst": 0, "src": 1, "src2": 5, "imm": "0xa28511c1", "imm2": "0xbf649695", "rot": 19, "bit": 27, "mask": 1},
{"i": 69, "op": "rotl", "dst": 0, "src": 7, "src2": 5, "imm": "0x22e2fef3", "imm2": "0x468bec9e", "rot": 1, "bit": 28, "mask": 1},
{"i": 70, "op": "or", "dst": 2, "src": 3, "src2": 6, "imm": "0xcb542821", "imm2": "0xe084cf11", "rot": 15, "bit": 5, "mask": 8},
{"i": 71, "op": "mad", "dst": 3, "src": 7, "src2": 5, "imm": "0xf06b8f6a", "imm2": "0x7382e15f", "rot": 6, "bit": 28, "mask": 16},
{"i": 72, "op": "mad", "dst": 7, "src": 0, "src2": 4, "imm": "0x4f64c588", "imm2": "0x47b63ee9", "rot": 8, "bit": 10, "mask": 2},
{"i": 73, "op": "or", "dst": 4, "src": 3, "src2": 2, "imm": "0xff138eea", "imm2": "0x6fd90eda", "rot": 23, "bit": 3, "mask": 16},
{"i": 74, "op": "xor", "dst": 3, "src": 1, "src2": 0, "imm": "0x6011ece1", "imm2": "0x89579f15", "rot": 11, "bit": 2, "mask": 4},
{"i": 75, "op": "add", "dst": 1, "src": 3, "src2": 4, "imm": "0x3f4ffea2", "imm2": "0x8e35924e", "rot": 12, "bit": 15, "mask": 2},
{"i": 76, "op": "mul", "dst": 1, "src": 3, "src2": 7, "imm": "0x15efa846", "imm2": "0xa1c971f1", "rot": 14, "bit": 20, "mask": 1},
{"i": 77, "op": "mad", "dst": 0, "src": 3, "src2": 2, "imm": "0x8660530a", "imm2": "0xa013524b", "rot": 14, "bit": 12, "mask": 8},
{"i": 78, "op": "shfl", "dst": 2, "src": 0, "src2": 0, "imm": "0xcc2e96bd", "imm2": "0xe32c6f87", "rot": 10, "bit": 11, "mask": 16},
{"i": 79, "op": "mulhi", "dst": 1, "src": 0, "src2": 6, "imm": "0x61931e3f", "imm2": "0x86383e7f", "rot": 17, "bit": 3, "mask": 1},
{"i": 80, "op": "mulhi", "dst": 0, "src": 4, "src2": 7, "imm": "0xd9991afc", "imm2": "0xd00e8678", "rot": 24, "bit": 15, "mask": 16},
{"i": 81, "op": "mul", "dst": 4, "src": 2, "src2": 3, "imm": "0x472f70f4", "imm2": "0x9fde4236", "rot": 10, "bit": 5, "mask": 4},
{"i": 82, "op": "sub", "dst": 5, "src": 7, "src2": 6, "imm": "0x55a7acb1", "imm2": "0x9fde8df1", "rot": 30, "bit": 29, "mask": 16},
{"i": 83, "op": "mad", "dst": 0, "src": 2, "src2": 3, "imm": "0x1c487c40", "imm2": "0xd9d9a1c3", "rot": 9, "bit": 5, "mask": 4},
{"i": 84, "op": "sub", "dst": 7, "src": 2, "src2": 4, "imm": "0x515c0a72", "imm2": "0x6df5c83d", "rot": 28, "bit": 21, "mask": 4},
{"i": 85, "op": "xor", "dst": 1, "src": 2, "src2": 4, "imm": "0x917f1174", "imm2": "0x8e72e519", "rot": 9, "bit": 18, "mask": 16},
{"i": 86, "op": "shfl", "dst": 6, "src": 3, "src2": 3, "imm": "0xda856cc2", "imm2": "0x932ae8d8", "rot": 28, "bit": 1, "mask": 16},
{"i": 87, "op": "mad", "dst": 3, "src": 0, "src2": 0, "imm": "0x4ef22321", "imm2": "0x5666ada3", "rot": 4, "bit": 4, "mask": 1},
{"i": 88, "op": "rotl", "dst": 0, "src": 1, "src2": 3, "imm": "0xbb3ec00c", "imm2": "0xffe78937", "rot": 20, "bit": 19, "mask": 4},
{"i": 89, "op": "sub", "dst": 1, "src": 5, "src2": 4, "imm": "0x8f295708", "imm2": "0x6608577f", "rot": 17, "bit": 18, "mask": 16},
{"i": 90, "op": "shfl", "dst": 6, "src": 4, "src2": 5, "imm": "0xd953aa15", "imm2": "0x4ef9f062", "rot": 19, "bit": 9, "mask": 16},
{"i": 91, "op": "xor", "dst": 5, "src": 1, "src2": 5, "imm": "0x6c02cde2", "imm2": "0x118dbd2b", "rot": 2, "bit": 20, "mask": 16},
{"i": 92, "op": "rotl", "dst": 5, "src": 0, "src2": 5, "imm": "0x9f0b0c61", "imm2": "0xe26dbe7a", "rot": 12, "bit": 17, "mask": 2},
{"i": 93, "op": "mad", "dst": 6, "src": 1, "src2": 2, "imm": "0x78a44a91", "imm2": "0x3ce118a9", "rot": 18, "bit": 16, "mask": 16},
{"i": 94, "op": "rotr", "dst": 2, "src": 5, "src2": 3, "imm": "0x02295fcb", "imm2": "0xc3353c64", "rot": 5, "bit": 31, "mask": 16},
{"i": 95, "op": "or", "dst": 0, "src": 4, "src2": 4, "imm": "0x727120c3", "imm2": "0x528f4416", "rot": 6, "bit": 20, "mask": 8},
{"i": 96, "op": "mul", "dst": 7, "src": 3, "src2": 4, "imm": "0x919c42ea", "imm2": "0x87526aa5", "rot": 28, "bit": 1, "mask": 8},
{"i": 97, "op": "or", "dst": 5, "src": 0, "src2": 7, "imm": "0x8a0a100c", "imm2": "0xb2c65cc3", "rot": 13, "bit": 7, "mask": 4},
{"i": 98, "op": "add", "dst": 3, "src": 1, "src2": 1, "imm": "0xbcfdd8a7", "imm2": "0x386bb642", "rot": 8, "bit": 13, "mask": 8},
{"i": 99, "op": "add", "dst": 0, "src": 6, "src2": 7, "imm": "0xc921a021", "imm2": "0xa3962d03", "rot": 31, "bit": 9, "mask": 1},
{"i": 100, "op": "rotr", "dst": 1, "src": 0, "src2": 3, "imm": "0x918c6f69", "imm2": "0x1a125801", "rot": 18, "bit": 29, "mask": 16},
{"i": 101, "op": "add", "dst": 2, "src": 4, "src2": 1, "imm": "0x70da4067", "imm2": "0xc5990c5c", "rot": 3, "bit": 18, "mask": 4},
{"i": 102, "op": "rotl", "dst": 2, "src": 7, "src2": 0, "imm": "0x9048d081", "imm2": "0xc25a9f56", "rot": 3, "bit": 25, "mask": 16},
{"i": 103, "op": "shfl", "dst": 1, "src": 4, "src2": 7, "imm": "0x70ca1427", "imm2": "0x6632093d", "rot": 18, "bit": 28, "mask": 4},
{"i": 104, "op": "xor", "dst": 0, "src": 2, "src2": 0, "imm": "0x0637204c", "imm2": "0x3b1b7f94", "rot": 1, "bit": 12, "mask": 2},
{"i": 105, "op": "add", "dst": 4, "src": 3, "src2": 5, "imm": "0x1a5880cb", "imm2": "0xb15aec75", "rot": 31, "bit": 28, "mask": 1},
{"i": 106, "op": "shfl", "dst": 4, "src": 0, "src2": 4, "imm": "0x7c22cb00", "imm2": "0xc4df7949", "rot": 3, "bit": 15, "mask": 2},
{"i": 107, "op": "shfl", "dst": 7, "src": 0, "src2": 0, "imm": "0xd43c76ca", "imm2": "0x8d5b9751", "rot": 31, "bit": 28, "mask": 4},
{"i": 108, "op": "mad", "dst": 1, "src": 7, "src2": 3, "imm": "0x69879993", "imm2": "0x3c4e18b0", "rot": 19, "bit": 25, "mask": 4},
{"i": 109, "op": "mad", "dst": 0, "src": 2, "src2": 3, "imm": "0x8ce3a4a6", "imm2": "0x1b3f0b74", "rot": 19, "bit": 8, "mask": 2},
{"i": 110, "op": "or", "dst": 2, "src": 4, "src2": 5, "imm": "0xcdbdac98", "imm2": "0x8d0e9f92", "rot": 19, "bit": 13, "mask": 1},
{"i": 111, "op": "shfl", "dst": 6, "src": 1, "src2": 1, "imm": "0xe74157f6", "imm2": "0xf92dead6", "rot": 4, "bit": 14, "mask": 1},
{"i": 112, "op": "mad", "dst": 2, "src": 5, "src2": 3, "imm": "0x200831bc", "imm2": "0x1ee98048", "rot": 29, "bit": 14, "mask": 1},
{"i": 113, "op": "mulhi", "dst": 4, "src": 0, "src2": 7, "imm": "0xd6827ead", "imm2": "0xc0ee1933", "rot": 26, "bit": 23, "mask": 16},
{"i": 114, "op": "rotl", "dst": 7, "src": 2, "src2": 2, "imm": "0x6ae1be2b", "imm2": "0x83216a4e", "rot": 29, "bit": 25, "mask": 16},
{"i": 115, "op": "sub", "dst": 3, "src": 7, "src2": 1, "imm": "0xa1d1646e", "imm2": "0x6fa998ce", "rot": 15, "bit": 29, "mask": 2},
{"i": 116, "op": "mulhi", "dst": 0, "src": 1, "src2": 4, "imm": "0xd7921c15", "imm2": "0x8b2345a7", "rot": 10, "bit": 19, "mask": 4},
{"i": 117, "op": "rotl", "dst": 4, "src": 0, "src2": 4, "imm": "0xc1b1b0ab", "imm2": "0xd19b3f39", "rot": 12, "bit": 16, "mask": 1},
{"i": 118, "op": "add", "dst": 1, "src": 4, "src2": 5, "imm": "0x24494ad3", "imm2": "0xc5e98ee5", "rot": 22, "bit": 7, "mask": 16},
{"i": 119, "op": "add", "dst": 0, "src": 4, "src2": 6, "imm": "0x1b2d1c83", "imm2": "0xa97bc949", "rot": 8, "bit": 4, "mask": 16},
{"i": 120, "op": "shfl", "dst": 5, "src": 4, "src2": 7, "imm": "0xb93015ff", "imm2": "0xc22366cd", "rot": 23, "bit": 16, "mask": 4},
{"i": 121, "op": "shfl", "dst": 3, "src": 2, "src2": 5, "imm": "0xc0aaacdb", "imm2": "0xaaa7d229", "rot": 31, "bit": 29, "mask": 8},
{"i": 122, "op": "rotl", "dst": 7, "src": 1, "src2": 3, "imm": "0xcce6a73f", "imm2": "0x517b6b86", "rot": 3, "bit": 16, "mask": 8},
{"i": 123, "op": "rotr", "dst": 4, "src": 6, "src2": 0, "imm": "0x8e156aca", "imm2": "0x0a894b3e", "rot": 2, "bit": 12, "mask": 2},
{"i": 124, "op": "shfl", "dst": 6, "src": 5, "src2": 2, "imm": "0xd88c8446", "imm2": "0xf49fedf3", "rot": 3, "bit": 23, "mask": 1},
{"i": 125, "op": "rotl", "dst": 5, "src": 2, "src2": 0, "imm": "0xd10b27cf", "imm2": "0x2dde1faa", "rot": 21, "bit": 7, "mask": 2},
{"i": 126, "op": "mad", "dst": 0, "src": 3, "src2": 1, "imm": "0x619e1818", "imm2": "0x62add310", "rot": 26, "bit": 1, "mask": 4},
{"i": 127, "op": "add", "dst": 0, "src": 3, "src2": 6, "imm": "0xff14c08d", "imm2": "0xa7f6bb54", "rot": 25, "bit": 24, "mask": 4},
{"i": 128, "op": "xor", "dst": 7, "src": 4, "src2": 4, "imm": "0x34224086", "imm2": "0x5e9f858e", "rot": 4, "bit": 16, "mask": 8},
{"i": 129, "op": "mulhi", "dst": 3, "src": 5, "src2": 6, "imm": "0x89c3cbdd", "imm2": "0x4e80334c", "rot": 29, "bit": 4, "mask": 1},
{"i": 130, "op": "shfl", "dst": 5, "src": 7, "src2": 1, "imm": "0x37d4c3e2", "imm2": "0xbd54378c", "rot": 14, "bit": 26, "mask": 8},
{"i": 131, "op": "mulhi", "dst": 6, "src": 4, "src2": 3, "imm": "0x4f5fac7c", "imm2": "0x74070028", "rot": 5, "bit": 25, "mask": 8},
{"i": 132, "op": "xor", "dst": 5, "src": 3, "src2": 0, "imm": "0x690eb003", "imm2": "0x8516a581", "rot": 20, "bit": 21, "mask": 2},
{"i": 133, "op": "rotl", "dst": 0, "src": 5, "src2": 7, "imm": "0x42b31885", "imm2": "0x08249acb", "rot": 19, "bit": 6, "mask": 8},
{"i": 134, "op": "rotr", "dst": 4, "src": 3, "src2": 3, "imm": "0x07d729ed", "imm2": "0xf564da8a", "rot": 17, "bit": 9, "mask": 16},
{"i": 135, "op": "shfl", "dst": 1, "src": 2, "src2": 0, "imm": "0x19130ef2", "imm2": "0xf59815e5", "rot": 17, "bit": 12, "mask": 16},
{"i": 136, "op": "sub", "dst": 5, "src": 2, "src2": 5, "imm": "0xdeb56168", "imm2": "0x871104c4", "rot": 13, "bit": 17, "mask": 16},
{"i": 137, "op": "xor", "dst": 3, "src": 5, "src2": 4, "imm": "0x884fc7da", "imm2": "0x83a4a5bf", "rot": 23, "bit": 12, "mask": 4},
{"i": 138, "op": "sub", "dst": 0, "src": 2, "src2": 6, "imm": "0x3e67a6fd", "imm2": "0x844d2039", "rot": 3, "bit": 24, "mask": 4},
{"i": 139, "op": "mul", "dst": 3, "src": 7, "src2": 7, "imm": "0x965933b4", "imm2": "0xf37ef93d", "rot": 6, "bit": 9, "mask": 4},
{"i": 140, "op": "add", "dst": 5, "src": 3, "src2": 3, "imm": "0x82ab98f4", "imm2": "0x2d465ca8", "rot": 11, "bit": 24, "mask": 1},
{"i": 141, "op": "add", "dst": 4, "src": 1, "src2": 7, "imm": "0x80594390", "imm2": "0x237a9d8e", "rot": 14, "bit": 11, "mask": 8},
{"i": 142, "op": "mad", "dst": 3, "src": 7, "src2": 0, "imm": "0xd37861a1", "imm2": "0x2fe70eae", "rot": 2, "bit": 11, "mask": 16},
{"i": 143, "op": "or", "dst": 0, "src": 3, "src2": 5, "imm": "0x1a018e2c", "imm2": "0x301aa5f6", "rot": 15, "bit": 26, "mask": 1},
{"i": 144, "op": "mulhi", "dst": 0, "src": 1, "src2": 5, "imm": "0x69d22dfc", "imm2": "0x4a90cb1e", "rot": 21, "bit": 9, "mask": 16},
{"i": 145, "op": "xor", "dst": 6, "src": 2, "src2": 0, "imm": "0xf3f41f47", "imm2": "0xdf8d33e9", "rot": 22, "bit": 0, "mask": 8},
{"i": 146, "op": "shfl", "dst": 7, "src": 1, "src2": 1, "imm": "0xf8a52377", "imm2": "0x0613ef41", "rot": 24, "bit": 12, "mask": 16},
{"i": 147, "op": "add", "dst": 0, "src": 1, "src2": 3, "imm": "0x07f15148", "imm2": "0xe68cf57e", "rot": 2, "bit": 18, "mask": 4},
{"i": 148, "op": "or", "dst": 7, "src": 3, "src2": 0, "imm": "0xbfd39b49", "imm2": "0xc7f6e97c", "rot": 13, "bit": 27, "mask": 2},
{"i": 149, "op": "xor", "dst": 4, "src": 2, "src2": 7, "imm": "0x47409e43", "imm2": "0x04ef7db9", "rot": 8, "bit": 6, "mask": 4},
{"i": 150, "op": "xor", "dst": 7, "src": 1, "src2": 1, "imm": "0x5d42a156", "imm2": "0xc2f77c48", "rot": 27, "bit": 17, "mask": 4},
{"i": 151, "op": "rotr", "dst": 5, "src": 2, "src2": 7, "imm": "0x7c170030", "imm2": "0xa3102916", "rot": 5, "bit": 6, "mask": 1},
{"i": 152, "op": "mul", "dst": 0, "src": 7, "src2": 5, "imm": "0x16d009af", "imm2": "0x2a89533b", "rot": 26, "bit": 8, "mask": 4},
{"i": 153, "op": "rotl", "dst": 4, "src": 5, "src2": 0, "imm": "0x6e54eb71", "imm2": "0xe2d27256", "rot": 16, "bit": 18, "mask": 1},
{"i": 154, "op": "rotr", "dst": 6, "src": 4, "src2": 5, "imm": "0x128f24a4", "imm2": "0x59888463", "rot": 15, "bit": 17, "mask": 16},
{"i": 155, "op": "xor", "dst": 6, "src": 1, "src2": 2, "imm": "0x34f276ff", "imm2": "0xef5086b4", "rot": 2, "bit": 10, "mask": 4},
{"i": 156, "op": "or", "dst": 6, "src": 3, "src2": 4, "imm": "0x16cc2c2f", "imm2": "0xfae5a09b", "rot": 12, "bit": 31, "mask": 4},
{"i": 157, "op": "add", "dst": 1, "src": 6, "src2": 7, "imm": "0x14878c5a", "imm2": "0x84c2a09d", "rot": 30, "bit": 19, "mask": 8},
{"i": 158, "op": "sub", "dst": 4, "src": 1, "src2": 0, "imm": "0xfe18e4b0", "imm2": "0x239df0cc", "rot": 14, "bit": 20, "mask": 2},
{"i": 159, "op": "mad", "dst": 4, "src": 6, "src2": 7, "imm": "0xbdfcc4e0", "imm2": "0x0870dee8", "rot": 1, "bit": 7, "mask": 8},
{"i": 160, "op": "mul", "dst": 1, "src": 5, "src2": 1, "imm": "0xc837b43d", "imm2": "0x027ac950", "rot": 4, "bit": 22, "mask": 16},
{"i": 161, "op": "or", "dst": 4, "src": 0, "src2": 2, "imm": "0x9c28f8f6", "imm2": "0x3db71fe6", "rot": 11, "bit": 6, "mask": 16},
{"i": 162, "op": "rotl", "dst": 7, "src": 3, "src2": 6, "imm": "0xb6e56f55", "imm2": "0x5fcbd27c", "rot": 21, "bit": 10, "mask": 1},
{"i": 163, "op": "sub", "dst": 0, "src": 1, "src2": 4, "imm": "0x8d95ae70", "imm2": "0xd4f10284", "rot": 15, "bit": 12, "mask": 8},
{"i": 164, "op": "mul", "dst": 1, "src": 0, "src2": 6, "imm": "0xa9bdf99e", "imm2": "0x1f3dceb6", "rot": 21, "bit": 20, "mask": 16},
{"i": 165, "op": "sub", "dst": 2, "src": 1, "src2": 4, "imm": "0xda245058", "imm2": "0x2038e7f6", "rot": 30, "bit": 11, "mask": 2},
{"i": 166, "op": "shfl", "dst": 0, "src": 6, "src2": 3, "imm": "0xbbc8eee8", "imm2": "0xa73472fb", "rot": 23, "bit": 4, "mask": 2},
{"i": 167, "op": "sub", "dst": 0, "src": 4, "src2": 2, "imm": "0x43540d69", "imm2": "0xb3f116ca", "rot": 28, "bit": 2, "mask": 2},
{"i": 168, "op": "rotr", "dst": 1, "src": 6, "src2": 6, "imm": "0x57cea752", "imm2": "0xc1136e71", "rot": 25, "bit": 3, "mask": 8},
{"i": 169, "op": "rotr", "dst": 7, "src": 1, "src2": 5, "imm": "0x4550a465", "imm2": "0x14362935", "rot": 25, "bit": 9, "mask": 16},
{"i": 170, "op": "mad", "dst": 3, "src": 1, "src2": 3, "imm": "0x8c961d80", "imm2": "0x7de2e1db", "rot": 10, "bit": 6, "mask": 4},
{"i": 171, "op": "shfl", "dst": 2, "src": 0, "src2": 0, "imm": "0xda047fca", "imm2": "0x459e17ab", "rot": 22, "bit": 26, "mask": 4},
{"i": 172, "op": "sub", "dst": 2, "src": 1, "src2": 2, "imm": "0xbcc341fd", "imm2": "0x17a3b229", "rot": 8, "bit": 25, "mask": 8},
{"i": 173, "op": "xor", "dst": 7, "src": 6, "src2": 7, "imm": "0x2302b424", "imm2": "0x78780982", "rot": 23, "bit": 7, "mask": 8},
{"i": 174, "op": "rotr", "dst": 4, "src": 1, "src2": 2, "imm": "0xcad6fb5f", "imm2": "0x1807628e", "rot": 8, "bit": 21, "mask": 4},
{"i": 175, "op": "shfl", "dst": 4, "src": 7, "src2": 7, "imm": "0xf5057e8e", "imm2": "0xd14d6cc5", "rot": 3, "bit": 12, "mask": 2},
{"i": 176, "op": "mul", "dst": 6, "src": 2, "src2": 1, "imm": "0xc2926356", "imm2": "0xae74dc32", "rot": 1, "bit": 21, "mask": 8},
{"i": 177, "op": "shfl", "dst": 0, "src": 2, "src2": 7, "imm": "0x8d94d98e", "imm2": "0x7bd6f4dc", "rot": 27, "bit": 14, "mask": 4},
{"i": 178, "op": "add", "dst": 6, "src": 4, "src2": 6, "imm": "0x4fa43965", "imm2": "0x509871e6", "rot": 28, "bit": 21, "mask": 4},
{"i": 179, "op": "xor", "dst": 0, "src": 6, "src2": 6, "imm": "0xe278fe6c", "imm2": "0x75d8a63f", "rot": 21, "bit": 15, "mask": 2},
{"i": 180, "op": "add", "dst": 5, "src": 7, "src2": 7, "imm": "0xfb3c4bd8", "imm2": "0xb95b8a53", "rot": 22, "bit": 0, "mask": 4},
{"i": 181, "op": "mul", "dst": 6, "src": 3, "src2": 2, "imm": "0x5a1347ec", "imm2": "0x3ccc5389", "rot": 27, "bit": 26, "mask": 4},
{"i": 182, "op": "rotl", "dst": 7, "src": 4, "src2": 7, "imm": "0xdc6db2f7", "imm2": "0x7cdff0c6", "rot": 1, "bit": 2, "mask": 4},
{"i": 183, "op": "add", "dst": 0, "src": 7, "src2": 7, "imm": "0xc448a197", "imm2": "0x7047b7cf", "rot": 24, "bit": 11, "mask": 8},
{"i": 184, "op": "mul", "dst": 3, "src": 5, "src2": 0, "imm": "0xa5c0e492", "imm2": "0xaf7d8a86", "rot": 11, "bit": 16, "mask": 8},
{"i": 185, "op": "shfl", "dst": 5, "src": 7, "src2": 1, "imm": "0x5965794b", "imm2": "0x36ddca6b", "rot": 7, "bit": 25, "mask": 1},
{"i": 186, "op": "mul", "dst": 0, "src": 2, "src2": 5, "imm": "0xdfdbcc0f", "imm2": "0xac7b7091", "rot": 11, "bit": 31, "mask": 8},
{"i": 187, "op": "mulhi", "dst": 4, "src": 7, "src2": 5, "imm": "0x3d8999e9", "imm2": "0xf1848db8", "rot": 15, "bit": 21, "mask": 8},
{"i": 188, "op": "mad", "dst": 2, "src": 7, "src2": 2, "imm": "0xda3af48c", "imm2": "0x8e33a97c", "rot": 6, "bit": 30, "mask": 4},
{"i": 189, "op": "sub", "dst": 7, "src": 2, "src2": 4, "imm": "0xa32da8c1", "imm2": "0xf7486d06", "rot": 25, "bit": 16, "mask": 4},
{"i": 190, "op": "add", "dst": 2, "src": 5, "src2": 1, "imm": "0x2fceaf49", "imm2": "0x5caccc5d", "rot": 24, "bit": 19, "mask": 2},
{"i": 191, "op": "shfl", "dst": 1, "src": 2, "src2": 2, "imm": "0x2a71f5e6", "imm2": "0xb9b51e89", "rot": 31, "bit": 25, "mask": 1},
{"i": 192, "op": "add", "dst": 7, "src": 1, "src2": 7, "imm": "0xba0cee62", "imm2": "0x857bb5fe", "rot": 4, "bit": 20, "mask": 2},
{"i": 193, "op": "rotl", "dst": 6, "src": 3, "src2": 3, "imm": "0xc7fe35cf", "imm2": "0x515c1201", "rot": 22, "bit": 7, "mask": 16},
{"i": 194, "op": "xor", "dst": 3, "src": 7, "src2": 4, "imm": "0xe496d1f1", "imm2": "0x11046e3e", "rot": 16, "bit": 9, "mask": 4},
{"i": 195, "op": "mul", "dst": 7, "src": 0, "src2": 2, "imm": "0xc7d5c4c2", "imm2": "0x077e940b", "rot": 23, "bit": 29, "mask": 4},
{"i": 196, "op": "xor", "dst": 3, "src": 5, "src2": 3, "imm": "0xbe6db14a", "imm2": "0xf736da5a", "rot": 19, "bit": 6, "mask": 2},
{"i": 197, "op": "add", "dst": 5, "src": 1, "src2": 5, "imm": "0x8519428c", "imm2": "0xeae84577", "rot": 18, "bit": 29, "mask": 1},
{"i": 198, "op": "mad", "dst": 7, "src": 4, "src2": 4, "imm": "0xb272a029", "imm2": "0x071f6a5c", "rot": 5, "bit": 28, "mask": 8},
{"i": 199, "op": "add", "dst": 3, "src": 6, "src2": 3, "imm": "0x468639d3", "imm2": "0x0bfdbfa1", "rot": 20, "bit": 8, "mask": 16},
{"i": 200, "op": "mad", "dst": 5, "src": 3, "src2": 4, "imm": "0xffba18b7", "imm2": "0xbdcf9e81", "rot": 13, "bit": 31, "mask": 8},
{"i": 201, "op": "shfl", "dst": 2, "src": 7, "src2": 7, "imm": "0xb7533191", "imm2": "0x8d58cc8c", "rot": 7, "bit": 29, "mask": 4},
{"i": 202, "op": "add", "dst": 7, "src": 4, "src2": 6, "imm": "0x18ec9a69", "imm2": "0x53ee8e50", "rot": 12, "bit": 23, "mask": 16},
{"i": 203, "op": "xor", "dst": 6, "src": 0, "src2": 5, "imm": "0x12011ff1", "imm2": "0xfbb57ac6", "rot": 16, "bit": 25, "mask": 16},
{"i": 204, "op": "add", "dst": 4, "src": 5, "src2": 3, "imm": "0x3e81485b", "imm2": "0xac63376e", "rot": 1, "bit": 4, "mask": 1},
{"i": 205, "op": "mad", "dst": 7, "src": 1, "src2": 4, "imm": "0xeb9eee5c", "imm2": "0x3f1daecd", "rot": 19, "bit": 29, "mask": 4},
{"i": 206, "op": "shfl", "dst": 1, "src": 5, "src2": 2, "imm": "0x4fc50d06", "imm2": "0xb5533b31", "rot": 22, "bit": 27, "mask": 16},
{"i": 207, "op": "mul", "dst": 4, "src": 0, "src2": 5, "imm": "0x202d6001", "imm2": "0x50388f85", "rot": 5, "bit": 18, "mask": 16},
{"i": 208, "op": "or", "dst": 1, "src": 6, "src2": 7, "imm": "0x8743c0d4", "imm2": "0x9df69539", "rot": 14, "bit": 16, "mask": 1},
{"i": 209, "op": "add", "dst": 6, "src": 4, "src2": 6, "imm": "0x66ccb75d", "imm2": "0x5b745519", "rot": 28, "bit": 28, "mask": 8},
{"i": 210, "op": "rotr", "dst": 1, "src": 3, "src2": 1, "imm": "0xe9933132", "imm2": "0x6702fe85", "rot": 16, "bit": 19, "mask": 1},
{"i": 211, "op": "sub", "dst": 5, "src": 4, "src2": 4, "imm": "0xfe04b942", "imm2": "0x40dd2ce8", "rot": 24, "bit": 8, "mask": 4},
{"i": 212, "op": "xor", "dst": 4, "src": 7, "src2": 7, "imm": "0x10827878", "imm2": "0xef0de8fc", "rot": 17, "bit": 11, "mask": 8},
{"i": 213, "op": "add", "dst": 1, "src": 7, "src2": 1, "imm": "0x0ce0553d", "imm2": "0x1c3dccf7", "rot": 26, "bit": 8, "mask": 1},
{"i": 214, "op": "mulhi", "dst": 0, "src": 1, "src2": 1, "imm": "0xa71d7581", "imm2": "0xe567c74c", "rot": 2, "bit": 29, "mask": 2},
{"i": 215, "op": "add", "dst": 3, "src": 6, "src2": 2, "imm": "0x96bfec89", "imm2": "0xfadc9205", "rot": 30, "bit": 9, "mask": 16},
{"i": 216, "op": "rotl", "dst": 0, "src": 2, "src2": 5, "imm": "0x947ca474", "imm2": "0xd2a1b650", "rot": 4, "bit": 1, "mask": 1},
{"i": 217, "op": "xor", "dst": 6, "src": 4, "src2": 5, "imm": "0x0b7617de", "imm2": "0xc6c0a9a2", "rot": 31, "bit": 15, "mask": 2},
{"i": 218, "op": "shfl", "dst": 6, "src": 7, "src2": 1, "imm": "0x738f0a8f", "imm2": "0xfc868560", "rot": 2, "bit": 20, "mask": 2},
{"i": 219, "op": "mad", "dst": 7, "src": 0, "src2": 1, "imm": "0x2960f2bc", "imm2": "0x7e9ef9b7", "rot": 21, "bit": 4, "mask": 16},
{"i": 220, "op": "mul", "dst": 4, "src": 0, "src2": 2, "imm": "0x6014d800", "imm2": "0xd19ac7d1", "rot": 1, "bit": 13, "mask": 1},
{"i": 221, "op": "mad", "dst": 2, "src": 6, "src2": 0, "imm": "0x4b558fc2", "imm2": "0x2d48bd3c", "rot": 18, "bit": 31, "mask": 2},
{"i": 222, "op": "xor", "dst": 5, "src": 4, "src2": 6, "imm": "0x0260f3ab", "imm2": "0x8fce22f1", "rot": 21, "bit": 26, "mask": 16},
{"i": 223, "op": "mul", "dst": 0, "src": 5, "src2": 0, "imm": "0xe07ab58f", "imm2": "0x5349a41d", "rot": 20, "bit": 3, "mask": 1},
{"i": 224, "op": "add", "dst": 2, "src": 0, "src2": 5, "imm": "0x61495681", "imm2": "0x66b15c04", "rot": 24, "bit": 9, "mask": 16},
{"i": 225, "op": "rotr", "dst": 3, "src": 2, "src2": 5, "imm": "0x291268bd", "imm2": "0xf046aa79", "rot": 27, "bit": 15, "mask": 4},
{"i": 226, "op": "mad", "dst": 2, "src": 3, "src2": 3, "imm": "0xfd6dfa6c", "imm2": "0x2c0db93d", "rot": 29, "bit": 2, "mask": 16},
{"i": 227, "op": "xor", "dst": 6, "src": 0, "src2": 4, "imm": "0xd4ae1ee2", "imm2": "0xe6a67972", "rot": 26, "bit": 1, "mask": 4},
{"i": 228, "op": "rotl", "dst": 4, "src": 7, "src2": 3, "imm": "0xf6627a9d", "imm2": "0x99078da3", "rot": 30, "bit": 5, "mask": 16},
{"i": 229, "op": "add", "dst": 2, "src": 3, "src2": 7, "imm": "0x70d05c34", "imm2": "0x25bc17c2", "rot": 20, "bit": 29, "mask": 4},
{"i": 230, "op": "rotr", "dst": 1, "src": 5, "src2": 2, "imm": "0xef874bea", "imm2": "0x3bfbfecc", "rot": 17, "bit": 2, "mask": 2},
{"i": 231, "op": "add", "dst": 1, "src": 4, "src2": 5, "imm": "0x32a28384", "imm2": "0x2d8728f3", "rot": 1, "bit": 8, "mask": 8},
{"i": 232, "op": "rotl", "dst": 1, "src": 6, "src2": 3, "imm": "0x877c54ab", "imm2": "0x1d5e5014", "rot": 6, "bit": 24, "mask": 2},
{"i": 233, "op": "add", "dst": 2, "src": 0, "src2": 5, "imm": "0xcf0949f1", "imm2": "0x61e81fe6", "rot": 2, "bit": 21, "mask": 16},
{"i": 234, "op": "rotl", "dst": 4, "src": 5, "src2": 5, "imm": "0x5017c32c", "imm2": "0x1ab34dfe", "rot": 2, "bit": 1, "mask": 2},
{"i": 235, "op": "sub", "dst": 2, "src": 6, "src2": 2, "imm": "0xadbdb811", "imm2": "0x2c2d4f2b", "rot": 30, "bit": 29, "mask": 8},
{"i": 236, "op": "or", "dst": 6, "src": 3, "src2": 4, "imm": "0x700e204f", "imm2": "0x27294e7b", "rot": 13, "bit": 0, "mask": 4},
{"i": 237, "op": "shfl", "dst": 7, "src": 5, "src2": 4, "imm": "0xc39f71ba", "imm2": "0x9a90263d", "rot": 28, "bit": 9, "mask": 4},
{"i": 238, "op": "xor", "dst": 1, "src": 3, "src2": 6, "imm": "0x9f84a5b3", "imm2": "0x95691d15", "rot": 14, "bit": 22, "mask": 1},
{"i": 239, "op": "rotl", "dst": 2, "src": 4, "src2": 0, "imm": "0xa3b79ed5", "imm2": "0x05f568bc", "rot": 1, "bit": 15, "mask": 4},
{"i": 240, "op": "rotr", "dst": 5, "src": 2, "src2": 7, "imm": "0xaaabbb0d", "imm2": "0x71ce4cd6", "rot": 2, "bit": 26, "mask": 4},
{"i": 241, "op": "rotl", "dst": 4, "src": 1, "src2": 7, "imm": "0x8146fbd3", "imm2": "0xde65fc31", "rot": 10, "bit": 9, "mask": 4},
{"i": 242, "op": "add", "dst": 6, "src": 2, "src2": 7, "imm": "0xe204fb50", "imm2": "0x0a67565d", "rot": 5, "bit": 16, "mask": 1},
{"i": 243, "op": "shfl", "dst": 1, "src": 3, "src2": 7, "imm": "0xcb7a3c1b", "imm2": "0x863f002c", "rot": 18, "bit": 1, "mask": 2},
{"i": 244, "op": "shfl", "dst": 0, "src": 1, "src2": 3, "imm": "0x92eb030c", "imm2": "0x3cff4c6d", "rot": 1, "bit": 22, "mask": 16},
{"i": 245, "op": "shfl", "dst": 5, "src": 7, "src2": 6, "imm": "0x046c969c", "imm2": "0xd21d7e76", "rot": 5, "bit": 31, "mask": 2},
{"i": 246, "op": "xor", "dst": 4, "src": 5, "src2": 1, "imm": "0x2e3015f0", "imm2": "0x1b305a5c", "rot": 22, "bit": 16, "mask": 8},
{"i": 247, "op": "xor", "dst": 7, "src": 2, "src2": 0, "imm": "0x8238cf71", "imm2": "0xb7874d94", "rot": 9, "bit": 1, "mask": 2},
{"i": 248, "op": "shfl", "dst": 0, "src": 6, "src2": 7, "imm": "0x437cbc99", "imm2": "0x7fb41fed", "rot": 17, "bit": 1, "mask": 16},
{"i": 249, "op": "mulhi", "dst": 1, "src": 3, "src2": 2, "imm": "0xeb293d88", "imm2": "0xb92f5968", "rot": 3, "bit": 20, "mask": 2},
{"i": 250, "op": "add", "dst": 7, "src": 5, "src2": 3, "imm": "0x3d6daffd", "imm2": "0x5a79fd6f", "rot": 6, "bit": 31, "mask": 2},
{"i": 251, "op": "add", "dst": 6, "src": 0, "src2": 3, "imm": "0x84334aea", "imm2": "0x6beb28c2", "rot": 27, "bit": 28, "mask": 2},
{"i": 252, "op": "sub", "dst": 7, "src": 1, "src2": 6, "imm": "0xe6177638", "imm2": "0x814d3fc5", "rot": 25, "bit": 2, "mask": 2},
{"i": 253, "op": "rotr", "dst": 5, "src": 2, "src2": 7, "imm": "0x95560bac", "imm2": "0xbf8b01a9", "rot": 14, "bit": 5, "mask": 16},
{"i": 254, "op": "mulhi", "dst": 2, "src": 5, "src2": 1, "imm": "0x318956e5", "imm2": "0x7c20b373", "rot": 13, "bit": 30, "mask": 2},
{"i": 255, "op": "mul", "dst": 6, "src": 3, "src2": 3, "imm": "0xe1998e49", "imm2": "0x59353e5a", "rot": 15, "bit": 2, "mask": 4}
]},
"instructions": [
{"i": 0, "op": "sub", "dst": 6, "src": 3, "src2": 3, "imm": "0x77dfbe60", "imm2": "0x404c8b9c", "rot": 24, "bit": 8, "mask": 2, "width": 1, "win": 0, "off": 0},
{"i": 1, "op": "or", "dst": 2, "src": 6, "src2": 7, "imm": "0xb2e79058", "imm2": "0xc2485073", "rot": 21, "bit": 23, "mask": 8, "width": 1, "win": 0, "off": 0},
{"i": 2, "op": "add", "dst": 4, "src": 0, "src2": 6, "imm": "0x1a579b38", "imm2": "0x7731324b", "rot": 6, "bit": 4, "mask": 2, "width": 1, "win": 0, "off": 0},
{"i": 3, "op": "load", "dst": 3, "src": 6, "src2": 0, "imm": "0x683f5bc5", "imm2": "0xc8a218fe", "rot": 25, "bit": 4, "mask": 1, "width": 1, "win": 0, "off": 0},
{"i": 4, "op": "shfl", "dst": 0, "src": 6, "src2": 4, "imm": "0x4d7cdcbb", "imm2": "0x1a5bf1a4", "rot": 8, "bit": 28, "mask": 1, "width": 1, "win": 0, "off": 0},
{"i": 5, "op": "xor", "dst": 4, "src": 1, "src2": 0, "imm": "0xa2b86827", "imm2": "0x94a44439", "rot": 21, "bit": 22, "mask": 2, "width": 1, "win": 0, "off": 0},
{"i": 6, "op": "mad", "dst": 3, "src": 5, "src2": 3, "imm": "0x58a4ea3f", "imm2": "0x467879fa", "rot": 6, "bit": 31, "mask": 8, "width": 1, "win": 0, "off": 0},
{"i": 7, "op": "mul", "dst": 1, "src": 6, "src2": 1, "imm": "0x31fcc19c", "imm2": "0x176cb88f", "rot": 1, "bit": 11, "mask": 1, "width": 1, "win": 0, "off": 0},
{"i": 8, "op": "load", "dst": 2, "src": 0, "src2": 3, "imm": "0x89b12386", "imm2": "0x661ed5e5", "rot": 11, "bit": 13, "mask": 2, "width": 1, "win": 2, "off": 2},
{"i": 9, "op": "xor", "dst": 0, "src": 4, "src2": 1, "imm": "0x69150105", "imm2": "0x8e1f04b9", "rot": 3, "bit": 30, "mask": 2, "width": 1, "win": 0, "off": 0},
{"i": 10, "op": "add", "dst": 0, "src": 7, "src2": 5, "imm": "0xee083919", "imm2": "0xb10fcef8", "rot": 9, "bit": 30, "mask": 16, "width": 1, "win": 0, "off": 0},
{"i": 11, "op": "mulhi", "dst": 0, "src": 2, "src2": 3, "imm": "0x99ac7c83", "imm2": "0x34eb2845", "rot": 18, "bit": 12, "mask": 16, "width": 1, "win": 0, "off": 0},
{"i": 12, "op": "xor", "dst": 5, "src": 4, "src2": 0, "imm": "0x97cfc887", "imm2": "0x0458f053", "rot": 28, "bit": 24, "mask": 2, "width": 1, "win": 0, "off": 0},
{"i": 13, "op": "mad", "dst": 7, "src": 3, "src2": 0, "imm": "0x503e87b4", "imm2": "0x2c5d2617", "rot": 3, "bit": 15, "mask": 1, "width": 1, "win": 0, "off": 0},
{"i": 14, "op": "load", "dst": 3, "src": 4, "src2": 4, "imm": "0xfae98035", "imm2": "0x6c127281", "rot": 19, "bit": 29, "mask": 4, "width": 1, "win": 1, "off": 0},
{"i": 15, "op": "load", "dst": 2, "src": 5, "src2": 2, "imm": "0x67601ed5", "imm2": "0x3c546ed1", "rot": 28, "bit": 28, "mask": 4, "width": 1, "win": 0, "off": 0},
{"i": 16, "op": "shfl", "dst": 7, "src": 5, "src2": 6, "imm": "0x7789be79", "imm2": "0x87496b8e", "rot": 22, "bit": 2, "mask": 16, "width": 1, "win": 0, "off": 0},
{"i": 17, "op": "mul", "dst": 7, "src": 6, "src2": 2, "imm": "0x559099bb", "imm2": "0x6a72e1a6", "rot": 1, "bit": 11, "mask": 16, "width": 1, "win": 0, "off": 0},
{"i": 18, "op": "mad", "dst": 2, "src": 3, "src2": 1, "imm": "0x4f5bae5e", "imm2": "0x4c8c5762", "rot": 27, "bit": 31, "mask": 4, "width": 1, "win": 0, "off": 0},
{"i": 19, "op": "rotr", "dst": 5, "src": 2, "src2": 4, "imm": "0x5dc5e6bf", "imm2": "0x36bc207d", "rot": 9, "bit": 4, "mask": 2, "width": 1, "win": 0, "off": 0},
{"i": 20, "op": "load", "dst": 5, "src": 3, "src2": 7, "imm": "0x4a278885", "imm2": "0xcd1044b0", "rot": 30, "bit": 0, "mask": 4, "width": 1, "win": 1, "off": 1},
{"i": 21, "op": "shfl", "dst": 6, "src": 4, "src2": 3, "imm": "0x48b94ffc", "imm2": "0xd8e14d80", "rot": 2, "bit": 31, "mask": 16, "width": 1, "win": 0, "off": 0},
{"i": 22, "op": "mulhi", "dst": 1, "src": 2, "src2": 7, "imm": "0x47bd8492", "imm2": "0x28fa8d0b", "rot": 19, "bit": 26, "mask": 4, "width": 1, "win": 0, "off": 0},
{"i": 23, "op": "xor", "dst": 6, "src": 5, "src2": 1, "imm": "0x4ed6baf4", "imm2": "0xa8c31f74", "rot": 30, "bit": 2, "mask": 2, "width": 1, "win": 0, "off": 0},
{"i": 24, "op": "mad", "dst": 5, "src": 2, "src2": 0, "imm": "0x6174747d", "imm2": "0xfc912524", "rot": 18, "bit": 29, "mask": 2, "width": 1, "win": 0, "off": 0},
{"i": 25, "op": "mad", "dst": 6, "src": 3, "src2": 7, "imm": "0x113a6442", "imm2": "0xbe52ec57", "rot": 15, "bit": 15, "mask": 1, "width": 1, "win": 0, "off": 0},
{"i": 26, "op": "load", "dst": 6, "src": 5, "src2": 1, "imm": "0x9d3eb1cc", "imm2": "0x375c73bb", "rot": 29, "bit": 7, "mask": 8, "width": 1, "win": 1, "off": 1},
{"i": 27, "op": "mad", "dst": 1, "src": 5, "src2": 5, "imm": "0x150088c3", "imm2": "0x7f17e789", "rot": 8, "bit": 25, "mask": 8, "width": 1, "win": 0, "off": 0},
{"i": 28, "op": "load", "dst": 0, "src": 6, "src2": 3, "imm": "0x4b412223", "imm2": "0x9192ceeb", "rot": 16, "bit": 28, "mask": 1, "width": 1, "win": 1, "off": 1},
{"i": 29, "op": "add", "dst": 7, "src": 4, "src2": 6, "imm": "0xd5e6c37c", "imm2": "0x0b1f02c7", "rot": 2, "bit": 7, "mask": 8, "width": 1, "win": 0, "off": 0},
{"i": 30, "op": "add", "dst": 7, "src": 0, "src2": 6, "imm": "0x4e45ba51", "imm2": "0x2d6e8bd1", "rot": 7, "bit": 0, "mask": 8, "width": 1, "win": 0, "off": 0},
{"i": 31, "op": "xor", "dst": 0, "src": 2, "src2": 7, "imm": "0xef601d89", "imm2": "0x805402db", "rot": 7, "bit": 28, "mask": 2, "width": 1, "win": 0, "off": 0},
{"i": 32, "op": "add", "dst": 6, "src": 2, "src2": 3, "imm": "0x1c91b2a1", "imm2": "0x351422d2", "rot": 1, "bit": 13, "mask": 2, "width": 1, "win": 0, "off": 0},
{"i": 33, "op": "mulhi", "dst": 4, "src": 5, "src2": 7, "imm": "0x7cf21567", "imm2": "0x1075ee0d", "rot": 26, "bit": 17, "mask": 16, "width": 1, "win": 0, "off": 0},
{"i": 34, "op": "rotr", "dst": 3, "src": 5, "src2": 6, "imm": "0x60d8f191", "imm2": "0x40523707", "rot": 3, "bit": 10, "mask": 4, "width": 1, "win": 0, "off": 0},
{"i": 35, "op": "load", "dst": 3, "src": 0, "src2": 5, "imm": "0xb1dc3f6e", "imm2": "0x74440531", "rot": 21, "bit": 10, "mask": 1, "width": 1, "win": 0, "off": 0},
{"i": 36, "op": "rotl", "dst": 4, "src": 6, "src2": 4, "imm": "0xf0d17569", "imm2": "0xd281fd01", "rot": 13, "bit": 4, "mask": 8, "width": 1, "win": 0, "off": 0},
{"i": 37, "op": "add", "dst": 6, "src": 1, "src2": 6, "imm": "0x3f2970f7", "imm2": "0x64a28251", "rot": 4, "bit": 7, "mask": 8, "width": 1, "win": 0, "off": 0},
{"i": 38, "op": "mul", "dst": 2, "src": 0, "src2": 3, "imm": "0x6463770c", "imm2": "0xb85d603f", "rot": 27, "bit": 1, "mask": 1, "width": 1, "win": 0, "off": 0},
{"i": 39, "op": "add", "dst": 3, "src": 4, "src2": 3, "imm": "0x3b7b3317", "imm2": "0x7378c955", "rot": 28, "bit": 15, "mask": 2, "width": 1, "win": 0, "off": 0},
{"i": 40, "op": "load", "dst": 0, "src": 7, "src2": 3, "imm": "0xd0fb5982", "imm2": "0x2e4d31a8", "rot": 25, "bit": 27, "mask": 4, "width": 1, "win": 2, "off": 3},
{"i": 41, "op": "xor", "dst": 6, "src": 5, "src2": 0, "imm": "0xe96a9e6e", "imm2": "0x8d73cc3e", "rot": 17, "bit": 11, "mask": 16, "width": 1, "win": 0, "off": 0},
{"i": 42, "op": "add", "dst": 3, "src": 0, "src2": 6, "imm": "0x6678b059", "imm2": "0xb31f6a64", "rot": 11, "bit": 2, "mask": 2, "width": 1, "win": 0, "off": 0},
{"i": 43, "op": "load", "dst": 7, "src": 3, "src2": 2, "imm": "0x65a841c5", "imm2": "0x6aae1403", "rot": 9, "bit": 9, "mask": 1, "width": 1, "win": 1, "off": 0},
{"i": 44, "op": "shfl", "dst": 3, "src": 7, "src2": 6, "imm": "0x650ba38d", "imm2": "0x07218508", "rot": 12, "bit": 13, "mask": 4, "width": 1, "win": 0, "off": 0},
{"i": 45, "op": "mulhi", "dst": 1, "src": 5, "src2": 7, "imm": "0x18736788", "imm2": "0x9f820eed", "rot": 13, "bit": 29, "mask": 1, "width": 1, "win": 0, "off": 0},
{"i": 46, "op": "rotl", "dst": 0, "src": 1, "src2": 5, "imm": "0x48deba75", "imm2": "0xefc508fa", "rot": 6, "bit": 6, "mask": 2, "width": 1, "win": 0, "off": 0},
{"i": 47, "op": "load", "dst": 1, "src": 7, "src2": 4, "imm": "0x28a04384", "imm2": "0xc67cb0ac", "rot": 5, "bit": 5, "mask": 2, "width": 1, "win": 1, "off": 1},
{"i": 48, "op": "add", "dst": 4, "src": 0, "src2": 5, "imm": "0x43095946", "imm2": "0x5feccee6", "rot": 22, "bit": 17, "mask": 1, "width": 1, "win": 0, "off": 0},
{"i": 49, "op": "load", "dst": 2, "src": 0, "src2": 2, "imm": "0x3e78cdd8", "imm2": "0x7c170311", "rot": 10, "bit": 5, "mask": 16, "width": 1, "win": 0, "off": 0},
{"i": 50, "op": "sub", "dst": 2, "src": 3, "src2": 7, "imm": "0xaff0cdb2", "imm2": "0xde0b7ee0", "rot": 21, "bit": 11, "mask": 8, "width": 1, "win": 0, "off": 0},
{"i": 51, "op": "add", "dst": 7, "src": 2, "src2": 1, "imm": "0xf45ecdf8", "imm2": "0x26e2b582", "rot": 28, "bit": 24, "mask": 4, "width": 1, "win": 0, "off": 0},
{"i": 52, "op": "load", "dst": 5, "src": 7, "src2": 7, "imm": "0x67353e69", "imm2": "0xb2d56082", "rot": 27, "bit": 14, "mask": 2, "width": 1, "win": 2, "off": 3},
{"i": 53, "op": "load", "dst": 6, "src": 3, "src2": 1, "imm": "0x5a58c787", "imm2": "0x53a0467b", "rot": 6, "bit": 16, "mask": 16, "width": 1, "win": 0, "off": 0},
{"i": 54, "op": "shfl", "dst": 7, "src": 5, "src2": 4, "imm": "0x3c237ad5", "imm2": "0xf2681187", "rot": 14, "bit": 26, "mask": 4, "width": 1, "win": 0, "off": 0},
{"i": 55, "op": "rotr", "dst": 1, "src": 2, "src2": 3, "imm": "0x1c25c077", "imm2": "0x125de1ff", "rot": 13, "bit": 13, "mask": 2, "width": 1, "win": 0, "off": 0},
{"i": 56, "op": "shfl", "dst": 0, "src": 5, "src2": 0, "imm": "0x6465afe2", "imm2": "0x23b41d56", "rot": 31, "bit": 28, "mask": 16, "width": 1, "win": 0, "off": 0},
{"i": 57, "op": "rotl", "dst": 5, "src": 0, "src2": 2, "imm": "0xa427ff6e", "imm2": "0x014a0deb", "rot": 12, "bit": 28, "mask": 8, "width": 1, "win": 0, "off": 0},
{"i": 58, "op": "add", "dst": 5, "src": 3, "src2": 7, "imm": "0x6b4f35e8", "imm2": "0x473b1718", "rot": 25, "bit": 4, "mask": 8, "width": 1, "win": 0, "off": 0},
{"i": 59, "op": "rotr", "dst": 4, "src": 1, "src2": 3, "imm": "0x66cc96ef", "imm2": "0xcb8c8e56", "rot": 7, "bit": 6, "mask": 4, "width": 1, "win": 0, "off": 0},
{"i": 60, "op": "shfl", "dst": 4, "src": 5, "src2": 5, "imm": "0x461bbf9f", "imm2": "0xc1ffd350", "rot": 19, "bit": 2, "mask": 1, "width": 1, "win": 0, "off": 0},
{"i": 61, "op": "load", "dst": 7, "src": 0, "src2": 1, "imm": "0x4d893571", "imm2": "0x5583e644", "rot": 19, "bit": 19, "mask": 8, "width": 1, "win": 1, "off": 1},
{"i": 62, "op": "load", "dst": 5, "src": 7, "src2": 3, "imm": "0x7a9049b4", "imm2": "0xbb7ebdf8", "rot": 15, "bit": 11, "mask": 8, "width": 1, "win": 1, "off": 1},
{"i": 63, "op": "mul", "dst": 4, "src": 1, "src2": 7, "imm": "0xe7ae8a83", "imm2": "0x1ded64e8", "rot": 21, "bit": 1, "mask": 8, "width": 1, "win": 0, "off": 0}
]
}

View file

@ -0,0 +1,18 @@
#!/usr/bin/env bash
# Start a long adv-accept run on a build box through the build-server lane's lease pool (main, 7 October 2026, 20:17 UK:
# no sweep starts except through `lease pool`): up to <threads> free cores of the bounded pool (cores 8 to 95, shared with
# the builds), never fewer than <min>, waiting up to 2 h; then nice 10 pinned to the cores taken. The command's
# "--threads {cores}" becomes the count taken (LEASE_CORES is exported too, for a loop of runs). No sweep.lock flock.
# Logs and pid files OUTSIDE the worktree mirror: /srv/builds/_adv-adv-accept/<tag>.log, .pid (the lease), .pgid.
# Kill ONLY by pid file: kill -- -"$(cat <log>.pgid)".
# run-box.sh <tag> <threads> <min> <cmd...> (cmd may be: bash -c '...' using $LEASE_CORES)
set -euo pipefail
tag="$1"; threads="$2"; min="$3"; shift 3
dir=/srv/builds/_adv-adv-accept
mkdir -p "$dir"
log="$dir/$tag.log"
setsid /srv/builds/_bin/lease pool "$threads" --min "$min" --label "adv-accept $tag" --owner adv-accept -- "$@" > "$log" 2>&1 < /dev/null &
pid=$!
pgid=$(ps -o pgid= -p "$pid" 2>/dev/null | tr -d ' '); [ -n "$pgid" ] || pgid="$pid"
echo "$pid" > "$log.pid"; echo "$pgid" > "$log.pgid"
echo "$(date -u +%FT%TZ) queued on lease pool $threads (min $min) pid $pid pgid $pgid; log $log" | tee -a "$log.start"

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,743 @@
//! adv-accept: internal adversarial pass on the program acceptance rule and its generator
//! (class v4 sub-version 3, frozen commit 017e7037). Nothing in igneum-pow is modified; every draw,
//! the acceptance rule and the per-site ratio are the library's, reached through the public API.
//!
//! Commands:
//! adv-accept derive-check
//! The draw-path smoke test: the shared devnet epoch-0 class v4 program id must be
//! a785001687d8688a (attempt 1). If a copied Devnet 3 program.json is given, its id must be
//! fce15bf61030be57 (attempt 0). A mismatch means the draw path is wrong and nothing else counts.
//! adv-accept sweep --seeds N [--threads T] [--ratio-units U] [--out FILE]
//! Draw the chain's class v4 program for N epoch/era seed pairs (generate_era over V4_CLASS,
//! the full attempt loop and the real acceptance rule), then on each accepted program record:
//! the attempt, the closed-form distinct-item mean (the rule's own (c) metric, 128 is ideal),
//! the min per-site distinct-index ratio at U evaluations per site (the (c'') metric; the floor
//! is 0.98 at 2^20), the saturated count and the bias max. Reports the distribution and the
//! worst (lowest distinct-mean, lowest ratio) seeds: the closed-form proxy for Q1/Q5.
//! adv-accept plant [--seed S]
//! The known-failed shape: take an accepted program and put one load's source back onto a
//! lossily-written register; the rule MUST now reject it (UnfreshLoadSource, or the ratio).
//! If the rule does not fire, the harness is not reading the rule and the sweep is void.
use igneum_pow::accept::{check, distinct_ratio_pass, Reject, ACCEPT_DATASET_LOG2, MIN_DISTINCT_RATIO_V4};
use igneum_pow::bind::{hex, unhex};
use igneum_pow::generator::{generate_era, Op, Program, ProgramClass, V3_ALLOWED, V4_CLASS};
use igneum_pow::seed::seed_words_from_bytes;
use igneum_pow::verify::Epoch;
use std::io::Write;
use std::sync::atomic::{AtomicUsize, Ordering};
use std::time::Instant;
const GENESIS_HEX: &str = "edc4fa844da9dc98d37e965176f6558a31560e40502ab3ae5491b21aaaabfb07";
/// 32 epoch/era bytes for sweep index k: the little-endian words of a label-derived seed, EXACTLY the
/// attack-pass F8 harness's chain-shaped seeds ("igneum-attack-f8/program/k" and ".../era/k"), so the
/// unmodified f8 harness (built here as adv-live) runs the same program as `adv-live warps --program k`
/// for every k this sweep reports. k = 1 is f8's shared devnet epoch 0 and is not in this seed space.
fn seed_bytes(tag: &str, k: u64) -> Vec<u8> {
let tag = if tag == "epoch" { "program" } else { tag };
seed_words_from_bytes(format!("igneum-attack-f8/{tag}/{k}").as_bytes())
.iter()
.flat_map(|x| x.to_le_bytes())
.collect()
}
/// The chain's class v4 program of an (epoch, era) seed pair: the full attempt loop and the real
/// acceptance rule inside generate_era. Returns an accepted program (or the last resort if a seed
/// exhausts its 256 attempts, which a sweep never reaches).
fn chain_v4(label: &str, epoch: &[u8], era: &[u8]) -> Program {
generate_era(label, epoch, V4_CLASS, era, &V3_ALLOWED)
}
fn derive_check(args: &[String]) {
let g = unhex(GENESIS_HEX).unwrap();
// The shared devnet's epoch 0: epoch seed and era seed are both the genesis hash (the F8 harness's p1).
let p = Epoch::chain_program(&g, Some(&g), ProgramClass::V4, "p1-devnet-epoch0");
let id = p.program_id();
let want = 0xa785001687d8688au64;
println!(
"shared devnet epoch 0: generator {} attempt {} program id {:016x} (want a785001687d8688a) class {} -> {}",
p.generator,
p.attempt,
id,
p.class.name(),
if id == want { "OK" } else { "MISMATCH" }
);
assert_eq!(id, want, "the draw path is wrong: shared devnet epoch-0 id mismatch");
assert_eq!(p.generator, 4);
assert!(check(&p).is_ok(), "the shared devnet program must pass the rule");
// Optional Devnet 3 check: a copied program.json path as the only extra argument.
if let Some(path) = args.iter().find(|a| a.ends_with(".json")) {
match std::fs::read_to_string(path) {
Ok(text) => {
let field = |k: &str| -> Option<String> {
let pat = format!("\"{k}\"");
let i = text.find(&pat)?;
let rest = &text[i + pat.len()..];
let c = rest.find(':')?;
let after = rest[c + 1..].trim_start();
let after = after.trim_start_matches('"');
let end = after.find(|ch| ch == '"' || ch == ',' || ch == '}')?;
Some(after[..end].trim().trim_matches('"').to_string())
};
let epoch = unhex(&field("seed_bytes").expect("seed_bytes")).expect("hex seed");
let era = unhex(&field("era_seed_bytes").expect("era_seed_bytes")).expect("hex era");
let p3 = Epoch::chain_program(&epoch, Some(&era), ProgramClass::V4, "p-devnet3-epoch0");
let id3 = p3.program_id();
println!(
"devnet 3 epoch 0: epoch {} era {} attempt {} program id {:016x} (want fce15bf61030be57) -> {}",
hex(&epoch),
hex(&era),
p3.attempt,
id3,
if id3 == 0xfce15bf61030be57 { "OK" } else { "MISMATCH" }
);
assert_eq!(id3, 0xfce15bf61030be57, "devnet 3 epoch-0 id mismatch");
}
Err(e) => println!("devnet 3 program.json not readable ({e}); shared-devnet check alone"),
}
}
println!("derive-check: PASS");
}
struct Row {
k: u64,
attempt: u32,
id: u64,
/// closed-form distinct-item mean per hash from the rule's own report (only with --full; else NaN)
distinct_mean: f64,
min_ratio: f64,
min_ratio_site: usize,
/// Q5 structure: output registers whose last base-program write (cyclic) is or/mul/mulhi
lossy_last: u8,
/// Q5 structure: or, mul, mulhi counts in the base program
n_or: u8,
n_mul: u8,
n_mulhi: u8,
/// distinct registers written by the base program (register-set collapse if under 8)
regs_written: u8,
last_resort: bool,
}
/// Cheap static shape counts over the base program (Q5).
fn structure(p: &Program) -> (u8, u8, u8, u8, u8) {
let n = p.instrs.len();
let mut lossy_last = 0u8;
for reg in 0..8u8 {
// the last write to reg in program order is the one the fold reads (the shadow runs after 63 too,
// so a shadow write of reg later would supersede it; counted on the base program as the proxy)
let mut last: Option<Op> = None;
for i in &p.instrs {
if i.dst == reg {
last = Some(i.op);
}
}
for i in &p.shadow {
if i.dst == reg {
last = Some(i.op);
}
}
if matches!(last, Some(Op::Or) | Some(Op::Mul) | Some(Op::MulHi)) {
lossy_last += 1;
}
}
let count = |o: Op| p.instrs.iter().filter(|i| i.op == o).count() as u8;
let mut w = [false; 8];
for i in &p.instrs {
w[i.dst as usize] = true;
}
let _ = n;
(lossy_last, count(Op::Or), count(Op::Mul), count(Op::MulHi), w.iter().filter(|&&x| x).count() as u8)
}
fn sweep(args: &[String]) {
let get = |k: &str, d: &str| -> String {
args.windows(2).find(|w| w[0] == k).map(|w| w[1].clone()).unwrap_or_else(|| d.to_string())
};
let seed_start: u64 = get("--seed-start", "0").parse().unwrap();
let seeds: u64 = get("--seeds", "1000").parse().unwrap();
let threads: usize = get("--threads", "12").parse().unwrap();
let ratio_units: usize = get("--ratio-units", "256").parse().unwrap();
let full = args.iter().any(|a| a == "--full");
let out = get("--out", "");
println!(
"adv-accept sweep: seeds {seed_start}..{} ({seeds}), {threads} threads, ratio at {ratio_units} units per site (floor {MIN_DISTINCT_RATIO_V4} at 2^20, dataset 2^{ACCEPT_DATASET_LOG2}), full report {full}",
seed_start + seeds
);
let t0 = Instant::now();
let next = AtomicUsize::new(0);
let done = AtomicUsize::new(0);
let outfile = if out.is_empty() { None } else { Some(std::sync::Mutex::new(std::fs::File::create(&out).unwrap())) };
if let Some(f) = &outfile {
writeln!(f.lock().unwrap(), "# seed attempt program_id distinct_mean min_ratio min_ratio_site lossy_last n_or n_mul n_mulhi regs_written last_resort").unwrap();
}
let rows: Vec<Vec<Row>> = std::thread::scope(|sc| {
let mut hs = Vec::new();
for _ in 0..threads {
let (next, done, outfile) = (&next, &done, &outfile);
hs.push(sc.spawn(move || {
let mut out = Vec::new();
loop {
let i = next.fetch_add(1, Ordering::Relaxed) as u64;
if i >= seeds {
break;
}
let k = seed_start + i;
let epoch = seed_bytes("epoch", k);
let era = seed_bytes("era", k);
let label = format!("igneum-adv-accept/{k}");
let p = chain_v4(&label, &epoch, &era);
// the chain path accepted this program (or handed the last resort at attempt 256); the full
// report costs a second 2^20 pass, so it is taken only with --full
let distinct_mean = if full { check(&p).map(|r| r.distinct_mean()).unwrap_or(f64::NAN) } else { f64::NAN };
let (min_ratio, min_site) = distinct_ratio_pass(&p, ratio_units, 0.0).unwrap_or((f64::NAN, 0));
let (lossy_last, n_or, n_mul, n_mulhi, regs_written) = structure(&p);
let r = Row {
k,
attempt: p.attempt,
id: p.program_id(),
distinct_mean,
min_ratio,
min_ratio_site: min_site,
lossy_last,
n_or,
n_mul,
n_mulhi,
regs_written,
last_resort: p.attempt >= 256,
};
if let Some(f) = outfile {
let mut g = f.lock().unwrap();
writeln!(g, "{} {} {:016x} {:.5} {:.5} {} {} {} {} {} {} {}", r.k, r.attempt, r.id, r.distinct_mean, r.min_ratio, r.min_ratio_site, r.lossy_last, r.n_or, r.n_mul, r.n_mulhi, r.regs_written, r.last_resort as u8).unwrap();
}
out.push(r);
let d = done.fetch_add(1, Ordering::Relaxed) + 1;
if d % 500 == 0 {
let el = t0.elapsed().as_secs_f64();
println!("progress: {d} of {seeds} seeds in {el:.0} s ({:.2} seeds/s, {:.1} s per seed per thread)", d as f64 / el, el * threads as f64 / d as f64);
}
}
out
}));
}
hs.into_iter().map(|h| h.join().unwrap()).collect()
});
let mut all: Vec<Row> = rows.into_iter().flatten().collect();
let n = all.len();
let el = t0.elapsed().as_secs_f64();
let mean_attempt = all.iter().map(|r| r.attempt as f64).sum::<f64>() / n as f64;
let max_attempt = all.iter().map(|r| r.attempt).max().unwrap_or(0);
let last_resorts = all.iter().filter(|r| r.last_resort).count();
let rmean = all.iter().map(|r| r.min_ratio).sum::<f64>() / n as f64;
let rmin = all.iter().map(|r| r.min_ratio).fold(f64::MAX, f64::min);
let below_floor = all.iter().filter(|r| r.min_ratio < MIN_DISTINCT_RATIO_V4).count();
let mut attempt_hist = [0u64; 12];
for r in &all {
attempt_hist[(r.attempt as usize).min(11)] += 1;
}
println!(
"swept {n} seeds in {el:.1} s ({:.2} seeds/s, {:.1} s per seed per thread); attempts mean {mean_attempt:.3} max {max_attempt}; attempt histogram 0..10,11+ {:?}; last-resort programs {last_resorts}",
n as f64 / el,
el * threads as f64 / n as f64,
attempt_hist
);
if full {
let dmean = all.iter().map(|r| r.distinct_mean).sum::<f64>() / n as f64;
let dmin = all.iter().map(|r| r.distinct_mean).fold(f64::MAX, f64::min);
println!("closed-form distinct-item mean per hash: mean {dmean:.4} min {dmin:.4} (ideal 128, rule floor mean > 120)");
}
println!(
"per-site distinct-index ratio at {ratio_units} units: mean {rmean:.4} min {rmin:.4}; {below_floor} of {n} below the 0.98 floor at this sample size (the floor is enforced at 2^20)"
);
let lossy = all.iter().filter(|r| r.lossy_last > 0).count();
let collapse = all.iter().filter(|r| r.regs_written < 8).count();
let mean_or = all.iter().map(|r| r.n_or as f64).sum::<f64>() / n as f64;
println!(
"Q5 structure over accepted programs: {lossy} of {n} with a lossy (or/mul/mulhi) last write to an output register; {collapse} with under 8 registers written; or per program mean {mean_or:.3}"
);
all.sort_by(|a, b| a.min_ratio.partial_cmp(&b.min_ratio).unwrap());
println!("lowest per-site distinct-index ratio (headroom over the floor, Q5; the live hot-set candidates for Q1):");
for r in all.iter().take(20) {
println!(
" seed {} id {:016x} attempt {} min_ratio {:.4} (site {}) lossy_last {} or {} mul {} mulhi {} regs {}",
r.k, r.id, r.attempt, r.min_ratio, r.min_ratio_site, r.lossy_last, r.n_or, r.n_mul, r.n_mulhi, r.regs_written
);
}
if !out.is_empty() {
println!("wrote {out}");
}
println!("sweep DONE");
}
/// The known-failed shape: an accepted program, then one load's source put onto a register the
/// program writes with a lossy op (or/mul/mulhi) and nothing fresh after, so the source is not fresh
/// by dataflow. The rule MUST reject it. This shows the harness reads the real rule firing.
fn plant(args: &[String]) {
let get = |k: &str, d: &str| -> String {
args.windows(2).find(|w| w[0] == k).map(|w| w[1].clone()).unwrap_or_else(|| d.to_string())
};
let s: u64 = get("--seed", "0").parse().unwrap();
let epoch = seed_bytes("epoch", s);
let era = seed_bytes("era", s);
let p = chain_v4(&format!("igneum-adv-accept/{s}"), &epoch, &era);
assert!(check(&p).is_ok(), "seed {s} is accepted as drawn");
println!("seed {s}: accepted, id {:016x} attempt {}", p.program_id(), p.attempt);
// Known-failed shape: find a load at position `pos` (not at instr 0) and write its source
// register with an `or` in the instruction immediately before it, with nothing between to
// refresh it. `or` is never fresh by dataflow, so the load's source is not fresh in the loop's
// steady state and the rule MUST reject (a'), unless an earlier check (a)/(b) fires first.
let load_pos = p.instrs.iter().position(|i| i.op == Op::Load && i.src != 0).filter(|&pos| pos >= 1);
match load_pos {
Some(pos) => {
let src = p.instrs[pos].src;
let mut q = p.clone();
// the instruction just before the load becomes `or dst=src, src=other` (src != dst)
let other = (src + 1) % 8;
q.instrs[pos - 1].op = Op::Or;
q.instrs[pos - 1].dst = src;
q.instrs[pos - 1].src = other;
let v = check(&q);
println!(
"planted: instr {} -> or r{src} |= r{other} (lossy), load at instr {pos} reads r{src}; rule says {:?}",
pos - 1,
v.as_ref().err().map(|r| r.to_string())
);
assert!(v.is_err(), "the rule did not reject the planted not-fresh load source: the harness is not reading the rule");
// the finding we want is specifically the dataflow rule, but an earlier part firing is still the rule working
println!(
"plant: the rule FIRED ({}) on the planted weakness; harness reads the real rule",
match v {
Err(Reject::UnfreshLoadSource { .. }) => "(a') unfresh load source, the intended part",
Err(_) => "an earlier part",
Ok(_) => unreachable!(),
}
);
}
None => println!("seed {s}: no distinct load past instr 0 to plant; try another --seed"),
}
}
fn main() {
let args: Vec<String> = std::env::args().collect();
if args.len() < 2 {
eprintln!("adv-accept <derive-check|sweep|plant> [args]");
std::process::exit(2);
}
match args[1].as_str() {
"derive-check" => derive_check(&args[2..]),
"sweep" => sweep(&args[2..]),
"plant" => plant(&args[2..]),
"gap" => gap_cmd(&args[2..]),
"attempts" => attempts_cmd(&args[2..]),
_ => {
eprintln!("unknown command {}", args[1]);
std::process::exit(2);
}
}
}
// --------------------------------------------------------------------------------------------------------------
// Q2: the stand-in gap. The rule's dynamic test runs on the closed-form dataset; the chain hashes the live
// memory-hard one. A load index at site s depends on the dataset WORDS loaded earlier in the hash, so the
// per-site index distribution (and the rule's (c) metrics) can differ between the two. This command mirrors
// the interpreter with per-site index capture, validates the mirror against the library's hash_warp on both
// datasets and its closed-form distinct counts against the library's distinct_indices_v4, then reports the
// per-site distinct-index ratio on the live set beside the closed-form one over the rule's own 4096 units,
// and the (c) metrics (distinct addresses per hash, saturated finals, output bias) on both over the (c) units.
// Known-failed shape: `--plant zero-dataset` makes every live word 0, so live indices collapse and the tool
// must report a large gap.
// --------------------------------------------------------------------------------------------------------------
mod gap {
use igneum_pow::accept::{accept_base_nonces_n, distinct_indices_v4, ACCEPT_DATASET_LOG2, ACCEPT_UNITS, ACCEPT_UNITS_DISTINCT_V4};
use igneum_pow::bind::day_bytes;
use igneum_pow::generator::{Instr, Op, Program, ProgramClass, ITERATIONS, LANES};
use igneum_pow::memhard::Layout;
use igneum_pow::verify::{hash_warp, load_index, splitmix32, DatasetMode, DatasetSource, Epoch};
use std::sync::atomic::{AtomicUsize, Ordering};
pub struct Words<'a> {
pub ds: &'a DatasetSource,
pub layout: Layout,
pub zero: bool,
}
impl<'a> Words<'a> {
#[inline]
fn word(&self, idx: u32) -> u32 {
if self.zero { 0 } else { self.ds.word_at(self.layout, idx) }
}
}
/// One warp of the program on `w`, with every load's masked index pushed into `sites[site]`; returns the
/// 32 hashes and the per-lane distinct masked addresses, and counts saturated finals and output bit ones.
pub fn warp(p: &Program, w: &Words, base: u32, sites: &mut [Vec<u32>], lane_distinct: &mut u64, sat: &mut u32, ones: &mut [u32; 64]) -> [u64; LANES] {
let seed = &p.seed;
let mask: u32 = (1u32 << ACCEPT_DATASET_LOG2) - 1;
let era = p.class.era;
let mut r = [[0u32; LANES]; 8];
for lane in 0..LANES {
let nonce = base.wrapping_add(lane as u32);
for i in 0..8 {
let mut x = nonce ^ seed[i];
x = x.wrapping_add(0x9e3779b9u32.wrapping_mul(i as u32 + 1));
x = splitmix32(x);
r[i][lane] = x ^ seed[(i + 1) & 7];
}
}
let loads = p.loads_per_hash();
let mut addrs = vec![0u32; LANES * loads];
let mut nload = 0usize;
let reps = p.shadow_reps();
for _ in 0..ITERATIONS {
let sel = r[0];
let mut site = 0usize;
let shadow = (0..reps).flat_map(|_| p.shadow.iter());
for ins in p.instrs.iter().chain(shadow) {
step(ins, &mut r, &sel, w, mask, era.as_ref(), sites, &mut site, &mut addrs, &mut nload, loads);
}
}
let mut hashes = [0u64; LANES];
for lane in 0..LANES {
for i in 0..8 {
let v = r[i][lane];
*sat += (v == 0 || v == u32::MAX) as u32;
}
let lo = r[0][lane] ^ r[1][lane].rotate_left(7) ^ r[2][lane].rotate_left(14) ^ r[3][lane].rotate_left(21);
let hi = r[4][lane] ^ r[5][lane].rotate_left(9) ^ r[6][lane].rotate_left(18) ^ r[7][lane].rotate_left(27);
let h = ((hi as u64) << 32) | lo as u64;
hashes[lane] = h;
for j in 0..64 {
ones[j] += ((h >> j) & 1) as u32;
}
let sl = &mut addrs[lane * loads..(lane + 1) * loads];
sl.sort_unstable();
let mut distinct = 0u64;
for k in 0..loads {
if k == 0 || sl[k] != sl[k - 1] {
distinct += 1;
}
}
*lane_distinct += distinct;
}
hashes
}
#[allow(clippy::too_many_arguments)]
#[inline(always)]
fn step(ins: &Instr, r: &mut [[u32; LANES]; 8], sel: &[u32; LANES], w: &Words, mask: u32, era: Option<&igneum_pow::generator::EraParams>, sites: &mut [Vec<u32>], site: &mut usize, addrs: &mut [u32], nload: &mut usize, loads: usize) {
let d = ins.dst as usize;
let a = ins.src as usize;
match ins.op {
Op::Add => {
let (imm, imm2, bit) = (ins.imm, ins.imm2, ins.bit as u32);
let src = r[a];
for lane in 0..LANES {
let c = if (sel[lane] >> bit) & 1 != 0 { imm2 } else { imm };
r[d][lane] = r[d][lane].wrapping_add(src[lane]).wrapping_add(c);
}
}
Op::Sub => { let src = r[a]; for lane in 0..LANES { r[d][lane] = r[d][lane].wrapping_sub(src[lane]); } }
Op::Mul => { let src = r[a]; for lane in 0..LANES { r[d][lane] = r[d][lane].wrapping_mul(src[lane]); } }
Op::MulHi => { let src = r[a]; for lane in 0..LANES { r[d][lane] = ((r[d][lane] as u64 * src[lane] as u64) >> 32) as u32; } }
Op::Xor => { let src = r[a]; for lane in 0..LANES { r[d][lane] ^= src[lane]; } }
Op::Or => { let src = r[a]; for lane in 0..LANES { r[d][lane] |= src[lane]; } }
Op::Rotl => { let n = ins.rot; for lane in 0..LANES { r[d][lane] = r[d][lane].rotate_left(n); } }
Op::Rotr => { let src = r[a]; for lane in 0..LANES { r[d][lane] = r[d][lane].rotate_right(src[lane] & 31); } }
Op::Mad => { let src = r[a]; let s2 = r[ins.src2 as usize]; for lane in 0..LANES { r[d][lane] = src[lane].wrapping_mul(s2[lane]).wrapping_add(r[d][lane]); } }
Op::Shfl => { let src = r[a]; let m = ins.mask as usize; for lane in 0..LANES { r[d][lane] ^= src[lane ^ m]; } }
Op::Load => {
assert_eq!(ins.width, 1);
for lane in 0..LANES {
let idx = load_index(era, ins, r[a][lane], mask, ACCEPT_DATASET_LOG2);
sites[*site].push(idx);
addrs[lane * loads + *nload] = idx;
r[d][lane] ^= w.word(idx);
}
*site += 1;
*nload += 1;
}
Op::WLoad | Op::Scratch | Op::Hot => panic!("not a class v4 op"),
}
}
pub struct Side {
pub name: &'static str,
pub distinct: Vec<u32>,
pub ratio: Vec<f64>,
/// share of the site's reads on word indices read 8 or more times over the units
pub rep8: Vec<f64>,
pub distinct_mean_c: f64,
pub saturated_c: u32,
pub bias_max_c: u32,
}
/// Run the rule's units on one dataset side: the first `units` base nonces of the seed's acceptance stream
/// (the (c) metrics over the first ACCEPT_UNITS of them), threaded over units.
pub fn side(p: &Program, w: &Words, name: &'static str, units: usize, threads: usize) -> Side {
let n_sites = p.loads_per_hash() / ITERATIONS;
let bases = accept_base_nonces_n(&p.seed, units);
let next = AtomicUsize::new(0);
let parts: Vec<(Vec<Vec<u32>>, u64, u32, [u32; 64])> = std::thread::scope(|sc| {
let mut hs = Vec::new();
for _ in 0..threads {
let (next, bases) = (&next, &bases);
hs.push(sc.spawn(move || {
let mut sites: Vec<Vec<u32>> = vec![Vec::new(); n_sites];
let (mut ld, mut sat, mut ones) = (0u64, 0u32, [0u32; 64]);
let (mut ld_c, mut sat_c, mut ones_c) = (0u64, 0u32, [0u32; 64]);
loop {
let u = next.fetch_add(1, Ordering::Relaxed);
if u >= bases.len() { break; }
if u < ACCEPT_UNITS {
warp(p, w, bases[u], &mut sites, &mut ld_c, &mut sat_c, &mut ones_c);
} else {
warp(p, w, bases[u], &mut sites, &mut ld, &mut sat, &mut ones);
}
}
(sites, ld_c, sat_c, ones_c)
}));
}
hs.into_iter().map(|h| h.join().unwrap()).collect()
});
let mut sites: Vec<Vec<u32>> = vec![Vec::new(); n_sites];
let (mut ld_c, mut sat_c, mut ones_c) = (0u64, 0u32, [0u32; 64]);
for (s, l, sa, on) in parts {
for (i, v) in s.into_iter().enumerate() { sites[i].extend(v); }
ld_c += l; sat_c += sa;
for j in 0..64 { ones_c[j] += on[j]; }
}
let n = (units * LANES * ITERATIONS) as f64;
let mut distinct = Vec::new();
let mut ratio = Vec::new();
let mut rep8 = Vec::new();
let mut k = 0usize;
for i in p.instrs.iter().filter(|i| i.op == Op::Load) {
let mut v = std::mem::take(&mut sites[k]);
v.sort_unstable();
// the defender's statistic: the share of this site's reads landing on word indices read 8 or more
// times within the 2^20 evaluations (a uniform site on a 2^26 window repeats an index at most 2 or 3 times)
let (mut reads8, mut run, mut d) = (0u64, 0u64, 0u64);
for j in 0..v.len() {
if j == 0 || v[j] != v[j - 1] {
if run >= 8 { reads8 += run; }
run = 1;
d += 1;
} else {
run += 1;
}
}
if run >= 8 { reads8 += run; }
let wsize = ((1u64 << ACCEPT_DATASET_LOG2) >> (i.win as u64).min(2)) as f64;
distinct.push(d as u32);
ratio.push(d as f64 / (n - n * n / (2.0 * wsize)));
rep8.push(reads8 as f64 / v.len().max(1) as f64);
k += 1;
}
let half = (ACCEPT_UNITS * LANES / 2) as u32;
let bias_max_c = ones_c.iter().map(|&o| o.abs_diff(half)).max().unwrap_or(0);
Side { name, distinct, ratio, rep8, distinct_mean_c: ld_c as f64 / (ACCEPT_UNITS * LANES) as f64, saturated_c: sat_c, bias_max_c }
}
pub fn run(p: &Program, day: u64, threads: usize, zero_plant: bool) {
let t0 = std::time::Instant::now();
let live_ds = Epoch::chain_dataset_day(&day_bytes(day), ProgramClass::V4, 0, ACCEPT_DATASET_LOG2);
let closed_ds = DatasetSource::from_key(p.seed, DatasetMode::ClosedForm, ACCEPT_DATASET_LOG2);
let layout = p.class.layout();
let live = Words { ds: &live_ds, layout, zero: zero_plant };
let closed = Words { ds: &closed_ds, layout, zero: false };
println!("gap: program id {:016x} attempt {} class {} day {day} (cache filled in {:.1} s) plant zero-dataset {zero_plant}", p.program_id(), p.attempt, p.class.name(), t0.elapsed().as_secs_f64());
// validation: the mirror's hashes equal the library's on both datasets over 8 units
let bases = accept_base_nonces_n(&p.seed, 8);
let mut scratch: Vec<Vec<u32>> = vec![Vec::new(); 16];
let (mut ld, mut sat, mut ones) = (0u64, 0u32, [0u32; 64]);
let mut mism = 0;
for &b in &bases {
let hc = warp(p, &closed, b, &mut scratch, &mut ld, &mut sat, &mut ones);
if hc != hash_warp(p, b, &closed_ds) { mism += 1; }
if !zero_plant {
let hl = warp(p, &live, b, &mut scratch, &mut ld, &mut sat, &mut ones);
if hl != hash_warp(p, b, &live_ds) { mism += 1; }
}
}
assert_eq!(mism, 0, "the mirror disagrees with the library's hash_warp; nothing below is trusted");
println!("gap: mirror validated against hash_warp on 8 units (closed form{})", if zero_plant { "; live skipped under the plant" } else { " and live" });
let units = ACCEPT_UNITS_DISTINCT_V4;
let c = side(p, &closed, "closed", units, threads);
let lib = distinct_indices_v4(p, units).expect("library distinct pass");
assert_eq!(c.distinct, lib, "the mirror's closed-form distinct counts differ from the library's distinct_indices_v4");
println!("gap: closed-form per-site distinct counts equal the library's distinct_indices_v4 on {units} units");
let l = side(p, &live, "live", units, threads);
println!("gap: (c) metrics on {} units: closed distinct_mean {:.3} saturated {} bias_max {}; live distinct_mean {:.3} saturated {} bias_max {}", ACCEPT_UNITS, c.distinct_mean_c, c.saturated_c, c.bias_max_c, l.distinct_mean_c, l.saturated_c, l.bias_max_c);
let mut worst = (0f64, 0usize);
for s in 0..c.ratio.len() {
let d = c.ratio[s] - l.ratio[s];
if d.abs() > worst.0.abs() { worst = (d, s); }
println!("gap: site {s:2} closed ratio {:.4} ({}) live ratio {:.4} ({}) diff {:+.4}; reads on indices read >= 8 times: closed {:.4}% live {:.4}%", c.ratio[s], c.distinct[s], l.ratio[s], l.distinct[s], d, c.rep8[s] * 100.0, l.rep8[s] * 100.0);
}
let cmin = c.ratio.iter().cloned().fold(9.0, f64::min);
let lmin = l.ratio.iter().cloned().fold(9.0, f64::min);
println!("gap: min ratio closed {cmin:.4} live {lmin:.4}; largest site gap {:+.4} at site {}; verdict under the 0.98 floor: closed {} live {}; {:.1} s", worst.0, worst.1, if cmin >= 0.98 { "accept" } else { "REJECT" }, if lmin >= 0.98 { "accept" } else { "REJECT" }, t0.elapsed().as_secs_f64());
println!("gap DONE {:016x}", p.program_id());
}
}
fn gap_cmd(args: &[String]) {
let get = |k: &str, d: &str| -> String { args.windows(2).find(|w| w[0] == k).map(|w| w[1].clone()).unwrap_or_else(|| d.to_string()) };
let seeds: Vec<u64> = if args.windows(2).any(|w| w[0] == "--seeds") { get("--seeds", "2").split(',').map(|x| x.parse().unwrap()).collect() } else { Vec::new() };
let day: u64 = get("--day", "20730").parse().unwrap();
let threads: usize = get("--threads", "32").parse().unwrap();
let zero = args.iter().any(|a| a == "--plant") && get("--plant", "") == "zero-dataset";
// `--hex <epoch hex>:<era hex>:<label>` (repeatable): a program named by its raw 32-byte seeds, as a pack or a
// sibling lane names it, through the same chain draw (Epoch::chain_program, class v4)
for w in args.windows(2) {
if w[0] == "--hex" {
let parts: Vec<&str> = w[1].split(':').collect();
let epoch = unhex(parts[0]).expect("epoch hex");
let era = unhex(parts.get(1).copied().unwrap_or(parts[0])).expect("era hex");
let label = parts.get(2).copied().unwrap_or("hex-program").to_string();
let p = Epoch::chain_program(&epoch, Some(&era), ProgramClass::V4, &label);
println!("gap: hex program {label}: epoch {} era {}", hex(&epoch), hex(&era));
gap::run(&p, day, threads, zero);
}
}
for k in seeds {
let p = if k == 1 {
let g = unhex(GENESIS_HEX).unwrap();
Epoch::chain_program(&g, Some(&g), ProgramClass::V4, "p1-devnet-epoch0")
} else {
chain_v4(&format!("igneum-attack-f8/{k}"), &seed_bytes("epoch", k), &seed_bytes("era", k))
};
println!("gap: seed {k}");
gap::run(&p, day, threads, zero);
}
}
// --------------------------------------------------------------------------------------------------------------
// Row 90 (owner adv-accept-3, unspawned; claimed by this lane): the attempt loop walked through the real rule,
// attempt by attempt, recording WHICH part rejected each candidate (the first failing test in the module's
// order), the attempt count of the accepted program, any seed reaching the 256 cap, and the last-resort program.
// The draw and every verdict are the library's (candidate_class, accept::check, last_resort_v4).
// Known-failed shape: `--force-exhaust` treats every verdict as a rejection, so the loop MUST hit the cap and
// print the last-resort program's shape (what a rule that rejects everything would hand the chain).
// --------------------------------------------------------------------------------------------------------------
fn attempts_cmd(args: &[String]) {
use igneum_pow::generator::{candidate_class, last_resort_v4, LoadClass, GENERATOR_VERSION_V4, MAX_ATTEMPTS_V4};
let get = |k: &str, d: &str| -> String { args.windows(2).find(|w| w[0] == k).map(|w| w[1].clone()).unwrap_or_else(|| d.to_string()) };
let seed_start: u64 = get("--seed-start", "2").parse().unwrap();
let seeds: u64 = get("--seeds", "1000").parse().unwrap();
let threads: usize = get("--threads", "32").parse().unwrap();
let force_exhaust = args.iter().any(|a| a == "--force-exhaust");
let out = get("--out", "");
println!("adv-accept attempts: seeds {seed_start}..{} ({seeds}), {threads} threads, cap {MAX_ATTEMPTS_V4}, force-exhaust {force_exhaust}", seed_start + seeds);
let t0 = Instant::now();
let next = AtomicUsize::new(0);
let done_n = AtomicUsize::new(0);
// per attempt index (0..=MAX): counts of each reject class; the accepted attempt histogram; exhaustions
const CLASSES: usize = 11;
fn class_of(r: &Reject) -> usize {
match r {
Reject::StaleLoadSource { .. } => 0,
Reject::NoInjectingWrite { .. } => 1,
Reject::UnfreshLoadSource { .. } => 2,
Reject::ConstantBit { .. } => 3,
Reject::LaneConstantSite { .. } => 4,
Reject::Saturated { .. } => 5,
Reject::SaturatedSource { .. } => 6,
Reject::RepeatedSource { .. } => 7,
Reject::LowEntropySite { .. } => 8,
Reject::OutputBias { .. } => 9,
Reject::DistinctAddresses { .. } => 10,
}
}
const NAMES: [&str; CLASSES] = ["(a) stale", "(b) no-inject", "(a') unfresh", "(c) const-bit", "(c) lane-const", "(c) saturated", "(c') sat-source", "(c'') repeated", "(c'') low-entropy", "(c) bias", "(c) distinct"];
let parts: Vec<(Vec<[u64; CLASSES]>, Vec<u64>, u64, Vec<String>, Vec<(u64, u32, u64, f64)>)> = std::thread::scope(|sc| {
let mut hs = Vec::new();
for _ in 0..threads {
let (next, done_n) = (&next, &done_n);
hs.push(sc.spawn(move || {
let mut by_attempt = vec![[0u64; CLASSES]; MAX_ATTEMPTS_V4 as usize + 1];
let mut accepted_at = vec![0u64; MAX_ATTEMPTS_V4 as usize + 1];
let mut exhausted = 0u64;
let mut notes = Vec::new();
let mut rows = Vec::new();
loop {
let i = next.fetch_add(1, Ordering::Relaxed) as u64;
if i >= seeds { break; }
let k = seed_start + i;
let epoch = seed_bytes("epoch", k);
let era = seed_bytes("era", k);
let class = LoadClass::era(V4_CLASS, &era, &V3_ALLOWED);
let label = format!("igneum-attack-f8/{k}");
let mut done = false;
let cap = if force_exhaust { 8 } else { MAX_ATTEMPTS_V4 }; // under the plant a short cap shows the path
for a in 0..cap {
let mut p = candidate_class(&label, &epoch, a, class);
p.generator = GENERATOR_VERSION_V4;
match check(&p) {
Ok(r) if !force_exhaust => {
accepted_at[a as usize] += 1;
rows.push((k, a, p.program_id(), r.distinct_mean()));
done = true;
break;
}
Ok(_) => { by_attempt[a as usize][3] += 0; } // forced: counted as a rejection of no class
Err(r) => { by_attempt[a as usize][class_of(&r)] += 1; }
}
}
let d = done_n.fetch_add(1, Ordering::Relaxed) + 1;
if d % 500 == 0 {
println!("progress: {d} of {seeds} seeds in {:.0} s", t0.elapsed().as_secs_f64());
}
if !done {
exhausted += 1;
let mut lr = candidate_class(&label, &epoch, cap, class);
lr.generator = GENERATOR_VERSION_V4;
let lr = last_resort_v4(lr);
let v = check(&lr);
let (lossy_last, n_or, n_mul, n_mulhi, regs) = structure(&lr);
notes.push(format!("seed {k}: EXHAUSTED at cap {cap}; last resort id {:016x} attempt {} op mix {} shadow mix {}; rule verdict on it {:?}; structure lossy_last {lossy_last} or {n_or} mul {n_mul} mulhi {n_mulhi} regs {regs}", lr.program_id(), lr.attempt, lr.op_mix(), lr.shadow_op_mix(), v.as_ref().map(|r| format!("accept distinct_mean {:.3} sat {} bias {}", r.distinct_mean(), r.saturated, r.bias_max)).map_err(|e| e.to_string())));
}
}
(by_attempt, accepted_at, exhausted, notes, rows)
}));
}
hs.into_iter().map(|h| h.join().unwrap()).collect()
});
let mut by_attempt = vec![[0u64; CLASSES]; MAX_ATTEMPTS_V4 as usize + 1];
let mut accepted_at = vec![0u64; MAX_ATTEMPTS_V4 as usize + 1];
let mut exhausted = 0u64;
let mut rows = Vec::new();
for (b, acc, ex, notes, r) in parts {
for a in 0..b.len() { for c in 0..CLASSES { by_attempt[a][c] += b[a][c]; } accepted_at[a] += acc[a]; }
exhausted += ex;
for n in notes { println!("{n}"); }
rows.extend(r);
}
let n = rows.len() as u64 + exhausted;
let total_rej: [u64; CLASSES] = { let mut t = [0u64; CLASSES]; for a in &by_attempt { for c in 0..CLASSES { t[c] += a[c]; } } t };
let rejections: u64 = total_rej.iter().sum();
println!("attempts: {n} seeds in {:.0} s; {rejections} rejected candidates, {} accepted, {exhausted} exhausted (cap {})", t0.elapsed().as_secs_f64(), rows.len(), MAX_ATTEMPTS_V4);
println!("rejection by part over all candidates: {}", NAMES.iter().zip(total_rej.iter()).map(|(nm, c)| format!("{nm}={c} ({:.1}%)", *c as f64 * 100.0 / rejections.max(1) as f64)).collect::<Vec<_>>().join(" "));
let max_a = accepted_at.iter().rposition(|&c| c > 0).unwrap_or(0);
println!("accepted-attempt histogram 0..{max_a}: {:?}", &accepted_at[..=max_a]);
for a in 0..=max_a.min(3) {
let tot: u64 = by_attempt[a].iter().sum::<u64>() + accepted_at[a];
println!("attempt {a}: {tot} candidates, rejected {} ({:.1}%): {}", by_attempt[a].iter().sum::<u64>(), by_attempt[a].iter().sum::<u64>() as f64 * 100.0 / tot.max(1) as f64, NAMES.iter().zip(by_attempt[a].iter()).filter(|(_, c)| **c > 0).map(|(nm, c)| format!("{nm}={c}")).collect::<Vec<_>>().join(" "));
}
let mean_a = accepted_at.iter().enumerate().map(|(a, &c)| a as f64 * c as f64).sum::<f64>() / rows.len().max(1) as f64;
let p_rej = rejections as f64 / (rejections + rows.len() as u64) as f64;
println!("mean accepted attempt {mean_a:.3}; per-candidate rejection probability {p_rej:.4}; P(256 consecutive rejections) if independent = {:.3e}", p_rej.powi(256));
if rows.len() > 0 {
let dm: Vec<f64> = rows.iter().map(|r| r.3).collect();
println!("closed-form distinct-item mean of accepted programs: mean {:.4} min {:.4}", dm.iter().sum::<f64>() / dm.len() as f64, dm.iter().cloned().fold(f64::MAX, f64::min));
}
if !out.is_empty() {
let mut f = std::fs::File::create(&out).unwrap();
writeln!(f, "# seed accepted_attempt program_id distinct_mean").unwrap();
for (k, a, id, d) in &rows { writeln!(f, "{k} {a} {id:016x} {d:.5}").unwrap(); }
println!("wrote {out}");
}
println!("attempts DONE");
}

View file

@ -15,3 +15,6 @@ docs/analysis/ci-failures-2026-10-06.md
# 7 October 2026: the last research round (the mission lanes and the closed list): internal research written for the # 7 October 2026: the last research round (the mission lanes and the closed list): internal research written for the
# owner, quoting his words and the operations record; the public spec mirror carries none of it # owner, quoting his words and the operations record; the public spec mirror carries none of it
docs/analysis/mission docs/analysis/mission
# 7 October 2026: the adversarial cryptanalysis lanes (internal adversarial pass, not an independent review): research
# written for the owner with box operations, run logs and clock readings; the public spec mirror carries none of it
docs/analysis/cryptanalysis