Node A mines past the pruning depth at the fast-time profile (finality 120, pruning 4,600), a fresh node B joins
by headers proof; PASS = B takes A's sink with the 1026 header version. --window sets the sampled difficulty
window in samples: 150 (the minimum, 600 DAA) by default; 661 (the devnet's, 2,644 DAA) is the known-failed
shape found on the first run (7 October 2026, 04:45 to 05:55 UK): B's walk through the sampled trusted blocks
ran out before genesis and "DAA window data has only 180 entries" ended the IBD, then the N6 guard banned the
syncer on each retry. The node fix is e3798a17 on ca3-v4-0318 (a young chain's short window is legal when the
walk reached the chain's start); the devnet and the testnet never meet the shape (pruning samples at multiples
of the 43,200 finality depth).
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
The same harness at 10, 20 and 30 s of propagation at 1 bps: at 10 s one shared DAG (254 blocks via relay, mergeset
3.4, red 36 percent, the controller within 1.1 percent); at 20 s under-merging (mergeset 1.6, the rate 19 percent
under, the difficulty 40 percent under); at 30 s nothing merges (mergeset 1.0, every node its own chain). At k = 18
the blocks in flight pass k between 10 and 20 s, k's own derivation. Fix shape, not built: an IBD trigger on a stale
sink (a node whose relayed blocks stop merging syncs the heavier chain instead of mining alone; the 30-s hub never
entered IBD) and k with the merge depth sized to the measured delay bound at the block rate. Owed: the long run's
decay (3 via relay in 40 minutes) with a kept log; the harness now takes --loglevel.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
7.2: the pipelined relay (fork bb397f99) at 10 bps and a 3-s propagation delay holds 10.01 blocks/s with the
difficulty 7.7 percent over the hash-implied value, the hub taking 7,746 blocks via relay against 4,015 via submit;
the same run at a batch of 1 (the 0.3.17 flow) takes 445 against 801 and reads 0.351. N3 closed in the ledger,
network.md 5.11 and CLAUDE.md's gate line. The 1 bps, 30-s case did not merge on either flow (3 blocks via relay in
40 minutes, no IBD, no error, one reconnect per spoke): at a 30-s delay the blocks in flight exceed the k bound, and
its cause is owed its own reading (7.3).
7.7: the N4 node half's gate (peer-drop.mjs): a still sink dropped its silent peer at 720 s and re-dialled at 750 s;
a moving sink kept the same peer through 155 sinks; the harness's failed shape fails.
7.8 and ledger N6: the stale-block nuisance guard (fork 319da644, f2b25fdf, a22cb261), the shipper's record (310 to
551 connections in an hour from four stale datadirs), the two halves and the knob; the gate (nuisance-peer.mjs, a
node mining stub-engine blocks with proof of work off and restarting on the shared rule with its datadir): the
sender half flat with the skip line, the known-failed shape climbing (3 connections, 2 refusals in 300 s), its
mirror failing, the receiver half flat with one refusal and the ten-minute ban. Also recorded: the vote-or-burn
harness's devnet finality object (--finality devnet) for the replay running to about 05:00Z.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
7.6: the late node synced from genesis across a switched-on span holds every block (313 of 313 for the burn, 331 of
331 for the bonus, one sink each, 0 rule error lines, 5 s) and the payouts read as before (0.8000 and 0.9000, the
pool 0.25 and 0.35). The first reading's failure is kept for the record. Not yet shown and named: a fresh node
syncing a span longer than two weight windows, where the vote records behind the pruning horizon are the one
node-local input left.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Section 7.5: five runs recorded. The first idled nothing and never asked the gate; the second found the depth gap
(fixed 3301cf32); the third found the extension shortcut (fixed aa0182aa: a candidate on the sink's chain is not let
through, the depth along its own chain decides); the fourth, on aa0182aa, PASSES (B 2,750 bps at the fork, 183 DAA
deep, heavier by 183, A kept its chain for 150 s and learned 177 of B's blocks, 268 refusal lines, one per refused
block); the known-failed case PASSES (gate off, A reorged onto a 2,083 bps key's 162-DAA chain 25 s after the heal);
the harness's failed shape FAILS as it must. Three harness faults fixed on the way (shared ports, an RPC call before
the socket opened, a reorg test by key instead of by chain) and one build fault (ledger N5, the stub-engine node).
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Ledger N5: cargo build -p kaspad alone leaves the igneum-pow feature off (kaspad/Cargo.toml, default kHeavyHash
stub); igneum-miner turns kaspa-pow/igneum-pow on, and feature unification carries it into kaspad only when the two
are built together. A node built alone refused every real block (two fork-gate chains, 0 blocks), the same miner
mined 118 and 115 blocks against nodes built with both packages. Recommendation: igneum-pow a default feature of
kaspad for 0.3.17, the engine named in the version string (igneum_getNodeInfo's powEngine carries it now).
Node document 7.5 and 7.6: vote-or-burn none PASS, the known-failed case FAILS, burn and bonus PASS on the payout
(0.8000 and 0.9000, the pool 0.25 and 0.35) and FAIL on the replay (a node synced from genesis across the span
disqualified 240 blocks as UTXO-invalid: its silence reading differs from a present node's; both switches stay
never until the reading is a pure function of the block's past); the replay gate's own failed shape (another
digest) refuses at the handshake. Fork gate: the rule's known-failed case PASSES (a 32.5 percent key's 171-DAA deep
fork took A's sink 25 s after the heal under the rule as written); the gate-on case found the depth gap (fixed on
the fork, 3301cf32) and then PASSED on the rebuilt pair (B 2,810 bps, 193 DAA deep, heavier by 193, A held, A learned
188 of B's blocks) with a log flood fixed next (9a44fcb8); the harness now waits for each node's RPC and clears
leftover nodes before a case. The chain on the final pair runs; its three lines land in the table when it closes.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
network.md 5.11 and proposal 1: Kaspa's relay requests one round per batch, so at 10 bps and a 2-s RTT the hub took
one spoke block in three (every block a chain block, two thirds of the network's hash merged nowhere); at 400 ms it
took all of them. The fourth gate for any rate step: relay delivers the full block rate at the measured inter-region
RTT with margin. CLAUDE.md's block-rate line carries it. The live 1 bps devnet offers under one block per RTT and is
nowhere near it. Controller rows (node document 7.2): rule v3 at 600 ms holds 9.93 blocks/s with the difficulty 4.5
percent over the hash-implied value; the live rule v2 reads 22 percent under on the same DAG shape.
Ledger N4: the vote weigh-up's silent desktop key, upload by upload from miner_logs and the observer: the voter never
died and --no-vote was never set; the node fell off the network (a digest-mismatch refusal, then a same-digest peer
that relayed nothing), its tip froze for 53 minutes, and the miner hashed and voted on the frozen template with
synced=true throughout while the node accepted 1,750 blocks into a dead branch. The fix pair on the fork (miner
e6e1fbe2, node 96619b7d); infra/fast-time/miner-stall.mjs: stall PASS (STALLED at 30 s, exit 45 at 31.5 s), moving
PASS, today's miner FAILS as it must.
infra/fast-time/fork-gate.mjs and vote-or-burn.mjs with the replay gate (--replay). First lines: vote-or-burn none
PASS, the known-failed case FAILS, burn PASS on the payout (ratio 0.8000, pool 0.25) but the REPLAY FAILS: a node
synced from genesis across the span disqualified 240 blocks as UTXO-invalid (its silence reading differs from a
node that was present), so both vote switches stay never until the reading is a pure function of the block's past;
fork gate: the first run idled the honest side and the depth read 0 (fixed on the fork, 3301cf32: depth along both
chains), the re-run's lines follow. The tree ships as 0.3.17 (node document section 7).
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
class-v4-signal.mjs now runs the 0.3.16 rule (95 percent in each of 7 consecutive windows ending at the seed block;
the flip at epoch 4 with the 30-DAA window), requires a floor for a signalling case (the canary rule: no floor, no
signal; the floor-less first pass read every chain byte 0), reads programClassV4SignalWeakestBps and checks that the
signal line names seven windows. The four cases on 6 October 2026, 20:57 to 21:25Z: two of three signal, no flip
(weakest 5,666 to 6,333 bps); all three, flip at epoch 4 (DAA 241 seen, boundary 240; 3 of 3 signal lines; the id
assertion on epochs 4 to 6); nobody, the floor at 360, flip at epoch 6 and not before; the known-failed case FAILS on
nine checks. Summaries in docs/plans/counter-asic-3-gate/class-v4-signal7-*.json.
infra/fast-time/difficulty-v3.mjs (Horizon lane 5 proposal 2's harness case): three nodes in a star through a TCP
delay proxy (the document's propagation delay d over Kaspa's three relay legs, inv, request, block, so d / 3 per
leg; the handshake's first 5 s undelayed, the version exchange times out at 4 s), override-60x.json re-rated to
10 bps (the override-params.md example's k 124 and limits, depths x10, PoW epoch 600 DAA so an epoch stays 60 s),
one CPU miner per node, pass = DAG rate within 10 percent of target and the sink's expected hashes per block within
10 percent of the miners' summed hash x T after 600 of 900 s; the red share and chain step spacing reported. Results
follow in their own commit (the runs are in progress at 21:30Z).
docs/design/execution-layer.md 8.2: the igneum_getRecentBlocks row (fork eec34ac3).
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>