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 oricoriohappyPASSMotion 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 axewhappyPASSClean, 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/FAILRealistic 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 audinohappyPASSAccessible + fast — audino overall PASS, and the sub-tools actually ran (guards against a false green when tools silently error).
kitchen-sink audinofailFAILMissing alt + low contrast (axew FAIL) + 4.2s block + heavy hero (rapidash FAIL) → audino FAIL.
wp-gold xatuhappyA WordPress page: generator 6.5.2, twentytwentyfour theme, CF7 + Yoast, WP Rocket cache footprint.
wp-divi xatushowcaseA Divi 4 site — /wp-content/themes/Divi + et_pb_ markup; xatu --deep resolves the major from Divi style.css.
not-wp xatuhappyA non-WordPress control page — no generator, no wp-content paths → NOT WORDPRESS.
wp-divi-fonts timburrfailREVIEWA 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 timburrfailFAIL260KB 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 cinccinofailREVIEWWeak generic title + missing meta description → Cinccino recommends a snippet and applies Yoast meta through the mock WordPress API.
brief-source smearglefailREVIEWA real source page grounded into a deterministic content brief through the mock compatible LLM.
images-missing-alt sigilyphfailFAILTwo meaningful images lack alt text while a decorative pixel is ignored; vision suggestions are written through the mock media API.
inventory-rich bibarelhappyPASSA substantial readable evergreen page with no stale signal → KEEP.
inventory-thin bibarelfailREVIEWA thin page with no search traffic → PRUNE, proving Bibarel combines content depth and value signals.
readability-hard slowkingfailREVIEWDense clinical copy grades REVIEW, then the deterministic rewrite lowers the measured reading grade and preserves the reviewable rewrite artifact.
meta-strong cinccinohappyPASSTitle 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 cinccinofailFAILNo 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), 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="./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 — 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>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></tbody></table> </body> </html>