Merge master 6e50e87d2 into mhpow-b4 under the master-landing lock
This commit is contained in:
commit
661ce9307f
17 changed files with 1363 additions and 941 deletions
51
docs/analysis/class-v6/1p5x/int8/README.md
Normal file
51
docs/analysis/class-v6/1p5x/int8/README.md
Normal file
|
|
@ -0,0 +1,51 @@
|
|||
# The int8-dominated class and the ARX-only class: a research record (9 October 2026, CLOSED)
|
||||
|
||||
RESEARCH RECORD ONLY. The founder asked at 11:0x UK for "the int8-dominated class"; main closed the build at 11:1x UK
|
||||
(the coordinator's line: "the int8 class build is CLOSED now ... the frozen v6 stays the algorithm"). This page records
|
||||
what was cut before the stop, so nobody has to redo it. Nothing here activates. The census, the kit, the GPU self-test,
|
||||
the J/hash rows and the OpenCL and Metal runs were NOT RUN. The card's measured int8 and ARX microkernel rows are the
|
||||
hash lane's, on the pods.
|
||||
|
||||
## What was cut
|
||||
|
||||
| Item | Value |
|
||||
|---|---|
|
||||
| Branch, sha | `1p5x-int8` on the box mirror (build-1:/srv/igneum.git), `0592e48e8fbbf37ebb162915b35294dc21fb19a7`, on X1's `a99de07cd` (on the frozen tree `1a938abe4`) |
|
||||
| igneum-pow/src fingerprint | `9e8fb3c4b987f9b149ab0d9eb3efc8bcc401fe99faad84e7b1a62e6ac897352f` (recipe `cd igneum-pow && find src -type f \| LC_ALL=C sort \| xargs shasum -a 256 \| shasum -a 256`); the frozen `5f4d6dc6...` is untouched at `1a938abe4` |
|
||||
| The op | `Op::Dp4a`: `d = d + dot4_u8(a, b)` mod 2^32, `dot4_u8` = the sum of the four unsigned byte products (at most 260,100), the form of `docs/analysis/int8-matrix-family.md` section 2.1. CUDA `__dp4a` on unsigned operands (PTX `dp4a.u32.u32`); OpenCL and Metal the exact integer helper `dot4_u8`; the CPU reference `verify::dot4_u8`. Integer only: no rounding mode or fast-math switch can move a bit. `src2 != dst` by construction (the A08 rule's twin) so the op is a bijection in `d`. Injection is by the accumulator (an add), not by xor: an xor of `d` with a function of `d` is not a bijection, and the add uses the MAC's own accumulate |
|
||||
| The flag | `LoadClass::fam8` (1 to 4), class suffixes `+int8w50r32`, `+int8w75r32`, `+int8w90r32`, `+arxr16`, `+arxr32`, program-id literal `fam8/` with the table row and the load slots; the re-weight table is off (rw 0), no A02 shuffle reservation (no shfl exists); generator 6 pack shape; the CLI `export ... --program-class v6 --era-hex <era> --fam8 <suffix>` |
|
||||
| The tables (`FAM8_WEIGHTS`, sum 100, the base program and the shadow block both) | int8w50: dp4a 46, add 11, sub 11, xor 11, rotl 11, rotr 10; int8w75: dp4a 72, then 6, 6, 6, 5, 5; int8w90: dp4a 89, then 3, 2, 2, 2, 2; arx: add, sub, xor, rotl, rotr at 20 each; mul, mulhi, mad, or, shfl at 0 everywhere |
|
||||
| The energy weighting | the record's 5090 microbench (`docs/analysis/counter-asic-4-research.md`): an ARX op 11.3 pJ (measured); a dp4a instruction 13.1 pJ (APPROXIMATE: 11.3 times the `__dp4a` step-cost ratio 1.16 of the family probe in `docs/bench-log.md`, a time ratio taken as the energy ratio, since no dp4a energy row exists). Count share for energy share s: (s / 13.1) / (s / 13.1 + (1 - s) / 11.3), so 46.3, 72.2 and 88.6 percent |
|
||||
| Reads per hash | `load_slots x 8 iterations x 2` (the reg64 window runs every instruction twice): r32 = 2 load slots, r16 = 1, over the same 4 GiB dataset (the frozen object reads 256) |
|
||||
|
||||
## The five programs on the signing pair (epoch seed af89be5d..., era 0:edc4fa84..., day 20730, node1 state, 4 GiB)
|
||||
|
||||
Exported on build-9 with the branch's binary at 10:01 to 10:07 UTC. Every export printed `OVERALL: PASS (pack written)`,
|
||||
which covers the CPU reference's own vectors and the cache FNV (448274a57f508cbc). The logs are under `rows/`.
|
||||
|
||||
| Class string | Program id | Attempt | Base-program op mix (64 instructions) | kernel.cu blake2b-256 | CPU vector, warp 0, lane 0 |
|
||||
|---|---|---|---|---|---|
|
||||
| mx8-erad810f22d+sh256x27+state+reg64c+fold+int8w50r32 | e74e5ed6b9686781 | 0 | dp4a 20, add 13, rotl 9, sub 8, rotr 6, xor 6, load 2 | 7bf3072b... | see rows/export-int8w50r32.txt |
|
||||
| mx8-erad810f22d+sh256x27+state+reg64c+fold+int8w75r32 | 445765984996028a | 0 | dp4a 44, xor 5, rotr 4, sub 4, add 3, rotl 2, load 2 | 76c23add... | rows/export-int8w75r32.txt |
|
||||
| mx8-erad810f22d+sh256x27+state+reg64c+fold+int8w90r32 | 0d438354ca69b247 | 0 | dp4a 55, rotr 2, sub 2, add 1, rotl 1, xor 1, load 2 | 0913390e... | rows/export-int8w90r32.txt |
|
||||
| mx8-erad810f22d+sh256x27+state+reg64c+fold+arxr16 | ffc2516557f356be | 0 | add 17, rotr 17, rotl 11, sub 10, xor 8, load 1 | cbfcb244... | rows/export-arxr16.txt |
|
||||
| mx8-erad810f22d+sh256x27+state+reg64c+fold+arxr32 | ad3b3faaf6ac1ad6 | 1 | xor 16, rotl 15, add 12, sub 11, rotr 8, load 2 | 11cc0bfc... | rows/export-arxr32.txt |
|
||||
|
||||
The packs stay on build-9 at /srv/builds/int8/packs-out/ (not copied to build-1; no kit was cut).
|
||||
|
||||
## State at the stop, and the rows NOT RUN
|
||||
|
||||
| Row | State |
|
||||
|---|---|
|
||||
| `cargo check --all-targets` and the release build on build-9 | clean (the binary that exported the packs) |
|
||||
| The pow suite with `tests/fam8.rs` | NOT RUN (stopped by main's ruling before it started) |
|
||||
| The CUDA emulation `--check` (the shim gained `__dp4a`) | NOT RUN |
|
||||
| The CUDA emitter's bit-exact self-test on a card (fk-int8-5090a was handed at 11:05 UK) | NOT RUN: the pod was released unused |
|
||||
| OpenCL and Metal bit-exactness | NOT RUN |
|
||||
| The census instruments (hot set, bit bias, exhaustion, the family predicate) | NOT RUN; acceptance on the signing pair took attempt 0 or 1 for all five, the only reading |
|
||||
| J/hash, rate, memory share on the 5090 and 4090 | NOT RUN here (the hash lane's microkernel rows are the data) |
|
||||
| Registry | `tools/ci/batches/1p5x-int8-20261009-01.json`, NOT RUN |
|
||||
|
||||
Two open design points, if the class is ever re-opened: the dp4a energy is an approximation (a measured dp4a row on
|
||||
the card settles it), and dropping from 256 to 32 or 16 reads per hash changes the memory share of the hash by an order
|
||||
of magnitude, so each class needs its own dataset-floor reading before any comparison with the frozen object.
|
||||
25
docs/analysis/class-v6/1p5x/int8/rows/export-arxr16.txt
Normal file
25
docs/analysis/class-v6/1p5x/int8/rows/export-arxr16.txt
Normal file
|
|
@ -0,0 +1,25 @@
|
|||
# 2026-10-09T10:02:30Z host igneum-build-9 cmd: ./bin-int8-wip export --out packs-out/arxr16 --epoch-hex af89be5ddbadb6f6b4aee28ac8f249713be5d4c12621e3cea7f83ceada3c66b3 --day-hex 69676e65756d2d6461792ffa50000000000000 --program-class v6 --era-hex edc4fa844da9dc98d37e965176f6558a31560e40502ab3ae5491b21aaaabfb07 --state node1-state.igsd1 --dataset-log2 30 --fam8 arxr16
|
||||
state stream node1-state.igsd1: chain block 159357 af89be5ddbadb6f6b4aee28ac8f249713be5d4c12621e3cea7f83ceada3c66b3, root 1c583d352bb9c75a06dadb8d82d42836ebe8afa82d0b413be87bf921741f1526, 93 records, 93 leaves
|
||||
igneum-pow export packs-out/arxr16
|
||||
seed "igneum-epoch/af89be5ddbadb6f6b4aee28ac8f249713be5d4c12621e3cea7f83ceada3c66b3/day/69676e65756d2d6461792ffa50000000000000", day "bytes:69676e65756d2d6461792ffa50000000000000", dataset 2^30 words (memory-hard), generator v6 attempt 0 program id ffc2516557f356be, loads/hash 8; epoch built in 4111.4 ms
|
||||
op mix: add=17 rotr=17 rotl=11 sub=10 xor=8 load=1; class mx8-erad810f22d+sh256x27+state+reg64c+fold+arxr16, 32 bytes/hash, widths (1,4,16 words) [1, 0, 0]
|
||||
seed words 0x9c8caa3d 0x83537296 0xf21169a4 0x12d4d157 0x66e0ce33 0xcc049080 0x8579c352 0x4c6e4ac9
|
||||
wrote packs-out/arxr16/program.json (57080 bytes)
|
||||
wrote packs-out/arxr16/identity.json (999 bytes)
|
||||
wrote packs-out/arxr16/vectors.json (6458 bytes)
|
||||
wrote packs-out/arxr16/kernel.cu (33724 bytes)
|
||||
wrote packs-out/arxr16/kernel.cl (41561 bytes)
|
||||
wrote packs-out/arxr16/program.h (7302 bytes)
|
||||
wrote packs-out/arxr16/vectors.h (5942 bytes)
|
||||
wrote packs-out/arxr16/program.metal (29712 bytes)
|
||||
wrote packs-out/arxr16/program_bound.metal (29864 bytes)
|
||||
wrote packs-out/arxr16/kernel_bound.cu (31499 bytes)
|
||||
wrote packs-out/arxr16/kernel_bound.cl (70738 bytes)
|
||||
wrote packs-out/arxr16/memhard.h (7369 bytes)
|
||||
wrote packs-out/arxr16/memhard.metal (7258 bytes)
|
||||
vector warp base 0: lane0 83009d56db7af885 lane31 0e2fbfa86964174e
|
||||
vector warp base 4096: lane0 84d2a1811e44ad82 lane31 2bb0af48de71546a
|
||||
vector warp base 1000000: lane0 935efac70dceb4b5 lane31 2686973018dc3407
|
||||
cache FNV-1a 64 448274a57f508cbc
|
||||
OVERALL: PASS (pack written)
|
||||
# end 2026-10-09T10:02:35Z rc 0
|
||||
25
docs/analysis/class-v6/1p5x/int8/rows/export-arxr32.txt
Normal file
25
docs/analysis/class-v6/1p5x/int8/rows/export-arxr32.txt
Normal file
|
|
@ -0,0 +1,25 @@
|
|||
# 2026-10-09T10:02:30Z host igneum-build-9 cmd: ./bin-int8-wip export --out packs-out/arxr32 --epoch-hex af89be5ddbadb6f6b4aee28ac8f249713be5d4c12621e3cea7f83ceada3c66b3 --day-hex 69676e65756d2d6461792ffa50000000000000 --program-class v6 --era-hex edc4fa844da9dc98d37e965176f6558a31560e40502ab3ae5491b21aaaabfb07 --state node1-state.igsd1 --dataset-log2 30 --fam8 arxr32
|
||||
state stream node1-state.igsd1: chain block 159357 af89be5ddbadb6f6b4aee28ac8f249713be5d4c12621e3cea7f83ceada3c66b3, root 1c583d352bb9c75a06dadb8d82d42836ebe8afa82d0b413be87bf921741f1526, 93 records, 93 leaves
|
||||
igneum-pow export packs-out/arxr32
|
||||
seed "igneum-epoch/af89be5ddbadb6f6b4aee28ac8f249713be5d4c12621e3cea7f83ceada3c66b3/day/69676e65756d2d6461792ffa50000000000000", day "bytes:69676e65756d2d6461792ffa50000000000000", dataset 2^30 words (memory-hard), generator v6 attempt 1 program id ad3b3faaf6ac1ad6, loads/hash 16; epoch built in 5607.4 ms
|
||||
op mix: xor=16 rotl=15 add=12 sub=11 rotr=8 load=2; class mx8-erad810f22d+sh256x27+state+reg64c+fold+arxr32, 64 bytes/hash, widths (1,4,16 words) [2, 0, 0]
|
||||
seed words 0xe60ed2a2 0x883319ea 0x6b6aa4f7 0xc4c7864e 0x5d7f9712 0x6027eee6 0x37f56d14 0x9555c104
|
||||
wrote packs-out/arxr32/program.json (57042 bytes)
|
||||
wrote packs-out/arxr32/identity.json (999 bytes)
|
||||
wrote packs-out/arxr32/vectors.json (6458 bytes)
|
||||
wrote packs-out/arxr32/kernel.cu (36687 bytes)
|
||||
wrote packs-out/arxr32/kernel.cl (44524 bytes)
|
||||
wrote packs-out/arxr32/program.h (7310 bytes)
|
||||
wrote packs-out/arxr32/vectors.h (5942 bytes)
|
||||
wrote packs-out/arxr32/program.metal (32681 bytes)
|
||||
wrote packs-out/arxr32/program_bound.metal (32833 bytes)
|
||||
wrote packs-out/arxr32/kernel_bound.cu (34462 bytes)
|
||||
wrote packs-out/arxr32/kernel_bound.cl (76664 bytes)
|
||||
wrote packs-out/arxr32/memhard.h (7369 bytes)
|
||||
wrote packs-out/arxr32/memhard.metal (7258 bytes)
|
||||
vector warp base 0: lane0 9580077ff8ede4e9 lane31 c860805edb3d7d65
|
||||
vector warp base 4096: lane0 7027129cabee388c lane31 2dd26ee19f07cbd1
|
||||
vector warp base 1000000: lane0 b7ff12a5456933bd lane31 81065cdec0efecca
|
||||
cache FNV-1a 64 448274a57f508cbc
|
||||
OVERALL: PASS (pack written)
|
||||
# end 2026-10-09T10:02:36Z rc 0
|
||||
25
docs/analysis/class-v6/1p5x/int8/rows/export-int8w50r32.txt
Normal file
25
docs/analysis/class-v6/1p5x/int8/rows/export-int8w50r32.txt
Normal file
|
|
@ -0,0 +1,25 @@
|
|||
# 2026-10-09T10:02:30Z host igneum-build-9 cmd: ./bin-int8-wip export --out packs-out/int8w50r32 --epoch-hex af89be5ddbadb6f6b4aee28ac8f249713be5d4c12621e3cea7f83ceada3c66b3 --day-hex 69676e65756d2d6461792ffa50000000000000 --program-class v6 --era-hex edc4fa844da9dc98d37e965176f6558a31560e40502ab3ae5491b21aaaabfb07 --state node1-state.igsd1 --dataset-log2 30 --fam8 int8w50r32
|
||||
state stream node1-state.igsd1: chain block 159357 af89be5ddbadb6f6b4aee28ac8f249713be5d4c12621e3cea7f83ceada3c66b3, root 1c583d352bb9c75a06dadb8d82d42836ebe8afa82d0b413be87bf921741f1526, 93 records, 93 leaves
|
||||
igneum-pow export packs-out/int8w50r32
|
||||
seed "igneum-epoch/af89be5ddbadb6f6b4aee28ac8f249713be5d4c12621e3cea7f83ceada3c66b3/day/69676e65756d2d6461792ffa50000000000000", day "bytes:69676e65756d2d6461792ffa50000000000000", dataset 2^30 words (memory-hard), generator v6 attempt 0 program id e74e5ed6b9686781, loads/hash 16; epoch built in 5308.1 ms
|
||||
op mix: dp4a=20 add=13 rotl=9 sub=8 rotr=6 xor=6 load=2; class mx8-erad810f22d+sh256x27+state+reg64c+fold+int8w50r32, 64 bytes/hash, widths (1,4,16 words) [2, 0, 0]
|
||||
seed words 0x9c8caa3d 0x83537296 0xf21169a4 0x12d4d157 0x66e0ce33 0xcc049080 0x8579c352 0x4c6e4ac9
|
||||
wrote packs-out/int8w50r32/program.json (57160 bytes)
|
||||
wrote packs-out/int8w50r32/identity.json (1003 bytes)
|
||||
wrote packs-out/int8w50r32/vectors.json (6458 bytes)
|
||||
wrote packs-out/int8w50r32/kernel.cu (44831 bytes)
|
||||
wrote packs-out/int8w50r32/kernel.cl (45596 bytes)
|
||||
wrote packs-out/int8w50r32/program.h (7328 bytes)
|
||||
wrote packs-out/int8w50r32/vectors.h (5942 bytes)
|
||||
wrote packs-out/int8w50r32/program.metal (33696 bytes)
|
||||
wrote packs-out/int8w50r32/program_bound.metal (33848 bytes)
|
||||
wrote packs-out/int8w50r32/kernel_bound.cu (42606 bytes)
|
||||
wrote packs-out/int8w50r32/kernel_bound.cl (78520 bytes)
|
||||
wrote packs-out/int8w50r32/memhard.h (7369 bytes)
|
||||
wrote packs-out/int8w50r32/memhard.metal (7258 bytes)
|
||||
vector warp base 0: lane0 7613fbd09ebad410 lane31 8258dbc8c1d8bca6
|
||||
vector warp base 4096: lane0 1626c89572860ca0 lane31 bdb50545527f7a86
|
||||
vector warp base 1000000: lane0 70228df867a63fb8 lane31 63056f4571a34b41
|
||||
cache FNV-1a 64 448274a57f508cbc
|
||||
OVERALL: PASS (pack written)
|
||||
# end 2026-10-09T10:02:36Z rc 0
|
||||
25
docs/analysis/class-v6/1p5x/int8/rows/export-int8w75r32.txt
Normal file
25
docs/analysis/class-v6/1p5x/int8/rows/export-int8w75r32.txt
Normal file
|
|
@ -0,0 +1,25 @@
|
|||
# 2026-10-09T10:02:30Z host igneum-build-9 cmd: ./bin-int8-wip export --out packs-out/int8w75r32 --epoch-hex af89be5ddbadb6f6b4aee28ac8f249713be5d4c12621e3cea7f83ceada3c66b3 --day-hex 69676e65756d2d6461792ffa50000000000000 --program-class v6 --era-hex edc4fa844da9dc98d37e965176f6558a31560e40502ab3ae5491b21aaaabfb07 --state node1-state.igsd1 --dataset-log2 30 --fam8 int8w75r32
|
||||
state stream node1-state.igsd1: chain block 159357 af89be5ddbadb6f6b4aee28ac8f249713be5d4c12621e3cea7f83ceada3c66b3, root 1c583d352bb9c75a06dadb8d82d42836ebe8afa82d0b413be87bf921741f1526, 93 records, 93 leaves
|
||||
igneum-pow export packs-out/int8w75r32
|
||||
seed "igneum-epoch/af89be5ddbadb6f6b4aee28ac8f249713be5d4c12621e3cea7f83ceada3c66b3/day/69676e65756d2d6461792ffa50000000000000", day "bytes:69676e65756d2d6461792ffa50000000000000", dataset 2^30 words (memory-hard), generator v6 attempt 0 program id 445765984996028a, loads/hash 16; epoch built in 6283.8 ms
|
||||
op mix: dp4a=44 xor=5 rotr=4 sub=4 add=3 load=2 rotl=2; class mx8-erad810f22d+sh256x27+state+reg64c+fold+int8w75r32, 64 bytes/hash, widths (1,4,16 words) [2, 0, 0]
|
||||
seed words 0x9c8caa3d 0x83537296 0xf21169a4 0x12d4d157 0x66e0ce33 0xcc049080 0x8579c352 0x4c6e4ac9
|
||||
wrote packs-out/int8w75r32/program.json (57221 bytes)
|
||||
wrote packs-out/int8w75r32/identity.json (1003 bytes)
|
||||
wrote packs-out/int8w75r32/vectors.json (6458 bytes)
|
||||
wrote packs-out/int8w75r32/kernel.cu (49376 bytes)
|
||||
wrote packs-out/int8w75r32/kernel.cl (44621 bytes)
|
||||
wrote packs-out/int8w75r32/program.h (7326 bytes)
|
||||
wrote packs-out/int8w75r32/vectors.h (5942 bytes)
|
||||
wrote packs-out/int8w75r32/program.metal (32615 bytes)
|
||||
wrote packs-out/int8w75r32/program_bound.metal (32767 bytes)
|
||||
wrote packs-out/int8w75r32/kernel_bound.cu (47151 bytes)
|
||||
wrote packs-out/int8w75r32/kernel_bound.cl (76570 bytes)
|
||||
wrote packs-out/int8w75r32/memhard.h (7369 bytes)
|
||||
wrote packs-out/int8w75r32/memhard.metal (7258 bytes)
|
||||
vector warp base 0: lane0 0682338b74a04c37 lane31 46a7253171090557
|
||||
vector warp base 4096: lane0 0b2de8e8d48c9a85 lane31 e7120f2f5c688b5d
|
||||
vector warp base 1000000: lane0 0356246b8a19b8b2 lane31 ccc92e7507e700f1
|
||||
cache FNV-1a 64 448274a57f508cbc
|
||||
OVERALL: PASS (pack written)
|
||||
# end 2026-10-09T10:02:37Z rc 0
|
||||
25
docs/analysis/class-v6/1p5x/int8/rows/export-int8w90r32.txt
Normal file
25
docs/analysis/class-v6/1p5x/int8/rows/export-int8w90r32.txt
Normal file
|
|
@ -0,0 +1,25 @@
|
|||
# 2026-10-09T10:02:30Z host igneum-build-9 cmd: ./bin-int8-wip export --out packs-out/int8w90r32 --epoch-hex af89be5ddbadb6f6b4aee28ac8f249713be5d4c12621e3cea7f83ceada3c66b3 --day-hex 69676e65756d2d6461792ffa50000000000000 --program-class v6 --era-hex edc4fa844da9dc98d37e965176f6558a31560e40502ab3ae5491b21aaaabfb07 --state node1-state.igsd1 --dataset-log2 30 --fam8 int8w90r32
|
||||
state stream node1-state.igsd1: chain block 159357 af89be5ddbadb6f6b4aee28ac8f249713be5d4c12621e3cea7f83ceada3c66b3, root 1c583d352bb9c75a06dadb8d82d42836ebe8afa82d0b413be87bf921741f1526, 93 records, 93 leaves
|
||||
igneum-pow export packs-out/int8w90r32
|
||||
seed "igneum-epoch/af89be5ddbadb6f6b4aee28ac8f249713be5d4c12621e3cea7f83ceada3c66b3/day/69676e65756d2d6461792ffa50000000000000", day "bytes:69676e65756d2d6461792ffa50000000000000", dataset 2^30 words (memory-hard), generator v6 attempt 0 program id 0d438354ca69b247, loads/hash 16; epoch built in 6384.4 ms
|
||||
op mix: dp4a=55 load=2 rotr=2 sub=2 add=1 rotl=1 xor=1; class mx8-erad810f22d+sh256x27+state+reg64c+fold+int8w90r32, 64 bytes/hash, widths (1,4,16 words) [2, 0, 0]
|
||||
seed words 0x9c8caa3d 0x83537296 0xf21169a4 0x12d4d157 0x66e0ce33 0xcc049080 0x8579c352 0x4c6e4ac9
|
||||
wrote packs-out/int8w90r32/program.json (57255 bytes)
|
||||
wrote packs-out/int8w90r32/identity.json (1003 bytes)
|
||||
wrote packs-out/int8w90r32/vectors.json (6458 bytes)
|
||||
wrote packs-out/int8w90r32/kernel.cu (51966 bytes)
|
||||
wrote packs-out/int8w90r32/kernel.cl (44221 bytes)
|
||||
wrote packs-out/int8w90r32/program.h (7322 bytes)
|
||||
wrote packs-out/int8w90r32/vectors.h (5942 bytes)
|
||||
wrote packs-out/int8w90r32/program.metal (32161 bytes)
|
||||
wrote packs-out/int8w90r32/program_bound.metal (32313 bytes)
|
||||
wrote packs-out/int8w90r32/kernel_bound.cu (49741 bytes)
|
||||
wrote packs-out/int8w90r32/kernel_bound.cl (75770 bytes)
|
||||
wrote packs-out/int8w90r32/memhard.h (7369 bytes)
|
||||
wrote packs-out/int8w90r32/memhard.metal (7258 bytes)
|
||||
vector warp base 0: lane0 0efd4800328caf38 lane31 08b4e0d27bcc35f6
|
||||
vector warp base 4096: lane0 2fdb239b2e6cf15b lane31 1bff9b5abb29d044
|
||||
vector warp base 1000000: lane0 2bea1236f6fb35a1 lane31 ae8a005b17a4b664
|
||||
cache FNV-1a 64 448274a57f508cbc
|
||||
OVERALL: PASS (pack written)
|
||||
# end 2026-10-09T10:02:37Z rc 0
|
||||
47
docs/design/proving-market-plan.md
Normal file
47
docs/design/proving-market-plan.md
Normal file
|
|
@ -0,0 +1,47 @@
|
|||
# The proving market: one page (main's item 2, 9 October 2026, 12:00 UK)
|
||||
|
||||
Written by the enforced proving lane with the node lane's rules as shipped by line. Every figure is read from the code or the fleet's files at the sha named; nothing here is a registry PASS (the registry batch for this page is NOT RUN: a plan has no harness). Native units only (IGN and wei); no price and no currency value of a coin anywhere on this page.
|
||||
|
||||
## 1. The proving-payment rule as shipped (5d53a591, the 2.0.2 line; identical on release-2.0.3-node-k7 27f54124)
|
||||
|
||||
| What | Rule | Where (file:line on 5d53a591) |
|
||||
|---|---|---|
|
||||
| The subsidy | 80 percent to the block's producer, 20 percent to the proving pool; a red block's 20 percent still reaches the pool | consensus/core/src/igneum.rs:44 `PROVING_POOL_SHARE_PERCENT = 20`, 201 to 208 `proving_pool_share_units` and `producer_share_units`; the UTXO coinbase pays it at consensus/src/processes/coinbase.rs:139 to 167 (one output per blue producer, one pooled output to the pool script); the executor credits the same split at igneum/exec/src/executor.rs:176 to 189 (`silent_split_units`: a silent block's producer share moves in part to the pool, the signing bonus) |
|
||||
| The pool pays provers per ACCEPTED proof record | a block's pool credit splits across its shards' records; the aggregator takes `proving_v1_aggregator_share_bps` = 1,000 (10 percent of an attested block's credit), the shard provers the rest by shard; the payer's verdict is the block's acceptance under the enforced floor (an accepted block had every carried proof verified), never a pool read; a record past its segment's deadline pays nothing | igneum/exec/src/proving.rs:687 and 700 `split_pool_credit(pool_credit_wei, shards, aggregator_share_bps)`; params.rs:2005 the 1,000 bps; proving.rs:1442 `verified_by_acceptance`; proving.rs:610 the deadline; on devnet-4 `proving_v1_fresh_rule_daa` 0, `proving_consensus_verify_daa` 0, `verifier_in_consensus` on |
|
||||
| The tip | 80 percent to the block's miner alone, 20 percent to registered developers per call frame, burned where no developer is registered; nothing of the tip reaches a prover | igneum/exec/src/executor.rs:321, 332 to 340 (over budget), 363 to 371 `developer_shares`; igneum/exec/src/config.rs:76 `DEVELOPER_SHARE_PERCENT = 20` |
|
||||
| The burns | the execution base fee in full; the proving base fee (`pgas used x f_p`) in full today | igneum/exec/src/executor.rs:361 `burned_proving` |
|
||||
| The user-funded, congestion-priced proving fee (docs/design/proving-payment.md) | 90 percent of `pgas x f_p` to the block's provers through PROVING_POOL_ADDRESS, 10 percent burned, behind `Params::proving_payment_activation_daa` (u64::MAX on every object); the subsidy's 20 percent untouched (its item 4) | designed and unmerged: the node fork's branch `proving-payment` 930b6322 (with `proving-payment-flag` 67912c80); the parameter exists on no shipped line and no 2.0.3 line (zero hits on 5d53a591 and 27f54124): no activation is scheduled |
|
||||
|
||||
## 2. What a 16 GB card earns per day at launch demand (native units)
|
||||
|
||||
The two measured inputs: the subsidy per block and the records a card completes per hour. Everything else is arithmetic shown here.
|
||||
|
||||
| Input | Value | Source |
|
||||
|---|---|---|
|
||||
| Subsidy per block after the 30-day ramp, devnet-4 at 1 block a second | 3.168808781 IGN; the pool's 20 percent = 0.6337617562 IGN per block (per second) | consensus/core/src/emission.rs:103 to 110 (`CURRENT`: launch_rate 3_168_808_781 at 10^9 units, 18 decimals on the chain); the devnet-4 read-back on block one, docs/design/proving-payment.md section "What the chain pays today": 2.5350470248 to the miner, 0.6337617562 to the pool; docs/plans/igneum-2.0-master/token-value/phase0/tv-01/supply-spec.json `rules.launch_rate_per_second` 31688087810000000000, `ramp_seconds` 2592000, `ramp_start_percent` 10 |
|
||||
| Mainnet at 10 blocks a second | the same rate per second, one tenth per block (coinbase.rs `calc_block_subsidy`) | the pool's credit per second is 0.6337617562 IGN on either |
|
||||
| The pool's credit per day | 86,400 x 0.6337617562 = 54,757.0 IGN | arithmetic |
|
||||
| A segment record | covers `proving_v1_segment_blocks` = 8 blocks on devnet-4 (the node's start line "8 blocks a segment"), one shard per block today ("shard 0") | the node lane's read on 5d53a591 |
|
||||
| What one segment record pays after the ramp | 8 x 0.6337617562 = 5.070 IGN of pool credit: 0.507 to the aggregator (1,000 bps), 4.563 to the shard prover | split_pool_credit, proving.rs:687 |
|
||||
| What one segment record pays NOW, inside the ramp | 0.91 IGN per paid segment (1,270 paid segments, 1,156.31 IGN, over the launch provers' last 24.5 hours) | the fleet's prover state and logs read at 11:06 UK through tools/fleet/prover-outcomes.py over 49 of the 51 launch provers (lp-4090-26 and -31 unreachable); the ramp is at about 18 percent on day two |
|
||||
| Records a card completes per hour, proving alone, serial | RTX 4090: 30 (medians 120.3 to 146.8 s end to end over four boxes); RTX 5090: 39 (median 93.2 s over 147 records) | docs/plans/igneum-2.0-master/token-value/phase0/tv-04/README.md rows F-4090-shards (line 87) and F-5090-shards (line 192), MEASURED |
|
||||
| A 16 GB card | NOT MEASURED as a records-per-hour row: the TV-04 table has the 24 GB and 32 GB cards; the floor-memory lane measured a 12 GB RTX 3060 (a compressed shard proof in 11.4 s at the 2^26 threshold, docs/analysis/floor-memory-profile-2026-10-08.md line 47) and an 8 GB RTX 4060 (line 49); a 16 GB card sits between the 12 GB tier and the 24 GB tier of that profile and runs the chain workload (its floor 8,500 MiB) | the 16 GB row is owed by the floor-memory lane; until it is measured this page uses the 4090's 30 records an hour as the CEILING for a 16 GB card, labelled so |
|
||||
|
||||
The arithmetic, at the ceiling rate and after the ramp:
|
||||
|
||||
| Demand | Pool credit per day | A 16 GB card at 30 records an hour (720 a day), every record accepted and paid | What it means |
|
||||
|---|---|---|---|
|
||||
| Launch demand as the fleet reads it NOW (11:06 UK): the launch provers accepted 19,825 shard records over a median 15.9 hours of their state files, about 30,000 records a day across 49 boxes, with 1,270 segments paid in 24.5 hours (51.9 an hour) and 31 percent of the GPU seconds paid | 54,757 IGN (after the ramp; about 9,900 IGN at today's ramp point) | the card's 720 records are 6.7 percent of the 10,800 segment records a day the chain can pay (86,400 blocks over 8); at 4.563 IGN each: 3,285 IGN a day IF its records are the ones accepted first; the fleet's 49 cards together already submit more than the chain pays, so the per-card figure is the pool's day divided among all accepted records: 54,757 over the accepted count, and today 1,156 IGN a day over the 49 boxes, 23.6 IGN a card a day at the ramp's 18 percent | at launch the market is over-supplied by the fleet alone: a home 16 GB card competes for the same 10,800 records a day; what it earns is the pool's day times its share of accepted records, and the share is set by who submits first inside each segment's window, not by card size |
|
||||
| The demand the plan assumes: every block proven (full coverage), the provers' count at the fleet's size | 54,757 IGN | 54,757 x (the card's accepted records / all accepted records); with 49 equal cards 1,117 IGN a day each after the ramp | a card earns more only as the pool's credit grows (the user-funded fee of section 1, unmerged) or as the prover count falls |
|
||||
|
||||
Stated plainly: after the ramp the pool pays 54,757 IGN a day in all; one 16 GB card proving alone could take at most 3,285 IGN of it a day (its 720 records at 4.563 IGN), and with the fleet's 49 cards competing it takes about 1,117 IGN a day; today, inside the ramp, the same card takes about 24 IGN a day. No price is attached to any of these.
|
||||
|
||||
## 3. Three steps to a live internal proving market on devnet-4
|
||||
|
||||
| Step | What | Lane | Clock today |
|
||||
|---|---|---|---|
|
||||
| (i) The pool paying proofs again on the moving chain | devnet-4 has paid no proof on its moving chain since the night's split (the records carried since sit on the islands' dead chains). This morning the founder's reset (09:17 UK) started the hubs lp-4090-04/05/06 from the mini's snapshot at 46,800 and rolled 53 of 54 fleet boxes onto that chain with fresh datadirs (waves 09:32 to 09:50; lp-04 past DAA 53,000 by 10:48). What unblocks payment is the prover fleet SUBMITTING records on that chain: the lp pods and the pool's prover set pointed at the hubs' chain; the pool pays at the first segment record accepted there (the rule rides 5d53a591 now: `verified_by_acceptance` is 2.0.2's; 27f54124 after the fleet lane's canary run 2 if the hubs upgrade). The pass line: the first "proof record ... accepted" then "paid" lines on the hubs' chain, read by the ledger (step ii) | the fleet lane (the pods and the prover set); the enforced proving lane reads the pass line through tools/fleet/prover-outcomes.py over the launch provers' state | 15:00 UK |
|
||||
| (ii) The ledger | a public read of pool credits and payouts per prover: the record store (c90212e3 on the 2.0.3 line: every carried record served from the node's store with `igneum_getProofRecord`) and the outcome ledger (b7507dd79 on master: every claimed job's one outcome, paid, expired, cancelled by cause, abandoned, with the conservation line, from the fleet's prover state and logs; its first reading of the launch provers is in section 2), joined on a page from the hubs' RPC (`igneum_getProofRecords` and the pool address's balance movements) | the site lane (the page); the enforced proving lane (the ledger's rows and the record store's read) | the ledger's rows today at 15:00 with step (i); the page tomorrow |
|
||||
| (iii) The first external job | the user-funded fee of section 1 merged behind its activation flag on the next node line with its known-failed tests (fee rounding, aborts, duplicate payments, the succession window), an activation DAA set on devnet-4 by main, and one transaction that pays `pgas x f_p` whose 90 percent reaches a prover through the pool: the first external job is that transaction, submitted by the enforced proving lane from a funded devnet account, priced by the chain's own congestion-priced `f_p` under D04's explicit routing (90 percent to the block's provers, 10 percent burned; the external-job rate of the plan's 90/10 for jobs from other chains is not ratified and is not used here: this job is a devnet-4 transaction's own proving charge) | the node lane (the merge behind the flag, 2.0.4); main (the activation value); the enforced proving lane (the transaction and its read) | the merge today; the activation on main's word; the transaction and its paid record within the hour after |
|
||||
|
||||
What is not on this page: a price for anything, a market size, an ASIC claim; and no figure the chain does not pay today beyond the arithmetic shown.
|
||||
43
docs/design/snapshot-sync.md
Normal file
43
docs/design/snapshot-sync.md
Normal file
|
|
@ -0,0 +1,43 @@
|
|||
# Snapshot sync (node 2.0.3.1): a joiner starts from a signed state snapshot served by the seeds
|
||||
|
||||
The node lane, 9 October 2026, 11:4x UK, on main's ruling of 11:1x UK: the fresh-sync memory is a public blocker. Measured this morning on a quiet box with the three hubs as the only peers (build-2, RSS every 30 s): a fresh 2.0.2 node (5d53a591) reads 29 GB at DAA 43,816 and a fresh 2.0.3 node (27f54124) 34 GB at the tip, DAA 53,670, in twenty minutes — about 0.65 GB per 1,000 blocks, linear, before any inbound traffic (a hand on build-1 with 93 inbound island peers read 62 to 86 GB on the same sync). Ten reset boxes with 16 to 38 GB container limits were OOM-killed mid-sync between 09:42 and 10:27 UK (ln-node-03 and ln-node-09 at 16 GB, lc-3070-01 at 18 GB, lp-4090-03/17/22/23/24/30 at 28 GB, lp-4090-08 at 38 GB; `oom_kill` 1 to 2 each; /Users/joshm/igneum-fleet/reset-decision.txt under the 10:35 FAULT line); the box that survived had 123 GB. The Mac entry serves 2.0.2 to machines with 16 and 32 GB.
|
||||
|
||||
What the memory is NOT: the executor's persisted state. The exec snapshot of the same synced node is 56 MB (`evm/exec-snapshot.bin`, 1,902 proof-record files beside it), the consensus store 263 MB. What it IS, by the on-disk shape (`evm/proof-records` 4.8 GB on the 2.0.3 node, `evm/proofs` and the records 7.1 GB on the 2.0.2 one, growing with the chain) and by the curve's linearity in executed blocks: the records a fresh sync holds while it executes from genesis — the proof records and segment records of every block it carried, kept in memory for the proving window's checks and the RPC's lookups, never dropped behind the executed tip because a node that executes from genesis has no attested point below which they are safe to drop. A heap profile of a fresh 27f54124 sync to DAA 10,000 on build-2 names the holders by function this afternoon; this design does not wait for it, because the fix is the same whatever holds them: a joiner that does not execute from genesis never holds them.
|
||||
|
||||
## 1. The snapshot: content and format
|
||||
|
||||
The executor already has the artefact and most of the path (`igneum/exec/src/snapshot.rs`, 6 October 2026): `ExecSnapshot` version 1 — `chain_id`, `genesis_hash`, `tip_number`, `tip_hash`, `state_root` at the tip, `written_at_unix`, every chain block record (`records`, full for the last `FULL_RECORDS` blocks), the EVM state (`db`: accounts, storage, code, the BLOCKHASH ring), the fee and epoch state, the paid shards and segments, and the class v5 epoch state streams (`epoch_streams`, the IGSD1 streams of the current and next epoch, so a joiner holds them without executing them); the consensus digest stamp (0.3.25+). The daemon flag `--igneum-exec-snapshot=<path>[,<sha256>]` starts from a file when the data dir has none; `--igneum-exec-snapshot=peer` makes the follower wait for a peer's snapshot instead of replaying from genesis (`service.rs` 994–1005), served over the P2P flow `IgneumRequestExecSnapshot` → `IgneumExecSnapshotChunk` (`protocol/flows/src/v10/execsync.rs` 28–69: the serving side answers with the executor's persisted snapshot in chunks). The load (`service.rs` 590–680 `load_snapshot`) refuses a wrong chain id, a wrong genesis, a wrong or missing digest stamp, a mid-epoch resume without the tip's capture, and a state root that the rebuilt accounts do not reproduce (`check_roots`); then `pin_check` refuses a snapshot whose record at the restart block carries another root than this network's.
|
||||
|
||||
Snapshot sync adds two things to that artefact, not a new one: (a) the snapshot is cut AT A LOCKED BLOCK — the seed's executor persists it when its tip is the finality checkpoint the seed last locked (`latest_locked_hash` of `igneum_getFinalityCheckpoints`, `rpc/core/src/model/finality.rs` 297–311), so the snapshot's `tip_hash` is a block every honest node holds as final; (b) a MANIFEST beside it: `snapshot.json` = { chain_id, digest, tip_number, tip_hash, tip_daa, state_root, locked_index, size, sha256, written_at } signed by the seed's vote key (the same key that signs its finality votes; the signature over the manifest's canonical bytes under a new domain `igneum-snapshot-v1`), so a joiner knows which seed vouches for it and can weigh that key in the finality table it will read.
|
||||
|
||||
## 2. Who signs it, with what key
|
||||
|
||||
The seeds (build-1's seed and hand, the three lp hubs after their upgrade) — each signs its own snapshot with its vote key; the manifest carries the key and the signature. A joiner accepts a snapshot whose signing key holds weight in the finality table at the snapshot's locked index (read from the certificate of that index: `RpcCheckpoint` in the same response), or — until the hubs run 2.0.3.1 — a key named in the packaged seed list (the release manifest's `snapshot_signers`, the shipper's). No new key, no central key: a snapshot's trust is the signer's vote weight plus the verification in section 3; a bad snapshot from a signing seed is an equivocation-class fault against that key, recorded the way a bad vote is.
|
||||
|
||||
## 3. How a joiner verifies it
|
||||
|
||||
In order, each a refusal with its line: (1) the manifest's signature verifies under the named key, and the key is in the finality table at `locked_index` or in the packaged signer list; (2) the file's sha256 equals the manifest's; (3) the snapshot's chain id, genesis and digest are this node's (the load's own checks); (4) THE LOCK: the joiner syncs headers first as it does today (headers-first IBD; the headers' chain is PoW-verified and the finality certificates carried in blocks are verified as they arrive), reads its own `latest_locked_hash` at `locked_index` from the certificate it verified, and refuses a snapshot whose `tip_hash` is not that locked block or an ancestor of it on its selected chain (`is_chain_ancestor_of`); (5) THE ROOT: the Kaspa header carries no exec state root (design 2.2: the root is an output of execution), so the root is checked three ways: the rebuilt accounts reproduce `state_root` (today's `check_roots`), the record at the tip carries that root (today's `pin_check`), and the first verified segment record attesting the snapshot's block (the proving pool's rows, `post_root`) agrees — the third is the proof-carrying check and the one a lying signer cannot pass once the chain's provers have attested the block. A joiner refusing at any step falls back to today's path (genesis execution) with the refusal named, never to a silent wall.
|
||||
|
||||
## 4. The executor's start and persist-and-drop
|
||||
|
||||
Start: the follower installs the snapshot as today (`load_snapshot`: the records, the db, the epoch streams, the ring's first entry), then executes forward from `tip_number + 1` as the bodies arrive — the IBD's body sync starts at the snapshot's tip, not genesis (the `highest_known_syncer_chain_hash` negotiation already lands at a block the joiner holds; the body sync's low bound becomes `max(negotiated, snapshot tip)`), so the joiner downloads headers for the whole chain (small) and bodies only above the snapshot. Persist-and-drop, the bound that makes the sync fit: every proof record and segment record below `executed_tip − proving_window` (the window the pool checks, `weight_window` DAA) is persisted to the record store (`c90212e3`'s `ProofRecordStore` under the evm dir, which already holds them on disk) and dropped from memory; the store answers the RPC's and the body rule's lookups from disk. The in-memory set is then bounded by the window, not the chain: at today's window (7,200 DAA) about 7,200 × 0.65 MB ≈ 4.7 GB at most, under 16 GB with the consensus side (263 MB on disk, its caches the box's), the EVM state (tens of MB) and the executor's ring. Today's `FULL_RECORDS = u64::MAX` (every record full in memory) is the constant that changes: full for the window, thin below, dropped below the snapshot's tip (the snapshot is the attestation below which nothing is replayed).
|
||||
|
||||
## 5. The serving path
|
||||
|
||||
Two paths, both existing in shape: (a) P2P, as today's `IgneumRequestExecSnapshot` chunks from any connected peer that holds a snapshot — extended to carry the manifest first so the joiner runs section 3's steps (1)–(3) before it takes the chunks; (b) HTTPS from the seeds' download host (the shipper's `dl.igneum.network`), the file and `snapshot.json` beside it, the same manifest — the path a fresh install takes before it has peers, pointed at by the release manifest's `snapshot_url`. The seed cuts a new snapshot at every lock it holds past a fixed stride (every 3,600 blocks, the epoch) and keeps the last two; a joiner takes the newest whose lock it has verified.
|
||||
|
||||
## 6. The 16 GB fit, stated
|
||||
|
||||
A joiner from the snapshot holds: the headers (about 300 bytes a block in memory during IBD, 16 MB at 54,000 blocks), the bodies above the snapshot (streamed, executed, thinned), the EVM state (tens of MB), the window's records (≤ 4.7 GB at today's rate), the consensus store's caches and the allocator's slack — a fresh install on a 16 GB machine syncs from the snapshot to the moving tip without the 0.65 GB-per-1,000-blocks growth, and a 2.0.2 node on 16 GB today walls at about DAA 8,000. Until 2.0.3.1 ships, /download and /miner state 64 GB for a fresh sync (the site lane, by 11:30 UK), or the recipe's snapshot by hand.
|
||||
|
||||
## 7. The known-failed tests, first
|
||||
|
||||
- `a_joiner_refuses_a_snapshot_whose_tip_is_not_under_its_verified_lock`: a snapshot whose `tip_hash` is a block off the joiner's selected chain at `locked_index` (an island's tip) is refused with the lock's line; the same snapshot with the locked block's hash is accepted. Fails today (no lock check exists; a wrong-chain snapshot is refused only by `pin_check` after the records are installed).
|
||||
- `a_snapshot_manifest_signed_by_a_key_outside_the_table_is_refused`: a manifest signed by a key with no weight at `locked_index` and not in the packaged list is refused before any byte of the file is read. Fails today (no manifest).
|
||||
- `records_below_the_window_leave_memory`: a follower that executed 20,000 blocks holds in memory only the records inside `executed_tip − weight_window`; the store answers a lookup below it from disk. Fails today (`FULL_RECORDS = u64::MAX`).
|
||||
- `the_body_sync_starts_at_the_snapshot_tip`: a joiner with a snapshot at block 46,800 requests bodies from 46,801, never from genesis. Fails today (the body sync's low bound is the negotiation's alone).
|
||||
- The canary (not a unit test): a fresh install on a 16 GB host (the fleet lane's rented Vast host at the 16 GB class, container `memory.max` read back at the handover, 13:15 UK) joining from build-1's seed's served snapshot to the moving tip and mining five minutes — the measured peak RSS against 16 GB, by 15:00 UK; the ten OOM-killed boxes above are its known-failed shape.
|
||||
|
||||
## 8. What ships when
|
||||
|
||||
2.0.3.1 on the node line after 27f54124: the lock cut and the manifest (the seed side), the four tests and their code (the joiner side: the lock check in `load_snapshot`'s caller, the manifest check in the P2P and HTTPS fetch, `FULL_RECORDS` as a window and the persist-and-drop in the follower, the body sync's low bound), the release manifest's `snapshot_url` and `snapshot_signers` (the shipper). The first served snapshot from build-1's seed by hand (the shipper's script on the seed's cleanly stopped datadir: the file, the sidecar, the manifest signed by the seed's key) this afternoon for the canary; the P2P manifest and the HTTPS path on the node line by tomorrow's cut. Nothing here moves the consensus digest: the snapshot is the executor's and the flows', the headers' chain stays the proof of the chain.
|
||||
|
|
@ -551,6 +551,22 @@ Rule: a case maps to a cell only where the cell's tests visibly answer it; cover
|
|||
- POW-01 Match independent execution across every backend: partial: the Track B research candidate's CUDA backend against an independent CPU reference (B1) only; nothing about the shipped v6 evaluator
|
||||
- POW-06 Bound verifier work and malformed-input cost: partial: verifier time per proof for the Track B candidate at k = 64 on one CPU; no malformed-input or rate budget
|
||||
|
||||
### experiment:1p5x-int8
|
||||
|
||||
- Command: `the 1.5x int8-dominated and ARX-only classes (+int8w50r32, +int8w75r32, +int8w90r32, +arxr16, +arxr32 on 1p5x-int8 0592e48e8), CLOSED by main 11:1x UK 9 October 2026 as a research record; docs/analysis/class-v6/1p5x/int8/`
|
||||
- Box class: experiment (build boxes)
|
||||
- Fixtures: none
|
||||
- Cases:
|
||||
- POW-02 Validate generated programs and index folding: full
|
||||
|
||||
### rows:1p5x-x4
|
||||
|
||||
- Command: `X4's three byte-identical reg64c address-mix forms (direct, generated, prefix): CPU differential tools/1p5x/x4/differential.sh out 4096 32 on a build box under a pid file; the GPU pairs on a rented card at stock in the P04 ABBA form (tools/1p5x/x4/pod-x4.sh, gpu_rows.py); chip rows tools/1p5x/x4/chip_rows.py ex (modelled); the arithmetic tools/1p5x/x4/arith.py`
|
||||
- Box class: a build box for the differential and the chip rows; a rented card for the pairs
|
||||
- Fixtures: F0
|
||||
- Cases:
|
||||
- R15-04 R15-04: GPU systems: partial: byte agreement of the three forms (CPU differential, GPU self-test and fingerprint) and the 4090 pairs at stock; the compaction (X2) and the tuning (X3) rows are theirs; the knee NOT RUN
|
||||
|
||||
## Automated cases with no harness in the matrix (NOT RUN, the reason)
|
||||
|
||||
- GOV-02 Approve thresholds before results: the approval is recorded in the registry's approval field; the automated half (thresholds frozen before any run_status) is the gate rule landing by 21:00
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load diff
|
|
@ -1,12 +1,13 @@
|
|||
#!/usr/bin/env bash
|
||||
# build-1's edge check (the coordinator's order, 9 October 2026): every five minutes from igneum-edge-check.timer, read
|
||||
# build.igneum.network/workers.html, git.igneum.network and build.igneum.network/light/ through the edge; an empty read (no body, or
|
||||
# build.igneum.network/workers.html, git.igneum.network and rpc.devnet.igneum.network/light/health through the edge; an empty read (no body, or
|
||||
# no HTTP answer) writes a FAULT line to /srv/queue/faults.log and /srv/queue/alerts.log; a failed caddy unit is started again and said.
|
||||
set -u
|
||||
Q=/srv/queue; mkdir -p "$Q"; now=$(date -u +%Y-%m-%dT%H:%M:%SZ); uk=$(TZ=Europe/London date +%H:%M); red=0
|
||||
for u in https://build.igneum.network/workers.html https://git.igneum.network/ https://build.igneum.network/light/; do
|
||||
# /light lives on the devnet RPC host (its Caddy block), not on build.igneum.network, whose own matcher answers 404 for it (found 11:04 UK)
|
||||
for u in https://build.igneum.network/workers.html https://git.igneum.network/ https://rpc.devnet.igneum.network/light/health; do
|
||||
r=$(curl -s -o /dev/null -w '%{http_code} %{size_download}' --max-time 10 "$u" 2>/dev/null || echo "000 0"); code=${r%% *}; size=${r##* }
|
||||
ok=1; case "$u" in */light/) [ "$code" != 000 ] || ok=0 ;; *) { [ "$code" != 000 ] && [ "$size" -gt 0 ]; } || ok=0 ;; esac
|
||||
ok=1; { [ "$code" = 200 ] || [ "$code" = 303 ] || [ "$code" = 302 ]; } && [ "$size" -gt 0 ] || ok=0
|
||||
[ "$ok" = 1 ] || { red=1; echo "$now ($uk UK) FAULT edge: $u read $code with $size bytes" | tee -a "$Q/faults.log" >> "$Q/alerts.log"; }
|
||||
done
|
||||
if ! systemctl is-active --quiet caddy; then systemctl reset-failed caddy 2>/dev/null; systemctl start caddy; echo "$now ($uk UK) FAULT edge: caddy was not active; started again ($(systemctl is-active caddy))" | tee -a "$Q/faults.log" >> "$Q/alerts.log"; fi
|
||||
|
|
|
|||
|
|
@ -14,8 +14,9 @@ syncing=(); for pair in igneum-dn4-seed:27810 igneum-dn4-hand:26870 igneum-light
|
|||
systemctl is-active --quiet "$u" || continue; h=$(height "$p"); d=$(( hub - h ))
|
||||
# a fresh sync is thousands behind; the band is 100 blocks so a moving feed never reads a synced node as syncing, and a unit in its
|
||||
# first two minutes whose RPC has not answered yet is not counted (10:32 UK, 9 Oct: the seed's reopen restart was read as a second sync)
|
||||
age=$(( $(date +%s) - $(date -d "$(systemctl show -p ActiveEnterTimestamp --value "$u")" +%s 2>/dev/null || echo 0) ))
|
||||
if [ "$h" -lt 0 ] && [ "$age" -lt 120 ]; then :; elif [ "$h" -lt 0 ] || [ "$d" -gt 100 ] || [ "$d" -lt -100 ]; then syncing+=("$u"); fi
|
||||
# an RPC that does not answer is UNKNOWN, never "syncing" (11:04 UK, 9 Oct: a timed-out read of the synced seed under load counted it as
|
||||
# syncing and the light-reader, within ten, was stopped as a second sync); only a height more than 100 behind the feed counts
|
||||
if [ "$h" -ge 0 ] && { [ "$d" -gt 100 ] || [ "$d" -lt -100 ]; }; then syncing+=("$u"); fi
|
||||
done
|
||||
if [ "${#syncing[@]}" -gt 1 ]; then
|
||||
# keep the earliest-started, stop the rest by unit
|
||||
|
|
|
|||
|
|
@ -325,7 +325,7 @@ const downloads = await loadDownloads();
|
|||
// runs the identity grep at its publish step and refuses on a hit): the downloads snapshot and the release manifest (/release.json)
|
||||
// go through tools/ci/served-identity-guard.sh before the served tree is final; exit 1 is a hit, exit 2 no private list, both refuse.
|
||||
// Until the shared guard is in the tree the build says so and goes on, so a landing before it is not held by it.
|
||||
guardServed([DL_SNAPSHOT, join(here, 'release-manifest.json')]);
|
||||
guardServed([DL_SNAPSHOT, join(here, 'release-manifest.json'), join(here, 'miner-bench.json')]);
|
||||
|
||||
built.push(`downloads (${downloads.source}: ${Object.keys(downloads.files || {}).join(', ') || 'none'})`);
|
||||
|
||||
|
|
|
|||
25
tools/ci/batches/1p5x-int8-20261009-01.json
Normal file
25
tools/ci/batches/1p5x-int8-20261009-01.json
Normal file
|
|
@ -0,0 +1,25 @@
|
|||
{
|
||||
"run_id": "1p5x-int8-20261009-01",
|
||||
"manifest_sha": "0592e48e8",
|
||||
"method": "native",
|
||||
"evidence_dir": "docs/analysis/class-v6/1p5x/int8",
|
||||
"release_identity": {
|
||||
"commit": "0592e48e8 (branch 1p5x-int8; igneum-pow/src 9e8fb3c4...)",
|
||||
"lockfile": "",
|
||||
"binary": "",
|
||||
"network_object": "none: research flags, closed",
|
||||
"activation": "none",
|
||||
"profile_hashes": ""
|
||||
},
|
||||
"claim_impact": "none: a closed research record; the frozen v6 stays the algorithm",
|
||||
"reviewer": "",
|
||||
"note": "CLOSED by main at 11:1x UK before the suite, the self-test, the census and the GPU rows ran; every cell NOT RUN.",
|
||||
"cells": [
|
||||
{
|
||||
"cell": "experiment:1p5x-int8",
|
||||
"status": "NOT RUN",
|
||||
"method": "native",
|
||||
"evidence": "docs/analysis/class-v6/1p5x/int8/README.md; docs/analysis/class-v6/1p5x/int8/rows/export-arxr16.txt; docs/analysis/class-v6/1p5x/int8/rows/export-arxr32.txt; docs/analysis/class-v6/1p5x/int8/rows/export-int8w50r32.txt; docs/analysis/class-v6/1p5x/int8/rows/export-int8w75r32.txt; docs/analysis/class-v6/1p5x/int8/rows/export-int8w90r32.txt"
|
||||
}
|
||||
]
|
||||
}
|
||||
45
tools/ci/batches/1p5x-x4-20261009.json
Normal file
45
tools/ci/batches/1p5x-x4-20261009.json
Normal file
|
|
@ -0,0 +1,45 @@
|
|||
{
|
||||
"run_id": "1p5x-x4-20261009",
|
||||
"manifest_sha": "83a2cd21",
|
||||
"evidence_dir": "docs/analysis/class-v6/1p5x/x4/README.md",
|
||||
"boxes": [
|
||||
"build-9",
|
||||
"runpod:fk-x4-4090"
|
||||
],
|
||||
"cells": [
|
||||
{
|
||||
"cell": "rows:1p5x-x4",
|
||||
"status": "NOT RUN",
|
||||
"evidence": "docs/analysis/class-v6/1p5x/x4/README.md; build-1:/srv/artefacts/1p5x/x4/x4-packs.tgz; build-1:/srv/artefacts/1p5x/x4/x4-differential.tgz",
|
||||
"note": "X4 of the 1.5x programme: three byte-identical reg64c address-mix forms (direct, generated, prefix). Equivalence measured: CPU differential EQUIVALENT (rows/VERDICT; the known-failed form refused first) and GPU self-test plus fingerprint e8f4f3289c6ee1fc on all forms. GPU pairs: RTX 4090 at stock only, g 0.959 to 0.969 at equal rate, with an occupancy confound. Chip rows modelled: 10 to 52 nJ per hash for the cheapest form. Arithmetic from 2.0x: r_new 1.86 to 1.99. No pass claimed. NOT RUN by the brief's rule (rows stay NOT RUN until the steward's X6). The knee, the 5090 and the occupancy control are BLOCKED or NOT RUN (README section 6). Island: the 4090 rows are on an island, not a network.",
|
||||
"cases": [
|
||||
"R15-04"
|
||||
],
|
||||
"in_progress": true,
|
||||
"method": "GPU"
|
||||
}
|
||||
],
|
||||
"method": "GPU",
|
||||
"release_identity": {
|
||||
"commit": "b51d8c04b (branch 1p5x-x4 off master a7f81d9a9)",
|
||||
"binary": "igneum-pow ccb1bf0efebce4bb (build-9 release build of b51d8c04b); igneum-worker-cuda-gen6 804a6f7fea10a62e",
|
||||
"network_object": "none (packs exported from the frozen object, program id 0x4de7b836cc40a4ea; no network)",
|
||||
"activation": "none"
|
||||
},
|
||||
"note": "recorded by the CI steward from docs/analysis/class-v6/1p5x/x4/registry-batch-1p5x-x4-20261009.json (the X4 lane, master 83a2cd21); the cell rows:1p5x-x4 carried in map_cell_requested on R15-04 (packages.json names X4 as its lane)",
|
||||
"map_cell_requested": {
|
||||
"rows:1p5x-x4": {
|
||||
"command": "X4's three byte-identical reg64c address-mix forms (direct, generated, prefix): CPU differential tools/1p5x/x4/differential.sh out 4096 32 on a build box under a pid file; the GPU pairs on a rented card at stock in the P04 ABBA form (tools/1p5x/x4/pod-x4.sh, gpu_rows.py); chip rows tools/1p5x/x4/chip_rows.py ex (modelled); the arithmetic tools/1p5x/x4/arith.py",
|
||||
"box_class": "a build box for the differential and the chip rows; a rented card for the pairs",
|
||||
"fixtures": [
|
||||
"F0"
|
||||
],
|
||||
"cases": [
|
||||
"R15-04"
|
||||
],
|
||||
"coverage": {
|
||||
"R15-04": "partial: byte agreement of the three forms (CPU differential, GPU self-test and fingerprint) and the 4090 pairs at stock; the compaction (X2) and the tuning (X3) rows are theirs; the knee NOT RUN"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -14,6 +14,7 @@ URLS=(
|
|||
https://dl.igneum.network/public/igneum-app-latest.json # the public app manifest (packaging/ota/publish-public.sh)
|
||||
https://dl.igneum.network/public/igneum-wallet-latest.json # the public wallet manifest (packaging/ota/publish-public.sh)
|
||||
https://build.igneum.network/feed.json # the hourly feed on build-1 (the build-server lane's unit)
|
||||
https://igneum.network/miner-bench.json # the public bench table (site/miner-bench.json, served as is; the site lane)
|
||||
)
|
||||
if [ "${1:-}" = --list ]; then printf '%s\n' "${URLS[@]}" | sed 's/ *#.*//'; exit 0; fi
|
||||
d=$(mktemp -d); trap 'rm -rf "$d"' EXIT; rc=0; files=()
|
||||
|
|
|
|||
|
|
@ -928,6 +928,27 @@
|
|||
"POW-01": "partial: the Track B research candidate's CUDA backend against an independent CPU reference (B1) only; nothing about the shipped v6 evaluator",
|
||||
"POW-06": "partial: verifier time per proof for the Track B candidate at k = 64 on one CPU; no malformed-input or rate budget"
|
||||
}
|
||||
},
|
||||
"experiment:1p5x-int8": {
|
||||
"command": "the 1.5x int8-dominated and ARX-only classes (+int8w50r32, +int8w75r32, +int8w90r32, +arxr16, +arxr32 on 1p5x-int8 0592e48e8), CLOSED by main 11:1x UK 9 October 2026 as a research record; docs/analysis/class-v6/1p5x/int8/",
|
||||
"box_class": "experiment (build boxes)",
|
||||
"fixtures": [],
|
||||
"cases": [
|
||||
"POW-02"
|
||||
]
|
||||
},
|
||||
"rows:1p5x-x4": {
|
||||
"command": "X4's three byte-identical reg64c address-mix forms (direct, generated, prefix): CPU differential tools/1p5x/x4/differential.sh out 4096 32 on a build box under a pid file; the GPU pairs on a rented card at stock in the P04 ABBA form (tools/1p5x/x4/pod-x4.sh, gpu_rows.py); chip rows tools/1p5x/x4/chip_rows.py ex (modelled); the arithmetic tools/1p5x/x4/arith.py",
|
||||
"box_class": "a build box for the differential and the chip rows; a rented card for the pairs",
|
||||
"fixtures": [
|
||||
"F0"
|
||||
],
|
||||
"cases": [
|
||||
"R15-04"
|
||||
],
|
||||
"coverage": {
|
||||
"R15-04": "partial: byte agreement of the three forms (CPU differential, GPU self-test and fingerprint) and the 4090 pairs at stock; the compaction (X2) and the tuning (X3) rows are theirs; the knee NOT RUN"
|
||||
}
|
||||
}
|
||||
},
|
||||
"not_run": {
|
||||
|
|
|
|||
Loading…
Reference in a new issue