diff --git a/docs/design/app-audit-2026-10-08.md b/docs/design/app-audit-2026-10-08.md new file mode 100644 index 000000000..6dccbb6bb --- /dev/null +++ b/docs/design/app-audit-2026-10-08.md @@ -0,0 +1,349 @@ +# Igneum Miner: the window audit, 8 October 2026 + +The order (14:5x BST, the founder): a full audit of the miner window. Things repeat (the tuning on more than one +page), the Earnings page is a mess; think Apple, minimal, informative but simple; handled on the next release. + +Read against the 0.3.25 line (release-0.3.25 b5be4edf) plus the UI lane's tiers-table-26 e34dc5d8, which is the +same window plus the table words. Every screen was captured from the mock on igneum-build-2 (`tools/ui-mock/capture.sh`, +1280 wide, dark and light); the captures are in `~/Desktop/igneum-previews-2026-10-08/audit/` (13 files, 01 to 13). +Nothing here is a Mac build. + +Sections: 1 the window as it stands, 2 the register of repeats, 3 the readouts that mislead or sprawl, 4 the target +layout with every row and its words, 5 the build plan for the UI lane on release-0.3.26, 6 what is held for the founder. + +Verdict words used below: **keep**, **merge into **, **remove**. + +## 1. The window as it stands + +Five pages behind a rail (Overview, Cards, Earnings, Prove, Settings), a four-step setup before them, a log drawer, a +top bar with a status pill, and a rail foot (machine name, "pays 0x…", uptime, Logs, Quit, version). + +### 1.1 Setup (fresh install; captures from the mock's `fresh` scenario were not re-taken, the screens are unchanged since 0.3.23) + +| Screen | What it shows | Verdict | +|---|---|---| +| Welcome | mark, "devnet v4 · nothing is bought or sold", three tiles (background, graphics card, pays an address), Get started | keep | +| Step 1 Your graphics card | every card a row with a switch; notes on NVIDIA 80% cap and the built-in GPU | keep; drop the sentence "The card row has a slider." (the slider is on Tune now, section 4.2) | +| Step 2 Your electricity | region, currency, price per kWh, Skip | keep | +| Step 3 Which network | two network cards | keep | +| Step 4 Where should rewards go | make me an address / use my own | keep | +| Key sheet | the private key once, the acknowledgement | keep; the sentence "Earnings can show it again" becomes "Settings can show it again" | + +### 1.2 Overview (capture 01, 02, 09, 10, 11) + +| Row | What it shows | Verdict | +|---|---|---| +| Top bar pill | "Mining · 203 MH/s" | keep the state word; the rate is the hero's (R8) | +| Hero numbers | 203 MH/s "2 of 2 cards mining"; 622 W "0.33 MH/W"; £4.18 "a day, electricity at 28p/kWh"; 6,785 blocks "this run · 8,055 lifetime" | merge into Mine as four numbers: MH/s, W, MH/W, IGN last 24 h (R8, R9, R18, A5) | +| Start/Stop mining | the big toggle, sub "mining on 2 of 2 cards" | keep the toggle; remove the sub (R8) | +| Clock card | shown only on skew | keep | +| First-block wait card, block card | the Poisson count-up, then the card once | keep | +| Ladder strip | seven rung chips, the current rung's sentence, "The ladder" | remove from Mine (R10) | +| The chain, live | the compact scene, Inspect, Pause, the legend; the full scene with the block inspector behind Inspect | keep | +| Node card | one line plus a disclosure with 13 key/value rows, the rules fingerprint, the next rule change | keep the one line on Mine; merge the disclosure into Settings > Node (R14, A14) | +| Activity | "42 blocks in 10 min · 253 in the last hour · N to the dev fee", "Open the log", eight events | keep the events (five); remove the stats line and the button (R12, R13, A15) | + +### 1.3 Cards (capture 03, 04) + +| Row | What it shows | Verdict | +|---|---|---| +| Ember Tune strip | three tier buttons with fleet numbers and savings; "Ember saves 188 W, £1.26 a day across 2 tuned cards"; Tune all; the sentence; "Electricity £0.28 per kWh, set in Settings · 2 of 2 cards measured"; the knee rule; the heat line; a Power control switch when NVIDIA is measure-only | merge into Tune as the strip: buttons, Tune all, one sentence (R1, R2, R4, R5, R7, R20) | +| Card row | mark, name, kind tag, series, "mining · 32 GB · 102 blocks"; 127 MH/s; 69,898 IGN a day; "450 → 372 W, 0.34 MH/W" with a sparkline; £2.50 a day; 59 °C; Retune; switch; chevron | split: the row on Mine carries name, state, MH/s, W, °C and the switch; everything else is Tune's (R6, R16, R18, R19, A6) | +| Tune line under the row | "Tuned 2 h ago 1950 MHz at 90% · the lock: 33 W less for 1.0% of rate, knee at 1100 MHz · next check 15 Oct" and "saves 78 W, 1.25% of rate" | merge into Tune as one line per card (A9, A10) | +| Details: Power cap | slider "90% · 405 W", two-sentence help, "Cap in force: 405 W, Ember's choice" | merge into Tune details, one sentence (A11) | +| Details: telemetry | "memory 68 °C · core clock 1950 MHz (cap 1950)" | merge into Tune details | +| Details: Tier | the card's three tier buttons, Retune, "Locked at 1950 MHz, 372 W; stock 450 W. A tap applies that row at once, no new search. Ember never locks below the knee by itself. Going lower is your choice." | merge into Tune, the buttons and one lock line (R1, R5) | +| Details: Tuned line | "Tuned: 126.8 MH/s at 372 W (0.341 MH/W) 1950 MHz at 90%, full tune, 2 h ago saves 78 W, 1.25% of rate" | remove (R6) | +| Details: Locked line | "Locked at 1950 MHz: 126.8 MH/s at 372 W (0.341 MH/W) unlocked at the same cap: 128.1 MH/s at 405 W", "the knee at 1100 MHz, where the rate fell 5.8% 33 W less for 1.0% of rate", then the 40-word lock rule | remove; the one lock line carries the lock and the knee (R5, R6, A10) | +| Details: the curve | the tune's curve with a 60-word caption | keep in Tune details with a two-sentence caption (A12) | +| Details: Miners on this card | the identities stepper with a 30-word help | keep in Tune details, one sentence (A13) | +| Details: facts | "runs on CUDA · 21760 cores · CUDA device 0" | keep in Tune details | +| Your cards eyebrow | "2 of 2 on" | keep on Mine | + +### 1.4 Earnings (capture 05, 06, 12) + +| Row | What it shows | Verdict | +|---|---|---| +| Headline | "29,517 IGN a day" "at your last hour's rate: 252 blocks at 4.88 IGN each · about 9,377 IGN expected at 17.0 MH/s" | remove; replaced by the measured windows (A1) | +| Run line | "6,784 blocks this run 33,109 IGN at today's reward · 1 shard, 1.15 IGN · 4 h 10 min" | remove (A2, R9) | +| Weight cell | "rank 3 of 4 keys 61 blocks in 2 hours · 2 of 2 hours · 2.22% of the network" | merge into one Standing row (A3, R10) | +| Electricity cell | "no draw / no card reports its draw" or "£4.18 a day at 28p/kWh for 622 W · 51 IGN per kWh" | keep as one row (A4) | +| Lifetime cell | "8,054 blocks 39,307 IGN at today's reward" | merge into the All time column (R9) | +| Dev fee switch | "Dev fee off. Every block pays your address." | merge into Settings, last section (R12) | +| The ladder | a 40-word intro and seven rungs, each a heading, a line and a sub | merge into the Standing disclosure, rungs only (R10, A17) | +| Your first hour | a six-step timeline behind a disclosure | remove (A18) | +| Rewards address | the address, Copy, Change address, Show my key, Open the wallet, "Your balance is in the wallet." | merge into Settings > Wallet; Earnings keeps one Payouts line (R11) | + +### 1.5 Prove (capture 07) + +| Row | What it shows | Verdict | +|---|---|---| +| Shard card | "Your card proved shard 3 of block 160,390." plus two lines | remove; the shard count is an Earnings column (R15) | +| Prove on this machine | the switch, a two-sentence help, the per-card tier list, the line, the note, Set up, Details (verifier, segments, program id, aggregator id) | merge into Settings > Proving (R15) | +| Prove instead of mining | the second switch for cards under 12 GB | merge into Settings > Proving | + +The page is one switch and one card. It does not earn a rail entry. + +### 1.6 Settings (capture 08, 13) + +| Row | What it shows | Verdict | +|---|---|---| +| Tuning card | the three tier buttons again, "2 of 2 cards measured · £0.28 per kWh, set in Settings", the Ember Tune switch, the Power control switch, Fine tuning, the sentence again | remove the card; Power control stays as its own section; the Ember Tune switch and Fine tuning go to Tune (R1, R2, R3, R4) | +| Electricity | region, currency, price per kWh, the typical-price note | keep | +| Heat mode | the switch with a 45-word label, hold, schedule, room now, two long helps | keep; trim the words (A20) | +| Network | the line, two network cards | merge into Settings > Node | +| This machine | start at login, make my page public, remote jobs (note, Check, History), name, appearance | keep | +| Interface | "Interface 1.0.0, built in", a 35-word help, the built-in switch | merge into Updates as one row (A19) | +| Igneum Miner 0.3.3 | the version line, Check for an update, Install updates by itself | keep as Updates | +| Logs | Copy the log, Show the log, the two paths | keep (R13) | +| Advanced (devnet) | vote on checkpoints, trust proofs, the live page, machine id | keep, before the dev fee | + +### 1.7 The rail, the foot, the drawer + +| Element | What it shows | Verdict | +|---|---|---| +| Rail | Overview, Cards, Earnings, Prove, Settings | four entries: Mine, Tune, Earnings, Settings | +| Rail foot | machine name, "pays 0xdd44…86E8", "up 4 h 10 min", Logs, Quit, "v0.3.3 · devnet v4" | remove the "pays" line (R11); the rest keeps | +| Page sub-titles | "your rate, what it costs, the chain as it grows" and so on | keep, rewritten in 4.5 | +| Log drawer | chips, search, jump to time, last error, last swap, wrap, copy, follow | keep | +| Update card, quit question, notices strip | | keep | + +## 2. The register of repeats + +Each repeat, where it sits today, and the one place it keeps. The test that proves it is in section 5.4 under the same id. + +| Id | Element | Where it appears today | Keeps | Verdict | +|---|---|---|---|---| +| R1 | the three tier buttons (Efficiency, Balanced, Maximum) | Cards strip `#tier-seg`; every card's details `[data-card-tier]`; Settings `#tier-seg-2` | Tune: the strip (fleet) and one row per card | remove from Settings | +| R2 | the Ember Tune sentence (what it is doing, did, will do) | Cards `#tune-schedule`; Settings `#s-tune-schedule` | Tune strip | remove from Settings | +| R3 | the Power control switch | Cards strip `#m-power-control` (when NVIDIA is measure-only); Settings `#s-power-control` | Settings > Power control | Tune shows one sentence with a link when it matters | +| R4 | the electricity price as a figure | Overview "electricity at 28p/kWh"; Cards "Electricity £0.28 per kWh, set in Settings"; Settings Tuning "£0.28 per kWh, set in Settings"; Settings Electricity | Settings > Electricity | remove the three figure lines | +| R5 | "Ember never locks below the knee by itself. Going lower is your choice." | Cards strip `#tier-rule`; each card's tier help; each card's lock help (`LOCK_RULE`); with two cards, five times on one page | Tune, once, at the foot | remove the other four | +| R6 | a card's measured point (126.8 MH/s, 372 W, 0.341 MH/W) | the row; the Balanced button; the "Tuned:" line; the "Locked at" line; the tune line's "saves 78 W"; six readings of one number | the row (live) and the tier button (measured) | remove the Tuned and Locked lines | +| R7 | the fleet saving | the strip's "Ember saves 188 W, £1.26 a day across 2 tuned cards"; the Balanced button's "saves 188 W, £1.26 a day" | the button | remove `#fleet-saving` | +| R8 | the hash total and the card count | the pill "Mining · 203 MH/s"; the hero "203 MH/s"; the hero sub "2 of 2 cards mining"; the toggle sub "mining on 2 of 2 cards" | the hero and its sub | the pill keeps the state word; remove the toggle sub | +| R9 | blocks this run and lifetime | Overview hero "6,785 blocks this run · 8,055 lifetime"; Earnings "6,784 blocks this run"; Earnings "Lifetime 8,054 blocks"; each row's "102 blocks" | Earnings, the windows table | remove from the hero; the row's count stays (it is per card) | +| R10 | rank, weight, the ladder | the Overview strip; the Earnings Weight cell; the Earnings ladder rung "Rank by weight"; the block card's rank line | Earnings, one Standing row with the rungs behind a disclosure | remove the strip and the cell | +| R11 | the rewards address | the rail foot "pays 0x…"; Earnings Rewards address card; the key sheet | Settings > Wallet; one Payouts line on Earnings | remove the foot line and the Earnings card | +| R12 | the dev fee | Earnings switch; Overview activity "N to the dev fee" | Settings, the last section (the UI lane's item) | remove the activity mention | +| R13 | open the log | the rail foot Logs; Activity "Open the log"; Settings Logs "Show the log" | the rail foot and Settings Logs | remove the Activity button | +| R14 | the node facts | Overview node card, 13 rows plus fingerprint plus rule change | Settings > Node | Mine keeps one line | +| R15 | proving | the Prove page; the Earnings ladder rung "Your card proved a shard"; the Overview strip chip | Settings > Proving (the switches) and Earnings (the shard counts) | remove the page | +| R16 | Tune and Retune buttons | the row's Retune; the details' Retune; the strip's Tune all | Tune: one per card, Tune all on the strip | remove the row button | +| R17 | hashes per watt | the hero's "0.33 MH/W" as a sub-label; each row's "0.34 MH/W" with a sparkline; each tier button; the Tuned and Locked lines | the hero (as a number), the row, the tier button | the sparkline goes with the curve to Tune details | +| R18 | money a day | hero "£4.18 a day"; each row "£2.50 a day"; Earnings Electricity cell; each tier button's "£2.41 a day" | Earnings Electricity row; the tier button keeps the saving in watts only | remove from the hero and the rows | +| R19 | IGN a day | each row "69,898 IGN a day"; Earnings headline; Earnings "about 9,377 IGN expected" | Earnings, one quiet projection line | remove from the rows | +| R20 | the heat line | Cards strip `#heat-line`; Settings Heat mode `#s-heat-line` | Settings; Tune shows the line only while heat mode is on | | +| R21 | Interface and Updates as two cards | Settings | one Updates section | merge | + +## 3. Readouts that mislead or sprawl + +| Id | Readout | Why it misleads | Verdict | +|---|---|---|---| +| A1 | "29,517 IGN a day … about 9,377 IGN expected at 17.0 MH/s" | two figures three times apart on one line: one hour multiplied by 24 and called a day, beside a share projection; neither is measured | remove; the windows are measured sums (section 4.3); the projection is one quiet line that hides when a job holds a card, the network is paused, or no card mines | +| A2 | "6,784 blocks this run · 33,109 IGN at today's reward · 4 h 10 min" | "this run" is not a window a person thinks in; "at today's reward" recomputes the past | remove; last 24 h, 7 days, all time | +| A3 | "rank 3 of 4 keys · 61 blocks in 2 hours · 2 of 2 hours · 2.22% of the network" | four facts in three units in one cell | one row: "Rank 3 of 4 keys" with the window in the sub | +| A4 | "no draw / no card reports its draw" on Earnings while the Overview hides the watts cell | the same absence told two ways | one sentence, once: "No power reading on Apple silicon." | +| A5 | the hero's MH/W as a sub-label under W | the founder's first-class number rides as small print | its own number tile | +| A6 | "450 → 372 W" on a row | an arrow with no words; a before and an after that are not both now | the row shows the live watts; the tier button on Tune shows "78 W under stock" | +| A7 | tier button "saves 358 W, £2.41 a day" | a saving against stock that reads as a saving against now | "358 W under stock" | +| A8 | "MH/S", "A DAY", "BLOCKS" | the CSS uppercase on unit labels breaks the units | no text-transform on a unit | +| A9 | "Balanced on 2 cards, tuned 1 h ago · next check 15 Oct." and "2 of 2 cards measured" and "Tuned 2 h ago" | three stamps for one event, and the capture shows 1 h against 2 h | one sentence on the strip; one per card | +| A10 | "the lock: 33 W less for 1.0% of rate" and "saves 78 W, 1.25% of rate" | two savings with two baselines (the unlocked cap, stock) | one baseline, stock, once per card | +| A11 | slider "90% · 405 W", "Cap in force: 405 W", tier "372 W" | three watt figures that look like a contradiction (the cap and the draw) | one sentence: "Cap 405 W (90%). The card draws 372 W at the lock." | +| A12 | the curve caption, 60 words | nobody reads a caption that long | two sentences; the legend in the drawing | +| A13 | "Miners on this card", 30-word help | the help explains three cases | one sentence | +| A14 | "Node synced · 4 peers · 39,587 blocks" beside "This node has every block the network has made. Read 6 s ago." | the same fact twice on one line | "Node synced · 4 peers" | +| A15 | "42 blocks in 10 min · 253 in the last hour" over the activity feed | a third set of block counts on the glance page | remove; Earnings has the windows | +| A16 | Earnings sub-title "what you made, where it goes" | "where it goes" is the address, which is settings | "what this machine earned" | +| A17 | the ladder: seven rungs with headings, lines and subs, a 40-word intro | gamification on a money page | one Standing row; the rungs behind a disclosure, no intro | +| A18 | "Your first hour" timeline | the wait card and the block card already mark the first hour | remove | +| A19 | the Interface card | a 35-word explanation of over-the-air bundles beside the Updates card | one row under Updates: "Interface 1.0.0, built in" | +| A20 | Heat mode's 45-word switch label | the switch label is a paragraph | the label is five words; the paragraph is the help | +| A21 | the Prove page's "20 points of every block pay the provers, split by shard. A paid record is a chain fact: anyone can read it." | fine words in the wrong place | the Proving section's help | + +## 4. The target layout + +Four pages, one job each. Mine: what is happening now. Tune: how each card is driven. Earnings: what this machine +earned, measured. Settings: everything you set once. + +Every page under the copy law: no em dashes, no two-beat antithesis, no aphorisms, sentence case, one to three points +per block, `text-wrap: balance` on headings and `text-wrap: pretty` on body, the last two words of every sentence +block glued. Unit labels are never uppercased. Every number names its source on hover (`title`), as today. + +### 4.1 Mine + +Sub-title: "what this machine is doing now". + +1. The toggle: **Start mining** / **Stop mining**. No sub-line. Disabled with "waiting for the engine" as the label while the engine starts. +2. Four numbers in one row, big, each with a unit and one sub-line: + - **203** MH/s, sub "2 of 2 cards mining" (paused: "paused"; waiting: "waiting for the node"; heat rest: "resting, heat mode"). + - **622** W, sub "drawn now". Hidden when no card reports power. + - **0.33** MH/W, sub "hashes per watt". Hidden with the watts. + - **1,234** IGN, sub "last 24 hours" (measured: the blocks and shards of the last 24 hours at the reward each paid). "0 IGN" with sub "no block yet" before the first. +3. The clock card, only on skew (as today). +4. The first-block wait card, then the block card, once (as today). +5. **Your cards**: one row per card. Mark, name, the kind tag, the state word ("mining", "starting", "off", "fault: , retrying"), then **127** MH/s · **372** W · **59** °C, then the switch. No chevron, no buttons, no money, no IGN a day, no arrow. The eyebrow "2 of 2 on". A fault's reason reads on the row (the plug, tune, play rule). +6. **The chain, live**: the compact scene with Inspect and Pause, the legend; the full scene behind Inspect, unchanged. +7. The node line: a dot and "Node synced · 4 peers" (syncing: "Node syncing · 41,000 of 52,000 blocks · about 12 min left"; failed: "Node restarting · "). A click opens Settings > Node. No disclosure here. +8. **Activity**: the last five events in a person's words, each with its time. No stats line, no button. + +What leaves this page: the ladder strip, the money tile, the blocks tile, the node details, the stats line, the log button, the toggle sub-line, every per-card tuning word. + +### 4.2 Tune + +Sub-title: "how Ember drives each card". + +1. The strip, one card: the three tier buttons for the fleet, each: **Efficiency** "193 MH/s · 452 W" "358 W under stock"; **Balanced** "203 MH/s · 622 W" "188 W under stock"; **Maximum** "206 MH/s · 810 W" "stock". The one in force is marked. Then **Tune all**. Then one sentence, the only sentence: + - before the first tune: "Balanced is on. The first measurement runs 2 min into steady mining." + - from the table: "Balanced is on, from the team's table for this card class. Ember measures this card 2 min into steady mining." + - measuring: "Measuring RTX 5090: step 3 of 9, mining again in 4 min." + - measured: "Balanced on 2 cards. Measured 1 h ago, next check 15 Oct." + - off: "Ember Tune is off. The tiers still apply when you tap them." + - paused by the manifest: the manifest's note. + - class flip: "Class v5 arrived: re-measuring 2 cards, started 14:12. The class v4 points are out of date until then." + Then the switch **Measure cards by itself** with the help "Once, 2 min into steady mining, then every 7 days and after a driver or program change." (this is today's `s-sweep`). Under it, when heat mode is on, the heat line; when NVIDIA is measure-only: "Power control is off, so NVIDIA cards are measured and never set. Turn it on in Settings." +2. One card per graphics card: + - head: mark, name, the live "127 MH/s · 372 W · 0.34 MH/W", and **Tune** (or **Stop** while measuring; **Retune** once measured). + - the card's three tier buttons, the same shape as the strip, the one in force marked. A tap applies the row at once. + - one line: "Locked at 1,950 MHz, cap 405 W. Knee at 1,100 MHz." Variants: "Clock unlocked, cap 405 W." / "Measuring: step 3 of 9, 4 min left." / "No lever on Apple silicon: the system sets the clocks. Ember measures and reports." / "Re-measuring for class v5, started 14:12." / "From the team's table, measured on this card class." (or "estimated for"). + - **Details** (a disclosure, closed): the curve with the caption "Hash rate against power for every step of the last measurement. The ringed point is the one Ember kept; a hollow point was rejected; the dashed point is the knee." Then the cap row: the slider and "Cap 405 W (90%). The card draws 372 W at the lock. Lower is cooler and quieter." with **Back to Ember's choice** when pinned. Then **Miners on this card** with the stepper and "Each one votes and is paid on its own. 8 for a big card, 2 for a small one, 1 for a built-in GPU." Then the telemetry line "memory 68 °C · core 1,950 MHz · memory clock 13,801 MHz · fan 62%". Then **Fine tuning** (today's `s-climb`, only when the engine offers it) with "Searches around the best point instead of stepping down a ladder." Then the facts line "runs on CUDA · 21,760 cores · driver 617.42". + - a driver offer, when there is one, as today (Install, Restart now), on this card. +3. The foot, once: "Ember never locks below the knee by itself. Going lower is your choice." + +Nothing about tuning anywhere else: no tier buttons, no Ember sentence, no price figure, no saving line on Mine, Earnings or Settings. + +### 4.3 Earnings + +Sub-title: "what this machine earned". + +1. The headline: **1,234 IGN** with the eyebrow "last 24 hours" and the sub "251 blocks · 3 shards". +2. The windows, one row of three columns, each the same shape: + - **Last 24 hours**: 1,234 IGN · 251 blocks · 3 shards + - **7 days**: 8,920 IGN · 1,830 blocks · 19 shards + - **All time**: 39,307 IGN · 8,054 blocks · 61 shards + Every figure is the sum of what the chain paid at the time, never today's reward applied to old blocks. "0 IGN" with "no block yet" before the first. The engine carries the windows (section 5.1, item 2). +3. **Electricity**: "£4.18 a day at 28p/kWh for 622 W". Without a price: "622 W. Set a price in Settings for the cost." Without a reading: "No power reading on Apple silicon." +4. **Payouts**: "Pays 0xdd44…86E8" with **Copy** and **Open the wallet**; the sub "Your balance is in the wallet. Change the address in Settings." +5. **Standing**: "Rank 3 of 4 keys · signing 8 of 80 points" with the sub "weight is your blocks over the last 2 hours, 2 of 2 hours mined". Behind **Details**: the rungs as today, without the intro, each one line and one sub. (Held for the founder: section 6, D2.) +6. The projection, one quiet line at the foot, dim: "About 9,400 IGN a day at 17.0 MH/s, 2.2% of the network." It is not shown when a remote job holds a card, when the network or mining is paused, when no card mines, or when the network rate is not read. It never sits beside a measured figure. + +What leaves this page: the dev fee, the address card, the key, the run line, the lifetime cell, the first-hour timeline, the IGN a day headline. + +### 4.4 Settings + +Sub-title: "set once, left alone". Sections in this order, each a card: + +1. **Wallet**: the address with **Copy**; **Change address** (the input, Change, the confirm); **Show my key** (the question, Show, Copy, Hide, the file path); **Open the wallet**. The help "Every block this machine finds pays this address." +2. **Node**: the network cards (Devnet 3 running now, Testnet 1 not yet open) and the switch question; one line "Node synced · 4 peers · 39,587 blocks"; **Details** (a disclosure): the 13 rows as today, the rules fingerprint with Copy, the next rule change. Help: "Every node on the network shows the same fingerprint of the rules. A peer with another one is refused." +3. **Updates**: "Igneum Miner 0.3.26" with the update note and **Check for an update** / **Install now**; the switch **Install updates by itself** "Downloads in the background and installs at a quiet moment, never mid-program."; the row "Interface 1.0.0, built in" with the switch **Use the built-in interface** and the one-line help "Small changes to this window arrive over the air, signed by Igneum." +4. **Power control**: the switch, "Lets the app set NVIDIA power and clock limits. Windows asks for administrator rights once at install. Off, NVIDIA cards are measured and never set." and the engine's note when there is one. +5. **Electricity**: region, currency, price per kWh, the typical-price note. Unchanged. +6. **Heat mode**: the switch **Hold a room temperature**, help "The cards heat for a share of every 10 minutes and rest for the rest. Your card is an electric heater that also earns." Then hold, schedule, room now, each with one sentence of help. +7. **Proving**: the switch **Prove on this machine**, help "Every block is turned into a short proof, in pieces called shards. Your cards prove shards and earn IGN for each one. 20 points of every block pay the provers." Then **Prove instead of mining** when a card is under 12 GB, the per-card tier list, the line, **Set up** when needed, **Details** (verifier, segments, the two program ids). +8. **This machine**: start at login, make my page public, allow remote jobs (note, Check for jobs, History), name, appearance. Unchanged. +9. **Logs**: Copy the log, Show the log, the two paths. Unchanged. +10. **Advanced** (devnet): vote on checkpoints, trust proofs, the live page, the machine id. Unchanged. +11. **Dev fee**, last: the switch "Dev fee: 1 block in 100 pays the people who make this app (12 blocks so far)." / "Dev fee off. Every block pays your address." (the UI lane's item, placed here). + +### 4.5 The rail, the pill, the titles + +- Rail: **Mine**, **Tune**, **Earnings**, **Settings**; the foot keeps the machine name, "up 4 h 10 min", Logs, Quit, the version. The "pays 0x…" line goes. +- The pill: the state word only: "Mining", "Paused", "Syncing", "Waiting", "Job running", "Node down". The rate lives on Mine. +- Page ids: `mine`, `tune`, `earnings`, `settings`. `View.PAGES` in that order; `page('nonsense')` falls to `mine`. + +## 5. The build plan for release-0.3.26 + +For the UI lane (a414b6bdc81d348d8), on top of tiers-table-26 e34dc5d8 and its two held items (the earnings-tab +fix, the dev fee to the bottom of Settings; both are absorbed below). Ordered by what the person at the window sees +first. Hours are lane hours; the whole plan is about 27 hours of lane time plus 4 of engine time, so two lanes land it +in one working day. Every item ships with its test (5.4) and its captures. + +### 5.1 Items + +| # | Item | What changes | Hours | Tests | +|---|---|---|---|---| +| 1 | The four pages | `View.PAGES` to mine, tune, earnings, settings; the rail; the page titles and subs (4.5); Prove's markup moves under Settings; `renderProve` becomes `renderProvingSection`; the pill reads a state word (`View.pill`) | 2 | T-R15, T-R8 | +| 2 | Earned windows in the engine | `ladder.rs` keeps every block and shard with its time and the wei it paid; `state.ladder.earned = {h24, d7, all}` each `{wei, blocks, shards}`; summed at state time from the kept records; a 0.3.25 record with no wei rows reads the chain facts' reward at the block's time for the back-fill, once | 4 (engine lane) | `ladder.rs` unit: three windows over a fixed record; a block at the 24 h edge counts once | +| 3 | Mine | the hero's four tiles (MH/W as a tile, IGN last 24 h from item 2); the toggle without its sub; the ladder strip removed; the node card to one line that opens Settings > Node; Activity to five events, no stats line, no button; the card rows to name, state, MH/s, W, °C, switch | 4 | T-R8, T-R9, T-R10, T-R13, T-R14, T-R18, T-R19, T-A5, T-A14 | +| 4 | Tune | the page from the Cards strip and the card details: the strip (buttons, Tune all, one sentence, the measure switch, the conditional heat and power lines); per card the head, the buttons, the one lock line, Details (curve with the short caption, cap sentence, miners stepper, telemetry, fine tuning, facts); the foot rule once; the Tuned and Locked lines removed; `fleetSaving`, `priceFigure` and `tier-price` removed | 6 | T-R1, T-R2, T-R3, T-R5, T-R6, T-R7, T-R16, T-R17, T-R20, T-A7, T-A9, T-A10, T-A11 | +| 5 | Earnings | the headline and the windows (item 2), the Electricity row, the Payouts line, the Standing row with the rungs behind Details, the projection line and its hide rule; the dev fee, the address card, the run line, the lifetime cell and the timeline removed | 4 | T-A1, T-A2, T-A3, T-R9, T-R11, T-R12 | +| 6 | Settings | the sections in 4.4's order: Wallet (from Earnings), Node (the network cards plus the Overview disclosure), Updates (with the Interface row), Power control alone, Electricity, Heat mode (short label), Proving (from Prove), This machine, Logs, Advanced, Dev fee last; the Tuning card removed | 4 | T-R1, T-R2, T-R3, T-R4, T-R11, T-R12, T-R14, T-R15, T-R21, T-A19, T-A20 | +| 7 | Copy and units | no `text-transform` on unit labels; the setup's slider sentence; the key sheet's "Settings can show it again"; the widow guard on every new block; a pass over every new sentence against the copy law | 1.5 | T-A8, the copy-law grep (no em dash in `index.html` or `app.js` strings) | +| 8 | Mock, captures, screens | the mock's scenarios keep working (`?page=mine|tune|earnings|settings`); a `audit-26` shot list in `tools/ui-mock/`; captures into `docs/design/app-screens/0.3.26/` (four pages, dark and light, the first-minute and the measured states) on build-2 | 1.5 | the capture run itself | + +Item 1 lands first so items 3 to 6 do not collide on the page markup; items 3 to 6 are one page each and can run in +parallel on one branch (`app-ia-26` off tiers-table-26) with a commit per page. Item 2 is the engine lane's and gates +only the IGN tile and the windows; until it lands the tile reads "reading" and the windows show blocks only. + +### 5.2 What the UI lane's two held items become + +- The earnings-tab fix: absorbed by item 5; the old headline, run line and cells are not fixed, they are replaced. +- The dev fee to the bottom of Settings: item 6, section 11, the last card; the words in 4.4. + +### 5.3 Order of landing + +1. `app-ia-26`: items 1, 3, 4, 5, 6, 7 (one lane, commits per item, the gate green on each). +2. `earned-windows-26`: item 2 (the engine lane), merged under `app-ia-26` before item 5's windows read live. +3. Item 8 on the merged tree; the captures go with the plan commit. +4. The lane reports its sha to main by 18:30 BST; main merges into release-0.3.26 after the gate. + +### 5.4 The tests: nothing twice + +All in `app/igneum-app/ui/view.test.mjs` (the View block runs under node with no DOM) plus a new +`app/igneum-app/ui/once.test.mjs` that reads `index.html` as text and counts. Each repeated element in section 2 has +one assertion. `once(html, needle)` counts occurrences of a string in the static markup; `inPage(html, pageId, needle)` +counts inside one `
`. + +| Test | Asserts | +|---|---| +| T-R1 | `once(html, 'aria-label="Tuning tier"') === 1` and it sits in `#page-tune`; `inPage(html, 'settings', 'tier-seg') === 0`; `View.tierSet` is the only producer of per-card tiers and `tierButtonsHtml` is called from the Tune renderer only (a grep over `app.js`: the string `tier-seg-2` is absent) | +| T-R2 | `once(html, 'id="tune-schedule"') === 1`; `once(html, 's-tune-schedule') === 0` | +| T-R3 | `once(html, 'id="s-power-control"') === 1`; `once(html, 'm-power-control') === 0`; `View.powerNote(state)` returns the one sentence only when an NVIDIA card is present and power control is off | +| T-R4 | the string `per kWh` appears in `index.html` only inside the Electricity section (count 2: the setup step and Settings); `View.priceFigure` is not exported | +| T-R5 | `once(html, 'Ember never locks below the knee') === 1`; `View.TIER_RULE` is read by the Tune foot only (`app.js` grep: one reference outside the View block) | +| T-R6 | for a measured card, `View.tuneLines(card, state)` returns exactly one line and it contains neither "Tuned:" nor "Locked at … MH/s" (the lock line carries MHz and W only); `View.lockWords` is folded into it | +| T-R7 | `View.fleetSaving` is not exported; `once(html, 'fleet-saving') === 0` | +| T-R8 | `View.pill(state).text` for a mining state equals "Mining" (no "MH/s"); `once(html, 'btn-toggle-sub') === 0` | +| T-R9 | `inPage(html, 'mine', 't-blocks') === 0`; `once(html, 'e-run') === 0`; `View.earningsLines(state).all.blocks` is the only lifetime count | +| T-R10 | `once(html, 'ladder-strip') === 0`; `once(html, 'id="rungs"') === 1` and it sits in `#page-earnings` behind `#standing-details` | +| T-R11 | `once(html, 'id="r-address"') === 1` and it sits in `#page-settings`; `View.railFoot(state)` has no "pays" line; `inPage(html, 'earnings', 's-address-input') === 0` | +| T-R12 | `once(html, 'id="s-devfee"') === 1` and it is inside the last `.card` of `#page-settings`; `View.activityStats` is not exported and `d-stats` is absent | +| T-R13 | `once(html, 'btn-open-log') === 0`; `once(html, 'id="btn-logs"') === 1`; `once(html, 'id="s-log-open"') === 1` | +| T-R14 | `once(html, 'id="node-details"') === 1` and it sits in `#page-settings`; `inPage(html, 'mine', 'n-digest') === 0` | +| T-R15 | `View.PAGES.map(p => p.id)` deep-equals `['mine', 'tune', 'earnings', 'settings']`; `once(html, 'id="page-prove"') === 0`; `once(html, 'id="s-prove"') === 1` and it sits in `#page-settings` | +| T-R16 | the Mine row renderer output for a tunable card contains no `data-tune` and no `data-stop`; the Tune card contains exactly one of them | +| T-R17 | `View.cells(card)` has `eff` once; the Mine row output contains `MH/W` zero times (the hero tile carries it); the Tune head contains it once | +| T-R18 | `inPage(html, 'mine', 't-money') === 0`; the Mine row output contains no currency symbol; `View.earningsLines(state).cost` is the one money line | +| T-R19 | `View.cardIgnDay` is not exported; `View.earningsLines(state).projection` is the one IGN a day figure and is `null` when `jobs.active`, `mining.paused`, `mining.state !== 'mining'` or `chain.hps` is unread | +| T-R20 | `once(html, 'id="heat-line"') === 1` in `#page-tune`; `View.heatLine(heat).text` is empty when heat mode is off | +| T-R21 | `once(html, 's-interface-card') === 0`; `once(html, 'id="s-ui-line"') === 1` inside the Updates card | +| T-A1 | `View.earningsLines(state)` returns `h24`, `d7`, `all`, each `{ign, blocks, shards}` summed from `state.ladder.earned`; no field named `day` | +| T-A2 | no "this run" in any `earningsLines` text | +| T-A3 | `View.standing(state).text` equals "Rank 3 of 4 keys · signing 8 of 80 points" for the ladder fixture | +| T-A5 | the Mine hero markup has four `.tot` tiles with the unit labels `MH/s`, `W`, `MH/W`, `IGN` in that order | +| T-A7 | a tier button's sub reads "358 W under stock" for the fixture; no "saves" and no currency | +| T-A8 | `app.css` has no `text-transform: uppercase` rule that applies to `.tot .k`, `.num .unit` or `.tier-b .l` | +| T-A9 | `View.tierSentence(cards, state, now)` for two measured cards returns one sentence containing exactly one time word | +| T-A10 | the Tune card's lock line for the fixture contains "under stock" at most once and no "for … of rate" | +| T-A11 | `View.capSentence(card)` equals "Cap 405 W (90%). The card draws 372 W at the lock." for the fixture | +| T-A14 | `View.nodeLine(node).text` for a synced node equals "Node synced · 4 peers" | +| T-A19 | `View.interfaceWords(ui).line` equals "Interface 1.0.0, built in" and the help is one sentence | +| T-A20 | the Heat mode switch label text in `index.html` is under 30 characters | + +The copy-law grep joins `tools/ci/checks.txt` for `app/igneum-app/ui`: no em dash (U+2014) in `index.html` or in a +string literal of `app.js`; it is already the rule for served text and the window is served text. + +## 6. Held for the founder + +Defaults stand unless a word comes by the time given. + +| Id | Question | Default | By | +|---|---|---|---| +| D1 | Prove loses its rail entry: the switches go to Settings > Proving, the shard counts to Earnings | fold it | 17:00 BST | +| D2 | The ladder: one Standing row on Earnings with the rungs behind Details, or gone from the window (it stays on igneum.network) | one row, rungs behind Details | 17:00 BST | +| D3 | Electricity as one row on Earnings (it is measured: watts now at the typed price) | keep the row | 17:00 BST | +| D4 | The card rows (name, state, rate, watts, switch) live on Mine; every tuning control on Tune | Mine | 17:00 BST | +| D5 | The chain scene stays on Mine as the live graph; the block inspector stays behind Inspect | stays | 17:00 BST | + +Captures: `~/Desktop/igneum-previews-2026-10-08/audit/01-overview-live-dark.png` to `13-settings-light.png`. diff --git a/tools/ci/export-exclude.txt b/tools/ci/export-exclude.txt index c2b651bfc..498b5025b 100644 --- a/tools/ci/export-exclude.txt +++ b/tools/ci/export-exclude.txt @@ -26,3 +26,5 @@ docs/plans/cryptanalysis # 8 October 2026: the class v6 research lanes (the hardware future, the rotating-family research): internal research written # for the founder on the chip model, quoting the operations record; the public text is whatever main lands from the synthesis. docs/analysis/class-v6 +# 8 October 2026: the miner window audit (an internal design record: the founder's order, lane ids, the build plan) +docs/design/app-audit-2026-10-08.md