Quality · every gate, in the open
Every check, and what it stands for
266 named checks across the two suites that assert against the site, plus 14 markup rules and 7 checks a person has to run. Every name and every condition on this page is read out of the source at request time — the list is the code, not a description of it — and each one carries the commit that last wrote it, so a check has an author and a date rather than a reputation.
Named checks
266
2 scripts · read from their ok(…) calls
Checks printed
0
loops run a named check more than once; the last recorded run's count
Markup rules
14
run twice: over the built HTML and over 4 served routes
Batches behind them
14
266 of 266 lines carry a blame commit
How this page is kept true
- Names and conditions are parsed out of the ok(…) calls in the scripts on every request. Rename a check, ship it, and this page shows the new name — there is no second copy to forget.
- The commit column is a git blame of the line the check is written on, regenerated by npm run gates:index. The gate index is a checked-in file, and the export gate re-derives it and fails when it is stale, so the column cannot quietly point at the wrong batch.
- The counts in the cards and in each heading are the last recorded run in docs/check-report.json (2026-09-12) — wall times and pass counts together, so a suite that doubles is visible.
check:exports — pages, endpoints and data against the copy that documents them
200 calls · 36.5s
served … parses as JavaScriptruns per item
0ae1991 · 2026-09-12asserts: true
Initial commit
ledger table matches its own headline
0ae1991 · 2026-09-12asserts: rows === headline + extras && rows > 0
Initial commit
ledger rows are numbered 1..N without gaps
0ae1991 · 2026-09-12asserts: nums.length > 0 && nums.every((n, i) => n === i + 1)
Initial commit
sections 1–16 are marked complete
0ae1991 · 2026-09-12asserts: secHeads.length === 16 && secHeads.every((m) => /complete|✅/.test(m[2]))
Initial commit
sitemap.xml is served
0ae1991 · 2026-09-12asserts: sm.status === 200 && sm.text.includes("<urlset")
Initial commit
sitemap carries essays and prompts
0ae1991 · 2026-09-12asserts: sm.text.includes("/learn/") && sm.text.includes("/prompts/")
Initial commit
robots.txt disallows the thin surfaces
0ae1991 · 2026-09-12asserts: rb.status === 200 && rb.text.includes("Disallow: /search") && rb.text.includes("Disallow: /admin")
Initial commit
robots.txt points at the sitemap
0ae1991 · 2026-09-12asserts: /Sitemap: https?:\/\/\S+\/sitemap\.xml/.test(rb.text)
Initial commit
/quality/crawl prints the exclusion list
0ae1991 · 2026-09-12asserts: crawl.status === 200 && crawl.text.includes("/saved/stack") && crawl.text.includes("noindex")
Initial commit
/quality/schema names the absent types
0ae1991 · 2026-09-12asserts: schemaPage.status === 200 && schemaPage.text.includes("AggregateRating")
Initial commit
/glossary defines the fidelity score
0ae1991 · 2026-09-12asserts: glossary.status === 200 && glossary.text.includes("Fidelity score") && glossary.text.includes("Run log")
Initial commit
the spine rail links two essays and a prompt
0ae1991 · 2026-09-12asserts: spine.text.includes("Read next") && spineEssays.size >= 2 && spinePrompts.size >= 1
Initial commit
/quality/refreshed prints the review schedule
0ae1991 · 2026-09-12asserts: refreshed.status === 200 && refreshed.text.includes("Review due") && refreshed.text.includes("added")
Initial commit
/changelog lists every entry
0ae1991 · 2026-09-12asserts: log.status === 200 && (log.text.match(/\/changelog\//g) || []).length >= 12
Initial commit
/changelog/<slug> renders the entry the list links to
0ae1991 · 2026-09-12asserts: Boolean(slug) && entry.status === 200 && entry.text.includes("Studio log")
Initial commit
a changelog slug that no longer exists answers 404
0ae1991 · 2026-09-12asserts: gone.status === 404
Initial commit
the multilingual title test declares both directions
0ae1991 · 2026-09-12asserts: /hreflang="en"/i.test(esPage.text) && /hreflang="es"/i.test(esPage.text) && /hreflang="es"/i.test(enHome.text)
Initial commit
/learn/questions pairs every question with an essay and an asset
0ae1991 · 2026-09-12asserts: questions.status === 200 && (questions.text.match(/Read the guide/g) || []).length >= 18 && questions.text.includes("How do I stop a hero section from feeling static?")
Initial commit
/quality/craft quotes the code it praises
0ae1991 · 2026-09-12asserts: craft.status === 200 && craft.text.includes("prefers-reduced-motion") && craft.text.includes("Zero-dependency assets")
Initial commit
/quality/speed reads its numbers and names what it does not claim
0ae1991 · 2026-09-12asserts: speed.status === 200 && speed.text.includes("No Lighthouse score") && /\d+(\d)?(\.\d)? KB/.test(speed.text)
Initial commit
/og/<slug> serves a generated PNG
0ae1991 · 2026-09-12asserts: og.status === 200 && og.type.includes("image/png")
Initial commit
/compare appraises five approaches
0ae1991 · 2026-09-12asserts: compare.status === 200 && (compare.text.match(/What Motif does instead/g) || []).length >= 5
Initial commit
a component page carries FAQPage markup
0ae1991 · 2026-09-12asserts: detail.text.includes('"@type":"FAQPage"')
Initial commit
a component page carries a breadcrumb trail
0ae1991 · 2026-09-12asserts: detail.text.includes('"@type":"BreadcrumbList"')
Initial commit
a component page declares a canonical
0ae1991 · 2026-09-12asserts: /rel="canonical" href="https?:\/\/[^"]+\/components\/halo-button"/.test(detail.text)); const essay = await get("/learn/the-keyboard-walk"); ok("an essay carries Article markup", essay.text.includes('"@type":"Article"') && essay.text.includes("dateModified")); // The absent list is a promise: check no forbidden type is written anywhere in src/. const srcFiles = []; const walk = (dir) => { for (const entry of fs.readdirSync(dir, { withFileTypes: true })) { const full = path.join(dir, entry.name); if (entry.isDirectory()) walk(full); else if (/\.(ts|tsx)$/.test(entry.name)) srcFiles.push(full); } }; walk("src"); // The list itself is read out of the .ts source: a CJS script cannot require // TypeScript, and duplicating the list here would defeat the check. const schemaMap = fs.readFileSync("src/lib/schema-map.ts", "utf8"); const FORBIDDEN_SCHEMA_TYPES = [...schemaMap.matchAll(/"(Product|Offer|AggregateRating|Review
Initial commit
an essay carries Article markup
0ae1991 · 2026-09-12asserts: essay.text.includes('"@type":"Article"') && essay.text.includes("dateModified")
Initial commit
the forbidden-type list is readable
0ae1991 · 2026-09-12asserts: FORBIDDEN_SCHEMA_TYPES.length >= 4
Initial commit
no forbidden schema type is emitted anywhere
0ae1991 · 2026-09-12asserts: offenders.length === 0
Initial commit
no demo scene hard-codes a catalog count
0ae1991 · 2026-09-12asserts: offenders.length === 0
Initial commit
the component page labels preview copy and answers the question
0ae1991 · 2026-09-12asserts: halo.text.includes("sample copy") && halo.text.includes("Are the numbers inside the demo real?")
Initial commit
the embed states that preview copy is sample content
0ae1991 · 2026-09-12asserts: embed.text.includes("Preview copy is sample content")
Initial commit
/brand/voice prints the demo count the files have
0ae1991 · 2026-09-12asserts: voice.status === 200 && textOf(voice.text).includes(phrase)
Initial commit
/lab/layers prints the same demo count
0ae1991 · 2026-09-12asserts: layers.status === 200 && textOf(layers.text).includes(phrase)
Initial commit
per-route budgets are checked against a build report
0ae1991 · 2026-09-12asserts: false
Initial commit
every route is within its JavaScript budget
0ae1991 · 2026-09-12asserts: over.length === 0 && report.routes.length > 100
Initial commit
/quality/speed publishes the budgets it is held to
0ae1991 · 2026-09-12asserts: speed.status === 200 && speed.text.includes("JavaScript budget") && speed.text.includes(`${defaultLimit} KB`)
Initial commit
every route is within its CSS budget
0ae1991 · 2026-09-12asserts: report.routes.length > 100 && cssOver.length === 0
Initial commit
/quality/speed publishes the CSS budget it is held to
0ae1991 · 2026-09-12asserts: speedCss.status === 200 && speedCss.text.includes("CSS budget") && speedCss.text.includes(`${cssTotalLimit} KB`)
Initial commit
the shared shell stays under its recorded budget
0ae1991 · 2026-09-12asserts: typeof shellBudget === "number" && report.sharedJsKb > 0 && report.sharedJsKb <= shellBudget
Initial commit
/perf/build publishes the shared-shell budget
0ae1991 · 2026-09-12asserts: buildPage.status === 200 && buildPage.text.includes("shared shell") && buildPage.text.includes(`${shellBudget} KB`)
Initial commit
/perf/chunks names the modules inside each route's largest chunk
0ae1991 · 2026-09-12asserts: chunksPage.status === 200 && chunksPage.text.includes("Project modules inside") && shownModules.some((m) => chunksPage.text.includes(m))
Initial commit
no built document emits a static prefetch link
0ae1991 · 2026-09-12asserts: prefetch.pages > 0 && prefetch.links === 0 && prefetch.pagesWithPrefetch === 0
Initial commit
/perf/prefetch publishes the prefetch distribution
0ae1991 · 2026-09-12asserts: prefetchPage.status === 200 && prefetchPage.text.includes("no static prefetch links") && prefetchPage.text.includes("prefetch")
Initial commit
the glyph report matches the woff2 cmap on disk
0ae1991 · 2026-09-12asserts: glyphsMatch
Initial commit
/perf/fonts prints the missing-arrow finding
0ae1991 · 2026-09-12asserts: fontsPage.status === 200 && fontsPage.text.includes("U+2192") && fontsPage.text.includes("neither subset")
Initial commit
every share card stays under the recorded weight cap
0ae1991 · 2026-09-12asserts: og.cards > 0 && og.maxKb <= og.budgetKb && ogOver.length === 0
Initial commit
/perf/build publishes the share-card cap
0ae1991 · 2026-09-12asserts: buildPage.status === 200 && buildPage.text.includes("Share cards") && buildPage.text.includes(`${og.budgetKb} KB`)
Initial commit
every cache rule has a copy-paste curl block
0ae1991 · 2026-09-12asserts: rules.length >= 8 && rules.every((r) => cachingPage.text.includes(htmlEscape(`curl -sI https://<host>${samples[r] ?? r}`)))
Initial commit
/perf/service-worker writes the decision down with a measured cost
0ae1991 · 2026-09-12asserts: swPage.status === 200 && swPage.text.includes("Decision: no service worker ships yet") && swPage.text.includes("Cold offline shell")
Initial commit
the determinism gate is wired as an opt-in command
0ae1991 · 2026-09-12asserts: typeof pkg.scripts?.["check:determinism"] === "string" && fs.existsSync(path.join("scripts", "check-determinism.mjs"))
Initial commit
no public page hard-codes a growth figure
0ae1991 · 2026-09-12asserts: hardcodedDeltas.length === 0
Initial commit
the homepage prints no movement it cannot measure
0ae1991 · 2026-09-12asserts: markers.length === 0
Initial commit
the markup accessibility pass finds nothing in the built HTML
0ae1991 · 2026-09-12asserts: scanOk && scanOut.includes("no findings") && documents > 250
Initial commit
the build report and the markup pass count the same documents
0ae1991 · 2026-09-12asserts: report.summary.htmlFiles === documents
Initial commit
the same pass over the served pages finds nothing either
0ae1991 · 2026-09-12asserts: servedOk && servedOut.includes("no findings") && servedDocs > 250
Initial commit
/quality/aria documents the pass and its findings
0ae1991 · 2026-09-12asserts: ariaPage.status === 200 && ariaPage.text.includes("What this page does not check") && ariaPage.text.includes("Documents scanned")
Initial commit
/quality/aria carries the manual checklist, with the runs it has not done
0ae1991 · 2026-09-12asserts: ariaPage.text.includes("What a machine cannot decide here") && ariaPage.text.includes("None of these has been run in a browser by this project") && (ariaPage.text.match(/automated half:/g) || []).length >= 4
Initial commit
/quality/aria no longer calls the demo scenes exempt from the pass
0ae1991 · 2026-09-12asserts: !ariaPage.text.includes("exempt from the host document")
Initial commit
/quality/aria prints the same document count as the pass it describes
0ae1991 · 2026-09-12asserts: ariaPage.text.includes(`Documents scanned`) && ariaPage.text.includes(`>${documents}<`)
Initial commit
/quality/aria prints the served URL count the pass walks
0ae1991 · 2026-09-12asserts: walked > 250 && ariaServed.includes(`${walked} URLs in this build`)
Initial commit
every sitemap page has one h1, its own canonical, a card and a fitting description
0ae1991 · 2026-09-12asserts: sitemapUrls.length > 250 && pageIssues.length === 0
Initial commit
/gaps lists every bet that is not live, and no live one
0ae1991 · 2026-09-12asserts: gaps.includes(`A · Infrastructure-blocked`) && blocked.every((b) => gaps.includes(b.title)) && BETS.filter((b) => b.status === "live").every((b) => !gaps.includes(b.title))
Initial commit
/gaps names the environment it cannot measure here
0ae1991 · 2026-09-12asserts: gaps.includes("Environment-blocked") && gaps.includes("CodeSandbox") && gaps.includes("Lighthouse")
Initial commit
/accessibility prints every manual check the audit lists
0ae1991 · 2026-09-12asserts: MANUAL_CHECKS.every((c) => a11yPage.includes(c.title)) && a11yPage.includes("none of them has been run in a browser")
Initial commit
the footer reaches both honesty pages
0ae1991 · 2026-09-12asserts: home.includes('href="/gaps"') && home.includes('href="/accessibility"')
Initial commit
the check index prints every check the scripts announce
0ae1991 · 2026-09-12asserts: entries.length > 0 && missing.length === 0
Initial commit
the check index prints the counts it derived
0ae1991 · 2026-09-12asserts: indexText.includes(`${entries.length} named checks`) && indexText.includes(` ${printed} `) && counts.every((c) => indexText.includes(c.suite))
Initial commit
the check index admits which names are composed at run time
0ae1991 · 2026-09-12asserts: indexPage.includes(`${dynamicNames} names are composed at run time`)
Initial commit
the check index names the checks no command runs
0ae1991 · 2026-09-12asserts: manualNamed.length === manualTitles.length && indexPage.includes("/accessibility")
Initial commit
the gate index matches the scripts it was generated from
0ae1991 · 2026-09-12asserts: fresh
Initial commit
every mapped claim still exists in its file
0ae1991 · 2026-09-12asserts: stale.length === 0
Initial commit
every mapped check is one a harness announces
0ae1991 · 2026-09-12asserts: fiction.length === 0
Initial commit
no file claims automation without an entry in the claim map
0ae1991 · 2026-09-12asserts: unmapped.length === 0
Initial commit
no prose states a file's line count as a literal
0ae1991 · 2026-09-12asserts: hardcoded.length === 0
Initial commit
every named line count matches the file it names
0ae1991 · 2026-09-12asserts: drift.length === 0
Initial commit
every route the ledger registers still answers
0ae1991 · 2026-09-12asserts: dead.length === 0
Initial commit
/learn/feed.xml carries every guide the hub links
0ae1991 · 2026-09-12asserts: learnFeed.status === 200 && learnItems > 0 && learnItems >= learnListed
Initial commit
/changelog/feed.xml carries every entry the log lists
0ae1991 · 2026-09-12asserts: logFeed.status === 200 && logItems === logListed
Initial commit
the studio log feed links each entry's own permalink
0ae1991 · 2026-09-12asserts: /<link>[^<]*\/changelog\/\d{4}-\d{2}-\d{2}-[a-z0-9-]+<\/link>/.test(logFeed.text) && !/\/#changelog/.test(logFeed.text)
Initial commit
the human sitemap prints the URL count the XML carries
0ae1991 · 2026-09-12asserts: printed === xmlLocs
Initial commit
the human sitemap shows the excluded surfaces too
0ae1991 · 2026-09-12asserts: human.includes("Not in the index") && human.includes("/quality/crawl")
Initial commit
the digest page links its email edition
0ae1991 · 2026-09-12asserts: digestPage.includes('href="/digest/copy-of-the-week"')
Initial commit
and so does the homepage
0ae1991 · 2026-09-12asserts: homePage.includes('href="/digest"')
Initial commit
the keyframes module is the length the page prints
0ae1991 · 2026-09-12asserts: claimed === kfLines
Initial commit
the split panel prints the live module length and both build labels
0ae1991 · 2026-09-12asserts: splitText.includes(`keyframes.tsx (${kfLines} lines)`) && splitText.includes(beforeBuild) && splitText.includes(afterBuild)
Initial commit
the crawl exclusions are readable
0ae1991 · 2026-09-12asserts: excludes.length >= 8 && builtFiles.length > 250
Initial commit
every indexable built page is in the sitemap
0ae1991 · 2026-09-12asserts: missingFromSitemap.length === 0
Initial commit
every excluded surface carries a noindex, not only a robots rule
0ae1991 · 2026-09-12asserts: excludedWithoutNoindex.length === 0
Initial commit
every static route is either listed or noindex — both ways
0ae1991 · 2026-09-12asserts: staticRoutes.length > 120 && twoWayIssues.length === 0
Initial commit
/quality/crawl prints the sitemap count it is describing
0ae1991 · 2026-09-12asserts: crawlPage.status === 200 && crawlText.includes(`${sitemapUrls.length} URLs in this build`) && crawlText.includes(`${excludes.length} surfaces are kept out`)
Initial commit
no page title carries the brand twice
0ae1991 · 2026-09-12asserts: doubleBrand.length === 0
Initial commit
no title is longer than 75 characters
0ae1991 · 2026-09-12asserts: longTitles.length === 0
Initial commit
no two pages share a title
0ae1991 · 2026-09-12asserts: dupes(pageTitles, "title").length === 0
Initial commit
no two pages share a description
0ae1991 · 2026-09-12asserts: dupes(pageDescs, "desc").length === 0
Initial commit
no page advertises another page's URL in its card
0ae1991 · 2026-09-12asserts: siteName === "Motif UI" && wrongCardUrl.length === 0
Initial commit
no page borrows the site tagline as its card title
0ae1991 · 2026-09-12asserts: borrowedTitle.length === 0
Initial commit
every sampled card image resolves to an image
0ae1991 · 2026-09-12asserts: cardSample.length >= 3 && imageIssues.length === 0
Initial commit
no internal link on any page is broken
0ae1991 · 2026-09-12asserts: brokenLinks.length === 0
Initial commit
the one deliberate dead link still 404s
0ae1991 · 2026-09-12asserts: deadLinkStatus.size === 1 && deadLinkStatus.get("/this-page-does-not-exist") === 404
Initial commit
/og/<slug> renders the … cardruns per item
0ae1991 · 2026-09-12asserts: card.status === 200 && (card.headers.get("content-type") || "").includes("image/png")
Initial commit
/roadmap labels every bet's status
0ae1991 · 2026-09-12asserts: roadmap.status === 200 && (roadmap.text.match(/Live in this build/g) || []).length >= 4 && (roadmap.text.match(/Spec only — no code yet/g) || []).length >= 5
Initial commit
/api/v1/components/<slug> serves the asset as data
0ae1991 · 2026-09-12asserts: compApi.status === 200 && compApi.text.includes('"apiVersion":"v1"') && compApi.text.includes('"a11y"')
Initial commit
/api/v1/components/<slug> 404s an unknown asset
0ae1991 · 2026-09-12asserts: missingApi.status === 404
Initial commit
/api/v1/audit serves every asset's scores
0ae1991 · 2026-09-12asserts: auditApi.status === 200 && (auditApi.text.match(/"slug":/g) || []).length === COMPONENTS.length && auditApi.text.includes('"bands"')
Initial commit
/embed.js ships the one-tag SDK
0ae1991 · 2026-09-12asserts: sdk.status === 200 && sdk.text.includes("data-motif-embed") && sdk.text.includes("window.MotifEmbed") && sdk.type.includes("javascript")
Initial commit
the SDK page runs the script it documents
0ae1991 · 2026-09-12asserts: sdkDoc.status === 200 && sdkDoc.text.includes('src="/embed.js"') && sdkDoc.text.includes('data-motif-embed="halo-button"')
Initial commit
canonical for … is its own URLruns per item
0ae1991 · 2026-09-12asserts: canonical === expected
Initial commit
/brand/logo redraws the header's mark
0ae1991 · 2026-09-12asserts: brandLogo.status === 200 && brandLogo.text.includes('x="19" y="19"') && brandLogo.text.includes("#6366f1")
Initial commit
the logo geometry agrees between page and header
0ae1991 · 2026-09-12asserts: chromeSrc.includes('x="19" y="19"') && chromeSrc.includes("#6366f1") && chromeSrc.includes('x="19" y="7"')
Initial commit
/brand/voice prints the live tone scan
0ae1991 · 2026-09-12asserts: brandVoice.status === 200 && brandVoice.text.includes("live hits")
Initial commit
no banned overclaim term survives the context rule
0ae1991 · 2026-09-12asserts: dictionary.length >= 15 && negation !== null && liveHits.length === 0
Initial commit
/brand/launch separates shipped from left-out
0ae1991 · 2026-09-12asserts: launch.status === 200 && launch.text.includes("Left out on purpose") && launch.text.includes("Still open")
Initial commit
/brand/proof labels the quotes as invented
0ae1991 · 2026-09-12asserts: proof.status === 200 && proof.text.includes("invented handle")
Initial commit
/brand/notes derives its lines from the changelog
0ae1991 · 2026-09-12asserts: notes.status === 200 && (notes.text.match(/the full entry/g) || []).length >= 12
Initial commit
/metrics names the numbers it does not have
0ae1991 · 2026-09-12asserts: metrics.status === 200 && metrics.text.includes("counts visitors")
Initial commit
/brand/mascot shows three poses
0ae1991 · 2026-09-12asserts: mascot.status === 200 && ["mascot-lost", "mascot-found", "mascot-idle"].every((id) => mascot.text.includes(id))
Initial commit
the 404 page renders the mascot
0ae1991 · 2026-09-12asserts: notFound.status === 404 && notFound.text.includes("mascot-404")
Initial commit
/brand/wallpapers links three downloads
0ae1991 · 2026-09-12asserts: walls.status === 200 && (walls.text.match(/\/api\/brand\//g) || []).length >= 3
Initial commit
/api/brand/… serves SVGruns per item
0ae1991 · 2026-09-12asserts: art.status === 200 && (art.headers.get("content-type") || "").includes("svg") && body.startsWith("<svg")
Initial commit
/brand/watermark prints the snippet
0ae1991 · 2026-09-12asserts: watermark.status === 200 && watermark.text.includes("Made with Motif")
Initial commit
/brand/thanks lists the three first steps
0ae1991 · 2026-09-12asserts: thanks.status === 200 && ["Copy one component you already need", "Run the keyboard walk on your own page", "Pick a prompt with its failures attached"].every((s) => thanks.text.includes(s), )
Initial commit
/learn/paths lists three paths
0ae1991 · 2026-09-12asserts: paths.status === 200 && pathTitles.every((t) => paths.text.includes(t))
Initial commit
/saved carries the share prompt and the fitness meter
0ae1991 · 2026-09-12asserts: savedPage.status === 200 && savedPage.text.includes("Share the stack") && savedPage.text.includes("Your library fitness")
Initial commit
/saved/stack resolves catalog slugs from the URL
0ae1991 · 2026-09-12asserts: stack.status === 200 && stack.text.includes("Halo Button") && stack.text.includes("Aurora Veil")
Initial commit
/saved/stack names the slugs it cannot resolve
0ae1991 · 2026-09-12asserts: stack.text.includes("nope~ghost")
Initial commit
/habits carries the three opt-in panels
0ae1991 · 2026-09-12asserts: habits.status === 200 && habits.text.includes("Maker streak") && habits.text.includes("Quiet reminder") && habits.text.includes("Did this ship?")
Initial commit
/community/build-a-thon renders the computed windows
0ae1991 · 2026-09-12asserts: buildAThon.status === 200 && buildAThon.text.includes("left") && (buildAThon.text.match(/\d{4}-\d{2}-\d{2}/g) || []).length >= 6
Initial commit
/community/day names its Thursday
0ae1991 · 2026-09-12asserts: communityDay.status === 200 && /\d{4}-W\d+/.test(communityDay.text) && communityDay.text.includes("Community day")
Initial commit
/digest/copy-of-the-week previews the issue
0ae1991 · 2026-09-12asserts: cotw.status === 200 && cotw.text.includes("Copy of the week") && cotw.text.includes("Motif Weekly")
Initial commit
the home feed opens with the newest batch
0ae1991 · 2026-09-12asserts: homeFeed.status === 200 && /\d+ new · \d{4}-\d{2}-\d{2}/.test(homeFeed.text)
Initial commit
the token export parses the stylesheet rather than hardcoding tokens
0ae1991 · 2026-09-12asserts: /globals\.css/.test(lib) && /@theme/.test(lib)
Initial commit
every export is registered in one list
0ae1991 · 2026-09-12asserts: /EXPORTS: ExportEntry\[\]/.test(lib)
Initial commit
hub 200
0ae1991 · 2026-09-12asserts: hub.status === 200
Initial commit
hub links every export file by name
0ae1991 · 2026-09-12asserts: EXPORT_FILES.every((f) => hub.text.includes(f))
Initial commit
hub names the remainders instead of hiding them
0ae1991 · 2026-09-12asserts: hub.text.includes("What is still missing, and inside which feature")
Initial commit
hub lists all five remainders
0ae1991 · 2026-09-12asserts: ["One-click CodeSandbox link", "Embed allowlist", "Publishing to npm", "Saving a palette", "A pipeline behind the badge"].every((t) => hub.text.includes(t), )
Initial commit
endpoint … 200 with a content typeruns per item
0ae1991 · 2026-09-12asserts: res.status === 200 && res.type.length > 0
Initial commit
an unknown export returns 404
0ae1991 · 2026-09-12asserts: missing.status === 404
Initial commit
tokens have colours and radii
0ae1991 · 2026-09-12asserts: Object.keys(tokens.color).length >= 10 && Object.keys(tokens.radius).length >= 3
Initial commit
catalog carries every component, and /quality agrees
0ae1991 · 2026-09-12asserts: catalog.components.length > 100 && catalog.components.length === printed
Initial commit
sitemap lists every component page
0ae1991 · 2026-09-12asserts: comps === catalog.components.length + 4
Initial commit
the motion contract states the three rules
0ae1991 · 2026-09-12asserts: contract.includes("A scene that loops declares a branch") && contract.includes("Reduced motion never removes content that only animation revealed") && contract.includes("The branch is named in the scene's own body")
Initial commit
every moving demo key is a demo the catalog ships
0ae1991 · 2026-09-12asserts: moving.size > 0 && inCatalog.length === moving.size
Initial commit
the share-card route marks animated demos as stills
0ae1991 · 2026-09-12asserts: route.includes("movingDemoKeys") && route.includes('"demo animates · this card is a still"') && route.includes("MOVING_DEMOS.has(")
Initial commit
every loader line resolves to a demo key
0ae1991 · 2026-09-12asserts: links.length > 100 && links.every((l) => l.key && l.module && l.component)
Initial commit
a moving and a still asset both serve cards
0ae1991 · 2026-09-12asserts: movingCard?.status === 200 && movingCard.type.includes("image/png") && stillCard?.status === 200 && stillCard.type.includes("image/png")
Initial commit
the feed carries every changelog entry
0ae1991 · 2026-09-12asserts: fed > 0 && fed === listed
Initial commit
bookmarklet reads custom properties and sends nothing
0ae1991 · 2026-09-12asserts: bookmarklet.text.includes("--") && !/fetch\(|XMLHttpRequest|sendBeacon/.test(bookmarklet.text)); const cli = await get("/api/exports/motif-cli.mjs"); parseCheck("cli", cli.text); ok("cli has list, tokens and badge commands", ["list", "tokens", "badge"].every((c) => cli.text.includes(`${c}(`))); ok("cli names the URL when a request fails", cli.text.includes("could not reach")); ok("cli does not claim to be published", /not published to npm/i.test(cli.text)); /* ---------- the badge ---------- */ const badge = await get("/api/badge/tilt-card"); const tilt = catalog.components.find((c) => c.slug === "tilt-card"); ok("badge serves SVG", badge.status === 200 && badge.type.startsWith("image/svg+xml")); ok("badge carries the stored score", badge.text.includes(`>${tilt.qualityScore}</text>`), `quality ${tilt.qualityScore}`); ok("badge says no pipeline stands behind it", /No CI service/.test(badge.text)); const badgeMissing = await fetch(base + "/api/badge/not-a-component"); ok("unknown badge returns 404", badgeMissing.status === 404); // The badge route and the catalog are the same numbers or the badge is // decoration. Sample eight slugs deterministically rather than trusting one. const sample = [...catalog.components].sort((a, b) => a.slug.localeCompare(b.slug)).slice(0, 8); let agree = 0; for (const c of sample) { const svg = await get(`/api/badge/${c.slug}`); if (svg.status === 200 && svg.text.includes(`>${c.qualityScore}</text>`)) agree++; } ok("every sampled badge agrees with the catalog score", agree === sample.length, `${agree}/${sample.length}`); /* ---------- the embed route ---------- */ const embed = await get("/embed/tilt-card"); ok("embed route renders a demo with attribution", embed.status === 200 && embed.text.includes("Motif UI")); const embedHeaders = await fetch(base + "/embed/tilt-card"); ok("embed route sends frame-ancestors and noindex", embedHeaders.headers.get("content-security-policy") === "frame-ancestors *" && embedHeaders.headers.get("x-robots-tag") === "noindex"); /* ---------- cache headers (522) ---------- */ // /perf/caching tells the reader that "the build harness runs the same two // checks against the running server for every batch, so a config edit that // drops a header fails the batch rather than shipping quietly." It did not
Initial commit
cli has list, tokens and badge commands
0ae1991 · 2026-09-12asserts: ["list", "tokens", "badge"].every((c) => cli.text.includes(`${c}(`))
Initial commit
cli names the URL when a request fails
0ae1991 · 2026-09-12asserts: cli.text.includes("could not reach")
Initial commit
cli does not claim to be published
0ae1991 · 2026-09-12asserts: /not published to npm/i.test(cli.text)
Initial commit
badge serves SVG
0ae1991 · 2026-09-12asserts: badge.status === 200 && badge.type.startsWith("image/svg+xml")
Initial commit
badge carries the stored score
0ae1991 · 2026-09-12asserts: badge.text.includes(`>${tilt.qualityScore}</text>`)
Initial commit
badge says no pipeline stands behind it
0ae1991 · 2026-09-12asserts: /No CI service/.test(badge.text)
Initial commit
unknown badge returns 404
0ae1991 · 2026-09-12asserts: badgeMissing.status === 404
Initial commit
every sampled badge agrees with the catalog score
0ae1991 · 2026-09-12asserts: agree === sample.length
Initial commit
embed route renders a demo with attribution
0ae1991 · 2026-09-12asserts: embed.status === 200 && embed.text.includes("Motif UI")
Initial commit
embed route sends frame-ancestors and noindex
0ae1991 · 2026-09-12asserts: embedHeaders.headers.get("content-security-policy") === "frame-ancestors *" && embedHeaders.headers.get("x-robots-tag") === "noindex"
Initial commit
the cache-rule list is readable
0ae1991 · 2026-09-12asserts: rules.length >= 5 && unknownRules.length === 0
Initial commit
every documented Cache-Control rule is the one the server sends
0ae1991 · 2026-09-12asserts: checked === rules.length && wrong.length === 0
Initial commit
the catch-all is first, so every specific rule wins over it
0ae1991 · 2026-09-12asserts: order[0] === "/:path*" && order.filter((s) => s === "/:path*").length === 1
Initial commit
page … 200runs per item
0ae1991 · 2026-09-12asserts: res.status === 200
Initial commit
print page prints the block it serves
0ae1991 · 2026-09-12asserts: printPage.text.includes("@media print") && printPage.text.includes("break-inside")
Initial commit
tokens page prints the colours the endpoint serves
0ae1991 · 2026-09-12asserts: Object.keys(tokens.color).every((k) => tokensPage.includes(`--color-${k}`))
Initial commit
badge page says it is not a CI badge
0ae1991 · 2026-09-12asserts: /not a CI badge/.test(badgePage.text.replace(/<!-- -->/g, ""))
Initial commit
footer links to /integrations
0ae1991 · 2026-09-12asserts: home.text.includes('href="/integrations"')
Initial commit
the prompt pack carries every brief in the catalog (#71)
92c12f2 · 2026-09-12asserts: pack.status === 200 && pack.type.includes("json") && packCount > 0
Bank 3 batch 3: prompt quality levers (items 51-75)
/prompts prints the fidelity honesty line (#75)
92c12f2 · 2026-09-12asserts: promptsPage.includes("report card, not a benchmark")
Bank 3 batch 3: prompt quality levers (items 51-75)
essay prereq chains are acyclic (#118)
315a871 · 2026-09-12asserts: cycles.length === 0
Bank 3 batch 5: Learn platform features (items 101-125)
recorded minutes agree with the computed reading time (#110)
315a871 · 2026-09-12asserts: drifted.length === 0
Bank 3 batch 5: Learn platform features (items 101-125)
the shared glossary list matches the served definitions (#104)
315a871 · 2026-09-12asserts: drift.length === 0 && servedNames.length > 0
Bank 3 batch 5: Learn platform features (items 101-125)
every essay that uses a defined term links the glossary (#104)
315a871 · 2026-09-12asserts: broken.length === 0
Bank 3 batch 5: Learn platform features (items 101-125)
the learn feed's full mode carries body text (#113)
315a871 · 2026-09-12asserts: feed.status === 200 && feed.text.includes("motif:learn") && feed.text.includes(probe.replace(/&/g, "&").slice(0, 40))
Bank 3 batch 5: Learn platform features (items 101-125)
the served stylesheet carries the essay print block (#114)
315a871 · 2026-09-12asserts: printed
Bank 3 batch 5: Learn platform features (items 101-125)
served essays anchor every h2 with unique ids (#115)
315a871 · 2026-09-12asserts: ids.length > 0 && new Set(ids).size === ids.length
Bank 3 batch 5: Learn platform features (items 101-125)
the learn word ratchet holds (#121)
315a871 · 2026-09-12asserts: learned.words > 0 && words >= learned.words * 0.95
Bank 3 batch 5: Learn platform features (items 101-125)
the translation-readiness count is published (#116)
315a871 · 2026-09-12asserts: Number.isInteger(learned.longParagraphs)
Bank 3 batch 5: Learn platform features (items 101-125)
every built page has one main landmark and the skip link (#371/#375)
823b74d · 2026-09-12asserts: mains === 1 && skip
Bank 3 batch 16: accessibility pass (items 371-395)
the dialog fixture declares its semantics (#389)
823b74d · 2026-09-12asserts: /role="dialog"/.test(body) && body.includes("aria-modal") && body.includes("aria-label")
Bank 3 batch 16: accessibility pass (items 371-395)
no third-party origin in the built HTML (#399)
1eeb1d7 · 2026-09-12asserts: origins.length === 0
Bank 3 batch 17: performance pass incl #410 lazy prompt data (items 396-420)
no resource hints to audit (#412)
1eeb1d7 · 2026-09-12asserts: !home.includes("preconnect") && !home.includes("dns-prefetch")
Bank 3 batch 17: performance pass incl #410 lazy prompt data (items 396-420)
no raster images to budget or shift (#397/#407)
1eeb1d7 · 2026-09-12asserts: imgs === 0
Bank 3 batch 17: performance pass incl #410 lazy prompt data (items 396-420)
the ledger table keeps its recorded shape (#430)
50b0326 · 2026-09-12asserts: ledger.includes("| # | Idea | Shipped as |")
Bank 3 batch 18: gates & harness pass (items 421-445)
the third bank holds its word-count floor (#437)
50b0326 · 2026-09-12asserts: words > 9000
Bank 3 batch 18: gates & harness pass (items 421-445)
the harness catches an intentional failure (#434)
50b0326 · 2026-09-12asserts: selfCaught
Bank 3 batch 18: gates & harness pass (items 421-445)
the golden fragment survives on the reference page (#441)
50b0326 · 2026-09-12asserts: golden.includes("Combo Box") && golden.includes("a11y")
Bank 3 batch 18: gates & harness pass (items 421-445)
robots and sitemap agree and the sitemap answers (#443)
50b0326 · 2026-09-12asserts: robots.status === 200 && urls.length > 100 && dead === 0
Bank 3 batch 18: gates & harness pass (items 421-445)
/api/search answers with the recorded schema (#444)
50b0326 · 2026-09-12asserts: searchOk
Bank 3 batch 18: gates & harness pass (items 421-445)
the prompt pack carries its schema (#444)
50b0326 · 2026-09-12asserts: pack.status === 200 && pack.text.includes('"promptBody"') && pack.text.includes('"count"')
Bank 3 batch 18: gates & harness pass (items 421-445)
zero explicit anys in src/lib (#427)
50b0326 · 2026-09-12asserts: anys === 0
Bank 3 batch 18: gates & harness pass (items 421-445)
/quality links what the harness cannot see (#439)
50b0326 · 2026-09-12asserts: qhtml.includes("cannot see") || qhtml.includes("cannot-see") || qhtml.includes("browser-only")
Bank 3 batch 18: gates & harness pass (items 421-445)
every check name is unique across the harness (#423)
50b0326 · 2026-09-12asserts: dupes.length === 0
Bank 3 batch 18: gates & harness pass (items 421-445)
every sitemap family is walked by at least one check (#435)
50b0326 · 2026-09-12asserts: unfetched.length === 0
Bank 3 batch 18: gates & harness pass (items 421-445)
export-all carries the family registry (#459)
0fb33d3 · 2026-09-12asserts: all.status === 200 && families && families.components > 200 && families.prompts > 100
Bank 3 batch 19: admin & content ops (items 446-465)
the admin admits its demo scope on the served page (#465)
0fb33d3 · 2026-09-12asserts: admin.includes("local rehearsal")
Bank 3 batch 19: admin & content ops (items 446-465)
prompt and collection share cards answer (#469/#470)
74759ea · 2026-09-12asserts: ogP.status === 200 && ogC.status === 200 && ogP.type.includes("image") && ogC.type.includes("image")
Bank 3 batch 20: community & sharing (items 466-485)
the embeddable collection shelf answers with attribution (#471)
74759ea · 2026-09-12asserts: embC.status === 200 && embC.text.includes("Embedded from")
Bank 3 batch 20: community & sharing (items 466-485)
the JSON feed variant carries every dated item (#475)
74759ea · 2026-09-12asserts: feedJson.status === 200 && feedItems > 200
Bank 3 batch 20: community & sharing (items 466-485)
the code of conduct is served and linked from the hub (#476)
74759ea · 2026-09-12asserts: conduct.status === 200 && conduct.text.includes("Code of conduct")
Bank 3 batch 20: community & sharing (items 466-485)
no backend calls and no cookie writes in the shipped data surfaces (#94)
9749e7d · 2026-09-12asserts: externalFetch === 0 && cookieWrite === 0
Backlog batch: suggestions-100 items 47/49/51/58/59/64/65/66/67/68/69/71/74/79/80/83/93/94/100
check:demos — the demo registry, the catalog and the suggestion register
66 calls · 10.1s
every demo key has a loader in the registry
0ae1991 · 2026-09-12asserts: keys.every((k) => loaders.has(k))
Initial commit
no loader is missing from the key list
0ae1991 · 2026-09-12asserts: staleKeys.length === 0
Initial commit
every loader names a component its module exports
0ae1991 · 2026-09-12asserts: missingExports.length === 0
Initial commit
every scene component a module exports is named by a loader
0ae1991 · 2026-09-12asserts: unclaimed.length === 0 && duplicated.length === 0
Initial commit
every helper a scene module exports is imported somewhere
0ae1991 · 2026-09-12asserts: unusedHelpers.length === 0
Initial commit
every catalog entry names a demo that exists
0ae1991 · 2026-09-12asserts: assets.every((c) => keys.includes(c.demo))
Initial commit
every demo in the switch is claimed by an entry
0ae1991 · 2026-09-12asserts: orphans.length === 0
Initial commit
§… claims complete and has every bullet tickedruns per item
0ae1991 · 2026-09-12asserts: bullets === ticked
Initial commit
§…'s shipped count matches its ticked bulletsruns per item
0ae1991 · 2026-09-12asserts: Number(frac[1]) === ticked && Number(frac[2]) === bullets
Initial commit
the ledger table matches its headline
0ae1991 · 2026-09-12asserts: rows === headline + extras && rows > 0
Initial commit
Section 18 is closed before Section 19 opens
0ae1991 · 2026-09-12asserts: /complete \(10\/10 shipped ✅\)/.test(s18Head)
Initial commit
the ledger's Section 17 count matches the scenes verified here
0ae1991 · 2026-09-12asserts: shipped === inSection17
Initial commit
/components/… renders the sceneruns per item
0ae1991 · 2026-09-12asserts: page.status === 200 && page.text.includes(scene.marker)
Initial commit
/embed/… renders it without chromeruns per item
0ae1991 · 2026-09-12asserts: embed.status === 200 && !embed.text.includes('id="mf-logo"')
Initial commit
counter band prints the real totals without JavaScript
0ae1991 · 2026-09-12asserts: band.text.includes(catalogTotal.toLocaleString("en-US")) && band.text.includes("135,020")
Initial commit
the library lists every scene this guard knows about
0ae1991 · 2026-09-12asserts: hub.status === 200 && NEW_SCENES.every((s) => hub.text.includes(s.slug))
Initial commit
the catalog endpoint carries them too
0ae1991 · 2026-09-12asserts: NEW_SCENES.every((s) => catalog.components.some((c) => c.slug === s.slug))
Initial commit
the catalog carries the backgrounds as well
0ae1991 · 2026-09-12asserts: catalog.backgrounds.length > 0 && catalog.$generated.backgrounds === catalog.backgrounds.length
Initial commit
… declares the behaviour it shipsruns per item
0ae1991 · 2026-09-12asserts: Boolean(entry) && scene.behaviors.every((b) => entry.behaviors.includes(b))
Initial commit
the motion audit reads the scene modules
0ae1991 · 2026-09-12asserts: audit.scenes === keys.length && audit.moving > 100
Initial commit
every scene that drives motion from JavaScript names the preference
0ae1991 · 2026-09-12asserts: audit.unguarded.length === 0
Initial commit
the built stylesheet carries the site-wide reduced-motion policy
0ae1991 · 2026-09-12asserts: policy.found
Initial commit
/quality/aria prints the split the audit measured
0ae1991 · 2026-09-12asserts: aria.status === 200 && ariaText.includes(`${audit.js.length} from JavaScript`) && ariaText.includes(`${audit.css.length} through CSS`)
Initial commit
the reduced-motion checklist item reports the JavaScript count as covered
0ae1991 · 2026-09-12asserts: ariaText.includes(`every scene that drives motion from JavaScript names the preference — ${audit.jsGuarded} of ${audit.js.length}`)
Initial commit
/quality/aria prints the motion split per module
0ae1991 · 2026-09-12asserts: aria.status === 200 && ariaText.includes("Motion, counted per module") && ariaText.includes("first unguarded") && byModule.every((m) => ariaText.includes(m.module)) && ariaText.includes(`${byModule.length} modules · ${moduleScenes} scenes · ${moduleAnimate} animate`)
Initial commit
/quality/aria links the motion contract and names its three rules
0ae1991 · 2026-09-12asserts: ariaText.includes("docs/motion-contract.md") && ariaText.includes("A scene that loops declares a branch") && ariaText.includes("Reduced motion never removes content") && ariaText.includes("The branch is named in the scene")
Initial commit
the embed shell honours prefers-reduced-motion
0ae1991 · 2026-09-12asserts: embedHtml.includes('data-embed-motion="honours-preference"') && shellSrc.includes('matchMedia("(prefers-reduced-motion: reduce)")')
Initial commit
the embed docs say the frame honours the preference
0ae1991 · 2026-09-12asserts: embedDocs.status === 200 && embedDocs.text.replace(/<!-- -->/g, "").includes("prefers-reduced-motion")
Initial commit
the motion audit module loads
0ae1991 · 2026-09-12asserts: false
Initial commit
the focus ring clears 3:1 on every flat surface it sits on
0ae1991 · 2026-09-12asserts: rings.length > 0 && rings.every((r) => r.pass)
Initial commit
the built stylesheet carries the forced-colors block
0ae1991 · 2026-09-12asserts: fc.found
Initial commit
/quality/aria lists target-size candidates, labelled as candidates
0ae1991 · 2026-09-12asserts: targets.length > 0
Initial commit
every keyboard declaration has code evidence
0ae1991 · 2026-09-12asserts: kbMissing.length === 0
Initial commit
every drag declaration has code evidence
0ae1991 · 2026-09-12asserts: dgMissing.length === 0
Initial commit
accessible-name fixtures match the built markup
0ae1991 · 2026-09-12asserts: drift.fixtures === NAME_FIXTURES.length && drift.drift.length === 0
Initial commit
no scene reorders visually without explaining its reading order
0ae1991 · 2026-09-12asserts: order.every((u) => u.explained)
Initial commit
/quality/aria prints the focus-ring ratios
0ae1991 · 2026-09-12asserts: deepText.includes("Focus ring against the surfaces") && rings.every((r) => deepText.includes(r.label))
Initial commit
/quality/aria says whether the forced-colors block shipped
0ae1991 · 2026-09-12asserts: deepText.includes("forced-colors: active")
Initial commit
/quality/aria labels target size as a candidate, not a measurement
0ae1991 · 2026-09-12asserts: deepText.includes("Target size") && deepText.includes("candidates, not measurements")
Initial commit
/quality/aria prints the announced sentences for both live regions
0ae1991 · 2026-09-12asserts: ANNOUNCED.toast.every((s) => deepText.includes(s)) && ANNOUNCED.liveRegion.every((s) => deepText.includes(s))
Initial commit
/quality/aria prints the fixed-height inventory
0ae1991 · 2026-09-12asserts: fixed.length > 0 && fixed.every((f) => deepText.includes(f.value))
Initial commit
/quality/aria publishes the RTL dry run and names the untested remainder
0ae1991 · 2026-09-12asserts: deepText.includes("dry run") && rtl.scenes.every((s) => deepText.includes(s.key)) && deepText.includes(`${rtl.untested} scenes are untested`)
Initial commit
the a11y-deep module loads
0ae1991 · 2026-09-12asserts: false
Initial commit
/perf/timers publishes the named timer registry
0ae1991 · 2026-09-12asserts: timersText.includes("Every loop in the scene modules") && timersText.includes(`${reg.totals.intervals - reg.totals.uncleanedIntervals}/${reg.totals.intervals}`) && flagged.every((s) => timersText.includes(s))
Initial commit
the timer-registry module loads
0ae1991 · 2026-09-12asserts: false
Initial commit
the third bank's numbering is exactly 1..500
f2f4f25 · 2026-09-12asserts: sequential
Batch 1 of bank 3: 12 prompts, 2 collections, 500-item bank doc, harness checks
the third bank's progress table is well-formed
f2f4f25 · 2026-09-12asserts: shipped.length >= 1 && bank.includes("## Progress")
Batch 1 of bank 3: 12 prompts, 2 collections, 500-item bank doc, harness checks
every prompt's stacks value is from the fixed enum (#65)
92c12f2 · 2026-09-12asserts: badStack.length === 0
Bank 3 batch 3: prompt quality levers (items 51-75)
every prompt's blocks use title-case nouns (#66)
92c12f2 · 2026-09-12asserts: badBlocks.length === 0
Bank 3 batch 3: prompt quality levers (items 51-75)
the prompt linter passes for every bank-3 prompt (#69)
92c12f2 · 2026-09-12asserts: floors.length === 0
Bank 3 batch 3: prompt quality levers (items 51-75)
every collection matches at least one member
6930463 · 2026-09-12asserts: empty.length === 0
Bank 3 batch 13: collections & curation (items 301-325)
seasonal collection windows are ordered (#310)
6930463 · 2026-09-12asserts: badWindows.length === 0
Bank 3 batch 13: collections & curation (items 301-325)
every pick reason names a member (#317)
6930463 · 2026-09-12asserts: orphanReasons.length === 0
Bank 3 batch 13: collections & curation (items 301-325)
every catalog entry carries at least one tag (#346)
399996c · 2026-09-12asserts: untagged.length === 0
Bank 3 batch 14: search & discovery (items 326-350)
studio preferences use the one versioned key (#370)
a93730d · 2026-09-12asserts: src.includes("motif:studio-prefs:v1") && !/motif:studio-prefs(?!:v1)"/.test(src), "motif:studio-prefs:v1 — namespaced
Bank 3 batch 15: studio & saved flows (items 351-370)
no scene button renders under 16 px tall (#381)
823b74d · 2026-09-12asserts: tiny.length === 0
Bank 3 batch 16: accessibility pass (items 371-395)
scenes pairing text with imagery declare a scrim (#382)
823b74d · 2026-09-12asserts: bare.length === 0
Bank 3 batch 16: accessibility pass (items 371-395)
no scene suppresses the focus ring (#383)
823b74d · 2026-09-12asserts: outlines.length === 0
Bank 3 batch 16: accessibility pass (items 371-395)
every fast interval scene names the reduced-motion branch (#391)
823b74d · 2026-09-12asserts: flashy.length === 0
Bank 3 batch 16: accessibility pass (items 371-395)
no scene reorders visually without explaining the reading order (#392)
823b74d · 2026-09-12asserts: reordered.length === 0
Bank 3 batch 16: accessibility pass (items 371-395)
no scene fixes a width above the 320 px reflow line (#394)
823b74d · 2026-09-12asserts: wide.length === 0
Bank 3 batch 16: accessibility pass (items 371-395)
no scene hand-types the live catalog sizes (audit batch)
41d3ed2 · 2026-09-12asserts: stale.length === 0
Audit batch: fix drifted stats band, add catalog-size drift gate
no dead exports in src/lib (#428)
50b0326 · 2026-09-12asserts: dead.length === 0
Bank 3 batch 18: gates & harness pass (items 421-445)
the redirect register is empty or fully wired (#447)
0fb33d3 · 2026-09-12asserts: REDIRECTS.length === 0 || REDIRECTS.every((r) => r.to && r.reason)
Bank 3 batch 19: admin & content ops (items 446-465)
the admin layout states its demo scope and carries the main landmark (#458/#465)
0fb33d3 · 2026-09-12asserts: layout.includes("local rehearsal") && layout.includes('id="admin-content"')
Bank 3 batch 19: admin & content ops (items 446-465)
every storage key is namespaced and versioned where mutable (#93)
9749e7d · 2026-09-12asserts: keys.size > 0 && unnamespaced.length === 0 && mutableUnversioned.length === 0
Backlog batch: suggestions-100 items 47/49/51/58/59/64/65/66/67/68/69/71/74/79/80/83/93/94/100
The 14 markup rules, and the failure each one prevents
These are the checks with prose attached, because the failure is a user-visible one: they run over every built page document and again over 4 routes that are rendered on demand, and a finding is a finding in either mode. The current count for each rule is on the markup audit.
an <img> with no alt attribute
a button with no text, aria-label or title, outside an aria-hidden subtree
a link with no text and no accessible name
a form control with no label, aria-label or explicit label association
two elements sharing an id in one document
a heading that jumps down more than one level
a document with no lang attribute on <html>
a focusable control inside an aria-hidden subtree — hidden from the tree but still reachable by Tab
an aria-labelledby/describedby/controls/… pointing at an id that is not in the document
an operable role (button, switch, slider…) on an element that cannot take focus — no tabindex, not a native control, not inside a closed popup
an aria-expanded/checked/selected/pressed/current value the spec does not allow
a role that requires a value property (slider, tab, switch…) without one
a data table with no caption and no aria-label — a grid without a sentence
a link or button whose text is just "click here" — the purpose must be in the link
The 7 checks no command runs
Everything above is decided by a machine. These are not, and no suite here reports on them: a browser has to open the page, and a person has to look. They are named rather than implied, and the accessibility statement says plainly that none of them has been run — listing a check is not passing it.
- manualTab from the top of a page to the end, with no mouse
- manualClose an overlay while focus is inside it
- manualCheck where focus returns after a dialog closes
- manualLook at the focus ring against the surface it sits on
- manualListen to what the screen reader says, not just that it can
- manualSet reduced motion and open the animated scenes
- manualZoom to 200% and use only touch-sized targets
What each one would catch, and how to run it, is on /accessibility.
What this index cannot show
- 11 names are composed at run time. A check inside a loop prints one name per route or per asset; those appear here with the varying part replaced by … and tagged runs per item. Printing one entry per iteration would need the live server, and the loop is the thing that makes the count larger than the list.
- The condition column is code. Only the 14 markup rules ship a sentence about the failure they prevent; for the rest, the assertion is quoted as written, because that is the strongest true thing this page can say about it.
- The commit is the last edit, not the first idea. A check that was rewritten three batches later carries the later batch. Blame answers “who last wrote this line” exactly, and the alternative — a hand-kept table of origins — is the drift this page exists to avoid.
- A green suite is not a certificate. These checks assert the things that have been written down; the numbers they cannot produce, and the bets that are blocked on infrastructure, are on /gaps.