Commit graph

420 commits

Author SHA1 Message Date
igneum-labs
59fe7d08b4 Merge remote-tracking branch 'origin/miner-reliability-21' into release-0.3.21 2026-10-07 13:16:12 +00:00
igneum-labs
cb8a265431 fake worker: the OpenCL listing carries the real worker's header line, so the engine reads an answered enumeration and removes a card that left
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
(cherry picked from commit ecd798747a26d339ff514da04773be858780636c)
2026-10-07 13:12:08 +00:00
igneum-labs
ae35330f42 miner-faults MF-8: a node dying at start on a kept datadir (the serde(default) row, N13); the LG-4 job's tenth install keeps the datadir and a node restart loop fails the row
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
(cherry picked from commit d82de28e40)
2026-10-07 13:12:08 +00:00
igneum-labs
942f537ff6 reliability injector: the stale duplicate step blocks removed (the card-appears rewrite had sliced before an earlier definition); the rung is read over two seconds
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
(cherry picked from commit 10badc02a3)
2026-10-07 13:12:08 +00:00
igneum-labs
fd4c3e72a7 reliability injector: card-appears uses a second fake device (added, removed, revived); an empty device list is read by the engine as no answer
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
(cherry picked from commit df2617bb43)
2026-10-07 13:12:08 +00:00
igneum-labs
e464a5fb06 reliability injector: reads the fake cards by name and switches a box's real GPU off through the app's own card path
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
(cherry picked from commit b9c70528fa)
2026-10-07 13:12:08 +00:00
igneum-labs
1506f6c003 reliability injector: the catch-up step's flag no longer shadows the process list
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
(cherry picked from commit 2efe419521)
2026-10-07 13:12:08 +00:00
igneum-labs
089b078a3a Miner app: plug, tune, play (the project lead, 7 October 2026): node readiness gate, the retry ladder, no permanent fault, fault lines to the intake, the signed cards job, the fault-class register
docs/plans/miner-faults.md: MF-1 to MF-7, each with its rule, test and gate line.
- MF-1/MF-2: a worker starts and is judged only when the node is READY (synced and igneum_getExecStatus reports an
  executed tip; execrpc::probe every 5 s off the engine thread); the node watchdog never counts the catch-up (settled
  once read synced; 30 min cap before that; any RPC answer is a sign of life); the watchdog restarts on a ladder 10 s,
  30 s, 2 min, 5 min, then every 5 min for ever (watchdog::RETRY_LADDER_S); the faulted state and the one-restart
  budget are gone (tools/ci/permanent-fault-check.sh in the gate); a node-caused restart resets the ladder at sync.
- MF-3: the hot-plug pass starts a recovered or revived card's worker (unchanged rule, now in the register).
- MF-4: the status clock starts at ready (program loaded), loading bounded by 300 s; a self-test failure holds the
  card 30 min with the reason on its row, released on a driver change; a crash loop climbs the ladder; the pack is
  exported once a minute for every card (a refused pack forces one).
- MF-5: the app reads template_wait=, template_ms=, identities_active= from the 0.3.20 miner's STATUS; waiting on
  the node is never the card's fault; the row says node slow; every node-wait label clears on the first rate.
- MF-6: a miners hold belongs to the job that took it and releases when that job is gone or at its own cap.
- MF-7: the engine owns every igneum-miner it started: an untracked one on this engine's node RPC is killed at start,
  after every stop and every minute, one line and one fault report per kill; a restart kills the old process first.
- Every fault line posts one FAULT line to the log intake (label fault-<id8>, app and node version, 60/h cap).
- The signed cards job kind (per card enabled, identities, power_pct; refused for a card the machine lacks; applied
  through the app's own card path, persisted, read back): packaging/ota/publish-jobs.sh add --kind cards.
- LG-4 as a job: relay/playbooks/first-share.ps1 and tools/fleet/first-share-gate.mjs (no Windows box yet).
- tools/reliability: the fault injector with one step per class (catch-up, card-appears, own-restart, zero-ladder,
  no-status, node-silent, one-card-fails, orphan-miner); fake-worker.mjs lists devices and fails self-tests on command.
- master's build tooling (97255a4e) and release-0.3.20's igneum-pow taken into the worktree for the box routes.
Box: app 198 + 27 + 8 tests green on igneum-build-2; the tree gate green (33 checks).

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-07 13:11:48 +00:00
igneum-labs
75215bf2bb Merge remote-tracking branch 'origin/master' into release-0.3.21 2026-10-07 13:11:18 +00:00
igneum-labs
015e6d5a6a Driver table: the NVIDIA 617.42 and AMD 26.9.2 rows measured on igneum-build-2 (sha256, size, Authenticode subject from the vendors' own files); the stray #[test] above the Intel test's doc comment removed
NVIDIA GeForce Game Ready 617.42 WHQL (6 October 2026): us.download.nvidia.com/Windows/617.42/..., 990,853,168
bytes, sha256 f115c927..., subject CN=NVIDIA Corporation (DigiCert G4). AMD Software Adrenalin 26.9.2 WHQL
(29 September 2026, the win11-b build): drivers.amd.com/drivers/whql-amd-software-adrenalin-edition-26.9.2-win11-b.exe
(an amd.com Referer required), 1,000,800,840 bytes, sha256 593c1d73..., subject CN=Advanced Micro Devices (Sectigo).
Read on the box: curl, sha256sum, the PKCS7 out of the PE security directory through openssl pkcs7 -print_certs.
The table's placeholders are gone: every row installs. The drivertable test sample, the mock and the view test name
the real NVIDIA release. detect.rs:990 carried a #[test] above the doc comment of the Intel test from the cherry-pick,
the test build's one warning ("duplicated attribute"): removed.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
(cherry picked from commit 80787ea024)
2026-10-07 13:09:47 +00:00
igneum-labs
d00772bf20 Driver check: the app detects a missing or old driver per card and installs it on one click from the vendor's own server (branch driver-check, 7 October 2026)
the project lead: can the drivers be packaged with the miner, for all cards, with the system knowing which to install if not
present. Not bundled: detected and installed on one click. A per-vendor table rides the signed manifest (drivers.json:
min_version, the version on offer, the vendor's URL, size, sha256 and its source page, the silent arguments, the
restart exit codes, the Authenticode signer, the Linux and HiveOS package), validated by the signer and the app alike
(src/drivertable.rs, shared), written to <app data>/drivers.json by ota.rs. Each card's driver version is read at
every detection (nvidia-smi's driver_version; Windows' DriverVersion for AMD and Intel) and compared; a missing or
old driver puts the offer on the card's row, on the dashboard and on the first-run list. The click downloads with
curl (resume), checks size, sha256 and the Authenticode subject, runs the installer through one elevated prompt
(platform::elevated_command, the PC 1 driver job's shape), reports restart required with a Restart now button, and
never restarts by itself; the miners keep mining. macOS: no step; Linux and HiveOS: the package line. Dry run through
IGNEUM_DRIVER_DRY_RUN or the table. Tests: the table, the versions, the offers per tier, the exit codes, the
Authenticode verdicts, the download against a mocked vendor server on 127.0.0.1, the UI's strip per state; the mock's
drivers scenarios; captures light and dark in docs/plans/driver-check-shots. publish-manifest.sh --drivers carries the
table. Also the doubled #[test] in detect.rs from the cherry-pick.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
(cherry picked from commit 3f0ef65786)
2026-10-07 13:09:46 +00:00
igneum-labs
a2aa13541d CI red watcher: every branch, one line per failed run naming the branch, the commit, the red check and the pushing author
The red job's condition drops the master/release-* clause; record() keeps GITHUB_ACTOR and the head commit's author name (RED_WATCH_AUTHOR from the workflow) and formatLine prints "pushed by <actor> (commit by <author>)" before the failed job and step. The self-test covers a feature-branch run and the author in the line. Same updates channel, same box file, same one-line-per-run idempotence.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-07 13:09:06 +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
8ca045eb5f Discord structure: the build sheet (channel map, moderation, onboarding, bots, events) and the hourly network feed (7 October 2026, 11:4x UK)
docs/community/discord/structure.md: every channel with topic, pinned first post, slowmode and thread settings; the
AutoMod rules; the rules screen; the server guide to-dos and the pre-join question aligned with the map; the two bot
specs; the office-hour template; what needs the founder. Every row carries "set / read back"; all wait on the Discord
sign-in (the session expired; nothing typed).

tools/community/discord-hooks.mjs: `feed` (hourly: height, hash rate, keys, the last lock from /api/live), milestones
posted once each, the daily hash-origin field, `--via updates`, optional DISCORD_WEBHOOK_FEED, the tick wiring. Six
tests, 37 pass. One live post through the updates webhook as the proof of the path (feed:2026-10-07:11).

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-07 12:14:12 +00:00
igneum-labs
0539eeb252 Intel Arc in the app (0.3.20): vendor intel from the OpenCL vendor string and the Windows name, the INTEL badge and its token, the no-cap row naming IGCL, the measure-only tune words, the view test and the ui-mock scenario (the six app files of intel-arc 18453bb1, applied as its own diff; the test's prove sentence in this tree's wording)
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-07 11:25:05 +00:00
igneum-labs
11e2dec70b OpenCL worker: on an Intel platform rotr_var is rewritten to the shift form before the build (the Intel rotate fold, the Arc B580 bisect of 7 October 2026)
Intel's compiler turns rotate(x, (0u - n) & 31u) into a rotate LEFT by n: lane 0's register trace on the B580 diverged
at instruction 6 of iteration 0 (rotr) and nowhere before, in both exchange modes, with every other family and the
dataset kernels bit-exact. proto-opencl/intel_rotr.h rewrites the one helper line when the device's vendor or
platform string holds Intel (host.c's buildProgram and the prepare path), no other vendor sees a change, no pack or
consensus text moves. proto-opencl/test_intel_rotr.c (the pre-push gate runs it) feeds the line through the rewrite
under Intel, AMD and NVIDIA strings and asserts the outputs.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
(cherry picked from commit 26e135a362718a68a842da59080b43e93afd9dc2)
2026-10-07 11:23:55 +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
b94a3d1cbf Worker dashboard: only a build-* slot held without a line shows as a "held, no holder line" card (the measure lock is not a build)
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-07 11:16:17 +00:00
igneum-labs
63b127150a Merge remote-tracking branch 'origin/master' into site-redesign 2026-10-07 10:57:33 +00:00
igneum-labs
8c7d727e61 site-redesign: the package's look 1:1, header and footer included
The owner, 12:4x UK: "some things look different on the live site vs the one I sent you, match it 1:1". site/site.css is
now the package's design system as delivered (tokens, type, chrome, components, breakpoints) with self-hosted fonts, the
two text tokens for contrast on light surfaces, and a compatibility layer for the data pages' vocabulary. The header
and footer are the package's (status bar, logo with the ember stop, the six items, the Discover dropdown, the theme
toggle, the Download button, the burger and its sheet; the footer grid with the three icon links, Run, Read, Explore
and the legal line). The home, miner and wallet pages carry the package's markup on our content; the live page, the
explorer, the litepaper, the faucet, the MetaMask page and the generated pages take its values in their own blocks.
The theme is always set (stored, else the OS), so the package's light theme applies. Side-by-side sheets before and
after at 1440 px from tools/site-redesign/sheets.mjs; no sample data, no review chrome, the hero loop continuous.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-07 10:57:32 +00:00
igneum-labs
1b912385ad ember-heat: the gate reader, the PC 1 four-hour runbook, the plan and the light and dark captures
tools/heat-gate.mjs reads the HEAT lines of an app log and passes a hold within 1 degree for 4 hours with the hash
following the slice; its self-test fires on a known hold, a drift, a hash through the rest, a short log, an empty log
and a log without readings, and sits on the one gate beside heat-region.test.mjs. docs/plans/ember-heat.md carries
the words, the loop, the sources, the per-tier table and the runbook for the project lead's desk (this lane never touches PC 1).

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
(cherry picked from commit 0d5fc6d258dee4774ebe7ea760736c9f05026d06)
2026-10-07 10:50:23 +00:00
igneum-labs
20796156e1 ember-heat (0.3.19): the region and price prompt, the heat cards and lines, the cost-against-rent row
First run gains step 2 of 3 (the region list, the price per kWh prefilled from the public table and typed, never
fetched, the restricted line for Russia's regions and China from future.md 4.4 and 8.3 with the standing sentence);
Settings gains Electricity and Heat mode; the Cards strip and every row's Ember line show the duty and the heat in
watts; a resting card, the pill and the big button say heat mode; Earnings gains the miner's cost per MH/s-hour at
their price beside the bench log's measured rental rate with the verdict. The money symbol follows the region.
heat-region.test.mjs checks the Russian entry, the bench-log rate and the words; the mock gains heat and heat-rest.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
(cherry picked from commit 8099bbfd46)
2026-10-07 10:50:05 +00:00
igneum-labs
272b542120 ui-ota: the publisher (tools/ui-ota/publish.mjs), publish-manifest.sh --ui and --no-ui, the plan with the security notes
publish.mjs packs the fifteen served files with one fixed mtime (reproducible; the self-test checks it), hashes, signs
the entry through igneum-ota-sign sign-ui with the key in ~/.config/igneum (never read or printed here), copies the
bundle into the folder's ui/ and hands ui.json to publish-manifest.sh --ui, the one writer of the signed manifest,
which verifies the entry and the bundle's hash before signing; --dry-run writes nothing, --verify reads the live
manifest back against dl/<token>/ui and dl/public/ui; --no-ui withdraws the channel. Both self-tests sit on the one
gate. docs/plans/ui-ota.md: the shape, the engine, the security notes, the operator recipe, the tests, per tier.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
(cherry picked from commit e02f5e14d0)
2026-10-07 10:44:51 +00:00
igneum-labs
8debc7262a ui-ota (0.3.20): Settings > Interface, the health ping, the first-paint error and the gentle reload
"Interface <version>, over the air, <date>" or "built in", with the help line for pending, refused, held back and
skipped; the "Use the built-in interface" switch (POST /api/ui/builtin). The page posts /api/ui/health once after its
first paint, or the first script error it catches before that; when the served interface changes under it, the page
reloads itself only when idle (no input focused, no sheet or update card open, on the dashboard). ui-ota.test.mjs
covers the words, the reload rule, the ping and that the page loads no remote script.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
(cherry picked from commit b6a0fd0d75)
2026-10-07 10:43:52 +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
6aa5afb510 Worker dashboard: the slots gauge counts build-* slots only (the box's measure lock is not a build slot)
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-07 10:43:01 +00:00
igneum-labs
b9e2a0dce7 Worker dashboard: a flock-held slot with an empty file counts as held (label unknown), not free
Seen on igneum-build-1 at 10:39Z on 7 October 2026: both slot files flock-held and empty while two suites ran and
three waiters queued, so the header read 0/2. The holder's missing line is the build-server agent's to fix; the
collector no longer reports a full box as free either way, and the page shows "held, no holder line" in the lane.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-07 10:41:49 +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
ee15172f4e Worker dashboard: scheduling classes on the cards (kind, nice, cores), gate-queued marker, wait and gate-pending files
The slot line now ends "; kind=<k> nice=<n> cores=<c>; agent=<a>" (build box scheduling, 69034dc0): lib.mjs lifts the
three into their own fields and keeps the bare label; the old line shape still derives its kind. The collector reads
/srv/builds/_locks/wait-<pid> and gate-pending-<pid> directly (dead pids skipped), marks a gate with priority gate
and sorts it first; the page shows the class line on Now building and Queue cards, a "gate queued" pill, and the class
in the closing lines. JSONL nice, cores, jobs and priority carried through. 14 tests pass.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
(cherry picked from commit 9fce5742a6)
2026-10-07 10:35:07 +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
e5b88781d9 Worker dashboard: scheduling classes on the cards (kind, nice, cores), gate-queued marker, wait and gate-pending files
The slot line now ends "; kind=<k> nice=<n> cores=<c>; agent=<a>" (build box scheduling, 69034dc0): lib.mjs lifts the
three into their own fields and keeps the bare label; the old line shape still derives its kind. The collector reads
/srv/builds/_locks/wait-<pid> and gate-pending-<pid> directly (dead pids skipped), marks a gate with priority gate
and sorts it first; the page shows the class line on Now building and Queue cards, a "gate queued" pill, and the class
in the closing lines. JSONL nice, cores, jobs and priority carried through. 14 tests pass.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-07 10:33:59 +00:00
igneum-labs
95e5f60747 site-redesign: the full-site redesign on our content, 22 pages served
The package's design system, layouts and interactions on our tokens and self-hosted fonts (site/site.css section 10),
our facts, numbers, records and live services on every page. The home page: the GPU hero (site/hero-scene.js, continuous
while in view, labelled as drawn), the live DAG panel on scenes/feed.js and live-dag.js 2.0.2, three reasons, the
economics split, the download row with the OS marks, the ledger line. The miner page: the download layout, platform
tabs stamped from the live download index with sha256, the steps, the card table, the fee section (the one source of
/dev-fee), the FAQ. The wallet page in the package's wallet-hero layout, the window slot ready for the wallet redesign.
The secondary pages rendered by the build from one source each: /claims and /randomx from the litepaper's sections,
/dev-fee from the miner's fee section, /provenance from docs/provenance.md through the scrub, /journey from
journey.json; /benchmarks rewrites to /miners, /connect redirects to /metamask. The generated pages (bench, bench
table, ledger) restyled onto the page hero and the docs layout with a section filter. The footer's secondary links point
at the real pages. The copy pass on every served page (docs/plans/site-copy-pass.md). The package's data tests and the
hero loop test in the gate (tools/site-redesign). No sample data is served; the package's review chrome is not.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-07 10:30:18 +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
b6c0199cfe Merge site-ui-4: the /live Proven tile on a 600 s summary read, the observer's claims flag
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-07 10:14:45 +00:00
igneum-labs
7aa4b13be3 live: the Proven tile reads a 600 s window of its own every 10 s (?summary=1 counts), the observer marks claimed shards proving behind OBSERVER_CLAIMS
Main's two follow-ons of 7 October 2026 after the per-block read. (1) /api/live?window=N&summary=1 returns the window's counts alone (blocks, chain, planned, proven, shards by state, the proving counters), and the /live Proven tile reads window 600 that way every 10 s with the line "of the last 10 minutes, every shard verified or paid", while the scene keeps its 60 s window; the stat was the scene window's count, zero by the proof lag. (2) The observer's shardStates reads an open claim as 'proving' from the claim until the proof lands: the records reply's own claims field whenever the node sends one, and the claims RPC behind OBSERVER_CLAIMS ('1' = igneum_getProofClaims, or a method name; unset = off); a node without the method turns the flag off for the run after one log line. Nothing lights until the node lane ships the RPC on the 0.3.20 line.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-07 10:14:43 +00:00
igneum-labs
66eb4f3ab6 Merge site-ui-4: the live API's per-block proof read (joined by hash, windows to 1800 s) and the observer's 30-minute record window
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-07 10:06:19 +00:00
igneum-labs
5e40230090 observer and live API: a block in view carries its shard states whatever its age; windows up to 1800 s (1,800 blocks); the record window 30 minutes
Main's order of 7 October 2026 on the per-block proof read. The live API joined proof rows by when the plan landed and capped the window at 300 s while the fleet's proofs land a median 262 s after the block, so a 60 or 90 s scene window read zero proven blocks by construction. Now: /api/live?window=N accepts 30 to 1800 s and returns at most 1,800 blocks; the shard rows are joined by block hash alone, so the proof's own landing is what moves a block to verified or paid in any window. The observer keeps reading a planned block's records for 30 minutes (was 10) so the lag tail still lands. provers_10m, shards_proven_10m and median_proof_lag_s are unchanged.
Read against the live chain through the local API at 11:05 UK: window 90 proven 0 before and after (every block younger than the lag), 300 proven 2, 600 proven 49 of 139 chain blocks, 1800 proven 143 of 329 chain blocks (1,334 s of blocks under the cap). Observation for the fleet lane: in 1,800 blocks no shard reads proving or verified; states go planned straight to paid.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-07 10:06:17 +00:00
igneum-labs
6c70b9485c Merge site-ui-4: the full header on every page with the mobile sheet, OS marks on the download cards, the footer redesign with the three icon links, the chip-model public text, the phone scene (live-dag.js 2.0.2), the nav build check
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-07 10:01:55 +00:00
igneum-labs
a8461a2848 site-ui-4: the header on every page (six items, Download, the burger with its open state and aria), OS marks on the download cards, the footer redesign (icon row GitHub, Discord, Reddit; Contact eyebrow; one baseline grid; the state word and the year), the chip-model text (prize sentence cut, the bounded hot-set row), live-dag.js 2.0.2 narrow options for phones, the nav build check, the word-bounded rig-name check
The owner's orders of 7 October 2026 (header, logos, footer, phone scene) and the Counter ASIC lane's public text (docs/plans/counter-asic-3-public-text-2026-10-07.md, b10c7ac2) with the disclosure prize held back until its publish word.
Header: the one-screen home no longer hides items; the sheet carries exactly Litepaper, Miner, App, Wallet, Live devnet, Ledger and Download; 44 px bar links, 48 px sheet rows, the burger turns into an X; tools/ci/site-nav-check.mjs runs after every build and in the gate.
Cards: the Windows four-pane, Apple and Tux marks from 80c5618, white on the ember card, the card's own text colour on the mono cards (so they flip with the theme).
Footer: the ledger page renders through tools/ledger-page.mjs and now underlines Ledger; the Reddit profile is the one the owner named.
Renderer: narrow, narrowBreak 720, narrowWindow 30, narrowLanes 4, narrowMinNode 11; hairlines off except the selected chain; checkpoint labels as the percent; fps 60 on the home and /live mounts. Measured in headless chromium at 390 with 4x CPU throttling: 50 to 56 frames a second (the cap is 60).
Evidence row 17 rewritten in the table's eight columns. The forbidden list gains "disclosure prize" and the word-bounded rig names.
Tested with Playwright at 390 and 768 in both themes with real taps on every public page and the 404: 48 rows, 0 problems; captures in docs/plans/site-ui-4-shots/chrome.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-07 09:59:42 +00:00
igneum-labs
fa64025de5 miner-ui-5 (0.3.19): the ladder on every page, the count-up, the block card, Earnings in IGN first, EMBER 02 scene
View: poisson, ignPerDay, ladderRungs (every threshold from the node's params: dust, weightWindow, presenceWindow),
blockCard, earningsLines (IGN first, the typed price never fetched, the share and rank, IGN per kWh), cardIgnDay,
timeline, profileWords; FIELDS names every number's RPC field for the title on hover. Overview: the Poisson
count-up until the first block, the block card in place with Save the card (a canvas PNG, no network call), Copy the
link and the explorer, the ladder strip. Earnings: the six lines, the ladder card, Your first hour. Prove: the shard
card. Cards: IGN a day per card. Settings: Make my page public. The chain scene is the site lane's EMBER 02 pack
(live-dag.js and proof-core.js byte-identical): the compact card fed by the page's own api/live read, Inspect opens
the full scene with the block inspector in the site's words. ui-mock: scenarios firstwait, firstblock, ladder,
api/ladder, api/card. view.test.mjs: a Devnet 2 key walks every rung; 47 UI tests.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
(cherry picked from commit 32793b686a)
2026-10-07 09:12:43 +00:00
igneum-labs
12d8632701 CI: the prover pair is built from the pinned node's exec types (prover-pair-check, in pre-push)
The fleet's 14 standing provers cut a different state root from the 0.3.17 node on every segment because their pair came from another tree (7 October 2026). The prover depends on vendor/igneum-node-exec's evm-types; this check compares that tree with the evm-types tree of the commit in packaging/windows/node-source.pin.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-07 09:10:31 +00:00
igneum-labs
c1d97e776c Income per tier: the three tariffs are USD 0.05, 0.10 and 0.25 a kWh (cheap industrial, US retail, UK retail; the coordinator's answer, 7 October 2026), the table regenerated, the cost per mined IGN shown to three significant figures
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-07 08:54:44 +00:00
igneum-labs
6c739c543d Launch pack tools: per-tier income table from the bench rows and TESTNET_1, the daily hash-origin report, the launch-gates check (mission item 10)
tools/launch/income-tiers.mjs renders docs/analysis/income-tiers.md (public) from tools/launch/income-tiers.json: eleven measured cards (the 6 October rented-card rows, the 9070 XT telemetry run, the M5 Max Metal bench, each with its source), IGN a day at 1, 10 and 100 GH/s after the ramp on EmissionSchedule::TESTNET_1 (100 IGN a block, 90-day ramp from 10 percent, monthly 2^(-1/24), the 80 percent producer share), electricity a day and per mined IGN at USD 0.005, 0.02 and 0.10 a kWh, a rig and a pool-user line, the consequences per tier, the owed rows; --check fails CI when the page and its inputs disagree; the test pins the arithmetic (6,912 IGN a day for 100 MH/s on 100 GH/s at the launch rate, day 1 at 10 percent, one step at 2^(-1/24)).

tools/observer/hash-origin.mjs: once a day from the observer's tables, who found the blocks: keys with a block and above dust, attested pools against shared payout addresses (a multi-key machine is not a pool until its operator attests), the project fleet's share from the intake identity lines plus the fleet registry's key file, the ten largest keys, the 2x step since yesterday, the community gates (first 100 keys, first outside block, first attested outside pool at 10 percent for 7 days; the X5 count stays an upper bound until the two observer columns exist). --dry reads only; --write keeps hash_origin_days and hash_origin_reports and live_state.hash_origin; --post goes through the Discord poster's guard. Fixture, a known-finished and a known-failed day in the test. Ran read-only on the live devnet today: 113 keys, 0.76 GH/s, the fleet share wrong until the key file exists.

tools/ci/launch-gates-check.mjs (in pre-push.sh with the two test lines): every row of the Launch gates table in testnet-go.md has a check and every backticked path exists; the site-lane handoff and the income table carry no served-page or export pattern and no em dash; the eight regulatory sentences are present in order under the label. Self-test fires on each.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-07 08:53:12 +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
d91fe9bbb3 Merge mission: the last research round (five lanes: past, unfinished, future, invent, reinvent) and The Igneum Mission, the closed list of twelve
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-07 08:22:14 +00:00
igneum-labs
bbe0acce28 Export exclusion: docs/analysis/mission is internal research (the last mission's five lanes and the closed list), outside the public export list
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-07 08:22:09 +00:00
igneum-labs
107090dba9 Merge site-ui-3: the site redesign (simple nav, miner, app, live devnet, one design system), X36, the Discord vanity
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-07 08:01:06 +00:00
igneum-labs
583eeea437 site: light-theme app captures, the X9 withdrawal correction (ledger X36), the Discord vanity link
Light theme shows light screenshots on the miner and app pages (the
0.3.16 renders from the RTX 5090 Windows rig's live state, the 390 px
pair included). The X9 never shipped: pre-orders 26 December 2025,
withdrawn mid-May 2026 before any unit shipped, no benchmark; every
public sentence that had it shipping now says so, with k about 0.33
labelled as the claimed, unmeasured core; ledger X36, notes on X34, X35,
M34 and C2. Every public Discord link is https://discord.gg/igneum.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-07 08:01:03 +00:00