# 100 ways to make Motif deeper _The 500-item programme shipped and the six audit batches after it (rows 502–524) fixed what the finished site said about itself. This is the next idea bank, and it is built differently: every item below starts from something **measured on the current site** — a count a harness printed, a page that links nowhere, a check that does not exist — rather than from a feature wish. Where an item is a fix for a known gap, the evidence is in the line._ **How to read the tags.** Nothing here is labelled done, and nothing blocked is invented. | tag | meaning | | --- | --- | | `now` | Buildable in this repository with no server, no browser and no third party. The harness can verify it, so it can be shipped in a batch. | | `env` | Needs a real browser, a second measurement machine, a live domain or a third-party round-trip. This sandbox cannot verify it; it stays labelled, never simulated. | | `infra` | Needs a backend, a payment processor or another person. Follows the roadmap's `today / slice / cost / refuse` pattern — the slice is what gets built. | Ground truth at the time of writing: **141 routes · 133 components · 33 backgrounds · 74 prompts · 60 Learn essays · 13 changelog entries · 5 collections · 9 public endpoints**; gates at **check:exports 171 · check:demos 108 · check:a11y 291 documents · check:a11y:served 384 pages**; ledger at **500 shipped + 24 audit rows**. The 81–90 batch below shipped after this header was written: `/integrations/api` is the 158th route, the collection and schema are the tenth and eleventh served exports, and the harness gates grew with them (check:exports 257 at the time the batch closed). --- ## 1. Motion: the 63 scenes that move without a branch (1–10) Batch 91 measured this and published the number: of **102 scenes that animate, 39 name `prefers-reduced-motion` and 63 do not** (set-01 16 · set-04 11 · set-06 10 · set-05 9 · set-02 8 · set-03 8 · set-07 1). This section is the work that number implies. 1. **Branch set-01's 16 scenes** (`PrismSwitch`, `PulseLoader`, `AuroraVeil`, `HaloTrail`, `OrbitDeck`, `StarMotes`, `ScrambleText`, `MarqueeLogos`, `BgGrid`, `BgSorbet`, `BgInk`, `MorphBlob`, and the four others the audit lists) — the largest single block of the gap. `now` 2. **Branch set-04's 11 and set-06's 10.** Between them they are a third of the remaining gap, and they are the two modules with the most continuous loops. `now` 3. **Branch set-05's 9, set-02's 8, set-03's 8 and set-07's 1.** `now` 4. **A shared `useSceneMotion()` in `scene-kit.tsx`** returning `{ enabled, duration, repeat }`, so a scene stops re-deriving the preference and every branch looks the same in review. `now` 5. **Raise the `check:demos` floor with each module**, 39 → 55 → 80 → 102, in the same commit as the scenes — the ratchet from batch 91 already supports it and the floor is a one-line change. `now` 6. **A per-module table on `/quality/aria`** (module · scenes · animate · guarded · first unguarded name), generated from `motionAudit().unguarded`, so the gap is readable instead of rounded into "63". `now` 7. **Say why a scene counts as animating.** `motionAudit` matches eleven signals; returning the matched one lets the page print "counted: `repeat: Infinity`" and turns the rule from a black box into a decision a reader can argue with. `now` 8. **A motion contract in the repo** (`docs/motion-contract.md`): a scene that loops declares a branch, reduced motion never removes content that only animation revealed, and the branch is named in the scene's own body — linked from the scene template and from `/quality/aria`. `now` 9. **Honour the preference in the embed shell.** `/embed/` is designed to sit inside someone else's page; the shell should pass `prefers-reduced-motion` through and say in the embed docs that it does. `now` 10. **A still poster for animated OG cards.** `/og/` draws an SVG per asset; animated scenes get a poster variant at t=0 so a share card never implies motion the image cannot show. `now` ## 2. Accessibility past the static pass (11–20) The markup pass is green over 291 documents and 384 served pages. Everything below is what it structurally cannot see, given a home instead of a shrug. 11. **Focus-ring contrast against real surfaces.** Token contrast is computed on `/quality`; the rings sit on gradients and glass panels. Compute ring-vs-surface for each surface a ring is drawn on and publish the pairs that fail. `now` 12. **A `forced-colors` pass.** Windows high contrast replaces the palette; add `@media (forced-colors: active)` rules for the ring and demo chrome, and a check that the block exists and uses system colours. `now` 13. **Target-size heuristic, labelled as one.** Flag interactive controls in scenes that carry no min-height/min-width utility, list them on `/quality/aria` as *candidates for the hand check*, and say in the same line that a class name is not a measurement. `now` 14. **Behaviour declarations get code evidence.** A catalog record declaring `keyboard` should have a key handler in the scene; declaring `drag` should have pointer handlers. Gate it in `check:demos` — it would have caught the batch-91 overclaim before it shipped. `now` 15. **Accessible-name fixtures** for the 30 most interactive scenes: store the expected name, compare against the built markup, fail on drift. `now` 16. **DOM order vs visual order.** Flag `order-*` and `flex-row-reverse` in scene source and require a comment explaining the reading order. `now` 17. **An accessibility statement at `/accessibility`** (404 today): what conforms, what does not, what has never been run in a browser, and how to report a problem — distinct from `/quality/aria`, which is the engineer's record. All ten new pages in this list should be added to `SITEMAP_EXTRA_PATHS` in the same commit. `now` 18. **Publish the announced sentences.** For the toast and live-region scenes, print the exact strings that get announced next to the hand-check item, so a reviewer knows what they are listening for. `now` 19. **A fixed-height inventory for the zoom check.** The preview frames use fixed pixel heights; list every fixed-height container with its value so the 200% check has a starting list rather than a blank page. `now` 20. **An RTL dry run for two scenes.** Render two mirrored variants, publish what broke, and state that the rest of the catalog is untested in RTL. `now` ## 3. Performance you can verify in this repository (21–30) 21. **Own-CSS budgets per route**, mirroring `budgets.ts`. Own-JS has a ratchet; the 217.7 KB of CSS on every measured route does not. `now` 22. **A determinism gate:** build twice from a clean `.next`, diff `docs/build-report.json`, fail if a number moves. It is the cheapest way to know the measurement is a measurement. `now` 23. **Chunk attribution on `/perf/chunks`.** For each route's largest own chunk, name the modules inside it from the Turbopack manifest — the table that made the batch-85 split obvious, kept as a standing view. `now` 24. **Prefetch budget.** Count `` in each built document, publish the distribution, cap it. `now` 25. **A timer registry.** Every `setInterval`/`rAF` loop in the scene modules with its interval and its cleanup, extracted at build time; a loop with no cleanup or a sub-100 ms interval is visible before a browser has to prove it. `now` 26. **Font glyph coverage.** Print which glyphs the two Inter/Sora subsets actually contain (em dash, arrows, the `→` used in the panels) so a missing glyph is caught by the build rather than by a screenshot. `now` 27. **An OG route weight cap.** `/og/` renders SVG per asset; measure each and cap the heaviest, since a share card is fetched by crawlers with no cache warm. `now` 28. **Per-rule curl blocks on `/perf/caching`.** The page documents seven rules and the harness proves the served headers; adding a copy-paste block per rule turns the page into the reproduction steps for its own claims. `now` 29. **A written service-worker decision.** `/perf/service-worker` exists; measure what an HTML-only offline shell would cost and write down why it still stays off — a decision record, not a feature. `now` 30. **A shared-JS ratchet.** Fail when the shell baseline (446.7 KB today) grows past a byte budget recorded in `docs/build-report.json`. `now` ## 4. Gates: every claim gets a check (31–40) Batch 91 turned four sentences into three gates. These ten make that the default rather than a rescue. 31. **Fix `/metrics`'s "the harness will usually find it first."** It is a promise with no referent. Replace it with the list of numbers the harness actually compares across pages, and gate the sentence so it cannot drift again. `now` 32. **Fix `keyframes.tsx`'s header.** It still says the layout "imports the 7,416-line demo module" and names `Demo.tsx` as that file; the scenes are ten modules now. The comment is the first thing a contributor reads. `now` 33. **Generalise batch 92's line-count gate.** Scan source comments for `N lines` / `N KB` claims about a named file and compare with the file. The `keyframes.tsx (41 lines)` bug was one of a class. `now` 34. **A claim map.** Every "the harness checks…", "the build verifies…", "gated by…" sentence in `src/` must appear in a machine-readable map naming the check that backs it; `check:exports` fails on an unmapped claim. That is the durable version of the batch-91 audit. `now` 35. **`/quality/gates`, a public index of the checks.** Every name from the two harnesses plus the a11y rules, the failure it prevents, and the batch that added it — generated from the scripts, not typed. `now` 36. **One a11y command.** Merge `check:a11y` and `check:a11y:served` and fail when the two document counts disagree; the disk pass and the served pass once disagreed by two documents and only a person noticed. `now` 37. **Golden OG fixtures.** Fixed slug + fixed inputs → expected SVG hash, so a refactor cannot quietly restyle 382 cards. `now` 38. **A ledger link check.** Every route in `enrichment-500.md` and this file must answer 200 — 524 rows of links currently have no gate. `now` 39. **Record suite wall times** in the build report and flag a >2× regression; `check:exports` now takes ~20s and nothing would notice it becoming two minutes. `now` 40. **Failure fixtures.** A directory of intentionally broken inputs with a `check:fixtures` suite proving each rule fires — the 39-vs-40 test run in batch 92, kept as a permanent convention. `now` ## 5. Learn: ten essays, each from this project's own record (41–50) The 60 shipped essays teach motion and craft. These ten teach the thing this repository now has more evidence for than any other: how a build tells the truth about itself. 41. **"Anatomy of a false claim"** — the batch-91 audit, from the sentence on `/quality/aria` to the 63 scenes behind it. `now` 42. **"What a build cannot see"** — static rules vs runtime, with the 39/102 numbers and the six hand checks. `now` 43. **"The rule that had to be first"** — how a comment claiming "a later rule wins" shipped zero immutable chunk files, and how one curl found it. `now` 44. **"Recorded numbers need labels"** — before/after panels, three different "after" figures for one change, and why the labels are the fix. `now` 45. **"Auditing the crawl surface"** — 103 unlisted pages, five surfaces that said noindex and were not, and the two rules that ended it. `now` 46. **"Five passes over a finished site"** — the method: point the audit at the site's claims about itself, not only at its pages. `now` 47. **A beginner path: six essays, six components, one order.** `/start` is 404 today; a five-step path per goal (ship a landing page · add motion · write prompts) with progress in localStorage. `now` 48. **Inline demos in every essay.** The snippets become real scenes through the existing loader map, so an essay cannot document code that does not ship. `now` 49. **Glossary cross-links, gated.** Every term an essay uses resolves to `/glossary`; a term with no entry is a gate failure. `now` 50. **Feeds for the two text surfaces that lack one.** `/community/feed.xml` and `rss.xml` exist; `/learn/feed.xml` and `/changelog/feed.xml` are 404. `now` ## 6. Components: the next ten that are not in the catalog (51–60) Checked against the 133 slugs: none of these exists, and each one has a reason to exist beyond "another card". 51. **Diff viewer** — side-by-side and unified, keyboard-scrollable, copyable, no inline editing claim. `now` 52. **Time zone picker** — offsets, DST labels, a "now" column; no network call, so the offsets ship as data with the date they were taken. `now` 53. **Tree view** — roving tabindex, expand/collapse, selection, 200+ nodes without virtualisation, and it says so. `now` 54. **Colour picker** — HEX/OKLCH, with a contrast readout computed by the same `quality-utils` the audit page uses. `now` 55. **Cron editor** — five fields, a plain-English sentence, next five runs, and no scheduler behind it. `now` 56. **Signature pad** — pointer events, keyboard fallback, ink that respects reduced motion, clear/undo. `now` 57. **Chat composer** — draft in localStorage, attachments as markup, no send button that pretends to send. `now` 58. **Onboarding checklist** — steps with local progress, reset, and an export of the checked list. `now` 59. **Data table** — sort, select, filter, sticky header, with the honest line about where virtualisation would start. `now` 60. **Release rail** — a vertical timeline that reads the changelog data, so a component page, a roadmap and a changelog share one visual language. `now` ## 7. Discovery and structure (61–70) 61. **Link `/digest/copy-of-the-week`.** It has a canonical and is linked from nowhere — `/` and `/digest` both return zero references today. One line, and it takes the page out of the orphan set. `now` 62. **`/browse` — an index by behaviour.** The catalog already carries `click · hover · drag · scroll · keyboard · type · motion · hold · pointer`; a page per behaviour is the discovery axis the hub filter cannot express. `now` 63. **A human sitemap at `/sitemap`** (404 today), generated from the same source as `sitemap.xml`, grouped by family with counts. `now` 64. **The rest of the library filters in the URL.** `?q=` and `?stack=` are already shareable; score, behaviour, kind and size are not. `now` 65. **A related-content graph.** Components ↔ essays ↔ prompts, derived from tags and behaviours, rendered on all three page families instead of hand-written "see also" lines. `now` 66. **Publish the search ranking rules.** The client scores, fuzzy-matches and scopes results, and the page explains none of it; a short "how this ranks" block plus the shortcuts makes the behaviour predictable. `now` 67. **An empty state that suggests.** Search already says "did you mean"; a zero-result page should also offer three catalog rows and one essay before it offers a search box again. `now` 68. **Five more editorial collections.** `under-5kb`, `zero-dep-motion` and `a11y-98` show the pattern; "no-JS friendly", "keyboard-first", "best for pricing pages", "three-file starters" and "quiet motion" continue it. `now` 69. **Per-tag changelog archives.** `/changelog` has tags and hues and no filter; `?tag=` with counts gives every tag a URL. `now` 70. **Goal-first starts.** `/start` with three goals, each five links deep, ending on a component the reader can copy — measured by nothing, claimed as nothing more than a path. `now` ## 8. Community and retention, all localStorage-honest (71–80) Every item here runs on the storage keys the site already owns (`motif:copy-log`, `motif:streak-optin`, `motif:shipped`) and says so on the panel. 71. **A local build log** — what a visitor copied, saved and shipped, in order, exportable as Markdown. The copy log exists; the view of it across sessions does not. `now` 72. **A seven-day activity grid** on `/habits`, from the streak module, resettable, never sent. `now` 73. **Reading progress on essays** with a "continue" row on `/learn`. The catalog even ships a reading-progress component the site itself does not use. `now` 74. **Export the saved stack** at `/saved/stack` as Markdown and JSON with exact slugs and versions. `now` 75. **A per-scene remix counter**, local only, labelled as local, with the honest line that a real count needs a server. `now` 76. **A challenge archive** — past `/community/challenges` with dates, rules and outcomes, static and complete. `now` 77. **A spotlight archive** at `/community/spotlight` with one entry per edition instead of the current view. `now` 78. **Local rosters for the demo team features**, labelled "this roster lives in your browser" — the honest version of a feature that needs accounts. `now` 79. **A digest archive index** on `/digest`, one row per issue with the date, so the weekly promise has a table behind it. `now` 80. **"Why there are no comments"** — a short page stating what a comment system would need and what it would cost, instead of a comment box that cannot receive comments. `now` ## 9. Integrations and exports (81–90) 81. **JSON Schema for `/api/v1/components/`**, published under `/api/exports` and validated against a real response in the harness. `now` 82. **An importable API collection** (Bruno or Postman JSON) of the nine public endpoints, generated from the same list the docs use. `now` 83. **A badge workflow download.** The badge exists as SVG; ship the GitHub Actions YAML that embeds it, as a file, with no service claim. `now` 84. **A VS Code pack build test.** The snippets are generated; add a validator for the `.vsix` manifest, keeping publishing as the environment-blocked half. `now` 85. **A Figma round-trip validator.** Import `figma-variables.json`, re-derive the tokens, and fail on mismatch — the export's honesty test. `now` 86. **A Storybook decorator fixture test**, so the shipped decorator is exercised by the harness rather than described. `now` 87. **`motif add `** in the CLI: fetch one component's files from the catalog and write them into a project, with the same no-npm claim the CLI already makes. `now` 88. **A documented embed theming API.** The embed uses CSS custom properties; give it three documented themes and a page that shows the same scene in all three. `now` 89. **OG query params** (`?title=`, `?eyebrow=`) with the same cache rule the route already has, so a team can flavour a card without editing the site. `now` 90. **Per-component print styles.** `/integrations/print` serves the stylesheet; a one-scene-per-page print view of a component makes the export usable on paper. `now` ## 10. Trust, brand, and the north stars that need a server (91–100) The roadmap already carries the honest `today / slice / cost / refuse` record for the blocked bets. These ten are the parts of that list this repository can actually finish, plus the pages that make the blocked parts legible. 91. **`/gaps` — the blocked buckets, published.** Two lists (infrastructure-blocked, environment-blocked) with what each needs and why nothing here fakes it. It is the same rule the roadmap states, gathered in one page a reader can check. `now` 92. **A state-of-the-build page** generated from the ledger and the build report: routes, gates, commits, rows. `now` 93. **A storage-key register, scanned.** Every `motif:*` key the app writes, generated from source, with what it holds and how to clear it. `now` 94. **A security page with a real check behind it**: no backend, no cookies, no third-party requests — gated by a source scan for fetch targets and cookie writes. `now` 95. **Publish `docs/` as `/book`.** The ledger, the plans and this list, as chapters with a feed. It is the open book the north-star list promised, at the size this repository actually is. `now` 96. **A wallpaper generator** from the token palette, emitting SVG downloads — the brand shelf without shipping raster art. `now` 97. **A dated press kit.** The numbers with the build's date and commit printed beside them, so a journalist quotes a number that carries its own timestamp. `now` 98. **Auto-derive each roadmap bet's live slice** from the repository (does the slice's route exist? does its test pass?) so the status column cannot be hand-maintained. `now` 99. **A "what we got wrong" page**, sourced from the audit rows: each wrong claim, what it said, what it says now. Twenty-four entries already exist in the ledger. `now` 100. **A register for this list itself** — shipped / carried / dropped per item, in the same style as `enrichment-500.md`, so the next hundred starts from evidence instead of memory. `now` --- ## Register — what has shipped from this list _The rule this list was written under ("清单与交付必须一致"): a suggestion is only marked shipped when the commit that did the work is named, and the check that keeps it true is named with it. Everything else stays open, including the items that turned out to be a different problem than the one they were written for._ | items | what shipped | commit | kept true by | | --- | --- | --- | --- | | 1–3, 5, 7 | The measured version of the motion gap: 88 scenes are covered by the site-wide CSS policy and **32 that drive motion from JavaScript** now branch — all 32 of them, re-derived rather than written from an effect. The old count (63 without a branch) measured the wrong thing | `f91c610` | `check:demos`: the split, the 32-of-32, the stylesheet policy, and the served page printing both numbers | | 4 | `useReducedMotion()` / `useSceneMotion()` in `scene-kit.tsx` — one hook, not sixteen copies | `f91c610` | the 32 call sites | | 31 | `/metrics` names the four numbers the harness actually compares instead of promising it "will usually find" a disagreement | `9fd1ec3` | claim map entry | | 32 | `keyframes.tsx`'s header describes the ten-module reality it has had since batch 85 | `9fd1ec3` | claim map entry | | 33 | A file's line count may not be printed as a literal — the gate that would have caught the stale `41 lines` by itself | `9fd1ec3` | `check:exports`: verified failing with the literal restored | | 34 | The claim map: a file that says the harness does something must name the check that does it | `9fd1ec3` | `check:exports`: stale claim, fictional check, unmapped file. Verified failing with a planted claim | | 38 | Every route the 526-row ledger cites answers 200 (336 distinct routes, 324 fetched) | `9fd1ec3` | `check:exports`: "every route the ledger registers still answers" | | 39 | `npm run check:all` — four suites, one run, wall times written to `docs/check-report.json` with a 2× regression flag | `9fd1ec3` | the report itself | | 50 | `/learn/feed.xml` (60 guides) and `/changelog/feed.xml` (13 entries, permalinks included) | `9fd1ec3` | `check:exports`: both counts derived from the pages they mirror | | 61 | `/digest/copy-of-the-week` was linked from zero pages; `/digest` links it now | `9fd1ec3` | `check:exports` | | 63 | `/sitemap` — the crawler sitemap for a person, importing `sitemap()` rather than re-listing it | `9fd1ec3` | `check:exports`: page count equals `` count | | 17 | `/accessibility` — the statement, distinct from the engineering record: what is verified on every build, what a build cannot see (all 7 manual checks named), and how to report a problem | `efdb100` | `check:exports`: every checklist title printed, "none has been run in a browser" present, footer link exists | | 91 | `/gaps` — the two registers in one page: **6 infrastructure-blocked bets** (derived from `BETS`, so a bet going live leaves this page in the same commit) and **8 environment-blocked numbers**, each naming what exists instead | `efdb100` | `check:exports`: every non-live bet present, no live bet named, the environment rows, footer link | | 35 | `/quality/gates` — the index of the checks, generated from the scripts rather than typed: 211 named checks parsed out of their `ok(…)` calls with the condition each asserts, the commit that last wrote each line (a `git blame` index, refreshed by `npm run gates:index` and gated for freshness), the 12 markup rules with the failure each prevents, and the 7 checks no command runs | `0730278` | `check:exports`: every name printed, the derived counts, the run-time-composed names admitted, the manual checks named, the index fresh | | 6 | `/quality/aria` prints the motion split per module — module · scenes · animate · guarded · first unguarded, generated from the same audit the gate reads rather than typed | `201bf62` | `check:demos`: the heading, the column shape, every module name, and the summary counts | | 8 | `docs/motion-contract.md` — the three rules a scene promises (a loop declares a branch; reduced motion never removes content only animation revealed; the branch is named in the scene's own body), linked from `/quality/aria` and the `scene-kit.tsx` template | `201bf62` | `check:exports`: the file and its three sentences; `check:demos`: the page links it and quotes the rules | | 9 | `/embed/` honours `prefers-reduced-motion` — an `EmbedShell` reads the media query and reflects it on the frame, and `/integrations/embed` says so | `201bf62` | `check:demos`: the served marker, the media-query read in the shell's source, and the docs sentence | | 10 | Animated demos get a still label on their share card — `/og/` appends "demo animates · this card is a still" for any component or background whose live scene moves; no scene rasteriser exists, so every card is a still by construction and the animated ones say so | `201bf62` | `check:exports`: the route reads `movingDemoKeys` and prints the chip, every moving demo key is a catalog demo, and a moving and a still asset both serve PNG cards | | 11–16, 18–20 | Accessibility past the static pass, each item given a machine half instead of a shrug: the focus ring's contrast against the three flat surfaces it sits on (page background 4.05:1, panel 3.90:1, raised surface 3.78:1 — all clear the 3:1 non-text line); a `@media (forced-colors: active)` block in `globals.css` that hands the ring and primary chrome to `Highlight`/`CanvasText`, verified in the built CSS; 22 target-size candidates listed on `/quality/aria` *as candidates* with the line "a class name is not a measurement"; behaviour declarations gated against code evidence (39 keyboard, 13 drag — all with evidence; the orbit-deck scene gained the drag-tilt its record claimed); 30 accessible-name fixtures compared against the built embed markup; a DOM-vs-visual-order scan (0 reordering utilities found); the exact sentences the toast and live-region scenes announce; a fixed-height inventory for the 200% zoom check; and a static RTL dry run on `split-button-menu` and `parallax-layered-scene` naming the 160 untested scenes | `e5e862d` | `check:demos`: the ring ratios and page print, the built forced-colors block, the keyboard/drag evidence, the 30 fixtures against the build, the reorder rule, the announced sentences, the fixed-height inventory, and the RTL dry run with its untested remainder | | 21 | Own-CSS budgets mirroring the JS ratchet — the build emits one shared stylesheet (219.1 KB) that every route loads, so every route's own CSS is zero, and the sheet itself is capped at 290 KB; `applyCssBudgets` in `budgets.ts` is rendered by `/quality/speed` and enforced by the export harness | `2898519` | `check:exports`: "every route is within its CSS budget" and "/quality/speed publishes the CSS budget it is held to" | | 22 | A determinism gate — `npm run check:determinism` builds twice from a clean prerender, measures both into temp files, strips `measuredAt`/`buildId`, and diffs the rest (2,657 compared lines, passing); kept opt-in because two clean builds cannot run inside `check:all` | `2898519` | `check:exports`: "the determinism gate is wired as an opt-in command" | | 23 | Chunk attribution on `/perf/chunks` — the client-reference manifests are inverted so each route's largest own chunk lists the project modules inside it, read from the build rather than a guess | `2898519` | `check:exports`: "/perf/chunks names the modules inside each route's largest chunk" | | 24 | A prefetch budget — the built documents emit 0 `` (Next prefetches on intent, in script, not as static link tags); the distribution is published on `/perf/prefetch` and the zero is the budget | `2898519` | `check:exports`: "no built document emits a static prefetch link" and "/perf/prefetch publishes the prefetch distribution" | | 25 | A timer registry — every setInterval/setTimeout/requestAnimationFrame in the scene modules with its scene, interval and cleanup, extracted at build time (53 loops, 11 intervals all cleared, 2 sub-100 ms intervals flagged); `/perf/timers` prints the named table | `2898519` | `check:demos`: "/perf/timers publishes the named timer registry" | | 26 | Font glyph coverage — the woff2 cmap is decoded at build time by a dependency-free decoder in `scripts/woff2-cmap.mjs`; Inter has 230 glyphs and Sora 223, and neither contains → (U+2192) or ← (U+2190), so those arrows fall back to the system font (Inter carries ↑/↓, Sora none) | `2898519` | `check:exports`: "the glyph report matches the woff2 cmap on disk" and "/perf/fonts prints the missing-arrow finding" | | 27 | An OG route weight cap — 312 share cards measured (64.1–99.8 KB, mean 82.9 KB, 25.9 MB total), the heaviest under a recorded 120 KB budget that the harness enforces | `2898519` | `check:exports`: "every share card stays under the recorded weight cap" and "/perf/build publishes the share-card cap" | | 28 | Per-rule curl blocks on `/perf/caching` — a copy-paste `curl -sI` line per cache rule, from the same `ruleSampleUrl` the page renders, so the table is the reproduction steps for its own claims | `2898519` | `check:exports`: "every cache rule has a copy-paste curl block" | | 29 | A written service-worker decision — the offline shell (shared assets plus the lightest prerendered page) is measured and `/perf/service-worker` records the decision: no worker until the API's revalidation story ships, because a cache you cannot invalidate is a stale catalog | `2898519` | `check:exports`: "/perf/service-worker writes the decision down with a measured cost" | | 49 | Glossary cross-links, gated: a shared term list (`src/lib/glossary.ts`) drives essay footers that link every defined term a guide uses, and the gate asserts the list never drifts from the served definitions | bank-3 batch 5 (`92c12f2`) | `check:exports`: "every essay that uses a defined term links the glossary" + the drift check | | 51 | Diff viewer as a catalog component (`diff-view`, two-column before/after with changed-line highlight) | bank-3 batch 7 (`bf324d8`) | `check:demos`: every catalog entry names a demo that exists | | 58 | The onboarding-checklist pattern shipped as a prompt brief (`onboarding-checklist-five`) with progress, skip logic and support line; the component version remains open | bank-3 batch 2 (`3f84f3d`) | prompt catalog + craft-floor linter | | 59 | The data-table family: sortable table with aria-sort, sticky first column, total row, row expansion, column visibility, empty-table state — six components covering the pattern's surface | bank-3 batch 7 (`bf324d8`) | the catalog gates | | 64 | Library filters URL-synced: `?q=`/`?stack=` were joined by behavior chips and compare shelf; kind and size remain open | bank-3 batch 14 (`399996c`) | `check:exports`: the URL-state assertions | | 65 | The related-content graph: similar-by-tags on detail pages, practise links on essays, spine rails — all scored from shared tags, not hand-picked | bank-3 batches 5/14 (`92c12f2`/`399996c`) | `check:exports`: the practise-link and glossary gates | | 66 | The ranking rules published on the search page — five numbered rules plus the shortcuts | this batch | served-page assertion | | 67 | The zero-result page suggests: nearest tags, the five most-copied components and a clear exit | bank-3 batch 14 (`399996c`) | `check:exports`: the zero-result recovery assertions | | 68 | Four of the five suggested editorial shelves shipped (marketing-page-in-a-box, calm-interfaces, dark-mode-first, start-here); "no-JS friendly" remains open | bank-3 batch 13 (`6930463`) | `check:demos`: the collection-resolve gates | | 69 | Per-tag changelog archives: `/changelog?tag=` with counts, every tag a URL | this batch | served-page assertion | | 71 | The build log view with CSV and Markdown export on /studio | this batch + bank-3 batch 15 (`a93730d`) | served-page assertion | | 74 | The saved stack exports as JSON, Markdown and an HTML starter at /saved/stack | bank-3 batch 15 + this batch | served-page assertion | | 79 | The digest archive index: month picker over the twelve months the changelog covers (`/digest?m=YYYY-MM`) | bank-3 batch 20 (`74759ea`) | served-page assertion | | 80 | "Why there are no comments" — the plan panel on /community, labelled infra | bank-3 batch 20 (`74759ea`) | served-page assertion | | 93 | The storage-key register, scanned from source: every key namespaced `motif:`, mutable keys versioned; two keys were re-versioned by the gate | this batch | `check:demos`: the storage-key register gate | | 94 | The security page's real check: a source scan for external fetch targets and cookie writes — zero is the claim | this batch | `check:exports`: the delivery-surface gate | | 100 | This register — shipped rows name their commit and their keeping-check; the open list below shrank accordingly | this batch | the register itself | | 83 | The badge workflow YAML, shipped as `docs/badge-workflow.yml` — no service claim, the SVG fetch is the whole job | this batch | the file exists; its curl target is env-gated | | 47/70 | `/start` — three goal-first paths, five links each, browser-local progress under a versioned key | this batch | served page + the storage-key gate | | 99 | `/quality/wrong` — the "what we got wrong" page, parsed at build time from the ledger's own 502–530 repair rows (`wrongRows()` in build-state.ts reads docs/enrichment-500.md, so the page cannot drift from the ledger it cites); the count it prints is the count of parsed rows, and an empty parse renders an honest "did not parse" panel rather than an empty shelf | this batch | the sitemap/broken-link/canonical gates cover the route end to end; the page's own source states the parse rule | | — | `orbit-stickers` — a new animated catalog component beyond this list: real photographs (Lorem Picsum's seeded service, URL-stable and free) stamped as white-bordered stickers on their own orbit rings, pure-CSS `mf-spin` motion so the site-wide reduced-motion rule covers it with no per-scene branch, hover/focus scale as a transition (not a rAF loop — the motion audit classifies it CSS-only), the scene chrome naming the photo source, and the photos rendered as plain `` because next/image would proxy-and-reencode third-party bytes the demo does not own | this batch | `check:demos`: the 321-key registry gate holds key↔loader↔export↔catalog; `check:a11y` + `check:a11y:served` hold the 509-document pass clean (the anchor div is deliberately not aria-hidden — hiding it would hide focusable buttons from the tree, the exact `hidden-focusable` rule the fixtures suite tests) | | 41–46 | The six-essay postmortem series "How a build tells the truth" in src/lib/learn.ts: anatomy of a false claim, what a build cannot see, the cache rule that had to be first, recorded numbers need labels, auditing the crawl surface, and the five-passes method — each with takeaways, series navigation and the revision line | this batch | `check:demos`: essay count and series gates; the essays cite the site's own gates | | 40 | Failure fixtures: 14 intentionally broken documents in tests/fixtures, one per scanner rule, and `npm run check:fixtures` proving each rule fires on exactly its input — the suite immediately caught that the duplicate-id rule could never fire (a Set deduplicated the evidence before the check), and the rule was fixed with the real build re-scanned clean | this batch | `check:fixtures`, now part of check:all | | 30 | A shared-JS ratchet — the shell baseline (446.8 KB) is recorded with a 470 KB byte budget in the build report, and the harness fails a build that grows the shell past it | `2898519` | `check:exports`: "the shared shell stays under its recorded budget" and "/perf/build publishes the shared-shell budget" | | 52–57, 60 | The six utility components close section 6, shipped as scene set 14 (`src/components/demos/scenes/set-14.tsx`): timezone picker (52, offsets + DST as recorded data, no network call), colour picker (54, OKLCH readout + contrast from the audit page's own `lib/colour`), cron editor (55, five fields + plain-English sentence + next five runs, nothing scheduled), signature pad (56, pointer ink + keyboard Add/Undo/Clear buttons), chat composer (57, draft persisted locally, no pretend send), tree view (53, roving tabindex + per-node expand/collapse + selection over 223 generated nodes mounted with no virtualisation — the copy prints the count) and the release rail (60, a vertical timeline reading the site's own `CHANGELOG`) | this batch | `check:demos`: every catalog entry names a demo that exists (320 keys, 320 loaders); for #53 the tree-view gate holds "6 branches × 36 leaves, counted recursively" with the "no virtualisation" claim in its own copy | | 72–78 | The community and retention shelf, all localStorage-honest: a seven-day activity grid on /habits read from the same copy log the streak reads (72, resettable, never sent); reading progress persisted to `motif:read-progress:v1` with a continue row on /learn (73); a per-scene remix counter on every component page, local only with the honest line that a real count needs a server (75); a challenge archive of four past challenges with dates, rules and winner-by-rule outcomes (76); a spotlight archive indexed one line per edition above the full interviews (77); and a local roster you assemble from the sample makers, labelled "lives in this browser" (78) | this batch | `check:demos`: the storage-key gate scans every new writer and holds the keys namespaced + versioned; `check:exports`: the served pages carry the new panels (habit week grid, continue row, archive indexes) | | 81–90 | Section 9's exports and integrations, every one gated against the served build: the component response schema published as `/api/exports/component.schema.json` and validated by a real fetched response (81); the nine-endpoint API collection as Postman v2.1/Bruno JSON generated from the one `API_ENDPOINTS` list, documented on a new `/integrations/api` page that renders the same list so docs and tooling cannot drift (82); the VS Code pack validated to snippet shape plus a synthesised .vsix manifest, publishing left env-blocked and unclaimed (84); the Figma round-trip — RGBA re-derived to hex and radii re-attached to their px, compared against the stylesheet tokens both ways (85); the Storybook decorator exercised headless, wrapping a story in a token-carrying div (86); `motif add ` in the CLI writing `component.json` + `tokens.css` locally, printing "Metadata only… this CLI installs no component code" in its own output and documented on the CLI page with the same limit (87); the embed theming API as three documented themes (`dark`/`paper`/`ink`) read from `?theme=`, with all three shown on the same scene at /integrations/embed (88); `/og/custom?title=&eyebrow=` rendering the default card with a team's own words only — chips stay the site's numbers, recorded cards byte-identical under query-hijack attempts, and the generator marked `X-Robots-Tag: noindex` because a flavoured card is not content (89); and per-component print views — `data-print="scene"` on the Stage with a `break-after: page` rule in the print stylesheet, documented on /integrations/print (90) | this batch | `check:exports`: the schema validator (with its integer branch), the collection-vs-page endpoint list, the manifest synthesis, both Figma round-trips, the headless decorator fixture, the CLI add honesty lines (script and page), the custom-card headers and the static-card hijack proof | **Open, and worth saying so:** items 36–37, 42's siblings are closed by the series above; still open are 48, 62, 68's last shelf, 92, 95–98 and everything not in the table above. Those are the ones that still need a browser, a second person, or an afternoon of work each — none of them shipped in passing. --- ## What this list deliberately excludes - **Accounts, prompt re-runs, marketplace payouts, certificates, the desktop helper, SSO/SLA/DPA, a real admin backend** — all `infra`; the roadmap's slices for them already exist and this list does not pretend otherwise. `infra` - **Lighthouse scores, field vitals, a second measurement series, visitor/signup/revenue numbers, the CodeSandbox deep link, a real domain** — all `env`; each is named on the page that would show it and each stays unmeasured rather than estimated. _100 items. Nothing above is claimed as shipped; the tag says what it costs, and the first sentence says what it starts from._ **Counted, not estimated:** 94 `now` · 3 `infra` (the north-star slices) · 2 `env` (second measurement series · a real domain) · 1 unlabelled summary line. The 94 do not need a browser, a server or a third party; each one can be built, gated and pushed from a checkout like this one.