igneum/docs/plans/site-ui-3-audit.md
igneum-labs 4e727402ce Site UI 3: the audit (every page, every state, every link, every number), the tick list and the design
docs/plans/site-ui-3-audit.md: the project lead's ask of 6 October 2026 ("run the website and all pages and litepaper through the same
apple lens as the miner app", "leave no stone unturned") against the miner-ui-3 standard. Method, screen by screen with the
10-point scale (home 6, litepaper 5, live 6, miner 5, wallet 6, miners 5, explorer 7, block and address 6, faucet 7,
metamask 6, 404 6, bench 5, evidence 6, ledger 5), links and downloads (914 attributes followed, four installers hashed
against the host), the live elements' loading, failed and stale states, contrast of every token pair in both themes,
keyboard focus, phone width, the litepaper's print, the top ten findings, and appendix B listing the stones turned.

docs/plans/site-ui-3-ticklist.md (appendix A): 502 rows across 17 inventories, every claim, number, date, link and
feature with its source and today's verdict (MATCH, STALE, UNSOURCED, APPROX), the ledger's stated sentences and their
presence, the thirteen "does not claim" sentences verbatim, the scrub rules.

docs/plans/site-ui-3.md: the design: one stylesheet (tokens light and dark, type on Unbounded, Plex Sans and Plex Mono,
the card and table rules, state words, nav, footer), the home page as one screen, the litepaper as a readable paper
with a sticky section nav and the whole paper by default, per-page notes, and the live DAG module brief (the project lead's "can this
look more advanced and cool?").

docs/plans/site-ui-3-shots/before/ and before-states/: every page at 1440 and 390, dark and light, the failed-fetch and
stale-observer captures, the litepaper print PDFs, the focus captures; headless Chromium (Playwright's build, never
Chrome.app), one browser at a time, niced.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-06 19:26:38 +00:00

26 KiB

Site UI 3 audit: the website and litepaper through the miner app's lens

6 October 2026, 19:00 to 21:00 UK. Branch site-ui-3. the project lead's ask: "run the website and all pages and litepaper through the same apple lens as the miner app", and "leave no stone unturned". The standard is docs/plans/miner-ui-3-audit.md and docs/plans/miner-ui-3.md (branch miner-ui-3). The design that answers this audit is docs/plans/site-ui-3.md.

1. Method

Input How
Every page in site/ 15 pages: index, litepaper, live, miners, miner, wallet, bench, evidence, ledger, explorer, block, address, faucet, metamask, 404
Screenshots headless Chromium (Playwright's cached build, never Chrome.app) against tools/site-serve.mjs on a private port, reading the live API; full page at 1440 and 390, dark and light: docs/plans/site-ui-3-shots/before/
Live states the same pages with /api/* blocked (failed fetch) and with the observer's reply rewritten stale (state.stale: true, 70 min old): before-states/*-fail.jpg, *-stale.jpg; the loading state read from each page's JS
Print /litepaper printed to A4 in both themes: before-states/litepaper-1440-{dark,light}.pdf
Keyboard Tab pressed 2, 3 and 8 times on the home page, the focused element and its outline recorded: before-states/index-*-focus*.png
Contrast every text token on every surface token, both themes, computed (WCAG relative luminance)
Links every href and src (914 attributes, 210 unique) followed; anchors against ids; externals with curl
Downloads every installer fetched from dl.igneum.network and hashed against the host manifest and the page
Numbers every number and dated claim traced to the bench log, the ledger, the spec, the analysis docs or the live API
Rating the miner-ui-3 scale: "10 = nothing to change. The three questions per screen: what does it say in jargon, which number has no unit or no meaning, which 0 or blank has no reason word."

The pane in the desktop app was used to confirm the item 0 fix live (counters and legend) but its screenshots come back black under a 1440 emulation, so every image here is from the headless run.

2. Screen by screen

Rating: 10 = nothing to change. The three questions per screen: what does it say in jargon, which number has no unit or no meaning, which 0 or blank has no reason word. Screenshots: docs/plans/site-ui-3-shots/before/<page>-<width>-<theme>.jpg.

Home, 6

Good: the hero says what it is in a sentence, the four facts are tiles with units, the light-client card verifies a real certificate in the tab, the download buttons carry version and size, the economics bar reads at a glance.

Problem Where
The lead paragraph runs 100 words and carries the chip model's numbers (5x to 9x per joule, about 2x), a model figure the plan says to word before any public push hero, line 345
Eight sections before the download; the one primary action ("See the miner") scrolls to the middle of the page hero CTA
Two ember primaries on screen at once in the hero (the nav's "The miner" and "See the miner") plus every stat number in ember hero, stats
Every section below the fold is invisible until scrolled (.reveal at opacity 0); a print, a screenshot, a slow scroller or a reader with JavaScript off gets blank sections 37 .reveal elements
The live scene showed window counts as chain facts, grey nodes, and a simulation under a live-looking label when the fetch failed (fixed in item 0) chain scene
The journey log's default eight entries are engineering shorthand with scrub artefacts ("the 12-node the cloud provider network", "00:4xZ", CLI flags, ledger ids) journey
"vote keys active in 10 min (a card runs several)", "BLS aggregate, version 1", "final · cp 5", "igneum-proving-pool-v0" on the surface strip, hero card, wallet, economics
The mine heading is 91 characters section 6
Horizontal overflow at 390 (395 px) phone
No light mode whole page

Apple would: one screen that says what it is, shows the chain alive, offers the download, and lets the sceptic check three things; everything else one link away.

Litepaper, 5

Good: a real table of contents with a sticky rail, numbered sections, "what we do not claim" as its own section, every other-chain claim labelled approximate, the pager at the foot of each section.

Problem Where
Light by default while every other page is dark; its own token set (ground, surface, quiet, tint) :root
Accents as text (ember, molten) fail 4.5:1 in light mode everywhere they appear: eyebrows, links, the tile numbers section 6 of this audit
File paths inline in the abstract and limits (docs/analysis/chip-model-v3.md, asic-resistance-history.md, prover-tiers-real-cards.md, which does not exist) abstract, randomx, proving, limits
92 sentences over 30 words; the longest 152 words (Ember status) and 136 (proving measurements) mining, proving, ember
"One section at a time" is the default, so the print is one section and a search of the page finds one section contents
The cover says updated 5 October; the body cites 6 October nine times cover
Placeholders on the public page: "the entry lands tonight", "measurement tonight" questions miners ask
Numbers in prose, not tables: the proving measurements, the swap figures, the prover tiers proving, ember
Roadmap says the proof lag is "not yet measured on the live chain" while the API reports a median lag of 387 s roadmap
Tint callouts (--tint) against the app's no-tint rule callouts

Apple would: dark like the rest, a readable 68-character measure, every measured number in a table with its date and source, the limits section set as callouts, the whole paper on one page with a sticky section nav, printable.

Live, 6

Good: the status tiles say what they measure and over what window, the lane scene is real data with a legend in the ledger's words, the miners table and the events feed are honest, "observer offline" is said in words.

Problem Where
"DEVNET V0" eyebrow (the chain is v4) eyebrow
The fee sentence pins DAA 210,000 and the chain passes it tonight intro
"proven 0/16" counted the on-screen window (fixed in item 0) strip stats
Hash rate "n/a" when the estimate is missing; "n/a" in the proof lag panel tiles, canvas panel
"DAA", "pgas", "gwei", "observer", "api unreachable" on the surface with no gloss intro, tiles, notes
The scene is a lane chart with coloured squares, not a DAG; the selected chain is a spline through the squares canvas
2,000 px of miners table on one screen with every engine cell "not reported" miners
Eight tiles before the scene; the scene is the page's job layout

Apple would: the DAG first, the eight numbers under it as one row, the tables folded.

Miner, 5

Good: every feature is one line with its measurement and a link to the log entry, the fee section shows the fee and the off switch, the recoveries table has units.

Problem Where
The h1 is 96 characters and wraps to seven lines at 1440 hero
8,947 px tall; the download sits at 7,700 px whole page
Buttons say v0.3.13, the Flight Sheet URL is 404 and its sha256 is the hash of a dead file (L2) get
"every NVIDIA card from 8 GB proves" cites a file that is not in the repository and contradicts /evidence row 16 hero, features
"Six levers" has no document; the "3 minutes / 30% in 10 minutes" update rules have no source levers, updates
"until 0.3.6", "Ships in 0.3.6" at 0.3.13 caption, lever 4
Command lines and env strings as body text (--dev-fee 0, DEV_FEE=1 IDENTITIES=8 WORKER=auto VOTE=1) outside a code block fee, hive
Three ember primaries on one screen (nav, "Downloads", band) hero, band

Apple would: install, start, the card mines, download here; every feature behind a chevron with its number; the fee as one sentence and a switch. (The copy and images are being redone by the site-miner agent today; this page is styled through the shared CSS only.)

Wallet, 6

Good: the three states are three cards with a word each, the timed first run is a table with units, the checks before "final" are four numbered sentences.

Problem Where
"Your coins. Final means final." and "The miner pays this wallet." are aphorisms; "No confirmation counts, no trusting the node" is an antithesis hero, band, lead
Every timed number has no row in the log or the repository ("The log entry ships with the wallet") against "every number has a row" first run
5,880 px tall; download at 4,800 px whole page
The two screenshots are the same size as the text column and carry an example address hero, transaction
Horizontal overflow at 390 phone

(The content is being redone by the wallet-ui-3 agent today; styled through the shared CSS only.)

Miners (bench table), 5

Good: six measured rows with date and version, prototype rows say so, "no tune reports yet" says why.

Problem Where
"3 entries, newest at the bottom" is the bench template's eyebrow on a page with three sections eyebrow
"MH per watt: not measured" on every row while the 5090's watts are in the ledger (E17) and eleven rented cards were measured today table
"Rows: 6. Source file: site/miner-bench.json", "tools/tuning.mjs --priors --site" on the page notes
Two 40-word sentences priors

Apple would: the table, the rate per watt where measured, "not measured" with the reason once.

Explorer, 7

Good: eight tiles with units and a sub-line each, a real table of real blocks, a legend in the ledger's words, the public API card, the error sentences are words.

Problem Where
"n/a" in the height, difficulty and hash-rate tiles and the Txs and Proof-records cells when a field is missing tiles, table
"DAA" in two tiles and two notes with no gloss anywhere on the page tiles, notes
"Older blocks" stops the 5 s refresh for good after the first click, silently button
"cached 10 s" (the explorer endpoint is 5 s); "under check" names a field today's /api/supply does not carry API card, note
"observer" six times as a word for the reader intro, notes

Apple would: the same page with the state words and the glosses.

Block and address, 6

Good: every header field, the mergeset, the coinbase outputs and the proof records as labelled rows; a block that is a checkpoint shows its weight; the error sentences name what a hash or an address is.

Problem Where
"n/a" in twelve places (miner, vote key, difficulty, subsidy, selected parent, parent levels, balance, last block, subsidy and tx cells) both pages
The address balance reads "n/a" for every address with the sentence "no EVM RPC configured on this deployment (EXPLORER_EVM_RPC)", an environment variable on a public page address
The default balance sub-line is the raw RPC method name eth_getBalance address
A never-seen address returns zeros with no sentence saying it has never mined address
"E(DAA) of spec 2.5", "pgas", "needs an EVM RPC", "the proving feed" block
The only way back is the eyebrow link both

Apple would: "balance not shown on this deployment" once, "this address has not mined in the last day", the spec words behind a tooltip.

Faucet, 7

Good: one job, one form, one button, the four rules as numbered sentences, the status words are sentences.

Problem Where
"not yet open" notice and a form the reader can still submit, which answers "The faucet is not open yet" form
"No account, no sign-in" (antithesis); "Mainnet starts from an empty genesis" stated as fact for a plan intro, rules

MetaMask, 6

Good: two cards, the numbers a wallet needs, a button with five state sentences, the by-hand steps.

Problem Where
Canonical and share URL point at /wallet (L4) head
"Explorer: none yet" while /explorer is live; "until the Igneum Wallet ships, MetaMask is the wallet" while 0.1.4 ships; "The Igneum Miner app" devnet card, app section
Not in the nav; reachable from the footer and the faucet only nav

404, 6

Good: short, three links, noindex.

Problem Where
"These four pages are everything the site has" (fifteen pages); "in 17 sections" (nineteen) copy
"Nothing is mined here." is an aphorism h1
No miner, wallet, explorer or ledger card; no canonical, OG or manifest links, head

Engineering log (bench), 5

Good: every measurement in one place, 83 entries with a contents rail, the scrub keeps machine names out.

Problem Where
189,472 px tall at 1440 (190 screens), 311,114 at 390: Chromium needs minutes to lay it out, and a phone reader scrolls for an hour whole page
Headings carry commit hashes and internal names (by design of the generator) and run past 150 characters in the sticky contents contents
The eyebrow "83 entries, newest at the bottom" is right here and wrong on the two pages that reuse the template eyebrow
One plain-text GitHub Actions URL 404s to the public (L9) entry 346

Apple would: the log as a list of entries, each collapsed to its heading and date, opened on demand; a search box.

Evidence, 6

Good: 31 rows with five labels, the label counts as tiles, a sort on every column, "none yet" said in every verification cell.

Problem Where
The page shows designed 6 where the source table says 5 (row 17 carries two labels and the build buckets the first) tiles
Two scrub artefacts in the rows ("the Apple M5 Max M5 Max", "a an RTX 5090 on Windows with an RTX 5090") rows 1, 30
The "What moved on 4 and 5 October" tables of the source are not rendered anywhere body
23,031 px tall; the table scrolls sideways under 1,140 px with a one-line warning table
Three file paths on the surface notes

Ledger, 5

Good: 167 criticisms with their status and the answer as first written, a search, the counts as chips, nothing deleted.

Problem Where
53,522 px tall at 1440, 113,082 at 390, with a 712 px horizontal overflow at 390 (a long id or path in a card) whole page
40 section headings with duplicate ids; the section links land on the first sections
165 "Evidence:" lines and the "Decision owner:" lines are dropped against the renderer's "nothing is dropped" cards
The page's counts differ from the source's count table by 3, 2 and 2 chips
~/.config/igneum, "pid 33114", --rpclisten=0.0.0.0:26610, "PC 2" fifteen times and "the Mac" nineteen times on a public page; the renderer skips the forbidden-strings hard stop cards
"Nothing deleted, nothing softened." (antithesis) meta

Apple would: the ledger as a filterable list with one card open at a time, the scrub applied, the ids unique.

3. The tick list: nothing lost

Appendix A carries every claim, number, date, link and feature per page, with its source and whether the source still says the same today. The build keeps every row; a row that moves gets its new place written beside it.

Every internal anchor resolves (268 fragment links, 0 missing ids). Every local asset exists. Every external link answers 200 except one plain-text GitHub Actions URL in the bench log (private repository, 404 to the public). All four downloads hash-match the host manifest. The live 404 body is byte-identical to site/404.html.

# Finding Where Consequence
L1 site/downloads.json is two releases stale (miner 0.3.9 and 0.3.10, written 5 Oct 21:52Z); the host serves 0.3.14 site/downloads.json; site/build.mjs 266 to 313 any build whose 8 s fetch of the host manifest fails stamps dead versions, dead URLs and wrong hashes on every download button
L2 miner.html carries v0.3.13 on all four buttons, a Flight Sheet URL that is 404 (igneum-hive-0.3.13.tar.gz) and the sha256 of that dead file site/miner.html 462 to 471 a HiveOS miner copying the repo page's URL gets nothing; the live deploy shows 0.3.14 because the build fetched the manifest, so only a failed fetch exposes it
L3 the host publishes no checksum file beside any download; only the Hive button shows a hash; Windows, Mac and Wallet show none dl.igneum.network; index.html 513 to 514, wallet.html 371 a sceptic cannot verify three of four downloads from the page
L4 metamask.html canonical and og:url point at /wallet while the sitemap lists /metamask site/metamask.html 8, 14; sitemap.xml 10 search folds the page into /wallet
L5 sitemap omits /ledger, /explorer and /faucet; lastmod dates predate the 6 Oct changes site/sitemap.xml the three pages are found only by crawl
L6 two Open Graph sets: seven pages send a 256 px square (og-small.png, summary card), seven send 1200 by 630 (og.png); og-coin.png duplicates og.png byte for byte; og-square.png is referenced nowhere site/partials/head.html, page heads a shared link shows a small square for the home page and the litepaper, the two pages most shared
L7 icon links differ by page: address, block, explorer, faucet carry no SVG icon and no 192 or 512 link; ledger lacks 512; 404 lacks canonical, OG, manifest and favicon-32 page heads install and tab icons vary by page
L8 /404 answers 200 as a clean URL Vercel cleanUrls harmless, noindex
L9 the bench log prints a GitHub Actions URL as text that 404s to the public site/bench.html 346 a reader following it hits a wall

5. Live elements and their states

Page Element Fresh Loading Failed fetch Stale observer Empty
index hero strip, chain scene, light-client card item 0: chain block, shards proven, last lock "connecting to the devnet observer" (item 0) "simulated preview · live feed unavailable" with a note (item 0); before item 0 the simulation ran under a live-looking label "observer offline, last update N ago" (item 0) not reached: the scene always has the window
live the lane scene, finality strip, proving strip, events, miners table, blocks per minute reads /api/live every 2 s counters at 0, "n/a" in proven until the first reply (item 0 made it "pending") after 3 failures: "api unreachable" in the status tile and "api unreachable, scene frozen" on the canvas; tiles keep their last numbers "OFFLINE", "last update N ago", the scene frozen with "observer offline" no empty words: an empty window draws nothing; the tables say "No blocks in the last 10 minutes." and "No events yet."
miners the bench table static static no change (static page) no change "No tune reports yet. The first rows appear once five machines with the same card model have reported."
explorer tiles, latest blocks /api/stats, /api/supply, /api/explorer "Loading." in the table, tile values at their defaults tiles keep defaults, the table shows the fetch error text or "The API did not answer." "OFFLINE", "last update N ago", "observer offline, last known" over the table "No blocks in the last 24 hours."
block, address the detail pages /api/explorer h1 "Block" / the address, cells empty "The API did not answer: " no stale word: the detail is the stored block "Not found." / zeros with no "never seen" sentence
faucet the form /api/faucet on submit the form "The faucet did not answer. Try again in a minute." not applicable the not-open notice
wallet, miner download buttons, product names build-time stamps static no change no change not applicable

Rule for the design: every live element names its state in words with the reason (section 2.5 of the design); no counter shows n/a, -- or a bare 0.

6. Contrast

Computed for every text token on every surface token. Dark passes everywhere (lowest: ember text on the litepaper's --surface-2, 4.79:1). Light fails for both accent colours as text:

Theme Text On Ratio Body 4.5:1
light (site tokens) ember #D9430F page #F4F1EC 3.92 fail
light (site tokens) ember #D9430F card #FFFFFF 4.41 fail
light (site tokens) molten #B9741C page #F4F1EC 3.34 fail
light (site tokens) quiet #6E6B65 surface-2 #ECE8E0 4.35 fail
light (app tokens) ember #E04A14 page #F4F1EC 3.61 fail
light (app tokens) molten #B8731F page #F4F1EC 3.38 fail
light, proposed ember-text #B8390C page, card, row 5.14, 5.79, 4.74 pass
light, proposed molten-text #8F5810 page, card, row 5.22, 5.88, 4.81 pass

Today the litepaper (light by default) sets eyebrows, links and figures in ember and molten at body sizes: every one of them is under 4.5:1. The design splits the accents into a fill token and a text token (design 2.1).

7. Keyboard and focus

Focus is visible: a 2 px ember outline at 3 px offset on every link and button (site/partials/head.html 23), confirmed at Tab 2, 3 and 8 in both themes and at 390 px. The skip link appears on the first Tab. The burger menu at 390 is reachable. What is missing: the canvas scenes have no keyboard alternative and no text summary for a screen reader beyond the counters; the litepaper's section pills are buttons without aria-pressed; the theme has no control at all on 14 of 15 pages (the litepaper offers one).

8. Phone width

Page 390 px Finding
index horizontal overflow, page 395 px wide the livestrip's nowrap tiles and the hero grid
wallet horizontal overflow, page 395 px wide same class
ledger horizontal overflow, page 712 px wide a long id or path in a card without overflow-wrap
the other twelve pages no overflow

9. Print

/litepaper printed to A4: three pages in dark mode (the page colours print as set), the nav and footer print, and only the open section prints because the paper opens in "one section at a time" mode. A reader who prints the litepaper gets the abstract and the footer. The design adds a print stylesheet and prints the whole paper (design 4).

10. Top ten findings

Ranked by reach (who sees it) and by what it costs a reader.

# Finding Consequence per reader
1 The home live scene showed window counts as chain facts and grey blocks (fixed in item 0, commit 84a6de2) every visitor read a dead chain; fixed before this audit shipped
2 Fifteen pages carry fifteen stylesheets with three token sets (home, litepaper, chrome) and no light mode on fourteen of them; the litepaper is light by default, the rest dark a reader crossing from the paper to the home page changes world; a light-mode user gets dark pages everywhere but one
3 Light-mode accents fail body contrast everywhere they are used as text the litepaper's links, eyebrows and figures are hard to read in light mode
4 Scroll-reveal hides every section below the fold until it scrolls into view (.reveal at opacity 0) a slow scroller, a print, a screenshot or a reader with JavaScript off gets blank sections
5 The print of the litepaper is one section, dark, with nav and footer the paper cannot be printed
6 The repo's download snapshot and the miner page are stale against the host (L1, L2) a failed manifest fetch ships dead links and a wrong hash
7 Developer text on user surfaces: the litepaper's abstract cites docs/analysis/chip-model-v3.md and other repo paths inline; DAA numbers appear without the word for them a reader who is not in the repo sees file paths
8 Horizontal overflow at 390 on index and wallet the phone page scrolls sideways
9 Three of four downloads show no hash and the host publishes no checksum file (L3) a sceptic cannot verify the installer
10 Two Open Graph sets, a wrong canonical on /metamask, three pages missing from the sitemap (L4 to L6) shared links and search see a smaller, inconsistent site

Also found and fixed in item 0 without a row: the scene's fixed 16 ms frame step (double speed on 120 Hz displays), and polling that stopped for good after one failed fetch.

Appendix A. The tick list per page

docs/plans/site-ui-3-ticklist.md: 502 rows (home 88, litepaper 151, nav 11, footer 24, live 22, miners 19, miner 66, wallet 29, bench 5, evidence 12, ledger 8, explorer 23, block 11, address 9, faucet 8, metamask 9, 404 7), each with its source and today's verdict (MATCH, STALE, UNSOURCED, APPROX), the ledger's stated sentences with their presence on each page, the nine "what we do not claim" sentences and the four "what Ember does not claim" sentences verbatim, and the scrub rules. The build keeps every row; the design's per-page notes (section 5 of site-ui-3.md) say where a row moved.

Appendix B. The stones

# Stone Turned Where
1 every page in site/, including API-backed ones and 404 yes, 15 pages section 2, before/
2 every state of every live element: loading, empty, failed fetch, stale yes: failed and stale captured for 10 pages; loading and empty read from each page's JS section 5, before-states/
3 every link followed, internal and external yes: 914 attributes, 210 unique, 268 anchors, every external with curl section 4
4 every number traced to its source and checked against the live API or the bench log today yes, appendix A appendix A
5 both themes yes, dark and light for every page before/
6 1440 and 390 yes before/
7 keyboard focus yes, Tab 2, 3, 8, both themes, both widths section 7, before-states/*focus*
8 contrast yes, every token pair, both themes section 6
9 the litepaper's every section and footnote yes, appendix A (L rows) appendix A
10 the downloads' hashes against the host yes, four files fetched and hashed section 4
11 the Open Graph and favicon set yes, every meta and icon, sizes measured with sips section 4, L6 and L7
12 the 404 page yes, live body byte-identical, /404 answers 200 section 4, L8
13 print of the litepaper yes, both themes, A4 section 9
14 the live API itself against the page yes, item 0 (height, paid shards, lock index, lag) commit 84a6de2