From 495c55280ce6639a7cbfc00a00bc70f38d3996b1 Mon Sep 17 00:00:00 2001 From: igneum-labs <337424239+igneum-labs@users.noreply.github.com> Date: Mon, 5 Oct 2026 21:53:37 +0000 Subject: [PATCH] counter-asic-2-node.md: gate G4 run 2 PASS on the composed class (era in the class on the mixer, 1558971): 181 / 124 blocks, 0 rejected, 0 forks; the PC 2 suite job id; the cache merge owed Co-Authored-By: Claude Fable 5.1 --- .../class-v3-20261005-2146Z-era-mx4.json | 378 ++++++++++++++++++ docs/plans/counter-asic-2-node.md | 22 +- 2 files changed, 398 insertions(+), 2 deletions(-) create mode 100644 docs/plans/counter-asic-2-gate/class-v3-20261005-2146Z-era-mx4.json diff --git a/docs/plans/counter-asic-2-gate/class-v3-20261005-2146Z-era-mx4.json b/docs/plans/counter-asic-2-gate/class-v3-20261005-2146Z-era-mx4.json new file mode 100644 index 000000000..70712ab11 --- /dev/null +++ b/docs/plans/counter-asic-2-gate/class-v3-20261005-2146Z-era-mx4.json @@ -0,0 +1,378 @@ +{ + "pass": true, + "checks": { + "switch_line_on_every_node": true, + "switch_line_names_the_rounded_epoch": true, + "template_switched_at_the_first_v3_epoch": true, + "blocks_before_the_boundary": true, + "blocks_after_the_boundary": true, + "v2_and_v3_programs_seen": true, + "program_ids_differ_across_the_switch": true, + "miners_agree_on_every_program": true, + "zero_rejected_by_miners": true, + "zero_rejected_by_nodes": true, + "sinks_agree": true, + "block_counts_agree": true + }, + "activation": 150, + "epoch_blocks": 60, + "first_v3_epoch": 3, + "boundary_daa": 180, + "secs": 480, + "threads": 1, + "node": "/Users/joshm/Projects/igneum-wt-ca2-v3/vendor/igneum-node-ca2/target-ca2/release/igneumd", + "miner": "/Users/joshm/Projects/igneum-wt-ca2-v3/vendor/igneum-node-ca2/target-ca2/release/igneum-miner", + "genesis_bits": "0x1f010000", + "template_switch": { + "epoch": 3, + "daa": 180, + "at": 171 + }, + "run_ended_at_s": 292.3, + "final_daa": 300, + "blocks": { + "total": 305, + "before_boundary": 181, + "after_boundary": 124, + "chain_before": 180, + "chain_after": 122 + }, + "programs": [ + { + "epoch": 0, + "class": "v2", + "program_id": "8f8806638d59850f", + "seed": "234e082d653dc69d", + "miners": 3, + "disagree": false, + "ready_ms": [ + 177, + 177, + 178 + ] + }, + { + "epoch": 1, + "class": "v2", + "program_id": "bb8dd9ddbf9eb63f", + "seed": "2f66af56da44ca92", + "miners": 3, + "disagree": false, + "ready_ms": [ + 2, + 2, + 2 + ] + }, + { + "epoch": 2, + "class": "v2", + "program_id": "8ee7a9f33d418e48", + "seed": "5194dfa8a53259bc", + "miners": 3, + "disagree": false, + "ready_ms": [ + 2, + 2, + 2 + ] + }, + { + "epoch": 3, + "class": "v3", + "program_id": "2d278041ba482dba", + "seed": "54c353de1d8609d7", + "miners": 3, + "disagree": false, + "ready_ms": [ + 181, + 179, + 179 + ] + }, + { + "epoch": 4, + "class": "v3", + "program_id": "2ae786d294a8a59d", + "seed": "8529c69223a2194c", + "miners": 3, + "disagree": false, + "ready_ms": [ + 2, + 2, + 2 + ] + }, + { + "epoch": 5, + "class": "v3", + "program_id": "bc36813df2f41b5f", + "seed": "fdc233b69c42ffea", + "miners": 3, + "disagree": false, + "ready_ms": [ + 2, + 2, + 2 + ] + } + ], + "accepted_per_miner": [ + 102, + 102, + 100 + ], + "rejected_by_miners": [ + 0, + 0, + 0 + ], + "rejected_by_nodes": [ + 0, + 0, + 0 + ], + "rejected_lines": [], + "sinks": [ + "712c1b212091dcdc", + "712c1b212091dcdc", + "712c1b212091dcdc" + ], + "block_counts": [ + 303, + 303, + 303 + ], + "tips_per_node": [ + 1, + 1, + 1 + ], + "switch_lines": [ + "Program class v3 from the override file: active from epoch 3 (DAA score 150 rounded up to the epoch boundary at 180, epochs of 60 DAA)", + "Program class v3 from the override file: active from epoch 3 (DAA score 150 rounded up to the epoch boundary at 180, epochs of 60 DAA)", + "Program class v3 from the override file: active from epoch 3 (DAA score 150 rounded up to the epoch boundary at 180, epochs of 60 DAA)" + ], + "samples": [ + { + "t": 4.6, + "daa": 0, + "epoch": 0, + "class": 2, + "nodes": [ + "0/234e082d", + "0/234e082d", + "0/234e082d" + ] + }, + { + "t": 19.7, + "daa": 18, + "epoch": 0, + "class": 2, + "nodes": [ + "18/5b5f2d36", + "18/5b5f2d36", + "18/5b5f2d36" + ] + }, + { + "t": 34.7, + "daa": 51, + "epoch": 0, + "class": 2, + "nodes": [ + "51/333c61cc", + "51/333c61cc", + "51/333c61cc" + ] + }, + { + "t": 49.8, + "daa": 67, + "epoch": 1, + "class": 2, + "nodes": [ + "67/f1fcbc43", + "67/f1fcbc43", + "67/f1fcbc43" + ] + }, + { + "t": 64.8, + "daa": 89, + "epoch": 1, + "class": 2, + "nodes": [ + "89/91180594", + "89/91180594", + "89/91180594" + ] + }, + { + "t": 79.8, + "daa": 101, + "epoch": 1, + "class": 2, + "nodes": [ + "101/49dd0422", + "101/49dd0422", + "101/49dd0422" + ] + }, + { + "t": 94.9, + "daa": 111, + "epoch": 1, + "class": 2, + "nodes": [ + "111/a65a10b3", + "111/a65a10b3", + "111/a65a10b3" + ] + }, + { + "t": 109.9, + "daa": 122, + "epoch": 2, + "class": 2, + "nodes": [ + "122/f06b1eb3", + "122/f06b1eb3", + "122/f06b1eb3" + ] + }, + { + "t": 124.9, + "daa": 140, + "epoch": 2, + "class": 2, + "nodes": [ + "140/bbfe6710", + "140/bbfe6710", + "140/bbfe6710" + ] + }, + { + "t": 140, + "daa": 155, + "epoch": 2, + "class": 2, + "nodes": [ + "155/a4e736dd", + "155/a4e736dd", + "155/a4e736dd" + ] + }, + { + "t": 155, + "daa": 171, + "epoch": 2, + "class": 2, + "nodes": [ + "171/c754adeb", + "171/c754adeb", + "171/c754adeb" + ] + }, + { + "t": 170, + "daa": 179, + "epoch": 2, + "class": 2, + "nodes": [ + "179/da89ab4d", + "179/da89ab4d", + "179/da89ab4d" + ] + }, + { + "t": 185, + "daa": 187, + "epoch": 3, + "class": 3, + "nodes": [ + "187/e0f61041", + "187/e0f61041", + "187/e0f61041" + ] + }, + { + "t": 200.1, + "daa": 204, + "epoch": 3, + "class": 3, + "nodes": [ + "204/5d37e885", + "204/5d37e885", + "204/5d37e885" + ] + }, + { + "t": 215.1, + "daa": 222, + "epoch": 3, + "class": 3, + "nodes": [ + "222/46643165", + "222/46643165", + "222/46643165" + ] + }, + { + "t": 230.1, + "daa": 236, + "epoch": 3, + "class": 3, + "nodes": [ + "236/17eb5a95", + "236/17eb5a95", + "236/17eb5a95" + ] + }, + { + "t": 245.2, + "daa": 247, + "epoch": 4, + "class": 3, + "nodes": [ + "247/7aada19d", + "247/7aada19d", + "247/7aada19d" + ] + }, + { + "t": 260.2, + "daa": 261, + "epoch": 4, + "class": 3, + "nodes": [ + "261/15d8f83e", + "261/15d8f83e", + "261/15d8f83e" + ] + }, + { + "t": 275.3, + "daa": 274, + "epoch": 4, + "class": 3, + "nodes": [ + "274/9f3d19c5", + "274/9f3d19c5", + "274/9f3d19c5" + ] + }, + { + "t": 290.3, + "daa": 297, + "epoch": 4, + "class": 3, + "nodes": [ + "297/fa7975bd", + "297/fa7975bd", + "297/fa7975bd" + ] + } + ] +} \ No newline at end of file diff --git a/docs/plans/counter-asic-2-node.md b/docs/plans/counter-asic-2-node.md index 7f93f4af9..1ab5164e7 100644 --- a/docs/plans/counter-asic-2-node.md +++ b/docs/plans/counter-asic-2-node.md @@ -92,7 +92,25 @@ Binaries: fork ca2-v3-node 79bd8e10 and igneum-pow at ca2-v3 66eeba3 (the mixer- | Forks | sinks `082fd39ba65df2ff` on all three nodes, block counts 304 / 304 / 304, one tip each | | Program and cache ready, one CPU core | a new `(day, class)` cache: v2 epoch 0 219 to 235 ms, the first v3 epoch 177 to 185 ms (two per miner: the 24-minute day rolled at DAA 190); a program swap inside a day 2 ms | -The mixer x4 build-time number the rollout asks for is not visible here: the CPU miner derives dataset words on demand from the cache (no dataset build), so the x4 cost lands on the GPU workers' dataset build, measured by the ca2-mixer playbooks on the PCs. Run 2, on the composed class (era and hot fields), follows the era and cache merges. +The mixer x4 build-time number the rollout asks for is not visible here: the CPU miner derives dataset words on demand from the cache (no dataset build), so the x4 cost lands on the GPU workers' dataset build, measured by the ca2-mixer playbooks on the PCs. + +### Result, run 2 (5 October 2026, 21:46:36Z to 21:51:31Z): the composed class + +Binaries rebuilt on ca2-v3 b105a55 (era layout merged on the mixer: `V3_CLASS` = MX4 with the era drawn inside `generate_from_seed_bytes_program_class`, hot `None`), fork 79bd8e10 unchanged. Summary: `docs/plans/counter-asic-2-gate/class-v3-20261005-2146Z-era-mx4.json`. PASS: every check true. + +| Check | Measured | +|---|---| +| Switch lines, digest | 3 of 3, the same line as run 1; digest `0186df7d0834d054...` | +| Template class per epoch | epochs 0 to 2 class 2, 3 to 5 class 3; the switch at DAA 180, 171.0 s wall | +| Blocks before / after the boundary | 181 / 124 (selected chain 180 / 122), 305 in all; 102, 102, 100 accepted per miner | +| Program id per epoch, all three miners agreeing | e0 v2 `8f8806638d59850f`, e1 v2 `bb8dd9ddbf9eb63f`, e2 v2 `8ee7a9f33d418e48`, e3 v3 `2d278041ba482dba`, e4 v3 `2ae786d294a8a59d`, e5 v3 `bc36813df2f41b5f` | +| Rejected blocks | miners 0 / 0 / 0, nodes 0 / 0 / 0 | +| Forks | sinks `712c1b212091dcdc` on all three nodes, block counts 303 / 303 / 303, one tip each | +| Program and cache ready, one CPU core | v2 epoch 0 178 ms, the first v3 epoch 181 ms, an in-day swap 2 ms | + +Epoch 0's v2 id is the same in both runs (`8f8806638d59850f`: a v2 program is untouched by the era code, on the chain as in the packs); the v3 ids differ from run 1 because the era draw is now inside the class. + +The PC 2 suite job for the same tree: `build-20261005-215219` (fork 79bd8e10, main b105a55, published 21:52:19Z; its SUMMARY is the G6 evidence, recorded by the coordinator in the status file). ## 6. Tests @@ -111,6 +129,6 @@ The mixer x4 build-time number the rollout asks for is not visible here: the CPU - The Metal worker has no class v3 generator (it regenerates from the seed in Swift): the integration branch adds generator 3 there, or the Mac mines v3 with the OpenCL worker from a pack. - The GPU workers' class refusal was checked by the C test of `pf_pack_class_ok` and the syntax of both hosts, not by a live worker on a v3 pack: the integration's bit-exact gate (G1) is where a real worker first builds a v3 pack. - `next_pair` keeps the current era seed for the next epoch; an epoch boundary that is also an era boundary (once per 180 days) would prepare the wrong era, and the job line then names the right one, so the worker refuses the prepared pair and the miner prepares again (one wasted compile, no wrong block). The VDF era seed replaces the stand-in before this matters. -- Owed: gate run 2 on the composed class (ca2-era and ca2-cache merged onto the mixer tip; both branches still base on 464d6e1 at 22:40Z, before the mixer, so the era agent's rebased commit comes first), then a rebuild of `target-ca2/release` and `class-v3.mjs` again. +- Owed: the ca2-cache code (2de19e5, measured-not-adopted, hot `None`) once the cache agent rebases it onto b105a55: its merge against the era and mixer tip conflicts in 8 files (35 hunks in generator.rs, emit.rs, tests/packs.rs, verify.rs, packfile.h, accept.rs, packbench.swift, bench-log.md), aborted here on 5 October 2026 at 21:45Z; the gate did not need it. - Owed (0.3.12, coordinator's ask of 5 October 2026 22:20Z): per-day dataset reuse in the CUDA and OpenCL workers (a `Day` object shared by consecutive pairs, the cache freed after the build); the Metal worker already keys datasets by day. Until then the iGPU tier mines v3 with a dataset rebuild per epoch on those two workers. - Wire compatibility: `RpcPowEpochInfo` gained five fields in its Borsh form (wRPC) and five proto fields (gRPC); the gRPC side reads an old node's zeros as v2 / never / none; the Borsh form is versioned by `GetBlockTemplateResponse` (version 2 carries the whole struct), so a 0.3.11 wRPC client against a 0.3.10 node reads short: the miner uses gRPC, the console reads JSON (serde defaults).