Merge same-work-harness 7e6a7e46 into master (gate: green on 351f4967, recorded by tools/ci/pre-push.sh; landed on the box mirror under the exception declared by main: main's ruling, 7 Oct 2026 19:5x UK: the GitHub account is suspended, lanes land on the box mirror's master, the box gate stamp is the verdict; GitHub gets the fast-forward when it answers)

This commit is contained in:
igneum-labs 2026-10-08 21:36:08 +00:00
commit e2a745ec1d
8 changed files with 498 additions and 71 deletions

View file

@ -0,0 +1,75 @@
{
"format": "igneum-same-work-job-context-1",
"spec": "docs/plans/igneum-2.0-same-work-test.md (F03, Review B); the driver tools/ci/p01-vectors.py --job-context <this file> --phase 1|2|3",
"class": "v6",
"generator": 6,
"load_class": "mx8+sh256x27+state+reg64c+fold+rw",
"era": "0:edc4fa844da9dc98d37e965176f6558a31560e40502ab3ae5491b21aaaabfb07",
"era_seed_bytes": "edc4fa844da9dc98d37e965176f6558a31560e40502ab3ae5491b21aaaabfb07",
"era_widths": 4,
"generator_tree": "class-v6 1a938abe4 (igneum-pow built on build-4 at /srv/builds/igneum-wt-same-work-v6/igneum-pow, binary sha256 0d3f3fca713b10a3...)",
"state_stream": {
"path": "build-4:/srv/builds/v6-census/packs/node1-state.igsd1",
"chain_block": 159357,
"block_hash": "af89be5ddbadb6f6b4aee28ac8f249713be5d4c12621e3cea7f83ceada3c66b3",
"root": "1c583d352bb9c75a06dadb8d82d42836ebe8afa82d0b413be87bf921741f1526",
"records": 93,
"leaves": 93
},
"day": {
"D": {
"index": 20730,
"bytes": "69676e65756d2d6461792ffa50000000000000"
},
"D1": {
"index": 20731,
"bytes": "69676e65756d2d6461792ffb50000000000000"
}
},
"day_rule": "day bytes = 'igneum-day/' || day_le64 (igneum_pow::bind::day_bytes); D is the frozen pack's day index 20730, D+1 the next index 20731: the dataset-day rotation (infra/fast-time/override-60x.json, pow_day_ms 1440000) changes the day bytes and the dataset only; the program id is the same on both days",
"prehash": "0000000000000000000000000000000000000000000000000000000000000001",
"range_log2": 20,
"phases": {
"1": [
0,
1048576
],
"2": [
1048576,
2097152
],
"3": [
2097152,
3145728
]
},
"boundary_nonce": 1572864,
"boundary_rule": "the midpoint of phase 2 (2^20 + 2^19 = 1572864, 32-aligned for the workers): under the 60x clock the day switches every 1,440,000 ms and phase 2 is the engine's window across one switch; every reader switches program and dataset at this nonce; the boundary block is the last 2^12 nonces of day D [1568768, 1572864) and the first 2^12 of day D+1 [1572864, 1576960)",
"manifest": "c30ab32c",
"manifest_note": "packaging/release-manifest.json on release-2.0.1 c30ab32c (the F03 R01 record, node 7cfa422a); the pool kit is release-2.0.2 f3e99e9c whose manifest file carries the same 2.0.1 text; the kit's node enum ends at V5, so a class=v6 job line is unnameable by it (the pool lane's read-back, 22:0x UK)",
"references": {
"D": "references/ref-D.txt",
"D1": "references/ref-D1.txt"
},
"reference_recipe": "igneum-pow hash-bound --epoch-hex <epoch seed> --day-hex <day bytes> --class mx8+sh256x27+state+reg64c+fold+rw --era 0:edc4fa844da9dc98d37e965176f6558a31560e40502ab3ae5491b21aaaabfb07 --era-widths 4 --state node1-state.igsd1 --prehash 00..01 --nonce <start> --count <n> on build-4 with the class-v6 1a938abe4 binary; ref-D covers [0, 1572864), ref-D1 covers [1572864, 3145728)",
"readers": {
"cpu_reference": "the reference files themselves (igneum-pow hash-bound, build-4)",
"cuda": "the kit worker igneum-worker-cuda gen 6 (sha256 804a6f7f...) --serve on packs.D, driven by the driver (prepare of packs.D1 before phase 2)",
"opencl": "igneum-worker-opencl --serve, PC 1 RX 7600, the morning (08:30 UK)",
"metal": "the mini's worker, the morning (08:30 UK)",
"node": "igneum-miner --recheck-vectors on a branch off class-v6-node-review e8773ff5 (IgneumEngine::epoch_for then hash_bound per nonce)",
"pool": "igneum-pool recheck --job-context (the member-side share verifier); on the 2.0.2 kit BLOCKED by its V5 pins, the D1 pairing against class-v6-node-review e8773ff5 a separate labelled row"
},
"evidence_shape": "the driver's JSON: agree, disagree, missing, the first ten disagreements, answered, segments (program id and day bytes per segment), boundary (phase 2: nonce, ids and day bytes either side, the hashes and references either side, switched), prepare_line, manifest_sha, verdict",
"job_line": "job <seq> <prehash> ffffffffffffffff <start nonce> <nonces> <epoch seed bytes> <day bytes> class=v6 era=edc4fa844da9dc98d37e965176f6558a31560e40502ab3ae5491b21aaaabfb07",
"run_id": "same-work-20261008-01",
"object": "the frozen class v6 object: pack hl-v6-all (tgz sha256 9131431015e102f4b2f545e1e56e7e2271b0e805568682200113f749709858b1, re-exported byte for byte from class-v6 1a938abe4 on build-4 at 21:44 UK), program id 0x4de7b836cc40a4ea, generator 6, epoch seed edc4fa844da9dc98d37e965176f6558a31560e40502ab3ae5491b21aaaabfb07 (the genesis seeds) over the node1 state stream",
"object_id": "0x4de7b836cc40a4ea",
"epoch_seed_bytes": "edc4fa844da9dc98d37e965176f6558a31560e40502ab3ae5491b21aaaabfb07",
"packs": {
"D": "packs/hl-v6-all",
"D1": "packs/hl-v6-all-d20731"
},
"pairing_note": "the node engine refuses this pair: IgneumEngine::epoch_for's class v5 check wants the state stream's block (af89be5d...) to equal the epoch seed (edc4fa84...), so the node and pool readers cannot run it (the node lane's program-id read-back, 21:5x UK); this context is the CUDA and CPU row only and is never counted as same-work (the coordinator's ruling, 22:0x UK); the same-work run is same-work-20261008-02",
"written": "2026-10-08 22:1x UK by the same-work hand (worktree same-work-harness)"
}

View file

@ -0,0 +1,75 @@
{
"format": "igneum-same-work-job-context-1",
"spec": "docs/plans/igneum-2.0-same-work-test.md (F03, Review B); the driver tools/ci/p01-vectors.py --job-context <this file> --phase 1|2|3",
"class": "v6",
"generator": 6,
"load_class": "mx8+sh256x27+state+reg64c+fold+rw",
"era": "0:edc4fa844da9dc98d37e965176f6558a31560e40502ab3ae5491b21aaaabfb07",
"era_seed_bytes": "edc4fa844da9dc98d37e965176f6558a31560e40502ab3ae5491b21aaaabfb07",
"era_widths": 4,
"generator_tree": "class-v6 1a938abe4 (igneum-pow built on build-4 at /srv/builds/igneum-wt-same-work-v6/igneum-pow, binary sha256 0d3f3fca713b10a3...)",
"state_stream": {
"path": "build-4:/srv/builds/v6-census/packs/node1-state.igsd1",
"chain_block": 159357,
"block_hash": "af89be5ddbadb6f6b4aee28ac8f249713be5d4c12621e3cea7f83ceada3c66b3",
"root": "1c583d352bb9c75a06dadb8d82d42836ebe8afa82d0b413be87bf921741f1526",
"records": 93,
"leaves": 93
},
"day": {
"D": {
"index": 20730,
"bytes": "69676e65756d2d6461792ffa50000000000000"
},
"D1": {
"index": 20731,
"bytes": "69676e65756d2d6461792ffb50000000000000"
}
},
"day_rule": "day bytes = 'igneum-day/' || day_le64 (igneum_pow::bind::day_bytes); D is the frozen pack's day index 20730, D+1 the next index 20731: the dataset-day rotation (infra/fast-time/override-60x.json, pow_day_ms 1440000) changes the day bytes and the dataset only; the program id is the same on both days",
"prehash": "0000000000000000000000000000000000000000000000000000000000000001",
"range_log2": 20,
"phases": {
"1": [
0,
1048576
],
"2": [
1048576,
2097152
],
"3": [
2097152,
3145728
]
},
"boundary_nonce": 1572864,
"boundary_rule": "the midpoint of phase 2 (2^20 + 2^19 = 1572864, 32-aligned for the workers): under the 60x clock the day switches every 1,440,000 ms and phase 2 is the engine's window across one switch; every reader switches program and dataset at this nonce; the boundary block is the last 2^12 nonces of day D [1568768, 1572864) and the first 2^12 of day D+1 [1572864, 1576960)",
"manifest": "c30ab32c",
"manifest_note": "packaging/release-manifest.json on release-2.0.1 c30ab32c (the F03 R01 record, node 7cfa422a); the pool kit is release-2.0.2 f3e99e9c whose manifest file carries the same 2.0.1 text; the kit's node enum ends at V5, so a class=v6 job line is unnameable by it (the pool lane's read-back, 22:0x UK)",
"references": {
"D": "references/ref-D.txt",
"D1": "references/ref-D1.txt"
},
"reference_recipe": "igneum-pow hash-bound --epoch-hex <epoch seed> --day-hex <day bytes> --class mx8+sh256x27+state+reg64c+fold+rw --era 0:edc4fa844da9dc98d37e965176f6558a31560e40502ab3ae5491b21aaaabfb07 --era-widths 4 --state node1-state.igsd1 --prehash 00..01 --nonce <start> --count <n> on build-4 with the class-v6 1a938abe4 binary; ref-D covers [0, 1572864), ref-D1 covers [1572864, 3145728)",
"readers": {
"cpu_reference": "the reference files themselves (igneum-pow hash-bound, build-4)",
"cuda": "the kit worker igneum-worker-cuda gen 6 (sha256 804a6f7f...) --serve on packs.D, driven by the driver (prepare of packs.D1 before phase 2)",
"opencl": "igneum-worker-opencl --serve, PC 1 RX 7600, the morning (08:30 UK)",
"metal": "the mini's worker, the morning (08:30 UK)",
"node": "igneum-miner --recheck-vectors on a branch off class-v6-node-review e8773ff5 (IgneumEngine::epoch_for then hash_bound per nonce)",
"pool": "igneum-pool recheck --job-context (the member-side share verifier); on the 2.0.2 kit BLOCKED by its V5 pins, the D1 pairing against class-v6-node-review e8773ff5 a separate labelled row"
},
"evidence_shape": "the driver's JSON: agree, disagree, missing, the first ten disagreements, answered, segments (program id and day bytes per segment), boundary (phase 2: nonce, ids and day bytes either side, the hashes and references either side, switched), prepare_line, manifest_sha, verdict",
"job_line": "job <seq> <prehash> ffffffffffffffff <start nonce> <nonces> <epoch seed bytes> <day bytes> class=v6 era=edc4fa844da9dc98d37e965176f6558a31560e40502ab3ae5491b21aaaabfb07",
"run_id": "same-work-20261008-02",
"object": "the chain-seed class v6 object: epoch seed af89be5ddbadb6f6b4aee28ac8f249713be5d4c12621e3cea7f83ceada3c66b3 (the node1 state stream's own block hash, the pair the engine accepts) with the genesis era seed, class v6 generator 6, program id 0x2a1d6caab4c24564 (the id the node lane drew on class-v6-node-review; the export with era 0:af89be5d... draws 0x442a1691b3e3507f and is not it), packs exported from class-v6 1a938abe4 on build-4 at 21:48 UK",
"object_id": "0x2a1d6caab4c24564",
"epoch_seed_bytes": "af89be5ddbadb6f6b4aee28ac8f249713be5d4c12621e3cea7f83ceada3c66b3",
"packs": {
"D": "packs/chain-seed-d20730",
"D1": "packs/chain-seed-d20731"
},
"pairing_note": "every reader runs this context (the coordinator's ruling, 22:0x UK: the same-work test's meaning is six readers on one context); the frozen-object context 01 is the CUDA and CPU-only row",
"written": "2026-10-08 22:1x UK by the same-work hand (worktree same-work-harness)"
}

View file

@ -0,0 +1,78 @@
{
"format": "igneum-same-work-job-context-1",
"spec": "docs/plans/igneum-2.0-same-work-test.md (F03, Review B); the driver tools/ci/p01-vectors.py --job-context <this file> --phase 1|2|3",
"class": "v5",
"generator": 5,
"load_class": "mx8-era+sh256x27+state (class v5, --program-class v5)",
"era": "0:7c36b83374a673e990213be462509dcb08bcfc85144306aa9517cf3ad66faf6e",
"era_seed_bytes": "7c36b83374a673e990213be462509dcb08bcfc85144306aa9517cf3ad66faf6e",
"era_widths": 4,
"generator_tree": "release-2.0.1 c30ab32c (igneum-pow at the class v5 freeze 1c420786, fingerprint cbc5bd0a), built on build-4 at /srv/builds/igneum-wt-same-work-v5/igneum-pow",
"state_stream": {
"path": "state-epoch2.igsd1 (beside this file; from build-1's seed EVM RPC 127.0.0.1:27810 igneum_getPowStateLeaves for the seed block; the hand 26870 answered \"no published state stream\" for it at 22:18 UK)",
"chain_block": 3423,
"block_hash": "3c3fab434f7fd894ce6db0b09f298c3865726253e4fc68fd77acd163ccea8221",
"root": "0xf798d1d89ee4de62...",
"records": 224,
"bytes": 21132,
"sha256": "f36e6bbab71dc8b049fff052d0895bc4dd1e3f245779e82968fcf5b42535dee1"
},
"day": {
"D": {
"index": 20734,
"bytes": "69676e65756d2d6461792ffe50000000000000"
},
"D1": {
"index": 20735,
"bytes": "69676e65756d2d6461792fff50000000000000"
}
},
"day_rule": "day bytes = 'igneum-day/' || day_le64 (igneum_pow::bind::day_bytes); D is the frozen pack's day index 20730, D+1 the next index 20731: the dataset-day rotation (infra/fast-time/override-60x.json, pow_day_ms 1440000) changes the day bytes and the dataset only; the program id is the same on both days",
"prehash": "0000000000000000000000000000000000000000000000000000000000000001",
"range_log2": 20,
"phases": {
"1": [
0,
1048576
],
"2": [
1048576,
2097152
],
"3": [
2097152,
3145728
]
},
"boundary_nonce": 1572864,
"boundary_rule": "the midpoint of phase 2 (2^20 + 2^19 = 1572864, 32-aligned for the workers): under the 60x clock the day switches every 1,440,000 ms and phase 2 is the engine's window across one switch; every reader switches program and dataset at this nonce; the boundary block is the last 2^12 nonces of day D [1568768, 1572864) and the first 2^12 of day D+1 [1572864, 1576960)",
"manifest": "c30ab32c",
"manifest_note": "packaging/release-manifest.json on release-2.0.1 c30ab32c (the F03 R01 record, node 7cfa422a); the pool kit is release-2.0.2 f3e99e9c whose manifest file carries the same 2.0.1 text; the kit's node enum ends at V5, so a class=v6 job line is unnameable by it (the pool lane's read-back, 22:0x UK)",
"references": {
"D": "references/ref-D.txt",
"D1": "references/ref-D1.txt"
},
"reference_recipe": "igneum-pow hash-bound --epoch-hex 3c3fab434f7fd894ce6db0b09f298c3865726253e4fc68fd77acd163ccea8221 --day-hex <day bytes> --program-class v5 --era-hex 7c36b83374a673e990213be462509dcb08bcfc85144306aa9517cf3ad66faf6e --state state-epoch2.igsd1 --prehash 00..01 --nonce <start> --count <n> on build-4 with release-2.0.1's binary 7ba781db...; ref-D covers [0, 1572864), ref-D1 [1572864, 3145728)",
"readers": {
"cpu_reference": "the reference files themselves (igneum-pow hash-bound, build-4)",
"cuda": "the kit worker igneum-worker-cuda 9bfcf728 (generation 5) --serve on packs.D, driven by the driver (prepare of packs.D1 before phase 2)",
"opencl": "igneum-worker-opencl --serve, PC 1 RX 7600, the morning (08:30 UK)",
"metal": "the mini's worker, the morning (08:30 UK)",
"node": "igneum-miner --recheck-vectors on the release line's engine (class v5 by construction); until the subcommand is on a release-line branch the row reads from same-work-node cc23f9bd labelled as such",
"pool": "igneum-pool recheck on the 2.0.2 kit as pinned (class v5 is nameable by its node)"
},
"evidence_shape": "the driver's JSON: agree, disagree, missing, the first ten disagreements, answered, segments (program id and day bytes per segment), boundary (phase 2: nonce, ids and day bytes either side, the hashes and references either side, switched), prepare_line, manifest_sha, verdict",
"job_line": "job <seq> <prehash> ffffffffffffffff <start nonce> <nonces> <epoch seed bytes> <day bytes> class=v5 era=7c36b83374a673e990213be462509dcb08bcfc85144306aa9517cf3ad66faf6e",
"run_id": "same-work-20261008-03",
"object": "the live chain half: igneum-devnet-4 class v5 object at epoch 2, program id 0x81fbfa3aa413173f, epoch seed 3c3fab434f7fd894ce6db0b09f298c3865726253e4fc68fd77acd163ccea8221 (the epoch-2 seed block, chain block 3423, common to every tonight's chain: the split came after it), day 20734, era 0 seed 7c36b83374a673e990213be462509dcb08bcfc85144306aa9517cf3ad66faf6e (class v5 reads no era: the id is the same under era zero, both read), generator 5, on release-2.0.1's igneum-pow (class v5 freeze 1c420786; binary sha256 7ba781db08525637... built on build-4 from c30ab32c)",
"object_id": "0x81fbfa3aa413173f",
"epoch_seed_bytes": "3c3fab434f7fd894ce6db0b09f298c3865726253e4fc68fd77acd163ccea8221",
"packs": {
"D": "packs/v5-epoch2-d20734",
"D1": "packs/v5-epoch2-d20735"
},
"pairing_note": "the coordinator's third row (22:1x UK): the same-work test's live-chain half; the node and pool readers run it on their release-line engines; CPU and CUDA cells by 06:00 UK, node and pool NOT RUN with a 08:30 UK clock if the hours run out",
"written": "2026-10-08 22:2x UK by the same-work hand (worktree same-work-harness)",
"genesis_day_index": 20734,
"witness": "igneum-miner program-id --epoch-hex <seed> --era-hex <era> --day 20734 --class v5 --state state-epoch2.igsd1 reads \"class v5 attempt 0 id 81fbfa3aa413173f\" under era 7c36b833... and under era 00..00 alike (the miner at same-work-node cc23f9bd on build-2, the class v5 engine path; the 2.0.1 pair's miner ef0f2ed8 on build-1 has no program-id subcommand); the placed (c) pair's read on the seed's stream gave the same id (the node lane, 22:33 UK); build-1's seed is a dead fork since 21:34 UK (the devnet-4 split at the epoch-3 cut) and epoch 2's object is unaffected"
}

View file

@ -1329,30 +1329,30 @@
"manual_page": 24,
"owner_lane": "hash lane (a690540514aa453d7)",
"run_status": "NOT RUN",
"evidence_path": "docs/analysis/review-2026-10-08-b/f10/emu-test.log; docs/analysis/class-v6/rows/pairing-20261008.md",
"run_id": "hash-lane-20261008-batch3",
"updated": "2026-10-08T21:34:44.641Z",
"evidence_path": "docs/analysis/review-2026-10-08-b/f10/emu-test.log; build-1:/srv/artefacts/tas/same-work-20261008-01/job-context.json; build-1:/srv/artefacts/tas/same-work-20261008-01/references/ref-D.txt; build-1:/srv/artefacts/tas/same-work-20261008-01/references/ref-D1.txt",
"run_id": "same-work-20261008-01",
"updated": "2026-10-08T21:36:08.400Z",
"evidence_record": {
"requirement_id": "POW-01",
"decision": "PASS",
"method": "native",
"decision": "NOT RUN",
"method": "GPU",
"cell": "harness:p01-vectors",
"manifest_sha": "1a938abe4",
"run_id": "hash-lane-20261008-batch3",
"evidence": "docs/analysis/class-v6/rows/pairing-20261008.md",
"manifest_sha": "c30ab32c",
"run_id": "same-work-20261008-01",
"evidence": "build-1:/srv/artefacts/tas/same-work-20261008-01/job-context.json; build-1:/srv/artefacts/tas/same-work-20261008-01/references/ref-D.txt; build-1:/srv/artefacts/tas/same-work-20261008-01/references/ref-D1.txt",
"in_progress": false,
"coverage": "the million-vector campaign per backend per pack, bit-for-bit; PASS only when every supported backend reads a million vectors with zero disagreement; the malformed-input half is harness:parser-malformed",
"release_identity": {
"commit": "1a938abe4",
"commit": "c30ab32c; the CPU reference class-v6 1a938abe4; the CUDA reader the kit's gen 6 worker 804a6f7f",
"lockfile": "",
"binary": "",
"network_object": "",
"activation": "",
"binary": "igneum-pow sha256 0d3f3fca...; igneum-worker-cuda sha256 804a6f7f...",
"network_object": "the frozen class v6 object: pack hl-v6-all (tgz sha256 9131431015e102f4..., re-exported byte for byte from class-v6 1a938abe4 on build-4 at 21:44 UK, every file's sha256 equal), id 0x4de7b836cc40a4ea, epoch seed edc4fa84... (the genesis seeds) over the node1 state stream",
"activation": "none (a re-check of hashes against one job context, no chain state changes)",
"profile_hashes": ""
},
"claim_impact": "",
"claim_impact": "POW-01's CUDA half across a dataset-day switch on the frozen object: CUDA against the CPU reference bit for bit on three ranges with the day switch at nonce 1572864. NOT same-work evidence: the node engine refuses this seed/stream pair (IgneumEngine::epoch_for's class v5 check wants the stream's block af89be5d... to equal the epoch seed edc4fa84...), so the node and pool readers cannot read it; the coordinator's ruling 22:0x UK keeps it as the CUDA and CPU-only row",
"reviewer": "",
"at": "2026-10-08T21:34:44.641Z"
"at": "2026-10-08T21:36:08.400Z"
},
"in_progress_since": "2026-10-08T20:07:26.255Z",
"approvals": {
@ -1389,25 +1389,25 @@
},
"harness:p01-vectors": {
"requirement_id": "POW-01",
"decision": "PASS",
"method": "native",
"decision": "NOT RUN",
"method": "GPU",
"cell": "harness:p01-vectors",
"manifest_sha": "1a938abe4",
"run_id": "hash-lane-20261008-batch3",
"evidence": "docs/analysis/class-v6/rows/pairing-20261008.md",
"manifest_sha": "c30ab32c",
"run_id": "same-work-20261008-01",
"evidence": "build-1:/srv/artefacts/tas/same-work-20261008-01/job-context.json; build-1:/srv/artefacts/tas/same-work-20261008-01/references/ref-D.txt; build-1:/srv/artefacts/tas/same-work-20261008-01/references/ref-D1.txt",
"in_progress": false,
"coverage": "the million-vector campaign per backend per pack, bit-for-bit; PASS only when every supported backend reads a million vectors with zero disagreement; the malformed-input half is harness:parser-malformed",
"release_identity": {
"commit": "1a938abe4",
"commit": "c30ab32c; the CPU reference class-v6 1a938abe4; the CUDA reader the kit's gen 6 worker 804a6f7f",
"lockfile": "",
"binary": "",
"network_object": "",
"activation": "",
"binary": "igneum-pow sha256 0d3f3fca...; igneum-worker-cuda sha256 804a6f7f...",
"network_object": "the frozen class v6 object: pack hl-v6-all (tgz sha256 9131431015e102f4..., re-exported byte for byte from class-v6 1a938abe4 on build-4 at 21:44 UK, every file's sha256 equal), id 0x4de7b836cc40a4ea, epoch seed edc4fa84... (the genesis seeds) over the node1 state stream",
"activation": "none (a re-check of hashes against one job context, no chain state changes)",
"profile_hashes": ""
},
"claim_impact": "",
"claim_impact": "POW-01's CUDA half across a dataset-day switch on the frozen object: CUDA against the CPU reference bit for bit on three ranges with the day switch at nonce 1572864. NOT same-work evidence: the node engine refuses this seed/stream pair (IgneumEngine::epoch_for's class v5 check wants the stream's block af89be5d... to equal the epoch seed edc4fa84...), so the node and pool readers cannot read it; the coordinator's ruling 22:0x UK keeps it as the CUDA and CPU-only row",
"reviewer": "",
"at": "2026-10-08T21:34:44.641Z"
"at": "2026-10-08T21:36:08.400Z"
}
}
},
@ -12137,30 +12137,30 @@
"POW-01",
"ROT-02"
],
"run_id": "kit-class-v6-20261008-01",
"evidence_path": "docs/design/class-v5-stored-state.md; build-1:/srv/artefacts/packs/packs-class-v6-20261008T202808Z.zip; build-1:/srv/builds/_log/v5-class/kits-20261008T202808Z/emu-check.log",
"updated": "2026-10-08T21:18:18.084Z",
"run_id": "same-work-20261008-03",
"evidence_path": "docs/design/class-v5-stored-state.md; build-1:/srv/artefacts/packs/packs-class-v6-20261008T202808Z.zip; build-1:/srv/builds/_log/v5-class/kits-20261008T202808Z/emu-check.log; build-1:/srv/artefacts/tas/same-work-20261008-03/job-context.json; build-1:/srv/artefacts/tas/same-work-20261008-03/state-epoch2.igsd1",
"updated": "2026-10-08T21:36:08.520Z",
"evidence_record": {
"requirement_id": "R2-F03-R02",
"decision": "NOT RUN",
"method": "GPU",
"cell": "kit:class-v6-fingerprints",
"manifest_sha": "ef0f2ed8",
"run_id": "kit-class-v6-20261008-01",
"evidence": "docs/design/class-v5-stored-state.md; build-1:/srv/artefacts/packs/packs-class-v6-20261008T202808Z.zip; build-1:/srv/builds/_log/v5-class/kits-20261008T202808Z/emu-check.log",
"in_progress": true,
"coverage": "partial: the worker half (CPU reference, CUDA, Metal, OpenCL) on the same program packs; the node's and the pool's accepted work on the same job context are the CI steward's and the pool lane's cells; PASS only when every listed platform reads one fingerprint and the node and pool halves are green",
"cell": "harness:same-work",
"manifest_sha": "c30ab32c",
"run_id": "same-work-20261008-03",
"evidence": "build-1:/srv/artefacts/tas/same-work-20261008-03/job-context.json; build-1:/srv/artefacts/tas/same-work-20261008-03/state-epoch2.igsd1",
"in_progress": false,
"coverage": "partial until every reader has run: bit-for-bit agreement per nonce across node, CPU reference, CUDA, OpenCL, Metal and pool on one job context",
"release_identity": {
"commit": "ef0f2ed8",
"commit": "c30ab32c (release-2.0.1; the class v5 freeze 1c420786, fingerprint cbc5bd0a); the CUDA reader the kit's gen 5 worker 9bfcf728",
"lockfile": "",
"binary": "",
"network_object": "",
"activation": "",
"binary": "igneum-pow sha256 7ba781db... (release-2.0.1 c30ab32c, built on build-4); igneum-worker-cuda gen 5 sha256 9bfcf728...",
"network_object": "igneum-devnet-4's class v5 object at epoch 2: id 0x81fbfa3aa413173f, epoch seed 3c3fab43... (the epoch-2 seed block, chain block 3423, common to every chain tonight: the split came after it), day 20734, era 0 seed 7c36b833... (class v5 reads no era; the id is the same under era zero), state stream state-epoch2.igsd1 (sha256 f36e6bba..., 21,132 bytes, 224 records, root 0xf798d1d8...) pulled at 22:18 UK from build-1's seed EVM RPC 27810",
"activation": "none (a re-check of hashes against one job context, no chain state changes)",
"profile_hashes": ""
},
"claim_impact": "",
"claim_impact": "the same-work test's live-chain half (the coordinator's third row, 22:1x UK): the readers on the chain's own class v5 object at epoch 2 across the day switch 20734 to 20735; the node and pool readers run it on their release-line engines, the row those two can PASS without the class v6 branch",
"reviewer": "",
"at": "2026-10-08T21:18:18.084Z"
"at": "2026-10-08T21:36:08.520Z"
},
"evidence_records": {
"kit:class-v6-fingerprints": {
@ -12184,6 +12184,28 @@
"claim_impact": "",
"reviewer": "",
"at": "2026-10-08T21:18:18.084Z"
},
"harness:same-work": {
"requirement_id": "R2-F03-R02",
"decision": "NOT RUN",
"method": "GPU",
"cell": "harness:same-work",
"manifest_sha": "c30ab32c",
"run_id": "same-work-20261008-03",
"evidence": "build-1:/srv/artefacts/tas/same-work-20261008-03/job-context.json; build-1:/srv/artefacts/tas/same-work-20261008-03/state-epoch2.igsd1",
"in_progress": false,
"coverage": "partial until every reader has run: bit-for-bit agreement per nonce across node, CPU reference, CUDA, OpenCL, Metal and pool on one job context",
"release_identity": {
"commit": "c30ab32c (release-2.0.1; the class v5 freeze 1c420786, fingerprint cbc5bd0a); the CUDA reader the kit's gen 5 worker 9bfcf728",
"lockfile": "",
"binary": "igneum-pow sha256 7ba781db... (release-2.0.1 c30ab32c, built on build-4); igneum-worker-cuda gen 5 sha256 9bfcf728...",
"network_object": "igneum-devnet-4's class v5 object at epoch 2: id 0x81fbfa3aa413173f, epoch seed 3c3fab43... (the epoch-2 seed block, chain block 3423, common to every chain tonight: the split came after it), day 20734, era 0 seed 7c36b833... (class v5 reads no era; the id is the same under era zero), state stream state-epoch2.igsd1 (sha256 f36e6bba..., 21,132 bytes, 224 records, root 0xf798d1d8...) pulled at 22:18 UK from build-1's seed EVM RPC 27810",
"activation": "none (a re-check of hashes against one job context, no chain state changes)",
"profile_hashes": ""
},
"claim_impact": "the same-work test's live-chain half (the coordinator's third row, 22:1x UK): the readers on the chain's own class v5 object at epoch 2 across the day switch 20734 to 20735; the node and pool readers run it on their release-line engines, the row those two can PASS without the class v6 branch",
"reviewer": "",
"at": "2026-10-08T21:36:08.520Z"
}
},
"in_progress_since": "2026-10-08T21:18:18.084Z",
@ -12225,42 +12247,51 @@
"POW-01",
"ROT-02"
],
"updated": "2026-10-08T20:10:24.556Z",
"updated": "2026-10-08T21:36:08.520Z",
"evidence_record": {
"reason": "R2-F03 (P0, the external review): the regression's harness is the owner lane's (CI steward, hash lane (ProgramClass::V6 on freeze), pool lane); not yet named in the map",
"at": "2026-10-08T20:10:24.556Z",
"method": "static",
"requirement_id": "R2-F03-R03",
"decision": "NOT RUN",
"reviewer": "",
"claim_impact": "",
"method": "GPU",
"cell": "harness:same-work",
"manifest_sha": "c30ab32c",
"run_id": "same-work-20261008-03",
"evidence": "build-1:/srv/artefacts/tas/same-work-20261008-03/job-context.json",
"in_progress": false,
"coverage": "partial: the day-boundary transition in phase 2 (the one transition every live network crosses hourly at 60x); a class rotation is the same test on a research object until a v6 floor is set",
"release_identity": {
"commit": "",
"commit": "c30ab32c (release-2.0.1; the class v5 freeze 1c420786, fingerprint cbc5bd0a); the CUDA reader the kit's gen 5 worker 9bfcf728",
"lockfile": "",
"binary": "",
"network_object": "",
"activation": "",
"binary": "igneum-pow sha256 7ba781db... (release-2.0.1 c30ab32c, built on build-4); igneum-worker-cuda gen 5 sha256 9bfcf728...",
"network_object": "igneum-devnet-4's class v5 object at epoch 2: id 0x81fbfa3aa413173f, epoch seed 3c3fab43... (the epoch-2 seed block, chain block 3423, common to every chain tonight: the split came after it), day 20734, era 0 seed 7c36b833... (class v5 reads no era; the id is the same under era zero), state stream state-epoch2.igsd1 (sha256 f36e6bba..., 21,132 bytes, 224 records, root 0xf798d1d8...) pulled at 22:18 UK from build-1's seed EVM RPC 27810",
"activation": "none (a re-check of hashes against one job context, no chain state changes)",
"profile_hashes": ""
}
},
"claim_impact": "the same-work test's live-chain half (the coordinator's third row, 22:1x UK): the readers on the chain's own class v5 object at epoch 2 across the day switch 20734 to 20735; the node and pool readers run it on their release-line engines, the row those two can PASS without the class v6 branch",
"reviewer": "",
"at": "2026-10-08T21:36:08.520Z"
},
"evidence_records": {
"record": {
"reason": "R2-F03 (P0, the external review): the regression's harness is the owner lane's (CI steward, hash lane (ProgramClass::V6 on freeze), pool lane); not yet named in the map",
"at": "2026-10-08T20:10:24.556Z",
"method": "static",
"harness:same-work": {
"requirement_id": "R2-F03-R03",
"decision": "NOT RUN",
"reviewer": "",
"claim_impact": "",
"method": "GPU",
"cell": "harness:same-work",
"manifest_sha": "c30ab32c",
"run_id": "same-work-20261008-03",
"evidence": "build-1:/srv/artefacts/tas/same-work-20261008-03/job-context.json",
"in_progress": false,
"coverage": "partial: the day-boundary transition in phase 2 (the one transition every live network crosses hourly at 60x); a class rotation is the same test on a research object until a v6 floor is set",
"release_identity": {
"commit": "",
"commit": "c30ab32c (release-2.0.1; the class v5 freeze 1c420786, fingerprint cbc5bd0a); the CUDA reader the kit's gen 5 worker 9bfcf728",
"lockfile": "",
"binary": "",
"network_object": "",
"activation": "",
"binary": "igneum-pow sha256 7ba781db... (release-2.0.1 c30ab32c, built on build-4); igneum-worker-cuda gen 5 sha256 9bfcf728...",
"network_object": "igneum-devnet-4's class v5 object at epoch 2: id 0x81fbfa3aa413173f, epoch seed 3c3fab43... (the epoch-2 seed block, chain block 3423, common to every chain tonight: the split came after it), day 20734, era 0 seed 7c36b833... (class v5 reads no era; the id is the same under era zero), state stream state-epoch2.igsd1 (sha256 f36e6bba..., 21,132 bytes, 224 records, root 0xf798d1d8...) pulled at 22:18 UK from build-1's seed EVM RPC 27810",
"activation": "none (a re-check of hashes against one job context, no chain state changes)",
"profile_hashes": ""
},
"in_progress": false
"claim_impact": "the same-work test's live-chain half (the coordinator's third row, 22:1x UK): the readers on the chain's own class v5 object at epoch 2 across the day switch 20734 to 20735; the node and pool readers run it on their release-line engines, the row those two can PASS without the class v6 branch",
"reviewer": "",
"at": "2026-10-08T21:36:08.520Z"
}
},
"approvals": {
@ -12268,7 +12299,9 @@
"implementation_complete": null,
"evidence_reproduced": null,
"claim_authorised": null
}
},
"run_id": "same-work-20261008-03",
"evidence_path": "build-1:/srv/artefacts/tas/same-work-20261008-03/job-context.json"
},
{
"id": "R2-F04-R01",

View file

@ -0,0 +1,37 @@
{
"run_id": "same-work-20261008-01",
"manifest_sha": "c30ab32c",
"method": "GPU",
"evidence_dir": "build-1:/srv/artefacts/tas/same-work-20261008-01",
"boxes": [
"build-4 (CPU reference)",
"tas-p01-5090",
"tas-p01-4090",
"tas-p01-3090"
],
"release_identity": {
"lockfile": "",
"activation": "none (a re-check of hashes against one job context, no chain state changes)",
"profile_hashes": "",
"commit": "c30ab32c; the CPU reference class-v6 1a938abe4; the CUDA reader the kit's gen 6 worker 804a6f7f",
"binary": "igneum-pow sha256 0d3f3fca...; igneum-worker-cuda sha256 804a6f7f...",
"network_object": "the frozen class v6 object: pack hl-v6-all (tgz sha256 9131431015e102f4..., re-exported byte for byte from class-v6 1a938abe4 on build-4 at 21:44 UK, every file's sha256 equal), id 0x4de7b836cc40a4ea, epoch seed edc4fa84... (the genesis seeds) over the node1 state stream"
},
"claim_impact": "POW-01's CUDA half across a dataset-day switch on the frozen object: CUDA against the CPU reference bit for bit on three ranges with the day switch at nonce 1572864. NOT same-work evidence: the node engine refuses this seed/stream pair (IgneumEngine::epoch_for's class v5 check wants the stream's block af89be5d... to equal the epoch seed edc4fa84...), so the node and pool readers cannot read it; the coordinator's ruling 22:0x UK keeps it as the CUDA and CPU-only row",
"network_label": "on an island, not a network",
"note": "Context 01 at build-1:/srv/artefacts/tas/same-work-20261008-01/job-context.json (sha256 d2540e02...). CPU reference: igneum-pow hash-bound (class-v6 1a938abe4, binary 0d3f3fca...) on build-4, 21:46 to 21:55 UK, ref-D c49fed11... over [0, 1572864), ref-D1 5ae1220d... over [1572864, 3145728); ref-D's first million lines equal the hash lane's P01 reference /srv/artefacts/packs/p01-vectors/hl-v6-all.txt byte for byte. The node1 state stream (block af89be5d...) was written on build-4 at 15:34 UK, before the 20:00 UK split; the cell carries the island label by main's 22:2x UK rule. CUDA: runs after context 02 on the three pods (the fleet lane's runner), evidence cuda-<card>-<N>.json beside the context; in progress at the time of this record.",
"cells": [
{
"cell": "harness:p01-vectors",
"cases": [
"POW-01"
],
"status": "NOT RUN",
"method": "GPU",
"evidence": "build-1:/srv/artefacts/tas/same-work-20261008-01/job-context.json; build-1:/srv/artefacts/tas/same-work-20261008-01/references/ref-D.txt; build-1:/srv/artefacts/tas/same-work-20261008-01/references/ref-D1.txt",
"note": "the CUDA reads on the frozen object across the day switch are running after context 02; CPU reference written and cross-checked against the hash lane's P01 file; in progress",
"network_label": "on an island, not a network",
"in_progress": true
}
]
}

View file

@ -0,0 +1,50 @@
{
"run_id": "same-work-20261008-02",
"manifest_sha": "c30ab32c",
"method": "GPU",
"evidence_dir": "build-1:/srv/artefacts/tas/same-work-20261008-02",
"boxes": [
"build-4 (CPU reference, pool D1 pairing)",
"build-2 (node reader)",
"tas-p01-5090",
"tas-p01-4090",
"tas-p01-3090"
],
"release_identity": {
"lockfile": "",
"activation": "none (a re-check of hashes against one job context, no chain state changes)",
"profile_hashes": "",
"commit": "c30ab32c (packaging/release-manifest.json on release-2.0.1; node 7cfa422a); the readers: node same-work-node cc23f9bd (igneum-node, off class-v6-node-review e8773ff5, paired with class-v6 1a938abe4), CPU reference class-v6 1a938abe4, CUDA the kit's gen 6 worker 804a6f7f, pool pool-recheck-202 00c7e1db over class-v6-node-review e8773ff5",
"binary": "igneum-miner recheck-vectors sha256 9d563c41...; igneum-pow sha256 0d3f3fca...; igneum-worker-cuda sha256 804a6f7f...; igneum-pool sha256 b9fb3a60... (D1 pairing) and 2f6378e4... (kit)",
"network_object": "the chain-seed class v6 object: epoch seed af89be5d... (the node1 state stream's block 159357, root 1c583d35..., stream sha256 abb58003...) with the genesis era seed edc4fa84..., generator 6, id 0x2a1d6caab4c24564 (the hash lane's 22:00 UK ruling; their independent export hl-v6-all-cs a4742bfe... equals packs/chain-seed-d20730 file by file)"
},
"claim_impact": "R2-F03-R02 and R03 on one job context (the chain-seed class v6 object) across the readers that can run it tonight: node, CPU reference, CUDA and pool on three phases with the dataset-day switch at nonce 1572864; PASS only when every reader agrees bit for bit on every nonce; Metal and OpenCL are the morning's",
"network_label": "on an island, not a network",
"note": "The same-work run (the coordinator's ruling 22:0x UK: six readers on one context; the frozen-object context 01 is the CUDA and CPU-only row). The node1 state stream (block af89be5d..., written on build-4 at 15:34 UK, before the 20:00 UK split) keys every item; every cell carries the island label by main's 22:2x UK rule. Day D = 20730 (bytes ...2ffa50), D+1 = 20731 (...2ffb50); phase 2 switches at 1572864 (the midpoint, 32-aligned); genesis day index 20730 and dataset 2^28 words for the engine's growth rule (doublings 0 on both days). CPU reference: igneum-pow hash-bound (class-v6 1a938abe4, binary 0d3f3fca...) on build-4, 21:48 to 21:57 UK, ref-D 7c7be9b5... over [0, 1572864), ref-D1 cad7849f... over [1572864, 3145728); the hash lane's independent million-nonce reference hl-v6-all-cs.txt (b77c61d8..., 22:03 UK) equals ref-D's first million lines byte for byte. Node reader: PASS on all three phases (22:17, 22:21, 22:25 UK; 1,048,576 agree each, 0 disagree, 0 missing; the boundary switched: d28fcfd70ba70a64 before, 45905ff3d608dc12 after, both equal to the reference; the program id unchanged across the day). Reader faults recorded, not disagreements: the node reader's first phase 1 at 22:10 UK read FAIL on every nonce with the program id equal because the standalone engine held the genesis day at 0 and the growth rule doubled the cache fourteen times (fixed at cc23f9bd: install_pow_genesis from the context and the pack, the live miner's own call); the pool lane's D1-pairing run at 22:17 UK hit the same class (its nonce 0 and 1 hashes equal the pre-fix node hashes byte for byte), fix sent 22:18 UK, rerun pending. The pool on the 2.0.2 kit as pinned (release-2.0.2 00c7e1db, node 7cfa422a) is BLOCKED: its node's ProgramClass enum ends at V5, so a class=v6 job line is unnameable (pool/kit-row/pool-{1,2,3}.json carry that refusal in the driver's shape). CUDA: the 5090's phase 1 PASS at 22:00 and 22:24 UK (gen 6 worker 804a6f7f, 47.6 s); phases 2 and 3 running at the time of this record (the fleet lane's runner restarted at 22:22 UK for the three-context file; its stray phase 2 and 3 lines at 22:23 were the restart's artefact, overwritten by the clean sequence). Rule 24 on same-work-node cc23f9bd on build-2: crate check rc 0, igneum-miner suite 30 passed 0 failed.",
"cells": [
{
"cell": "harness:same-work",
"cases": [
"R2-F03-R02"
],
"status": "NOT RUN",
"method": "GPU",
"evidence": "build-1:/srv/artefacts/tas/same-work-20261008-02/node/node-1.json; build-1:/srv/artefacts/tas/same-work-20261008-02/node/node-2.json; build-1:/srv/artefacts/tas/same-work-20261008-02/node/node-3.json; build-1:/srv/artefacts/tas/same-work-20261008-02/node/node.log; build-1:/srv/artefacts/tas/same-work-20261008-02/references/ref-D.txt; build-1:/srv/artefacts/tas/same-work-20261008-02/references/ref-D1.txt; build-1:/srv/artefacts/tas/same-work-20261008-02/job-context.json; build-1:/srv/artefacts/tas/same-work-20261008-02/pool/kit-row/pool-1.json; build-1:/srv/artefacts/tas/same-work-20261008-02/pool/kit-row/pool-2.json; build-1:/srv/artefacts/tas/same-work-20261008-02/pool/kit-row/pool-3.json",
"note": "node PASS x3, CPU reference written and cross-checked, CUDA 5090 phase 1 PASS and phases 2 and 3 running, pool D1 pairing rerun pending after the install fix, pool kit row BLOCKED by its V5 pins, Metal and OpenCL NOT RUN until the morning (Metal 08:30 UK on the mini, OpenCL 08:30 UK on PC 1); the case stays NOT RUN in progress until every reader has read",
"network_label": "on an island, not a network",
"in_progress": true
},
{
"cell": "harness:same-work",
"cases": [
"R2-F03-R03"
],
"status": "NOT RUN",
"method": "GPU",
"evidence": "build-1:/srv/artefacts/tas/same-work-20261008-02/node/node-1.json; build-1:/srv/artefacts/tas/same-work-20261008-02/node/node-2.json; build-1:/srv/artefacts/tas/same-work-20261008-02/node/node-3.json; build-1:/srv/artefacts/tas/same-work-20261008-02/node/node.log; build-1:/srv/artefacts/tas/same-work-20261008-02/references/ref-D.txt; build-1:/srv/artefacts/tas/same-work-20261008-02/references/ref-D1.txt; build-1:/srv/artefacts/tas/same-work-20261008-02/job-context.json",
"note": "the dataset-day transition in phase 2: the node reader switched program and dataset at nonce 1572864 with the program id unchanged and both boundary hashes equal to the reference; the CUDA and pool phase 2 reads are pending; in progress",
"network_label": "on an island, not a network",
"in_progress": true
}
]
}

View file

@ -0,0 +1,50 @@
{
"run_id": "same-work-20261008-03",
"manifest_sha": "c30ab32c",
"method": "GPU",
"evidence_dir": "build-1:/srv/artefacts/tas/same-work-20261008-03",
"boxes": [
"build-4 (CPU reference)",
"build-2 (program-id witness)",
"tas-p01-5090",
"tas-p01-4090",
"tas-p01-3090"
],
"release_identity": {
"lockfile": "",
"activation": "none (a re-check of hashes against one job context, no chain state changes)",
"profile_hashes": "",
"commit": "c30ab32c (release-2.0.1; the class v5 freeze 1c420786, fingerprint cbc5bd0a); the CUDA reader the kit's gen 5 worker 9bfcf728",
"binary": "igneum-pow sha256 7ba781db... (release-2.0.1 c30ab32c, built on build-4); igneum-worker-cuda gen 5 sha256 9bfcf728...",
"network_object": "igneum-devnet-4's class v5 object at epoch 2: id 0x81fbfa3aa413173f, epoch seed 3c3fab43... (the epoch-2 seed block, chain block 3423, common to every chain tonight: the split came after it), day 20734, era 0 seed 7c36b833... (class v5 reads no era; the id is the same under era zero), state stream state-epoch2.igsd1 (sha256 f36e6bba..., 21,132 bytes, 224 records, root 0xf798d1d8...) pulled at 22:18 UK from build-1's seed EVM RPC 27810"
},
"claim_impact": "the same-work test's live-chain half (the coordinator's third row, 22:1x UK): the readers on the chain's own class v5 object at epoch 2 across the day switch 20734 to 20735; the node and pool readers run it on their release-line engines, the row those two can PASS without the class v6 branch",
"network_label": "on an island, not a network",
"note": "On an island, not a network: build-1's seed is one of devnet-4's islands since the epoch-3 cut (21:34 UK), its stream pulled at 22:18 UK; epoch 2's object predates the split. Context 03 at build-1:/srv/artefacts/tas/same-work-20261008-03/job-context.json (sha256 53837a96...). The witness for the id: igneum-miner program-id reads class v5 attempt 0 id 81fbfa3aa413173f under era 7c36b833... and era 00..00 alike, from the miner at same-work-node cc23f9bd on build-2 (the class v5 engine path; the 2.0.1 pair's miner ef0f2ed8 on build-1 has no program-id subcommand), and the node lane's placed (c) read gave the same id; the hand's RPC 26870 answered no published state stream for the block at 22:18 UK. Packs v5-epoch2-d20734 and d20735 (both id 0x81fbfa3aa413173f) exported from release-2.0.1's igneum-pow on build-4 at 22:19 UK; the CPU references run on build-4 under watchers from 22:20 UK (about 300 nonces a second a run); CUDA follows on the pods after contexts 02 and 01. Node and pool: the recheck subcommand is not on a release-line branch tonight, so those cells read NOT RUN with the 08:30 UK clock as the coordinator set; a labelled extra row from cc23f9bd's miner runs beside them when the references land.",
"cells": [
{
"cell": "harness:same-work",
"cases": [
"R2-F03-R02"
],
"status": "NOT RUN",
"method": "GPU",
"evidence": "build-1:/srv/artefacts/tas/same-work-20261008-03/job-context.json; build-1:/srv/artefacts/tas/same-work-20261008-03/state-epoch2.igsd1",
"note": "CPU reference running (about 23:45 UK), CUDA after it, node and pool NOT RUN with the 08:30 UK clock on the release lines; in progress",
"network_label": "on an island, not a network",
"in_progress": true
},
{
"cell": "harness:same-work",
"cases": [
"R2-F03-R03"
],
"status": "NOT RUN",
"method": "GPU",
"evidence": "build-1:/srv/artefacts/tas/same-work-20261008-03/job-context.json",
"note": "the day switch 20734 to 20735 at nonce 1572864 on the live object; readers pending; in progress",
"network_label": "on an island, not a network",
"in_progress": true
}
]
}

View file

@ -17,7 +17,10 @@ The job context (the same-work test, docs/plans/igneum-2.0-same-work-test.md) na
day D+1), the prehash, the range width (range_log2, 20) and the boundary nonce; phase N runs nonces [(N-1)*2^w, N*2^w): phase 1
under day D, phase 3 under day D+1, phase 2 under day D up to the boundary nonce and day D+1 from it, no job line crossing the
boundary, and the evidence carries the boundary block (the nonce, the program id and day bytes on each side, the two hashes
either side) that the readers are compared on.
either side) that the readers are compared on. A worker holds one (epoch, day) pair, so before any job the driver sends the
worker `prepare <seed bytes> <day D+1 bytes> <pack dir of day D+1>` and waits for its `prepared` line (a `prepare-failed` line or
a ready line saying `prepare 0` is an error: the day switch cannot be driven); the first job on day D+1 then switches the pair,
as the miner does at a real day switch.
The job line is pool.rs's: `job <seq> <prehash hex> <share_target64 hex16> <start nonce> <nonces> <epoch seed bytes hex> <day bytes hex> class=<c> era=<era hex>`.
"""
import argparse, json, os, subprocess, sys, tempfile, time
@ -73,6 +76,19 @@ def run(a):
if line.startswith('ready'): ready = line.strip(); break
if time.time() - t0 > 120: break
if not ready: p.kill(); return {'error': 'the worker never said ready'}, 2
prepared = None
if len(seg_fields) > 1:
# the second segment's pair (day D+1) is prepared before any job: the worker builds it in the background and the first
# job on that day switches to it; a worker without prepare support cannot be driven across the boundary
if ' prepare 0' in ready: p.kill(); return {'error': f'the worker has no prepare support (ready line: {ready}); phase 2 needs it for the day switch'}, 2
ss2, se2, (sb2, db2, _c2, _er2, _pid2, _gen2) = seg_fields[1]
p.stdin.write(f"prepare {sb2} {db2} {segs[1][2]}\n"); p.stdin.flush()
t1 = time.time()
for line in p.stdout:
if line.startswith('prepared '): prepared = line.strip(); break
if line.startswith('prepare-failed'): p.kill(); return {'error': f'the worker refused the day D+1 pair: {line.strip()[:300]}'}, 2
if time.time() - t1 > 900: break
if not prepared: p.kill(); return {'error': 'the worker never said prepared for the day D+1 pair (900 s)'}, 2
got = {}; agree = 0; disagree = []; seq = 0; start = a.start; end = a.start + a.count; pending = set()
def feed():
nonlocal seq, start
@ -102,13 +118,15 @@ def run(a):
except Exception: pass
p.wait(timeout=30)
missing = [n for n in range(a.start, end) if n not in got]
ev = {'case': 'POW-01', 'profile': 'P01', 'pack': os.path.basename(os.path.abspath(a.pack)), 'program_id': program_id, 'generator': generator, 'class': cls,
pack_name = os.path.basename(os.path.abspath(a.pack)) if a.pack else ', '.join(os.path.basename(os.path.abspath(s[2])) for s in segs)
ev = {'case': 'POW-01', 'profile': 'P01', 'pack': pack_name, 'program_id': program_id, 'generator': generator, 'class': cls,
'worker': a.worker, 'worker_args': a.worker_arg, 'device_line': ready, 'manifest_sha': a.manifest, 'prehash': a.prehash,
'nonces': {'start': a.start, 'count': a.count}, 'answered': len(got), 'agree': agree, 'disagree': disagree_count[0], 'missing': len(missing),
'first_disagreements': disagree, 'first_missing': missing[:10], 'worker_errors': errors[:10], 'seconds': round(time.time() - t0, 1), 'at': time.strftime('%Y-%m-%dT%H:%M:%SZ', time.gmtime())}
if jc is not None:
ev['job_context'] = os.path.abspath(a.job_context); ev['phase'] = int(a.phase); ev['object'] = jc.get('object')
ev['segments'] = [{'start': ss, 'end': se, 'program_id': f[4], 'day_bytes': f[1], 'class': f[2]} for (ss, se, f) in seg_fields]
ev['segments'] = [{'start': ss, 'end': se, 'program_id': f[4], 'day_bytes': f[1], 'class': f[2], 'pack': os.path.basename(os.path.abspath(sg[2]))} for (ss, se, f), sg in zip(seg_fields, segs)]
if prepared: ev['prepare_line'] = prepared
if len(seg_fields) == 2:
b = seg_fields[1][0]; fb, fa = seg_fields[0][2], seg_fields[1][2]
ev['boundary'] = {'nonce': b, 'program_id_before': fb[4], 'program_id_after': fa[4], 'day_bytes_before': fb[1], 'day_bytes_after': fa[1],
@ -126,11 +144,16 @@ def self_test():
# a fake worker: hashes nonce n as (n * 0x9e3779b97f4a7c15) mod 2^64; nonce 7 wrong when WRONG=1; nonce 9 never answered when DROP=1
w = os.path.join(d, 'worker.py')
open(w, 'w').write('''import sys, os
print("ready fake-gpu 0 prepare 1", flush=True)
print("ready fake-gpu 0 prepare " + ("0" if os.environ.get("NOPREPARE") == "1" else "1"), flush=True)
resident = {os.environ.get("RESIDENT", "cc" * 19)} # the pack's day (the real worker starts on its --pack); another day needs prepare first, as the real worker (day seed mismatch otherwise)
for line in sys.stdin:
p = line.split()
if p[0] == "prepare":
if os.environ.get("PREPFAIL") == "1": print(f"prepare-failed {p[1]} {p[2]} nvcc exit 1", flush=True); continue
resident.add(p[2]); print(f"prepared {p[1]} {p[2]} 12.0 nvcc 10.0 cache 1.0 dataset 1.0 resident 2 programs 2 datasets", flush=True); continue
if p[0] != "job": continue
seq, start, n = int(p[1]), int(p[4]), int(p[5])
if p[7] not in resident: print(f"error {seq} day seed mismatch: the job's day seed {p[7]} is not resident", flush=True); print(f"done {seq} 0 0", flush=True); continue
for k in range(start, start + n):
if os.environ.get("DROP") == "1" and k == 9: continue
h = (k * 0x9e3779b97f4a7c15) % (1 << 64)
@ -157,18 +180,23 @@ for line in sys.stdin:
refD1 = os.path.join(d, 'refD1.txt'); open(refD1, 'w').write(''.join(f"{k} {((k * 0x9e3779b97f4a7c15) % (1 << 64)) ^ 0xdd00dd00dd00dd00:016x}\n" for k in range(0, 48)))
jc = os.path.join(d, 'job-context.json')
json.dump({'object': 'fake', 'prehash': '00' * 31 + '01', 'range_log2': 4, 'boundary_nonce': 24, 'manifest': 'deadbeef', 'packs': {'D': pack, 'D1': pack2}, 'references': {'D': refD, 'D1': refD1}}, open(jc, 'w'))
def gojc(phase, tag, boundary=None):
def gojc(phase, tag, boundary=None, env=None):
if boundary is not None:
j = json.load(open(jc)); j['boundary_nonce'] = boundary; json.dump(j, open(jc, 'w'))
out = os.path.join(d, f'{tag}.json')
r = subprocess.run([sys.executable, __file__, '--worker', sys.executable, '--worker-arg', w, '--job-context', jc, '--phase', str(phase), '--job-nonces', '8', '--out', out], capture_output=True, text=True)
out = os.path.join(d, f'{tag}.json'); e = dict(os.environ); e.update(env or {})
r = subprocess.run([sys.executable, __file__, '--worker', sys.executable, '--worker-arg', w, '--job-context', jc, '--phase', str(phase), '--job-nonces', '8', '--out', out], capture_output=True, text=True, env=e)
return r.returncode, (json.load(open(out)) if os.path.exists(out) else {}), r.stdout + r.stderr
for ph, s0, pid in ((1, 0, '0x1'), (3, 32, '0x2')):
rc, ev, o = gojc(ph, f'jc{ph}')
rc, ev, o = gojc(ph, f'jc{ph}', env={'RESIDENT': 'dd' * 19} if ph == 3 else None) # phase 3's worker starts on the day D+1 pack
if not (rc == 0 and ev.get('verdict') == 'PASS' and ev['nonces'] == {'start': s0, 'count': 16} and ev['segments'][0]['program_id'] == pid and 'boundary' not in ev): print(f"self-test failed: phase {ph} of the job context was not a PASS on its range and pack: rc={rc} {ev.get('nonces')} {ev.get('segments')} {o[-200:]}"); fails = 1
rc, ev, o = gojc(2, 'jc2')
b = ev.get('boundary', {})
if not (rc == 0 and ev.get('verdict') == 'PASS' and ev['nonces'] == {'start': 16, 'count': 16} and b.get('nonce') == 24 and b.get('program_id_before') == '0x1' and b.get('program_id_after') == '0x2' and b.get('switched') is True and len(ev['segments']) == 2): print(f"self-test failed: phase 2 did not switch pack at the boundary nonce 24 with the boundary block: rc={rc} {b} {o[-200:]}"); fails = 1
if not (b.get('switched') is True and str(ev.get('prepare_line', '')).startswith('prepared ' + 'aa' * 32 + ' ' + 'dd' * 19) and ev['segments'][1]['pack'] == 'pack2'): print(f"self-test failed: phase 2 did not prepare the day D+1 pair before the first job on it: {ev.get('prepare_line')} {ev.get('segments')}"); fails = 1
rc, ev, o = gojc(2, 'jc2noprep', env={'NOPREPARE': '1'})
if rc != 2 or 'no prepare support' not in o: print(f"self-test failed: a worker without prepare support was not refused for phase 2: rc={rc} {o[-200:]}"); fails = 1
rc, ev, o = gojc(2, 'jc2prepfail', env={'PREPFAIL': '1'})
if rc != 2 or 'refused the day D+1 pair' not in o: print(f"self-test failed: a prepare-failed line was not an error: rc={rc} {o[-200:]}"); fails = 1
rc, ev, o = gojc(2, 'jc2bad', boundary=40)
if rc == 0 or 'not inside phase 2' not in o: print(f"self-test failed: a boundary outside phase 2 was not refused: rc={rc} {o[-200:]}"); fails = 1
if not fails: print('self-test passed: a clean million-shape run is PASS with the counts; one wrong hash is FAIL naming the nonce, the gpu and cpu hashes; an unanswered nonce is FAIL naming it; the job-context form runs each phase on its range and pack, splits phase 2 at the boundary nonce with the boundary block, and refuses a boundary outside phase 2; the job lines carry the pack fields and the all-pass target')
@ -185,5 +213,6 @@ if __name__ == '__main__':
if not a.job_context and not (a.pack and a.reference): ap.error('--pack and --reference, or --job-context with --phase')
ev, rc = run(a)
os.makedirs(os.path.dirname(os.path.abspath(a.out)), exist_ok=True); json.dump(ev, open(a.out, 'w'), indent=2)
if 'error' in ev: print(f"p01-vectors: ERROR: {ev['error']} -> {a.out}"); sys.exit(rc)
print(f"p01-vectors: {ev.get('verdict', 'ERROR')}: answered {ev.get('answered')} agree {ev.get('agree')} disagree {ev.get('disagree')} missing {ev.get('missing')} in {ev.get('seconds')} s -> {a.out}")
sys.exit(rc)