tools/ci/rule26-no-revert.sh: for every path under site/ or docs/ that master changed since the merge base and the branch also touched, every non-blank line master added must be present in the branch's copy (a merge of master carries them; a replace from an older copy loses them); a path the branch deleted counts as every line lost; a landing whose commit messages name the path lifts the refusal for it. merge-to-master.sh runs it after rule 24, before the merge loop, and refuses with the paths and the fix named. Self-test on a fixture repo: a replace and a deletion are refused and named; a branch that merged master, one on a disjoint path, and one that names the path as intentional pass.
Class (main through the coordinator, 8 October 2026, 17:5x UK): the og lane's a68a36c0 and the release-manifest ffd6751e put the reference-apps lane's receipt.html and then all of site/lc back to older copies on master, restored by its own merges.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
tools/ci/rule24-crate-gate.sh maps every .rs, Cargo.toml, Cargo.lock, build.rs or .cargo/config in the diff to its crate (the nearest [package] Cargo.toml; the workspace root when none nearer; the core pair igneum-pow and app/igneum-app for a root config; a vendor crate named and left to its lane) and runs cargo check then the crate suite on the box at gate priority; docs/ and site/ alone (docs-only-check.sh) run nothing; any other diff takes the full gate alone. merge-to-master.sh runs it against the merge base before its merge loop; the hook runs it on a push of master or release-* against the remote tip. Self-test with a fixture repo and a recording runner: the crate map for each file class, documents-only runs nothing, check then test per crate, a red suite fails the gate.
Class (main through the coordinator, 8 October 2026, 17:2x UK): master's igneum-pow stopped compiling at 17:07 under landings that never built it.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Documents-only copy of counter-asic-4 df7c85c1c (its delta over master 919293896: docs/analysis/class-v6, docs/design, docs/spec, the export list; nothing outside docs/ differs at that tip; the branch itself stays unmerged, its history carrying the igneum-pow research commits)
The facts page (/evidence) restarts with only Igneum 2.0 facts: five rows, each citing a landed document (the 2.0 devnet, designed and starting; the proof rule in consensus, implemented and switched off on the devnet; the 64-register window under 1 percent of rate at stock; the connected-state KILL; the positioning line). The six labels, the reading rules and "What would move a row" kept, reworded without the pre-2.0 history; the hand-written page parts rewritten to match (title "Igneum facts", the positioning line, the six-label eyebrow).
The criticism ledger is written fresh as docs/fud-ledger-2.0.md: 26 entries, one per pin group of docs/plans/igneum-2.0.md, each naming its pin. tools/ledger-page.mjs and tools/ledger/export-public.mjs read it by default (LEDGER_SRC overrides); the page shows each entry's pin and the 2.0 sections. docs/fud-ledger.md stays as history; the old public shape is kept as docs/ledger-public-pre-2.0.md (export-excluded). tools/ci/ledger-text-check.mjs pins only the 2.0 sentences (R0, B1 to B3, A3).
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
- build.mjs no longer writes bench.html, journey.html or journey.json; the three files are deleted; /bench -> /evidence and
/journey -> /live redirects (permanent: false); nav, footer, sitemap, capture routes and the site-nav-check groups drop them;
link-check resolves literal vercel.json redirects and lists every link that leans on one (evidence.html: /bench, another hand)
- every testnet card, column, row, notice and link removed from the pages this lane owns; release manifest: the testnet entry
gone, network igneum-devnet-4 "Igneum 2.0 devnet", the Devnet 3 genesis, digest, vote domain and floor lines dropped
- "Devnet 3" leaves every owned page; the devnet state is one constant in build.mjs (DEVNET_STATE, 'starting' now: the nav
pill and the homepage badge read "Igneum 2.0 devnet starting"; 'live' flips both and re-enables the nav's live read)
- no 0.x release history: screenshot alt texts say the current build, the miner page's "Current build:" keeps the data-rm
spans without the node version; miner-bench.json keeps the current-program rows only, no Counter ASIC names, no versions;
/miners drops the earlier-classes table, the history note and the miner-version column
- /income keeps the calculator; the testnet-era tier tables (docs/analysis/income-tiers.md) are not served
- the positioning line is the first line of the footer partial (every page), the homepage meta description's first sentence
and the hero's sub-line; share metas (site/og/pages.mjs) carry no Devnet 3 or zkEVM
- ledger-text-check is red on two index.html pins (X2, X31: the testnet sentences), owned by the ledger hand
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
mirror_master compared the landed remote's URL against the mirror entry's host:/path tail; the box remote is ssh://build@<ip>/srv/igneum.git, which never contains "<ip>:/srv", so the landed box took a second, harmless push on the 14:18 landing. The skip now matches the host alone; a self-test lands through the ssh:// form against a host:/path mirror entry.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
merge-to-master.sh called mirror_master only after a GitHub landing (remote_is_github && ...), so every box landing under the suspension exception left the other mirrors where they were: build-3 and build-4 sat at adfc46c5 (7 October 15:27) while the box mirror carried 92449eac, and lanes cut branches from the stale tip. The landing path now fans out for whichever remote took it, skipping that remote, and pushes with --no-verify: the sha is the landed remote's master read back, a copy of what the gate passed, not a landing (with the hook on, a stale mirror re-ran the full gate for six minutes per box). Self-tests: the landing line is pinned, and the mirror that took the landing is not pushed to again.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
While tools/ci/github-suspended stands the public host git.igneum.network holds a rewritten copy whose master is replaced at cut-over by the rewrite of the box mirror's final tip, so a landing there is lost: pre-push.sh (forgejo_master_frozen, hook mode) and merge-to-master.sh (forgejo_master_refusal) refuse one and name the box route; a branch pushed there for safekeeping passes.
The installed hook hands the gate "<remote name> <url>", and the remote rules read $2, the name: "origin" matched no *github.com*, so the GitHub refusal and the CI rule never bound a named push. Hook mode now resolves the URL ($3, else git remote get-url) and the self-test drives the hook by name through a fixture repository for the GitHub remote, the public host and a safekeeping branch. GATE_ROOT is the script's own repository, so the helpers are read from it wherever the hook is driven from.
gate-manifest-check.sh under pipefail piped names_in into grep -q; GNU sed took SIGPIPE when grep matched early and the check read it as a missing run line (a research lane's gate on build-3, 13:4x UK: forty names "missing", the Mac never saw it because BSD sed had finished writing). The names are matched through a here-string now, proved green five times on build-3; the same shape is removed from playbook-quit, pc1-step-budget and second-engine. mirror_master fast-forwards every box with a build-server file (build-3 and build-4 sat at 7 October 15:27).
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Twice today a merge gate died to signal 15 from another lane's kill pattern (12:4x UK, and the three-node script's self-kill at 10:05 was the same class). The sender cannot be read after the fact (no process accounting on the Mac, nothing in the unified log, a trap sees no sender), so the class is closed by rule: tools/ci/pre-push.sh re-execs under the title igneum-gate:<pid>-<start> and writes "<pid> <start> <mode> <title>" to .git/igneum-gate.pid under the worktree (removed at exit); tools/ci/merge-to-master.sh the same with igneum-merge:<pid>-<start> and .git/igneum-merge.pid; a gate or a merge run is stopped by `kill "$(cut -d' ' -f1 <that file>)"` and never by a name. tools/ci/kill-by-name-check.sh rule 4 (in the gate on every push): killall with any pattern, and pkill/pgrep (with or without -f or -x, bracketed or not) on a generic tool or a gate's name (bash, sh, zsh, node, cargo, python, ssh, git, perl, gate, igneum, pre-push, merge-to-master, build-remote, remote-run, igneum-gate, igneum-merge) are red; pkill -F <pidfile>, pkill -P <pid> and a daemon's own binary under -x stay allowed. Known-failed first: eight new banned shapes and four allowed ones in the self-test; the gate's self-test holds a gate open and reads its title and pid file, then sees the file gone.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
/income (through its generator, tools/launch/income-page.mjs, so the page check holds): pick a card (every current bench row, stock and tuned apart, inlined by the build; a tuned row at its tune point's rate), set a kWh price (the region's tariff from money.js, GBP 0.25 named as the default), type an IGN price (no default; the field says "no market yet: enter a price to see the figure"), read the network hash rate and the newest block's DAA from /api/live and the block reward from the chain's own rule (site/lib/emission.mjs at that DAA, 80 percent to the miner), and see IGN a day, electricity a day and money a day at that price, with the line that devnet and testnet IGN have no value. The arithmetic is site/lib/income-calc.mjs; site/lib/income-calc.test.mjs holds the known-failed case first (an empty, zero, negative or non-numeric price gives no money figure) and runs in the gate. The testnet tier tables stay below, named as the testnet's.
/economics: the emission as the node encodes it (release-0.3.25-node at e0644958, confirmed by the node lane: CURRENT on Devnet 3 and mainnet, TESTNET_1 on the testnet, each field with its file and line), the 80/20 split and the inactive silent-block bonus, the fee routes as the executor has them (base fee burned, the tip 80/20 with unregistered shares burned, external jobs designed and not in the code), the proving-fee market, the switchable 1 percent client fee and the fund it fills, the decimals per network; no price, no projection; "Not legal advice." alone. In the Learn group, the sitemap, the nav check and the capture routes; every page's chrome re-injected.
Bench table: class v4 watts rows 13 to 18 (RTX 2070 Super 204.2 W, +23 percent; GTX 1080 Ti 202.7 W uncapped, +63 percent; A100 500 W SKU 489.3 W, +78 percent; H100 695.1 W on its cap, +52 percent; RTX A4000 135.2 W at its stock cap, no premium; a tuned 2080 Ti board 161.1 W, the rate as a range by board).
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>