{
  "url": "https://www.speedtest.net",
  "auditedAt": "2026-07-21T21:46:40.353Z",
  "mode": "report",
  "status": "completed",
  "statusDetail": "Coverage-complete representative audit of six paths. Excluded authenticated account history and exhaustive locale/article permutations.",
  "page": {
    "appType": "hybrid",
    "framework": "React-like app with a separate editorial template",
    "notes": "Public speed-test application with consent management, ads, settings, results, account and editorial content."
  },
  "evidenceUsed": [
    "screenshot",
    "video",
    "dom",
    "evaluate-probe",
    "layout-metrics",
    "trace",
    "har",
    "discoverability",
    "images",
    "headers",
    "cookies",
    "trackers",
    "secrets",
    "heap-summary",
    "axe-core",
    "Lighthouse",
    "Modern Web Guidance"
  ],
  "guidanceConsulted": [
    "fluid-scaling",
    "css-layout",
    "agentic-javascript-tools",
    "agentic-forms",
    "search-hidden-content",
    "html",
    "performance",
    "optimize-script-priority",
    "accessibility",
    "accessible-error-announcement",
    "language-detection",
    "support-global-calendar-systems",
    "identify-heavy-scripts",
    "identify-inp-causes",
    "privacy",
    "security",
    "stabilize-reactive-state",
    "resilient-context-menus-and-nested-dropdowns",
    "optimize-image-priority",
    "forms",
    "autofill-payment-form",
    "same-document-transitions",
    "cross-document-transitions",
    "declarative-dialog-popover-control",
    "scrollability-affordance-hints",
    "scroll-snap-state-sync",
    "dark-mode",
    "component-specific-light-dark-theme",
    "declarative-button-actions",
    "defer-rendering-heavy-content"
  ],
  "artifacts": [
    {
      "type": "other",
      "path": "evidence/article-dark-probe.json",
      "caption": "article dark probe.json",
      "findingIds": [
        "F1"
      ]
    },
    {
      "type": "layout",
      "path": "evidence/article-mobile-layout.json",
      "caption": "article mobile layout.json",
      "findingIds": []
    },
    {
      "type": "screenshot",
      "path": "evidence/article.png",
      "caption": "article.png",
      "findingIds": []
    },
    {
      "type": "other",
      "path": "evidence/axe.json",
      "caption": "axe.json",
      "findingIds": [
        "F10",
        "F11"
      ]
    },
    {
      "type": "other",
      "path": "evidence/consent-controls.json",
      "caption": "consent controls.json",
      "findingIds": []
    },
    {
      "type": "other",
      "path": "evidence/cookies.json",
      "caption": "cookies.json",
      "findingIds": [
        "F15"
      ]
    },
    {
      "type": "screenshot",
      "path": "evidence/core-flow-final.png",
      "caption": "core flow final.png",
      "findingIds": []
    },
    {
      "type": "screenshot",
      "path": "evidence/core-flow-full-final.png",
      "caption": "core flow full final.png",
      "findingIds": [
        "F4"
      ]
    },
    {
      "type": "video",
      "path": "evidence/core-flow-full.mp4",
      "caption": "core flow full.mp4",
      "findingIds": [
        "F4"
      ]
    },
    {
      "type": "other",
      "path": "evidence/core-flow-result.json",
      "caption": "core flow result.json",
      "findingIds": []
    },
    {
      "type": "video",
      "path": "evidence/core-flow.mp4",
      "caption": "core flow.mp4",
      "findingIds": []
    },
    {
      "type": "screenshot",
      "path": "evidence/discoverability-crawler.png",
      "caption": "discoverability crawler.png",
      "findingIds": []
    },
    {
      "type": "screenshot",
      "path": "evidence/discoverability-rendered.png",
      "caption": "discoverability rendered.png",
      "findingIds": []
    },
    {
      "type": "discoverability",
      "path": "evidence/discoverability.json",
      "caption": "discoverability.json",
      "findingIds": []
    },
    {
      "type": "other",
      "path": "evidence/guidance/list.json",
      "caption": "guidance/list.json",
      "findingIds": []
    },
    {
      "type": "other",
      "path": "evidence/guidance/retrieved-findings.md",
      "caption": "guidance/retrieved findings.md",
      "findingIds": []
    },
    {
      "type": "other",
      "path": "evidence/guidance/retrieved.md",
      "caption": "guidance/retrieved.md",
      "findingIds": []
    },
    {
      "type": "other",
      "path": "evidence/guidance/search-adapt-to-the-form-factor.json",
      "caption": "guidance/search adapt to the form factor.json",
      "findingIds": []
    },
    {
      "type": "other",
      "path": "evidence/guidance/search-be-agent-ready.json",
      "caption": "guidance/search be agent ready.json",
      "findingIds": []
    },
    {
      "type": "other",
      "path": "evidence/guidance/search-be-discoverable.json",
      "caption": "guidance/search be discoverable.json",
      "findingIds": []
    },
    {
      "type": "other",
      "path": "evidence/guidance/search-be-fast-and-stable.json",
      "caption": "guidance/search be fast and stable.json",
      "findingIds": []
    },
    {
      "type": "other",
      "path": "evidence/guidance/search-be-inclusive.json",
      "caption": "guidance/search be inclusive.json",
      "findingIds": []
    },
    {
      "type": "other",
      "path": "evidence/guidance/search-be-internationalised.json",
      "caption": "guidance/search be internationalised.json",
      "findingIds": []
    },
    {
      "type": "other",
      "path": "evidence/guidance/search-be-memory-efficient.json",
      "caption": "guidance/search be memory efficient.json",
      "findingIds": []
    },
    {
      "type": "other",
      "path": "evidence/guidance/search-be-private-and-secure.json",
      "caption": "guidance/search be private and secure.json",
      "findingIds": []
    },
    {
      "type": "other",
      "path": "evidence/guidance/search-be-resilient.json",
      "caption": "guidance/search be resilient.json",
      "findingIds": []
    },
    {
      "type": "other",
      "path": "evidence/guidance/search-be-sustainable.json",
      "caption": "guidance/search be sustainable.json",
      "findingIds": []
    },
    {
      "type": "other",
      "path": "evidence/guidance/search-be-trustworthy.json",
      "caption": "guidance/search be trustworthy.json",
      "findingIds": []
    },
    {
      "type": "other",
      "path": "evidence/guidance/search-follow-best-practices.json",
      "caption": "guidance/search follow best practices.json",
      "findingIds": []
    },
    {
      "type": "other",
      "path": "evidence/guidance/search-implement-natural-interactions.json",
      "caption": "guidance/search implement natural interactions.json",
      "findingIds": []
    },
    {
      "type": "other",
      "path": "evidence/guidance/search-maximize-content-reduce-noise.json",
      "caption": "guidance/search maximize content reduce noise.json",
      "findingIds": []
    },
    {
      "type": "other",
      "path": "evidence/guidance/search-provide-guided-navigation.json",
      "caption": "guidance/search provide guided navigation.json",
      "findingIds": []
    },
    {
      "type": "other",
      "path": "evidence/guidance/search-respect-user-preferences.json",
      "caption": "guidance/search respect user preferences.json",
      "findingIds": []
    },
    {
      "type": "other",
      "path": "evidence/guidance/search-support-core-task-success.json",
      "caption": "guidance/search support core task success.json",
      "findingIds": []
    },
    {
      "type": "other",
      "path": "evidence/headers.json",
      "caption": "headers.json",
      "findingIds": [
        "F15"
      ]
    },
    {
      "type": "heap",
      "path": "evidence/heap-baseline.json",
      "caption": "heap baseline.json",
      "findingIds": []
    },
    {
      "type": "heap",
      "path": "evidence/heap-post.json",
      "caption": "heap post.json",
      "findingIds": []
    },
    {
      "type": "heap",
      "path": "evidence/heap-rejected-baseline.json",
      "caption": "heap rejected baseline.json",
      "findingIds": []
    },
    {
      "type": "screenshot",
      "path": "evidence/home-after-reject-desktop.png",
      "caption": "home after reject desktop.png",
      "findingIds": []
    },
    {
      "type": "screenshot",
      "path": "evidence/home-desktop.png",
      "caption": "home desktop.png",
      "findingIds": []
    },
    {
      "type": "dom",
      "path": "evidence/home-dom.json",
      "caption": "home dom.json",
      "findingIds": []
    },
    {
      "type": "layout",
      "path": "evidence/home-mobile-layout.json",
      "caption": "home mobile layout.json",
      "findingIds": [
        "F12"
      ]
    },
    {
      "type": "screenshot",
      "path": "evidence/home-mobile.png",
      "caption": "home mobile.png",
      "findingIds": []
    },
    {
      "type": "screenshot",
      "path": "evidence/home-rejected-desktop.png",
      "caption": "home rejected desktop.png",
      "findingIds": []
    },
    {
      "type": "screenshot",
      "path": "evidence/home-rejected-mobile.png",
      "caption": "home rejected mobile.png",
      "findingIds": []
    },
    {
      "type": "har-summary",
      "path": "evidence/home-summary.json",
      "caption": "home summary.json",
      "findingIds": [
        "F8",
        "F14"
      ]
    },
    {
      "type": "trace-summary",
      "path": "evidence/home-trace-summary.json",
      "caption": "home trace summary.json",
      "findingIds": [
        "F6",
        "F7"
      ]
    },
    {
      "type": "trace",
      "path": "evidence/home-trace.json",
      "caption": "home trace.json",
      "findingIds": [
        "F6"
      ]
    },
    {
      "type": "har",
      "path": "evidence/home.har",
      "caption": "home.har",
      "findingIds": [
        "F8",
        "F14"
      ]
    },
    {
      "type": "other",
      "path": "evidence/images.json",
      "caption": "images.json",
      "findingIds": []
    },
    {
      "type": "lighthouse",
      "path": "evidence/lighthouse.json",
      "caption": "lighthouse.json",
      "findingIds": [
        "F6",
        "F7",
        "F9"
      ]
    },
    {
      "type": "other",
      "path": "evidence/locale-de.json",
      "caption": "locale de.json",
      "findingIds": [
        "F17"
      ]
    },
    {
      "type": "other",
      "path": "evidence/login-controls.json",
      "caption": "login controls.json",
      "findingIds": []
    },
    {
      "type": "other",
      "path": "evidence/login-email-controls.json",
      "caption": "login email controls.json",
      "findingIds": []
    },
    {
      "type": "screenshot",
      "path": "evidence/login.png",
      "caption": "login.png",
      "findingIds": []
    },
    {
      "type": "other",
      "path": "evidence/not-found.json",
      "caption": "not found.json",
      "findingIds": [
        "F16",
        "F18"
      ]
    },
    {
      "type": "other",
      "path": "evidence/probe-article.json",
      "caption": "probe article.json",
      "findingIds": [
        "F12",
        "F13"
      ]
    },
    {
      "type": "other",
      "path": "evidence/probe-home.json",
      "caption": "probe home.json",
      "findingIds": [
        "F5"
      ]
    },
    {
      "type": "other",
      "path": "evidence/probe-login.json",
      "caption": "probe login.json",
      "findingIds": []
    },
    {
      "type": "other",
      "path": "evidence/probe-preferences.json",
      "caption": "probe preferences.json",
      "findingIds": [
        "F2",
        "F3"
      ]
    },
    {
      "type": "other",
      "path": "evidence/probe-results.json",
      "caption": "probe results.json",
      "findingIds": [
        "F5",
        "F12"
      ]
    },
    {
      "type": "other",
      "path": "evidence/probe-settings.json",
      "caption": "probe settings.json",
      "findingIds": []
    },
    {
      "type": "other",
      "path": "evidence/recon.json",
      "caption": "recon.json",
      "findingIds": []
    },
    {
      "type": "dom",
      "path": "evidence/resource-dom.json",
      "caption": "resource dom.json",
      "findingIds": []
    },
    {
      "type": "screenshot",
      "path": "evidence/results.png",
      "caption": "results.png",
      "findingIds": []
    },
    {
      "type": "other",
      "path": "evidence/secrets.json",
      "caption": "secrets.json",
      "findingIds": []
    },
    {
      "type": "other",
      "path": "evidence/settings-controls.json",
      "caption": "settings controls.json",
      "findingIds": []
    },
    {
      "type": "screenshot",
      "path": "evidence/settings.png",
      "caption": "settings.png",
      "findingIds": []
    },
    {
      "type": "other",
      "path": "evidence/site-files.json",
      "caption": "site files.json",
      "findingIds": []
    },
    {
      "type": "other",
      "path": "evidence/trackers.json",
      "caption": "trackers.json",
      "findingIds": [
        "F14"
      ]
    }
  ],
  "config": {
    "loaded": false
  },
  "coverage": {
    "catalogVersion": "modern-web-guidance@0.0.172",
    "catalogChecksum": "sha256:78ccfdb2d483f4c57d9dafed80fd86c6265585a56457c8dcfddc254b80fb44d7",
    "expected": 58,
    "recorded": 58,
    "judged": 58,
    "blocked": 0,
    "notRun": 0,
    "missing": 0,
    "unknown": 0,
    "duplicates": 0,
    "complete": true
  },
  "checkOutcomes": [
    {
      "principleId": "respect-user-preferences",
      "checkId": "respects-color-scheme",
      "status": "issues",
      "confidence": "high",
      "method": "HINT (not mandatory): a screenshot or computed background under an emulated prefers-color-scheme: dark condition will reveal whether surfaces re-tint; the page CSS / a color-scheme declaration is corroborating evidence. The model chooses the method.",
      "evidence": "Dark-media computed-style probe compared app and editorial surfaces.",
      "findingIds": [
        "F1"
      ],
      "pathIds": [
        "article"
      ]
    },
    {
      "principleId": "respect-user-preferences",
      "checkId": "respects-reduced-motion",
      "status": "issues",
      "confidence": "high",
      "method": "HINT: a transition video, or an in-page probe of getAnimations()/computed animation under an emulated prefers-reduced-motion: reduce condition, can show whether motion stops. The model chooses.",
      "evidence": "Reduced-motion emulation plus getAnimations and CSS media-rule inspection.",
      "findingIds": [
        "F2"
      ],
      "pathIds": [
        "home"
      ]
    },
    {
      "principleId": "respect-user-preferences",
      "checkId": "respects-contrast",
      "status": "issues",
      "confidence": "medium",
      "method": "HINT: a screenshot under emulated prefers-contrast: more / forced-colors, or an axe/contrast probe, can show whether controls and text survive. The model chooses.",
      "evidence": "prefers-contrast emulation plus computed styles and Lighthouse contrast audit.",
      "findingIds": [
        "F3"
      ],
      "pathIds": [
        "home"
      ]
    },
    {
      "principleId": "implement-natural-interactions",
      "checkId": "view-transitions",
      "status": "pass",
      "confidence": "high",
      "method": "HINT: a transition video of a route/state change shows whether it animates; the page source / ::view-transition usage corroborates. The model chooses.",
      "evidence": "Recorded core journey and DOM API/state inspection showed immediate, coherent state transitions without disorienting motion.",
      "pathIds": [
        "home"
      ]
    },
    {
      "principleId": "implement-natural-interactions",
      "checkId": "scroll-driven-animations",
      "status": "not-applicable",
      "confidence": "high",
      "method": "HINT: source/CSS inspection for animation-timeline: scroll()/view(); a long-task / scroll-handler probe can flag the main-thread anti-pattern. The model chooses.",
      "evidence": "No scroll narrative, carousel, parallax, or progress animation is required on the audited core, settings, login, results or article templates.",
      "reason": "No scroll narrative, carousel, parallax, or progress animation is required on the audited core, settings, login, results or article templates.",
      "pathIds": [
        "home"
      ]
    },
    {
      "principleId": "implement-natural-interactions",
      "checkId": "physical-gestures",
      "status": "not-applicable",
      "confidence": "high",
      "method": "HINT: CSS inspection for scroll-snap / overscroll-behavior / physics-based easing vs custom pointermove listeners. The model chooses.",
      "evidence": "The audited desktop/mobile web task uses tap/click controls and has no gesture-only surface that needs physical gesture mapping.",
      "reason": "The audited desktop/mobile web task uses tap/click controls and has no gesture-only surface that needs physical gesture mapping.",
      "pathIds": [
        "home"
      ]
    },
    {
      "principleId": "provide-guided-navigation",
      "checkId": "scroll-state-aware-chrome",
      "status": "pass",
      "confidence": "high",
      "method": "HINT: a transition video of scrolling, or CSS inspection for scroll-state container queries. The model chooses.",
      "evidence": "Representative screenshots and route probes show persistent, compact navigation that does not obscure content.",
      "pathIds": [
        "home"
      ]
    },
    {
      "principleId": "provide-guided-navigation",
      "checkId": "anchored-positioning",
      "status": "pass",
      "confidence": "high",
      "method": "HINT: CSS inspection for anchor-name / position-anchor / position-try on overlays; a screenshot of an open overlay near a viewport edge can show drift. The model chooses.",
      "evidence": "Menus and contextual controls remain associated with their triggers in the inspected DOM and viewport captures.",
      "pathIds": [
        "home"
      ]
    },
    {
      "principleId": "provide-guided-navigation",
      "checkId": "directs-attention",
      "status": "pass",
      "confidence": "high",
      "method": "HINT: CSS inspection for ::highlight / scroll-marker; a transition video can show whether attention is cued after navigation. The model chooses.",
      "evidence": "The GO control and speed gauge provide a singular visual target; the recorded flow visibly progresses through measurement to results.",
      "pathIds": [
        "home"
      ]
    },
    {
      "principleId": "maximize-content-reduce-noise",
      "checkId": "no-intrusive-interruptions",
      "status": "pass",
      "confidence": "high",
      "method": "HINT: a screenshot on load, or a DOM probe for full-viewport overlays present before interaction. The model chooses.",
      "evidence": "The consent dialog is legally contextual and offers same-layer Reject All and Accept actions; rejecting proceeds to the task.",
      "pathIds": [
        "home"
      ]
    },
    {
      "principleId": "maximize-content-reduce-noise",
      "checkId": "semantic-dismissible-primitives",
      "status": "pass",
      "confidence": "high",
      "method": "HINT: DOM/source inspection for popover / <dialog> / <details> vs custom overlay divs with manual dismiss handling. The model chooses.",
      "evidence": "Consent controls are named BUTTON elements with explicit reject and preference-center actions.",
      "pathIds": [
        "home"
      ]
    },
    {
      "principleId": "maximize-content-reduce-noise",
      "checkId": "reduced-chrome",
      "status": "issues",
      "confidence": "high",
      "method": "HINT: a screenshot plus layout metrics can show the proportion of the viewport given to chrome vs content. The model chooses.",
      "evidence": "Core-flow visual capture shows multiple ad blocks competing with the gauge.",
      "findingIds": [
        "F4"
      ],
      "pathIds": [
        "home"
      ]
    },
    {
      "principleId": "adapt-to-the-form-factor",
      "checkId": "responsive-no-horizontal-scroll",
      "status": "pass",
      "confidence": "high",
      "method": "HINT: layout metrics (scrollWidth vs innerWidth) and a screenshot at an emulated narrow mobile viewport reveal overflow. The model chooses.",
      "evidence": "360x800 layout measured 0px horizontal overflow on both app and article templates.",
      "pathIds": [
        "home"
      ]
    },
    {
      "principleId": "adapt-to-the-form-factor",
      "checkId": "component-level-responsiveness",
      "status": "pass",
      "confidence": "high",
      "method": "HINT: CSS inspection for @container / container-type; a computed-style probe of the same component in a wide vs narrow container shows whether it adapts. The model chooses.",
      "evidence": "App and article content reflowed to 360px without clipping; desktop and mobile captures retained core controls.",
      "pathIds": [
        "home"
      ]
    },
    {
      "principleId": "adapt-to-the-form-factor",
      "checkId": "input-modality-aware",
      "status": "issues",
      "confidence": "high",
      "method": "HINT: a focus probe (focus an element, read the computed outline) or an axe target-size check; a screenshot of a focused control corroborates. The model chooses.",
      "evidence": "Geometry and focus probes measured undersized menu/result controls.",
      "findingIds": [
        "F5"
      ],
      "pathIds": [
        "home"
      ]
    },
    {
      "principleId": "support-core-task-success",
      "checkId": "clear-purpose-and-primary-action",
      "status": "pass",
      "confidence": "high",
      "method": "HINT: screenshot the first viewport and key scrolled states; inspect heading structure, nav labels, button text, and visual hierarchy; a task walkthrough can show whether the next action is obvious. The model chooses.",
      "evidence": "Homepage DOM exposes Speedtest by Ookla and a prominent GO action; screenshot/video confirm visual priority.",
      "pathIds": [
        "home"
      ]
    },
    {
      "principleId": "support-core-task-success",
      "checkId": "primary-flow-completion",
      "status": "pass",
      "confidence": "high",
      "method": "HINT: run the flow manually with screenshots/DOM snapshots at each step; compare expected vs actual path length; inspect form requirements, navigation continuity, and blockers. The model chooses.",
      "evidence": "The 70-second active probe completed at /result/19459942607 with download 30.96, upload 56.81 and ping 13.",
      "pathIds": [
        "home"
      ]
    },
    {
      "principleId": "support-core-task-success",
      "checkId": "clear-system-state-and-recovery",
      "status": "pass",
      "confidence": "high",
      "method": "HINT: exercise network delay/failure, invalid input, empty data and success states; screenshot the state messaging and recovery controls; inspect whether browser history and focus remain sensible. The model chooses.",
      "evidence": "Video showed progress gauge, server identity, metrics and completion; result offers Change Server and a repeat GO action.",
      "pathIds": [
        "home"
      ]
    },
    {
      "principleId": "be-fast-and-stable",
      "checkId": "good-core-web-vitals",
      "status": "issues",
      "confidence": "high",
      "method": "HINT: Lighthouse reports LCP/CLS/TBT directly and the model may run it; layout metrics + a layout-shift observer + a long-task observer (the evidence primitives) give the same signal first-party. The model chooses.",
      "evidence": "Lighthouse and trace timings directly measured startup performance.",
      "findingIds": [
        "F6"
      ],
      "pathIds": [
        "home"
      ]
    },
    {
      "principleId": "be-fast-and-stable",
      "checkId": "visual-stability",
      "status": "pass",
      "confidence": "high",
      "method": "HINT: the layout primitive's CLS observer captures shifts; a transition video of the first seconds shows content jumping. The model chooses.",
      "evidence": "Mobile layout CLS was 0.0087, article CLS was 0 and Lighthouse CLS was 0.00004.",
      "pathIds": [
        "home"
      ]
    },
    {
      "principleId": "be-fast-and-stable",
      "checkId": "efficient-main-thread",
      "status": "issues",
      "confidence": "high",
      "method": "HINT: the layout primitive records long tasks; a heap summary shows the object population; Lighthouse reports TBT. The model chooses.",
      "evidence": "Lighthouse and trace long-task/TBT measurements.",
      "findingIds": [
        "F7"
      ],
      "pathIds": [
        "home"
      ]
    },
    {
      "principleId": "be-fast-and-stable",
      "checkId": "efficient-resource-delivery",
      "status": "issues",
      "confidence": "high",
      "method": "HINT: a HAR summary can reveal cache headers, redirects, render-blocking candidates, weight offenders and dependency shape; a trace/Lighthouse insight report can corroborate LCP discovery, render-blocking, font-display and document latency. The model chooses.",
      "evidence": "HAR totals and third-party byte attribution.",
      "findingIds": [
        "F8"
      ],
      "pathIds": [
        "home"
      ]
    },
    {
      "principleId": "be-fast-and-stable",
      "checkId": "trim-unused-and-duplicate-code",
      "status": "issues",
      "confidence": "high",
      "method": "HINT: Lighthouse/trace/code-coverage style evidence can flag unused JS/CSS, duplicated JavaScript and legacy code; a HAR summary shows third-party byte cost and request count. The model chooses.",
      "evidence": "Lighthouse unused JavaScript audit.",
      "findingIds": [
        "F9"
      ],
      "pathIds": [
        "home"
      ]
    },
    {
      "principleId": "be-inclusive",
      "checkId": "names-roles-labels",
      "status": "issues",
      "confidence": "high",
      "method": "HINT: axe-core (injectable via the evaluate primitive) or Lighthouse's a11y audits enumerate these; a DOM probe of the accessibility-relevant attributes is a first-party alternative. The model chooses.",
      "evidence": "axe-core full-document violation scan after rejecting consent.",
      "findingIds": [
        "F10"
      ],
      "pathIds": [
        "home"
      ]
    },
    {
      "principleId": "be-inclusive",
      "checkId": "sufficient-contrast",
      "status": "pass",
      "confidence": "high",
      "method": "HINT: axe contrast rules, a Lighthouse contrast audit, or an in-page probe computing contrast ratios from computed colours. The model chooses.",
      "evidence": "Lighthouse accessibility score 0.96 had no color-contrast failure; visual captures show strong light/dark contrast.",
      "pathIds": [
        "home"
      ]
    },
    {
      "principleId": "be-inclusive",
      "checkId": "structure-and-focus",
      "status": "issues",
      "confidence": "high",
      "method": "HINT: axe/Lighthouse structural audits; a focus-walk probe (tab through, read activeElement + computed outline) is a first-party alternative. The model chooses.",
      "evidence": "axe landmark, region and heading checks.",
      "findingIds": [
        "F11"
      ],
      "pathIds": [
        "home"
      ]
    },
    {
      "principleId": "be-inclusive",
      "checkId": "legible-text",
      "status": "pass",
      "confidence": "high",
      "method": "HINT: a screenshot of body and heading text, plus CSS inspection for text-wrap / text alignment / font fallback handling. The model chooses.",
      "evidence": "Computed body text is 16px in the app and 14.496px in the article; desktop/mobile captures remain readable.",
      "pathIds": [
        "home"
      ]
    },
    {
      "principleId": "be-inclusive",
      "checkId": "zoom-reflow-targets-and-media",
      "status": "issues",
      "confidence": "high",
      "method": "HINT: Lighthouse/axe target-size, meta-viewport and media-caption audits are useful signals; screenshots at narrow and zoomed conditions plus DOM/media inspection can corroborate. The model chooses.",
      "evidence": "Mobile reflow metrics plus objective target geometry.",
      "findingIds": [
        "F12"
      ],
      "pathIds": [
        "home"
      ]
    },
    {
      "principleId": "follow-best-practices",
      "checkId": "no-console-errors",
      "status": "pass",
      "confidence": "high",
      "method": "HINT: capture Runtime/Log CDP events, or a probe that reads collected errors; Lighthouse reports this too. The model chooses.",
      "evidence": "Lighthouse errors-in-console audit scored 1 with no logged browser errors.",
      "pathIds": [
        "home"
      ]
    },
    {
      "principleId": "follow-best-practices",
      "checkId": "sound-document-and-assets",
      "status": "pass",
      "confidence": "high",
      "method": "HINT: a DOM/source probe for doctype/charset/img dimensions; CSS inspection for repetition; Lighthouse best-practices audits cover the rest. The model chooses.",
      "evidence": "DOM confirms HTML doctype, UTF-8-rendered content, viewport metadata and modern SVG imagery with alt text.",
      "pathIds": [
        "home"
      ]
    },
    {
      "principleId": "follow-best-practices",
      "checkId": "browser-platform-hygiene",
      "status": "pass",
      "confidence": "high",
      "method": "HINT: Lighthouse best-practices audits and DevTools inspector/deprecation signals can surface these; DOM/source probes can verify paste handlers and prompt timing. The model chooses.",
      "evidence": "Lighthouse best-practices scored 1.00; resource DOM confirms high-priority scripts are async or module, not parser-blocking classic scripts.",
      "pathIds": [
        "home"
      ]
    },
    {
      "principleId": "be-discoverable",
      "checkId": "title-and-description",
      "status": "pass",
      "confidence": "high",
      "method": "HINT: a DOM probe reads <title> and meta[name=description]; Lighthouse SEO audits cover the same ground. The model chooses.",
      "evidence": "All five representative paths expose distinct titles, descriptions and H1 content.",
      "pathIds": [
        "home"
      ]
    },
    {
      "principleId": "be-discoverable",
      "checkId": "crawlable-and-mobile-friendly",
      "status": "pass",
      "confidence": "high",
      "method": "HINT: a DOM probe for anchor hrefs, viewport meta, and robots; Lighthouse SEO audits corroborate. The model chooses.",
      "evidence": "Discoverability found non-shell raw HTML with title/H1/description and 47% word coverage; mobile layouts had viewport metadata and no overflow.",
      "pathIds": [
        "home"
      ]
    },
    {
      "principleId": "be-discoverable",
      "checkId": "canonical-and-indexing-signals",
      "status": "pass",
      "confidence": "high",
      "method": "HINT: inspect response status and headers, <link rel=canonical>, hreflang links, robots meta, robots.txt and sitemap.xml; Lighthouse SEO audits cover several of these. The model chooses.",
      "evidence": "Canonical URLs exist on representative pages; robots.txt and sitemap.xml returned 200 with explicit route indexes.",
      "pathIds": [
        "home"
      ]
    },
    {
      "principleId": "be-discoverable",
      "checkId": "structured-and-shareable-metadata",
      "status": "issues",
      "confidence": "high",
      "method": "HINT: inspect JSON-LD/microdata and social preview tags against visible content; Lighthouse has a manual structured-data audit, and ad-hoc probes can parse schema.org blocks. The model chooses.",
      "evidence": "Article has canonical/description/Open Graph title but no JSON-LD.",
      "findingIds": [
        "F13"
      ],
      "pathIds": [
        "article"
      ]
    },
    {
      "principleId": "be-private-and-secure",
      "checkId": "secure-transport-and-headers",
      "status": "pass",
      "confidence": "high",
      "method": "HINT: inspect response headers / page protocol via an evaluate probe or the network layer; Lighthouse best-practices flags HTTPS and CSP issues. The model chooses.",
      "evidence": "HTTPS plus HSTS preload, nosniff, DENY framing, referrer and permissions policies were directly observed.",
      "pathIds": [
        "home"
      ]
    },
    {
      "principleId": "be-private-and-secure",
      "checkId": "data-minimisation-and-third-parties",
      "status": "issues",
      "confidence": "high",
      "method": "HINT: inspect network requests and third-party origins; a probe of analytics/beacon calls. The model chooses.",
      "evidence": "Tracker and HAR origin attribution.",
      "findingIds": [
        "F14"
      ],
      "pathIds": [
        "home"
      ]
    },
    {
      "principleId": "be-private-and-secure",
      "checkId": "in-context-permissions-and-modern-auth",
      "status": "pass",
      "confidence": "high",
      "method": "HINT: a probe for permission requests fired on load; source inspection for passkey / WebAuthn / navigator.credentials usage in auth flows. The model chooses.",
      "evidence": "Permissions Policy limits sensitive features; no unsolicited permission prompt occurred; email/password fields use email/current-password autocomplete.",
      "pathIds": [
        "home"
      ]
    },
    {
      "principleId": "be-private-and-secure",
      "checkId": "defensive-browser-policies",
      "status": "issues",
      "confidence": "high",
      "method": "HINT: inspect response headers and browser security state; Lighthouse/DevTools security audits can corroborate HSTS, clickjacking, Trusted Types, origin isolation and third-party cookie findings. The model chooses.",
      "evidence": "Headers and cookie primitives directly inspected policy values and flags.",
      "findingIds": [
        "F15"
      ],
      "pathIds": [
        "home"
      ]
    },
    {
      "principleId": "be-resilient",
      "checkId": "progressive-enhancement",
      "status": "pass",
      "confidence": "high",
      "method": "HINT: load with scripting disabled or compare a no-JS fetch of the HTML against the rendered page; check for Baseline-aware fallbacks in source. The model chooses.",
      "evidence": "Raw HTML is not a JS shell and retains title, H1 and description; editorial content is server-visible.",
      "pathIds": [
        "home"
      ]
    },
    {
      "principleId": "be-resilient",
      "checkId": "resilient-runtime-behaviour",
      "status": "pass",
      "confidence": "high",
      "method": "HINT: exercise menus near viewport edges with a screenshot; a probe of async/visibility behaviour. The model chooses.",
      "evidence": "The full active speed test completed without console errors and exposed repeat/server-change controls.",
      "pathIds": [
        "home"
      ]
    },
    {
      "principleId": "be-resilient",
      "checkId": "offline-and-installable",
      "status": "not-applicable",
      "confidence": "high",
      "method": "HINT: a probe for a service worker registration and a web app manifest; test behaviour offline. The model chooses.",
      "evidence": "A bandwidth measurement requires a live network, and the site manifest contains icons only; offline/installability is not a meaningful core-task expectation here.",
      "reason": "A bandwidth measurement requires a live network, and the site manifest contains icons only; offline/installability is not a meaningful core-task expectation here.",
      "pathIds": [
        "home"
      ]
    },
    {
      "principleId": "be-resilient",
      "checkId": "network-and-http-failure-states",
      "status": "issues",
      "confidence": "high",
      "method": "HINT: simulate failed fetches/offline mode or inspect representative 404/500 routes; screenshots and DOM snapshots of error/loading/empty states show whether recovery is possible. The model chooses.",
      "evidence": "Invalid-route test directly exercised the site error state.",
      "findingIds": [
        "F16"
      ],
      "pathIds": [
        "not-found"
      ]
    },
    {
      "principleId": "be-internationalised",
      "checkId": "lang-dir-and-logical-properties",
      "status": "pass",
      "confidence": "high",
      "method": "HINT: a DOM probe for <html lang>/dir and CSS inspection for logical vs physical properties. The model chooses.",
      "evidence": "English and German probes set lang correctly; CSS inspection found logical properties and locale links include RTL Arabic.",
      "pathIds": [
        "settings"
      ]
    },
    {
      "principleId": "be-internationalised",
      "checkId": "locale-aware-data",
      "status": "issues",
      "confidence": "high",
      "method": "HINT: source inspection for Intl.* usage vs hand-rolled formatting; a probe of rendered dates/numbers under a different locale. The model chooses.",
      "evidence": "German settings route and selected date/time defaults were directly inspected.",
      "findingIds": [
        "F17"
      ],
      "pathIds": [
        "settings"
      ]
    },
    {
      "principleId": "be-internationalised",
      "checkId": "time-zone-correctness",
      "status": "not-applicable",
      "confidence": "medium",
      "method": "HINT: source inspection for time-zone-aware date handling vs naive local Date math. The model chooses.",
      "evidence": "Audited flows show instantaneous local measurements, not scheduled or cross-zone events; no user-visible time-zone conversion surface was present.",
      "reason": "Audited flows show instantaneous local measurements, not scheduled or cross-zone events; no user-visible time-zone conversion surface was present.",
      "pathIds": [
        "home"
      ]
    },
    {
      "principleId": "be-trustworthy",
      "checkId": "no-dark-patterns",
      "status": "pass",
      "confidence": "high",
      "method": "HINT: a screenshot of consent/upsell/cancel flows; source inspection for declarative button actions vs misleading controls. The model chooses.",
      "evidence": "Consent screenshot shows explicit Reject All and I Accept actions with equivalent visual weight and one-click operation.",
      "pathIds": [
        "home"
      ]
    },
    {
      "principleId": "be-trustworthy",
      "checkId": "humane-error-handling",
      "status": "issues",
      "confidence": "high",
      "method": "HINT: exercise a form, submit invalid input, and observe timing and clarity of errors via a screenshot or a :user-invalid / aria-invalid probe. The model chooses.",
      "evidence": "Invalid-route DOM directly inspected the recovery copy and actions.",
      "findingIds": [
        "F18"
      ],
      "pathIds": [
        "not-found"
      ]
    },
    {
      "principleId": "be-trustworthy",
      "checkId": "trustworthy-input-assistance",
      "status": "pass",
      "confidence": "high",
      "method": "HINT: source/DOM inspection for autocomplete attributes on form fields; a probe of autofill affordances. The model chooses.",
      "evidence": "Expanded login form has labels plus autocomplete=email and current-password; settings radios are labeled.",
      "pathIds": [
        "home"
      ]
    },
    {
      "principleId": "be-trustworthy",
      "checkId": "safe-commercial-and-account-flows",
      "status": "pass",
      "confidence": "high",
      "method": "HINT: walkthrough checkout/subscription/auth/account flows when present; screenshot pricing, confirmation, cancellation and reauthentication states; inspect passkey/autocomplete support for sign-in and payment. The model chooses.",
      "evidence": "No purchase/checkout was in scope; login presents privacy/terms links and no irreversible or coercive action was observed.",
      "pathIds": [
        "home"
      ]
    },
    {
      "principleId": "be-sustainable",
      "checkId": "optimised-assets",
      "status": "pass",
      "confidence": "high",
      "method": "HINT: inspect transferred image bytes vs displayed size; source inspection for modern formats and resolution handling. The model chooses.",
      "evidence": "Images primitive found five SVG assets, all with alt text and no legacy raster formats.",
      "pathIds": [
        "home"
      ]
    },
    {
      "principleId": "be-sustainable",
      "checkId": "no-wasteful-work",
      "status": "issues",
      "confidence": "high",
      "method": "HINT: a long-task / network probe for background fetches and processing while idle or backgrounded. The model chooses.",
      "evidence": "Lighthouse main-thread and unused-JS evidence shows avoidable startup work.",
      "findingIds": [
        "F7"
      ],
      "pathIds": [
        "home"
      ]
    },
    {
      "principleId": "be-sustainable",
      "checkId": "third-party-and-media-budget",
      "status": "issues",
      "confidence": "high",
      "method": "HINT: a HAR summary shows third-party bytes, font/media weight and caching; screenshots/video reveal autoplay and decorative media; trace/layout evidence shows whether media/animation keeps work running. The model chooses.",
      "evidence": "HAR and tracker captures quantify third-party byte/origin cost.",
      "findingIds": [
        "F14"
      ],
      "pathIds": [
        "home"
      ]
    },
    {
      "principleId": "be-agent-ready",
      "checkId": "structured-agent-capabilities",
      "status": "not-applicable",
      "confidence": "high",
      "method": "HINT: source inspection for WebMCP / agentic-tool registration and agent-readable affordances. The model chooses.",
      "evidence": "No declared agent-facing intent, machine action surface, or workflow delegation requirement exists for this public speed-measurement UI.",
      "reason": "No declared agent-facing intent, machine action surface, or workflow delegation requirement exists for this public speed-measurement UI.",
      "pathIds": [
        "home"
      ]
    },
    {
      "principleId": "be-agent-ready",
      "checkId": "on-device-inference",
      "status": "not-applicable",
      "confidence": "high",
      "method": "HINT: source inspection for built-in AI (language model / summariser) usage. The model chooses.",
      "evidence": "The product exposes no AI summarisation/generation feature, so on-device model selection is not applicable.",
      "reason": "The product exposes no AI summarisation/generation feature, so on-device model selection is not applicable.",
      "pathIds": [
        "home"
      ]
    },
    {
      "principleId": "be-memory-efficient",
      "checkId": "no-leak-under-repeated-interaction",
      "status": "pass",
      "confidence": "high",
      "method": "HINT (not mandatory): compare heap snapshots for retained growth - a baseline, then one taken after repeating the interaction with `--interact` about 10x (the memory-tracer methodology: baseline -> repeat -> post -> compare). Performance.getMetrics (JSHeapUsedSize, Nodes) across the same before/after window is corroboration. If Chrome DevTools MCP is available, follow its memory-leak-debugging skill: capture baseline, target, and final snapshots, then use memlab or the provided comparison workflow rather than reading raw .heapsnapshot files directly. The package-native `heap` primitive remains the default path. This check is only meaningful where the page has a real interaction to repeat; for a static page with none, mark it not-applicable with a rationale rather than fabricating one. The model chooses.",
      "evidence": "Rejected-consent baseline vs 10 repeated theme interactions grew only 915,583 bytes (1.5%), with no Detached/listener/timer constructor among top retained constructors.",
      "pathIds": [
        "home"
      ]
    },
    {
      "principleId": "be-memory-efficient",
      "checkId": "bounded-footprint",
      "status": "pass",
      "confidence": "high",
      "method": "HINT: a single `heap` summary's totals (nodeCount, totalSelfSizeBytes, constructor population) plus Performance.getMetrics (Nodes, JSHeapUsedSize) give the current footprint to judge against the page's purpose. Chrome DevTools MCP heap snapshots and memlab snapshot analysis can provide the same memory distribution when available. Read summaries or derived analysis, never raw snapshots unless a dedicated heap-analysis tool is doing the analysis. The model chooses.",
      "evidence": "Post-consent retained self size was about 62–63 MB and remained bounded across the repeated interaction comparison.",
      "pathIds": [
        "home"
      ]
    },
    {
      "principleId": "be-memory-efficient",
      "checkId": "no-detached-dom-or-unbounded-listeners",
      "status": "pass",
      "confidence": "high",
      "method": "HINT: the `heap` summary by constructor (Detached* nodes) compared across a before/after pair shows a growing detached-DOM population; an `evaluate` probe can sample listener/timer counts (e.g. getEventListeners-style counting, or instrumenting addEventListener/setInterval) before and after the repeated interaction to spot growth. Chrome DevTools MCP heap snapshots plus the memory-leak-debugging skill's common-leak guidance can corroborate detached DOM, listeners, closures, globals, and unbounded caches. Caveat from the memory-tracer and Chrome DevTools MCP guidance: detached nodes can be intentional caches, so judge confidence rather than asserting a bug. The model chooses.",
      "evidence": "Heap constructor summaries found no Detached DOM, listener or timer constructor in top retained objects after repetition.",
      "pathIds": [
        "home"
      ]
    }
  ],
  "principleOutcomes": [
    {
      "principleId": "respect-user-preferences",
      "expectation": "default",
      "status": "issues",
      "findingIds": [
        "F1",
        "F2",
        "F3"
      ]
    },
    {
      "principleId": "implement-natural-interactions",
      "expectation": "default",
      "status": "pass"
    },
    {
      "principleId": "provide-guided-navigation",
      "expectation": "default",
      "status": "pass"
    },
    {
      "principleId": "maximize-content-reduce-noise",
      "expectation": "default",
      "status": "issues",
      "findingIds": [
        "F4"
      ]
    },
    {
      "principleId": "adapt-to-the-form-factor",
      "expectation": "default",
      "status": "issues",
      "findingIds": [
        "F5"
      ]
    },
    {
      "principleId": "support-core-task-success",
      "expectation": "default",
      "status": "pass"
    },
    {
      "principleId": "be-fast-and-stable",
      "expectation": "default",
      "status": "issues",
      "findingIds": [
        "F6",
        "F7",
        "F8",
        "F9"
      ]
    },
    {
      "principleId": "be-inclusive",
      "expectation": "default",
      "status": "issues",
      "findingIds": [
        "F10",
        "F11",
        "F12"
      ]
    },
    {
      "principleId": "follow-best-practices",
      "expectation": "default",
      "status": "pass"
    },
    {
      "principleId": "be-discoverable",
      "expectation": "default",
      "status": "issues",
      "findingIds": [
        "F13"
      ]
    },
    {
      "principleId": "be-private-and-secure",
      "expectation": "default",
      "status": "issues",
      "findingIds": [
        "F14",
        "F15"
      ]
    },
    {
      "principleId": "be-resilient",
      "expectation": "contextual",
      "status": "issues",
      "findingIds": [
        "F16"
      ]
    },
    {
      "principleId": "be-internationalised",
      "expectation": "contextual",
      "status": "issues",
      "findingIds": [
        "F17"
      ]
    },
    {
      "principleId": "be-trustworthy",
      "expectation": "default",
      "status": "issues",
      "findingIds": [
        "F18"
      ]
    },
    {
      "principleId": "be-sustainable",
      "expectation": "contextual",
      "status": "issues",
      "findingIds": [
        "F7",
        "F14"
      ]
    },
    {
      "principleId": "be-agent-ready",
      "expectation": "contextual",
      "status": "not-applicable",
      "reason": "All checks were judged contextually out of scope for this site."
    },
    {
      "principleId": "be-memory-efficient",
      "expectation": "default",
      "status": "pass"
    }
  ],
  "paths": [
    {
      "id": "home",
      "description": "Homepage and core consent-to-speed-test journey; primary purpose and highest-risk interactive flow.",
      "url": "https://www.speedtest.net/",
      "conditions": [
        "1440x1000",
        "360x800",
        "prefers-color-scheme: dark",
        "prefers-reduced-motion: reduce",
        "prefers-contrast: more",
        "keyboard focus"
      ],
      "result": "issues"
    },
    {
      "id": "results",
      "description": "Results-history listing template, representing data-heavy controls and saved result actions.",
      "url": "https://www.speedtest.net/results",
      "conditions": [
        "desktop",
        "keyboard semantics"
      ],
      "result": "issues"
    },
    {
      "id": "settings",
      "description": "Settings and preference controls, representing forms and persistent configuration.",
      "url": "https://www.speedtest.net/settings",
      "conditions": [
        "desktop",
        "German locale variant"
      ],
      "result": "issues"
    },
    {
      "id": "article",
      "description": "Public knowledge article, representing editorial content and search/discovery surfaces.",
      "url": "https://www.speedtest.net/about/knowledge/how-much-speed-you-need",
      "conditions": [
        "desktop",
        "360x800",
        "prefers-color-scheme: dark"
      ],
      "result": "issues"
    },
    {
      "id": "login",
      "description": "Account sign-in flow, representing authentication and form autofill.",
      "url": "https://www.speedtest.net/login",
      "conditions": [
        "desktop",
        "email sign-in expanded"
      ],
      "result": "pass"
    },
    {
      "id": "not-found",
      "description": "Invalid internal route, representing HTTP/error recovery.",
      "url": "https://www.speedtest.net/definitely-not-a-real-route-web-uplift",
      "conditions": [
        "desktop"
      ],
      "result": "issues"
    }
  ],
  "findings": [
    {
      "id": "F1",
      "severity": "medium",
      "principleId": "respect-user-preferences",
      "principleCheckId": "respects-color-scheme",
      "summary": "The knowledge article ignores the user’s dark color preference.",
      "evidence": "With prefers-color-scheme: dark matched, the article probe still reported colorScheme \"normal\", a white rgb(255,255,255) body and dark text.",
      "suggestedFix": "Declare color-scheme and provide dark-aware surface/text tokens for the editorial template using prefers-color-scheme or light-dark().",
      "guidanceId": "dark-mode",
      "guidanceCategory": "user-experience",
      "artifacts": [
        "evidence/article-dark-probe.json"
      ],
      "effort": "medium",
      "pathId": "article",
      "url": "https://www.speedtest.net/about/knowledge/how-much-speed-you-need",
      "confidence": "high"
    },
    {
      "id": "F2",
      "severity": "medium",
      "principleId": "respect-user-preferences",
      "principleCheckId": "respects-reduced-motion",
      "summary": "The main app does not reduce its continuous animation for reduced-motion users.",
      "evidence": "The emulated reduced-motion probe still found a running 3,550ms animation, while authored CSS exposed no prefers-reduced-motion rule.",
      "suggestedFix": "Use prefers-reduced-motion: reduce to stop or simplify non-essential looping and transition motion while preserving progress state.",
      "guidanceId": "accessibility",
      "guidanceCategory": "accessibility",
      "artifacts": [
        "evidence/probe-preferences.json"
      ],
      "effort": "small",
      "pathId": "home",
      "url": "https://www.speedtest.net/",
      "confidence": "high"
    },
    {
      "id": "F3",
      "severity": "low",
      "principleId": "respect-user-preferences",
      "principleCheckId": "respects-contrast",
      "summary": "The app has no explicit response to increased-contrast preference.",
      "evidence": "Under prefers-contrast: more, computed colors remained unchanged and the CSS probe found no prefers-contrast rule; baseline Lighthouse contrast was otherwise acceptable.",
      "suggestedFix": "Add a prefers-contrast: more treatment for subtle borders, secondary labels and focus indicators, and verify in forced-colors.",
      "guidanceId": "accessibility",
      "guidanceCategory": "accessibility",
      "artifacts": [
        "evidence/probe-preferences.json"
      ],
      "effort": "small",
      "pathId": "home",
      "url": "https://www.speedtest.net/",
      "confidence": "medium"
    },
    {
      "id": "F4",
      "severity": "medium",
      "principleId": "maximize-content-reduce-noise",
      "principleCheckId": "reduced-chrome",
      "summary": "Advertising competes heavily with the primary speed-test task.",
      "evidence": "The core-flow final frame shows four large ad placements surrounding the gauge and result content, including an animated/bright leaderboard above the measurement.",
      "suggestedFix": "Reserve fewer, stable ad slots away from the gauge and defer non-essential advertising until after the core measurement reaches a result.",
      "guidanceId": "defer-rendering-heavy-content",
      "guidanceCategory": "performance",
      "artifacts": [
        "evidence/core-flow-full-final.png",
        "evidence/core-flow-full.mp4"
      ],
      "effort": "large",
      "pathId": "home",
      "url": "https://www.speedtest.net/",
      "confidence": "high"
    },
    {
      "id": "F5",
      "severity": "medium",
      "principleId": "adapt-to-the-form-factor",
      "principleCheckId": "input-modality-aware",
      "summary": "Several interactive controls are too small for reliable touch input.",
      "evidence": "The active control probe measured the mobile menu at 16x32 CSS px and repeated result share/delete controls at 32x22, below a comfortable 44px target.",
      "suggestedFix": "Increase the interactive hit area to at least 44x44 CSS px without necessarily enlarging the icon, and preserve visible focus styles.",
      "guidanceId": "accessibility",
      "guidanceCategory": "accessibility",
      "artifacts": [
        "evidence/probe-home.json",
        "evidence/probe-results.json"
      ],
      "effort": "small",
      "pathId": "home",
      "url": "https://www.speedtest.net/",
      "confidence": "high"
    },
    {
      "id": "F6",
      "severity": "high",
      "principleId": "be-fast-and-stable",
      "principleCheckId": "good-core-web-vitals",
      "summary": "Cold-load performance misses the LCP target by a wide margin.",
      "evidence": "Lighthouse measured LCP 12.4s, FCP 9.0s, TTI 20.5s and a 0.45 performance score; the independent trace still measured LCP 3.55s.",
      "suggestedFix": "Prioritise the true LCP content, delay ads/analytics until consent and task readiness, and retest LCP under mobile throttling.",
      "guidanceId": "performance",
      "guidanceCategory": "performance",
      "artifacts": [
        "evidence/lighthouse.json",
        "evidence/home-trace-summary.json",
        "evidence/home-trace.json"
      ],
      "effort": "large",
      "pathId": "home",
      "url": "https://www.speedtest.net/",
      "confidence": "high"
    },
    {
      "id": "F7",
      "severity": "medium",
      "principleId": "be-fast-and-stable",
      "principleCheckId": "efficient-main-thread",
      "summary": "Script execution blocks responsiveness during startup.",
      "evidence": "Lighthouse measured 480ms total blocking time and 340ms max potential FID; the trace recorded three long tasks and 120ms TBT in an unthrottled run.",
      "suggestedFix": "Break long tasks, schedule non-urgent analytics/ad work at lower priority, and load the measurement UI before secondary scripts.",
      "guidanceId": "identify-inp-causes",
      "guidanceCategory": "performance",
      "artifacts": [
        "evidence/lighthouse.json",
        "evidence/home-trace-summary.json"
      ],
      "effort": "medium",
      "pathId": "home",
      "url": "https://www.speedtest.net/",
      "confidence": "high"
    },
    {
      "id": "F8",
      "severity": "high",
      "principleId": "be-fast-and-stable",
      "principleCheckId": "efficient-resource-delivery",
      "summary": "The initial page transfers a disproportionate third-party script payload.",
      "evidence": "The HAR recorded 67 requests and 3,191,526 transferred bytes, including 2,726,460 bytes of script; 62 requests and 3,144,706 bytes were third-party.",
      "suggestedFix": "Gate third-party advertising and analytics behind consent and task readiness, reduce origin fan-out, and cache/compress remaining scripts.",
      "guidanceId": "optimize-script-priority",
      "guidanceCategory": "performance",
      "artifacts": [
        "evidence/home-summary.json",
        "evidence/home.har"
      ],
      "effort": "large",
      "pathId": "home",
      "url": "https://www.speedtest.net/",
      "confidence": "high"
    },
    {
      "id": "F9",
      "severity": "high",
      "principleId": "be-fast-and-stable",
      "principleCheckId": "trim-unused-and-duplicate-code",
      "summary": "Most of the shipped JavaScript is unused during startup.",
      "evidence": "Lighthouse estimated 1,380 KiB of unused JavaScript on the audited load.",
      "suggestedFix": "Code-split route and advertising features, remove unused vendor modules, and deliver only code needed for consent and the initial GO experience.",
      "guidanceId": "identify-heavy-scripts",
      "guidanceCategory": "performance",
      "artifacts": [
        "evidence/lighthouse.json"
      ],
      "effort": "large",
      "pathId": "home",
      "url": "https://www.speedtest.net/",
      "confidence": "high"
    },
    {
      "id": "F10",
      "severity": "high",
      "principleId": "be-inclusive",
      "principleCheckId": "names-roles-labels",
      "summary": "Focusable hidden ad containers and unnamed image roles create serious accessibility failures.",
      "evidence": "axe reported four aria-hidden-focus nodes in ad slots and five role=img elements without alternative text.",
      "suggestedFix": "Remove hidden descendants from the tab order and give informative image roles an accessible name, or mark decorative graphics presentation-only.",
      "guidanceId": "accessibility",
      "guidanceCategory": "accessibility",
      "artifacts": [
        "evidence/axe.json"
      ],
      "effort": "medium",
      "pathId": "home",
      "url": "https://www.speedtest.net/",
      "confidence": "high"
    },
    {
      "id": "F11",
      "severity": "medium",
      "principleId": "be-inclusive",
      "principleCheckId": "structure-and-focus",
      "summary": "The app lacks a main landmark and has heading-order errors.",
      "evidence": "axe reported landmark-one-main, nine region nodes outside landmarks and two heading-order violations.",
      "suggestedFix": "Wrap primary content in main, keep page regions inside landmarks, and use headings in a logical hierarchy independent of visual size.",
      "guidanceId": "accessibility",
      "guidanceCategory": "accessibility",
      "artifacts": [
        "evidence/axe.json"
      ],
      "effort": "small",
      "pathId": "home",
      "url": "https://www.speedtest.net/",
      "confidence": "high"
    },
    {
      "id": "F12",
      "severity": "medium",
      "principleId": "be-inclusive",
      "principleCheckId": "zoom-reflow-targets-and-media",
      "summary": "Touch targets remain undersized across app and content templates.",
      "evidence": "Objective geometry probes found 16x32 and 32x22 app controls plus many 15–22px-high article/footer links; mobile layout itself reflowed without overflow.",
      "suggestedFix": "Expand control and compact-link hit areas to about 44x44 CSS px while keeping the successful responsive reflow.",
      "guidanceId": "accessibility",
      "guidanceCategory": "accessibility",
      "artifacts": [
        "evidence/probe-results.json",
        "evidence/probe-article.json",
        "evidence/home-mobile-layout.json"
      ],
      "effort": "small",
      "pathId": "home",
      "url": "https://www.speedtest.net/",
      "confidence": "high"
    },
    {
      "id": "F13",
      "severity": "low",
      "principleId": "be-discoverable",
      "principleCheckId": "structured-and-shareable-metadata",
      "summary": "The public knowledge article lacks Article structured data.",
      "evidence": "The article probe found canonical, description and Open Graph title metadata but zero application/ld+json blocks.",
      "suggestedFix": "Add valid Article JSON-LD with headline, author, publisher, dates and canonical URL, while retaining Open Graph metadata.",
      "guidanceId": "html",
      "guidanceCategory": "html",
      "artifacts": [
        "evidence/probe-article.json"
      ],
      "effort": "small",
      "pathId": "article",
      "url": "https://www.speedtest.net/about/knowledge/how-much-speed-you-need",
      "confidence": "high"
    },
    {
      "id": "F14",
      "severity": "high",
      "principleId": "be-private-and-secure",
      "principleCheckId": "data-minimisation-and-third-parties",
      "summary": "The pre-task page has an excessive tracking and third-party footprint.",
      "evidence": "The tracker primitive observed 24 third-party origins and known DoubleClick, Google Tag Manager, ScorecardResearch and Google Analytics endpoints; HAR attribution showed 98.5% of bytes were third-party.",
      "suggestedFix": "Do not load advertising/analytics before the consent decision; minimise partners and origins, and load only measurement-critical resources after rejection.",
      "guidanceId": "privacy",
      "guidanceCategory": "privacy",
      "artifacts": [
        "evidence/trackers.json",
        "evidence/home-summary.json",
        "evidence/home.har"
      ],
      "effort": "large",
      "pathId": "home",
      "url": "https://www.speedtest.net/",
      "confidence": "high"
    },
    {
      "id": "F15",
      "severity": "medium",
      "principleId": "be-private-and-secure",
      "principleCheckId": "defensive-browser-policies",
      "summary": "Cookie and CSP defenses are incomplete.",
      "evidence": "The cookie audit found six cookies without Secure and several SameSite=None cookies; CSP only declares frame-ancestors and upgrade-insecure-requests, with no default-src/script-src containment.",
      "suggestedFix": "Mark all HTTPS cookies Secure, avoid SameSite=None unless required, and deploy a nonce/hash-based restrictive CSP covering scripts, connections, images and styles.",
      "guidanceId": "security",
      "guidanceCategory": "security",
      "artifacts": [
        "evidence/cookies.json",
        "evidence/headers.json"
      ],
      "effort": "medium",
      "pathId": "home",
      "url": "https://www.speedtest.net/",
      "confidence": "high"
    },
    {
      "id": "F16",
      "severity": "medium",
      "principleId": "be-resilient",
      "principleCheckId": "network-and-http-failure-states",
      "summary": "The 404 state provides no explanation or clear recovery action.",
      "evidence": "The invalid-route probe returned a lone H1 \"404\" followed by global footer content, with no explanatory copy, homepage action, search, or retry guidance.",
      "suggestedFix": "Render a humane not-found panel with a plain-language explanation, a primary return-to-Speedtest action and useful navigation.",
      "guidanceId": "stabilize-reactive-state",
      "guidanceCategory": "user-experience",
      "artifacts": [
        "evidence/not-found.json"
      ],
      "effort": "small",
      "pathId": "not-found",
      "url": "https://www.speedtest.net/definitely-not-a-real-route-web-uplift",
      "confidence": "high"
    },
    {
      "id": "F17",
      "severity": "medium",
      "principleId": "be-internationalised",
      "principleCheckId": "locale-aware-data",
      "summary": "German localisation keeps US date/time defaults and leaves substantial account copy untranslated.",
      "evidence": "On /de/settings, html lang was de but the selected defaults were 12-hour and MM/DD/YYYY; the account paragraph and several footer links remained English.",
      "suggestedFix": "Derive date/time defaults from Intl.Locale/Intl.DateTimeFormat and complete message-catalog coverage for the German route.",
      "guidanceId": "language-detection",
      "guidanceCategory": "internationalization",
      "artifacts": [
        "evidence/locale-de.json"
      ],
      "effort": "medium",
      "pathId": "settings",
      "url": "https://www.speedtest.net/settings",
      "confidence": "high"
    },
    {
      "id": "F18",
      "severity": "low",
      "principleId": "be-trustworthy",
      "principleCheckId": "humane-error-handling",
      "summary": "The not-found page states only an error code.",
      "evidence": "The invalid-route DOM exposed only \"404\" as the page message, without what happened or how to recover.",
      "suggestedFix": "Use concise, non-blaming copy and provide an obvious route back to the core speed test.",
      "guidanceId": "forms",
      "guidanceCategory": "forms",
      "artifacts": [
        "evidence/not-found.json"
      ],
      "effort": "small",
      "pathId": "not-found",
      "url": "https://www.speedtest.net/definitely-not-a-real-route-web-uplift",
      "confidence": "high"
    }
  ],
  "taskList": [
    {
      "id": "T1",
      "title": "Cut third-party startup code, trackers and unused JavaScript before the core task",
      "priority": 1,
      "findingIds": [
        "F6",
        "F7",
        "F8",
        "F9",
        "F14"
      ],
      "guidanceId": "optimize-script-priority",
      "status": "open"
    },
    {
      "id": "T2",
      "title": "Repair accessibility semantics, landmarks and target sizes",
      "priority": 2,
      "findingIds": [
        "F5",
        "F10",
        "F11",
        "F12"
      ],
      "guidanceId": "accessibility",
      "status": "open"
    },
    {
      "id": "T3",
      "title": "Harden cookies and deploy a restrictive CSP",
      "priority": 3,
      "findingIds": [
        "F15"
      ],
      "guidanceId": "security",
      "status": "open"
    },
    {
      "id": "T4",
      "title": "Honor color, reduced-motion and increased-contrast preferences across templates",
      "priority": 4,
      "findingIds": [
        "F1",
        "F2",
        "F3"
      ],
      "guidanceId": "dark-mode",
      "status": "open"
    },
    {
      "id": "T5",
      "title": "Reduce advertising chrome around the active speed test",
      "priority": 5,
      "findingIds": [
        "F4"
      ],
      "guidanceId": "defer-rendering-heavy-content",
      "status": "open"
    },
    {
      "id": "T6",
      "title": "Localise date/time defaults and complete translated copy",
      "priority": 6,
      "findingIds": [
        "F17"
      ],
      "guidanceId": "language-detection",
      "status": "open"
    },
    {
      "id": "T7",
      "title": "Create a humane, recoverable 404 page",
      "priority": 7,
      "findingIds": [
        "F16",
        "F18"
      ],
      "guidanceId": "stabilize-reactive-state",
      "status": "open"
    },
    {
      "id": "T8",
      "title": "Add Article JSON-LD to editorial pages",
      "priority": 8,
      "findingIds": [
        "F13"
      ],
      "guidanceId": "html",
      "status": "open"
    }
  ],
  "budget": {
    "pathCount": 6,
    "auditPasses": 1
  },
  "agent": "pi",
  "runId": "2026-07-21T21-30-22-576Z"
}
