Commit graph

433 commits

Author SHA1 Message Date
igneum-labs
a15c1381f5 merge-to-master: a landed master is pushed to both box mirrors (the stale-mirror class: build-2's /srv/igneum.git master sat at 15:27's 4e2745ab while GitHub carried 2b9d50cc, 7 October 2026, 18:25 UTC; three branches were cut from the stale tip)
mirror_master runs after the push to origin: one fast-forward push per mirror in IGNEUM_MIRRORS (default: the two box files' hosts at /srv/igneum.git), best effort, a line per mirror, a down or diverged mirror never fails the landing. Self-test: a bare mirror behind master is fast-forwarded; a non-fast-forward push leaves it and is reported.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-07 18:30:15 +00:00
igneum-labs
74bb841dfe merge-to-master: an unknown CI read is waited through inside the deadline, not refused at once (7 October 2026, 18:0x UK: 500s on pushes, a 404 on a live run id, then the account suspension; the rule refuses only a verdict, and a missing verdict only at the deadline)
ci_gate: unknown prints the reason and asks again until --ci-wait runs out (CI_WAIT_SECS for the self-test). master_gate: three reads
over a minute before an unknown counts; a lasting unknown still refuses (no verdict, no merge). Self-test: a blip (unknown, then
green) merges; a lasting unknown is refused at the deadline; the same two shapes for master's read.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-07 17:04:22 +00:00
igneum-labs
ae274be891 Merge remote-tracking branch 'origin/master' into ci-steward 2026-10-07 16:57:56 +00:00
igneum-labs
2b9d50cc72 Merge ca3-v4-amend 6bb52c50 into master (gate: green on 6bb52c50, recorded by tools/ci/pre-push.sh; the full gate runs in CI on this merge) 2026-10-07 16:45:48 +00:00
igneum-labs
6bb52c5007 Merge origin/master 90501503 into ca3-v4-amend (igneum-pow kept byte-identical to the frozen c3d32437 per main's stop-the-line ruling; the ledger keeps both sides) 2026-10-07 16:40:29 +00:00
igneum-labs
4a5759e188 Merge remote-tracking branch 'origin/master' into site-ui-5 2026-10-07 16:37:57 +00:00
igneum-labs
a0eeb725f9 CI steward (7 October 2026, 17:3x UK): master takes only CI-passed commits; every job has a budget; the watcher reads cancelled and timed-out runs; box and network checks retry once
Thirteen failure emails between 15:26 and 16:53 UK. The classes and what closes them:
- the box-locks check on a hosted runner (10 runs): closed by bd6fcb88 and 165e8b35 earlier
- windows-ci's stale payload-inputs pin (3 runs): closed on master by 4b4e1bc1; update-return's dispatches still carry e69e8a39
- three hosted site jobs on master hung in the tree gate for over two hours (no timeout-minutes): ci.yml now carries
  site 15, changes 10, pow 60, sims 45, the overlap sweep runs under a 10-minute wall clock where GNU timeout exists, and
  tools/ci/workflow-timeouts-check.sh fails a job without a budget (self-test: a job without the key, a wrong budget)
- a branch merged with no ci run of its own (era-vdf 61421005, 16:31 UK): master's igneum-pow suite went red and five
  docs-only merges landed green over it because their runs skip the compile job. tools/ci/ci-state.mjs reads the runs
  API through gh (a commit's newest run, master's last COMPILED run, a branch's last red); merge-to-master.sh pushes an
  unrun branch for a run, waits for a queued one printing the clock, refuses a red one and refuses any merge onto a red
  master except the declared fix (--fixes-master); the pre-push hook refuses a push to master whose commit, or whose
  merge's branch parent, has no green run on that exact sha; a feature-branch push prints the branch's previous red
  first. Self-tests with a fake gh in all three.
- ci-red.yml fires on failure, cancelled and timed_out and hands the conclusion to red-watch.mjs, whose line names the
  kind (CI red, CI cancelled, CI timed out); the self-test reads the workflow file for the three conclusions
- tools/ci/retry-once.sh: one retry before red for the box-locks check, the scene parity check and the live public API
  check (each keeps its own skip line on a runner without the resource)

GitHub's branch protection cannot be applied: the organisation is on the free plan and the repository is private (the
API answers 403, "Upgrade to GitHub Pro or make this repository public"), so the two scripts are the enforcement; the
rule is one line in CLAUDE.md under the CI block.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-07 16:37:13 +00:00
igneum-labs
e73fea9d8b site: the chip claim launch-first in the four public places (Counter ASIC lane, docs/plans/counter-asic-3-public-text-2026-10-07.md sections 1 to 4, on the project lead's "I thought we were making it 2.1 from launch?")
Home row 03, the litepaper's chip section at /litepaper#chip-model (paragraph and table; the class v3 row last, "never the launch
state"), the miner page's line and evidence.md row 17 in its eight columns: 2.1x to 3.9x under class v4 from the first block,
class v5 removing the stored-dataset chip as a category, the 5x to 9x only as the class v3 baseline, the devnet's activation
height as a devnet fact. The litepaper's abstract carried the same claim in the old form ("5x to 9x today; class v4, now on
the vote") and now reads launch-first too. tools/ci/ledger-text-check.mjs follows the sentences (X35 on the home page and the
litepaper). No disclosure prize anywhere.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-07 16:34:12 +00:00
igneum-labs
11274a1949 Merge remote-tracking branch 'origin/master' into site-ui-5 2026-10-07 16:30:59 +00:00
igneum-labs
0f539f8b39 site-ui-5: the padding and visuals sweep (7 October 2026, 17:xx UK): the /wallet band's padding, tools/ci/padding-check.mjs in the gate, every finding fixed in site.css, the eye pass
the project lead: the ember band on /wallet had no vertical padding (the heading on the band's top edge, the button on its bottom), then
"run a full site sweep for padding and visuals".

- The band: .band .wrap carried the padding and the three bands use .container; both selectors now, 56 px (40 on phones), and
  24 px at the sides on phones.
- tools/ci/padding-check.mjs: renders every served page at 390, 768, 1024, 1440 and 1600 in both themes and flags TIGHT (text or
  a control under 24 px from the edge of the filled band, card or section that holds it; rows of radius 12 and under are the
  app's compact rows and keep their own padding; small filled things such as buttons, pills, badges, tabs, cells and the bar are
  never containers), SCALE (a section's vertical padding not 0 and not a multiple of 4 from 24), TOUCH (controls under 6 px
  apart outside segmented groups), OVERRUN (an image or canvas past its frame) and UNDER-BAR (a heading under the sticky bar on
  load, an anchor the bar would cover). --self-test builds the fixture from the site's own stylesheet and bar with the exact
  /wallet band with its padding lost, a touching pair, an image over its frame and a heading under the bar; each must fail,
  the clean twin must pass. A gate line runs it (self-test, then the built site); where no browser exists it says so.
- Findings fixed (first run 2,740, then 1,040, then 48, now 0 at 230 renders): page heroes 64/48 (were 65/45), the
  observatory head and the 404 the same, the footer's bottom 24, doc sections and the litepaper's 40 (were 42), .sec 72 at
  tablet (was 70), the 404 card 36, /live's motion block 24 (was 25), the scenes lab 48 (was 50); every card at 24 inside
  (download cards, home tiles, the live tiles and stats, the evidence labels, the wallet state cards, the journey phases, the
  live inspector and toolbar, the download card on phones).
- The eye pass over every page at 1440 and 390 dark: the journey's phases are cards now, so the old timeline rail and marker
  (drawn for an unboxed list, sitting on the card's top border) go and the when column keeps clear of the body; tables keep
  words whole (break-word, not anywhere: "regenerat es" on the litepaper) and give the label column 14ch (one word per line on
  /randomx); the litepaper's body paragraphs share one measure; the ledger's count-table chips stay on one line; orphan words
  go through text-wrap: pretty on body text (copy law 18, "measurement." alone on /claims); the dev-fee page lost its doubled
  gutter (a lifted section keeps its own .container) and its table clears the text above; /faucet and /metamask keep a gap
  between headline and lead, line their two cards up at the top and end 72 px above the footer; a heading after a card grid
  gets 40 px.
- The overlap sweep at the same five widths and both themes: 0 overlaps at 290 renders.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-07 16:30:58 +00:00
igneum-labs
d1e42080f8 Site currency (currency-21's site side, for master tonight): site/money.js is the miner app's currency rules for the site (navigator.language picks the currency and the typical tariff, a saved switch wins, one Intl.NumberFormat call for every money figure, no exchange rate anywhere; tables generated from the app's View block, site/lib/money-regen.mjs rewrites them, site/lib/money.test.mjs fails on drift once the app side reaches master and waits until then); the card picker (yourcard.js on /miner and /app) shows the card's electricity a day at the typical tariff with a currency switch saved in localStorage igneum-currency, loading /money.js itself so no page was edited
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-07 16:30:22 +00:00
igneum-labs
9f543aa970 Era VDF lane (7 October 2026): spec 04 sections 4.2, 4.4, 4.5 and 4.6 completed for the era path (the scheme byte and the hash-chain fallback, the cut rule under the O-4.3 reading, the day-of-blues input, the delay, the seed, the era constants as measured), spec 01 section 1.13.1 and era-layout.md section 8 updated, open items O-4.8 closed and O-4.10 to O-4.12 added, FUD ledger F11 updated, two decisions for the project lead in ledger-decisions.md, the record docs/analysis/era-vdf-2026-10-07.md (what was built, the parameters and measured rates, the harness gate with both runs, the cut rule for the finality lane, the verify gate, the tiers), the F7 re-roll harness against the real era cut (tools/era-vdf/reroll.mjs: --vdf off fires 6 of 6, --vdf on silent 0 of 6; the adversary evaluates asynchronously with the node's own code and is found by the node's own log line), the fast-time file's era fields 2026-10-07 15:24:22 +00:00
igneum-labs
4402e51e45 Merge bench-5060ti 8c019aa2 into master (gate: green on 8c019aa2, recorded by tools/ci/pre-push.sh; the full gate runs in CI on this merge) 2026-10-07 15:17:18 +00:00
igneum-labs
165e8b354b Merge build-server 649ea43a into master (gate: green on 649ea43a, recorded by tools/ci/pre-push.sh; the full gate runs in CI on this merge) 2026-10-07 15:16:36 +00:00
igneum-labs
78b7915e6e Counter ASIC 3.0 gates (hash): ledger AP-F8-1, the suite (103 of 103), CI and census lines at c3d32437; the census draws in parallel
Suite at c3d32437 on box 2: 103 passed, 0 failed (lib 140.8 s: every class v4 draw in the tests pays the 2^20 ratio pass). CI 37639406567 success. Census: 4,099 programs, 0 lossy sites of 65,584, 0 exhaustions, mean attempt 2.086 (af1b7c46 1.998), max 17; the ratio refuses about 4 percent of candidates that pass every other test. tools/ca3-v4-uniform draws the seeds across the available cores (the serial run became a four-hour job under the ratio pass); the analysis and the row order are unchanged.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-07 15:10:13 +00:00
igneum-labs
649ea43a49 Gate: the box lock self-tests read the same on an idle box and on one at load 120 (private lock directories, no pinning in the fixture, file-driven waits, a 3 s settle, a quiet that outlives the slot settle); the check runs them one at a time with one retry each (the horizon lane, 7 Oct 2026: one red on a full gate, green a minute later)
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-07 15:05:56 +00:00
igneum-labs
8c019aa259 RTX 5060 Ti (16 GB, Razer Core X V2 Thunderbolt) on PC 2: detection, G1 bit-exact on class v4 sub-version 1 and the v3 control, the 10-minute stock window, the bench-log entry, the card-picker entry and the public table row
The first 16 GB card and the first Thunderbolt card. The app's first poll listed it (vendor nvidia, 16,311 MiB,
driver 610.47 shared with the 5090, kind discrete: the app does not know it is an eGPU) and started a miner on
it by itself. Job run-5060ti-bench-20261007-b (tools/bench-5060ti/pc2-5060ti-bench.ps1, the card alone under
the runner's --cards-off, the 5090 mining, no power limit written: 180 W default read back unchanged, PC 2 lost
power twice that day): G1 PASS with 867dbc45cfb36b4d (sub-version 1) and 90f794dd556f7a3b equal to the Mac's;
the window 1,105 dispatches of 2^24 in 602 s at 30.882 MH/s, 114.8 W mean at utilisation 90 percent and over,
0.269 MH/W, PCIe 4.0 x4 through the enclosure (the hash is latency-bound, the link costs nothing measurable).
Owed: the efficient point (the app's Ember Tune; PC 2's Power Helper refuses every request since the restart)
and the prove-beside read (the shipped WSL2 host has no IGNEUM_CUDA_DEVICE selector; the floor server is on
PC 2; the prover-floor host is the cut). The kit (tools/bench-5060ti/make-kit.sh) takes the sub-version 1 packs
from ca3-v4-amend 0a62293a, since master's packs-ca3-v4 is the 6 October stream.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-07 15:05:47 +00:00
igneum-labs
b1c4c35ff3 Merge remote-tracking branch 'origin/master' into site-ui-5 2026-10-07 14:51:38 +00:00
igneum-labs
8e942cd0d5 site-ui-5: the phone menu is seen, the home fold hides the scene until the feed answers, /miner and /wallet show dark screenshots only, /live has no "you" (7 October 2026, 15:5x UK)
the project lead's three on the live site, plus the /live key's last item:
- Mobile nav (URGENT): the sheet was position:fixed inside the bar, and the bar's backdrop-filter is a containing block for
  fixed descendants, so top and bottom resolved against the 60 px bar and the sheet opened with zero height while
  aria-expanded said true. It is now absolute under the sticky bar, a viewport-tall box (100dvh minus the bar), display block
  over the package's grid rule. tools/site/sheet-test.mjs opens every page at 390 px, clicks the burger and asserts the first
  link is on screen and on top (elementFromPoint at its centre returns the link); --self-test forces a zero-height sheet first
  and must catch it; a gate line runs it where a browser exists (the box, CI) and says so where none does. On build-2: the
  zero-height sheet is caught, 23 pages pass.
- Home at 375: the renderer's "Waiting for observer data" was drawn on the fold's canvas under the lead. The fold now carries
  .pending until the feed is live or stale and keeps the canvas at opacity 0 meanwhile; the status pill is its own row under
  the buttons on phones. ?feed=off holds the pending state for a render; the overlap sweep (whose server answers /api with
  503) renders the pending state by construction and ran at 375, 390 and 1440 in both themes: 0 overlaps.
- /miner and /wallet: the light-theme screenshot variants are gone (dark only), captions unwrapped, "light and dark" dropped
  from the gallery line; one gallery of frames with one caption each.
- /live: "Your block" leaves the key, the "Your blocks" filter and tile and the Mark-my-key prompt leave the page (the site
  has no "you"); the stats row is three tiles; the key reads Included, Excluded, Selected chain, Proven, Locked checkpoint.
- Captures: ?motion=off (head partial) marks data-motion=off so every .reveal is drawn in a headless render; capture.sh passes it.
  tools/site/serve.mjs survives a refused api origin (502, never a crash).

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-07 14:51:17 +00:00
igneum-labs
38fd2c4cf8 Merge mf11-master 847211c7 into master (gate: green on 847211c7, recorded by tools/ci/pre-push.sh; the full gate runs in CI on this merge) 2026-10-07 14:49:42 +00:00
igneum-labs
847211c7c2 Relay: the X23 tree on master (the signed and tagged run, lib/handler.mjs, guard, the per-machine secret), the start-app kind, the v3 agent as the per-user logon task IgneumRelayService with install-agent.ps1 and the hidden loop, the per-install hostname on registration, the signing tools/relay.mjs so no lane posts an unsigned run (the live relay refuses one since the 7 October 2026 deploy), tools/console.mjs and build-job.mjs on the header tier (X24), the playbooks on RELAY_DL_BASE (X26) and wsl-setup's sudo for apt-get and dpkg only (X28), the new playbooks (start-app, agent-install, pc2-crash-collect, boot-check, freeze-check), and the deploy record with the rollback line (docs/plans/relay-deploy-2026-10-07.md: production igneum-relay-iabqarnby, previous bgy767z40)
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-07 14:47:59 +00:00
igneum-labs
4af544c833 Merge build-server 30acd340 into master (gate: green on 30acd340, recorded by tools/ci/pre-push.sh; the full gate runs in CI on this merge) 2026-10-07 14:25:01 +00:00
igneum-labs
30acd34004 Gate: a --ci run outside GitHub Actions builds the site in the temporary copy like the hook (the in-place build rewrote four tracked site files in the running worktree; the horizon lane, 7 Oct 2026); in place only inside Actions; self-test that the tree is unchanged after a site build
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-07 14:23:05 +00:00
igneum-labs
4e6016fc33 Merge horizon d2b1b08c into master (gate: green on d2b1b08c, recorded by tools/ci/pre-push.sh; the full gate runs in CI on this merge) 2026-10-07 14:17:38 +00:00
igneum-labs
2039ba9394 Merge build-server bd6fcb88 into master (gate: green on bd6fcb88, recorded by tools/ci/pre-push.sh; the full gate runs in CI on this merge) 2026-10-07 14:08:58 +00:00
igneum-labs
bd6fcb8850 Gate: the box lock self-tests skip with an ok line under --ci on a runner with no box (GitHub's hosted runner has no BUILD_HOST and no box file; master went red the moment the check landed, 7 Oct 2026); the Mac hook and the box runners still run them live
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-07 14:06:53 +00:00
igneum-labs
d2b1b08c6a Merge remote-tracking branch 'origin/master' into horizon 2026-10-07 14:05:21 +00:00
igneum-labs
8350720f41 overlap-check: a text sliver at a scroll pane's edge is scrolled away, not covered (the miner's Earnings ladder under the closed log drawer's 1 px bar at 028ae588 read as covered); the clean fixture now carries that shape (7 October 2026, 16:1x UK)
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-07 14:03:28 +00:00
igneum-labs
59d7a5a2ae Merge remote-tracking branch 'origin/master' into ui-overlap
# Conflicts:
#	tools/ci/pre-push.sh
2026-10-07 14:01:38 +00:00
igneum-labs
7c79bee818 Merge remote-tracking branch 'origin/master' into scene-parity-site 2026-10-07 13:58:19 +00:00
igneum-labs
a163883514 Merge remote-tracking branch 'origin/master' into ui-overlap 2026-10-07 13:57:31 +00:00
igneum-labs
97964643ed The overlap sweep joins the gate: one check line in tools/ci/pre-push.sh (self-test, then the built site; IGNEUM_OVERLAP_APPS=1 adds the miner and wallet UIs), CI installs Playwright outside the tree before the gate, the README row; the measurer caches visibility and clip chains per element so a long page reads in seconds (7 October 2026, 16:1x UK)
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-07 13:57:30 +00:00
igneum-labs
6983002164 Merge remote-tracking branch 'origin/master' into ui-overlap 2026-10-07 13:55:13 +00:00
igneum-labs
9336a2b725 Text-overlap sweep (tools/ci/overlap-check.mjs) and the first fixes it found: the home hero's step pill no longer sits on the caption (pill at the corners' baseline, caption above it, at every width), the address page title wraps, the ledger's status badges wrap, the litepaper's mobile contents bar bleeds by the real gutter, the verify harness table scrolls (7 October 2026, 15:5x UK)
The sweep renders every served page in a headless Chromium at 390, 768, 1024, 1280 and 1600 in light and dark (the hero at rest and at each step), reads every visible run of text and flags text covered by another element, clipped by overflow hidden, or past the viewport; a fixture with one deliberate overlap of each kind is flagged before any sweep is trusted. It runs on a build box when this machine has no browser (infra/build-server/overlap-browser.sh installs Chromium there without root).

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-07 13:55:13 +00:00
igneum-labs
bb3e676f95 Gate: the green stamp and the fast path for merges (a full gate that ends GREEN over a clean tree records its commit; the hook lets a merge of a stamped branch onto the exact remote tip through on the light gate, CI runs the full one on landing); tools/ci/merge-to-master.sh; the wave script's seeds mode takes --wipe-genesis with the genesis and base-unit read-backs for the testnet go
Main, 7 October 2026: a 100 s hook gate on the merge commit against a master that moves every minute lost six pushes in a row.
Self-test: a fixture repository (unstamped branch, stamped branch, stale stamp, wrong tip, plain commit, dirty tree).

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-07 13:54:10 +00:00
igneum-labs
a16e99063b Chain scene parity test: one recorded feed through the home fold, /live and the app's Inspect view, three frames each pixel-equal, in the gate (7 October 2026, 15:5x UK)
tools/scene/parity.mjs serves site/ (tools/site-serve.mjs) and the app's UI (tools/ui-mock/server.mjs) on a build box, answers
every page's /api/live from scene/fixtures/live-2026-10-07.json, freezes the clock at the fixture's instant (Date, timers,
requestAnimationFrame) and reads each scene canvas at 900 by 420 px at the first push and the next two polls: the read is the
push's own synchronous paint, so a frame depends on the fake time alone, never on how long a fetch took. Known-failed first: the
app with --included moved by one unit must differ from /live at every instant (it does: 1,549 / 1,282 / 1,157 px). Then home
fold = /live, app Inspect = /live, app with this machine's key = /live with the same key (the overlay is the same picture), and
the app's overlay frame differs from its base frame (the overlay is drawn). The compact card is rendered and reported, not
compared. A RED line names the differing pixels and their box. tools/scene/parity-remote.sh carries the files to the box
(~/.config/igneum/build-server-2 by default) under this lane's prefix and runs it there; a plain CI runner with no box and no
Playwright prints a skip line. One new line in tools/ci/pre-push.sh.

First run on build-2 at 15:4x UK, release-0.3.21 tree plus scene-parity: every comparison equal at T+0, T+2 and T+4 s.
Found on the way and fixed in the harness, not the renderer: lane order keeps the history of earlier layouts (the scene must be
at the compared size before its first layout); the app's recorded mock card is a real devnet key (cleared for the base case).

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-07 13:52:19 +00:00
igneum-labs
8cd9b69d68 Merge commit 'e1c55556' 2026-10-07 13:47:45 +00:00
igneum-labs
e1c555568f CI and boxes: the simulators job runs on master and release-* pushes and pull requests into them only (a feature-branch code push runs the igneum-pow tests alone; tools/ci/sims-branch-check.sh); the box lock self-tests run in parallel in one ssh; build-2 and build-3 join the runner pool bounded to 32 cores; the 0.3.20 first-wave script (seeds, hands, RPC-filter lift; dry run by default)
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-07 13:46:42 +00:00
igneum-labs
517320aad2 site-ui-5, deploy 1: the site in the apps' look (7 October 2026, 15:0x UK): one design layer on the app's tokens, the slim bar, the home fold on the shared scene, /download, OS and GPU marks
the project lead: "a site now what is on par with our current miner and wallet app look and feel with the new animation ... simple and
beautiful ... apple and windows icons everywhere needed, GPU brand icons ... easy access to all of our pages without a header
that is crazy".

- site.css section 10: the miner and wallet apps' treatments (app.css miner-ui-5, wallet-0.1.5) over the package: buttons
  (Plex Sans 600, radius 10), the status pill, graphite cards at 16 and rows at 12 on the hairline, the wallet lock screen's
  ember glow, the mark wells; the fourteen palette tokens stay in the scene-tokens block (scene/tokens.css); light and dark.
- Navigation: the seven-item header is gone. The slim bar carries the mark, a DEVNET pill with the live dot, Mine / Network /
  Learn (each opens a panel listing every route of its group with one line), the theme toggle and Download; on phones one
  button opens a full-screen sheet with the same groups. Keyboard: arrows between groups, Escape closes and returns focus,
  Tab walks a panel, the sheet is a dialog with its focus kept. The gate's header check is the new rule
  (tools/ci/site-nav-check.mjs: the bar, the three groups with their aria, 18 routes in the panels and the sheet with their
  descriptions, Download, the burger; self-test known-failed first).
- Home: one fold. The mark on the ember glow, one line, Download for Windows and Download for macOS with the OS glyphs and the
  stamped version (the visitor's platform first), "Linux and HiveOS" to /download, IgneumDag 2.0.3 painting underneath from
  /api/live through IgneumFeed (window 60, fps 60, poll false, no fork). Below: three lines on what a miner gets (E5 and X35
  verbatim), the live network in three tiles (hash rate, blocks a second, locked checkpoint; X2 and X31 verbatim), the
  community row (Discord, GitHub, Reddit), the footer (X7). The scene scripts are deferred; fonts preload with swap.
- /download: a new route. Windows, macOS, Linux and HiveOS cards with their marks, the stamped version, size and sha256, the
  HiveOS flight sheet, the three steps, the card picker with the vendor badge, the wallet for macOS; Windows wallet named as
  next with no file.
- Marks: brand/marks/vendor-marks.mjs (gpu-logos lane, a94dd192) copied byte for byte to site/lib/marks.mjs (the build and a
  gate line refuse drift); site/lib/os-marks.mjs adds Linux and HiveOS in the same treatment. The build stamps
  <span data-os> and <span data-gpu> and puts the vendor's mini badge in front of every table cell that names a card
  (/miner, /miners, the bench table), writes the --mark-* tokens into site.css between markers, and hands yourcard.js the
  badges as JSON for the card picker. The vendor well is scoped to [data-mark] so the ledger's and the journey's own
  .badge keep their look.
- The footer carries the four OS download chips; the nav's group wrappers are .nav-group (the wallet page owns .group).
- tools/site/serve.mjs and capture.sh: the site as Vercel serves it with /api passed to the live observer, captured on
  igneum-build-2 at 390 and 1440, dark and light (docs/plans/site-ui-5-shots, the home set in this commit). The overlap
  lane's detector ran over every page on build-2: 0 overlaps after the two fixes here (the explorer's hash titles wrap, the
  ledger's status badges wrap at 390).

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-07 13:46:23 +00:00
igneum-labs
935c4b61d6 Merge remote-tracking branch 'origin/master' into build-server 2026-10-07 13:33:24 +00:00
igneum-labs
6f5787ed71 Build boxes: the measure file is retired; a pinned measurement leases its cores only (lease.sh cores), a whole-box quiet measurement is its own class (refused beside a slot or a lease, 20-minute cap, named owner), bounded suites never take it, every run keeps off leased cores, stopped holders are reaped after 5 minutes by every keeper, every waiter has a label file; the box-side self-tests in the gate; provision installs the lease tool and the headless Chromium libraries
Main, 7 October 2026, 15:07 UK: one global exclusive measure flock across unrelated measurements stalled build-1 at load 120 with
free slots (a stopped probe held it 5.5 h; an exclusive waiter queued every new shared taker) and build-2 behind a one-core VDF
bench. lease.sh (installed at /srv/builds/_bin/lease by provision.sh and by hand on both boxes) takes one flock per core for a
pinned measurement and the quiet file for a whole-box one; remote-run.sh takes quiet shared only for unbounded runs, excludes
leased cores from its set, and its keeper refreshes the holder file and calls lease reap (a STOPPED holder of a lease, quiet or a
slot for 5 minutes is killed with a line in _log/reaped.log). Keepers close the lock descriptors they inherit (an orphaned sleep
held a slot and the worktree lock 20 s past the release; the slot self-test had rotted on that since the worktree lock landed).
tools/ci/box-locks-check.sh runs lease.sh --self-test and remote-run.sh --self-test-slots on build-1. provision.sh also carries
the 16 libraries headless Chromium needs (installed by hand on both boxes at 14:5x UK) and a headless self-test step.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-07 13:30:40 +00:00
igneum-labs
a9f5b5fd4d Chain scene 2.0.3: /live and the home fold paint on every push whatever the document's visibility says; the renderer, its palette and its feed contract move to one shared folder scene/ with byte-equal copies checked by the gate (7 October 2026, 15:2x UK)
The blank /live (the project lead, 14:3x UK): IgneumDag 2.0.2 painted only from a requestAnimationFrame loop gated on document.hidden and
the IntersectionObserver, so a page that loaded with document.hidden true (the desktop pane, a background tab) and whose embedder
never fired visibilitychange took every push, reported live and never drew a frame. 2.0.3 paints the current picture synchronously
on push, size and theme change; the motion loop alone waits for a visible document and an intersecting canvas. Confirmed headless
on build-2 against the live feed: hidden document 0 lit pixels before, 110,007 after; the never-intersecting observer repaints
on every push. Known-failed test tools/scene/paint-test.cjs (the 2.0.2 renderer draws nothing in the same world).

The second 2.0.3 change: the phone rule (30 s window, four lanes) keys on the viewport width, not the canvas width; a 640 px hero
on a 1,440 px laptop was rendering as a phone while the app's card beside it was not.

scene/ is the one source: live-dag.js, proof-core.js, tokens.css (the fourteen palette tokens, the brand package's values, dark and
light), feed-contract.md and .json (one JSON shape for the observer's /api/live and the app's api/live), a recorded reply as the
fixture. tools/scene/sync.mjs writes the copies and the scene-tokens block into site.css and app.css; --check is the gate line
(byte-equal scripts, an equal block, the names defined nowhere else, a print block excepted), --self-test fails five known cases
first. The site's token definitions move out of the package's :root line into the block; no value changes on the site.
tools/scene/feed-contract.mjs validates a reply against the key lists; its test refuses a miner rewritten to "you", a float now,
a stray key. Three new lines in tools/ci/pre-push.sh. The app side (branch scene-parity, for 0.3.21) takes the same folder.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-07 13:29:38 +00:00
igneum-labs
e56085e3a5 Counter ASIC 3.0 gates (hash): the PC 1 variant of the sub-version 2 G1 job (published only on main's go-PC-1 line: the 5090 off by the runner's --cards-off, quiet confirmed by the process list and nvidia-smi, nothing else on PC 1)
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-07 13:20:54 +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
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
7e1b1c58e8 CI red watcher: its own workflow_run workflow (ci-red.yml) so the copy on master watches every branch's run whatever ci.yml the branch carries
GitHub runs a workflow_run workflow from the default branch only, so a feature branch no longer waits for a merge of master before its reds are posted. record() reads the FAILED run from RED_WATCH_* (id, attempt, workflow, branch, sha, event, url, actor, title, author: the workflow_run payload) and asks the jobs API for that run, not the watcher's own; the inline GITHUB_* shape stays for a branch with the old `red` job (one line per run id either way). The inline job leaves ci.yml. Self-test covers the workflow_run shape and the full line.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-07 13:15:11 +00:00
igneum-labs
e35b40bcc2 Merge remote-tracking branch 'origin/master' into horizon 2026-10-07 13:11:38 +00:00
igneum-labs
61668cb15e Merge remote-tracking branch 'origin/master' into ca3-v4-amend 2026-10-07 13:10:58 +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