Skip to content

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:exportspages, endpoints and data against the copy that documents them

200 calls · 36.5s

  • served … parses as JavaScriptruns per item

    0ae1991 · 2026-09-12

    asserts: true

    Initial commit

  • ledger table matches its own headline

    0ae1991 · 2026-09-12

    asserts: rows === headline + extras && rows > 0

    Initial commit

  • ledger rows are numbered 1..N without gaps

    0ae1991 · 2026-09-12

    asserts: nums.length > 0 && nums.every((n, i) => n === i + 1)

    Initial commit

  • sections 1–16 are marked complete

    0ae1991 · 2026-09-12

    asserts: secHeads.length === 16 && secHeads.every((m) => /complete|✅/.test(m[2]))

    Initial commit

  • sitemap.xml is served

    0ae1991 · 2026-09-12

    asserts: sm.status === 200 && sm.text.includes("<urlset")

    Initial commit

  • sitemap carries essays and prompts

    0ae1991 · 2026-09-12

    asserts: sm.text.includes("/learn/") && sm.text.includes("/prompts/")

    Initial commit

  • robots.txt disallows the thin surfaces

    0ae1991 · 2026-09-12

    asserts: rb.status === 200 && rb.text.includes("Disallow: /search") && rb.text.includes("Disallow: /admin")

    Initial commit

  • robots.txt points at the sitemap

    0ae1991 · 2026-09-12

    asserts: /Sitemap: https?:\/\/\S+\/sitemap\.xml/.test(rb.text)

    Initial commit

  • /quality/crawl prints the exclusion list

    0ae1991 · 2026-09-12

    asserts: crawl.status === 200 && crawl.text.includes("/saved/stack") && crawl.text.includes("noindex")

    Initial commit

  • /quality/schema names the absent types

    0ae1991 · 2026-09-12

    asserts: schemaPage.status === 200 && schemaPage.text.includes("AggregateRating")

    Initial commit

  • /glossary defines the fidelity score

    0ae1991 · 2026-09-12

    asserts: 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-12

    asserts: spine.text.includes("Read next") && spineEssays.size >= 2 && spinePrompts.size >= 1

    Initial commit

  • /quality/refreshed prints the review schedule

    0ae1991 · 2026-09-12

    asserts: refreshed.status === 200 && refreshed.text.includes("Review due") && refreshed.text.includes("added")

    Initial commit

  • /changelog lists every entry

    0ae1991 · 2026-09-12

    asserts: log.status === 200 && (log.text.match(/\/changelog\//g) || []).length >= 12

    Initial commit

  • /changelog/<slug> renders the entry the list links to

    0ae1991 · 2026-09-12

    asserts: Boolean(slug) && entry.status === 200 && entry.text.includes("Studio log")

    Initial commit

  • a changelog slug that no longer exists answers 404

    0ae1991 · 2026-09-12

    asserts: gone.status === 404

    Initial commit

  • the multilingual title test declares both directions

    0ae1991 · 2026-09-12

    asserts: /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-12

    asserts: 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-12

    asserts: 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-12

    asserts: 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-12

    asserts: og.status === 200 && og.type.includes("image/png")

    Initial commit

  • /compare appraises five approaches

    0ae1991 · 2026-09-12

    asserts: compare.status === 200 && (compare.text.match(/What Motif does instead/g) || []).length >= 5

    Initial commit

  • a component page carries FAQPage markup

    0ae1991 · 2026-09-12

    asserts: detail.text.includes('"@type":"FAQPage"')

    Initial commit

  • a component page carries a breadcrumb trail

    0ae1991 · 2026-09-12

    asserts: detail.text.includes('"@type":"BreadcrumbList"')

    Initial commit

  • a component page declares a canonical

    0ae1991 · 2026-09-12

    asserts: /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-12

    asserts: essay.text.includes('"@type":"Article"') && essay.text.includes("dateModified")

    Initial commit

  • the forbidden-type list is readable

    0ae1991 · 2026-09-12

    asserts: FORBIDDEN_SCHEMA_TYPES.length >= 4

    Initial commit

  • no forbidden schema type is emitted anywhere

    0ae1991 · 2026-09-12

    asserts: offenders.length === 0

    Initial commit

  • no demo scene hard-codes a catalog count

    0ae1991 · 2026-09-12

    asserts: offenders.length === 0

    Initial commit

  • the component page labels preview copy and answers the question

    0ae1991 · 2026-09-12

    asserts: 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-12

    asserts: embed.text.includes("Preview copy is sample content")

    Initial commit

  • /brand/voice prints the demo count the files have

    0ae1991 · 2026-09-12

    asserts: voice.status === 200 && textOf(voice.text).includes(phrase)

    Initial commit

  • /lab/layers prints the same demo count

    0ae1991 · 2026-09-12

    asserts: layers.status === 200 && textOf(layers.text).includes(phrase)

    Initial commit

  • per-route budgets are checked against a build report

    0ae1991 · 2026-09-12

    asserts: false

    Initial commit

  • every route is within its JavaScript budget

    0ae1991 · 2026-09-12

    asserts: over.length === 0 && report.routes.length > 100

    Initial commit

  • /quality/speed publishes the budgets it is held to

    0ae1991 · 2026-09-12

    asserts: 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-12

    asserts: report.routes.length > 100 && cssOver.length === 0

    Initial commit

  • /quality/speed publishes the CSS budget it is held to

    0ae1991 · 2026-09-12

    asserts: 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-12

    asserts: typeof shellBudget === "number" && report.sharedJsKb > 0 && report.sharedJsKb <= shellBudget

    Initial commit

  • /perf/build publishes the shared-shell budget

    0ae1991 · 2026-09-12

    asserts: 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-12

    asserts: 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-12

    asserts: prefetch.pages > 0 && prefetch.links === 0 && prefetch.pagesWithPrefetch === 0

    Initial commit

  • /perf/prefetch publishes the prefetch distribution

    0ae1991 · 2026-09-12

    asserts: 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-12

    asserts: glyphsMatch

    Initial commit

  • /perf/fonts prints the missing-arrow finding

    0ae1991 · 2026-09-12

    asserts: 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-12

    asserts: og.cards > 0 && og.maxKb <= og.budgetKb && ogOver.length === 0

    Initial commit

  • /perf/build publishes the share-card cap

    0ae1991 · 2026-09-12

    asserts: 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-12

    asserts: 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-12

    asserts: 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-12

    asserts: 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-12

    asserts: hardcodedDeltas.length === 0

    Initial commit

  • the homepage prints no movement it cannot measure

    0ae1991 · 2026-09-12

    asserts: markers.length === 0

    Initial commit

  • the markup accessibility pass finds nothing in the built HTML

    0ae1991 · 2026-09-12

    asserts: scanOk && scanOut.includes("no findings") && documents > 250

    Initial commit

  • the build report and the markup pass count the same documents

    0ae1991 · 2026-09-12

    asserts: report.summary.htmlFiles === documents

    Initial commit

  • the same pass over the served pages finds nothing either

    0ae1991 · 2026-09-12

    asserts: servedOk && servedOut.includes("no findings") && servedDocs > 250

    Initial commit

  • /quality/aria documents the pass and its findings

    0ae1991 · 2026-09-12

    asserts: 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-12

    asserts: 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-12

    asserts: !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-12

    asserts: ariaPage.text.includes(`Documents scanned`) && ariaPage.text.includes(`>${documents}<`)

    Initial commit

  • /quality/aria prints the served URL count the pass walks

    0ae1991 · 2026-09-12

    asserts: 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-12

    asserts: sitemapUrls.length > 250 && pageIssues.length === 0

    Initial commit

  • /gaps lists every bet that is not live, and no live one

    0ae1991 · 2026-09-12

    asserts: 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-12

    asserts: gaps.includes("Environment-blocked") && gaps.includes("CodeSandbox") && gaps.includes("Lighthouse")

    Initial commit

  • /accessibility prints every manual check the audit lists

    0ae1991 · 2026-09-12

    asserts: 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-12

    asserts: home.includes('href="/gaps"') && home.includes('href="/accessibility"')

    Initial commit

  • the check index prints every check the scripts announce

    0ae1991 · 2026-09-12

    asserts: entries.length > 0 && missing.length === 0

    Initial commit

  • the check index prints the counts it derived

    0ae1991 · 2026-09-12

    asserts: 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-12

    asserts: indexPage.includes(`${dynamicNames} names are composed at run time`)

    Initial commit

  • the check index names the checks no command runs

    0ae1991 · 2026-09-12

    asserts: manualNamed.length === manualTitles.length && indexPage.includes("/accessibility")

    Initial commit

  • the gate index matches the scripts it was generated from

    0ae1991 · 2026-09-12

    asserts: fresh

    Initial commit

  • every mapped claim still exists in its file

    0ae1991 · 2026-09-12

    asserts: stale.length === 0

    Initial commit

  • every mapped check is one a harness announces

    0ae1991 · 2026-09-12

    asserts: fiction.length === 0

    Initial commit

  • no file claims automation without an entry in the claim map

    0ae1991 · 2026-09-12

    asserts: unmapped.length === 0

    Initial commit

  • no prose states a file's line count as a literal

    0ae1991 · 2026-09-12

    asserts: hardcoded.length === 0

    Initial commit

  • every named line count matches the file it names

    0ae1991 · 2026-09-12

    asserts: drift.length === 0

    Initial commit

  • every route the ledger registers still answers

    0ae1991 · 2026-09-12

    asserts: dead.length === 0

    Initial commit

  • /learn/feed.xml carries every guide the hub links

    0ae1991 · 2026-09-12

    asserts: learnFeed.status === 200 && learnItems > 0 && learnItems >= learnListed

    Initial commit

  • /changelog/feed.xml carries every entry the log lists

    0ae1991 · 2026-09-12

    asserts: logFeed.status === 200 && logItems === logListed

    Initial commit

  • the studio log feed links each entry's own permalink

    0ae1991 · 2026-09-12

    asserts: /<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-12

    asserts: printed === xmlLocs

    Initial commit

  • the human sitemap shows the excluded surfaces too

    0ae1991 · 2026-09-12

    asserts: human.includes("Not in the index") && human.includes("/quality/crawl")

    Initial commit

  • the digest page links its email edition

    0ae1991 · 2026-09-12

    asserts: digestPage.includes('href="/digest/copy-of-the-week"')

    Initial commit

  • and so does the homepage

    0ae1991 · 2026-09-12

    asserts: homePage.includes('href="/digest"')

    Initial commit

  • the keyframes module is the length the page prints

    0ae1991 · 2026-09-12

    asserts: claimed === kfLines

    Initial commit

  • the split panel prints the live module length and both build labels

    0ae1991 · 2026-09-12

    asserts: splitText.includes(`keyframes.tsx (${kfLines} lines)`) && splitText.includes(beforeBuild) && splitText.includes(afterBuild)

    Initial commit

  • the crawl exclusions are readable

    0ae1991 · 2026-09-12

    asserts: excludes.length >= 8 && builtFiles.length > 250

    Initial commit

  • every indexable built page is in the sitemap

    0ae1991 · 2026-09-12

    asserts: missingFromSitemap.length === 0

    Initial commit

  • every excluded surface carries a noindex, not only a robots rule

    0ae1991 · 2026-09-12

    asserts: excludedWithoutNoindex.length === 0

    Initial commit

  • every static route is either listed or noindex — both ways

    0ae1991 · 2026-09-12

    asserts: staticRoutes.length > 120 && twoWayIssues.length === 0

    Initial commit

  • /quality/crawl prints the sitemap count it is describing

    0ae1991 · 2026-09-12

    asserts: 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-12

    asserts: doubleBrand.length === 0

    Initial commit

  • no title is longer than 75 characters

    0ae1991 · 2026-09-12

    asserts: longTitles.length === 0

    Initial commit

  • no two pages share a title

    0ae1991 · 2026-09-12

    asserts: dupes(pageTitles, "title").length === 0

    Initial commit

  • no two pages share a description

    0ae1991 · 2026-09-12

    asserts: dupes(pageDescs, "desc").length === 0

    Initial commit

  • no page advertises another page's URL in its card

    0ae1991 · 2026-09-12

    asserts: siteName === "Motif UI" && wrongCardUrl.length === 0

    Initial commit

  • no page borrows the site tagline as its card title

    0ae1991 · 2026-09-12

    asserts: borrowedTitle.length === 0

    Initial commit

  • every sampled card image resolves to an image

    0ae1991 · 2026-09-12

    asserts: cardSample.length >= 3 && imageIssues.length === 0

    Initial commit

  • no internal link on any page is broken

    0ae1991 · 2026-09-12

    asserts: brokenLinks.length === 0

    Initial commit

  • the one deliberate dead link still 404s

    0ae1991 · 2026-09-12

    asserts: deadLinkStatus.size === 1 && deadLinkStatus.get("/this-page-does-not-exist") === 404

    Initial commit

  • /og/<slug> renders the … cardruns per item

    0ae1991 · 2026-09-12

    asserts: card.status === 200 && (card.headers.get("content-type") || "").includes("image/png")

    Initial commit

  • /roadmap labels every bet's status

    0ae1991 · 2026-09-12

    asserts: 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-12

    asserts: 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-12

    asserts: missingApi.status === 404

    Initial commit

  • /api/v1/audit serves every asset's scores

    0ae1991 · 2026-09-12

    asserts: 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-12

    asserts: 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-12

    asserts: 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-12

    asserts: canonical === expected

    Initial commit

  • /brand/logo redraws the header's mark

    0ae1991 · 2026-09-12

    asserts: 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-12

    asserts: 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-12

    asserts: brandVoice.status === 200 && brandVoice.text.includes("live hits")

    Initial commit

  • no banned overclaim term survives the context rule

    0ae1991 · 2026-09-12

    asserts: dictionary.length >= 15 && negation !== null && liveHits.length === 0

    Initial commit

  • /brand/launch separates shipped from left-out

    0ae1991 · 2026-09-12

    asserts: 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-12

    asserts: proof.status === 200 && proof.text.includes("invented handle")

    Initial commit

  • /brand/notes derives its lines from the changelog

    0ae1991 · 2026-09-12

    asserts: 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-12

    asserts: metrics.status === 200 && metrics.text.includes("counts visitors")

    Initial commit

  • /brand/mascot shows three poses

    0ae1991 · 2026-09-12

    asserts: 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-12

    asserts: notFound.status === 404 && notFound.text.includes("mascot-404")

    Initial commit

  • /brand/wallpapers links three downloads

    0ae1991 · 2026-09-12

    asserts: walls.status === 200 && (walls.text.match(/\/api\/brand\//g) || []).length >= 3

    Initial commit

  • /api/brand/… serves SVGruns per item

    0ae1991 · 2026-09-12

    asserts: art.status === 200 && (art.headers.get("content-type") || "").includes("svg") && body.startsWith("<svg")

    Initial commit

  • /brand/watermark prints the snippet

    0ae1991 · 2026-09-12

    asserts: watermark.status === 200 && watermark.text.includes("Made with Motif")

    Initial commit

  • /brand/thanks lists the three first steps

    0ae1991 · 2026-09-12

    asserts: 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-12

    asserts: paths.status === 200 && pathTitles.every((t) => paths.text.includes(t))

    Initial commit

  • /saved carries the share prompt and the fitness meter

    0ae1991 · 2026-09-12

    asserts: 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-12

    asserts: 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-12

    asserts: stack.text.includes("nope~ghost")

    Initial commit

  • /habits carries the three opt-in panels

    0ae1991 · 2026-09-12

    asserts: 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-12

    asserts: 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-12

    asserts: 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-12

    asserts: 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-12

    asserts: 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-12

    asserts: /globals\.css/.test(lib) && /@theme/.test(lib)

    Initial commit

  • every export is registered in one list

    0ae1991 · 2026-09-12

    asserts: /EXPORTS: ExportEntry\[\]/.test(lib)

    Initial commit

  • hub 200

    0ae1991 · 2026-09-12

    asserts: hub.status === 200

    Initial commit

  • hub links every export file by name

    0ae1991 · 2026-09-12

    asserts: EXPORT_FILES.every((f) => hub.text.includes(f))

    Initial commit

  • hub names the remainders instead of hiding them

    0ae1991 · 2026-09-12

    asserts: hub.text.includes("What is still missing, and inside which feature")

    Initial commit

  • hub lists all five remainders

    0ae1991 · 2026-09-12

    asserts: ["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-12

    asserts: res.status === 200 && res.type.length > 0

    Initial commit

  • an unknown export returns 404

    0ae1991 · 2026-09-12

    asserts: missing.status === 404

    Initial commit

  • tokens have colours and radii

    0ae1991 · 2026-09-12

    asserts: Object.keys(tokens.color).length >= 10 && Object.keys(tokens.radius).length >= 3

    Initial commit

  • catalog carries every component, and /quality agrees

    0ae1991 · 2026-09-12

    asserts: catalog.components.length > 100 && catalog.components.length === printed

    Initial commit

  • sitemap lists every component page

    0ae1991 · 2026-09-12

    asserts: comps === catalog.components.length + 4

    Initial commit

  • the motion contract states the three rules

    0ae1991 · 2026-09-12

    asserts: 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-12

    asserts: moving.size > 0 && inCatalog.length === moving.size

    Initial commit

  • the share-card route marks animated demos as stills

    0ae1991 · 2026-09-12

    asserts: 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-12

    asserts: 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-12

    asserts: 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-12

    asserts: fed > 0 && fed === listed

    Initial commit

  • bookmarklet reads custom properties and sends nothing

    0ae1991 · 2026-09-12

    asserts: 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-12

    asserts: ["list", "tokens", "badge"].every((c) => cli.text.includes(`${c}(`))

    Initial commit

  • cli names the URL when a request fails

    0ae1991 · 2026-09-12

    asserts: cli.text.includes("could not reach")

    Initial commit

  • cli does not claim to be published

    0ae1991 · 2026-09-12

    asserts: /not published to npm/i.test(cli.text)

    Initial commit

  • badge serves SVG

    0ae1991 · 2026-09-12

    asserts: badge.status === 200 && badge.type.startsWith("image/svg+xml")

    Initial commit

  • badge carries the stored score

    0ae1991 · 2026-09-12

    asserts: badge.text.includes(`>${tilt.qualityScore}</text>`)

    Initial commit

  • badge says no pipeline stands behind it

    0ae1991 · 2026-09-12

    asserts: /No CI service/.test(badge.text)

    Initial commit

  • unknown badge returns 404

    0ae1991 · 2026-09-12

    asserts: badgeMissing.status === 404

    Initial commit

  • every sampled badge agrees with the catalog score

    0ae1991 · 2026-09-12

    asserts: agree === sample.length

    Initial commit

  • embed route renders a demo with attribution

    0ae1991 · 2026-09-12

    asserts: embed.status === 200 && embed.text.includes("Motif UI")

    Initial commit

  • embed route sends frame-ancestors and noindex

    0ae1991 · 2026-09-12

    asserts: 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-12

    asserts: rules.length >= 5 && unknownRules.length === 0

    Initial commit

  • every documented Cache-Control rule is the one the server sends

    0ae1991 · 2026-09-12

    asserts: checked === rules.length && wrong.length === 0

    Initial commit

  • the catch-all is first, so every specific rule wins over it

    0ae1991 · 2026-09-12

    asserts: order[0] === "/:path*" && order.filter((s) => s === "/:path*").length === 1

    Initial commit

  • page … 200runs per item

    0ae1991 · 2026-09-12

    asserts: res.status === 200

    Initial commit

  • print page prints the block it serves

    0ae1991 · 2026-09-12

    asserts: printPage.text.includes("@media print") && printPage.text.includes("break-inside")

    Initial commit

  • tokens page prints the colours the endpoint serves

    0ae1991 · 2026-09-12

    asserts: Object.keys(tokens.color).every((k) => tokensPage.includes(`--color-${k}`))

    Initial commit

  • badge page says it is not a CI badge

    0ae1991 · 2026-09-12

    asserts: /not a CI badge/.test(badgePage.text.replace(/<!-- -->/g, ""))

    Initial commit

  • footer links to /integrations

    0ae1991 · 2026-09-12

    asserts: home.text.includes('href="/integrations"')

    Initial commit

  • the prompt pack carries every brief in the catalog (#71)

    92c12f2 · 2026-09-12

    asserts: 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-12

    asserts: 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-12

    asserts: 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-12

    asserts: 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-12

    asserts: 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-12

    asserts: 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-12

    asserts: feed.status === 200 && feed.text.includes("motif:learn") && feed.text.includes(probe.replace(/&/g, "&amp;").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-12

    asserts: printed

    Bank 3 batch 5: Learn platform features (items 101-125)

  • served essays anchor every h2 with unique ids (#115)

    315a871 · 2026-09-12

    asserts: 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-12

    asserts: 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-12

    asserts: 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-12

    asserts: mains === 1 && skip

    Bank 3 batch 16: accessibility pass (items 371-395)

  • the dialog fixture declares its semantics (#389)

    823b74d · 2026-09-12

    asserts: /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-12

    asserts: 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-12

    asserts: !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-12

    asserts: 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-12

    asserts: 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-12

    asserts: words > 9000

    Bank 3 batch 18: gates & harness pass (items 421-445)

  • the harness catches an intentional failure (#434)

    50b0326 · 2026-09-12

    asserts: selfCaught

    Bank 3 batch 18: gates & harness pass (items 421-445)

  • the golden fragment survives on the reference page (#441)

    50b0326 · 2026-09-12

    asserts: 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-12

    asserts: 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-12

    asserts: searchOk

    Bank 3 batch 18: gates & harness pass (items 421-445)

  • the prompt pack carries its schema (#444)

    50b0326 · 2026-09-12

    asserts: 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-12

    asserts: anys === 0

    Bank 3 batch 18: gates & harness pass (items 421-445)

  • /quality links what the harness cannot see (#439)

    50b0326 · 2026-09-12

    asserts: 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-12

    asserts: 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-12

    asserts: unfetched.length === 0

    Bank 3 batch 18: gates & harness pass (items 421-445)

  • export-all carries the family registry (#459)

    0fb33d3 · 2026-09-12

    asserts: 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-12

    asserts: 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-12

    asserts: 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-12

    asserts: 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-12

    asserts: 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-12

    asserts: 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-12

    asserts: 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:demosthe demo registry, the catalog and the suggestion register

66 calls · 10.1s

  • every demo key has a loader in the registry

    0ae1991 · 2026-09-12

    asserts: keys.every((k) => loaders.has(k))

    Initial commit

  • no loader is missing from the key list

    0ae1991 · 2026-09-12

    asserts: staleKeys.length === 0

    Initial commit

  • every loader names a component its module exports

    0ae1991 · 2026-09-12

    asserts: missingExports.length === 0

    Initial commit

  • every scene component a module exports is named by a loader

    0ae1991 · 2026-09-12

    asserts: unclaimed.length === 0 && duplicated.length === 0

    Initial commit

  • every helper a scene module exports is imported somewhere

    0ae1991 · 2026-09-12

    asserts: unusedHelpers.length === 0

    Initial commit

  • every catalog entry names a demo that exists

    0ae1991 · 2026-09-12

    asserts: assets.every((c) => keys.includes(c.demo))

    Initial commit

  • every demo in the switch is claimed by an entry

    0ae1991 · 2026-09-12

    asserts: orphans.length === 0

    Initial commit

  • §… claims complete and has every bullet tickedruns per item

    0ae1991 · 2026-09-12

    asserts: bullets === ticked

    Initial commit

  • §…'s shipped count matches its ticked bulletsruns per item

    0ae1991 · 2026-09-12

    asserts: Number(frac[1]) === ticked && Number(frac[2]) === bullets

    Initial commit

  • the ledger table matches its headline

    0ae1991 · 2026-09-12

    asserts: rows === headline + extras && rows > 0

    Initial commit

  • Section 18 is closed before Section 19 opens

    0ae1991 · 2026-09-12

    asserts: /complete \(10\/10 shipped ✅\)/.test(s18Head)

    Initial commit

  • the ledger's Section 17 count matches the scenes verified here

    0ae1991 · 2026-09-12

    asserts: shipped === inSection17

    Initial commit

  • /components/… renders the sceneruns per item

    0ae1991 · 2026-09-12

    asserts: page.status === 200 && page.text.includes(scene.marker)

    Initial commit

  • /embed/… renders it without chromeruns per item

    0ae1991 · 2026-09-12

    asserts: embed.status === 200 && !embed.text.includes('id="mf-logo"')

    Initial commit

  • counter band prints the real totals without JavaScript

    0ae1991 · 2026-09-12

    asserts: 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-12

    asserts: hub.status === 200 && NEW_SCENES.every((s) => hub.text.includes(s.slug))

    Initial commit

  • the catalog endpoint carries them too

    0ae1991 · 2026-09-12

    asserts: NEW_SCENES.every((s) => catalog.components.some((c) => c.slug === s.slug))

    Initial commit

  • the catalog carries the backgrounds as well

    0ae1991 · 2026-09-12

    asserts: catalog.backgrounds.length > 0 && catalog.$generated.backgrounds === catalog.backgrounds.length

    Initial commit

  • … declares the behaviour it shipsruns per item

    0ae1991 · 2026-09-12

    asserts: Boolean(entry) && scene.behaviors.every((b) => entry.behaviors.includes(b))

    Initial commit

  • the motion audit reads the scene modules

    0ae1991 · 2026-09-12

    asserts: audit.scenes === keys.length && audit.moving > 100

    Initial commit

  • every scene that drives motion from JavaScript names the preference

    0ae1991 · 2026-09-12

    asserts: audit.unguarded.length === 0

    Initial commit

  • the built stylesheet carries the site-wide reduced-motion policy

    0ae1991 · 2026-09-12

    asserts: policy.found

    Initial commit

  • /quality/aria prints the split the audit measured

    0ae1991 · 2026-09-12

    asserts: 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-12

    asserts: 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-12

    asserts: 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-12

    asserts: 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-12

    asserts: 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-12

    asserts: embedDocs.status === 200 && embedDocs.text.replace(/<!-- -->/g, "").includes("prefers-reduced-motion")

    Initial commit

  • the motion audit module loads

    0ae1991 · 2026-09-12

    asserts: false

    Initial commit

  • the focus ring clears 3:1 on every flat surface it sits on

    0ae1991 · 2026-09-12

    asserts: rings.length > 0 && rings.every((r) => r.pass)

    Initial commit

  • the built stylesheet carries the forced-colors block

    0ae1991 · 2026-09-12

    asserts: fc.found

    Initial commit

  • /quality/aria lists target-size candidates, labelled as candidates

    0ae1991 · 2026-09-12

    asserts: targets.length > 0

    Initial commit

  • every keyboard declaration has code evidence

    0ae1991 · 2026-09-12

    asserts: kbMissing.length === 0

    Initial commit

  • every drag declaration has code evidence

    0ae1991 · 2026-09-12

    asserts: dgMissing.length === 0

    Initial commit

  • accessible-name fixtures match the built markup

    0ae1991 · 2026-09-12

    asserts: drift.fixtures === NAME_FIXTURES.length && drift.drift.length === 0

    Initial commit

  • no scene reorders visually without explaining its reading order

    0ae1991 · 2026-09-12

    asserts: order.every((u) => u.explained)

    Initial commit

  • /quality/aria prints the focus-ring ratios

    0ae1991 · 2026-09-12

    asserts: 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-12

    asserts: deepText.includes("forced-colors: active")

    Initial commit

  • /quality/aria labels target size as a candidate, not a measurement

    0ae1991 · 2026-09-12

    asserts: deepText.includes("Target size") && deepText.includes("candidates, not measurements")

    Initial commit

  • /quality/aria prints the announced sentences for both live regions

    0ae1991 · 2026-09-12

    asserts: 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-12

    asserts: 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-12

    asserts: 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-12

    asserts: false

    Initial commit

  • /perf/timers publishes the named timer registry

    0ae1991 · 2026-09-12

    asserts: 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-12

    asserts: false

    Initial commit

  • the third bank's numbering is exactly 1..500

    f2f4f25 · 2026-09-12

    asserts: 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-12

    asserts: 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-12

    asserts: 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-12

    asserts: 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-12

    asserts: floors.length === 0

    Bank 3 batch 3: prompt quality levers (items 51-75)

  • every collection matches at least one member

    6930463 · 2026-09-12

    asserts: empty.length === 0

    Bank 3 batch 13: collections & curation (items 301-325)

  • seasonal collection windows are ordered (#310)

    6930463 · 2026-09-12

    asserts: badWindows.length === 0

    Bank 3 batch 13: collections & curation (items 301-325)

  • every pick reason names a member (#317)

    6930463 · 2026-09-12

    asserts: orphanReasons.length === 0

    Bank 3 batch 13: collections & curation (items 301-325)

  • every catalog entry carries at least one tag (#346)

    399996c · 2026-09-12

    asserts: untagged.length === 0

    Bank 3 batch 14: search & discovery (items 326-350)

  • studio preferences use the one versioned key (#370)

    a93730d · 2026-09-12

    asserts: 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-12

    asserts: tiny.length === 0

    Bank 3 batch 16: accessibility pass (items 371-395)

  • scenes pairing text with imagery declare a scrim (#382)

    823b74d · 2026-09-12

    asserts: bare.length === 0

    Bank 3 batch 16: accessibility pass (items 371-395)

  • no scene suppresses the focus ring (#383)

    823b74d · 2026-09-12

    asserts: 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-12

    asserts: 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-12

    asserts: 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-12

    asserts: 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-12

    asserts: stale.length === 0

    Audit batch: fix drifted stats band, add catalog-size drift gate

  • no dead exports in src/lib (#428)

    50b0326 · 2026-09-12

    asserts: 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-12

    asserts: 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-12

    asserts: 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-12

    asserts: 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.
Quality barMarkup auditGaps and blocked betsAccessibility statement