Counter ASIC 3.0 gates (hash): the gate directory (hash-gates.md, G1 Mac, G2 Mac, G3 and verifier JSON) and the bench-log entry; the RTX 5090 G1 rows pending the collected job.log

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
igneum-labs 2026-10-06 16:07:55 +00:00
parent 4d660ceb0a
commit fa857683be
6 changed files with 477 additions and 0 deletions

View file

@ -2163,3 +2163,38 @@ Consequences per tier, Mac rows (the hash is latency-bound by 128 dependent DRAM
| AMD user (RX 9070 XT, 16 GB) | owed: no row today | the PC 1 job when the desk is free |
| A rig or a pool user | the same per-card figures; no family changes the dependent-read bound | nothing until a family is live |
| A chip | every candidate but `mm8` is a 32-bit datapath structure (barrel shifter, byte crossbar, popcount tree, 32-lane shuffle crossbar: `docs/plans/counter-asic-3-reserve.md` section 3 names them with approximate areas); none is licensable as a block the way an int8 matrix unit is | the reserve order of that document |
## 6 October 2026, Counter ASIC 3.0 gate run, the hash side
Branch `ca3-v4-hash`, worker "v4-hash", on `ca3-coord` 3213ee9. The candidate class v4 `mx8+sh256x27` composed with the era as the chain composes it (`mx8-era<hex>+sh256x27`, generator 3), on the devnet epoch-0 and day seeds at the genesis era (`v4-devnet-epoch0`) and at the six test eras of 2.0 (`v4-era-0` to `v4-era-5`), with the class v3 control `mx8-devnet-epoch0` re-exported beside them (`proto-cuda/packs-ca3-v4/`). Gates G1, G2 and G3 of `docs/plans/counter-asic-2-rollout.md` section 7 and the pinned verifier benchmark; the evidence tables and one JSON per run in `docs/plans/counter-asic-3-gate/` (`hash-gates.md`). G4, G5 and G6 are the node's and the release's.
**G1, bit-exact (`with-lock.sh run`, 15:49:29 to 15:50:02Z, load 6.8 to 6.7).** `packbench --pack <dir> --batches 1 --batch-log2 24 --group 256` (Metal) and `igneum-bench-cl --bench-pack --pack <dir> --batches 1 --batch-log2 24` (Apple OpenCL), both built from this branch: on all eight packs the cache FNV 448274a57f508cbc PASS, the dataset head and last PASS, vectors 3 of 3 standalone and 3 of 3 in batch (Metal), 96 of 96 lanes (Apple OpenCL), and one fingerprint per pack across both harnesses. The control reproduces 2.0's 90f794dd556f7a3b (the harness fired on a known case).
| Pack | Class | Fingerprint 2^24 at base 0 (Metal = Apple OpenCL) | RTX 5090 (CUDA NVRTC, PC 2) | RX 9070 XT |
|---|---|---|---|---|
| mx8-devnet-epoch0 (control) | mx8-erad810f22d | 90f794dd556f7a3b | PENDING (collected job.log) | PC 1 job 1 |
| v4-devnet-epoch0 | mx8-erad810f22d+sh256x27 | f410c731b6bc2d31 | PENDING | PC 1 job 1 |
| v4-era-0 | mx8-erab2ed8a89+sh256x27 | b115c410e08be6ca | PENDING | PC 1 job 1 |
| v4-era-1 | mx8-era676a17fc+sh256x27 | edc2b18fc67e9d1c | PENDING | PC 1 job 1 |
| v4-era-2 | mx8-era843155d7+sh256x27 | 604ed87109570559 | PENDING | PC 1 job 1 |
| v4-era-3 | mx8-erad6367bfe+sh256x27 | 9541e2a41dde2ee6 | PENDING | PC 1 job 1 |
| v4-era-4 | mx8-era4488f3ed+sh256x27 | a9ffa2b67bd2e366 | PENDING | PC 1 job 1 |
| v4-era-5 | mx8-eraf897c84e+sh256x27 | 1f34e9c465945249 | PENDING | PC 1 job 1 |
The PC 2 job (run-ca3-v4-gates-pc2-20261006, `tools/ca3-v4/pc2-v4-gates.ps1`, 15:52:23 to 15:52:49Z, exit 0, 26 s, the installed 0.3.11 `igneum-worker-cuda.exe` through NVRTC on each pack's own text, beside the app's miner, the prover untouched, no card switched off: bit-exactness is not load sensitive) ran G1 (`--bench --batches 5 --batch-log2 24`) and G2 on all eight packs in one job. The intake's report keeps the last 200 KB of job.log and the 8 x 1,024 G2 found lines filled it, so the G1 lines and four packs' G2 lines are in the full job.log, collected by collect-ca3-v4-joblog2-20261006; the rows close when it is read.
**G2, the verifier exact on 1,024 hashes per card (`with-lock.sh run`, 15:53:54 to 15:54:22Z, load 6.8 to 8.9).** One serve-mode job per card and pack, `job g2 00..01 ffffffffffffffff 0 1024 <epoch> <day> class=v3 era=<hex>` (Metal after `prepare <epoch> <day> <pack> class=v3 era=<hex>`), every nonce a found line, re-hashed with `igneum-pow hash-bound --prehash 00..01 --nonce 0 --count 1024` on the same pack (`--count` ported from ca2-era). Metal 1,024 of 1,024 on all eight packs; Apple OpenCL 1,024 of 1,024 on all eight; RTX 5090: v4-era-3, v4-era-4, v4-era-5 1,024 of 1,024 and v4-era-2 885 of 885 in the report's tail (the job counted 1,024 found on every pack whose count line survived), the other four packs in the collected log; RX 9070 XT: PC 1 job 1.
**G3, the soundness suite on the class.** `cargo test -j4 --release` in igneum-pow (`with-lock.sh build`, nice 19, cargo 1.99.0, 15:49:29 to 15:50:01Z, load 6.8): 59 + 7 + 4 + 19 + 7 = 96 of 96. The mixer harness now takes the class (`IGNEUM_MIXER_CLASS`) in the fuzz, the stats and the determinism test, an era to compose (`IGNEUM_MIXER_ERA=igneum-era-test/<n>`), and a shadow contract (S instructions, no load, every field in range, the base program equal to the class's without the shadow draw for draw); the edge test is the dataset's alone and takes no class. On `mx8+sh256x27` (15:54:25 to 15:55:39Z, load 9.1): fuzz 200 programs, 800 units, 200 in the top 256 nonces; stats avalanche 49.96 and 49.98 percent, worst bit z 2.65 and 3.56, 0 duplicates (v2 49.87 and 49.98, z 2.25 and 2.30); edge pass; determinism two builds equal and equal to the pinned `packs-ca3-shadow/sh256x27`. With era test/0 composed (50 programs, 200 units, 15:56:35 to 15:57:03Z, load 12.6): 4 of 4, avalanche 50.03 and 50.11, z 2.65 and 3.76. The GPU fuzz on the written packs (`packbench --batches 1 --batch-log2 9 --batch-base 4294967040`, every tenth on Apple OpenCL `--batch-log2 10`, `with-lock.sh run`, 15:55:42 to 15:58:21Z, load 11.3 to 12.3): Metal 200 of 200 and 50 of 50, Apple OpenCL 20 of 20 and 5 of 5. Known-failed case: the first era-composed run FAILED (1 failed, 15:55:42Z) on `assert_ne!(p.program_id(), base.program_id())`, which is the finding below.
**The verifier (`with-lock.sh measure`, one session, 15:54:27 to 15:54:31Z, load 9.1 to 9.4; one core on a loaded box, within 3 percent of the quiet figures).** `igneum-pow bench --seed igneum-genesis --day 2026-10-03 --warps 20 --class <c>`, two rounds:
| Class | ms per 32-lane warp, avg of 20 (round 1 / round 2) | Worst cold single run | Against x8 | 2019-class core by the 2.5x rule (approximate) | Gate |
|---|---|---|---|---|---|
| v2 | 0.655 / 0.648 | 0.674 | | about 1.6 ms | 10 ms |
| x8 (mx8) | 2.149 / 2.120 | 2.526 | 1 | about 5.4 ms | 10 ms |
| mx8+sh256x27 | 2.326 / 2.307 | 2.559 | +0.18 ms, +8.5 percent | about 5.8 ms (worst cold about 6.4) | 10 ms, about 4 ms spare |
Per tier: 73 microseconds per hash on an M5 Max core, so a pool checks about 13,700 shares per second per such core and about 5,500 per 2019-class core (approximate); a node on any tier verifies a warp inside the gate; no tier is slower than under x8 by more than 8.5 percent.
**Findings.** (1) Under the chain's path a generator-3 program's id is `program_id(3, seed, attempt)`, class-independent: the seven exported packs carry 73bcbfe8ccf988f1 with and without the shadow, and 50 of 50 fuzz seeds agree. A node and a miner could agree on the id while running different classes, and 2.0's G4 check `program_ids_differ_across_the_switch` would not fire across a v4 activation: the v4 seam (G4, G6) must stamp its own generator version or put the class in the id. The hash needs nothing for it; the cut must not go without it. (2) The report cap: a G2 playbook that prints 8,192 found lines loses its own G1 lines; the tooling fix is a found-lines file plus a count and digest on stdout, with a collect. Owed: AMD (PC 1 job 1), the 5090 G1 fingerprints and four G2 counts (the collected log), the 2019-class core (O-1.14).

View file

@ -0,0 +1,154 @@
{
"pass": true,
"gate": "G1 (Mac reference: Metal and Apple OpenCL)",
"class": "mx8+sh256x27 composed with the era (the chain shape)",
"checks": {
"metal_self_test_pass_on_every_pack": true,
"apple_opencl_check_pass_on_every_pack": true,
"metal_and_apple_opencl_fingerprints_equal_per_pack": true,
"v3_control_reproduces_the_2_0_fingerprint_90f794dd556f7a3b": true,
"eight_packs": true
},
"when_utc": "2026-10-06T15:49:29Z to 15:50:02Z",
"lock": "with-lock.sh run",
"load_average_start_end": [
"6.82 7.91 6.84",
"6.69 7.78 6.83"
],
"harness": {
"metal": "proto-metal/packbench.swift --pack <dir> --batches 1 --batch-log2 24 --group 256 (built from ca3-v4-hash)",
"apple_opencl": "proto-opencl/host.c --bench-pack --pack <dir> --batches 1 --batch-log2 24"
},
"packs": {
"mx8-devnet-epoch0": {
"class": "mx8-erad810f22d",
"metal": {
"vectors": "3/3",
"batch_vectors": "3/3",
"cache": "PASS",
"dataset": "PASS",
"fingerprint": "90f794dd556f7a3b",
"overall": "PASS"
},
"opencl": {
"check": "PASS",
"fingerprint": "90f794dd556f7a3b"
},
"metal_equals_opencl": true
},
"v4-devnet-epoch0": {
"class": "mx8-erad810f22d+sh256x27",
"metal": {
"vectors": "3/3",
"batch_vectors": "3/3",
"cache": "PASS",
"dataset": "PASS",
"fingerprint": "f410c731b6bc2d31",
"overall": "PASS"
},
"opencl": {
"check": "PASS",
"fingerprint": "f410c731b6bc2d31"
},
"metal_equals_opencl": true
},
"v4-era-0": {
"class": "mx8-erab2ed8a89+sh256x27",
"metal": {
"vectors": "3/3",
"batch_vectors": "3/3",
"cache": "PASS",
"dataset": "PASS",
"fingerprint": "b115c410e08be6ca",
"overall": "PASS"
},
"opencl": {
"check": "PASS",
"fingerprint": "b115c410e08be6ca"
},
"metal_equals_opencl": true
},
"v4-era-1": {
"class": "mx8-era676a17fc+sh256x27",
"metal": {
"vectors": "3/3",
"batch_vectors": "3/3",
"cache": "PASS",
"dataset": "PASS",
"fingerprint": "edc2b18fc67e9d1c",
"overall": "PASS"
},
"opencl": {
"check": "PASS",
"fingerprint": "edc2b18fc67e9d1c"
},
"metal_equals_opencl": true
},
"v4-era-2": {
"class": "mx8-era843155d7+sh256x27",
"metal": {
"vectors": "3/3",
"batch_vectors": "3/3",
"cache": "PASS",
"dataset": "PASS",
"fingerprint": "604ed87109570559",
"overall": "PASS"
},
"opencl": {
"check": "PASS",
"fingerprint": "604ed87109570559"
},
"metal_equals_opencl": true
},
"v4-era-3": {
"class": "mx8-erad6367bfe+sh256x27",
"metal": {
"vectors": "3/3",
"batch_vectors": "3/3",
"cache": "PASS",
"dataset": "PASS",
"fingerprint": "9541e2a41dde2ee6",
"overall": "PASS"
},
"opencl": {
"check": "PASS",
"fingerprint": "9541e2a41dde2ee6"
},
"metal_equals_opencl": true
},
"v4-era-4": {
"class": "mx8-era4488f3ed+sh256x27",
"metal": {
"vectors": "3/3",
"batch_vectors": "3/3",
"cache": "PASS",
"dataset": "PASS",
"fingerprint": "a9ffa2b67bd2e366",
"overall": "PASS"
},
"opencl": {
"check": "PASS",
"fingerprint": "a9ffa2b67bd2e366"
},
"metal_equals_opencl": true
},
"v4-era-5": {
"class": "mx8-eraf897c84e+sh256x27",
"metal": {
"vectors": "3/3",
"batch_vectors": "3/3",
"cache": "PASS",
"dataset": "PASS",
"fingerprint": "1f34e9c465945249",
"overall": "PASS"
},
"opencl": {
"check": "PASS",
"fingerprint": "1f34e9c465945249"
},
"metal_equals_opencl": true
}
},
"cache_fnv1a64": "448274a57f508cbc",
"command": "/private/tmp/claude-501/-Users-joshm/cd75457f-4858-4f86-9634-7481ee056b7b/scratchpad/v4/mac-g1.sh (scratchpad), log mac-g1.log"
}

View file

@ -0,0 +1,125 @@
{
"pass": true,
"gate": "G2 (the CPU verifier exact on 1,024 hashes per card: the Mac, Metal serve and Apple OpenCL serve)",
"checks": {
"metal_1024_of_1024_on_every_pack": true,
"apple_opencl_1024_of_1024_on_every_pack": true,
"verifier_lines_1024_per_pack": true,
"eight_packs": true
},
"when_utc": "2026-10-06T15:53:54Z to 15:54:22Z",
"lock": "with-lock.sh run",
"load_average_start_end": [
"6.83 7.54 6.98",
"8.92 7.94 7.14"
],
"job_line": "job g2 00..01 ffffffffffffffff 0 1024 <epoch> <day> class=v3 era=<hex> (Metal: after prepare <epoch> <day> <pack dir> class=v3 era=<hex>)",
"verifier": "igneum-pow hash-bound --prehash 00..01 --nonce 0 --count 1024 --epoch-hex <epoch> --day-hex <day> --class mx8+sh256x27 --era <n>:<hex> (the control: --program-class v3 --era-hex <hex>)",
"packs": {
"mx8-devnet-epoch0": {
"metal": {
"found": 1024,
"equal": 1024,
"nonces_0_to_1023": true
},
"opencl": {
"found": 1024,
"equal": 1024,
"nonces_0_to_1023": true
},
"rust_lines": 1024
},
"v4-devnet-epoch0": {
"metal": {
"found": 1024,
"equal": 1024,
"nonces_0_to_1023": true
},
"opencl": {
"found": 1024,
"equal": 1024,
"nonces_0_to_1023": true
},
"rust_lines": 1024
},
"v4-era-0": {
"metal": {
"found": 1024,
"equal": 1024,
"nonces_0_to_1023": true
},
"opencl": {
"found": 1024,
"equal": 1024,
"nonces_0_to_1023": true
},
"rust_lines": 1024
},
"v4-era-1": {
"metal": {
"found": 1024,
"equal": 1024,
"nonces_0_to_1023": true
},
"opencl": {
"found": 1024,
"equal": 1024,
"nonces_0_to_1023": true
},
"rust_lines": 1024
},
"v4-era-2": {
"metal": {
"found": 1024,
"equal": 1024,
"nonces_0_to_1023": true
},
"opencl": {
"found": 1024,
"equal": 1024,
"nonces_0_to_1023": true
},
"rust_lines": 1024
},
"v4-era-3": {
"metal": {
"found": 1024,
"equal": 1024,
"nonces_0_to_1023": true
},
"opencl": {
"found": 1024,
"equal": 1024,
"nonces_0_to_1023": true
},
"rust_lines": 1024
},
"v4-era-4": {
"metal": {
"found": 1024,
"equal": 1024,
"nonces_0_to_1023": true
},
"opencl": {
"found": 1024,
"equal": 1024,
"nonces_0_to_1023": true
},
"rust_lines": 1024
},
"v4-era-5": {
"metal": {
"found": 1024,
"equal": 1024,
"nonces_0_to_1023": true
},
"opencl": {
"found": 1024,
"equal": 1024,
"nonces_0_to_1023": true
},
"rust_lines": 1024
}
},
"command": "/private/tmp/claude-501/-Users-joshm/cd75457f-4858-4f86-9634-7481ee056b7b/scratchpad/v4/mac-g2.sh, serve-g2.py (scratchpad), log mac-g2.log"
}

View file

@ -0,0 +1,64 @@
{
"pass": true,
"gate": "G3 (the generator soundness suite on the class)",
"checks": {
"crate_suite_96_of_96": true,
"fuzz_200_programs_800_units_on_mx8_sh256x27": true,
"fuzz_50_programs_200_units_with_era_test_0_composed": true,
"stats_avalanche_within_2_points_no_duplicates": true,
"edge_pass": true,
"determinism_two_builds_equal_and_equal_to_the_pinned_pack_sh256x27": true,
"metal_fuzz_200_of_200": true,
"apple_opencl_fuzz_20_of_20": true,
"metal_fuzz_era_50_of_50": true,
"apple_opencl_fuzz_era_5_of_5": true,
"harness_fired_on_a_known_failed_case": true
},
"crate_suite": {
"when_utc": "2026-10-06T15:49:29Z to 15:50:01Z",
"load_average": "6.82 7.91 6.84",
"command": "cargo test -j4 --release in igneum-pow under with-lock.sh build, nice 19, cargo 1.99.0",
"results": "59 (lib) + 0 (bin) + 7 (derive) + 4 (mixer, V3_CLASS) + 19 (packs) + 7 (scratch) + 0 (doc) = 96 passed, 0 failed"
},
"mixer_harness_on_the_class": {
"command": "IGNEUM_MIXER_CLASS=mx8+sh256x27 IGNEUM_MIXER_PACKS_OUT=<dir> cargo test -j4 --release --test mixer",
"when_utc": "2026-10-06T15:54:25Z to 15:55:39Z",
"load_average": "9.09 7.99 7.16",
"fuzz": "200 mx8+sh256x27 programs, 800 units on the CPU, 200 units in the top 256 nonces, the shadow contract on every program (256 instructions, no load, fields in range, the base program equal to mx8 without the shadow, the shadow in the program id)",
"stats": {
"igneum-genesis": {
"class": "avalanche 49.96 percent, worst bit z 2.65, 0 duplicates",
"v2": "49.87, z 2.25"
},
"igneum-genesis/stats1": {
"class": "49.98, z 3.56",
"v2": "49.98, z 2.30"
}
},
"edge": "pass (the dataset alone: the shadow touches no dataset word)",
"determinism": "two builds equal, every emitted file equal to proto-cuda/packs-ca3-shadow/sh256x27",
"result": "4 passed, 0 failed, 63.22 s"
},
"mixer_harness_with_the_era_composed": {
"command": "IGNEUM_MIXER_FUZZ=50 IGNEUM_MIXER_CLASS=mx8+sh256x27 IGNEUM_MIXER_ERA=igneum-era-test/0 ... --test mixer",
"when_utc": "2026-10-06T15:56:35Z to 15:57:03Z",
"load_average": "12.58 9.62 7.92",
"fuzz": "50 mx8-erab2ed8a89+sh256x27 programs, 200 units, 50 in the top 256 nonces",
"stats": {
"igneum-genesis": "50.03 percent, z 2.65",
"igneum-genesis/stats1": "50.11 percent, z 3.76"
},
"determinism": "two builds equal (no pinned pack for the era class)",
"result": "4 passed, 0 failed, 18.44 s",
"finding": "every one of the 50 generator-3 programs has the same program id with and without the shadow: program_id(3, seed, attempt) is class-independent (generator.rs); the first run of this shape failed its assert_ne on exactly this (tests/mixer.rs:94, 15:55:39Z to 15:55:42Z, 1 failed) and the assertion now holds for generator-2 programs only and prints the generator-3 case: the v4 seam item for gates G4 and G6"
},
"gpu_fuzz": {
"command": "packbench --pack <dir> --batches 1 --batch-log2 9 --batch-base 4294967040 on every fuzz pack (4 units standalone and the top-256 unit inside a 512-nonce batch at base 4294967040); igneum-bench-cl --bench-pack --pack <dir> --batches 1 --batch-log2 10 on every tenth",
"lock": "with-lock.sh run",
"when_utc": "2026-10-06T15:55:42Z to 15:58:21Z",
"load_average": "11.33 8.86 7.56 to 12.26 10.51 8.47",
"mx8_sh256x27": "Metal 200 of 200 packs PASS, 0 FAIL; Apple OpenCL 20 of 20 PASS",
"era_composed": "Metal 50 of 50 PASS, 0 FAIL; Apple OpenCL 5 of 5 PASS",
"counting_rule": "a pack counts PASS only on an overall=PASS (Metal) or check=PASS (Apple OpenCL) RESULT line; a missing line is a FAIL"
}
}

View file

@ -0,0 +1,44 @@
{
"pass": true,
"gate": "the pinned verifier benchmark (ms per 32-lane warp, one M5 Max performance core, the Rust interpreter)",
"checks": {
"candidate_under_the_10_ms_gate_on_the_m5_max_core": true,
"candidate_under_the_10_ms_gate_on_a_2019_class_core_by_the_2_5x_rule_approximate": true,
"one_session_two_rounds_within_1_percent": true
},
"when_utc": "2026-10-06T15:54:27Z to 15:54:31Z",
"lock": "with-lock.sh measure (one session)",
"load_average_start_end": [
"9.09 7.99 7.16",
"9.40 8.07 7.20"
],
"note": "a loaded box (other agents test suites on other cores; this is one core, so the rows read within 3 percent of the quiet 5 and 6 October figures: v2 0.61, x8 2.08, the candidate 2.23)",
"command": "igneum-pow bench --seed igneum-genesis --day 2026-10-03 --warps 20 --class v2|mx8|mx8+sh256x27, two rounds, avg of 20 warps; worst cold = the largest of the three single cold runs",
"ms_per_warp": {
"v2": {
"round1": 0.655,
"round2": 0.648,
"worst_cold": 0.674
},
"mx8": {
"round1": 2.149,
"round2": 2.12,
"worst_cold": 2.526
},
"mx8+sh256x27": {
"round1": 2.326,
"round2": 2.307,
"worst_cold": 2.559
}
},
"gate_ms": 10,
"rule_2019_class": "2.5x, approximate (chip-model-v3.md section 3 item 1; the core is unmeasured, O-1.14)",
"ms_2019_class_approximate": {
"v2": 1.6,
"mx8": 5.4,
"mx8+sh256x27": 5.8,
"worst_cold_candidate": 6.4
},
"candidate_over_x8_ms": 0.18,
"candidate_over_x8_percent": 8.5
}

View file

@ -0,0 +1,55 @@
# Counter ASIC 3.0 gate run, the hash side (6 October 2026, 15:49 to 16:xx UTC)
Branch `ca3-v4-hash`, worker "v4-hash", on `ca3-coord` 3213ee9. The candidate: class v4 `mx8+sh256x27` (`docs/analysis/latency-shadow-2026-10-06.md`), composed with the era as the chain composes it inside class v3 (`LoadClass::era(mx8+sh256x27, E, &V3_ALLOWED)`, generator 3, the class name `mx8-era<hex>+sh256x27`). The packs are `proto-cuda/packs-ca3-v4/`: `v4-devnet-epoch0` (the devnet epoch-0 and day seeds, the era = the genesis epoch seed, label d810f22d, as 2.0's `mx8-devnet-epoch0`), `v4-era-0` to `v4-era-5` (the same seeds under the six test eras of 2.0's `packs-ca2-era`), and the class v3 control `mx8-devnet-epoch0` re-exported from this tree (its fingerprint must be 2.0's 90f794dd556f7a3b: the known-finished case every harness here is trusted on). The pack export takes the era (`--class mx8+sh256x27 --era <n>:<hex>`), so there is no era gap. The gates are those of `docs/plans/counter-asic-2-rollout.md` section 7 in its evidence shape; one JSON per gate run sits beside this file. Nothing is published to the devnet; no consensus parameter, manifest or override file is touched.
## The gates
| # | Gate | Evidence required | State |
|---|---|---|---|
| G1 | bit-exact on every vendor against the Mac reference | the 2^24 fingerprint at base nonce 0 and the self-test per pack and vendor; the vendors' fingerprints equal the Mac's | Apple GREEN (Metal and Apple OpenCL, 15:49:29 to 15:50:02Z, `with-lock.sh run`, load 6.8 at start, 6.7 at end): the eight packs' fingerprints equal across both Apple harnesses, cache FNV 448274a57f508cbc PASS, dataset PASS, vectors 3 of 3 standalone and 3 of 3 in batch (Metal), 96 of 96 lanes (Apple OpenCL): mx8-devnet-epoch0 90f794dd556f7a3b (= the 2.0 record), v4-devnet-epoch0 f410c731b6bc2d31, v4-era-0 b115c410e08be6ca, v4-era-1 edc2b18fc67e9d1c, v4-era-2 604ed87109570559, v4-era-3 9541e2a41dde2ee6, v4-era-4 a9ffa2b67bd2e366, v4-era-5 1f34e9c465945249 (`class-v4-20261006-1549Z-g1-mac.json`). NVIDIA (RTX 5090, CUDA NVRTC, the installed 0.3.11 worker, PC 2 job run-ca3-v4-gates-pc2-20261006, 15:52:23 to 15:52:49Z, exit 0, 26 s, beside the app's own miner): the self-test and fingerprint lines sit in the first part of the job's output, which the intake report cut (it keeps the last 200 KB of job.log, and the 8 x 1,024 G2 found lines filled it); the full job.log is being collected (collect-ca3-v4-joblog2-20261006), and the row is PENDING until it is read. What the tail already shows: the worker compiled and served every v4 pack through NVRTC (`ready cuda NVIDIA_GeForce_RTX_5090 ... dataset-log2 28`), and its 1,024 hashes on v4-era-3, v4-era-4 and v4-era-5 equal the Mac's verifier (section G2), which is bit-exactness on 3,072 nonces of three v4 packs. AMD: PC 1 job 1 | Apple GREEN; NVIDIA PENDING (the job ran clean; the fingerprint lines are in the collected log); AMD: PC 1 job 1 |
| G2 | the CPU verifier exact on 1,000 random hashes per card | one serve-mode job of 1,024 nonces at target ff..ff per card and pack (every nonce a found line), re-hashed on the Mac with `igneum-pow hash-bound --prehash 00..01 --count 1024` on the same pack (`--count` ported from branch ca2-era in this tree) | Mac GREEN (15:53:54 to 15:54:22Z, `with-lock.sh run`, load 6.8 to 8.9): Metal serve (`igneum-bench --serve --race off`, `prepare <epoch> <day> <pack> class=v3 era=<hex>` then the job line) 1,024 of 1,024 on all eight packs; Apple OpenCL serve (`igneum-bench-cl --serve --pack <dir>`) 1,024 of 1,024 on all eight packs; nonces 0 to 1,023 all present every time (`class-v4-20261006-1553Z-g2-mac.json`). RTX 5090 (the same PC 2 job as G1): the job's own count lines say 1,024 of 1,024 found on every pack whose lines survived the cut; of the found lines in the report's tail, v4-era-3 1,024 of 1,024, v4-era-4 1,024 of 1,024 and v4-era-5 1,024 of 1,024 equal the Mac's verifier, v4-era-2 885 of 885 (the tail starts inside that pack); mx8-devnet-epoch0, v4-devnet-epoch0, v4-era-0 and v4-era-1 are in the collected log, PENDING. RX 9070 XT: PC 1 job 1 | Mac GREEN; NVIDIA GREEN on three v4 packs (3 x 1,024 of 1,024) and 885 of 885 on a fourth, the other four packs PENDING the log; AMD: PC 1 job 1 |
| G3 | the generator soundness suite green on the class | `cargo test` in igneum-pow; the Metal fuzz, edge, stats and determinism runs on the class | GREEN. The crate suite 59 + 7 + 4 + 19 + 7 = 96 of 96, 0 failed (15:49:29 to 15:50:01Z, `with-lock.sh build`, nice 19, -j4, release, cargo 1.99.0, load 6.8). The mixer harness on `mx8+sh256x27` (`IGNEUM_MIXER_CLASS`, 15:54:25 to 15:55:39Z, load 9.1): fuzz 200 programs, 800 units on the CPU, 200 units in the top 256 nonces, the shadow contract on every program (256 instructions, no load, every field in range, the base program equal to mx8's without the shadow draw for draw, the shadow in the program id); stats avalanche 49.96 and 49.98 percent, worst bit z 2.65 and 3.56, 0 duplicates (v2 beside it: 49.87 and 49.98, z 2.25 and 2.30); edge pass; determinism two builds equal and every emitted file equal to the pinned `packs-ca3-shadow/sh256x27`. The same four tests with era test/0 composed (`IGNEUM_MIXER_ERA`, 50 programs, 200 units, 15:56:35 to 15:57:03Z, load 12.6): 4 of 4 pass, avalanche 50.03 and 50.11 percent, z 2.65 and 3.76. The GPU fuzz (`with-lock.sh run`, 15:55:42 to 15:58:21Z, load 11.3 to 12.3): Metal 200 of 200 packs PASS (800 standalone units and 200 units inside a 512-nonce batch at base 4,294,967,040), Apple OpenCL 20 of 20; with the era composed Metal 50 of 50, Apple OpenCL 5 of 5 (`class-v4-20261006-1554Z-g3.json`). The harness fired on a known-failed case before it was trusted: the first era-composed run FAILED its program-id assertion (1 failed, 15:55:42Z), the finding below | GREEN (96 of 96; 200 of 200 and 50 of 50 on Metal; 20 of 20 and 5 of 5 on Apple OpenCL; 4 of 4 CPU tests on the class and on the era-composed class) |
| Verifier | ms per 32-lane warp on one M5 Max core, v2, x8 and the candidate in ONE session, against the 10 ms gate | `igneum-pow bench --seed igneum-genesis --day 2026-10-03 --warps 20 --class <c>`, two rounds, `with-lock.sh measure` | GREEN (15:54:27 to 15:54:31Z, load 9.1 to 9.4: a loaded box, other agents' suites on other cores; one core, so the rows read within 3 percent of the quiet figures of 5 and 6 October): v2 0.655 / 0.648 ms (worst cold 0.674); x8 2.149 / 2.120 (worst cold 2.526); `mx8+sh256x27` 2.326 / 2.307 (worst cold 2.559), +0.18 ms (8.5 percent) over x8. The 2019-class row by the 2.5x rule (approximate, the core unmeasured, O-1.14): v2 about 1.6 ms, x8 about 5.4, the candidate about 5.8, worst cold about 6.4: under the 10 ms gate with about 4 ms spare (`class-v4-20261006-1554Z-verifier.json`) | GREEN (2.33 ms M5 Max core; about 5.8 ms 2019-class, approximate; gate 10 ms) |
G4, G5 and G6 are not this worker's (the node seam, the release build, the fork branch).
## Table of the fingerprints (2^24 outputs at base nonce 0, FNV-1a 64)
| Pack | Class | Metal (M5 Max) | Apple OpenCL (M5 Max) | CUDA NVRTC (RTX 5090) | OpenCL (RX 9070 XT) |
|---|---|---|---|---|---|
| mx8-devnet-epoch0 (class v3 control) | mx8-erad810f22d | 90f794dd556f7a3b | 90f794dd556f7a3b | PENDING (the collected log; 2.0 measured 90f794dd556f7a3b on this card) | PC 1 job 1 |
| v4-devnet-epoch0 | mx8-erad810f22d+sh256x27 | f410c731b6bc2d31 | f410c731b6bc2d31 | PENDING | PC 1 job 1 |
| v4-era-0 | mx8-erab2ed8a89+sh256x27 | b115c410e08be6ca | b115c410e08be6ca | PENDING | PC 1 job 1 |
| v4-era-1 | mx8-era676a17fc+sh256x27 | edc2b18fc67e9d1c | edc2b18fc67e9d1c | PENDING | PC 1 job 1 |
| v4-era-2 | mx8-era843155d7+sh256x27 | 604ed87109570559 | 604ed87109570559 | PENDING | PC 1 job 1 |
| v4-era-3 | mx8-erad6367bfe+sh256x27 | 9541e2a41dde2ee6 | 9541e2a41dde2ee6 | PENDING | PC 1 job 1 |
| v4-era-4 | mx8-era4488f3ed+sh256x27 | a9ffa2b67bd2e366 | a9ffa2b67bd2e366 | PENDING | PC 1 job 1 |
| v4-era-5 | mx8-eraf897c84e+sh256x27 | 1f34e9c465945249 | 1f34e9c465945249 | PENDING | PC 1 job 1 |
## Table of the G2 counts (1,024 nonces at target ff..ff, re-hashed by the Rust verifier)
| Pack | Metal (M5 Max) | Apple OpenCL (M5 Max) | CUDA NVRTC (RTX 5090) | OpenCL (RX 9070 XT) |
|---|---|---|---|---|
| mx8-devnet-epoch0 | 1,024 of 1,024 | 1,024 of 1,024 | PENDING (in the collected log) | PC 1 job 1 |
| v4-devnet-epoch0 | 1,024 of 1,024 | 1,024 of 1,024 | PENDING | PC 1 job 1 |
| v4-era-0 | 1,024 of 1,024 | 1,024 of 1,024 | PENDING | PC 1 job 1 |
| v4-era-1 | 1,024 of 1,024 | 1,024 of 1,024 | PENDING | PC 1 job 1 |
| v4-era-2 | 1,024 of 1,024 | 1,024 of 1,024 | 885 of 885 in the report's tail (the job counted 1,024 found) | PC 1 job 1 |
| v4-era-3 | 1,024 of 1,024 | 1,024 of 1,024 | 1,024 of 1,024 | PC 1 job 1 |
| v4-era-4 | 1,024 of 1,024 | 1,024 of 1,024 | 1,024 of 1,024 | PC 1 job 1 |
| v4-era-5 | 1,024 of 1,024 | 1,024 of 1,024 | 1,024 of 1,024 | PC 1 job 1 |
## What the run found, and what it means per tier
| Finding | Number | What it means | What is being done |
|---|---|---|---|
| The verifier cost of the candidate | 2.33 ms per warp on an M5 Max core (73 microseconds per hash), 0.18 ms over x8; about 5.8 ms on a 2019-class core (approximate) | A node on a 2019-class laptop core verifies a warp with about 4 ms of the 10 ms gate to spare; a pool checks 13,700 shares per second per M5 Max core and about 5,500 per 2019-class core (approximate); no tier's node is slower than under x8 by more than 8.5 percent | Nothing further for the hash; the 2019-class core itself stays owed (O-1.14) |
| A generator-3 program's id does not carry the class | the seven exported packs and 50 of 50 fuzz seeds: the v4 program's id equals the v3 program's for the same seeds (73bcbfe8ccf988f1 at devnet epoch 0), because `program_id()` is `program_id(3, seed, attempt)` under the v3 seam (generator.rs) | Under the chain's path a miner and a node could agree on a program id while one runs class v3 and the other class v4; 2.0's G4 check `program_ids_differ_across_the_switch` would not fire across a v4 activation. A home miner on any card, a rig and a pool would see the same id on both sides of the switch, so a stale worker would mine the wrong class with no id mismatch to tell it | An item for the v4 seam (gates G4 and G6, the node and the miner): give a class v4 program its own generator version, or put the class in the id as the read-width id does. The hash side needs nothing for it; the cut must not go without it |
| The PC 2 report cap | the intake keeps the last 200 KB of job.log; 8 x 1,024 found lines (about 370 KB) pushed the G1 lines out of the report | A G2 job that prints every found line loses its own G1 lines on the way home; the evidence then needs a second job (the collect) and a second lock hold | This run: the full job.log collected (collect-ca3-v4-joblog2-20261006). The class fix for the tooling: a G2 playbook writes its found lines to a file in its job folder and prints a count and a digest, with a collect of the file; or the report keeps the head as well as the tail |
| The Mac is latency-bound at the candidate, the 5090 at its cap | from the shadow analysis: -1.5 percent M5 Max, -0.2 percent 5090 at 431 W; the 9070 XT unmeasured | A home Apple miner and a 5090 miner lose under 2 percent of their rate; an AMD home miner's row is owed | AMD: PC 1 job 1 |
## Owed
- AMD (the RX 9070 XT, gfx1201): G1 and G2 on PC 1 inside another job later ("PC 1 job 1"); the OpenCL kernels are in every pack and pass on Apple OpenCL.
- The RTX 5090 G1 fingerprints and the first four packs' G2 counts: in the collected job.log; this file's two PENDING columns close when it is read.
- The 2019-class core (O-1.14): the 2.5x rule stands in.