Commit graph

163 commits

Author SHA1 Message Date
igneum-labs
07e29cfb7e fast-time: pool_split_activation_daa (null) in override-60x.json; the 0.3.23 line carries the field (b0444f51)
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-07 19:06:31 +00:00
igneum-labs
06e99bd8ea fast-time: override-60x.json as master's union (75 keys, the cache rung switch at never)
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-07 18:53:14 +00:00
igneum-labs
70df23c0fc fast-time: the genesis-forward fields (null = never) in override-60x.json; the 0.3.23 line carries them (0ead4613)
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-07 18:27:01 +00:00
igneum-labs
e54fda40d7 fast-time: switch-crossing.mjs drops null override fields at write (an older binary refuses an unknown key)
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-07 18:12:00 +00:00
igneum-labs
59db296e4c fast-time: switch-crossing.mjs, the mid-chain crossing gate for a height switch (difficulty v3, the finality DAA-seconds rule, the finality leave rule): two nodes across the switch, a late joiner, the known-failed digest split; getFinalityCheckpoints takes {last}
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-07 18:09:31 +00:00
igneum-labs
92e0c706ba fast-time: subsidy_per_block_activation_daa (null = never) in override-60x.json; the 0.3.23 line carries the field (d840537b)
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-07 18:05:49 +00:00
igneum-labs
9a8d5ad2b3 fast-time: the era VDF's five override fields in override-60x.json (the era schedule at 60x: 259,200 blocks and a 120-DAA lead; the VDF switch, scheme and T null = never and the defaults). The fork's 60x-file test reads every field of the object; 0.3.22 carries the era fields.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-07 16:44:07 +00:00
igneum-labs
5aabe24829 fast-time: override-60x.json carries the 0.3.21 line's new OverrideParams fields (the pool split and peer directory switches) as null
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-07 15:50:22 +00:00
igneum-labs
3f8479ec27 Merge remote-tracking branch 'origin/master' into ca3-v4-node 2026-10-07 13:22:57 +00:00
igneum-labs
1c6e07463a build-server lib: the route check names its ssh key and options itself (it runs before bs_host fills BS_SSH_OPTS, and the Mac's bash 3.2 reads the empty array as unbound under set -u; every Mac lane's build-remote died at 13:20Z)
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-07 13:21:36 +00:00
igneum-labs
0deaa5489a CI queue: a second self-hosted runner (igneum-build-2 joins the pool label), docs-only pushes skip the compile jobs, the red watcher pinned to the box that posts
31 runs were queued on igneum-build-1's one runner at 13:15 UK on 7 October 2026 and nothing had concluded since 13:03Z, so no lane could read a conclusion.
- ci.yml: a `changes` job (ubuntu-latest) classifies the push with tools/ci/docs-only-check.sh (docs/, site/, *.md only = code=false; a new branch, a pull request, a force push or an API error = code=true); pow and sims need it and run only on code=true. The site job is unchanged on ubuntu-latest for every push. The classifier's self-test is in the gate.
- provision.sh and runner/register.sh: `--host <ip>` registers another box, forwarding BOX_HOSTNAME, RUNNER_NAME, RUNNER_LABELS, RUNNER_CPUS and RUNNER_JOBS (plain words only); RUNNER_CPUS writes AllowedCPUs into the service drop-in beside Nice=10, so igneum-build-2's runner is bounded like a suite (32 cores). The pool label is igneum-build-1 (both boxes carry it); ci-red marks the box with the record file and the poster, the default labels carry it, and igneum-build-1 got it through the runners API today.
- ci-red.yml runs on the ci-red label, so the red line always lands where the poster reads it.
- CLAUDE.md: the rule reads "read the conclusion when it lands, own a red before the next push"; pushes are never held.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-07 13:20:18 +00:00
igneum-labs
19196e1806 Merge remote-tracking branch 'origin/ca3-v4-node' into ca3-v4-node 2026-10-07 13:17:39 +00:00
igneum-labs
721e0f3ab9 Merge remote-tracking branch 'origin/master' into build-server 2026-10-07 13:17:19 +00:00
igneum-labs
caff656593 Build boxes: the box probe carries its own ssh options (bash 3.2 under set -u refused the unset BS_SSH_OPTS array before bs_host built it; every unpinned route on the Mac died, the pool lane 7 Oct 2026); the router check runs the ssh path under /bin/bash
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-07 13:16:39 +00:00
igneum-labs
b28ba7d4b0 Merge remote-tracking branch 'origin/master' into ca3-v4-node 2026-10-07 13:10:35 +00:00
igneum-labs
3a039c3c8d fast-time fork gate: the three gate summaries carry keys as 8 hex and an ellipsis, written through the redacting writer; CI on ca3-v4-node red since 11:26 UK on the no-secrets check
- docs/plans/counter-asic-3-gate/fork-gate-*.json: keys.a, keys.b and every sinks.*.key shortened (the first 8 hex characters then "…"); hashes untouched. Produced by the helper, so the files are what the runner now writes.
- infra/fast-time/fork-gate.mjs: writeSummary() from infra/fast-time/lib/redact-keys.mjs replaces the raw JSON write; a summary with a raw 64-hex key under a key-shaped field fails in the runner, with the line named, before the tree does.
- infra/fast-time/lib/redact-keys.mjs and its gate line in tools/ci/pre-push.sh: identical to master 3fae3166, so the merge is clean.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-07 13:09:56 +00:00
igneum-labs
3fae316607 CI gate: the feature-branch hook runs the never-push classes (no-secrets, identity grep) beside the structural checks; harness summaries write keys through a redacting writer with its own check
The class (7 October 2026, 11:26 to 12:47 UK): three fork-gate summaries on ca3-v4-node carried the miners' vote-key hashes under "key" and eight CI runs went red on "no secret file names and no 64-hex secrets in the tree" while the pushing lanes saw nothing: the light gate ran only conflict markers and Windows paths.

- tools/ci/pre-push.sh: never_push_checks() (identity grep, no-secrets) runs on every ref from --hook, and inside the full gate where the identity grep already sat; the self-test asserts the wiring; the light gate is about 20 s on the Mac.
- infra/fast-time/lib/redact-keys.mjs: writeSummary() shortens every 64-hex value under a key-shaped field to 8 hex and an ellipsis and refuses a text the no-secrets rule would flag (line named); --self-test and --check; the gate runs the self-test. fork-gate.mjs adopts it on ca3-v4-node.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-07 13:09:06 +00:00
igneum-labs
0e4ea6909d Merge branch 'build-server' into HEAD 2026-10-07 13:08:22 +00:00
igneum-labs
b04c4b3ac9 Build boxes: the class router is a preference with spill-over (a held or overloaded box hands the job to the other one); build-2 gets a third slot and every run there is bounded on its own 32-core band; the spill decision in the first route line, the slot label and the JSONL row
the project lead, 7 October 2026 15:02 UK: build-1 at load 139 / 114 / 90 with both slots held and a 1 h 40 min queue while build-2 read 4.5 with
free slots, because the class router pinned each class to its box. Now lib.sh bs_route_spill reads the preferred box (free slots,
1-minute load) with one ssh and hands the job to the other box when the preferred one has no free slot or sits above load 64 and the
other qualifies; neither qualifying queues on the class's own box. The decision travels as BR_ROUTE_* into the JSONL "route" object
for the dashboard. build-2's slots file reads 3; everything on box 2 runs at nice 10 / 32 cores / -j 32, and a bounded run takes
the band its slot owns so three never share a core. Self-test tools/ci/route-spill-check.sh (thirteen cases) in the gate.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-07 13:08:19 +00:00
igneum-labs
3fa251cd10 Merge origin/master into ca3-coord: the status file keeps the 7 October rows (a20d238f's merge had taken its 6 October side), the bench-log keeps both sides
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-07 12:24:27 +00:00
igneum-labs
1ba3195170 fast-time digest gate: the peer count is the minimum of five reads two seconds apart (a refused peer's reconnect in flight read as a peer on the 6b94c823 run)
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-07 12:09:28 +00:00
igneum-labs
b3c2dbe5a4 fast-time: override-60x.json pins the latency ladder window at 120 DAA and its activation at never, as the 60x file test reads them
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-07 11:26:17 +00:00
igneum-labs
183eb55a95 Merge remote-tracking branch 'origin/master' into ca3-v4-node 2026-10-07 11:23:28 +00:00
igneum-labs
97255a4e8f Build boxes: the slot holder keeps its own line (a keeper, with its self-test in the gate); an explicit --jobs is clamped for bounded classes; one git remote per box; the host-file double suffix
The dashboard lane, 7 October 2026 10:39Z: both slots of build-1 flock-held and EMPTY while two suites ran. Cause: a run from a
worktree without last night's append-mode fix opens a busy sibling's slot file with > on every probe. The holder now keeps its own
line: a keeper re-writes it within BR_KEEP_S (20 s) whenever the file is empty, until release; remote-run.sh --self-test-keeper
(in the gate) truncates a held line and sees it return, and sees nothing written after release; live on build-1 at 11:19Z (the
line came back in 25 s). The first version deadlocked the runner's bare wait with the keeper (build-2's first run hung 15 min
after its test passed): the keeper stops before the wait. The two running suites' -j 90 came from explicit --jobs 90: a bounded
class now clamps it to its cap with a log line (pass --priority gate for the full set). run-from-mac.sh --box N: the host file
was suffixed twice (build-server-2-2) and every box's mirror would have shared one remote name; one remote per box (build-N).
build-2's first green run: a suite at nice 10 on 32 cores, jobs 32, 986 s cold.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-07 11:22:12 +00:00
igneum-labs
74eb671c65 Merge remote-tracking branch 'origin/workers-dash-2'
# Conflicts:
#	tools/workers/page/workers.html
2026-10-07 10:43:34 +00:00
igneum-labs
e9c5a7df4a fast-time: override-60x.json carries every OverrideParams field of the 0.3.20 tree (sixteen Option fields as null, the devnet defaults), the 60x file test's rule
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-07 10:41:25 +00:00
igneum-labs
9a6f2606b8 Worker dashboard: one server section per box, per-box live feeds, installer and pusher take build-2 and build-3
The build-server agent has igneum-build-2 and -3 on order (suites and benches; proving and the fast-time nodes). The
installer takes a host argument (N reads ~/.config/igneum/build-server-N, or build@<ip>); the pusher drops the Mac and
PC facts on every box it has a host file for, pulls each box's file and publishes boxes[] (box stays the first for the
old shape); the page draws one server section and one crew card per box, reads every box's Caddy feed in parallel
(build, build-2, build-3.igneum.network) with the edge copy filling any box that does not answer, and merges every
box's builds into the lanes, the timeline and the analytics. Nothing changes for build-1 until the host files exist.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-07 10:37:33 +00:00
igneum-labs
8b0bfb8e39 run-from-mac.sh --box N: the box's dashboard feed name build-N.igneum.network travels to provision as WORKERS_HOST
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-07 10:35:45 +00:00
igneum-labs
b6e5dffa32 Build boxes: one host file per box and a route by class (suites and benches to build-2, proving to build-3, the rest to build-1); the no-mining rule in a box README and as a guard in the capacity layer
Main's order of 7 October 2026 (igneum-build-2, AX162-1, and igneum-build-3, AX102-1, on order). lib.sh: bs_box_file N and
bs_route <class>; a class whose box has no host file yet falls back to box 1 and says so. run-from-mac.sh --box N <ip> provisions
igneum-build-N and writes build-server-N. tools/build-remote.sh --box N overrides the route; --priority gate always runs on box 1;
the proving crate routes to box 3. README.md: the kind map and the project lead's rule, no mining on any Hetzner box, ever (nodes, builds, tests,
benchmarks and CPU proving only; the pool's fast-time network mines on rented GPU pods, never on build-3). capacity/run.sh refuses a
job that would start igneum-miner mine or a GPU worker, whatever SEQUENCE says.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-07 10:34:16 +00:00
igneum-labs
a7adf116c6 Merge remote-tracking branch 'origin/master' into ca3-v4-node
# Conflicts:
#	docs/analysis/horizon/network.md
2026-10-07 10:31:27 +00:00
igneum-labs
69034dc071 Build box scheduling: suites and benches at nice 10 on 32 cores with -j 32; a gate kind at nice 0 on the full set ahead of queued suites; kind, nice and cores on the slot label and the JSONL line; the default-class CI check
Main's order of 7 October 2026 after a load of 190 on 96 threads (a release join bench and the 0.3.19 app gate starving each
other, 'builds' of 16 minutes). tools/build-remote.sh resolves a class from the cargo subcommand and --priority: test and bench are
the bounded class (nice 10, the last 32 cores, -j 32) unless --priority gate (nice 0, the full set, the box's own jobs rule);
builds and checks are unchanged. remote-run.sh applies renice and taskset to the command's subshell, caps the jobs, lets a queued
gate (gate-pending-<pid>) take the next slot ahead of suites and benches, and prints nice and cores in the RESULT line and the
JSONL line (nice, cores, priority). The slot label carries '; kind=<k> nice=<n> cores=<c>' before '; agent=', so the dashboard's
job card shows why a job is slow. --plan prints the resolved class without the box; tools/ci/build-kind-default-check.sh (in the
gate) holds the five shapes. Smoke on the box: a suite at jobs=32 nice=10 cores=32, a gate at nice=0 cores=96.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-07 10:29:26 +00:00
igneum-labs
96428a1068 fast-time: override-60x.json carries difficulty_v3_activation_daa (never), the field the 60x file test demands on the 0.3.20 tree
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-07 10:08:54 +00:00
igneum-labs
e40608c3e3 Counter ASIC 3.0 node: the amended class v4 (AP-F8-1) is object 5; the split mechanism, the earliest flip arithmetic (section 6.6) and the signal harness stamping 5
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-07 09:46:35 +00:00
igneum-labs
612fefc401 fast-time: the bridge check pairs a parent's UTXO payment with the parent's own EVM record (a chain block is credited in its own record); the exact identity fails the gate in both rule states
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-07 08:55:10 +00:00
igneum-labs
1bb91045a1 fast-time: the join harness's late-join hook for the testnet lane (--prover beside A's miner, --join-after past the pool's record window, per-node exec ports)
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-07 08:47:41 +00:00
igneum-labs
446f2d38e1 fast-time: the bridge check takes the smaller of a key's two reward entries as the merged parent's (the segment lists the parent before the chain block)
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-07 08:42:59 +00:00
igneum-labs
7d5e62d881 fast-time: the bridge check pairs by the miner's address again (the mergeset-order pairing found no rows)
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-07 08:26:03 +00:00
igneum-labs
210084b0e5 build server: the remote checkout's clean spares a lane's scratch (AP-H1, the lost-scratch class)
remote-run.sh checkout_tree ran `git clean -fd` on the box mirror before every build from any agent, so the attack rows
lost attack-f3/, attack-f1-venv/ and tools/attack/*/target to each other's builds (7 October 2026, 09:2x UK). The clean now
also spares the fixed prefixes attack-*, scratch-*, target-attack-*, .build-remote.log and every glob in the mirror-local
.igneum-scratch-spare (one per line, # comments, the file itself spared), keeps the target and stamp excludes and still runs
without -x. The clean-tree test asks `git clean -nd` with the same excludes instead of filtering the status list, so a spared
dir is not "not clean". --self-test: a fixed-prefix dir at the root and nested, a declared dir and the spare file survive, an
undeclared dir is removed. tools/ci/scratch-spare-check.sh in the pre-push gate fails when the clean line loses the spare
arguments, spare_args stops reading the file, a fixed prefix goes, or -x appears. docs/plans/build-server.md R4a says how a
lane declares its prefix.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-07 08:24:07 +00:00
igneum-labs
65c36a5b16 fast-time: --subsidy-per-block on the vote-or-burn harness (ledger N8's switch at 0; the exact per-row bridge identity then fails the gate)
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-07 08:20:46 +00:00
igneum-labs
5770460c13 fast-time: the bridge check fails on the EVM bonus ratio (B's credit over A's); the exact per-row identity is reported until the executor credits merged blocks at their own DAA
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-07 08:18:15 +00:00
igneum-labs
acd3729678 fast-time: the bridge check pairs the paid block's reward entry by its mergeset position, not by the miner's address
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-07 08:16:59 +00:00
igneum-labs
05526a6e88 fast-time: the vote-or-burn harness checks the bridge identity per pair row (ledger N7: the exec record of the merging chain block credits the paid block's miner what the UTXO coinbase paid; --evm-rpclisten per node)
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-07 08:10:02 +00:00
igneum-labs
3446f0c8a2 fast-time: the vote-or-burn harness refuses its burn rule (vote-or-burn removed from the node on the project lead's word, 7 October 2026); rules none|bonus
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-07 07:43:45 +00:00
igneum-labs
02d7f5ab81 Observer sync follows GitHub: the deploy-key probe captured before grep (ssh -T exits 1 under pipefail); plan 5c done
the project lead added the read-only deploy key on 7 October 2026 (SHA256:51ice3W8...). The sync still said 'mirror' because ssh -T to GitHub
exits 1 after its greeting and observer-sync.sh runs under pipefail, so su ... | grep -q reported failure although grep had
matched (the same line by hand, without pipefail, said authenticated; shown under the unit's environment with systemd-run -v).
The probe's output is captured first. First github pass 07:30:54 UTC: the clone moved from the mirror's d79f4a6 to origin/master
8b878ba4, the observer restarted on it.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-07 07:31:42 +00:00
igneum-labs
3cc5e5c2f0 Hands mover: on 0.3.18 trees the restart read-back takes powEngine and the blockrate object from igneum_getNodeInfo; a stub answer stops the sequence
The shipper's read-back for 0.3.18 (7 October 2026): igneum_getNodeInfo exists again and must answer powEngine igneum-pow (a stub
is a FAIL) with a blockrate object, which the mover prints; a tree before 0.3.18 answers -32601 and the engine is still read from
the binary's igneum-pow source paths. The parser is checked against the three answer shapes.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-07 06:25:12 +00:00
igneum-labs
b66624fbe3 fast-time: the headers-proof join harness (the fuzz gate's extension; the 0.3.17 canary's own path) with --window, and its w661 known-failed record
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>
2026-10-07 05:22:34 +00:00
igneum-labs
6bac2b15bd replay gate: the devnet-window row in 7.6 (rule checks pass, the harness's sync clause corrected for a pruning A), the idle-network note in 7.7
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-07 05:22:16 +00:00
igneum-labs
fd4785d2bc lib.sh: bs_pin gives an empty pin for a tree without rust-toolchain.toml (a failed sed under pipefail ended the caller silently)
The b3c228fa builds under the 0.3.16 app tree 5d118f58 (no rust-toolchain.toml yet) died right after the pairing line with no
message: sed on the missing file failed, pipefail carried its status into the assignment, set -e ended the script. A guard and a
tolerant pipeline; checked alive against a tree without the file.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-07 03:44:26 +00:00
igneum-labs
db6475def5 Build tools: whole-body blocks (the edited-while-running class, with its check), the igneum-pow pairing line, move-hand.sh restart with its readbacks
Three classes from the 0.3.17 night. (1) bash reads a script incrementally: tools/build-remote.sh was edited while a four-minute remote
build ran, the running copy continued at shifted bytes and died with a syntax error after the build had succeeded on the box; the
four long-running tools (build-remote, cross-remote, workers-remote, move-hand) now keep their body in one brace block ending in exit,
parsed whole before a line runs; tools/ci/whole-body-check.sh (in the gate, self-test with a block-less copy) holds the shape.
(2) A fork build pairs with the igneum-pow of the igneum worktree it sits in: a fork at 12153428 under a master worktree failed in
kaspa-pow four minutes in (no chain_program_shadow; master's igneum-pow predates release-0.3.17's); build-remote.sh says the
pairing on its first line ('pairs with igneum 6f8d7a7e (detached): igneum-pow 0.2.0') and the JSONL line carries pairs_with.
The first version of that line used '[ -n ... ] && echo' inside an assignment's $( ) and set -e ended the script on the false
status; fixed. (3) move-hand.sh restart <hand> [--digest <hex>] [--go]: after binary installed a release, restart ONE unit and read
it back (first exec line, commit string in the running binary, digest against the wanted one, igneum_getNodeInfo powEngine over the
node's loopback EVM RPC); the digest readers tolerate a missing line.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-07 03:12:51 +00:00
igneum-labs
902c82fc05 0.3.18 (node): the 30-s controller reading: a protocol regime (the k bound), not a harness artefact; the 10-s, 20-s and 30-s rows; the fix shape named for 0.3.19
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>
2026-10-07 03:12:24 +00:00