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>