The founder's calls of 18:1x BST, 8 October 2026 (through the shipper), recorded as F1 to F5 in the window audit doc.
F1. The Cards tab is back in the rail as its own page (View.PAGES: mine, cards, tune, earnings, settings); every card
row moved out of Mine into it: the state, the hash rate, the power, the temperature, the tune state (one line, the Tune
page's words, View.cardsRowWords), the enable switch, the 16 GB proving note on an NVIDIA card under 16 GB. Mine keeps
the headline rate and the chain status (the hero tiles, the chain scene, the node line, Activity).
F2. The first-block celebration shows once per payout address, ever: settings.json keeps first_block_shown[address]
= {hash, at} (config.rs FirstBlockMark), written when a window reports the card seen (POST /api/card/seen), so it
survives runs, updates and a reinstall that keeps the wallet; a new address shows it once again (the engine passes
the address's mark to Ladder::on_block_for, which raises the card whenever the address has none); an install that
showed it under the machine rule takes the mark for its current address once at start. Never on a dev-fee block: the
miner's "dev-fee block <hash>" line follows the fee block's ACCEPTED line, and Ladder::on_fee_block withdraws a first
card that block raised; the engine now counts fee blocks from that line (fee_session, fee_total) as well.
F3. The four interface words (docs/spec/finality-guarantees.md section 9) on the window: the block inspector reads
included or excluded or pending, executed as chain block N, proven, finalised (View.blockState); a block under the lock
is finalised even while the network's finality is paused (the pause is said after the block's own words and on the
status strip), and no block reads "not active" or "(reported)"; the scene's hover words say finalised and executed
(scene/live-dag.js 2.0.8, the copies synced).
F4. One positioning line: the hero keeps it; #s-positioning under Updates is gone.
F5. The watchdog's words when the node serves no epoch state stream: "waiting for the node's execution state for this
epoch: no program to load 300 s after starting", never "the worker did not load its program".
Tests known-failed first: once.test.mjs (the Cards page with the home page's contents, the inspector's words), the
view tests' page list, ladder.rs (the first card follows the address mark; a dev-fee line withdraws it; the 0.3.21
wrapper keeps the machine rule), watchdog.rs (the waiting words). The crate: 319 tests green on build-1; 129 UI tests
green on build-2. Captures: ~/Desktop/igneum-previews-2026-10-08/cards-201.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
The engine already sends every wei value as a decimal string (u128 on the Rust side), but the window turned three of them into a Number for the IGN figure (the proving paid line, the segment paid line, the wallet balance). A 2.0 block subsidy is 9.5e18 wei, past 2^53, so the IGN figure is now cut from the string (weiParts, ignText): whole units and the first four decimals, no wei value in a Number anywhere; only the IGN figure is a Number, for the pounds line and the thousands check. The 61 view tests hold.
The DMG README's step 2 says the build is unsigned tonight and gives the two-step (open once, then System Settings, Privacy and Security, Open Anyway); Developer ID signing and notarization follow with the Apple enrolment.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Found by the net-20 capture: .screen is display:none and only the ids in app.css's phase rule display; screen-network
(the network step, 0.3.23) was never in that rule, so a fresh install reached step 3 of 4 as a blank page with no
Continue button, on every build from 0.3.23 to 0.3.26 (the forced ?screen=network capture read the same). The rule
lists it now. The once-test reads every screen id in index.html against the rule, known-failed first (five of six).
127 UI tests green on build-2; the step captured with its one card.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
The net-20 capture of the network step (?screen=network, the forced start the screenshots use) read empty: show('network')
renders the step only when a state is already held, and the first poll shows the forced screen before render() stores
the state; later polls render the dashboard pages only. render() now renders the step whenever the phase is network,
the same way it renders the cards step. 126 UI tests green on build-2; the step captured with its one card.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
The founder's word of 8 October 2026 (16:2x BST): the testnet is scrapped and the devnet is one network, served as
"the Igneum 2.0 devnet" (the engine runs igneum-devnet-4 and serves the label as state.chain, the shipper's engine
commit on the same line). The network step (step 3 of 4) and the Settings Node card show one card, "Igneum 2.0 devnet
· igneum-devnet-4 · the chain may reset, coins have no value", the fresh-install default and the only choice; an
existing install keeps what it runs ("This machine runs the Igneum 2.0 devnet (igneum-devnet-4)."); an older network
name reads as the one network. The "igneum-testnet-1 opens when…" note, the testnet card, "Devnet 3" and "devnet v4"
leave index.html and app.js (the welcome eyebrow and the node facts default read "Igneum 2.0 devnet"). The mock's
recorded state carries the new chain label and network name.
Tests known-failed first on build-2 (once.test.mjs: one NETWORKS entry, one card, the words, no testnet or old label
in the window), then green; the 0.3.23 network tests follow (the Rust-source mirror keeps the network_switch name
and its test, and no longer pins the testnet_open signature or the manifest's testnet rule, which the engine commit
removes). 126 UI tests green.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
The 15:15 BST retake owed on tiers-table-26, taken on app-ia-26 where that branch now lives: app/igneum-app/tiers/
class-v5-tiers.json from the lane's closed sweep (20 rows, the 4060 Ti's class v5 stock row, the 3060 and 4070 rows
measured). The lane's .mjs and test are unchanged. The app crate (src/tiertable.rs embeds the file): 314 tests green on
build-1, the 5090's three rows and the knee at 1,300 MHz as before; the lane's table test and the UI tests green on
build-2; the Tune page's table scenario recaptured (~/Desktop/igneum-previews-2026-10-08/app-ia-26/tiers-table-retake).
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Item 8 (docs/design/app-audit-2026-10-08.md): tools/ui-mock/shots-audit-26.txt is the shot list (the four pages, dark
and light, the first minute, the table, the syncing node, a job holding the card, a still chain) and the fourteen
screens are in docs/design/app-screens/0.3.26, taken by tools/ui-mock/capture.sh on build-2 against the mock with
the engine's earned windows on every scenario.
Two faults found by the screens. (1) Since item 4 the Settings page had not rendered on the mock: renderProvingSection
called proveInsteadWords bare after the page-side alias left with the old card details, the poll's catch swallowed
the throw as an engine silence, and the Settings captures of items 4 and 6 showed the markup's defaults ("not set",
"Node starting"). It reads View.proveInsteadWords now; renderSettings also renders the Node card's line and facts
(they live on Settings since item 3). (2) The poll's catch now prints "render failed: <stack>" to the console, so a
throwing render is a visible bug and the capture scripts report it, never a silent default page. The not-answering
branch addresses the node line and the toggle by their present ids.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
The founder's audit (docs/design/app-audit-2026-10-08.md, 4.4, items 6 and 7). Settings reads, in this order: Wallet
(the address, Change address, Show my key, Open the wallet), Node (the network cards, one line of state, the facts
behind Details), Updates (the version and its update, "Install updates by itself", the Interface row "Interface 1.0.0,
built in" with one sentence of help and the built-in switch; the Interface card is gone, T-R21 and A19), Power
control, Electricity, Heat mode (the switch label is five words; the paragraph is the help, A20), Proving (the shard
card and the switches from the old Prove page), This machine, Logs, Advanced, The dev fee last. Item 7: no
text-transform on a unit label (.tot .k, A8); the key sheet reads "Settings can show it again"; the setup's card note
drops "The card row has a slider." (the slider is on Tune); no em dash anywhere in the window. The mock's ladder
carries the engine's earned windows on every scenario (the audit lane's ask: figures, not "reading", when the founder
looks), and tools/ui-mock/shots-audit-26.txt is the audit's shot list for item 8.
Tests known-failed first on build-2 (once.test.mjs: the eleven sections in order with T-R21, A19 and A20; T-A8 with the
em-dash grep), then green; 125 UI tests green.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
earned-windows-26 65828fb2 (item 2) is merged in, so the Earnings page and the Mine IGN tile read the engine's sums
(state.ladder.earned) on the same build. On an engine before the windows the counts come from the ladder's own record
and never from an absent field read as zero: blocks_24h, else the block list filtered to the day; the day ring for
7 days; the lifetime count for all time (the audit lane read "no block yet" beside 8,054 lifetime blocks). The 24 h
column under the 24 h headline was a repeat of the audit's own making, amended at 15:2x BST: the row is 7 days and
All time, the headline is the 24 h figure with its blocks and shards. T-A1 asserts the fallback counts and the one
24 h figure on the page; 123 UI tests green on build-2.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
The founder's audit (docs/design/app-audit-2026-10-08.md, 4.1 and item 3). The hero is four numbers with a unit and
one sub-line each: MH/s ("2 of 2 cards mining", "paused", "waiting for the node", "resting · heat mode"), W ("drawn
now", hidden with no power reading), MH/W ("hashes per watt", its own tile, hidden with the watts), IGN ("last 24
hours" from the engine's earned window, "no block yet" before the first, "reading" on an engine before item 2). The
toggle reads Start mining or Stop mining with no sub-line (its reason sits in the title). The card rows stay as item 4
left them. The ladder strip, the money tile, the blocks tile, the stats line and the Open the log button are gone;
Activity is the last five events. The node is one line with a dot ("Node synced · 4 peers"; "Node syncing · 41,000 of
52,000 blocks · about 12 min left"; "Node restarting · <reason>"; "Node behind · last block 53 min ago"); a click
opens Settings > Node with the facts open. The node facts (the 13 rows, the rules fingerprint, the next rule change)
moved to Settings as a closed Details under the Node card (the Network card renamed), the same ids, one line of state
above them. The toggle's "switch a card on in Cards first" reads "switch a card on first".
Tests known-failed first on build-2 (once.test.mjs: T-R8's toggle half with T-A5, T-R9, T-R18 and T-R10; T-A14 with
T-R14; T-R13 with T-A15 and the stats half of T-R12), then green with the node-line fixtures in view.test.mjs
following; 123 UI tests green. Captures from the mock on build-2 in ~/Desktop/igneum-previews-2026-10-08/app-ia-26/
item3 (the live record, two cards, the first block, light, syncing, the Settings Node card).
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
The founder's audit (docs/design/app-audit-2026-10-08.md, 4.3 and item 5): the headline is the last 24 hours from the
engine's earned sums (state.ladder.earned, earned-windows-26: what the chain paid at the time), then the three windows
(Last 24 hours, 7 days, All time; each IGN with blocks and shards, "estimated" on a back-filled all-time figure, "one
block not priced yet" while a reward is unread); an engine before the windows reads "reading" with the block counts.
Electricity is one row ("£4.18 a day" / "at 28p/kWh for 622 W"; "622 W" / "Set a price in Settings for the cost.";
"No power reading on Apple silicon."). Payouts is one line ("Pays 0xdd44…86E8", Copy, Open the wallet, "Your balance
is in the wallet. Change the address in Settings."). Standing is one row ("Rank 3 of 4 keys · signing 8 of 80 points",
the window in the sub) with the rungs behind a closed Details and no intro. The projection is one dim foot line
("About 71.68 IGN a day at 17.0 MH/s, 0.017% of the network.") that hides under a remote job, a pause, a still chain,
no card mining or an unread rate; under a job or a still chain the line carries the reason instead ("Projection
paused: <job> running since HH:MM.", "Network paused: no block on the chain for 15 min."), with no IGN figure, as the
coordinator ordered on earnings-26. The address card is Settings > Wallet now (first card, the same controls; Open
the wallet on both pages); the rail foot reads the machine's name and its uptime (View.railFoot), no address. Gone
from Earnings: the IGN a day headline, the run line, the Weight and Lifetime cells, the ladder intro, the first-hour
timeline, the address card.
Also in this commit, the audit lane's two readings of item 4: the Tune lock line names the cap from the slider's want
(power_default_w × pct), never the draw ("Locked at 1,950 MHz, cap 405 W."; the test asserts the same cap figure as
the cap sentence); the miners help glues its last two words (copy law 18) and .help wraps pretty.
Tests known-failed first on build-2 (once.test.mjs: T-A1 with T-A2, T-A3 with A17 and A18, T-R9 with T-R11, T-R18 and
A4, T-R19), then green with the superseded view tests removed (their truths live in the once-tests); 120 UI tests
green. Captures from the mock on build-2 in ~/Desktop/igneum-previews-2026-10-08/app-ia-26/item5 (a job holding the
card, a still chain, the live record, light, the Settings Wallet card).
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
The shipper read ui/heat-region.test.mjs red on 7e60442e: the item-1 pill said "Resting" where the heat lane's rule
wants "Resting · heat mode" (never a bare rest word on a resting card). The pill reads the rule's words again; the
once-test says why. heat-region.test.mjs, fold.test.mjs and ui-ota.test.mjs were not in the gate's UI line, which is
how the red passed the gate; they are in it now (both lines of tools/ci/pre-push.sh).
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
The founder's audit (docs/design/app-audit-2026-10-08.md, item 2): the Earnings page reads measured sums, never
today's reward applied to old blocks. The ladder keeps one row per coinbase the node credited and per shard paid
(Ladder.earned_log: at, shard, wei as a decimal string), trimmed to 7 days plus an hour, and the all-time running
totals (earned_all_wei, earned_all_blocks, earned_all_shards). A block row is priced at the miner reward the chain
facts carry when the block lands (chainfacts::cached_reward_wei, the dashboard's 10 s cache) or on the first state read
that has the figure (price_blocks); a priced row never changes. A shard row carries the wei its record paid. The
dashboard reads state.ladder.earned = {h24, d7, all} each {wei, ign, blocks, shards, priced} plus `estimated`:
a record from before the rows is back-filled once (backfill_earned) from the lifetime count the engine persists at
the reward then read, with the kept shard records, and says estimated for all time; the windows never invent rows.
Tests (ladder.rs): three windows over a fixed record at two rewards (the ramp moved between them); a block at the
24 h edge counts once, on the far side; an unpriced block reads priced:false until the reward arrives and then takes
that reward and no later one; the log trims past 7 days while all time keeps the block; the back-fill runs once,
says estimated, and a fresh record with rows for every block is not estimated. The crate: 308 tests green on build-1.
Builds on earnings-26 66cc2041 (blocks_24h); the view reads the windows in app-ia-26 item 5.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
The founder's audit (docs/design/app-audit-2026-10-08.md, 4.2 and item 4): Tune is the one place a card's driving is read
and set. The strip: the fleet's three tier buttons with the measured rate and watts and the saving against stock in
watts ("358 W under stock", never money, never "saves"), Tune all, ONE sentence ("Balanced on 2 cards. Measured 1 h ago,
next check 15 Oct." and its measuring, table, off, paused and class-flip forms), the switch "Measure cards by itself"
(today's s-sweep, moved from Settings), Fine tuning when the engine offers it, the heat line only while heat mode is on,
and one sentence with a button when NVIDIA cards are measure-only. Then one card per graphics card: the head (mark, name,
the live "127 MH/s · 372 W · 0.34 MH/W", one Tune, Retune or Stop button), the card's three tiers, one line
(View.tuneLine: "Locked at 1,950 MHz, cap 372 W. Knee at 1,100 MHz." or its unlocked, measuring, no-lever, re-measuring,
table and not-measured forms; MHz and watts only, one baseline), and a closed Details disclosure: the curve with a
two-sentence caption, the cap as one sentence beside the slider (View.capSentence: "Cap 405 W (90%). The card draws
372 W at the lock."), the miners stepper with one sentence, the telemetry line, the facts line, the driver note. The
driver offer stays on the card. The foot carries the knee rule once, in the markup. The card html is built in the View
block (View.tuneCardHtml) so the once-tests read it with no DOM.
Gone: the Tuned, Locked and Ember lines under a row, the fleet saving, the price figure, the rule constants, the goal
segments, the per-card IGN a day, the Settings Tuning card (its Power control switch is its own Settings card now, the
sentence with "at install"), the second power switch on the strip. The Mine row is the plain row of 4.1 item 5 (mark,
name, kind, state word, MH/s, W, °C, the switch; no chevron, no buttons, no money) and the card list is back on Mine.
The engine's choices (api/cards) read the switch from Mine and the cap and miners count from Tune.
Tests known-failed first on build-2 (11 red in once.test.mjs: T-R1, R2, R3, R4, R5, R6 with A10, R7, A7, A9, A11, R16
with R17), then green with the view-test fixtures following (the saving wording, the strip sentence, no fleetSaving,
priceFigure, TIER_RULE, LOCK_RULE or cardIgnDay exports). Captures from the mock on build-2 in
~/Desktop/igneum-previews-2026-10-08/app-ia-26/item4 (tiers, first minute, table, class flip, knob, details open; Mine
and Settings after the move).
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
The founder's audit of 8 October 2026 (docs/design/app-audit-2026-10-08.md, section 4.5 and item 1 of section 5): the
window has four pages, one job each. View.PAGES reads mine, tune, earnings, settings in that order with the titles and
subs of 4.5 ("what this machine is doing now", "how Ember drives each card", "what this machine earned", "set once,
left alone"); page('nonsense') falls to mine. The rail carries the four entries; the Prove entry is gone and its markup
(the switches, the tiers, the line, the details and the shard card) is the Proving section of Settings, rendered by
renderProvingSection from renderSettings (D1, confirmed by main). The pill is the state word only: Mining, Paused,
Resting, Syncing, Node down, Waiting, Job running, Tuning, Not mining; the rate lives on Mine. The page ids in the
markup, the css (#page-mine) and the mock's ?page= follow.
Tests known-failed first on build-2: ui/once.test.mjs (new, in the gate line) counts the static markup; T-R15 (four
pages, no page-prove, s-prove once and inside Settings, four rail entries, the subs, no renderProve, no overview id
left in the page code) and T-R8 (the pill words); the PAGES and pill fixtures in view.test.mjs follow. Captures from
the mock on build-2 (~/Desktop/igneum-previews-2026-10-08/app-ia-26/item1). Items 3 to 6 reshape each page in turn.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
The founder read PC 1's Earnings tab: "100k+ IGN/day" on one line and "0 blocks in 2 hours" on the next, both shown as
earnings while a job held the card and the chain stood still. Three truths on the tab now, each with a test:
1. When a job holds the card (jobs.active, or a card in state held) the projection line reads "Projection paused:
<job name> running since <time>; the card is not mining" and carries no IGN a day figure.
2. When the chain has no block for ten minutes (node.tip_age_s at or over 600) the line reads "Network paused" with the
last block's age; the projection resumes with the next block. A job's word wins when both hold.
3. The earned line is always the measured last 24 hours from the node's coinbase reads, labelled "earned", never the
projection. The engine's ladder keeps the time of every credited block for a day (Ladder.block_times, trimmed on each
read) and reports ladder.blocks_24h, since ladder.blocks keeps only the last 30 and a fast card finds more in a day;
a record from before the field reads its block list once. The run count and the shards paid sit under it.
The dev fee leaves the Earnings tab entirely: no switch, no line, no words. It sits at the bottom of Settings as its own
small section (The dev fee, 1%): the site's wording from site/miner.html, what it funds in one line, no control. The
command-line arm (--dev-fee 0) is unchanged and the off state reads as off. Tests: Earnings renders no fee words; the
fee section is the last card on Settings and holds no control; the page code has no fee switch.
Mock scenarios earn-held (PC 1's shape, a floor-lane job holding the 5090 for two hours) and earn-still (no block for
15 min), both with 3 blocks earned in the last 24 hours. Known-failed first on release-0.3.25 (4758c914): the projection
read as earnings under a job, "blocks this run" stood where earned belongs, the fee switch sat on Earnings.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>