diff --git a/docs/plans/testnet-go.md b/docs/plans/testnet-go.md index dac08a328..cdb06ae51 100644 --- a/docs/plans/testnet-go.md +++ b/docs/plans/testnet-go.md @@ -69,7 +69,7 @@ in the fee floors, object version 7 stamped, the override file refused (rc 1), t node reading its own digest beside it. During the handshake step seed 2 (5.161.232.205) dialled the canary and was refused on the digest; the gate pod of 8 October (09:49 UK) read the seeds' own answer: all three refuse on `b7d8c915...`, the 5 October object of 1c19441d, so the seeds carry the 5 October chain at height 0 until the project lead's go (no 0.3.22 binary reached them); the runbook's wipe stands. The digest lineage: `b7d8c915...` (1c19441d) to `87d103b6...` (the 0.3.22 interim re-arm) to `b2e856ed...` (5b673577, class v5 at never) to `1da30c10...` (0d05e795, class v5 at 0: THE GO DIGEST). The runbook's -values: `--genesis 01294fd3...`, `--digest 1da30c10...`, `--commit 0d05e795`, the seed-class pair the build-server lane builds from 0d05e795 on the gate sha above (NOT YET BUILT at 14:2x UK, 8 October: the re-arm is that pair's pull-path dry run on the three seeds, the second dry run of this runbook). The record of the first dry run, on 5b673577's pair, stands below and is NOT the go pair: the seed-class pair the +values: `--genesis 01294fd3...`, `--digest 1da30c10...`, `--commit ` (the go pair, by the coordinator's ruling of 14:2x UK on 8 October; until it lands, `--commit 0d05e795` names the FALLBACK pair only), the seed-class pair the build-server lane builds on build-1 from that commit (the 0d05e795 pair first, as the fallback, NOT YET BUILT at 14:1x UK; the re-arm is each pair's pull-path dry run on the three seeds). The record of the first dry run, on 5b673577's pair, stands below and is NOT the go pair: the seed-class pair the build-server lane built from 5b673577 at 09:43 UK on build-1: `/srv/artefacts/0324-5b673577/seed/igneumd` sha256 `3a204fd9d3a4840dcef430e73cbfa986881db915d5459533d395dc0563a597a8` (glibc 2.34, the commit string twice, igneum-pow 1c420786) and `igneum-miner` sha256 `464dca078db54434b2ce4cdf8b5975a614141d20907a9d941cc88667b85144ba`, `--commit 5b673577`, no override, `--wipe-genesis`; @@ -174,11 +174,11 @@ Mac: 27 passed (the crate is not in the PC build inputs). The packager's self-te | 9h | The two-node 18-decimal gate on the re-cut binaries (`tools/fleet/base-unit-gate.sh` 72b02b48, the GPU form: RunPod RTX 3090, driver 580.65.06, the hive CUDA worker, rented and run by the fleet lane): PASS at 10:08 UK, 7 October 2026, on igneumd 8a6f1f56... and igneum-miner 726cf290... (fork commit f1717419): 577 blocks in 600 s, 421 chain blocks, both nodes on one sink and one exec tip (0x1a5), the 30 inspected coinbase payloads all the 18-decimal schedule (day-0 block 10 IGN = 10^19 base units), 80/20 exact on 18 of 18 single-payee coinbases, 577 segment rewards checked against the schedule at each blue block's own DAA with 0 wrong, eth_getBalance 4,617.53654629 IGN (4,617,536,546,296,296,296,298 wei) equal on both nodes and to the sum of the rewards; both node heads carry `Base unit: 10^18`, the digest `80af8aa1...`, the ladder active at rung 0, fees v1 from DAA 0 and proof verification from DAA 0 under the pinned ids. The first run of the same form (09:4x UK) read 165 of 561 rewards one ramp step low: the gate's check 5 still priced every reward at the chain block's DAA, fixed in 72b02b48 (each blue block its own DAA, the per-block rule). On the testnet object itself no voter exists inside a run (the 30-day window), so this line shows the layout, the switches and the identity without the bonus; the devnet-suffix line (9g) is the proof of the identity under the bonus | the fleet lane ran it, this lane reads it | PASS; the known-failed form (GATE_EXPECT_DECIMALS=8, the 8-decimal schedule against the same chain, 420 s) FAILED as it must at 10:15 UK: payload subsidies wrong 30 of 30, every segment reward wrong; the pod destroyed on this lane's done line ON THE 7 OCTOBER RE-CUT; RE-RUN ON THE GO OBJECT 5b673577 ON 8 OCTOBER, GREEN (row 9p) | | 9p | The pin's first pod run (8 October 2026, 09:45 to 10:00 UK, RunPod 3090 2rls7gfwii2d3g, the fleet hand): the fast-time line on 5b673577's pair read 14 of 16 checks true (start lines, one digest, class v4 at rung 0 ten epochs, 0 rejected, one sink on five nodes, the first lock at DAA 144, the silent key paid 72/28 on 127 blocks and the voters 80/20 on 318, the bridge identity exact for all five, a leave accepted and effective within the delay, no pause after it) and two false that were the harness's: the object-byte check expected 0 where the pin stamps byte 7 from genesis (the Devnet 3 shape), and "finality active at the end" sat on scenario arithmetic (one silent key of five at a quarter of the window held over a third of a 120-block window on a shared pod CPU, and the rule paused as designed); fixed at testnet-genesis-2 940d91de (the stamped byte read from the node's line; six keys). The two-node gate was void on that pod (its GPU dead for CUDA, cuInit 999: a host fault, the pod retired), and it showed base-unit-gate.sh dialling the public seeds (refused on the digest, harmless), fixed at 940d91de with `--nodnsseed`. Both gates re-run on pod 2 (tn-gate-0324b, RunPod A5000 secure yiu8x5dnh01g2y, driver 580.173.02, rented 10:29 UK after four 3090 hosts failed cuInit at rent; the hive 0.3.24 CUDA worker at 41.65 MH/s), the tree at 940d91de: the two-node 18-decimal gate form 1 PASS at 10:43 UK (340 chain blocks, 30 payloads at the 18-decimal schedule, 80/20 exact on 20 of 20, 512 rewards against the schedule at each blue block's own DAA with 0 wrong, eth_getBalance 4,097.20887963 IGN = 4,097,208,879,629,629,629,622 wei equal on both nodes and to the rewards' sum, both heads on `b2e856ed...`, no seed dialled); the fast-time line 15 of 16 true (six keys: the stamped byte 7 on 587 blocks and no ladder bits, class v4 at rung 0 ten epochs, 0 rejected, one sink on six nodes, the first lock at DAA 142 and lock 19 at the run's end, the silent key paid 72/28 on 91 blocks and the voters 80/20 on 352, the bridge identity exact for all six, a leave accepted and effective, no pause after it) with the one false check the harness's own stop order (its final read came after the voters had exited with the run; fixed at b8074151: the miners outlive the run and the read is taken as it ends); form 2 (the 8-decimal known-failed form, 420 s, 10:44 to 10:51 UK) FAILED as it must: 286 blocks, the sinks, the exec tips (0xbb) and the balances equal on both nodes, 30 of 30 payloads and 285 of 285 rewards wrong by exactly 10^10 (the 18-decimal chain read against the 8-decimal schedule), both heads on `b2e856ed...`; form 1's remaining lines: 513 blocks, exec tips 0x154 on both, exit 0. The object line's re-run on b8074151 (10:47 to 10:57 UK): SUMMARY PASS, every check true (eleven epochs at class v4 rung 0, the stamped byte 7, the first lock at DAA 141, the silent key 72/28 on 89 blocks and the voters 80/20 on 377, the bridge identity exact for all six keys, a leave accepted and effective, 0 rejected, one sink on six nodes at 613 blocks) | the fleet hand ran, this lane read | ON THE PIN 5b673577: form 1 PASS, form 2 FAIL as it must, the fast-time line PASS (rows 9g, 9h and 9j re-run and green on the go object as landed) | | 9g | The fast-time line of the object (`infra/fast-time/testnet-object.mjs`, a devnet-suffix network on igneum-build-1 at the 60x profile: 5 nodes, four voting keys and one `--no-vote` key, every switch of `testnet-object.json` from genesis, the fast-time finality profile with leave delay 60, the testnet schedule at the devnet's unit): PASS at 11:12 UK, 7 October 2026, run 10 on the archive binaries (igneumd 57ad7dc2..., fork 5c25c1fb): the start-up lines and one digest on every node; class v4 at rung 0 (27 passes) through ten epochs, no ladder bits, the object byte 0 on 551 blocks; 0 rejected, one sink on five nodes; the first lock at DAA 142 (172 s); the silent key's 87 blocks paid the bonus split on the UTXO side (72 percent of the subsidy at each block's own DAA, 720,118,333 sompi at DAA 142 against 800,131,481 for a voter) and the voters' 320 blocks the plain split; the bridge identity exact for all five miners over the chain (UTXO payments x 10^10 = execution credits less the tip's own: 96,832,949,992 sompi against 968,329,499,920,000,000,000 wei for voter a, and so on); a signed leave accepted at DAA 212, its key out of the voter count (5 to 4) at DAA 351, no pause longer than one second after it, finality active at the end at lock 18. The road to it: run 1 (pre-fix binaries) showed the executor crediting 80 percent to the silent key while the coinbase paid 72 (the N7 finding), run 7 the side blues credited one ramp step high when the per-block switch was left out of the profile (the N8 shape), run 9 every check green but the harness's own pause reading (one-second reason flickers at each new lock, corrected to consecutive seconds). On the testnet object itself the weight window is 30 days, so this line is the proof of the bonus and the identity before the go | this lane | PASS; the known-failed forms are on record from the same morning: run 1 on the pre-fix binaries (the silent key credited 80 percent on the EVM side against 72 on the UTXO side, every other check green) and run 7 on the fixed binaries with the per-block switch left out of the profile (every miner's credit above its payments by the side-blue steps). A binary that carries the per-block field without the bonus fix does not exist (the pre-fix binaries refuse an override naming the field), so no third form runs ON THE 7 OCTOBER RE-CUT; RE-RUN ON THE GO OBJECT 5b673577 ON 8 OCTOBER, GREEN (row 9p) | -| 9n | THE LAST STEP BEFORE THE GO (the coordinator's planned step, 22:4x UK, 7 October 2026): the object above holds the class v5 floor at never because Devnet 3's v5 crossing has not happened; the ruling is class v5 at 0 on the testnet IF that crossing reads clean (at DAA 68,400, about 12:54 BST on 8 October after the floor's last re-cut; the go not before the evening of 8 October). After the crossing's read the node lane re-cuts the testnet object once more with `program_class_v5_activation_daa` 0 (a new digest, the genesis unchanged), this table's digest row and the runbook's `--digest` are updated from the new binary's print, and the build-server lane re-arms the seeds on the pull-path dry run with the new binaries and sha. That re-cut object is the one the go uses; the object above is not placed on a seed if the crossing reads clean. If the crossing does not read clean, the object above stands and the v5 floor stays at never | the node lane re-cuts, this lane the table, the build-server lane re-arms | DONE 8 October 2026: the crossing read clean at 12:57 UK; the re-cut 0d05e795 landed 13:48 UK (digest `1da30c10...`, byte 6, genesis unchanged, the node lane's six suites green by 14:04 UK, its canary clean); this table and the runbook updated 14:2x UK; the seeds' re-arm on the pull-path dry run of 0d05e795's seed-class pair is the build-server lane's next step (row 9q) | +| 9n | THE LAST STEP BEFORE THE GO (the coordinator's planned step, 22:4x UK, 7 October 2026): the object above holds the class v5 floor at never because Devnet 3's v5 crossing has not happened; the ruling is class v5 at 0 on the testnet IF that crossing reads clean (at DAA 68,400, about 12:54 BST on 8 October after the floor's last re-cut; the go not before the evening of 8 October). After the crossing's read the node lane re-cuts the testnet object once more with `program_class_v5_activation_daa` 0 (a new digest, the genesis unchanged), this table's digest row and the runbook's `--digest` are updated from the new binary's print, and the build-server lane re-arms the seeds on the pull-path dry run with the new binaries and sha. That re-cut object is the one the go uses; the object above is not placed on a seed if the crossing reads clean. If the crossing does not read clean, the object above stands and the v5 floor stays at never | the node lane re-cuts, this lane the table, the build-server lane re-arms | DONE 8 October 2026: the crossing read clean at 12:57 UK; the re-cut 0d05e795 landed 13:48 UK (digest `1da30c10...`, byte 6, genesis unchanged, the node lane's six suites green by 14:04 UK, its canary clean); this table and the runbook updated 14:10 UK; the seeds' re-arm on the pull-path dry run of 0d05e795's seed-class pair is the build-server lane's next step (row 9q) | | 9o | Keyed payout addresses (the fleet lane's defect line of 8 October 2026, 09:4x UK, from Devnet 3: `tools/fleet/fleet.py` line 83 wrote a random payout address with no key for every rented box, so 578,000 IGN of Devnet 3 rewards by 22:28 UK sat on addresses nobody can spend from, and the load generator ran on the 432 IGN dev-fee key; the fleet's keyed-throwaway fix lands 8 October): before the go, every payout address in the testnet object and in anything the seeds or the first miner run has a key held by a named holder (the seeds mine nothing and name no payout; the first miner of step 10 pays the app's own keyed wallet or a named key; the dev-fee address is the app's). The faucet: the testnet genesis carries one IGN to OP_FALSE (unspendable) and no allocation, so a faucet is funded by the first keyed miner's blocks, never at genesis; a genesis allocation would be the project lead's word and a re-cut of the hash; the chain-side faucet or a funded key for load tests is logged for the 0.3.25 line (the node lane, 09:4x UK) | the fleet lane (its fix), the miner-community lead (the first miner's key), the project lead (any allocation) | OPEN; the node lane's line of 14:0x UK: no payout address goes in any object without a key behind it; `keygen` on the 0.3.25 miner prints the pair | -| 9q | The seeds' re-arm on the go object: the build-server lane builds the seed-class pair from 0d05e795 (glibc 2.34, the commit string twice, igneum-pow 1c420786) on build-1, runs the runbook's dry run on seed1, seed2 and seed3 with `--digest 1da30c10...`, `--commit 0d05e795`, `--genesis 01294fd3...`, the pair's shas asserted, the genesis read-back from `getBlockDagInfo`; `--go` only on the project lead's word | the build-server lane | NOT DONE: asked 14:2x UK, 8 October | -| 9r | The go seeds' node code: `release-0.3.24-node` at 0d05e795 carries none of the 0.3.25 node fixes (the ring check, the snapshot stamp, the proof-map window, the chain-id admission, rule 19's fingerprint). The node lane's line (14:0x UK): the go seeds should run the 0.3.25 pin's node code with this object, which is 0d05e795's one params change merged onto c9ad753a as one commit on `release-0.3.25-node` plus its gates (about 25 minutes), first thing after Devnet 3's move read-backs. The object does not change (TESTNET_PARAMS identical; the digest must read back `1da30c10...` from that binary or the row moves); the seeds then take that pair, and rows 9g/9h/9j re-run on it. Main decides whether the go waits for it | the node lane cuts, this lane reads the digest back, main rules | OPEN: asked of the node lane 14:2x UK, put to main | -| 9s | The gates on the go object's pair (0d05e795: igneumd `b76d8671...`, igneum-miner `0e67237f...`): the two-node 18-decimal gate (GPU form, `tools/fleet/base-unit-gate.sh` 940d91de, plus the known-failed 8-decimal form) and the fast-time line (`infra/fast-time/testnet-object.mjs`, `--testnet-params` as on 9p) on a fresh pod, the fleet hand; the node lane's six suites already green on it | the fleet hand runs, this lane records | NOT DONE: asked 14:2x UK, 8 October (the previous pod ended at its 3 h limit 13:29 UK with no pair to run) | +| 9q | The seeds' re-arm on the go object: the build-server lane builds the seed-class pair from 0d05e795 (glibc 2.34, the commit string twice, igneum-pow 1c420786) on build-1, runs the runbook's dry run on seed1, seed2 and seed3 with `--digest 1da30c10...`, `--commit 0d05e795`, `--genesis 01294fd3...`, the pair's shas asserted, the genesis read-back from `getBlockDagInfo`; `--go` only on the project lead's word | the build-server lane | NOT DONE: asked 14:1x UK, 8 October | +| 9r | The go seeds' node code: `release-0.3.24-node` at 0d05e795 carries none of the 0.3.25 node fixes (the ring check, the snapshot stamp, the proof-map window, the chain-id admission, rule 19's fingerprint). The node lane's line (14:0x UK): the go seeds should run the 0.3.25 pin's node code with this object, which is 0d05e795's one params change merged onto c9ad753a as one commit on `release-0.3.25-node` plus its gates (about 25 minutes), first thing after Devnet 3's move read-backs. The object does not change (TESTNET_PARAMS identical; the digest must read back `1da30c10...` from that binary or the row moves); the seeds then take that pair, and rows 9g/9h/9j re-run on it. RULED by the coordinator (14:2x UK, 8 October): the go seeds run the 0.3.25 pin's node code, after Devnet 3's move read-backs; a seed without the chain-id admission, the ring check and the proof-map window is today's fault class and does not go out; 0d05e795's own pair stays armed as the fallback only. So the go pair is the build-server lane's seed-class build of that one commit on `release-0.3.25-node`, its dry run on the three seeds (the third dry run of this runbook), and rows 9g/9h/9j on it from a pod; the runbook's `--commit` becomes that commit when it lands, `--digest` stays `1da30c10...` | the node lane cuts, this lane reads the digest back and moves the rows, the build-server lane builds and dry-runs, the fleet hand gates | RULED; the cut NOT YET LANDED at 14:2x UK | +| 9s | The gates on the go object's pair (0d05e795: igneumd `b76d8671...`, igneum-miner `0e67237f...`): the two-node 18-decimal gate (GPU form, `tools/fleet/base-unit-gate.sh` 940d91de, plus the known-failed 8-decimal form) and the fast-time line (`infra/fast-time/testnet-object.mjs`, `--testnet-params` as on 9p) on a fresh pod, the fleet hand; the node lane's six suites already green on it | the fleet hand runs, this lane records | NOT DONE: asked 14:1x UK, 8 October (the previous pod ended at its 3 h limit 13:29 UK with no pair to run) | | 10 | The first miner: one app on the testnet (PC 1 or PC 2 with the 0.4.0 build, or `igneumd --testnet` plus `igneum-miner --network testnet` by hand) produces block 1; the seeds relay it, `health.sh` shows blocks=1 on all three, `synced=True`; note the young-window join fault: a node that joins a chain younger than its finality window sees `synced=False` until blocks pass genesis, which is the no-blocks state, not a fault | the project lead says go, the miner-community lead starts it | NOT DONE: nothing mines until the word | | 11 | Watch: `NET=testnet ./health.sh --watch`, the RPC's `eth_blockNumber`, the DAA after 600 blocks (the launch difficulty `0x1d100000` is sized for a few hundred MH/s) | the infrastructure engineer | ready |