From fb88ef3d00efafed764b146bce2b958175c0fa4f Mon Sep 17 00:00:00 2001 From: igneum-labs <337424239+igneum-labs@users.noreply.github.com> Date: Thu, 8 Oct 2026 19:13:16 +0000 Subject: [PATCH] The cross-backend same-work test specified (F03, Review B): one job context, six readers, three phases around a day rotation, bit-for-bit agreement Co-Authored-By: Claude Fable 5.1 --- docs/plans/igneum-2.0-same-work-test.md | 48 +++++++++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 docs/plans/igneum-2.0-same-work-test.md diff --git a/docs/plans/igneum-2.0-same-work-test.md b/docs/plans/igneum-2.0-same-work-test.md new file mode 100644 index 000000000..6ecfdd5c8 --- /dev/null +++ b/docs/plans/igneum-2.0-same-work-test.md @@ -0,0 +1,48 @@ +# The cross-backend same-work test (F03, Review B; specified by the CI steward, 8 October 2026, 20:1x UK) + +One job context, six readers, three phases around a transition, bit-for-bit agreement. Run by the fleet lane with the freeze object; the evidence recorded against POW-01 through the batch tools. + +## The job context (one file, `job-context.json`, written once by the steward or the hash lane and copied to every reader) + +| Field | Value tonight | Source | +|---|---|---| +| object | the class v5 freeze: igneum-pow 1c420786, fingerprint cbc5bd0aa10585c8576e71e37a8ee47a045ae51754e9ddf749d0c21e6a535f88 | packaging/release-manifest.json (generator) | +| epoch seed bytes | edc4fa844da9dc98d37e965176f6558a31560e40502ab3ae5491b21aaaabfb07 (the genesis seeds) | the hash lane's P01 line | +| day bytes | 69676e65756d2d6461792ffa50000000000000 | the hash lane's P01 line | +| class | 5; era 0: | the pack's program.json | +| prehash | 0000000000000000000000000000000000000000000000000000000000000001 | the P01 convention | +| nonce range | 0 .. 2^20 per phase (three phases, three ranges: [0, 2^20), [2^20, 2^21), [2^21, 2^22)) | this page | +| transition | the day boundary: day D for phase 1, the boundary block for phase 2 (the last 2^12 nonces of day D and the first 2^12 of day D+1 as the engine sees them under fast-time 60x), day D+1 for phase 3 | infra/fast-time/override-60x.json | + +The transition is a dataset-day rotation (the class and era unchanged, the day bytes change), the one transition every live network crosses hourly at 60x; a class rotation (v5 to v6) is the same test with `class` and the second `day bytes` changed and runs only on a research object until a v6 floor is set. + +## The six readers (every one writes `-.json` of the P01 driver's evidence shape: nonce, hash per line in the raw file; agree, disagree, missing, the first ten disagreements, the device line, the pack and program ids, the manifest sha in the JSON) + +1. **node**: `igneumd` at the manifest's node sha, the engine's own re-check (`IgneumEngine::epoch_for` then `hash_bound` per nonce) through `igneum-miner --recheck-vectors` on the node binary's CPU path (the pool.rs seam), on build-2. +2. **CPU reference**: `igneum-pow hash-bound --count 2^20 --nonce ` from the manifest's generator commit, on build-2 (the hash lane's reference files are this reader). +3. **CUDA**: the kit's `igneum-worker-cuda --serve` driven by `tools/ci/p01-vectors.py` with the job context, on a 5090, 4090 and 3090 pod. +4. **OpenCL**: `igneum-worker-opencl --serve` the same way, on the AMD pod when one exists, else PC 1's RX 7600 (the only OpenCL retail cell tonight). +5. **Metal**: the Mac's own worker, the same driver, on the mini (the morning's run; never on this Mac). +6. **pool**: `igneum-pool` at the manifest's sha with its vendored node at the manifest's node sha, the member-side re-check (`pool/src/node.rs` → `kaspa_pow::igneum::IgneumEngine`) on the same job lines, on build-2. + +## The three phases + +Phase 1 (before): every reader on range 1 under day D. Phase 2 (during): every reader on range 2 where the engine's day moves from D to D+1 inside the range at the boundary nonce the fast-time clock sets; every reader must switch program and dataset at the same nonce. Phase 3 (after): every reader on range 3 under day D+1. + +## Acceptance (the registry row POW-01, cell `harness:same-work`, PASS only when all hold) + +- every reader's hash equals the CPU reference's for every nonce of every phase (zero disagreements, zero missing); +- the program id and the day each reader reports at phase 2's boundary are the same across readers (the transition is seen at one nonce); +- the pool's accepted-share verdict for a sample of 64 nonces per phase equals the node's (the seam closes by a build: `release-manifest-check.sh` refuses a redefined EpochSeeds and an unpinned vendored node); +- the run names the manifest sha (packaging/release-manifest.json), and the evidence sits at build-1:/srv/artefacts/tas/same-work-/. + +A disagreement on any reader is a red to main within fifteen minutes (the coordinator's rule for the cross-checks). + +## What is still to build (owners, defaults) + +| Piece | Owner | Clock | Default if silent | +|---|---|---|---| +| `p01-vectors.py --job-context --phase N` (the three ranges and the boundary assertion; the driver already drives the workers) | CI steward | 21:30 | built as specified | +| the node reader (`igneum-miner --recheck-vectors`, the seam with a count) | node lane | 22:00 | the steward builds it on a branch of release-2.0.0-node under rule 24 | +| the pool reader (the member-side re-check over a job-lines file) | pool lane | 22:30 | the pool's existing recheck_pack path over the context, driven by the steward | +| the pods and the mini | fleet lane | on the artefact line | as P01 |