igneum/docs/analysis/attack-pass/f8-uniform.md

25 KiB

F8. Uniformity censuses of the class v4 derivation

Attack-pass row F8 (docs/plans/cryptanalysis.md section 4.2; the pass record docs/analysis/attack-pass-2026-10.md). Run 7 October 2026, 08:13 to 09:3x UTC (09:13 to 10:3x UK) on igneum-build-1. Verdict: FINDING (AP-F8-1 below). The line-index census is a PASS at its full sample size; the cross-hash item histogram is not uniform, and the cause is in the base program, inside the acceptance rule's blind spot.

1. Target

Item Value
Commit igneum-pow at 924288d1 (attack-pass); the box built HEAD b2a411d1, whose igneum-pow is byte-identical (git diff --stat 924288d1 HEAD -- igneum-pow is empty)
Class --program-class v4: V4_CLASS = mx8+sh256x27, generator 4, mixer x8, the era layout drawn inside the class, the shadow block of 256 instructions x 27 reps
Line index proto-metal/MEMHARD.md section 1.6: a = s[0] AND 0x003fffff, 4,194,304 lines of 64 B, 8 dependent reads per item (memhard.rs derive_items_mask, cache.line_const(s[0]))
Item index verify.rs load_index: y = rotl(x * M, R), the site's window (y & (MASK >> k)) | off, then Layout::split removes the four interleave bits; 2^24 items at the 2^28-word dataset
Reads per hash 128 loads (16 sites x 8 iterations), so up to 1,024 cache lines per hash and 32,768 per warp. The spec's analytic bound of 832 lines per hash (docs/spec/01-lottery-hash.md line 347, 104 loads x 8) predates generator 2's fixed 16 load slots; the current bound is 128 x 8 = 1,024
Prior figures chip-model-v3.md section 1: "median 128.00 distinct" items per hash (the 20,000-program census); weak-program-census-2026-10-03.md line 291: 127.7 distinct addresses per hash under the proposed generator
Day the devnet pack's day, bind::day_bytes(20730) (2026-10-04), day 0 of the growth schedule: a 2^26-word cache, a 2^28-word dataset. Census 1 uses days 20730 to 20745
Programs p1 = the devnet epoch-0 derivation (epoch seed and era seed both the genesis hash edc4fa84...fb07, program id c120d7963abdcd96, attempt 0); p2 and p3 = chain-shaped seeds from tag strings (section 4), attempts 1 and 0

2. Method and harness

Harness: tools/attack/f8-uniform/ (crate attack-f8, a path dependency on igneum-pow, nothing in the library modified). Built on the box through tools/build-remote.sh: sha256 590668...f913 for the firings of 2.1, ef8042...11b2 for sections 3, 4.1 and the first item runs (flat null, log/c-*, log/d-*), 890955...fbd3 for the window-model runs and the seed census (log/e-*). The committed source carries one later label fix (the "uniform-on-window" entropy reference in the per-site line is 16 - k_off bits; the 09:04 UTC logs print 16 - 2 k_off). Box scratch /srv/builds/igneum-wt-attack/target-attack-f8/ (the name target-* is what the box's checkout clean spared at the time; the fix at b92a5fd4 now also spares attack-*). Every run: nice -n 10 taskset -c 22-27,70-75, 12 threads, under flock -s /srv/builds/_locks/measure in chunks under 3 minutes each (the longest, phase D, under 25 minutes).

Two mirrors, each trusted only while it agrees with the library bit for bit:

Mirror What it records Agreement check Result
derive_traced: memhard::derive_items_mask instruction for instruction (mixer, round_key_mult, cache.line from the library), the line index of every round kept 8 line indices per item every item of every day also derived by the library's derive_items and compared on all 16 words 0 mismatches on 268,435,456 items (section 3) and on 16,777,216 items per table build (section 4)
Mirror::warp: verify::interpret_warp_init for the class v4 op set, dataset words from a table of the day's 2^24 items, the item index and the source register of every load kept 128 item indices per lane, the source value's saturation per position the 32 hashes of warp 0 to 63 and of every 997th warp compared with Epoch::hash_warp 0 mismatches on 95 warps per program (section 4)

Three censuses:

  1. lines: all 2^24 items of each of 16 consecutive day keys (2^28 item derivations, 2^31 line reads), the full 2^22-line histogram per round and pooled, the 2^16-bucket histogram (64 lines, one chained segment per bucket), a uniform SplitMix64 control of the same size.
  2. warps: 10^6 nonces (31,250 warps) of each of three programs: distinct lines and items per hash and per warp, the cross-hash item histogram, per-position diagnostics, an attribution pass from the hottest items back to the load positions that read them.
  3. warps at 2^26 nonces on p1: the one-epoch cross-hash item histogram at 512 expected reads per item.

The tests, defined before the runs:

  • 6-sigma test: the largest (and smallest) bucket of a histogram within 6 sigma of its expectation, sigma = sqrt(expectation). The gate's bucket is the 64-line segment for lines and the 64-item bucket for items. The full-resolution histograms are reported beside a uniform control of the same size, because at a small mean the Poisson tail puts the maximum of 4 million bins above 6 sigma by chance (control at mean 8: +6.72 sigma; at mean 32: +5.83; at mean 512: +5.61).
  • Hot-set test (F8's definition, written for F9's reuse): sort items by read count; S_f = the share of all reads on the top-f fraction of items, for f in {0.1%, 0.5%, 1%}; E_f = the same share on a control of the same size drawn from the design's own null (flat uniform for lines; the window-weighted null for items, section 4.2); the excess X_f = S_f - E_f. A hot set exists at f when X_f >= f: after the chance excess is removed, the top f of items capture at least one extra proportional share, which is what an on-die copy of f of the items would have to win to matter. X_f / f is printed as the gain in proportional shares. The acceptance-style form of the same metric (for rule (c)'s 2,048 evaluations): per load position, the largest count of one masked address, and the count of saturated (0 or 2^32 - 1) source values.

2.1 The harness fires (known-fail and known-pass)

Plant What it does 6-sigma test Hot-set test Log
quarter-lines line index masked to a quarter of its range buckets64 largest +75.97 sigma (2,231 at mean 512), smallest -22.63: FLAGGED X_1% = +3.54% (S 5.60% vs control 2.06%), X/f = 3.5 at every f: FLAGGED log/a1-lines-quarter.log
half-lines line index masked to a half buckets64 largest +29.26 sigma: FLAGGED X_1% = +1.25%, X/f = 1.25: FLAGGED log/a2-lines-half.log
const-item one constant item at the first load site (1/16 of reads) items buckets64 largest +92,682 sigma: FLAGGED X_0.1% = +6.38%, X/f = 63.8: FLAGGED log/a4-warps-const-item.log
none, 2^22 items, one day the real derivation at a small size buckets64 largest +4.42 sigma, smallest -4.51: within 6 sigma (control +4.33) X_f = -0.0004%, -0.0006%, -0.0010%: clear log/a3-lines-pass-small.log

Both tests fire on every plant and neither fires on the real line derivation. Log paths are under /srv/builds/igneum-wt-attack/target-attack-f8/.

3. Census 1: the line index over 2^28 derivations (PASS)

Sample reached: 16 days x 2^24 items = 268,435,456 item derivations, 2,147,483,648 line reads into 4,194,304 lines (512 expected per line, 32,768 per 64-line segment). Mirror mismatches against derive_items: 0 of 268,435,456. Log: log/b-lines-16days.log; histograms out/lines-d20730-n16-i24-none-buckets64.txt (65,536 rows) and out/lines-d20730-n16-i24-none-full.u32le (4,194,304 x u32).

Histogram Bins Expected Largest Sigma Smallest Sigma chi2/dof Top 1% share
Pooled, 64-line buckets (the gate) 65,536 32,768 33,645 +4.84 31,998 -4.25 1.00226 1.01427%
Pooled, full 2^22 lines 4,194,304 512 639 +5.61 402 -4.86 0.99937 1.11979%
Control, 64-line buckets 65,536 32,768 33,524 +4.18 31,960 -4.46 0.99930 1.01426%
Control, full 2^22 lines 4,194,304 512 639 +5.61 408 -4.60 0.99952 1.11956%
Per round 0 to 7, full, pooled (64 per line) 4,194,304 64 107 to 113 +5.38 to +6.12 26 to 29 -4.75 to -4.38 0.99855 to 1.00062 1.3483% to 1.3488%
One day (20730), 64-line buckets 65,536 2,048 2,291 +5.37 1,859 -4.18 0.99985 1.05826%
One day, control, 64-line buckets 65,536 2,048 2,250 +4.46 1,874 -3.84 1.00377 1.05901%

Per day, the gate bucket's largest value ran +4.00 to +5.37 sigma on all 16 days (control +4.46), every day within 6 sigma. Hot-set test on the pooled lines: X_0.1% = -0.00002%, X_0.5% = +0.00010%, X_1% = +0.00023% (X/f under 0.0003): clear. Round 0, whose input is the sequential item index through the init t * MUL[i] + RC[i] and eight mixer applications, is as flat as rounds 1 to 7 (chi2/dof 0.99926; its +5.50 sigma maximum is below the control's +5.61 at the pooled size). Round 5's +6.12 sigma at mean 64 is one bin of 4 million at a Poisson tail where the control at mean 8 reached +6.72; its chi2/dof is 0.99855.

Gate line: the largest bucket is within 6 sigma of uniform (+4.84 on the 64-line buckets, +5.61 on the full 2^22 lines, both at or below the control), chi2/dof 0.99937, no hot set. PASS at 2^28 derivations.

4. Census 2 and 3: distinct lines per hash and warp, and the cross-hash item histogram

Setup per program: the day's 16,777,216 items derived once into a table with their 8 lines (6 to 9 s on 12 threads, 0 mismatches against derive_items on every item), then the warps interpreted from the table at 2.7 to 3.2 ms per warp per thread. Logs: log/c-warps-p{1,2,3}-1e6.log (first run, flat null) and log/e-warps-p{1,2,3}-1e6.log (windowed null, section 4.2); distributions out/warps-<program>-d20730-n1000000-none-distinct.txt, item histograms ...-items.u32le (16,777,216 x u32), per-position tables ...-positions.txt.

4.1 Distinct lines and items per hash and per warp (10^6 nonces each)

Program Epoch seed / era seed Lines per hash min / p1 / median / max / mean Items per hash min / median / mean Lines per warp min / median / max / mean Items per warp min / median / mean
p1 c120d7963abdcd96 (devnet epoch 0) genesis / genesis 1,008 / 1,023 / 1,024 / 1,024 / 1,023.867 126 / 128 / 127.9989 32,579 / 32,636 / 32,680 / 32,635.84 4,090 / 4,096 / 4,095.41
p2 82f0696f823e9c65 59cef1aa...bfdfa / 9cba001f...1f69 1,014 / 1,023 / 1,024 / 1,024 / 1,023.871 127 / 128 / 127.9995 32,580 / 32,637 / 32,684 / 32,636.08 4,091 / 4,096 / 4,095.48
p3 e282eed7d47e425e c54e2ddd...c95d / 1b04f607...b58a 999 / 1,016 / 1,024 / 1,024 / 1,023.600 125 / 128 / 127.9656 32,276 / 32,481 / 32,601 / 32,480.32 4,050 / 4,076 / 4,075.85
Uniform expectation 1,023.875 of 1,024 127.9995 of 128 32,640.3 of 32,768 4,095.50 of 4,096

Per hash, every program reads its 128 items and 1,024 lines as the design intends (p1 and p2 at the uniform expectation; p3 a shade under, 127.97 items, which is the same site-15 effect as the finding below: the saturated site repeats an item inside a hash 3 times in 100). Per warp, 32 lanes read 32,636 distinct lines of 2^22, a 2 MiB working set of cache lines and 256 KiB of dataset items, within 0.01% of uniform on p1 and p2.

4.2 The cross-hash item histogram and the window layer

The era layout's window layer (docs/plans/era-layout.md section 1.4, layer 8) makes each load site read an aligned half or quarter of the dataset with probability 2/3. The per-site item distribution is therefore not flat by design (the diagnostic's "worst bit" reads P(1) = 1.0000 or 0.0000 at every windowed site: the fixed top bits), and the summed item histogram has density steps between quarters. For p1 the 16 windows (site:shrink:offset 7:2:1 8:1:1 9:1:1 10:1:1 11:0:0 13:1:1 29:0:0 30:2:2 31:1:1 44:1:1 46:2:0 47:0:0 52:0:0 56:0:0 58:2:0 63:1:1) give expected reads per item by quarter of 3.25 : 2.25 : 5.75 : 4.75 in sixteenths of the flat value. Against a flat uniform the 64-item buckets of p2 (a program without the finding) read +10.03 and -9.06 sigma, which is the window layer and not a flaw. The item tests are therefore judged against the window-weighted null: the expected count of every item from the program's 16 windows, and a control that draws each read from a uniformly chosen site's window. A chip gains nothing from the window steps: the union of the windows is the whole dataset every hour (era-layout.md section 7), the floor window is 2^26 words (256 MiB), and which quarter is dense changes with the program.

The window model (reproducible by the firms)

For load site s with window draw (k_s, o_s) at the 2^28-word dataset: k = min(k_s, 28 - 26), the word window is [o_s << (28 - k), (o_s + 1) << (28 - k)); the item window is [o_s << (24 - k), (o_s + 1) << (24 - k)) of 2^(24 - k) items (the four interleave positions all lie below bit 16, so the top bits of the word index are the top bits of the item index). The expected reads per item is E[t] = sum over sites s with t in window_s of N x 8 / 2^(24 - k_s) for N nonces (8 iterations per site), a density constant on each quarter of the item space. The windowed control draws each of the N x 128 reads as (site = read index mod 16, item uniform on that site's window). Both controls are drawn from SplitMix64 with a fixed seed. The tests on items are run against E[t] (chi-square, sigma of the largest and smallest 64-item bucket) and against the windowed control (the top-f shares); the flat uniform numbers are kept beside them as what an auditor sees first.

Results, 10^6 nonces per program, 128,000,000 reads (log/e-warps-p{1,2,3}-1e6.log)

Program Windows (k_off:offset per site) Quarter densities (reads per item) Buckets64 largest sigma, windowed (control) chi2/dof windowed (control) Top 0.1% share: real / window control / flat control Ratio to window control at 0.1% (gate 1.2x) Ratio to flat control Hot set (X_f >= f)
p1 devnet epoch 0 2:1 1:1 1:1 1:1 0 1:1 0 2:2 1:1 1:1 2:0 0 0 0 2:0 1:1 6.20 / 4.29 / 10.97 / 9.06 +45.77 (+4.95) 1.2336 (0.9981) 0.5458% / 0.2891% / 0.2429% 1.888x BEYOND 2.247x yes at 0.1% (X/f 2.57) and 0.5% (1.20); not at 1% (0.46)
p2 2:0 1:0 0 0 2:3 2:2 1:0 0 2:3 0 0 0 0 1:1 2:0 0 9.54 / 5.72 / 6.68 / 8.58 +4.59 (+4.64) 1.0061 (0.9986) 0.2716% / 0.2639% / 0.2429% 1.029x within 1.118x no (X/f 0.08, 0.05, 0.05)
p3 1:0 0 0 2:2 0 0 1:0 1:0 1:0 2:2 2:2 1:1 0 0 0 0 7.63 / 7.63 / 10.49 / 4.77 +12,245.66 (+5.06) 907.67 (0.9993) 4.5954% / 0.2792% / 0.2433% 16.46x BEYOND 18.92x yes at every f (X/f 43.2, 9.9, 5.0)

p2 is what the class is designed to be: against the window model its largest bucket is +4.59 sigma (the control +4.64), chi2/dof 1.006, the top 0.1% of items hold 1.029x their window-model share, and the flat-control ratio of 1.118x is the window layer. p1 and p3 are the finding (section 5). The one-epoch histogram at 2^26 nonces (8,589,934,592 reads, 512 per item, log/d-warps-p1-2e26.log, flat null): p1's top 0.1% hold 0.5199% of reads against 0.1152% flat control (X/f 4.05), the top 1% 2.4946% against 1.1198% (X/f 1.37), item 0xca5b92 78,479 reads at a mean of 512, and site 15 feeds 6.37% of its reads into the top 0.1% in each of the 8 iterations; the excess grows with N as the control's chance excess shrinks, which is the signature of a structural skew. Distinct lines and items per hash and per warp at 2^26 nonces: 1,023.866 / 127.9989 / 32,635.6 / 4,095.41, unchanged from 10^6.

5. AP-F8-1: a saturated load source makes a cross-hash hot set (FINDING)

What: an accepted class v4 program can read one load site from a register whose last writes after its last injecting write are or (and, mildly, mul), so the site's address has fewer than 32 bits of entropy across nonces and the same items are read by many hashes. The per-hash figures (128 distinct items, 1,024 lines) stay intact; the cross-hash item histogram does not. It is not the window layer (p2 shows the window layer alone is clean against its model) and not the shadow block (iteration 0's load, which runs before any shadow block, is as hot as iterations 1 to 7: p1 6.372% vs 6.371% to 6.378%; p3 71.9% vs 72.4% to 72.6%).

Where it hides from rule (c) (accept.rs, 2,048 evaluations of the base program): the tests are constant bits in FINAL register values, one address in ALL 32 lanes of a unit, saturated FINAL values, output-bit bias, and distinct addresses WITHIN a hash. A site whose address is concentrated across hashes but refreshed before the end of the iteration passes every one. Rule (a) accepts any write, or included, as the refresh between two loads from the same register (check_stale_loads); Op::injects (add, sub, xor, mad, shfl, load) is only used by rule (b), once per register per program.

The index derivation at the hot site (the "writers back to the last injecting one" lines of log/e-warps-p*.log):

Program Hot site Source Writes after the last injecting write Site's reads into the top 0.1% of items (flat expectation) Index entropy, 256-item buckets (uniform on window) Saturated source (x = 0 or 2^32 - 1) Most repeated address at one position in 2,048 evaluations (uniform: 1 to 2)
p3 site 15, instr 62 r5 load@17 then or@19, or@30 72.43% (0.10%) 13.411 bits (16) 1.368% 44 of 2,048; 32 saturated
p1 site 15, instr 63 r6 add@51 then rotl@53, or@61 6.93% (0.11%) 14.985 bits (15) 0.005% 2 of 2,048; 0 saturated
p2 (clean) every site injecting, or bijective (rotl), or mul/mulhi 0.41% to 0.97% (0.20%; the window densities) 13.999 / 14.997 / 15.994 bits (14 / 15 / 16) 0.000% 2 of 2,048; 0 saturated

In p3 two ors on r5 after its load make the source 1 with probability 7/8 per bit; x = 2^32 - 1 in 1.37% of evaluations and the images of the near-saturated values under the stride (y = rotl(x * M, R), 256 x-values per item) pile onto a few items: 0xffdf69 takes 213,913 of the site's 8,000,000 reads (2.67%), the top 0.1% of items 72.4%, and 4.6% of ALL reads of the hash land on 0.1% of the items. In p1 one or after rotl(add) gives 3/4 per bit on the ORed positions: no saturation to speak of (0.005%), but 6.9% of the site's reads on 0.11% of the items (the hot items share the low 20 bits 5b92: 0xca5b92, 0x8a5b92, 0xaa5b92, 0xba5b92, 0x825b92, 0xe65b92, 0x985b92), a 2.6x proportional excess at f = 0.1%. p2's mul sites (10, 13: mul after a load or a shuffle) read 0.65% and 0.70% into the top 0.1% against 0.41% and 0.48% for their window class (an even multiplier zeroes low bits; the hot items 0xd6a680, 0xe44400, 0xd25600 end in zero bits), a mild effect that the window-model ratio (1.029x) absorbs.

How common (the seed census, 64 chain-shaped programs p4 to p67, 262,144 nonces each, log/e-seed-census-4-67.log, out/seed-census-d20730-n262144-p4-67.txt): CENSUS-LINE

Reproduction: attack-f8 warps --program 3 --nonces 1000000 --diag 1 (or --program 1); the acceptance-style numbers come from the same run's "acceptance-style" line. The program is Epoch::chain_program(epoch_seed, Some(era), ProgramClass::V4, label) with the seeds of section 4.1.

Proposed fix (not applied; igneum-pow untouched, the Counter ASIC lane re-gates on ca3-v4-uniform with this harness):

  1. Rule (a'), static: between the last injecting write of a load's source register and the load (cyclically), no or and no mul writes that register; rotl, rotr and mulhi may (bijective, or measured flat: p2 site 15 reads mulhi after add at 1.00x). This rejects p1 and p3 at draw time and costs nothing at run time. Programs rejected are redrawn as today (MAX_ATTEMPTS 32); the census gives the rejection rate.
  2. Rule (c'), dynamic, the same 2,048 evaluations: no load site reads a saturated source (0 or 2^32 - 1) in more than 2 evaluations, and no address repeats more than 4 times at one position (uniform expectation 1 to 2; p3 shows 44 and 32). This catches the strong class only; p1's class needs about 2^16 evaluations to show at a site (65,536 nonces: largest item count 67 at a mean of 0.5), so (a') is the rule that closes it and (c') is the check that fails loudly if (a') is ever loosened.
  3. Packs re-cut for the seeds the new rule rejects (the devnet epoch-0 program p1 is one of them: its site 15 is or@61), with the gate pack ids re-pinned; the chain's own epochs redraw automatically.

Reuse for F9: the hot-set metric (section 2) on the per-program item histogram at 2^18 nonces, and the acceptance-style pair (most repeated address at a position, saturated sources at a position) at 2,048 evaluations, are both emitted by warps --programs a..b; a header-grinding search that steers a program to a hot set would show as ratio-to-window-model above 1.2x at f = 0.1%.

6. Consequences per tier

Number What it means Per tier
Line index uniform at 2^28 derivations (largest segment +4.84 sigma, chi2/dof 0.99937) the 256 MiB cache has no hot segment: a chip or a card cannot serve the 8 dependent reads of an item from a cache smaller than the whole 256 MiB (the floor window of era-layout.md) no change for any card; the verifier's cache stays 256 MiB in RAM on every node
Distinct lines per hash 1,023.87 of 1,024, items 127.999 of 128 (p1, p2); per warp 32,636 lines, 4,095 items the per-hash working set is 64 KiB of cache lines and 8 KiB of items, per warp 2 MiB of lines and 256 KiB of items; the item-derivation chip's "128 items per hash" input (chip-model-v3.md) stands the 8 GB card and up: unchanged; the recompute chip pays 128 derivations per hash, as modelled
p3-class programs: 4.6% of all dataset reads on 0.1% of items (1 MiB of a 1 GiB dataset); p1-class: 0.59% on 0.11% a stored-dataset chip with 1 MiB of on-die SRAM serves 4.6% of its reads without touching DRAM on such an epoch; a GPU's L2 (96 MiB on the 5090, 64 MB Infinity Cache on the 9070 XT, vendor figures) holds the same 1 MiB, so both sides gain the same 4.6% of reads and the chip's edge from it is about 0 (the per-joule edge of evidence.md row 17 is a DRAM-read figure; a 4.6% read saving on both sides moves it by under 5% on such epochs). The recompute chip (f = 0, SRAM cache) caches the derived hot items and skips up to 4.6% of its 128 derivations per hash on such epochs, a 4.8% rate gain on those epochs only home cards 8 to 32 GB, rigs, pools: no action; a few percent of epochs run a few percent faster for everyone with an L2. The verifier: MemhardCpu::fetch dedupes within a fetch only, so no change. The chip model: the headline 2.1x at k = 1 moves by under 5% on affected epochs and 0 on others; the fix below returns it to 0 everywhere
The acceptance rule's blind spot (cross-hash concentration at one site) a program class property, not a day or era property: the same seed is hot on every day and under every era, so a chip or a pool that selects epochs cannot gain more than the epoch's own 4.6%; but the public claim "the item map is uniform per program up to the window layer" is false for the affected fraction of seeds until rule (a') lands the fix is a generator rule plus packs re-cut: a class change under the 95% signalling rule if it lands after the flip, a plain re-cut if it lands in the class v4 cut itself (the lane's call)

7. Gate line and verdict

Gate (plan 4.2 F8, the same as 1.4 (4)) Result Status
The largest bucket within 6 sigma of uniform on the stated sample sizes (line index, 2^28 derivations) +4.84 sigma on 64-line segments, +5.61 on 2^22 lines (control +4.18 / +5.61), chi2/dof 0.99937 PASS
The item distribution within 6 sigma of uniform (against the window model, the design's own null) p2 +4.59 sigma (control +4.64); p1 +45.77; p3 +12,245.66 FAIL on p1 and p3
No hot set under 1% of items among passing seeds (10^6 nonces on three programs; the 64-seed census at 2^18) p2 none; p1 top 0.1% at 1.888x the window model (2.247x flat), X/f 2.57; p3 16.46x (18.92x flat), X/f 43.2; census: 31 of 64 seeds over 1.2x of the window model, 23 with a hot item FAIL
The Counter ASIC lane's record gate: top 0.1% within 1.2x of the window-model control on every seed p2 1.029x; p1 1.888x; p3 16.46x; census: 31 of 64 seeds over 1.2x (median 1.17x, p90 2.70x, max 13.09x on p31) FAIL

Verdict: FINDING (AP-F8-1). The line index passes at 2^28 derivations. The cross-hash item histogram fails the hot-set gate on 2 of the 3 named programs (one of them the live devnet epoch-0 program) and on 31 of 64 seeds (48 percent) of of the 64-seed census, from or (and mildly mul) writes on a load's source register after its last injecting write, outside every test of rule (c). What it moves: not the mask or the fold (the derivation is uniform) but the acceptance rule, (a') and (c') above, and the packs re-cut. Ownership: the Counter ASIC lane (generator and rule), re-gated with this harness on the fixed branch; the row reads FIXED-AND-PASSED when every seed of the census passes both the hot-set test and the 1.2x gate under the new rule.

Sample sizes reached: 2^28 derivations (lines); 10^6 nonces on three programs (distinct lines, hot set); one epoch at 2^26 nonces (cross-hash histogram); 64 seeds at 2^18 nonces (the census).

Times UTC in the logs; the runs ran 08:13 to 09:2x UTC on 7 October 2026 (09:13 to 10:2x UK).