toolkit test-bank

Deterministic fixtures for the toolkit QA tools. Each page is a known answer; verify.mjs runs the tools against these URLs and asserts the result against manifest.json. noindex.

FixtureToolPathExpectRuleDefect / note
gold oricoriohappyPASS—Motion is guarded by a prefers-reduced-motion block and uses transform/opacity only.
no-reduced-motion oricoriofailFAILMOTION-1The @media (prefers-reduced-motion: reduce) block is removed — WCAG 2.3.3.
layout-animation oricoriofailREVIEWMOTION-2Transitions height/margin and a keyframe animates width/padding — forces layout every frame.
infinite-spin oricoriofailFAILMOTION-3A 1s linear spinner loops forever with no guard (WCAG 2.2.2). Also pins that looping motion is exempt from the duration budget.
long-duration oricoriofailREVIEWMOTION-4A 900ms one-shot drawer transition — past the budget, and not exempt because it does not loop.
gold axewhappyPASS—Clean, fully accessible baseline.
missing-alt axewfailFAILA11Y-1The portrait has no alt attribute.
low-contrast axewfailFAILA11Y-2Light-grey text (#bdbdbd on #fff) fails 4.5:1.
unlabeled-select axewfailFAILA11Y-3The
empty-link axewfailFAILA11Y-4An with no discernible name.
no-lang axewfailFAILA11Y-5The element has no lang attribute.
empty-button axewfailFAILA11Y-4An icon
contrast-unknown axewedgeREVIEWA11Y-6Text over a gradient — axe cannot resolve the background colour and returns a manual-review item, not a violation. REVIEW, never FAIL: an undecidable check is not a barrier.
gold rapidashhappyPASSPERF-1Small sized image, no blocking — fast.
slow-lcp rapidashfailFAILPERF-14.2s render-blocking script + 1.9 MB hero → LCP poor.
layout-shift rapidashfailFAIL/REVIEWPERF-2A large unsized image injected after paint → CLS.
heavy-page rapidashshowcasePASS/REVIEW/FAIL—Realistic heavy page: 0.5 MB hero + 6 photos + copy. Showcase / viewvee capture.
gold viewveehappycaptureVISUAL-1A normal page — captures cleanly, no challenge; also proves --pdf + --save-html produce artifacts.
bot-challenge viewveefailcaptureVISUAL-1A short interstitial page — viewvee should flag a bot-challenge.
tall-lazy viewveeshowcasecaptureVISUAL-115 lazy-loaded images — a tall full-page capture proves auto-scroll triggered lazy-load.
gold audinohappyPASS—Accessible + fast + layout-clean (hero at natural width, touch-sized controls) — audino overall PASS, and every graded lane actually ran (guards against a false green when tools silently error).
kitchen-sink audinofailFAIL—Missing alt + low contrast (axew FAIL) + 4.2s block + heavy hero (rapidash FAIL) → audino FAIL.
wp-gold xatuhappy—A WordPress page: generator 6.5.2, twentytwentyfour theme, CF7 + Yoast, WP Rocket cache footprint.
wp-divi xatushowcase—A Divi 4 site — /wp-content/themes/Divi + et_pb_ markup; xatu --deep resolves the major from Divi style.css.
not-wp xatuhappy—A non-WordPress control page — no generator, no wp-content paths → NOT WORDPRESS.
wp-divi-fonts timburrfailREVIEW—A Divi page loading Google Fonts from Google — Divi’s default, and a performance and GDPR concern rather than a break, so REVIEW.
wp-divi-css timburrfailFAIL—260KB of inline builder CSS — over the 200KB band, which is what a Divi site with static CSS generation turned off ships on every page view. FAIL, where 60-200KB only REVIEWs.
meta-weak cinccinofailREVIEW—Weak generic title + missing meta description → Cinccino recommends a snippet and applies Yoast meta through the mock WordPress API.
brief-source smearglefailREVIEW—A real source page grounded into a deterministic content brief through the mock compatible LLM.
images-missing-alt sigilyphfailFAIL—Two meaningful images lack alt text while a decorative pixel is ignored; vision suggestions are written through the mock media API.
inventory-rich bibarelhappyPASS—A substantial readable evergreen page with no stale signal → KEEP.
inventory-thin bibarelfailREVIEW—A thin page with no search traffic → PRUNE, proving Bibarel combines content depth and value signals.
readability-hard slowkingfailREVIEW—Dense clinical copy grades REVIEW, then the deterministic rewrite lowers the measured reading grade and preserves the reviewable rewrite artifact.
meta-strong cinccinohappyPASS—Title and meta description both carry the keyword and sit inside the SERP length bands → PASS. The recommendation is still written, which is the point: cinccino rewrites a good snippet too, it just does not call it a defect.
meta-absent cinccinofailFAIL—No element at all — the one snippet defect cinccino calls a FAIL, because there is nothing for a search engine to show. Distinct from meta-weak, where a weak title only REVIEWs.</td></tr> <tr><td><a href="./content-write/images-described.html">images-described</a></td> <td>sigilyph</td><td class="p-happy">happy</td><td>PASS</td><td>—</td><td>Every content image has real alt text, and the decorative pixel keeps its empty alt → PASS. Pins that a correct empty alt is not counted as missing.</td></tr> <tr><td><a href="./content-write/images-partial-alt.html">images-partial-alt</a></td> <td>sigilyph</td><td class="p-edge">edge</td><td>REVIEW</td><td>—</td><td>One of three content images lacks alt — under the >5 count and under the half-the-images ratio, so REVIEW. Both thresholds must be under to land here, which is what makes this the fixture that pins them.</td></tr> <tr><td><a href="./content-write/readability-ideal.html">readability-ideal</a></td> <td>slowking</td><td class="p-happy">happy</td><td>PASS</td><td>—</td><td>Plain-language copy inside the ideal reading band → PASS. The complement of readability-hard: without it, nothing proved slowking can leave good copy alone.</td></tr> <tr><td><a href="./content-write/readability-tooshort.html">readability-tooshort</a></td> <td>slowking</td><td class="p-edge">edge</td><td>INFO</td><td>—</td><td>Under 50 words of body text — INFO, never PASS. A readability score over two sentences is noise, and reporting it as a clean read would be worse than saying nothing.</td></tr> <tr><td><a href="./content-write/brief-aligned.html">brief-aligned</a></td> <td>smeargle</td><td class="p-happy">happy</td><td>PASS</td><td>—</td><td>A page that already meets the brief — title, meta, one H1, the recommended sections, and past the word-count target → PASS. Nothing proved smeargle could return one.</td></tr> <tr><td><a href="./content-write/brief-no-h1.html">brief-no-h1</a></td> <td>smeargle</td><td class="p-fail">fail</td><td>FAIL</td><td>—</td><td>The same page with no H1 — the single hard on-page gap smeargle FAILs on, where every other gap against the brief is a warn or a note.</td></tr> <tr><td><a href="./brand-voice/voice-gold.html">voice-gold</a></td> <td>primarina</td><td class="p-happy">happy</td><td>PASS</td><td>—</td><td>Approved terminology, short mobile copy and sentence-case heading → PASS.</td></tr> <tr><td><a href="./brand-voice/voice-dense.html">voice-dense</a></td> <td>primarina</td><td class="p-fail">fail</td><td>FAIL</td><td>—</td><td>One page violates the approved claim, terminology, density and heading-case gates.</td></tr> <tr><td><a href="./brand-voice/voice-review.html">voice-review</a></td> <td>primarina</td><td class="p-review">review</td><td>REVIEW</td><td>—</td><td>Density and heading style need editorial review without a forbidden claim.</td></tr> <tr><td><a href="./brand-voice/voice-rewrite-dry-run.html">voice-rewrite-dry-run</a></td> <td>zoroark</td><td class="p-happy">happy</td><td>INFO</td><td>—</td><td>Creates the exact reviewable rewrite prompt without calling a model or touching source content.</td></tr> <tr><td><a href="./brand-voice/voice-rewrite-pass.html">voice-rewrite-pass</a></td> <td>zoroark</td><td class="p-happy">happy</td><td>PASS</td><td>—</td><td>A mocked rewrite preserves required language and clears all deterministic gates.</td></tr> <tr><td><a href="./brand-voice/voice-rewrite-review.html">voice-rewrite-review</a></td> <td>zoroark</td><td class="p-review">review</td><td>REVIEW</td><td>—</td><td>A mocked rewrite preserves invariants but returns review-level density and heading findings.</td></tr> <tr><td><a href="./brand-voice/voice-rewrite-fail.html">voice-rewrite-fail</a></td> <td>zoroark</td><td class="p-fail">fail</td><td>FAIL</td><td>—</td><td>A mocked rewrite omits a required phone number and deterministically fails.</td></tr> <tr><td><a href="./schema/gold.html">gold</a></td> <td>porygon</td><td class="p-happy">happy</td><td>PASS</td><td>—</td><td>Valid, complete Organization + WebSite JSON-LD.</td></tr> <tr><td><a href="./schema/bad-json.html">bad-json</a></td> <td>porygon</td><td class="p-fail">fail</td><td>FAIL</td><td>—</td><td>Invalid JSON-LD → parse error.</td></tr> <tr><td><a href="./schema/missing-req.html">missing-req</a></td> <td>porygon</td><td class="p-fail">fail</td><td>FAIL</td><td>—</td><td>Product without required "name" → error.</td></tr> <tr><td><a href="./schema/typo-type.html">typo-type</a></td> <td>porygon</td><td class="p-fail">fail</td><td>REVIEW</td><td>—</td><td>Misspelled @type "Prodct" → type-name warning.</td></tr> <tr><td><a href="./schema/none.html">none</a></td> <td>porygon</td><td class="p-happy">happy</td><td>REVIEW</td><td>—</td><td>No structured data at all → REVIEW.</td></tr> <tr><td><a href="./seo/onpage-gold.html">onpage-gold</a></td> <td>orbeetle</td><td class="p-happy">happy</td><td>PASS</td><td>—</td><td>All on-page signals present and well-formed.</td></tr> <tr><td><a href="./seo/onpage-fail.html">onpage-fail</a></td> <td>orbeetle</td><td class="p-fail">fail</td><td>FAIL</td><td>—</td><td>No <title> and no <h1> → errors.</td></tr> <tr><td><a href="./seo/onpage-review.html">onpage-review</a></td> <td>orbeetle</td><td class="p-fail">fail</td><td>REVIEW</td><td>—</td><td>Short title, no meta description, two H1s → review.</td></tr> <tr><td><a href="./seo/header-noindex.html">header-noindex</a></td> <td>orbeetle</td><td class="p-fail">fail</td><td>REVIEW</td><td>—</td><td>Clean HTML but served with an X-Robots-Tag: noindex header — orbeetle 2.4.0 reads the header (invisible in HTML) → REVIEW.</td></tr> <tr><td><a href="./seo/canonical-broken.html">canonical-broken</a></td> <td>orbeetle</td><td class="p-fail">fail</td><td>REVIEW</td><td>—</td><td>rel=canonical points at a 404 — orbeetle fetches it and flags the broken canonical → REVIEW.</td></tr> <tr><td><a href="./seo/og-image-broken.html">og-image-broken</a></td> <td>orbeetle</td><td class="p-fail">fail</td><td>REVIEW</td><td>—</td><td>og:image 404s — orbeetle fetches the share image and flags it as broken → REVIEW.</td></tr> <tr><td><a href="./content/clean.html">clean</a></td> <td>unown</td><td class="p-happy">happy</td><td>PASS</td><td>—</td><td>Clean copy — no misspellings.</td></tr> <tr><td><a href="./content/typos.html">typos</a></td> <td>unown</td><td class="p-fail">fail</td><td>REVIEW</td><td>—</td><td>recieve / mesage / definately / busness → suspected misspellings.</td></tr> <tr><td><a href="./content/clinical.html">clinical</a></td> <td>unown</td><td class="p-happy">happy</td><td>PASS</td><td>—</td><td>Clinical vocabulary, possessives and a suspended compound — every word CORRECT. Guards issue #192: without the bundled allowlists dictionary-en reads the whole page as misspellings and the real typos get buried.</td></tr> <tr><td><a href="./analytics/gold.html">gold</a></td> <td>ampharos</td><td class="p-happy">happy</td><td>PASS</td><td>—</td><td>GA4 (once) + GTM with dataLayer → tracked and clean → PASS.</td></tr> <tr><td><a href="./analytics/ua-legacy.html">ua-legacy</a></td> <td>ampharos</td><td class="p-fail">fail</td><td>FAIL</td><td>—</td><td>Dead Universal Analytics (UA-…/analytics.js) still present → error → FAIL.</td></tr> <tr><td><a href="./analytics/double-ga4.html">double-ga4</a></td> <td>ampharos</td><td class="p-fail">fail</td><td>FAIL</td><td>—</td><td>Same GA4 property configured twice → double-counting → FAIL.</td></tr> <tr><td><a href="./analytics/pixel-only.html">pixel-only</a></td> <td>ampharos</td><td class="p-fail">fail</td><td>REVIEW</td><td>—</td><td>Meta pixel but no GA4/GTM → no first-party measurement → REVIEW.</td></tr> <tr><td><a href="./analytics/openai-pixel.html">openai-pixel</a></td> <td>ampharos</td><td class="p-fail">fail</td><td>REVIEW</td><td>—</td><td>OpenAI (ChatGPT) Ads pixel but no GA4/GTM → marketing-only → REVIEW.</td></tr> <tr><td><a href="./analytics/stackadapt-pixel.html">stackadapt-pixel</a></td> <td>ampharos</td><td class="p-fail">fail</td><td>REVIEW</td><td>—</td><td>StackAdapt pixel but no GA4/GTM → marketing-only → REVIEW.</td></tr> <tr><td><a href="./analytics/untracked.html">untracked</a></td> <td>ampharos</td><td class="p-fail">fail</td><td>REVIEW</td><td>—</td><td>No analytics or tag manager at all → REVIEW (is this page measured?).</td></tr> <tr><td><a href="./analytics/staging-neutralised.html">staging-neutralised</a></td> <td>ampharos</td><td class="p-happy">happy</td><td>PASS</td><td>—</td><td>Staging declares dedicated GA4/GTM identifiers, not the production baseline → PASS.</td></tr> <tr><td><a href="./analytics/staging-production-leak.html">staging-production-leak</a></td> <td>ampharos</td><td class="p-fail">fail</td><td>FAIL</td><td>—</td><td>Staging declares the same GA4/GTM IDs as production → production analytics leak → FAIL.</td></tr> <tr><td><a href="./capture-scrub/clean.html">clean</a></td> <td>sableye</td><td class="p-happy">happy</td><td>PASS</td><td>—</td><td>Normal delivered HTML with no configured secret or SSN shape → PASS.</td></tr> <tr><td><a href="./capture-scrub/exposed-key.html">exposed-key</a></td> <td>sableye</td><td class="p-fail">fail</td><td>FAIL</td><td>—</td><td>One syntactically valid but non-live AWS key shape in delivered HTML → FAIL, without unrelated patterns.</td></tr> <tr><td><a href="./capture-scrub/empty-capture.html">empty-capture</a></td> <td>sableye</td><td class="p-edge">edge</td><td>INFO</td><td>—</td><td>A capture with no scannable text artifact → INFO, never a fabricated clean pass.</td></tr> <tr><td><a href="./capture-scrub/unreachable.html">unreachable</a></td> <td>sableye</td><td class="p-edge">edge</td><td>BLOCKED</td><td>—</td><td>An unreadable requested URL → BLOCKED, distinct from a clean capture.</td></tr> <tr><td><a href="./page-artifact/gold.html">gold</a></td> <td>page-artifact</td><td class="p-happy">happy</td><td>INFO</td><td>—</td><td>Full gold page: title/meta/canonical, JSON-LD LocalBusiness, GTM+GA4, a dated paragraph, a NAP line, two headings, two links, one alt-described image.</td></tr> <tr><td><a href="./page-artifact/no-jsonld.html">no-jsonld</a></td> <td>page-artifact</td><td class="p-fail">fail</td><td>INFO</td><td>—</td><td>No JSON-LD anywhere on the page → blocks:0 and the "no structured data" info finding surfaces.</td></tr> <tr><td><a href="./page-artifact/bad-jsonld.html">bad-jsonld</a></td> <td>page-artifact</td><td class="p-fail">fail</td><td>INFO</td><td>—</td><td>Malformed JSON-LD → a parse-error finding names it, rather than the block silently vanishing.</td></tr> <tr><td><a href="./page-artifact/no-canonical.html">no-canonical</a></td> <td>page-artifact</td><td class="p-fail">fail</td><td>INFO</td><td>—</td><td>No rel=canonical link → canonical extracts null, not an empty string.</td></tr> <tr><td><a href="./page-artifact/missing-alt.html">missing-alt</a></td> <td>page-artifact</td><td class="p-fail">fail</td><td>INFO</td><td>—</td><td>The page’s one <img> has no alt attribute → counted as missing.</td></tr> <tr><td><a href="./page-artifact/no-tags.html">no-tags</a></td> <td>page-artifact</td><td class="p-edge">edge</td><td>INFO</td><td>—</td><td>No GTM/GA4 snippet at all → neither tag detected (no false positive).</td></tr> <tr><td><a href="./page-artifact/no-dates.html">no-dates</a></td> <td>page-artifact</td><td class="p-fail">fail</td><td>INFO</td><td>—</td><td>No date signal anywhere on the page → dates.freshest stays null rather than guessed from the header.</td></tr> <tr><td><a href="./page-artifact/no-nap.html">no-nap</a></td> <td>page-artifact</td><td class="p-fail">fail</td><td>INFO</td><td>—</td><td>No visible phone/address AND no LocalBusiness schema → NAP absent on both signals.</td></tr> <tr><td><a href="./analytics-gtm/gold.js">gold</a></td> <td>beru</td><td class="p-happy">happy</td><td>PASS</td><td>—</td><td>Clean GA4 + Conversion Linker + listeners, all firing → PASS (destinations G-GOLD1234567).</td></tr> <tr><td><a href="./analytics-gtm/legacy-ua.js">legacy-ua</a></td> <td>beru</td><td class="p-fail">fail</td><td>FAIL</td><td>—</td><td>Legacy Universal Analytics tag in the container → FAIL.</td></tr> <tr><td><a href="./analytics-gtm/custom-html.js">custom-html</a></td> <td>beru</td><td class="p-fail">fail</td><td>REVIEW</td><td>—</td><td>Custom HTML + community template tags → REVIEW.</td></tr> <tr><td><a href="./analytics-gtm/bloated.js">bloated</a></td> <td>beru</td><td class="p-fail">fail</td><td>REVIEW</td><td>—</td><td>35 active tags → tag bloat → REVIEW.</td></tr> <tr><td><a href="./analytics-gtm/orphan.js">orphan</a></td> <td>beru</td><td class="p-fail">fail</td><td>REVIEW</td><td>—</td><td>Tag index 1 is referenced by no firing rule → orphaned/dead tag → REVIEW.</td></tr> <tr><td><a href="./analytics-gtm/custom-html-pixel.js">custom-html-pixel</a></td> <td>beru</td><td class="p-fail">fail</td><td>REVIEW</td><td>—</td><td>Custom HTML tag carries a Meta fbq init — Beru inspects vtp_html and surfaces the real vendor → REVIEW (Custom HTML + vendor discovered).</td></tr> <tr><td><a href="./copy/gold.html">gold</a></td> <td>oranguru</td><td class="p-happy">happy</td><td>PASS</td><td>—</td><td>Substantial, readable grade-8–10 copy; H1 differs from title; no placeholder → PASS.</td></tr> <tr><td><a href="./copy/thin.html">thin</a></td> <td>oranguru</td><td class="p-fail">fail</td><td>FAIL</td><td>—</td><td>Barely any words (below the 150-word floor) → thin content → FAIL.</td></tr> <tr><td><a href="./copy/placeholder.html">placeholder</a></td> <td>oranguru</td><td class="p-fail">fail</td><td>FAIL</td><td>—</td><td>Substantial copy but with leftover lorem-ipsum / [insert … here] placeholder text → FAIL.</td></tr> <tr><td><a href="./copy/hard-read.html">hard-read</a></td> <td>oranguru</td><td class="p-fail">fail</td><td>REVIEW</td><td>—</td><td>Dense clinical jargon and long sentences push the reading grade well past the 6–12 band → REVIEW.</td></tr> <tr><td><a href="./copy/long-sentences.html">long-sentences</a></td> <td>oranguru</td><td class="p-fail">fail</td><td>REVIEW</td><td>—</td><td>A high share of 30–60-word sentences → long-sentence density warning (oranguru 1.1.0) → REVIEW.</td></tr> <tr><td><a href="./copy/h1-dup.html">h1-dup</a></td> <td>oranguru</td><td class="p-fail">fail</td><td>REVIEW</td><td>—</td><td>The H1 is identical to the <title> — narrows keyword coverage → REVIEW.</td></tr> <tr><td><a href="./links/gold.html">gold</a></td> <td>klink</td><td class="p-happy">happy</td><td>PASS</td><td>—</td><td>All links resolve (200) at their canonical URLs, descriptive anchor text, https external, images have alt → PASS.</td></tr> <tr><td><a href="./links/broken-link.html">broken-link</a></td> <td>klink</td><td class="p-fail">fail</td><td>FAIL</td><td>—</td><td>A link to a path that 404s → broken link → FAIL.</td></tr> <tr><td><a href="./links/broken-image.html">broken-image</a></td> <td>klink</td><td class="p-fail">fail</td><td>FAIL</td><td>—</td><td>An <img> whose src 404s → broken image → FAIL.</td></tr> <tr><td><a href="./links/click-here.html">click-here</a></td> <td>klink</td><td class="p-fail">fail</td><td>REVIEW</td><td>—</td><td>Every link uses generic anchor text (click here / read more / here) → REVIEW.</td></tr> <tr><td><a href="./links/mixed-content.html">mixed-content</a></td> <td>klink</td><td class="p-fail">fail</td><td>REVIEW</td><td>—</td><td>Insecure http:// script/stylesheet/iframe on an https page → active mixed content (klink 1.1.0) → REVIEW.</td></tr> <tr><td><a href="./links/insecure-external.html">insecure-external</a></td> <td>klink</td><td class="p-fail">fail</td><td>REVIEW</td><td>—</td><td>An external link over insecure http:// → REVIEW.</td></tr> <tr><td><a href="./links/internal-redirect.html">internal-redirect</a></td> <td>klink</td><td class="p-fail">fail</td><td>REVIEW</td><td>KLK-INTERNAL-REDIRECT</td><td>Gold plus one internal link authored as /site/contact.html, which the host 308-redirects to /site/contact → internal link resolves only through a redirect (klink 2.2.0) → REVIEW, not broken.</td></tr> <tr><td><a href="./links/tracking-params.html">tracking-params</a></td> <td>klink</td><td class="p-fail">fail</td><td>REVIEW</td><td>KLK-TRACKING-PARAMS</td><td>Gold plus one internal link carrying utm_source + gclid → tracking parameters on an internal link (klink 2.2.0) → REVIEW; it resolves 200 directly, so no redirect finding.</td></tr> <tr><td><a href="./links/expect-match.html">expect-match</a></td> <td>klink</td><td class="p-happy">happy</td><td>PASS</td><td>—</td><td>The gold page graded against an expected-target map whose every rule matches where the link lands → PASS (the negative control for wrong-target).</td></tr> <tr><td><a href="./links/wrong-target.html">wrong-target</a></td> <td>klink</td><td class="p-fail">fail</td><td>FAIL</td><td>KLK-WRONG-TARGET</td><td>The gold page with a map claiming "about our dental practice" must land on /site/services; it lands on /site/about → wrong target (klink 2.3.0) → FAIL, though every link answers 200.</td></tr> <tr><td><a href="./layout/gold.html">gold</a></td> <td>conkeldurr</td><td class="p-happy">happy</td><td>PASS</td><td>—</td><td>Clean layout — no overflow, ≥24px targets, ≥12px fonts, proper heading order, small DOM → PASS.</td></tr> <tr><td><a href="./layout/overflow.html">overflow</a></td> <td>conkeldurr</td><td class="p-fail">fail</td><td>FAIL</td><td>—</td><td>A 3000px-wide block forces horizontal scroll (content wider than the screen) → FAIL.</td></tr> <tr><td><a href="./layout/tiny-tap.html">tiny-tap</a></td> <td>conkeldurr</td><td class="p-fail">fail</td><td>REVIEW</td><td>—</td><td>Interactive elements ~18–20px (below the 24px floor), normal fonts → tap-target REVIEW.</td></tr> <tr><td><a href="./layout/tiny-font.html">tiny-font</a></td> <td>conkeldurr</td><td class="p-fail">fail</td><td>REVIEW</td><td>—</td><td>A 9px paragraph (below the 12px floor); everything else fine → tiny-font REVIEW.</td></tr> <tr><td><a href="./layout/heading-skip.html">heading-skip</a></td> <td>conkeldurr</td><td class="p-fail">fail</td><td>REVIEW</td><td>—</td><td>Heading levels jump h1→h3 (no h2) → heading-skip REVIEW.</td></tr> <tr><td><a href="./layout/dom-bloat.html">dom-bloat</a></td> <td>conkeldurr</td><td class="p-fail">fail</td><td>REVIEW</td><td>—</td><td>~2200+ DOM nodes (above the 1,500 soft ceiling) → dom-bloat REVIEW.</td></tr> <tr><td><a href="./layout/hover-focus-contrast.html">hover-focus-contrast</a></td> <td>conkeldurr</td><td class="p-fail">fail</td><td>REVIEW</td><td>—</td><td>A link whose :hover swaps to near-white-on-white (17.4:1 → 1.09:1) and a button whose :focus does the same (→ 1.01:1) — both pass at rest. A control link that safely darkens further on :hover must NOT be flagged.</td></tr> <tr><td><a href="./layout/mobile-nav-broken.html">mobile-nav-broken</a></td> <td>conkeldurr</td><td class="p-fail">fail</td><td>FAIL</td><td>—</td><td>A hamburger with the correct aria-expanded/aria-controls markup and no click listener — the toggle is findable and clickable, and clicking it reveals nothing. A header with no working navigation below the breakpoint, invisible on desktop.</td></tr> <tr><td><a href="./layout/mobile-nav-working.html">mobile-nav-working</a></td> <td>conkeldurr</td><td class="p-happy">happy</td><td>PASS</td><td>—</td><td>The control: the same accessible hamburger markup, but the click listener survived — clicking it reveals the menu and flips aria-expanded. Proves the check is scoped to a confirmed failure, not "any hamburger present".</td></tr> <tr><td><a href="./local/gold.html">gold</a></td> <td>nosepass</td><td class="p-happy">happy</td><td>PASS</td><td>—</td><td>Complete LocalBusiness JSON-LD (name/address/phone/hours/geo) + matching tel: link → PASS.</td></tr> <tr><td><a href="./local/no-schema.html">no-schema</a></td> <td>nosepass</td><td class="p-fail">fail</td><td>PASS</td><td>—</td><td>Visible NAP but no LocalBusiness structured data, unrendered → info-level, not gating (PASS).</td></tr> <tr><td><a href="./local/nap-mismatch.html">nap-mismatch</a></td> <td>nosepass</td><td class="p-fail">fail</td><td>FAIL</td><td>—</td><td>Schema phone +1-555-0100 ≠ tel: +1-555-9999 → inconsistent NAP → FAIL.</td></tr> <tr><td><a href="./local/missing-phone.html">missing-phone</a></td> <td>nosepass</td><td class="p-fail">fail</td><td>REVIEW</td><td>—</td><td>LocalBusiness with name + address but no phone anywhere → REVIEW.</td></tr> <tr><td><a href="./perf-fix/clean.html">clean</a></td> <td>reuniclus</td><td class="p-happy">happy</td><td>PASS</td><td>—</td><td>Images carry loading=lazy, explicit width/height and alt; no webfont issue — nothing to fix.</td></tr> <tr><td><a href="./perf-fix/img-lazy.html">img-lazy</a></td> <td>reuniclus</td><td class="p-fail">fail</td><td>REVIEW</td><td>—</td><td>An <img> with no loading="lazy" → IMG-LAZY.</td></tr> <tr><td><a href="./perf-fix/img-dims.html">img-dims</a></td> <td>reuniclus</td><td class="p-fail">fail</td><td>REVIEW</td><td>—</td><td>An <img> with no width/height → IMG-DIMS (layout shift).</td></tr> <tr><td><a href="./perf-fix/img-alt.html">img-alt</a></td> <td>reuniclus</td><td class="p-fail">fail</td><td>FAIL</td><td>—</td><td>An <img> with no alt attribute → IMG-ALT. The only FAIL-level lane: missing alt is an accessibility defect, not a perf nicety. Hands off to sigilyph.</td></tr> <tr><td><a href="./perf-fix/font-web.html">font-web</a></td> <td>reuniclus</td><td class="p-fail">fail</td><td>REVIEW</td><td>—</td><td>Google Fonts loaded without display=swap → FONT-WEB (render-blocking).</td></tr> <tr><td><a href="./forms/gold.html">gold</a></td> <td>kecleon</td><td class="p-happy">happy</td><td>PASS</td><td>—</td><td>Labelled fields, a honeypot, and a submit button nothing covers — the baseline a conversion path should meet.</td></tr> <tr><td><a href="./forms/overlay-submit.html">overlay-submit</a></td> <td>kecleon</td><td class="p-fail">fail</td><td>FAIL</td><td>FORM-1</td><td>A fixed cookie banner sits on top of the submit button — the classic silent conversion killer, invisible to any static HTML scan.</td></tr> <tr><td><a href="./forms/disabled-submit.html">disabled-submit</a></td> <td>kecleon</td><td class="p-fail">fail</td><td>REVIEW</td><td>FORM-2</td><td>The submit button ships disabled with a consent checkbox above it. REVIEW not FAIL: it may legitimately enable on tick, which a static probe cannot know.</td></tr> <tr><td><a href="./forms/unlabelled-fields.html">unlabelled-fields</a></td> <td>kecleon</td><td class="p-fail">fail</td><td>REVIEW</td><td>FORM-3</td><td>Inputs with no label, aria-label or placeholder — a screen reader announces an unnamed edit box.</td></tr> <tr><td><a href="./forms/no-spam-protection.html">no-spam-protection</a></td> <td>kecleon</td><td class="p-fail">fail</td><td>REVIEW</td><td>FORM-4</td><td>A well-built form with no honeypot or CAPTCHA signal. Pins that the spam check fires on its own, without dragging other findings in.</td></tr> <tr><td><a href="./forms/weak-inline-validation.html">weak-inline-validation</a></td> <td>kecleon</td><td class="p-fail">fail</td><td>REVIEW</td><td>FORM-5</td><td>Email accepts an incomplete domain and telephone accepts letters. The form looks complete but gives no inline constraint before submission.</td></tr> <tr><td><a href="./forms/no-form.html">no-form</a></td> <td>kecleon</td><td class="p-edge">edge</td><td>INFO</td><td>—</td><td>A page with no form at all — INFO, not a failure. Nothing to submit is not the same as a broken submit.</td></tr> <tr><td><a href="./copy-scout/clean.html">clean</a></td> <td>patrat</td><td class="p-happy">happy</td><td>PASS</td><td>—</td><td>The searched phrase appears nowhere on the page — PASS.</td></tr> <tr><td><a href="./copy-scout/departed-provider.html">departed-provider</a></td> <td>patrat</td><td class="p-fail">fail</td><td>REVIEW</td><td>SCOUT-1</td><td>A departed provider is still named in the body copy — the liability case patrat exists to find before a copy change.</td></tr> <tr><td><a href="./promo/gold.html">gold</a></td> <td>chimecho</td><td class="p-happy">happy</td><td>PASS</td><td>—</td><td>Service copy with no promotional dates at all — nothing to expire.</td></tr> <tr><td><a href="./promo/explicit-expired.html">explicit-expired</a></td> <td>chimecho</td><td class="p-fail">fail</td><td>FAIL</td><td>PROMO-1</td><td>The copy states its own end date and that date has passed — certain, so it FAILS.</td></tr> <tr><td><a href="./promo/explicit-in-date.html">explicit-in-date</a></td> <td>chimecho</td><td class="p-edge">edge</td><td>PASS</td><td>—</td><td>Same shape as the FAIL fixture but the stated date is still ahead — pins that a live promo is not flagged, which is the false-positive that would get the skill switched off.</td></tr> <tr><td><a href="./promo/implied-season.html">implied-season</a></td> <td>chimecho</td><td class="p-fail">fail</td><td>REVIEW</td><td>PROMO-2</td><td>A summer sale in November. REVIEW, never FAIL — it might be a permanent product name, and the skill must not pretend to know.</td></tr> <tr><td><a href="./promo/undated-urgency.html">undated-urgency</a></td> <td>chimecho</td><td class="p-fail">fail</td><td>REVIEW</td><td>PROMO-3</td><td>Urgency with no date anywhere. Not expired — unverifiable. Pins that it fires on its own without dragging the dated classes in.</td></tr> <tr><td><a href="./promo/block-boundary.html">block-boundary</a></td> <td>chimecho</td><td class="p-edge">edge</td><td>PASS</td><td>—</td><td>A heading ending "Specials" directly above a paragraph starting "Holiday" — the block-boundary false positive that made the extractor read the phantom pair "Specials Holiday". Must stay clean.</td></tr> <tr><td><a href="./embeds/gold.html">gold</a></td> <td>barbaracle</td><td class="p-happy">happy</td><td>PASS</td><td>—</td><td>A map embed that lays out at full size and carries resolved coordinates — the healthy baseline.</td></tr> <tr><td><a href="./embeds/collapsed-feed.html">collapsed-feed</a></td> <td>barbaracle</td><td class="p-fail">fail</td><td>FAIL</td><td>EMBED-1</td><td>An Instagram feed collapsed to 0x0 — the widget whose JavaScript failed, which is the single most common form of this ticket.</td></tr> <tr><td><a href="./embeds/srcless-frame.html">srcless-frame</a></td> <td>barbaracle</td><td class="p-fail">fail</td><td>REVIEW</td><td>EMBED-2</td><td>A review widget with data-src but no src — the lazy-load activator never ran. REVIEW, not FAIL: below the fold that can be normal, and claiming to know which would be a guess.</td></tr> <tr><td><a href="./embeds/hidden-embed.html">hidden-embed</a></td> <td>barbaracle</td><td class="p-edge">edge</td><td>PASS</td><td>—</td><td>A map inside a display:none accordion. Listed but NOT graded — reporting a deliberately-collapsed widget as broken is the false positive that gets a recurring check ignored.</td></tr> <tr><td><a href="./embeds/no-embeds.html">no-embeds</a></td> <td>barbaracle</td><td class="p-edge">edge</td><td>INFO</td><td>—</td><td>A page with no third-party embeds. INFO, never PASS — nothing was audited, which is not the same as nothing being wrong.</td></tr> <tr><td><a href="./embeds/laid-out.html">laid-out</a></td> <td>barbaracle</td><td class="p-edge">edge</td><td>PASS</td><td>—</td><td>An iframe that lays out at full size is reported PASS even though nothing in the parent frame can see inside it. Pins the documented limit honestly: a PASS means the container is healthy, not that the content is right.</td></tr> <tr><td><a href="./gallery/gold.html">gold</a></td> <td>furfrou</td><td class="p-happy">happy</td><td>PASS</td><td>—</td><td>Three complete before/after cases, all alt-texted and lazy-loaded — the baseline a gallery should meet.</td></tr> <tr><td><a href="./gallery/broken-image.html">broken-image</a></td> <td>furfrou</td><td class="p-fail">fail</td><td>FAIL</td><td>GAL-1</td><td>One case photo 404s. This is the ticket that got escalated three times — and it FAILs, because a broken image is not a judgement call.</td></tr> <tr><td><a href="./gallery/stretched-cards.html">stretched-cards</a></td> <td>furfrou</td><td class="p-fail">fail</td><td>FAIL</td><td>GAL-4</td><td>All case images load, but a responsive width rule retains a tall fixed height. The gallery must fail because successful decoding does not make visibly stretched or over-cropped cards acceptable.</td></tr> <tr><td><a href="./gallery/unpaired-case.html">unpaired-case</a></td> <td>furfrou</td><td class="p-fail">fail</td><td>REVIEW</td><td>GAL-2</td><td>A before with no after — the half-uploaded case that looks complete to whoever added it. REVIEW, and pinned to fire without dragging the broken-image finding in.</td></tr> <tr><td><a href="./gallery/missing-alt.html">missing-alt</a></td> <td>furfrou</td><td class="p-fail">fail</td><td>REVIEW</td><td>GAL-3</td><td>A gallery with no alt text anywhere — routes to sigilyph rather than being fixed here.</td></tr> <tr><td><a href="./gallery/not-a-gallery.html">not-a-gallery</a></td> <td>furfrou</td><td class="p-edge">edge</td><td>INFO</td><td>—</td><td>An ordinary page with one photo. INFO, never PASS — too few images to be a gallery means nothing was graded.</td></tr> <tr><td><a href="./gallery/scrape.html">scrape</a></td> <td>furfrou</td><td class="p-happy">happy</td><td>REVIEW</td><td>—</td><td>The scrape half (issue #436): a gallery with a srcset ladder, a <picture> element, a video poster and real http images. The inventory must capture the full source ladder and --download must fetch the real files (4 unique http URLs). REVIEW because the 2x srcset source is legitimately flagged oversized.</td></tr> <tr><td><a href="./testimonials/gold.html">gold</a></td> <td>luvdisc</td><td class="p-happy">happy</td><td>PASS</td><td>—</td><td>A testimonials section with two real, dated quotes + AggregateRating schema — the baseline a reviews section should meet.</td></tr> <tr><td><a href="./testimonials/empty-widget.html">empty-widget</a></td> <td>luvdisc</td><td class="p-fail">fail</td><td>FAIL</td><td>TESTI-1</td><td>A review widget whose container paints nothing — the vendor script loaded but the feed returned empty. This is the "review widget is blank / not syncing" ticket.</td></tr> <tr><td><a href="./testimonials/placeholder.html">placeholder</a></td> <td>luvdisc</td><td class="p-fail">fail</td><td>FAIL</td><td>TESTI-2</td><td>A testimonials section full of lorem-ipsum / "testimonial goes here" filler. Reads as fake, which is worse than empty — and pinned to fire without dragging the empty finding in.</td></tr> <tr><td><a href="./testimonials/no-schema.html">no-schema</a></td> <td>luvdisc</td><td class="p-fail">fail</td><td>REVIEW</td><td>TESTI-3</td><td>Real testimonials but no Review/AggregateRating JSON-LD — star rich results are given away. REVIEW, and isolated from the empty/placeholder findings.</td></tr> <tr><td><a href="./testimonials/stale.html">stale</a></td> <td>luvdisc</td><td class="p-fail">fail</td><td>REVIEW</td><td>TESTI-4</td><td>A testimonials wall whose newest dated quote is over 2 years old — stale social proof on a live practice. REVIEW, and pinned to include schema so only staleness fires.</td></tr> <tr><td><a href="./testimonials/none.html">none</a></td> <td>luvdisc</td><td class="p-edge">edge</td><td>INFO</td><td>—</td><td>A page with no testimonials section, widget, or review schema at all. INFO, never PASS — nothing was audited.</td></tr> <tr><td><a href="./injected/gold.html">gold</a></td> <td>growlithe</td><td class="p-happy">happy</td><td>PASS</td><td>—</td><td>An ordinary practice page — nothing that does not belong.</td></tr> <tr><td><a href="./injected/clinical.html">clinical</a></td> <td>growlithe</td><td class="p-happy">happy</td><td>PASS</td><td>—</td><td>A real urology page naming Viagra, Cialis and prescriptions. MUST PASS — this is the false positive that would get the whole scan switched off, and it is pinned so no family pattern can be loosened to a bare drug name.</td></tr> <tr><td><a href="./injected/pharma-injection.html">pharma-injection</a></td> <td>growlithe</td><td class="p-fail">fail</td><td>FAIL</td><td>INJ-1</td><td>Spam grammar, not a topic word: buy / cheap / no prescription around the drug name.</td></tr> <tr><td><a href="./injected/phishing-page.html">phishing-page</a></td> <td>growlithe</td><td class="p-fail">fail</td><td>FAIL</td><td>INJ-2</td><td>Bank credential bait on a practice domain — the real incident that motivated the skill.</td></tr> <tr><td><a href="./injected/cloaked-links.html">cloaked-links</a></td> <td>growlithe</td><td class="p-fail">fail</td><td>FAIL</td><td>INJ-3</td><td>A display:none block stuffed with links. Hidden text alone is often legitimate; hidden text FULL of links is the link-farm signature.</td></tr> <tr><td><a href="./injected/hidden-no-links.html">hidden-no-links</a></td> <td>growlithe</td><td class="p-edge">edge</td><td>PASS</td><td>—</td><td>A legitimate hidden block — a screen-reader helper with no links. Must not fire; hidden alone is not a signal.</td></tr> <tr><td><a href="./injected/outbound-spread.html">outbound-spread</a></td> <td>growlithe</td><td class="p-edge">edge</td><td>REVIEW</td><td>—</td><td>Fourteen distinct external domains linked from visible copy. REVIEW, never FAIL — a legitimate resources page has the same shape as a link farm, and breadth alone cannot tell them apart.</td></tr> <tr><td><a href="./roster/current.html">current</a></td> <td>stoutland</td><td class="p-happy">happy</td><td>PASS</td><td>—</td><td>Site lists exactly the two active providers on the roster. Nothing to report.</td></tr> <tr><td><a href="./roster/credentials.html">credentials</a></td> <td>stoutland</td><td class="p-happy">happy</td><td>PASS</td><td>—</td><td>Site says "Dr. Jane A. Smith-Jones, MD", roster says "Jane Smith-Jones". One person. Pins the normalization — if this breaks, one real provider produces two false findings at once.</td></tr> <tr><td><a href="./roster/departed-listed.html">departed-listed</a></td> <td>stoutland</td><td class="p-fail">fail</td><td>FAIL</td><td>ROSTER-1</td><td>A provider the roster marks departed is still published. THE liability case, and the entire reason this skill exists — adding a provider arrives as an urgent request, removing one often never arrives.</td></tr> <tr><td><a href="./roster/not-on-roster.html">not-on-roster</a></td> <td>stoutland</td><td class="p-edge">edge</td><td>REVIEW</td><td>—</td><td>A third name on the site that the roster has never heard of. REVIEW, not FAIL — a stale roster is as likely as a wrong page, and the skill cannot tell which.</td></tr> <tr><td><a href="./roster/no-bio-page.html">no-bio-page</a></td> <td>stoutland</td><td class="p-edge">edge</td><td>REVIEW</td><td>—</td><td>An active provider with no page anywhere on the site — a content gap, not a liability.</td></tr> <tr><td><a href="./roster/discovery.html">discovery</a></td> <td>stoutland</td><td class="p-edge">edge</td><td>INFO</td><td>—</td><td>No roster given. INFO, never PASS — nothing was graded. This run exists to PRODUCE the roster, since there is no system of record for one.</td></tr> <tr><td><a href="./smoke/gold.html">gold</a></td> <td>yanma</td><td class="p-happy">happy</td><td>PASS</td><td>—</td><td>Everything a critical path needs: real content, a nav with links, a dialable tel: link, a form.</td></tr> <tr><td><a href="./smoke/blank-white-screen.html">blank-white-screen</a></td> <td>yanma</td><td class="p-fail">fail</td><td>FAIL</td><td>SMOKE-1</td><td>HTTP 200 and nothing painted — the "homepage 911" ticket. Pinned because a status-code-only check would call this healthy while the client is on the phone.</td></tr> <tr><td><a href="./smoke/php-fatal.html">php-fatal</a></td> <td>yanma</td><td class="p-fail">fail</td><td>FAIL</td><td>SMOKE-2</td><td>A PHP fatal served at 200. The cause, reported as the cause — not as "the page looks short".</td></tr> <tr><td><a href="./smoke/parked-domain.html">parked-domain</a></td> <td>yanma</td><td class="p-fail">fail</td><td>FAIL</td><td>SMOKE-3</td><td>A live client site replaced by a coming-soon placeholder — a DNS or hosting change landed on top of a real site. An emergency, not a nitpick.</td></tr> <tr><td><a href="./smoke/menu-gone.html">menu-gone</a></td> <td>yanma</td><td class="p-edge">edge</td><td>REVIEW</td><td>—</td><td>Content is fine, the primary menu vanished — the "Homepage menu not working" ticket, caught by the nav EXISTING check rather than by opening it.</td></tr> <tr><td><a href="./smoke/no-phone-no-form.html">no-phone-no-form</a></td> <td>yanma</td><td class="p-edge">edge</td><td>REVIEW</td><td>—</td><td>A page a patient cannot act on: no tel: link, no form. REVIEW — the site is up, the conversion path is not.</td></tr> <tr><td><a href="./smoke/booking-widget-counts.html">booking-widget-counts</a></td> <td>yanma</td><td class="p-edge">edge</td><td>PASS</td><td>—</td><td>No <form> tag, but a Calendly booking widget. Must PASS — half of these sites book through an embed, and flagging them all would get the sweep muted in a week.</td></tr> <tr><td><a href="./headings/gold.html">gold</a></td> <td>heading-structure</td><td class="p-happy">happy</td><td>PASS</td><td>—</td><td>One H1, descending H2/H3 with no gaps, every heading non-empty and unique → PASS.</td></tr> <tr><td><a href="./headings/no-h1.html">no-h1</a></td> <td>heading-structure</td><td class="p-fail">fail</td><td>FAIL</td><td>HS-1</td><td>Gold with its H1 demoted to H2 — no primary heading at all → FAIL, and nothing else fires.</td></tr> <tr><td><a href="./headings/multiple-h1.html">multiple-h1</a></td> <td>heading-structure</td><td class="p-fail">fail</td><td>REVIEW</td><td>HS-2</td><td>Gold with a second H1 competing for the primary heading → REVIEW (the proposal keeps the first and demotes the rest).</td></tr> <tr><td><a href="./headings/skipped-level.html">skipped-level</a></td> <td>heading-structure</td><td class="p-fail">fail</td><td>REVIEW</td><td>HS-3</td><td>Gold with its first H2 pushed to H3 — the outline jumps H1→H3 → REVIEW.</td></tr> <tr><td><a href="./headings/empty-heading.html">empty-heading</a></td> <td>heading-structure</td><td class="p-fail">fail</td><td>REVIEW</td><td>HS-4</td><td>Gold with one H3 emptied of visible text → REVIEW. An empty heading carries no text, so it must not also register as a duplicate.</td></tr> <tr><td><a href="./headings/duplicate-triple.html">duplicate-triple</a></td> <td>heading-structure</td><td class="p-fail">fail</td><td>REVIEW</td><td>HS-5</td><td>The same H3 text three times → the REVIEW-level duplicate finding, not the info-level pair.</td></tr> <tr><td><a href="./headings/duplicate-pair.html">duplicate-pair</a></td> <td>heading-structure</td><td class="p-edge">edge</td><td>REVIEW</td><td>HS-6</td><td>The same H3 text exactly twice — the info-level pair finding, deliberately distinct from the triplicate rule, still surfacing as REVIEW.</td></tr> <tr><td><a href="./nav/gold.html">gold</a></td> <td>nav-ia</td><td class="p-happy">happy</td><td>PASS</td><td>—</td><td>A flat four-item nav with live, distinct hrefs on a 220-word page → PASS.</td></tr> <tr><td><a href="./nav/empty-href.html">empty-href</a></td> <td>nav-ia</td><td class="p-fail">fail</td><td>REVIEW</td><td>NAV-1</td><td>Gold with one nav item pointing at a bare fragment — a menu entry that goes nowhere → REVIEW.</td></tr> <tr><td><a href="./nav/thin-review.html">thin-review</a></td> <td>nav-ia</td><td class="p-fail">fail</td><td>REVIEW</td><td>NAV-2</td><td>Gold nav, ~90 words of body copy — under the 150-word REVIEW floor and over the 50-word FAIL floor → REVIEW.</td></tr> <tr><td><a href="./nav/thin-fail.html">thin-fail</a></td> <td>nav-ia</td><td class="p-fail">fail</td><td>FAIL</td><td>NAV-3</td><td>Gold nav, ~20 words of body copy — under doduo’s 50-word floor → FAIL. The one nav-ia verdict that is a defect rather than a decision.</td></tr> <tr><td><a href="./nav/deep-nav.html">deep-nav</a></td> <td>nav-ia</td><td class="p-edge">edge</td><td>INFO</td><td>NAV-4</td><td>Four levels of nested menu on a healthy page. Depth alone is an owner decision, so it must stay INFO — inflating it to REVIEW is the false positive this pins.</td></tr> <tr><td><a href="./nav/duplicate-label.html">duplicate-label</a></td> <td>nav-ia</td><td class="p-edge">edge</td><td>INFO</td><td>NAV-5</td><td>One label ("Services") pointing at two different URLs. Ambiguous, not broken → INFO.</td></tr> <tr><td><a href="./nav/toggle-heuristic.html">toggle-heuristic</a></td> <td>nav-ia</td><td class="p-edge">edge</td><td>INFO</td><td>NAV-6</td><td>A hamburger button in the nav. nav-ia reads markup only, so it advises running conkeldurr rather than claiming the toggle is broken → INFO.</td></tr> <tr><td><a href="./visual-layout/gold.html">gold</a></td> <td>decidueye</td><td class="p-happy">happy</td><td>PASS</td><td>—</td><td>Four full-measure text sections, one left edge, no images, no tiles — nothing measurable is out of place → PASS.</td></tr> <tr><td><a href="./visual-layout/broken-image.html">broken-image</a></td> <td>decidueye</td><td class="p-fail">fail</td><td>FAIL</td><td>DE-1</td><td>Gold with one <img> whose source never decodes — an image element showing nothing. FAIL, and none of the fit rules fire on a picture that was never there.</td></tr> <tr><td><a href="./visual-layout/cropped-banner.html">cropped-banner</a></td> <td>decidueye</td><td class="p-fail">fail</td><td>REVIEW</td><td>DE-2</td><td>Gold with a 1600×1067 photo cover-cropped into a full-width 180px band — nearly four times wider than its own shape, so most of the picture is thrown away → REVIEW.</td></tr> <tr><td><a href="./visual-layout/uneven-tiles.html">uneven-tiles</a></td> <td>decidueye</td><td class="p-fail">fail</td><td>REVIEW</td><td>DE-3</td><td>Three grid tiles in one row at 120/200/280px. Equal track widths and one gap value, so only the height rule may fire — the pin against a tile row reported three ways.</td></tr> <tr><td><a href="./visual-layout/heading-wrap.html">heading-wrap</a></td> <td>decidueye</td><td class="p-fail">fail</td><td>REVIEW</td><td>DE-4</td><td>Gold with one section heading long enough to wrap past four lines at desktop width. Every heading still shares one left edge, so the alignment rules must stay quiet.</td></tr> <tr><td><a href="./visual-layout/overlapping-text.html">overlapping-text</a></td> <td>decidueye</td><td class="p-fail">fail</td><td>FAIL</td><td>DE-5</td><td>Two paragraphs absolutely positioned at the same origin — text painted straight over text. FAIL, and not the designed text-over-image case, which is a different finding.</td></tr> <tr><td><a href="./visual-layout/chrome-gold.html">chrome-gold</a></td> <td>decidueye</td><td class="p-happy">happy</td><td>PASS</td><td>—</td><td>Gold plus site chrome done right: a sticky header the H1 clears, a one-line tel: CTA, and a two-up button row on a 16px gutter → PASS. The negative control for the four header/CTA rules below.</td></tr> <tr><td><a href="./visual-layout/header-overlap.html">header-overlap</a></td> <td>decidueye</td><td class="p-fail">fail</td><td>FAIL</td><td>DE-6</td><td>The chrome control with its header made fixed and nothing reserving its 96px — the pinned header paints over the H1 → FAIL (decidueye 0.3.0).</td></tr> <tr><td><a href="./visual-layout/header-collision.html">header-collision</a></td> <td>decidueye</td><td class="p-fail">fail</td><td>FAIL</td><td>DE-7</td><td>The chrome control with the phone number absolutely positioned 40px from the logo — the two collide inside the pinned header → FAIL (decidueye 0.3.0).</td></tr> <tr><td><a href="./visual-layout/cta-gap.html">cta-gap</a></td> <td>decidueye</td><td class="p-fail">fail</td><td>REVIEW</td><td>DE-8</td><td>The chrome control with its two-up button row pushed to opposite ends of the content column — one gap far over 48px and half the narrower button → REVIEW (decidueye 0.4.0).</td></tr> <tr><td><a href="./visual-layout/cta-wrap.html">cta-wrap</a></td> <td>decidueye</td><td class="p-fail">fail</td><td>REVIEW</td><td>DE-9</td><td>The chrome control with the header tel: CTA squeezed to 90px so it breaks onto two lines at every width → REVIEW (decidueye 0.4.0).</td></tr> <tr><td><a href="./healthcare-compliance/gold.html">gold</a></td> <td>medicham</td><td class="p-gold">gold</td><td>PASS</td><td>—</td><td>Healthcare evidence baseline with privacy and NPP paths and no configured observable gap.</td></tr> <tr><td><a href="./healthcare-compliance/guaranteed-result.html">guaranteed-result</a></td> <td>medicham</td><td class="p-fail">fail</td><td>REVIEW</td><td>MED-CLAIM-GUARANTEED-RESULT</td><td>Gold healthcare evidence page with only MED-CLAIM-GUARANTEED-RESULT injected.</td></tr> <tr><td><a href="./healthcare-compliance/absolute-safety.html">absolute-safety</a></td> <td>medicham</td><td class="p-fail">fail</td><td>REVIEW</td><td>MED-CLAIM-ABSOLUTE-SAFETY</td><td>Gold healthcare evidence page with only MED-CLAIM-ABSOLUTE-SAFETY injected.</td></tr> <tr><td><a href="./healthcare-compliance/absolute-pain.html">absolute-pain</a></td> <td>medicham</td><td class="p-fail">fail</td><td>REVIEW</td><td>MED-CLAIM-ABSOLUTE-PAIN</td><td>Gold healthcare evidence page with only MED-CLAIM-ABSOLUTE-PAIN injected.</td></tr> <tr><td><a href="./healthcare-compliance/permanent-result.html">permanent-result</a></td> <td>medicham</td><td class="p-fail">fail</td><td>REVIEW</td><td>MED-CLAIM-PERMANENT-RESULT</td><td>Gold healthcare evidence page with only MED-CLAIM-PERMANENT-RESULT injected.</td></tr> <tr><td><a href="./healthcare-compliance/cure-claim.html">cure-claim</a></td> <td>medicham</td><td class="p-fail">fail</td><td>REVIEW</td><td>MED-CLAIM-CURE-CLAIM</td><td>Gold healthcare evidence page with only MED-CLAIM-CURE-CLAIM injected.</td></tr> <tr><td><a href="./healthcare-compliance/risk-disclosure.html">risk-disclosure</a></td> <td>medicham</td><td class="p-fail">fail</td><td>REVIEW</td><td>MED-RISK-DISCLOSURE</td><td>Gold healthcare evidence page with only MED-RISK-DISCLOSURE injected.</td></tr> <tr><td><a href="./healthcare-compliance/author-missing.html">author-missing</a></td> <td>medicham</td><td class="p-fail">fail</td><td>REVIEW</td><td>MED-AUTHOR-MISSING</td><td>Gold healthcare evidence page with only MED-AUTHOR-MISSING injected.</td></tr> <tr><td><a href="./healthcare-compliance/reviewer-unnamed.html">reviewer-unnamed</a></td> <td>medicham</td><td class="p-fail">fail</td><td>REVIEW</td><td>MED-REVIEWER-UNNAMED</td><td>Gold healthcare evidence page with only MED-REVIEWER-UNNAMED injected.</td></tr> <tr><td><a href="./healthcare-compliance/reviewer-credential.html">reviewer-credential</a></td> <td>medicham</td><td class="p-fail">fail</td><td>REVIEW</td><td>MED-REVIEWER-CREDENTIAL</td><td>Gold healthcare evidence page with only MED-REVIEWER-CREDENTIAL injected.</td></tr> <tr><td><a href="./healthcare-compliance/citation-authority.html">citation-authority</a></td> <td>medicham</td><td class="p-fail">fail</td><td>REVIEW</td><td>MED-CITATION-AUTHORITY</td><td>Gold healthcare evidence page with only MED-CITATION-AUTHORITY injected.</td></tr> <tr><td><a href="./healthcare-compliance/testimonial-consent.html">testimonial-consent</a></td> <td>medicham</td><td class="p-fail">fail</td><td>REVIEW</td><td>MED-TESTIMONIAL-CONSENT</td><td>Gold healthcare evidence page with only MED-TESTIMONIAL-CONSENT injected.</td></tr> <tr><td><a href="./healthcare-compliance/before-after-consent.html">before-after-consent</a></td> <td>medicham</td><td class="p-fail">fail</td><td>REVIEW</td><td>MED-BEFORE-AFTER-CONSENT</td><td>Gold healthcare evidence page with only MED-BEFORE-AFTER-CONSENT injected.</td></tr> <tr><td><a href="./healthcare-compliance/health-form.html">health-form</a></td> <td>medicham</td><td class="p-fail">fail</td><td>REVIEW</td><td>MED-FORM-HEALTH-DATA</td><td>Gold healthcare evidence page with only MED-FORM-HEALTH-DATA injected.</td></tr> <tr><td><a href="./healthcare-compliance/privacy-link.html">privacy-link</a></td> <td>medicham</td><td class="p-fail">fail</td><td>REVIEW</td><td>MED-PRIVACY-LINK</td><td>Gold healthcare evidence page with only MED-PRIVACY-LINK injected.</td></tr> <tr><td><a href="./healthcare-compliance/npp-link.html">npp-link</a></td> <td>medicham</td><td class="p-fail">fail</td><td>REVIEW</td><td>MED-NPP-LINK</td><td>Gold healthcare evidence page with only MED-NPP-LINK injected.</td></tr> <tr><td>draft-from-brief</td> <td>smeargle</td><td class="p-showcase">showcase</td><td></td><td>—</td><td>A saved brief becomes Gutenberg blocks, a reviewable HTML report, and a draft-only post through the mock WordPress API.</td></tr> <tr><td>brief-keyword-only</td> <td>smeargle</td><td class="p-edge">edge</td><td>INFO</td><td>—</td><td>A brief for a keyword with no URL — a net-new spec with no live page to grade, so the verdict is INFO. Never PASS: nothing was assessed.</td></tr> <tr><td><a href="./change/stable-a.html">stable</a> <a href="./change/stable-b.html">(after)</a></td> <td>snapatu</td><td class="p-happy">happy</td><td>PASS</td><td>—</td><td>Identical before/after — nothing changed.</td></tr> <tr><td><a href="./change/broken-link-a.html">broken-link</a> <a href="./change/broken-link-b.html">(after)</a></td> <td>snapatu</td><td class="p-fail">fail</td><td>FAIL</td><td>CONTENT-1</td><td>The after page adds a link to a 404.</td></tr> <tr><td><a href="./change/title-changed-a.html">title-changed</a> <a href="./change/title-changed-b.html">(after)</a></td> <td>snapatu</td><td class="p-fail">fail</td><td>REVIEW</td><td>SEO-1</td><td>The after page changes the <title>.</td></tr> <tr><td><a href="./change/copy-edited-a.html">copy-edited</a> <a href="./change/copy-edited-b.html">(after)</a></td> <td>snapatu</td><td class="p-fail">fail</td><td>REVIEW</td><td>—</td><td>The after page rewrites the body copy.</td></tr> <tr><td><a href="./noreach/does-not-exist.html">noreach</a></td> <td>orbeetle</td><td class="p-fail">fail</td><td>INFO</td><td>GUARD-1</td><td>orbeetle on an unreachable (404) target — nothing audited → INFO, not a false-PASS roll-up (0.56.0 guard).</td></tr> <tr><td><a href="./noreach/does-not-exist.html">noreach</a></td> <td>porygon</td><td class="p-fail">fail</td><td>INFO</td><td>GUARD-1</td><td>porygon on an unreachable (404) target — nothing audited → INFO, not a false-PASS roll-up (0.56.0 guard).</td></tr> <tr><td><a href="./noreach/does-not-exist.html">noreach</a></td> <td>ampharos</td><td class="p-fail">fail</td><td>INFO</td><td>GUARD-1</td><td>ampharos on an unreachable (404) target — nothing audited → INFO, not a false-PASS roll-up (0.56.0 guard).</td></tr> <tr><td><a href="./noreach/does-not-exist.html">noreach</a></td> <td>unown</td><td class="p-fail">fail</td><td>INFO</td><td>GUARD-1</td><td>unown on an unreachable (404) target — nothing audited → INFO, not a false-PASS roll-up (0.56.0 guard).</td></tr> <tr><td><a href="./noreach/does-not-exist.html">noreach</a></td> <td>klink</td><td class="p-fail">fail</td><td>INFO</td><td>GUARD-1</td><td>klink on an unreachable (404) target — nothing audited → INFO, not a false-PASS roll-up (0.56.0 guard).</td></tr> <tr><td><a href="./noreach/does-not-exist.html">noreach</a></td> <td>oranguru</td><td class="p-fail">fail</td><td>INFO</td><td>GUARD-1</td><td>oranguru on an unreachable (404) target — nothing audited → INFO, not a false-PASS roll-up (0.56.0 guard).</td></tr> <tr><td><a href="./noreach/does-not-exist.html">noreach</a></td> <td>chimecho</td><td class="p-fail">fail</td><td>INFO</td><td>GUARD-1</td><td>chimecho on an unreachable (404) target — nothing audited → INFO, not a false-PASS roll-up (0.56.0 guard).</td></tr> <tr><td><a href="./noreach/does-not-exist.html">noreach</a></td> <td>bibarel</td><td class="p-fail">fail</td><td>INFO</td><td>GUARD-1</td><td>bibarel on an unreachable (404) target — nothing audited → INFO, not a false-PASS roll-up (0.56.0 guard).</td></tr> <tr><td><a href="./noreach/does-not-exist.html">noreach</a></td> <td>heading-structure</td><td class="p-fail">fail</td><td>INFO</td><td>GUARD-1</td><td>heading-structure on an unreachable (404) target — nothing audited → INFO, not a false-PASS roll-up (0.56.0 guard).</td></tr> <tr><td><a href="./noreach/does-not-exist.html">noreach</a></td> <td>nav-ia</td><td class="p-fail">fail</td><td>INFO</td><td>GUARD-1</td><td>nav-ia on an unreachable (404) target — nothing audited → INFO, not a false-PASS roll-up (0.56.0 guard).</td></tr> <tr><td><a href="./a11y/gold.html">noreach</a></td> <td>beru</td><td class="p-fail">fail</td><td>INFO</td><td>GUARD-1</td><td>Beru on a reachable page with no GTM container — nothing audited → INFO, not a false-PASS roll-up (0.56.0 guard).</td></tr> <tr><td>crawl-compare-clean</td> <td>nkpfrog</td><td class="p-happy">happy</td><td>PASS</td><td>—</td><td>Every page carried and every inherited debt cleared — the outcome the migration is sold on, and the only shape that earns a PASS.</td></tr> <tr><td>crawl-compare-lost</td> <td>nkpfrog</td><td class="p-fail">fail</td><td>FAIL</td><td>—</td><td>A page that was live and 200 on the old site is missing from the new one. Coverage is graded against the old site, so this fails however clean the rest is — a lost ranking page is the largest cause of migration traffic loss.</td></tr> <tr><td>grade-crawler-blocked</td> <td>nkpfrog</td><td class="p-fail">fail</td><td>BLOCKED</td><td>—</td><td>The crawler did not complete a clean pass, so the findings are artifacts of the block rather than real SEO issues. BLOCKED, never FAIL: grading a crawl that was refused would put defects on a site that may have none — the same rule the headless QA lane follows.</td></tr> <tr><td>grade-no-issues-sheet</td> <td>nkpfrog</td><td class="p-edge">edge</td><td>INFO</td><td>—</td><td>An export with no issues_overview_report.csv. INFO, never PASS: nothing was triaged, and a clean verdict over an unread crawl is the false green this guard exists to prevent.</td></tr> <tr><td>crawl-compare</td> <td>nkpfrog</td><td class="p-happy">happy</td><td>REVIEW</td><td>—</td><td>The old site carried three inherited debts; the new site cleared two and kept one copy judgement. REVIEW, not PASS — a low-content page is a human call, not a build defect. Coverage is graded on the diff (0 lost) while issue classes are graded absolutely on the after-crawl.</td></tr> <tr><td><a href="./noreach/does-not-exist.html">all-unreachable</a></td> <td>stoutland</td><td class="p-fail">fail</td><td>BLOCKED</td><td>—</td><td>Every page unreachable (404) with a roster supplied → BLOCKED, not FAIL. The site was never read, so it cannot be said that anyone is missing from it.</td></tr> <tr><td><a href="./seo/parked.html">parked</a></td> <td>orbeetle</td><td class="p-fail">fail</td><td>FAIL</td><td>GUARD-3</td><td>orbeetle on a registrar-parking body (LANDER_SYSTEM=PW, "domain is parked", "for sale") → detectParked fires → FAIL.</td></tr> <tr><td><a href="./analytics/parked.html">parked</a></td> <td>ampharos</td><td class="p-fail">fail</td><td>FAIL</td><td>GUARD-3</td><td>ampharos on a registrar-parking body (LANDER_SYSTEM=PW, "domain is parked", "for sale") → detectParked fires → FAIL.</td></tr> <tr><td><a href="./links/parked.html">parked</a></td> <td>klink</td><td class="p-fail">fail</td><td>FAIL</td><td>GUARD-3</td><td>klink on a registrar-parking body (LANDER_SYSTEM=PW, "domain is parked", "for sale") → detectParked fires → FAIL.</td></tr> <tr><td>cross-host</td> <td>orbeetle</td><td class="p-happy">happy</td><td>PASS/REVIEW</td><td>—</td><td>orbeetle site-mode: 1 same-host gold page + example.com (cross-host) → bucketed, verdict from same-host only (cross-host note may bump to REVIEW).</td></tr> <tr><td>cross-host</td> <td>klink</td><td class="p-happy">happy</td><td>PASS</td><td>—</td><td>klink site-mode: 1 same-host gold page + example.com (cross-host) → bucketed, verdict from same-host only → PASS.</td></tr> <tr><td><a href="./content/shrinkita-heavy.html">shrinkita-heavy</a></td> <td>shrinkita</td><td class="p-fail">fail</td><td>FAIL</td><td>—</td><td>Legacy JPEG (non-WebP) >100KB → guideline FAIL.</td></tr> <tr><td><a href="./content/shrinkita-clean.html">shrinkita-clean</a></td> <td>shrinkita</td><td class="p-happy">happy</td><td>INFO</td><td>—</td><td>No images in the page → INFO (no images to grade).</td></tr> <tr><td><a href="./content/shrinkita-optimised.html">shrinkita-optimised</a></td> <td>shrinkita</td><td class="p-happy">happy</td><td>PASS</td><td>—</td><td>WebP, well under 100KB, with descriptive alt — every guideline met → PASS. The first fixture in the bank able to prove shrinkita passes anything.</td></tr> <tr><td><a href="./content/shrinkita-alt-empty.html">shrinkita-alt-empty</a></td> <td>shrinkita</td><td class="p-edge">edge</td><td>REVIEW</td><td>—</td><td>The same optimised image with an empty alt → REVIEW, not FAIL. HTML alone cannot tell a decorative image from one whose alt was forgotten, so the weight and format rules stay hard while alt goes to a human.</td></tr> <tr><td><a href="./content/image-is-html.html">image-is-html</a></td> <td>shrinkita</td><td class="p-fail">fail</td><td>FAIL</td><td>—</td><td>An image whose bytes are an HTML page. Everything else about it passes — 200, right size band, alt text present — and it renders broken for every visitor. Magic bytes are the only thing that sees it; the content-type agrees with the lie, because a static host labels the file from its extension.</td></tr> <tr><td><a href="./wp/wp-gold.html">directory-current</a></td> <td>watchog</td><td class="p-happy">happy</td><td>PASS</td><td>—</td><td>Every plugin and the theme at the version the directory calls latest, all updated within the year → PASS. The first fixture able to prove watchog passes anything: against the live directory, "current" stops being true the next time a plugin ships.</td></tr> <tr><td><a href="./wp/wp-gold.html">known-vulnerability</a></td> <td>watchog</td><td class="p-fail">fail</td><td>FAIL</td><td>—</td><td>The same current site, with WPScan reporting a vulnerability fixed in 5.9.4 that the installed 5.9.2 is exposed to → FAIL. Up to date is not the same as safe, and this is the only route to a watchog FAIL that does not depend on a plugin being abandoned.</td></tr> <tr><td><a href="./wp/wp-gold.html">wp-gold</a></td> <td>watchog</td><td class="p-fail">fail</td><td>REVIEW</td><td>—</td><td>watchog on the WP fixture against a PINNED directory where contact-form-7 latest is 6.0.0 — the installed 5.9.2 is outdated (REVIEW). Pinned because the live directory moves.</td></tr> <tr><td><a href="./wp/not-wp.html">not-wp</a></td> <td>watchog</td><td class="p-happy">happy</td><td>INFO</td><td>—</td><td>watchog on a non-WordPress page — nothing to audit (INFO).</td></tr> <tr><td><a href="./wp/wp-divi.html">wp-divi</a></td> <td>timburr</td><td class="p-showcase">showcase</td><td>PASS</td><td>—</td><td>timburr on the Divi fixture — Divi 4 confirmed (via hosted style.css), minimal page.</td></tr> <tr><td><a href="./wp/wp-gold.html">wp-gold</a></td> <td>timburr</td><td class="p-happy">happy</td><td>INFO</td><td>—</td><td>timburr on the non-Divi WP fixture — nothing to audit (INFO).</td></tr> <tr><td>gold</td> <td>pelipper</td><td class="p-happy">happy</td><td>PASS</td><td>—</td><td>All graded tools PASS → deliverable PASS.</td></tr> <tr><td>mixed</td> <td>pelipper</td><td class="p-fail">fail</td><td>FAIL</td><td>—</td><td>A graded FAIL wins; xatu is INFO-only and never counts toward the verdict.</td></tr> <tr><td>claim</td> <td>pelipper</td><td class="p-fail">fail</td><td>REVIEW</td><td>—</td><td>audino claims its audino/ subtree — the nested FAIL is not double-counted (verdict REVIEW).</td></tr> <tr><td>info-only</td> <td>pelipper</td><td class="p-edge">edge</td><td>INFO</td><td>—</td><td>Only INFO-only tools ran, so nothing was graded → the deliverable is INFO, never a false PASS. The complement of `mixed`: that one proves INFO is excluded from the roll-up, this one proves what excluding it leaves.</td></tr> <tr><td><a href="./site/index.html">site-home</a></td> <td>viewvee</td><td class="p-showcase">showcase</td><td>capture</td><td>VISUAL-1</td><td>Homepage of the mini full-website (4 pages + sitemap) — viewvee capture / page-qa target.</td></tr> <tr><td>gold</td> <td>galvantula</td><td class="p-happy">happy</td><td>PASS</td><td>—</td><td>The 4-page mini-site, fully inter-linked (nav links every page) → no orphans, all reachable → PASS. Also proves clean-URL aliasing (.html links ↔ Pages clean-URL nodes).</td></tr> <tr><td>orphan</td> <td>galvantula</td><td class="p-fail">fail</td><td>REVIEW</td><td>—</td><td>Same mini-site plus orphan.html, which nothing links to → 1 orphan of 5 (20%) → REVIEW.</td></tr> <tr><td>orphan-share</td> <td>galvantula</td><td class="p-fail">fail</td><td>FAIL</td><td>—</td><td>The same orphan page in a 3-page universe → 33% orphaned, over the 25% FAIL threshold. Paired with the `orphan` fixture (20% → REVIEW), this pins the boundary from both sides.</td></tr> <tr><td><a href="./links/click-here.html">click-here</a></td> <td>galvantula</td><td class="p-fail">fail</td><td>REVIEW</td><td>—</td><td>Single-page mode: internal links use generic anchor text (click here, read more, here) → REVIEW.</td></tr> <tr><td>suggest-placement</td> <td>galvantula</td><td class="p-happy">happy</td><td>PASS</td><td>—</td><td>Pins ALL THREE constraints from issue #131 at once. The phrase "laser hair removal" appears on blog.html three times — in the site footer, inside a testimonial block, and in one real body paragraph — and only the body paragraph may be offered (context must contain "start planning", the words unique to it). linked.html matches the phrase perfectly but already links to the target, so it must never be suggested. A run that proposes the footer, the testimonial, or the already-linked page has failed in exactly the way the issue describes.</td></tr> <tr><td><a href="./noreach/does-not-exist.html">noreach</a></td> <td>galvantula</td><td class="p-fail">fail</td><td>INFO</td><td>GUARD-1</td><td>galvantula on an unreachable (404) page → nothing audited → INFO, not a false PASS.</td></tr> <tr><td>roles</td> <td>bisharp</td><td class="p-happy">happy</td><td>PASS</td><td>DISP-1</td><td>THE fixture for this skill: one finding (directives: noindex) on four URL kinds. Paginated, tag archive and thank-you must all dismiss; the service page must fix. If this ever collapses to one answer the skill fails in both directions at once — it either buries a de-indexed service page or hands back the busywork it exists to remove.</td></tr> <tr><td>dismissible</td> <td>bisharp</td><td class="p-happy">happy</td><td>PASS</td><td>—</td><td>The findings humans dismissed 66–100% of the time by hand: duplicate H2s (a template artefact), and crawler spelling/grammar flags (0 of 133 were ever fixed). All dismissed, each with its reason.</td></tr> <tr><td>unmapped</td> <td>bisharp</td><td class="p-fail">fail</td><td>REVIEW</td><td>—</td><td>A finding with no rule becomes needs-human and REVIEWs the run — never silently dropped, and never quietly dismissed. A rule engine that ignores what it does not recognise is worse than one that admits it.</td></tr> <tr><td>calibrate</td> <td>bisharp</td><td class="p-happy">happy</td><td>PASS</td><td>—</td><td>Calibration against recorded human decisions. calibrationSkipped MUST be 0: two of these rows are "[wont fix] …", which the first implementation silently dropped because \b never matches after "]" — an agreement figure over a sample the tool picked for itself is not a measurement.</td></tr> <tr><td><a href="./analytics/untracked.html">untracked-hosting-only</a></td> <td>ampharos</td><td class="p-happy">happy</td><td>INFO</td><td>SCOPE-1</td><td>A page with no analytics, on a HOSTING-ONLY account. INFO, not PASS: the only applicable check was ruled out of scope and there were no tags to grade, so NOTHING WAS CHECKED — a PASS there claims a check that never ran. And N/A rather than a warning: the client never shared GA4, so "no analytics detected" is a finding about our expectations rather than their site. Left ungated this fires across a large share of the book and the report becomes something people learn to ignore.</td></tr> <tr><td><a href="./analytics/untracked.html">untracked-stop-work</a></td> <td>ampharos</td><td class="p-happy">happy</td><td>INFO</td><td>SCOPE-3</td><td>The SAME page on an account under Stop Work. Contracted on paper, but nobody will action anything: Access Issues means the credentials are gone, Collections means work is withheld, Client Request means they asked us to stop. A finding here is noise on someone screen. Reported as "N/A — work stopped" — a DIFFERENT label from not-contracted, because a halted account has a named cause somebody may be able to clear and an unsold product does not.</td></tr> <tr><td><a href="./analytics/untracked.html">untracked-access-unknown</a></td> <td>ampharos</td><td class="p-edge">edge</td><td>INFO</td><td>SCOPE-4</td><td>Premium Local Search Optimization IS SEO work, but GA4 access is not part of that product. Neither "expected" nor "not contracted" is true, and picking either silently is how a report starts nagging for data nobody promised us, or stops asking for data we should have. Its own third state, so the answer is a person's once rather than a guess every run.</td></tr> <tr><td><a href="./analytics/untracked.html">untracked-seo-in-notice</a></td> <td>ampharos</td><td class="p-fail">fail</td><td>REVIEW</td><td>SCOPE-2</td><td>The SAME page on an account whose SEO subscription is "Active - Notified to Cancel". In notice is STILL contracted, so this stays a real finding. The asymmetric case and the expensive one to get wrong — suppressing here silently withholds a genuine finding from a paying account.</td></tr> <tr><td>series</td> <td>gsc-client</td><td class="p-happy">happy</td><td>INFO</td><td>—</td><td>A plain series fetch. Verdict is ALWAYS INFO — it grades nothing, because a page can lose half its clicks to seasonality, cannibalisation or de-indexing and this data cannot tell those apart. Deciding what a fall MEANS is the traffic-drop triage recipe.</td></tr> <tr><td>movers</td> <td>gsc-client</td><td class="p-happy">happy</td><td>INFO</td><td>—</td><td>The comparison traffic-drop triage consumes. One page collapses (-180), one holds, one is new and one disappeared entirely — a page present in only ONE window must still appear as a mover, or a page that died since last month becomes invisible exactly when it matters most.</td></tr> <tr><td>no-rows</td> <td>gsc-client</td><td class="p-edge">edge</td><td>INFO</td><td>—</td><td>An empty window. Still INFO with a stated reason — a property with no traffic in the window and a property that was verified last week look identical in the data, and neither is a fault.</td></tr> <tr><td>fast</td> <td>crux-client</td><td class="p-happy">happy</td><td>INFO</td><td>—</td><td>A whole-origin field-data read. Verdict is ALWAYS INFO — a client, not an analyst; grading belongs to rapidash and the migration gate. CLS is reported ×100 by the API and scaled back to the unitless value before grading.</td></tr> <tr><td>null-inp</td> <td>crux-client</td><td class="p-edge">edge</td><td>INFO</td><td>—</td><td>A low-traffic origin where INP has no field row — the common case for a single-location practice site. A missing metric is unknown and never scored: not zero, not good, not poor.</td></tr> <tr><td>no-field-data</td> <td>crux-client</td><td class="p-edge">edge</td><td>SKIPPED</td><td>—</td><td>An origin with NO CrUX row at all. SKIPPED with the reason — never a pass and never a fail, exactly how swanna source-field-vitals-captured grades the same state.</td></tr> <tr><td>series</td> <td>ga4-client</td><td class="p-happy">happy</td><td>INFO</td><td>—</td><td>A plain behaviour-series fetch. Verdict always INFO — it grades nothing.</td></tr> <tr><td>movers</td> <td>ga4-client</td><td class="p-happy">happy</td><td>INFO</td><td>—</td><td>Three movers from two current rows: /retired/ existed last window and is GONE this one. A vanished page has no current row to iterate over, which makes it the easiest mover to lose and the one that matters most.</td></tr> <tr><td>thresholded</td> <td>ga4-client</td><td class="p-fail">fail</td><td>INFO</td><td>GA4-1</td><td>GA4 dropped rows because Google Signals is on. The totals are INCOMPLETE and small-traffic pages are missing entirely — unknown, not zero. Pinned because if this warning stops firing, every report built on the data quietly starts presenting an incomplete total as a count.</td></tr> <tr><td><a href="./freshness/dated.html">stale</a></td> <td>celebi</td><td class="p-fail">fail</td><td>REVIEW</td><td>—</td><td>A page whose schema dateModified is 2021 with a 1-day threshold → REVIEW. Threshold-driven so the answer stays stable.</td></tr> <tr><td><a href="./freshness/dated.html">fresh</a></td> <td>celebi</td><td class="p-happy">happy</td><td>PASS</td><td>—</td><td>The same dated page with an effectively unlimited threshold → PASS. Proves the content date drives the verdict.</td></tr> <tr><td><a href="./freshness/undated.html">no-date</a></td> <td>celebi</td><td class="p-fail">fail</td><td>INFO</td><td>—</td><td>A reachable page with no declared date → content age cannot be assessed → INFO with a no-signal note.</td></tr> <tr><td><a href="./noreach/does-not-exist.html">noreach</a></td> <td>celebi</td><td class="p-fail">fail</td><td>INFO</td><td>GUARD-1</td><td>celebi on an unreachable (404) page → no content to assess → INFO.</td></tr> <tr><td><a href="./site/index.html">site-rollup</a></td> <td>e2e</td><td class="p-showcase">showcase</td><td>REVIEW/FAIL</td><td>E2E-1</td><td>orbeetle + klink + oranguru + ampharos + porygon on the homepage and ariados on the sitemap → pelipper packages all six into one deliverable roll-up.</td></tr> <tr><td><a href="./visual/bot-challenge.html">bot-blocked</a></td> <td>rapidash</td><td class="p-fail">fail</td><td>BLOCKED</td><td>GUARD-2</td><td>rapidash on a bot-challenge/interstitial — the headless browser is blocked → BLOCKED (not run), never a misleading FAIL.</td></tr> <tr><td><a href="./visual/bot-challenge.html">bot-blocked</a></td> <td>axew</td><td class="p-fail">fail</td><td>BLOCKED</td><td>GUARD-2</td><td>axew on a bot-challenge/interstitial — the headless browser is blocked → BLOCKED (not run), never a misleading FAIL.</td></tr> <tr><td><a href="./visual/bot-challenge.html">bot-blocked</a></td> <td>kecleon</td><td class="p-fail">fail</td><td>BLOCKED</td><td>GUARD-2</td><td>kecleon on a bot-challenge/interstitial — the headless browser is blocked → BLOCKED (not run), never a misleading FAIL.</td></tr> <tr><td><a href="./visual/bot-challenge.html">bot-blocked</a></td> <td>conkeldurr</td><td class="p-fail">fail</td><td>BLOCKED</td><td>GUARD-2</td><td>conkeldurr on a bot-challenge/interstitial — the headless browser is blocked → BLOCKED (not run), never a misleading FAIL.</td></tr> <tr><td><a href="./visual/bot-challenge.html">bot-blocked</a></td> <td>oricorio</td><td class="p-fail">fail</td><td>BLOCKED</td><td>GUARD-2</td><td>oricorio on a bot-challenge/interstitial — the headless browser is blocked → BLOCKED (not run), never a misleading FAIL.</td></tr> <tr><td><a href="./visual/bot-challenge.html">bot-blocked</a></td> <td>decidueye</td><td class="p-fail">fail</td><td>BLOCKED</td><td>GUARD-2</td><td>decidueye on a bot-challenge/interstitial — the headless browser is blocked → BLOCKED (not run), never a misleading FAIL.</td></tr> <tr><td><a href="./a11y/contrast-unknown.html">axew-review</a></td> <td>audino</td><td class="p-edge">edge</td><td>REVIEW</td><td>—</td><td>axew REVIEWs (a contrast axe cannot compute), rapidash passes → the hub reports the worse of the two, REVIEW.</td></tr> <tr><td><a href="./visual/bot-challenge.html">bot-blocked</a></td> <td>audino</td><td class="p-fail">fail</td><td>BLOCKED</td><td>GUARD-2</td><td>audino on a bot-challenge page — both sub-tools blocked → overall BLOCKED (not run), never a false PASS.</td></tr> <tr><td><a href="./seo/index.xml">sitemap-index</a></td> <td>ariados</td><td class="p-happy">happy</td><td>PASS</td><td>SEO-1</td><td>A sitemap index → a plain child + a gzipped child; ariados follows both and decodes the .gz (5 URLs, 4 with lastmod) → PASS.</td></tr> <tr><td><a href="./site/sitemap.xml">plain-urlset</a></td> <td>ariados</td><td class="p-happy">happy</td><td>REVIEW</td><td>SEO-1</td><td>A plain urlset with no <lastmod> on any of its 4 URLs — parsed cleanly, but crawlers cannot prioritise changes, so REVIEW rather than PASS.</td></tr> <tr><td><a href="./a11y/gold.html">not-a-sitemap</a></td> <td>ariados</td><td class="p-fail">fail</td><td>FAIL</td><td>SEO-2</td><td>An HTML page pointed at as a sitemap — unparseable → FAIL.</td></tr> <tr><td><a href="./r/single">clean-301</a></td> <td>abra</td><td class="p-happy">happy</td><td>PASS</td><td>REDIR-1</td><td>A single 301 to a 200 — the canonical clean permanent redirect.</td></tr> <tr><td><a href="./r/temp">temp-302</a></td> <td>abra</td><td class="p-fail">fail</td><td>REVIEW</td><td>REDIR-2</td><td>A 302 (temporary) where a permanent 301 belongs → REVIEW.</td></tr> <tr><td><a href="./r/chain1">long-chain</a></td> <td>abra</td><td class="p-fail">fail</td><td>REVIEW</td><td>REDIR-3</td><td>A 3-hop 301 chain — lands fine but wastes hops → REVIEW.</td></tr> <tr><td><a href="./r/loopA">loop</a></td> <td>abra</td><td class="p-fail">fail</td><td>FAIL</td><td>REDIR-4</td><td>A → B → A redirect loop → FAIL.</td></tr> <tr><td><a href="./r/dead">dead-end</a></td> <td>abra</td><td class="p-fail">fail</td><td>FAIL</td><td>REDIR-5</td><td>A 301 that lands on a 404 → FAIL.</td></tr> <tr><td>gold</td> <td>superaudit-client</td><td class="p-happy">happy</td><td>PASS</td><td>—</td><td>A clean remote audit — all neutral checks pass; the non-neutral conversion warning is filtered out → PASS.</td></tr> <tr><td>mixed</td> <td>superaudit-client</td><td class="p-fail">fail</td><td>FAIL</td><td>—</td><td>A remote audit with a technical fail + a content warning; a skipped check is not graded → FAIL.</td></tr> <tr><td>warnings-only</td> <td>superaudit-client</td><td class="p-edge">edge</td><td>REVIEW</td><td>—</td><td>Warnings and no failures → REVIEW. Pins the FAIL boundary from below: a warning must not be promoted to a failure, and a run with warnings must not come back PASS.</td></tr> <tr><td>all-skipped</td> <td>superaudit-client</td><td class="p-edge">edge</td><td>INFO</td><td>—</td><td>The remote engine skipped every check it was asked for → INFO, never PASS. Nothing was graded, and a green verdict over an empty audit is the failure mode this guard exists for.</td></tr> <tr><td>domain-ranks</td> <td>semrush-client</td><td class="p-happy">happy</td><td>INFO</td><td>—</td><td>A saved SEMrush domain_ranks CSV via the offline seam — parses to rank 12345 / 5000 organic keywords, verdict INFO.</td></tr> <tr><td>seed-expand</td> <td>drilbur</td><td class="p-happy">happy</td><td>INFO</td><td>—</td><td>A saved SEMrush phrase_fullsearch CSV (directory seam) — expands a seed to 7 keywords with easy wins, verdict INFO.</td></tr> <tr><td>domain-organic</td> <td>drilbur</td><td class="p-happy">happy</td><td>INFO</td><td>—</td><td>A saved SEMrush domain_organic CSV (directory seam) — pulls the 4 keywords a domain ranks for, verdict INFO.</td></tr> <tr><td>gold</td> <td>girafarig</td><td class="p-happy">happy</td><td>PASS</td><td>—</td><td>A spec-valid llms.txt whose two links resolve, are allowed by robots.txt, indexable and self-canonical → PASS, with every honesty finding absent.</td></tr> <tr><td>absent</td> <td>girafarig</td><td class="p-edge">edge</td><td>INFO</td><td>—</td><td>No llms.txt at the root → INFO. llms.txt is an optional convention, so its absence is never graded as a defect.</td></tr> <tr><td>no-h1</td> <td>girafarig</td><td class="p-fail">fail</td><td>FAIL</td><td>LLMS-1</td><td>The H1 — the only section the spec requires — is removed → not valid llms.txt → FAIL. The links stay healthy, so nothing else may fire.</td></tr> <tr><td>broken-link</td> <td>girafarig</td><td class="p-fail">fail</td><td>FAIL</td><td>LLMS-2</td><td>One listed link 404s (checked twice) → FAIL. The two healthy links do not dilute it.</td></tr> <tr><td>blocked-noindex</td> <td>girafarig</td><td class="p-fail">fail</td><td>FAIL</td><td>LLMS-3</td><td>A listed page is disallowed by robots.txt AND noindex — doubly excluded while llms.txt advertises it → FAIL (the worst case).</td></tr> <tr><td>html-in-body</td> <td>girafarig</td><td class="p-fail">fail</td><td>REVIEW</td><td>LLMS-4</td><td>HTML markup in a markdown-only file → REVIEW, never FAIL: the file is still readable.</td></tr> <tr><td>blocked-only</td> <td>girafarig</td><td class="p-fail">fail</td><td>REVIEW</td><td>LLMS-5</td><td>A listed page is disallowed by robots.txt but indexable → REVIEW. Blocked-only is one rung below blocked-and-noindex.</td></tr> <tr><td>noindex-only</td> <td>girafarig</td><td class="p-fail">fail</td><td>REVIEW</td><td>LLMS-6</td><td>A listed page carries a noindex meta tag but robots.txt allows it → REVIEW.</td></tr> <tr><td>canonical-mismatch</td> <td>girafarig</td><td class="p-fail">fail</td><td>REVIEW</td><td>LLMS-7</td><td>A listed page canonicalises to a different URL than the one listed → REVIEW.</td></tr> <tr><td>build-gold</td> <td>girafarig</td><td class="p-happy">happy</td><td>PASS</td><td>—</td><td>Two crawlable, titled pages → the builder lists both under the production domain with their fetched titles → PASS.</td></tr> <tr><td>build-robots-skip</td> <td>girafarig</td><td class="p-fail">fail</td><td>REVIEW</td><td>LLMS-8</td><td>One input URL is disallowed by robots.txt → silently dropped from the file (never generated around), REVIEW names the drop. The two allowed pages are still listed.</td></tr> <tr><td>build-all-blocked</td> <td>girafarig</td><td class="p-fail">fail</td><td>FAIL</td><td>LLMS-9</td><td>A staging-style Disallow: / blocks every input URL → nothing left to list → FAIL and no llms.txt is written, so an early-shipped file cannot exist.</td></tr> <tr><td>build-untitled</td> <td>girafarig</td><td class="p-fail">fail</td><td>REVIEW</td><td>LLMS-10</td><td>One input page has no <title> → its entry falls back to a humanised path and REVIEW says so; the file is still written.</td></tr> <tr><td>gold</td> <td>doduo</td><td class="p-happy">happy</td><td>PASS</td><td>—</td><td>The target is an exact copy of a three-page source → every pair resolves, no field moved → PASS, with every parity rule silent.</td></tr> <tr><td>missing-page</td> <td>doduo</td><td class="p-fail">fail</td><td>FAIL</td><td>MIG-1</td><td>A source page that resolves is a 404 on the target → FAIL, the single largest cause of migration traffic loss.</td></tr> <tr><td>title-lost</td> <td>doduo</td><td class="p-fail">fail</td><td>FAIL</td><td>MIG-2</td><td>The target page lost its title element → FAIL (a title that merely differs is REVIEW; one that is gone is not).</td></tr> <tr><td>title-changed</td> <td>doduo</td><td class="p-fail">fail</td><td>REVIEW</td><td>MIG-3</td><td>The target title differs from the source but is present → REVIEW, not FAIL.</td></tr> <tr><td>description-lost</td> <td>doduo</td><td class="p-fail">fail</td><td>REVIEW</td><td>MIG-10</td><td>The target dropped a meta description the source had — the most common silent export casualty → REVIEW.</td></tr> <tr><td>h1-lost</td> <td>doduo</td><td class="p-fail">fail</td><td>FAIL</td><td>MIG-11</td><td>The target page has no H1 where the source had one → FAIL.</td></tr> <tr><td>noindex</td> <td>doduo</td><td class="p-fail">fail</td><td>FAIL</td><td>MIG-4</td><td>An indexable source page is noindex on the target → FAIL in launch mode (the preview flag inverts this, so it is a cutover rule).</td></tr> <tr><td>canonical-moved</td> <td>doduo</td><td class="p-fail">fail</td><td>FAIL</td><td>MIG-5</td><td>The target canonicalises to a different path than the source → FAIL; the ranking signal moves to another page.</td></tr> <tr><td>thin-target</td> <td>doduo</td><td class="p-fail">fail</td><td>FAIL</td><td>MIG-6</td><td>The target body falls under the absolute 50-word floor → FAIL regardless of the source, the title-plus-empty-body export failure.</td></tr> <tr><td>body-shorter</td> <td>doduo</td><td class="p-fail">fail</td><td>REVIEW</td><td>MIG-7</td><td>The target body is well over 20% shorter than the source but above the floor → REVIEW, not FAIL.</td></tr> <tr><td>schema-lost</td> <td>doduo</td><td class="p-fail">fail</td><td>REVIEW</td><td>MIG-8</td><td>The Dentist JSON-LD on the home page is gone from the target → REVIEW: lost rich-result markup.</td></tr> <tr><td>images-fewer</td> <td>doduo</td><td class="p-fail">fail</td><td>REVIEW</td><td>MIG-9</td><td>A page that carried four meaningful images has none on the target (captions kept, so body length is unchanged) → REVIEW.</td></tr> <tr><td>no-source-urls</td> <td>doduo</td><td class="p-edge">edge</td><td>INFO</td><td>—</td><td>The source publishes no sitemap and answers none of the probed URLs → nothing to compare → INFO, never a false PASS.</td></tr> <tr><td>bot-blocked</td> <td>doduo</td><td class="p-fail">fail</td><td>BLOCKED</td><td>GUARD-2</td><td>Every target page answers with a Cloudflare-style challenge → BLOCKED: an absence of evidence, never graded as a pass or a pile of FAILs.</td></tr> <tr><td>gold</td> <td>relicanth</td><td class="p-happy">happy</td><td>PASS</td><td>—</td><td>Two clean pages, a robots.txt and a sitemap → every page captured and hash-bound in manifest.json (each stored sha256 recomputed from disk), no secret findings → PASS.</td></tr> <tr><td>secret</td> <td>relicanth</td><td class="p-fail">fail</td><td>FAIL</td><td>ARC-1</td><td>A captured page carries an AWS-style access key (the documentation example value) → unaccepted secret finding → FAIL. The page is still archived verbatim: the archive is the record of what the site said.</td></tr> <tr><td>secret-accepted</td> <td>relicanth</td><td class="p-edge">edge</td><td>PASS</td><td>—</td><td>The same page with the finding explicitly --accept-ed (reason recorded on the manifest) → PASS. The control for `secret`: the only way past a finding is a stated reason.</td></tr> <tr><td>challenge</td> <td>relicanth</td><td class="p-fail">fail</td><td>REVIEW</td><td>GUARD-2</td><td>One page answers with a bot challenge → marked challenged and never stored as the page (only the clean page is archived) → REVIEW.</td></tr> <tr><td>unreachable</td> <td>relicanth</td><td class="p-fail">fail</td><td>FAIL</td><td>ARC-2</td><td>One listed URL cannot be fetched at all (connection refused) → that page has no historical record → FAIL. The two reachable pages are still archived.</td></tr> <tr><td>not-found-page</td> <td>relicanth</td><td class="p-edge">edge</td><td>PASS</td><td>—</td><td>A listed URL answers 404 → archived as the 404 it is and reported, but a real HTTP response is a capture, not a capture failure → PASS.</td></tr> <tr><td>gold</td> <td>klefki</td><td class="p-happy">happy</td><td>PASS</td><td>—</td><td>A rebuilt home page naming the live domain in canonical and og:url, no dev-endpoint or old-host assets, HSTS and the other transport headers set, the old sitemap URL resolving, unknown paths returning 404 → PASS with every defect group silent.</td></tr> <tr><td>canonical-names-target</td> <td>klefki</td><td class="p-fail">fail</td><td>FAIL</td><td>CUT-1</td><td>The canonical names the host the build is served from instead of the live domain → FAIL: every page tells search engines the preview is the real URL.</td></tr> <tr><td>canonical-missing</td> <td>klefki</td><td class="p-fail">fail</td><td>FAIL</td><td>CUT-2</td><td>No canonical link on a home page that is not a protected preview → FAIL.</td></tr> <tr><td>ogurl-names-target</td> <td>klefki</td><td class="p-fail">fail</td><td>REVIEW</td><td>CUT-3</td><td>The canonical is right but og:url names the serving host → REVIEW, one rung below the canonical: it is the lesser signal.</td></tr> <tr><td>r2-assets</td> <td>klefki</td><td class="p-fail">fail</td><td>FAIL</td><td>CUT-4</td><td>Media loads from a storage development endpoint (r2.dev), which the provider does not support for production traffic → FAIL.</td></tr> <tr><td>old-host-assets</td> <td>klefki</td><td class="p-fail">fail</td><td>REVIEW</td><td>CUT-5</td><td>A stylesheet still loads from the host being retired → REVIEW: it breaks the day the old site is switched off.</td></tr> <tr><td>no-hsts</td> <td>klefki</td><td class="p-fail">fail</td><td>REVIEW</td><td>CUT-6</td><td>The target sends no Strict-Transport-Security header → REVIEW. It belongs on the pre-live list because a long max-age is hard to walk back.</td></tr> <tr><td>sitemap-dead</td> <td>klefki</td><td class="p-fail">fail</td><td>FAIL</td><td>CUT-7</td><td>The sitemap URL the old robots.txt declares is a 404 on the new site → FAIL: Search Console has that URL on file, so it dies at cutover unnoticed.</td></tr> <tr><td>soft-404</td> <td>klefki</td><td class="p-fail">fail</td><td>FAIL</td><td>CUT-8</td><td>Every unmatched path answers 200 with the home page → soft 404s: every link check goes green and an unbounded set of duplicates is indexable → FAIL.</td></tr> <tr><td>bot-blocked</td> <td>klefki</td><td class="p-fail">fail</td><td>BLOCKED</td><td>GUARD-2</td><td>The target answers its home page with a bot challenge → BLOCKED, nothing checked, no defect invented.</td></tr> <tr><td>no-page</td> <td>klefki</td><td class="p-edge">edge</td><td>INFO</td><td>—</td><td>The target serves no page at its root → INFO (nothing to grade), never a false PASS.</td></tr> <tr><td>gold</td> <td>rotom</td><td class="p-happy">happy</td><td>PASS</td><td>—</td><td>A three-page site with a sitemap, accessible, fast, layout-clean pages that each carry their own SEO, complete Dentist schema and one WebP image → every lane PASS (the gallery lane stays INFO: one image is not a gallery) → overall PASS.</td></tr> <tr><td>low-contrast</td> <td>rotom</td><td class="p-fail">fail</td><td>FAIL</td><td>SITE-1</td><td>Light-grey body text on the home page, the sampled QA page → the QA lane FAILs and the overall is the worst lane → FAIL. Every site-wide lane stays PASS.</td></tr> <tr><td>dead-sitemap-url</td> <td>rotom</td><td class="p-fail">fail</td><td>FAIL</td><td>SITE-2</td><td>The sitemap lists a URL that is a 404 → the redirect lane FAILs, and nothing else moves → overall FAIL.</td></tr> <tr><td>duplicate-title</td> <td>rotom</td><td class="p-fail">fail</td><td>REVIEW</td><td>SITE-3</td><td>Two pages share one <title> → the on-page SEO lane REVIEWs → overall REVIEW, not FAIL.</td></tr> <tr><td>thin-schema</td> <td>rotom</td><td class="p-fail">fail</td><td>REVIEW</td><td>SITE-4</td><td>The Dentist markup loses a recommended property → the structured-data lane REVIEWs → overall REVIEW.</td></tr> <tr><td>secondary-broken-link</td> <td>rotom</td><td class="p-fail">fail</td><td>FAIL</td><td>SITE-5</td><td>A secondary page links to a 404 outside the sitemap. The link lane FAILs while the home-page QA and every other lane stay unchanged.</td></tr> <tr><td>secondary-thin-schema</td> <td>rotom</td><td class="p-fail">fail</td><td>REVIEW</td><td>SITE-6</td><td>Only a secondary page loses a recommended structured-data property. Site schema checks must include it even when browser QA samples only the home page.</td></tr> <tr><td>contact-link-near-miss</td> <td>rotom</td><td class="p-happy">happy</td><td>PASS</td><td>—</td><td>Valid short-code phone and encoded mail links on a secondary page must not become broken-link findings under site composition.</td></tr> <tr><td>bot-blocked</td> <td>rotom</td><td class="p-fail">fail</td><td>BLOCKED</td><td>GUARD-2</td><td>The very first request is answered with a bot challenge → BLOCKED and no lane runs: auditing a challenge page says nothing about the site, and a run that could not happen must never read as clean.</td></tr> <tr><td>gold</td> <td>yamask</td><td class="p-happy">happy</td><td>PASS</td><td>—</td><td>Both plugins on the old site are superseded and their code is gone, the form posts to a handler that outlives WordPress, the REST page count is available, and the new home page is lighter → PASS with every defect group silent.</td></tr> <tr><td>form-to-wordpress</td> <td>yamask</td><td class="p-fail">fail</td><td>FAIL</td><td>FUNC-1</td><td>The new site renders the contact form but posts it to admin-ajax.php, an endpoint that dies with WordPress → FAIL: it will accept every lead and discard it.</td></tr> <tr><td>inline-wp-call</td> <td>yamask</td><td class="p-fail">fail</td><td>FAIL</td><td>FUNC-2</td><td>An inline script on the new site still calls a /wp-json/ route → a live dependency on the retired stack → FAIL, not mere residue.</td></tr> <tr><td>user-enumeration-open</td> <td>yamask</td><td class="p-fail">fail</td><td>FAIL</td><td>FUNC-3</td><td>The old site refused /wp-json/wp/v2/users and the new site lists its users → the migration opened a surface that was deliberately closed → FAIL.</td></tr> <tr><td>plugin-code-shipped</td> <td>yamask</td><td class="p-fail">fail</td><td>REVIEW</td><td>FUNC-4</td><td>A plugin stylesheet that should have been stripped still loads on the new site → REVIEW: a quality regression, not a broken site.</td></tr> <tr><td>unmapped-plugin</td> <td>yamask</td><td class="p-fail">fail</td><td>REVIEW</td><td>FUNC-5</td><td>The old site loads a plugin nobody mapped → never dismissed: it becomes a named row and REVIEW. The plugin nobody remembers installing is the one that matters.</td></tr> <tr><td>feed-lost</td> <td>yamask</td><td class="p-fail">fail</td><td>REVIEW</td><td>FUNC-6</td><td>The RSS feed works on the old site and 404s on the new one → a user-facing surface was lost → REVIEW (retired on purpose, or an oversight).</td></tr> <tr><td>form-missing</td> <td>yamask</td><td class="p-fail">fail</td><td>REVIEW</td><td>FUNC-7</td><td>The old home page had a form and the new home page has none in its delivered HTML → REVIEW. The check runs no JavaScript, so it cannot call a script-injected form lost, only unconfirmed.</td></tr> <tr><td>not-lighter</td> <td>yamask</td><td class="p-fail">fail</td><td>REVIEW</td><td>FUNC-8</td><td>The new home page ships more bytes and more assets than the old one → REVIEW, so nobody calls the migration a performance win before checking.</td></tr> <tr><td>woocommerce-scope</td> <td>yamask</td><td class="p-fail">fail</td><td>FAIL</td><td>FUNC-9</td><td>The old site runs a store → a static export cannot run one → a scope flag about the whole migration, FAIL, not a per-plugin checklist row.</td></tr> <tr><td>bot-blocked</td> <td>yamask</td><td class="p-fail">fail</td><td>BLOCKED</td><td>GUARD-2</td><td>The new site answers its home page with a bot challenge → BLOCKED: the inventory could not be taken, and nothing is graded.</td></tr> <tr><td>no-page</td> <td>yamask</td><td class="p-edge">edge</td><td>INFO</td><td>—</td><td>The new site serves no home page → INFO (nothing to compare), never a false PASS.</td></tr> <tr><td>gold</td> <td>sentret</td><td class="p-happy">happy</td><td>PASS</td><td>—</td><td>Google returns a live service page that no longer names the retired service and a partner page that names the practice but not the service → PASS, every hit tag absent.</td></tr> <tr><td>indexed-gone</td> <td>sentret</td><td class="p-fail">fail</td><td>REVIEW</td><td>OFFSITE-1</td><td>Google still lists a deleted gallery for the retired service; the site answers 404 → REVIEW tagged indexed-gone (a 301 or a Search Console removal).</td></tr> <tr><td>surface-mention</td> <td>sentret</td><td class="p-fail">fail</td><td>REVIEW</td><td>OFFSITE-2</td><td>A named partner page still says the practice offers the retired service → REVIEW tagged surface-mention.</td></tr> <tr><td>surface-walled</td> <td>sentret</td><td class="p-edge">edge</td><td>BLOCKED</td><td>—</td><td>The only named surface answers a bot challenge and nothing else hits → BLOCKED, never a clean PASS for a source that could not be read.</td></tr> <tr><td>search-suspended</td> <td>sentret</td><td class="p-edge">edge</td><td>BLOCKED</td><td>—</td><td>The search engine answers every query empty because Google suspended it → BLOCKED, not a PASS built on zero results.</td></tr> <tr><td>person-gold</td> <td>sentret</td><td class="p-happy">happy</td><td>PASS</td><td>—</td><td>Google returns a partner page naming a namesake (Dr. John Marsh) with the practice → PASS: the same surname with another given name is not the person.</td></tr> <tr><td>person-offsite-mention</td> <td>sentret</td><td class="p-fail">fail</td><td>REVIEW</td><td>OFFSITE-3</td><td>A partner page still lists the provider as "E. Marsh, DDS" with the practice → REVIEW tagged offsite-mention.</td></tr> <tr><td>person-indexed-gone</td> <td>sentret</td><td class="p-fail">fail</td><td>REVIEW</td><td>OFFSITE-4</td><td>Google still lists the provider's deleted bio; the site answers 404 → REVIEW tagged indexed-gone.</td></tr> <tr><td>discover-gold</td> <td>patrat</td><td class="p-happy">happy</td><td>PASS</td><td>—</td><td>The term appears on no page, including the testimonial only site search can reach → PASS.</td></tr> <tr><td>discover-sitemap-miss</td> <td>patrat</td><td class="p-fail">fail</td><td>REVIEW</td><td>SCOUT-2</td><td>The term survives on a testimonial the sitemap does not list; --discover finds it through the site search → REVIEW, the matched page attributed to wp-site-search.</td></tr> <tr><td>all-walled</td> <td>patrat</td><td class="p-edge">edge</td><td>BLOCKED</td><td>—</td><td>The only page answers a bot challenge → BLOCKED: an unread site is never reported as free of the term.</td></tr> <tr><td>person-gold</td> <td>patrat</td><td class="p-happy">happy</td><td>PASS</td><td>—</td><td>The team page names only a namesake (Dr. John Marsh) → PASS.</td></tr> <tr><td>person-team-card</td> <td>patrat</td><td class="p-fail">fail</td><td>REVIEW</td><td>SCOUT-3</td><td>The team page, reached only through the home page link, still lists the provider as "E. Marsh, DDS" → REVIEW, found as a team page, in the body.</td></tr> <tr><td>person-schema-person</td> <td>patrat</td><td class="p-fail">fail</td><td>REVIEW</td><td>SCOUT-4</td><td>No visible text names the provider but the home page JSON-LD still lists her as an employee → REVIEW on the schema-person surface.</td></tr> <tr><td>person-byline</td> <td>patrat</td><td class="p-fail">fail</td><td>REVIEW</td><td>SCOUT-5</td><td>A blog post is still authored "Dr. Marsh" in its meta author → REVIEW on the byline surface of a blog post.</td></tr> <tr><td>gold</td> <td>zweilous</td><td class="p-happy">happy</td><td>PASS</td><td>—</td><td>Every page agrees with the contact page and footer; a labelled "special" price is a promotion, not a second price → PASS, every contradiction tag absent.</td></tr> <tr><td>phone-typo</td> <td>zweilous</td><td class="p-fail">fail</td><td>FAIL</td><td>CONTRA-1</td><td>A Northfield page gives 507-555-0109; the contact page gives 507-555-0100 → FAIL phone-conflict, both values with their URLs.</td></tr> <tr><td>tel-mismatch</td> <td>zweilous</td><td class="p-fail">fail</td><td>FAIL</td><td>CONTRA-2</td><td>A phone link shows 507-555-0200 but dials 507-555-0299 → FAIL phone-conflict.</td></tr> <tr><td>address-suite</td> <td>zweilous</td><td class="p-fail">fail</td><td>FAIL</td><td>CONTRA-3</td><td>Same street as the Northfield office, Suite 210 instead of Suite 200 → FAIL address-conflict.</td></tr> <tr><td>address-unlisted</td> <td>zweilous</td><td class="p-fail">fail</td><td>REVIEW</td><td>CONTRA-4</td><td>An address the contact page and footer do not list (an old office) → REVIEW address-unlisted.</td></tr> <tr><td>hours</td> <td>zweilous</td><td class="p-fail">fail</td><td>FAIL</td><td>CONTRA-5</td><td>Northfield weekday hours close at 6 PM on one page, 5 PM on the contact page → FAIL hours-conflict.</td></tr> <tr><td>price</td> <td>zweilous</td><td class="p-fail">fail</td><td>FAIL</td><td>CONTRA-6</td><td>The same item is $250 per kit on one page and $275 per kit on another → FAIL price-conflict.</td></tr> <tr><td>email</td> <td>zweilous</td><td class="p-fail">fail</td><td>REVIEW</td><td>CONTRA-7</td><td>An email the contact page and footer do not give → REVIEW email-unlisted.</td></tr> <tr><td>provider</td> <td>zweilous</td><td class="p-fail">fail</td><td>REVIEW</td><td>CONTRA-8</td><td>A service page names Dr. Owen Fairley, who is not on the team page → REVIEW provider-unlisted.</td></tr> <tr><td>credential</td> <td>zweilous</td><td class="p-fail">fail</td><td>REVIEW</td><td>CONTRA-9</td><td>Marcus Reyes is RDH on the team page and DDS on another → REVIEW credential-conflict.</td></tr> <tr><td>claim</td> <td>zweilous</td><td class="p-fail">fail</td><td>REVIEW</td><td>CONTRA-10</td><td>Founded 1998 on the home page, 2004 on the about page → REVIEW claim-conflict.</td></tr> <tr><td>service</td> <td>zweilous</td><td class="p-fail">fail</td><td>REVIEW</td><td>CONTRA-11</td><td>A /services/veneers/ page the services hub neither names nor links → REVIEW service-unlisted.</td></tr> <tr><td>all-walled</td> <td>zweilous</td><td class="p-edge">edge</td><td>BLOCKED</td><td>—</td><td>Every path answers 403 with a bot challenge → BLOCKED, never a PASS for a site that was never read, and no contradiction reported.</td></tr> <tr><td>no-facts</td> <td>zweilous</td><td class="p-edge">edge</td><td>INFO</td><td>—</td><td>Every page reads, but none states a phone, address, hours, price, email, person or claim → INFO, nothing to compare, never a PASS.</td></tr> <tr><td>bot-wall</td> <td>oranguru</td><td class="p-fail">fail</td><td>BLOCKED</td><td>GUARD-2</td><td>Every path answers 403 with a bot challenge → BLOCKED with the refusal as the reason; the challenge page's thin copy is never graded as the site's content.</td></tr> <tr><td>bot-wall</td> <td>growlithe</td><td class="p-fail">fail</td><td>BLOCKED</td><td>GUARD-2</td><td>Every path answers 403 with a bot challenge → BLOCKED with the refusal as the reason; no injection is reported about a page that was never read.</td></tr> <tr><td>bot-wall</td> <td>ampharos</td><td class="p-fail">fail</td><td>BLOCKED</td><td>GUARD-2</td><td>Every path answers 403 with a bot challenge → BLOCKED with the refusal as the reason; "no analytics detected" is never said about a page whose tags could not be read.</td></tr> <tr><td>bot-wall</td> <td>ariados</td><td class="p-fail">fail</td><td>BLOCKED</td><td>GUARD-2</td><td>The sitemap answers 403 with a bot challenge → BLOCKED naming the challenge; the challenge page is never reported as an unparseable sitemap.</td></tr> <tr><td>bot-wall</td> <td>beru</td><td class="p-fail">fail</td><td>BLOCKED</td><td>GUARD-2</td><td>Every path answers 403 with a bot challenge → BLOCKED with the refusal as the reason; no container is described for a page that was never read.</td></tr> <tr><td>bot-wall</td> <td>galvantula</td><td class="p-fail">fail</td><td>BLOCKED</td><td>GUARD-2</td><td>Every path answers 403 with a bot challenge → BLOCKED with the refusal as the reason; no orphan or dead-end is reported for a page with no readable links.</td></tr> <tr><td>bot-wall-list</td> <td>galvantula</td><td class="p-fail">fail</td><td>BLOCKED</td><td>GUARD-2</td><td>A URL list where all three pages answer 403 → BLOCKED, never a clean PASS: no link graph was built, so nothing is claimed about internal linking.</td></tr> <tr><td>bot-wall</td> <td>girafarig</td><td class="p-fail">fail</td><td>BLOCKED</td><td>GUARD-2</td><td>Every path answers 403 with a bot challenge → BLOCKED with the refusal as the reason; the challenge is never read as an llms.txt, valid or missing.</td></tr> <tr><td>bot-wall</td> <td>heading-structure</td><td class="p-fail">fail</td><td>BLOCKED</td><td>GUARD-2</td><td>Every path answers 403 with a bot challenge → BLOCKED with the refusal as the reason; the challenge page's own headings are never graded.</td></tr> <tr><td>bot-wall</td> <td>klink</td><td class="p-fail">fail</td><td>BLOCKED</td><td>GUARD-2</td><td>Every path answers 403 with a bot challenge → BLOCKED with the refusal as the reason; no link is reported broken on a page whose links were never read.</td></tr> <tr><td>bot-wall</td> <td>nav-ia</td><td class="p-fail">fail</td><td>BLOCKED</td><td>GUARD-2</td><td>Every path answers 403 with a bot challenge → BLOCKED with the refusal as the reason; "no navigation" and "thin page" are never said about the challenge page.</td></tr> <tr><td>bot-wall</td> <td>nosepass</td><td class="p-fail">fail</td><td>BLOCKED</td><td>GUARD-2</td><td>Every path answers 403 with a bot challenge → BLOCKED with the refusal as the reason; no missing schema or NAP mismatch is reported for a page that was never read.</td></tr> <tr><td>bot-wall</td> <td>orbeetle</td><td class="p-fail">fail</td><td>BLOCKED</td><td>GUARD-2</td><td>Every path answers 403 with a bot challenge → BLOCKED with the refusal as the reason; the challenge page's missing title, description and canonical are never graded.</td></tr> <tr><td>bot-wall</td> <td>porygon</td><td class="p-fail">fail</td><td>BLOCKED</td><td>GUARD-2</td><td>Every path answers 403 with a bot challenge → BLOCKED with the refusal as the reason; "no structured data" is never said about a page whose schema could not be read.</td></tr> <tr><td>bot-wall</td> <td>watchog</td><td class="p-fail">fail</td><td>BLOCKED</td><td>GUARD-2</td><td>Every path answers 403 with a bot challenge → BLOCKED with the refusal as the reason; the site is neither declared WordPress nor "not WordPress", and no plugin is counted.</td></tr> <tr><td>bot-wall</td> <td>bibarel</td><td class="p-fail">fail</td><td>BLOCKED</td><td>GUARD-2</td><td>Every path answers 403 with a bot challenge → BLOCKED with the refusal as the reason; the page is an ERROR row, never counted as thin or graded for freshness.</td></tr> <tr><td>bot-wall</td> <td>celebi</td><td class="p-fail">fail</td><td>BLOCKED</td><td>GUARD-2</td><td>Every path answers 403 with a bot challenge → BLOCKED with the refusal as the reason; the challenge page is never called undated or stale.</td></tr> <tr><td>bot-wall</td> <td>chimecho</td><td class="p-fail">fail</td><td>BLOCKED</td><td>GUARD-2</td><td>Every path answers 403 with a bot challenge → BLOCKED with the refusal as the reason; no expired or undated offer is reported for a page that was never read.</td></tr> <tr><td>bot-wall</td> <td>cinccino</td><td class="p-fail">fail</td><td>BLOCKED</td><td>GUARD-2</td><td>Every path answers 403 with a bot challenge → BLOCKED with the refusal as the reason, before any writing model is asked; no snippet is written and nothing reaches WordPress.</td></tr> <tr><td>bot-wall</td> <td>sigilyph</td><td class="p-fail">fail</td><td>BLOCKED</td><td>GUARD-2</td><td>Every path answers 403 with a bot challenge → BLOCKED with the refusal as the reason, before any writing model is asked; no alt text is written.</td></tr> <tr><td>bot-wall</td> <td>slowking</td><td class="p-fail">fail</td><td>BLOCKED</td><td>GUARD-2</td><td>Every path answers 403 with a bot challenge → BLOCKED with the refusal as the reason; the challenge page's copy is never rewritten.</td></tr> <tr><td>bot-wall</td> <td>smeargle</td><td class="p-fail">fail</td><td>BLOCKED</td><td>GUARD-2</td><td>Every path answers 403 with a bot challenge → BLOCKED with the refusal as the reason; no brief is graded against a page that was never read.</td></tr> <tr><td>bot-wall</td> <td>primarina</td><td class="p-fail">fail</td><td>BLOCKED</td><td>GUARD-2</td><td>Every path answers 403 with a bot challenge → BLOCKED with the refusal as the reason; the refusal is never graded as a brand-voice failure.</td></tr> <tr><td>bot-wall</td> <td>zoroark</td><td class="p-fail">fail</td><td>BLOCKED</td><td>GUARD-2</td><td>Every path answers 403 with a bot challenge → BLOCKED with the refusal as the reason; the challenge page's copy is never rewritten in the brand voice.</td></tr> <tr><td>not-found</td> <td>growlithe</td><td class="p-edge">edge</td><td>INFO</td><td>—</td><td>An ordinary 404 from a site that answered → INFO, not BLOCKED: the site responded, there is just nothing to scan. No injection is reported.</td></tr> <tr><td>not-found</td> <td>nosepass</td><td class="p-edge">edge</td><td>INFO</td><td>—</td><td>An ordinary 404 from a site that answered → INFO, not BLOCKED: there is nothing to audit, and no missing schema or NAP mismatch is reported for the error page.</td></tr> <tr><td>not-found</td> <td>celebi</td><td class="p-edge">edge</td><td>INFO</td><td>—</td><td>An ordinary 404 from a site that answered → INFO, not BLOCKED: the error page is never graded for freshness.</td></tr> <tr><td>not-found</td> <td>chimecho</td><td class="p-edge">edge</td><td>INFO</td><td>—</td><td>An ordinary 404 from a site that answered → INFO, not BLOCKED: no offer is reported on the error page.</td></tr> <tr><td>not-found</td> <td>axew</td><td class="p-edge">edge</td><td>INFO</td><td>—</td><td>An ordinary 404 → INFO, not a page graded for accessibility: the error page is not audited and no browser starts.</td></tr> <tr><td>not-found</td> <td>conkeldurr</td><td class="p-edge">edge</td><td>INFO</td><td>—</td><td>An ordinary 404 → INFO, not a page graded for mobile usability: the error page is not audited and no browser starts.</td></tr> <tr><td>not-found</td> <td>rapidash</td><td class="p-edge">edge</td><td>INFO</td><td>—</td><td>An ordinary 404 on a local run → INFO, not a slow page: the error page is not measured.</td></tr> <tr><td>gold</td> <td>absol</td><td class="p-happy">happy</td><td>PASS</td><td>—</td><td>A sourced, decision-first draft with a table, sources and a methodology section → score at or above 90 and no unsupported claim → PASS.</td></tr> <tr><td>unsupported-claim</td> <td>absol</td><td class="p-fail">fail</td><td>FAIL</td><td>DRAFT-1</td><td>A material numeric claim ("improve conversion by 27%") with no nearby source → FAIL independently of the score.</td></tr> <tr><td>low-score</td> <td>absol</td><td class="p-fail">fail</td><td>FAIL</td><td>DRAFT-2</td><td>A 64-word draft with no sections and no sources scores far below 90 → FAIL on score alone, with no unsupported claim among the reasons.</td></tr> <tr><td>ymyl-claim</td> <td>absol</td><td class="p-fail">fail</td><td>FAIL</td><td>DRAFT-3</td><td>The gold draft plus board-certification, FDA and cure language with no backing fact, under --ymyl → FAIL even though the score is 90 or more.</td></tr> <tr><td>ymyl-claim-unscanned</td> <td>absol</td><td class="p-edge">edge</td><td>PASS</td><td>—</td><td>The same draft without --ymyl → PASS: the regulated-claim scan is opt-in, so it never fires on content that did not ask for it.</td></tr> <tr><td>escalates-at-three</td> <td>absol</td><td class="p-edge">edge</td><td>FAIL</td><td>—</td><td>A failing draft at revision cycle 3 → the run escalates to an editor instead of inviting another retry.</td></tr> <tr><td>gold</td> <td>uxie</td><td class="p-happy">happy</td><td>PASS</td><td>—</td><td>The sourced, decision-first draft with a table and a relevant image scores 80 or more with no evidence gap → PASS.</td></tr> <tr><td>no-visuals</td> <td>uxie</td><td class="p-fail">fail</td><td>REVIEW</td><td>AIO-1</td><td>The gold draft without its decision table or image → extractability falls, the score lands in the 60–79 band → REVIEW, not FAIL.</td></tr> <tr><td>thin</td> <td>uxie</td><td class="p-fail">fail</td><td>FAIL</td><td>AIO-2</td><td>A 64-word draft with no sources, sections, table or image → score under 60 → FAIL.</td></tr> <tr><td>rendered-page</td> <td>uxie</td><td class="p-edge">edge</td><td>PASS</td><td>—</td><td>The gold draft with an optional rendered page → the published-page signals (Article schema, canonical, indexability, dates) are assessed instead of marked not-assessed.</td></tr></tbody></table> </body> </html>