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>
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 |
/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.
4. Links, downloads, icons, 404
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 |