{
  "url": "https://weather.com",
  "auditedAt": "2026-07-24T08:46:49.037Z",
  "mode": "report",
  "status": "completed",
  "statusDetail": "Coverage-complete representative-template audit. Radar rendering did not expose map content in headless Chrome, so map-specific usability was not asserted; all atomic checks were nevertheless judged with other direct evidence.",
  "page": {
    "appType": "hybrid",
    "framework": "Next.js / React",
    "notes": "Public, locale-aware weather forecast MPA/hybrid with forecast listings, interactive radar, account flow, advertising and consent management. Not covered: signup/password recovery, geolocation permission flow, paid/commercial flows, individual editorial articles, every locale, or live field INP."
  },
  "evidenceUsed": [
    "screenshot",
    "dom",
    "evaluate-probe",
    "layout-metrics",
    "trace",
    "har",
    "discoverability",
    "headers",
    "cookies",
    "trackers",
    "images",
    "secrets",
    "lighthouse",
    "heap-summary"
  ],
  "guidanceConsulted": [
    "dark-mode",
    "accessibility",
    "same-document-transitions",
    "scrollytelling",
    "shrinking-header-on-scroll",
    "declarative-dialog-popover-control",
    "size-aware-styling",
    "forms",
    "performance",
    "optimize-image-priority",
    "identify-heavy-scripts",
    "html",
    "security",
    "privacy",
    "flicker-free-client-side-ab-testing",
    "translator",
    "validate-input-after-interaction",
    "efficient-background-processing",
    "webmcp",
    "manage-recurring-intervals"
  ],
  "artifacts": [
    {
      "type": "other",
      "path": "evidence/home-recon.json",
      "caption": "home recon",
      "findingIds": [
        "F15"
      ]
    },
    {
      "type": "screenshot",
      "path": "evidence/home-desktop.png",
      "caption": "home desktop",
      "findingIds": [
        "F01",
        "F05"
      ]
    },
    {
      "type": "screenshot",
      "path": "evidence/home-mobile-full.png",
      "caption": "home mobile full",
      "findingIds": [
        "F05"
      ]
    },
    {
      "type": "screenshot",
      "path": "evidence/home-dark.png",
      "caption": "home dark",
      "findingIds": [
        "F01"
      ]
    },
    {
      "type": "screenshot",
      "path": "evidence/home-contrast.png",
      "caption": "home contrast",
      "findingIds": []
    },
    {
      "type": "layout",
      "path": "evidence/home-mobile-layout.json",
      "caption": "home mobile layout",
      "findingIds": [
        "F08"
      ]
    },
    {
      "type": "dom",
      "path": "evidence/home-comprehensive.json",
      "caption": "home comprehensive",
      "findingIds": [
        "F02",
        "F03",
        "F04",
        "F12",
        "F20"
      ]
    },
    {
      "type": "other",
      "path": "evidence/home-reduced-motion.json",
      "caption": "home reduced motion",
      "findingIds": []
    },
    {
      "type": "trace",
      "path": "evidence/home-trace.json",
      "caption": "home trace",
      "findingIds": []
    },
    {
      "type": "trace-summary",
      "path": "evidence/home-trace-summary.json",
      "caption": "home trace summary",
      "findingIds": [
        "F07",
        "F09"
      ]
    },
    {
      "type": "har",
      "path": "evidence/home.har",
      "caption": "home",
      "findingIds": [
        "F10",
        "F18"
      ]
    },
    {
      "type": "har-summary",
      "path": "evidence/home-summary.json",
      "caption": "home summary",
      "findingIds": [
        "F06",
        "F10",
        "F11",
        "F18",
        "F23"
      ]
    },
    {
      "type": "discoverability",
      "path": "evidence/home-discoverability.json",
      "caption": "home discoverability",
      "findingIds": []
    },
    {
      "type": "screenshot",
      "path": "evidence/home-discoverability-rendered.png",
      "caption": "home discoverability rendered",
      "findingIds": []
    },
    {
      "type": "screenshot",
      "path": "evidence/home-discoverability-crawler.png",
      "caption": "home discoverability crawler",
      "findingIds": []
    },
    {
      "type": "other",
      "path": "evidence/home-headers.json",
      "caption": "home headers",
      "findingIds": [
        "F17"
      ]
    },
    {
      "type": "other",
      "path": "evidence/home-cookies.json",
      "caption": "home cookies",
      "findingIds": [
        "F17"
      ]
    },
    {
      "type": "other",
      "path": "evidence/home-trackers.json",
      "caption": "home trackers",
      "findingIds": [
        "F18"
      ]
    },
    {
      "type": "other",
      "path": "evidence/home-images.json",
      "caption": "home images",
      "findingIds": [
        "F22"
      ]
    },
    {
      "type": "other",
      "path": "evidence/home-secrets.json",
      "caption": "home secrets",
      "findingIds": []
    },
    {
      "type": "lighthouse",
      "path": "evidence/lighthouse-home.json",
      "caption": "lighthouse home",
      "findingIds": []
    },
    {
      "type": "lighthouse",
      "path": "evidence/lighthouse-home-summary.json",
      "caption": "lighthouse home summary",
      "findingIds": [
        "F07",
        "F08",
        "F09",
        "F10",
        "F11",
        "F12",
        "F13",
        "F14",
        "F15",
        "F16",
        "F22",
        "F23"
      ]
    },
    {
      "type": "dom",
      "path": "evidence/hourly-dom-summary.json",
      "caption": "hourly dom summary",
      "findingIds": [
        "F03"
      ]
    },
    {
      "type": "layout",
      "path": "evidence/hourly-mobile-layout.json",
      "caption": "hourly mobile layout",
      "findingIds": []
    },
    {
      "type": "dom",
      "path": "evidence/tenday-dom-summary.json",
      "caption": "tenday dom summary",
      "findingIds": [
        "F06"
      ]
    },
    {
      "type": "layout",
      "path": "evidence/tenday-mobile-layout.json",
      "caption": "tenday mobile layout",
      "findingIds": []
    },
    {
      "type": "dom",
      "path": "evidence/radar-dom-summary.json",
      "caption": "radar dom summary",
      "findingIds": []
    },
    {
      "type": "layout",
      "path": "evidence/radar-mobile-layout.json",
      "caption": "radar mobile layout",
      "findingIds": []
    },
    {
      "type": "dom",
      "path": "evidence/login-dom-summary.json",
      "caption": "login dom summary",
      "findingIds": [
        "F19",
        "F21"
      ]
    },
    {
      "type": "layout",
      "path": "evidence/login-mobile-layout.json",
      "caption": "login mobile layout",
      "findingIds": []
    },
    {
      "type": "other",
      "path": "evidence/login-invalid-submit.json",
      "caption": "login invalid submit",
      "findingIds": [
        "F21"
      ]
    },
    {
      "type": "other",
      "path": "evidence/error-404.json",
      "caption": "error 404",
      "findingIds": []
    },
    {
      "type": "other",
      "path": "evidence/robots-sitemap.json",
      "caption": "robots sitemap",
      "findingIds": [
        "F16"
      ]
    },
    {
      "type": "heap",
      "path": "evidence/heap-baseline.heapsnapshot",
      "caption": "heap baseline",
      "findingIds": []
    },
    {
      "type": "heap",
      "path": "evidence/heap-post-scroll.heapsnapshot",
      "caption": "heap post scroll",
      "findingIds": []
    },
    {
      "type": "other",
      "path": "evidence/memory-metrics-scroll.json",
      "caption": "memory metrics scroll",
      "findingIds": []
    }
  ],
  "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",
      "confidence": "high",
      "status": "issues",
      "method": "Direct browser/CDP evidence and guidance comparison.",
      "evidence": "Screenshots under default and prefers-color-scheme: dark are visually identical: the consent surface and page remain fixed light/white, and the DOM probe found no site dark-theme response.",
      "findingIds": [
        "F01"
      ],
      "pathIds": [
        "today"
      ],
      "artifacts": [
        "evidence/home-dark.png",
        "evidence/home-desktop.png"
      ]
    },
    {
      "principleId": "respect-user-preferences",
      "checkId": "respects-reduced-motion",
      "confidence": "high",
      "status": "pass",
      "method": "Direct browser/CDP inspection across representative conditions.",
      "evidence": "evaluate under prefers-reduced-motion: reduce found no running animations and scroll-behavior auto.",
      "artifacts": [
        "evidence/home-reduced-motion.json"
      ],
      "pathIds": [
        "today"
      ]
    },
    {
      "principleId": "respect-user-preferences",
      "checkId": "respects-contrast",
      "confidence": "high",
      "status": "pass",
      "method": "Direct browser/CDP inspection across representative conditions.",
      "evidence": "prefers-contrast screenshot retained visible controls/text; Lighthouse accessibility scored 100.",
      "artifacts": [
        "evidence/home-contrast.png"
      ],
      "pathIds": [
        "today"
      ]
    },
    {
      "principleId": "implement-natural-interactions",
      "checkId": "view-transitions",
      "confidence": "high",
      "status": "issues",
      "method": "Direct browser/CDP evidence and guidance comparison.",
      "evidence": "The comprehensive CSS probe found no view-transition rules even though daily, hourly, 10-day and radar are prominent state/route changes.",
      "findingIds": [
        "F02"
      ],
      "pathIds": [
        "today"
      ],
      "artifacts": [
        "evidence/home-comprehensive.json"
      ]
    },
    {
      "principleId": "implement-natural-interactions",
      "checkId": "scroll-driven-animations",
      "confidence": "high",
      "status": "pass",
      "method": "Direct browser/CDP inspection across representative conditions.",
      "evidence": "CSS probe found no scroll-linked animation, and layout tests captured only content scrolling, so no main-thread scroll animation anti-pattern applies.",
      "artifacts": [
        "evidence/home-comprehensive.json"
      ],
      "pathIds": [
        "today",
        "tenday"
      ]
    },
    {
      "principleId": "implement-natural-interactions",
      "checkId": "physical-gestures",
      "confidence": "high",
      "status": "pass",
      "method": "Direct browser/CDP inspection across representative conditions.",
      "evidence": "Forecast navigation uses native links and native overflow scrolling; no custom pointermove gesture layer was observed.",
      "artifacts": [
        "evidence/home-comprehensive.json"
      ],
      "pathIds": [
        "today",
        "hourly"
      ]
    },
    {
      "principleId": "provide-guided-navigation",
      "checkId": "scroll-state-aware-chrome",
      "confidence": "high",
      "status": "issues",
      "method": "Direct browser/CDP evidence and guidance comparison.",
      "evidence": "The DOM/CSS probe found no scroll timeline and the long hourly/10-day templates expose no progress or scroll-aware header state.",
      "findingIds": [
        "F03"
      ],
      "pathIds": [
        "today"
      ],
      "artifacts": [
        "evidence/home-comprehensive.json",
        "evidence/hourly-dom-summary.json"
      ]
    },
    {
      "principleId": "provide-guided-navigation",
      "checkId": "anchored-positioning",
      "confidence": "high",
      "status": "issues",
      "method": "Direct browser/CDP evidence and guidance comparison.",
      "evidence": "The page contains menu/dialog surfaces, while the CSS probe found no anchor-name, position-anchor, or position-try rules.",
      "findingIds": [
        "F04"
      ],
      "pathIds": [
        "today"
      ],
      "artifacts": [
        "evidence/home-comprehensive.json"
      ]
    },
    {
      "principleId": "provide-guided-navigation",
      "checkId": "directs-attention",
      "confidence": "high",
      "status": "pass",
      "method": "Direct browser/CDP inspection across representative conditions.",
      "evidence": "Forecast tabs expose Today, Hourly, 10-Day and Monthly destinations and preserve clear location context in page titles/headings.",
      "artifacts": [
        "evidence/home-recon.json"
      ],
      "pathIds": [
        "today",
        "hourly",
        "tenday"
      ]
    },
    {
      "principleId": "maximize-content-reduce-noise",
      "checkId": "no-intrusive-interruptions",
      "confidence": "high",
      "status": "issues",
      "method": "Direct browser/CDP evidence and guidance comparison.",
      "evidence": "Desktop and mobile load screenshots show a blocking cookie dialog covering the primary weather content; on mobile it consumes nearly the full viewport. Reject all is equally prominent, which avoids a deceptive-choice finding.",
      "findingIds": [
        "F05"
      ],
      "pathIds": [
        "today"
      ],
      "artifacts": [
        "evidence/home-desktop.png",
        "evidence/home-mobile-full.png"
      ]
    },
    {
      "principleId": "maximize-content-reduce-noise",
      "checkId": "semantic-dismissible-primitives",
      "confidence": "high",
      "status": "pass",
      "method": "Direct browser/CDP inspection across representative conditions.",
      "evidence": "The consent surface is exposed as role=dialog with explicit Accept all, Reject all and settings controls.",
      "artifacts": [
        "evidence/home-desktop.png"
      ],
      "pathIds": [
        "today"
      ]
    },
    {
      "principleId": "maximize-content-reduce-noise",
      "checkId": "reduced-chrome",
      "confidence": "high",
      "status": "issues",
      "method": "Direct browser/CDP evidence and guidance comparison.",
      "evidence": "Rendered today/10-day DOM includes repeated “Advertisement” slots and “Sponsored Content”; the HAR records 78 third-party requests, while core forecast pages devote substantial structure to non-content modules.",
      "findingIds": [
        "F06"
      ],
      "pathIds": [
        "today"
      ],
      "artifacts": [
        "evidence/tenday-dom-summary.json",
        "evidence/home-summary.json"
      ]
    },
    {
      "principleId": "adapt-to-the-form-factor",
      "checkId": "responsive-no-horizontal-scroll",
      "confidence": "high",
      "status": "pass",
      "method": "Direct browser/CDP inspection across representative conditions.",
      "evidence": "All four narrow layout probes reported viewport meta and 0 px horizontal overflow at 360×800.",
      "artifacts": [
        "evidence/home-mobile-layout.json"
      ],
      "pathIds": [
        "today",
        "hourly",
        "tenday",
        "login"
      ]
    },
    {
      "principleId": "adapt-to-the-form-factor",
      "checkId": "component-level-responsiveness",
      "confidence": "high",
      "status": "pass",
      "method": "Direct browser/CDP inspection across representative conditions.",
      "evidence": "CSS probe found a container-query rule; forecast layouts reflowed to 360 px without overflow.",
      "artifacts": [
        "evidence/home-comprehensive.json"
      ],
      "pathIds": [
        "today",
        "hourly",
        "tenday"
      ]
    },
    {
      "principleId": "adapt-to-the-form-factor",
      "checkId": "input-modality-aware",
      "confidence": "high",
      "status": "pass",
      "method": "Direct browser/CDP inspection across representative conditions.",
      "evidence": "Lighthouse accessibility scored 100 and focus probe showed a 3 px outline or focus ring on sampled primary controls; mobile controls remained operable.",
      "artifacts": [
        "evidence/home-comprehensive.json"
      ],
      "pathIds": [
        "today",
        "login"
      ]
    },
    {
      "principleId": "support-core-task-success",
      "checkId": "clear-purpose-and-primary-action",
      "confidence": "high",
      "status": "pass",
      "method": "Direct browser/CDP inspection across representative conditions.",
      "evidence": "Titles, location context, forecast tabs and current/forecast values make the weather task explicit on today, hourly and 10-day templates.",
      "artifacts": [
        "evidence/hourly-dom-summary.json"
      ],
      "pathIds": [
        "today",
        "hourly",
        "tenday"
      ]
    },
    {
      "principleId": "support-core-task-success",
      "checkId": "primary-flow-completion",
      "confidence": "high",
      "status": "pass",
      "method": "Direct browser/CDP inspection across representative conditions.",
      "evidence": "Today, hourly and ten-day forecast destinations loaded complete London forecast data through real links without account gating.",
      "artifacts": [
        "evidence/tenday-dom-summary.json"
      ],
      "pathIds": [
        "today",
        "hourly",
        "tenday"
      ]
    },
    {
      "principleId": "support-core-task-success",
      "checkId": "clear-system-state-and-recovery",
      "confidence": "high",
      "status": "pass",
      "method": "Direct browser/CDP inspection across representative conditions.",
      "evidence": "Synthetic missing route rendered a clear 404 explanation and recovery links to Video, Maps and Local Weather.",
      "artifacts": [
        "evidence/error-404.json"
      ],
      "pathIds": [
        "not-found"
      ]
    },
    {
      "principleId": "be-fast-and-stable",
      "checkId": "good-core-web-vitals",
      "confidence": "high",
      "status": "issues",
      "method": "Direct browser/CDP evidence and guidance comparison.",
      "evidence": "Lighthouse measured LCP 12.7 s, CLS 0.146 and TBT 530 ms (performance 45). The first-party trace was better at LCP 2.29 s and TBT 91.5 ms, showing variability but not negating the poor throttled result.",
      "findingIds": [
        "F07"
      ],
      "pathIds": [
        "today"
      ],
      "artifacts": [
        "evidence/lighthouse-home-summary.json",
        "evidence/home-trace-summary.json"
      ]
    },
    {
      "principleId": "be-fast-and-stable",
      "checkId": "visual-stability",
      "confidence": "high",
      "status": "issues",
      "method": "Direct browser/CDP evidence and guidance comparison.",
      "evidence": "Lighthouse measured CLS 0.146, including a 0.135 shift from an animated skeleton; the narrow layout probes were stable after their observation window.",
      "findingIds": [
        "F08"
      ],
      "pathIds": [
        "today"
      ],
      "artifacts": [
        "evidence/lighthouse-home-summary.json",
        "evidence/home-mobile-layout.json"
      ]
    },
    {
      "principleId": "be-fast-and-stable",
      "checkId": "efficient-main-thread",
      "confidence": "high",
      "status": "issues",
      "method": "Direct browser/CDP evidence and guidance comparison.",
      "evidence": "Lighthouse reports 3.4 s main-thread work, 2.3 s JavaScript execution, and 530 ms TBT; the trace also captured a 141.5 ms long task.",
      "findingIds": [
        "F09"
      ],
      "pathIds": [
        "today"
      ],
      "artifacts": [
        "evidence/lighthouse-home-summary.json",
        "evidence/home-trace-summary.json"
      ]
    },
    {
      "principleId": "be-fast-and-stable",
      "checkId": "efficient-resource-delivery",
      "confidence": "high",
      "status": "issues",
      "method": "Direct browser/CDP evidence and guidance comparison.",
      "evidence": "HAR captured 143 requests and 2.42 MB transferred, including two document redirects and multiple parser-discovered high-priority scripts; Lighthouse estimates 850 ms redirect waste and reports a 12.7 s LCP without fetchpriority.",
      "findingIds": [
        "F10"
      ],
      "pathIds": [
        "today"
      ],
      "artifacts": [
        "evidence/home.har",
        "evidence/home-summary.json",
        "evidence/lighthouse-home-summary.json"
      ]
    },
    {
      "principleId": "be-fast-and-stable",
      "checkId": "trim-unused-and-duplicate-code",
      "confidence": "high",
      "status": "issues",
      "method": "Direct browser/CDP evidence and guidance comparison.",
      "evidence": "Lighthouse estimates 779 KiB unused JavaScript and 76 KiB legacy JavaScript. HAR shows 62 scripts and 2.09 MB script transfer, led by Taboola, Google Ads and Rubicon.",
      "findingIds": [
        "F11"
      ],
      "pathIds": [
        "today"
      ],
      "artifacts": [
        "evidence/lighthouse-home-summary.json",
        "evidence/home-summary.json"
      ]
    },
    {
      "principleId": "be-inclusive",
      "checkId": "names-roles-labels",
      "confidence": "high",
      "status": "issues",
      "method": "Direct browser/CDP evidence and guidance comparison.",
      "evidence": "Lighthouse details multiple hourly links whose aria-label omits visible label content, and the DOM probe found five links plus several buttons with no text or aria-label.",
      "findingIds": [
        "F12"
      ],
      "pathIds": [
        "today"
      ],
      "artifacts": [
        "evidence/lighthouse-home-summary.json",
        "evidence/home-comprehensive.json"
      ]
    },
    {
      "principleId": "be-inclusive",
      "checkId": "sufficient-contrast",
      "confidence": "high",
      "status": "pass",
      "method": "Direct browser/CDP inspection across representative conditions.",
      "evidence": "Lighthouse accessibility scored 100 and the prefers-contrast capture retained visible text and controls.",
      "artifacts": [
        "evidence/lighthouse-home-summary.json"
      ],
      "pathIds": [
        "today"
      ]
    },
    {
      "principleId": "be-inclusive",
      "checkId": "structure-and-focus",
      "confidence": "high",
      "status": "pass",
      "method": "Direct browser/CDP inspection across representative conditions.",
      "evidence": "Main/nav/header/footer landmarks are present, a skip link appears on the 404 route, and sampled primary controls expose visible focus treatment.",
      "artifacts": [
        "evidence/home-comprehensive.json"
      ],
      "pathIds": [
        "today",
        "not-found"
      ]
    },
    {
      "principleId": "be-inclusive",
      "checkId": "legible-text",
      "confidence": "high",
      "status": "pass",
      "method": "Direct browser/CDP inspection across representative conditions.",
      "evidence": "Desktop/mobile captures and forecast DOM show readable text hierarchy and no horizontal clipping at 360 px.",
      "artifacts": [
        "evidence/home-mobile-full.png"
      ],
      "pathIds": [
        "today",
        "hourly",
        "tenday"
      ]
    },
    {
      "principleId": "be-inclusive",
      "checkId": "zoom-reflow-targets-and-media",
      "confidence": "high",
      "status": "pass",
      "method": "Direct browser/CDP inspection across representative conditions.",
      "evidence": "Viewport allows scaling (no maximum-scale/user-scalable=no); all tested templates reflow at 360 px without overflow, and Lighthouse accessibility scored 100.",
      "artifacts": [
        "evidence/home-mobile-layout.json"
      ],
      "pathIds": [
        "today",
        "hourly",
        "tenday",
        "login"
      ]
    },
    {
      "principleId": "follow-best-practices",
      "checkId": "no-console-errors",
      "confidence": "high",
      "status": "issues",
      "method": "Direct browser/CDP evidence and guidance comparison.",
      "evidence": "Lighthouse captured React hydration error #418, FedCM NetworkError and missing en-GB translation messages in the console.",
      "findingIds": [
        "F13"
      ],
      "pathIds": [
        "today"
      ],
      "artifacts": [
        "evidence/lighthouse-home-summary.json"
      ]
    },
    {
      "principleId": "follow-best-practices",
      "checkId": "sound-document-and-assets",
      "confidence": "high",
      "status": "pass",
      "method": "Direct browser/CDP inspection across representative conditions.",
      "evidence": "DOM reports html doctype, UTF-8 charset and valid viewport; image probe found dimensions on every img and no oversized rendered img in its sample.",
      "artifacts": [
        "evidence/home-comprehensive.json"
      ],
      "pathIds": [
        "today"
      ]
    },
    {
      "principleId": "follow-best-practices",
      "checkId": "browser-platform-hygiene",
      "confidence": "high",
      "status": "issues",
      "method": "Direct browser/CDP evidence and guidance comparison.",
      "evidence": "Lighthouse found a large first-party JavaScript chunk without a source map and 24 KiB minification savings.",
      "findingIds": [
        "F14"
      ],
      "pathIds": [
        "today"
      ],
      "artifacts": [
        "evidence/lighthouse-home-summary.json"
      ]
    },
    {
      "principleId": "be-discoverable",
      "checkId": "title-and-description",
      "confidence": "high",
      "status": "pass",
      "method": "Direct browser/CDP inspection across representative conditions.",
      "evidence": "Landing, hourly, ten-day, radar and login pages expose unique descriptive titles; landing has a descriptive meta description.",
      "artifacts": [
        "evidence/home-comprehensive.json"
      ],
      "pathIds": [
        "today",
        "hourly",
        "tenday",
        "radar",
        "login"
      ]
    },
    {
      "principleId": "be-discoverable",
      "checkId": "crawlable-and-mobile-friendly",
      "confidence": "high",
      "status": "issues",
      "method": "Direct browser/CDP evidence and guidance comparison.",
      "evidence": "Lighthouse SEO found the hourly link text “More”; the DOM also includes empty links. The viewport and real hrefs otherwise passed.",
      "findingIds": [
        "F15"
      ],
      "pathIds": [
        "today"
      ],
      "artifacts": [
        "evidence/lighthouse-home-summary.json",
        "evidence/home-recon.json"
      ]
    },
    {
      "principleId": "be-discoverable",
      "checkId": "canonical-and-indexing-signals",
      "confidence": "high",
      "status": "issues",
      "method": "Direct browser/CDP evidence and guidance comparison.",
      "evidence": "Lighthouse reports hreflang=\"xc-MN\" as an unexpected language code. Canonical, robots and sitemap signals were otherwise present and successful.",
      "findingIds": [
        "F16"
      ],
      "pathIds": [
        "today"
      ],
      "artifacts": [
        "evidence/lighthouse-home-summary.json",
        "evidence/robots-sitemap.json"
      ]
    },
    {
      "principleId": "be-discoverable",
      "checkId": "structured-and-shareable-metadata",
      "confidence": "high",
      "status": "pass",
      "method": "Direct browser/CDP inspection across representative conditions.",
      "evidence": "Landing DOM contains 3 JSON-LD blocks and 4 Open Graph tags corresponding to visible weather/location content.",
      "artifacts": [
        "evidence/home-comprehensive.json"
      ],
      "pathIds": [
        "today"
      ]
    },
    {
      "principleId": "be-private-and-secure",
      "checkId": "secure-transport-and-headers",
      "confidence": "high",
      "status": "issues",
      "method": "Direct browser/CDP evidence and guidance comparison.",
      "evidence": "Headers probe found no CSP, X-Content-Type-Options, Referrer-Policy or Permissions-Policy; clickjacking protection was absent. Cookie probe found 15 cookies flagged insecure and extensive SameSite=None use. HTTPS and HSTS passed.",
      "findingIds": [
        "F17"
      ],
      "pathIds": [
        "today"
      ],
      "artifacts": [
        "evidence/home-headers.json",
        "evidence/home-cookies.json"
      ]
    },
    {
      "principleId": "be-private-and-secure",
      "checkId": "data-minimisation-and-third-parties",
      "confidence": "high",
      "status": "issues",
      "method": "Direct browser/CDP evidence and guidance comparison.",
      "evidence": "Tracker probe found 16 third-party origins and eight known trackers. HAR attributed 78 requests and 1.40 MB to third parties, including Taboola, DoubleClick, Rubicon and Amazon Ads.",
      "findingIds": [
        "F18"
      ],
      "pathIds": [
        "today"
      ],
      "artifacts": [
        "evidence/home-trackers.json",
        "evidence/home-summary.json",
        "evidence/home.har"
      ]
    },
    {
      "principleId": "be-private-and-secure",
      "checkId": "in-context-permissions-and-modern-auth",
      "confidence": "high",
      "status": "issues",
      "method": "Direct browser/CDP evidence and guidance comparison.",
      "evidence": "The login DOM contains email/password controls and no WebAuthn/passkey affordance; no permission prompt fired on load.",
      "findingIds": [
        "F19"
      ],
      "pathIds": [
        "login"
      ],
      "artifacts": [
        "evidence/login-dom-summary.json"
      ]
    },
    {
      "principleId": "be-private-and-secure",
      "checkId": "defensive-browser-policies",
      "confidence": "high",
      "status": "issues",
      "method": "Direct browser/CDP evidence and guidance comparison.",
      "evidence": "Headers probe found no CSP, X-Content-Type-Options, Referrer-Policy or Permissions-Policy; clickjacking protection was absent. Cookie probe found 15 cookies flagged insecure and extensive SameSite=None use. HTTPS and HSTS passed.",
      "findingIds": [
        "F17"
      ],
      "pathIds": [
        "today"
      ],
      "artifacts": [
        "evidence/home-headers.json",
        "evidence/home-cookies.json"
      ]
    },
    {
      "principleId": "be-resilient",
      "checkId": "progressive-enhancement",
      "confidence": "high",
      "status": "pass",
      "method": "Direct browser/CDP inspection across representative conditions.",
      "evidence": "Discoverability probe found 70% raw/rendered word coverage, with title, H1 and description in server HTML; it is not a JS shell.",
      "artifacts": [
        "evidence/home-discoverability.json"
      ],
      "pathIds": [
        "today"
      ]
    },
    {
      "principleId": "be-resilient",
      "checkId": "resilient-runtime-behaviour",
      "confidence": "high",
      "status": "pass",
      "method": "Direct browser/CDP inspection across representative conditions.",
      "evidence": "Forecast pages stabilised with low post-load CLS in layout probes and the consent dialog remained within both desktop and 360 px viewports.",
      "artifacts": [
        "evidence/home-mobile-layout.json"
      ],
      "pathIds": [
        "today",
        "hourly",
        "tenday"
      ]
    },
    {
      "principleId": "be-resilient",
      "checkId": "offline-and-installable",
      "confidence": "high",
      "status": "issues",
      "method": "Direct browser/CDP evidence and guidance comparison.",
      "evidence": "A web app manifest exists, but the runtime probe found no controlling service worker; forecast access therefore has no demonstrated offline fallback.",
      "findingIds": [
        "F20"
      ],
      "pathIds": [
        "today"
      ],
      "artifacts": [
        "evidence/home-comprehensive.json"
      ]
    },
    {
      "principleId": "be-resilient",
      "checkId": "network-and-http-failure-states",
      "confidence": "high",
      "status": "pass",
      "method": "Direct browser/CDP inspection across representative conditions.",
      "evidence": "The representative 404 renders a useful explanation and links back to core weather surfaces rather than a blank shell.",
      "artifacts": [
        "evidence/error-404.json"
      ],
      "pathIds": [
        "not-found"
      ]
    },
    {
      "principleId": "be-internationalised",
      "checkId": "lang-dir-and-logical-properties",
      "confidence": "high",
      "status": "pass",
      "method": "Direct browser/CDP inspection across representative conditions.",
      "evidence": "Rendered document declares lang=en-GB and dir=ltr; locale navigation offers many language/region variants.",
      "artifacts": [
        "evidence/home-comprehensive.json"
      ],
      "pathIds": [
        "today",
        "not-found"
      ]
    },
    {
      "principleId": "be-internationalised",
      "checkId": "locale-aware-data",
      "confidence": "high",
      "status": "pass",
      "method": "Direct browser/CDP inspection across representative conditions.",
      "evidence": "London forecasts render locale-appropriate “Friday 24 July”, 24-hour time and BST labels across hourly/daily templates.",
      "artifacts": [
        "evidence/hourly-dom-summary.json"
      ],
      "pathIds": [
        "hourly",
        "tenday"
      ]
    },
    {
      "principleId": "be-internationalised",
      "checkId": "time-zone-correctness",
      "confidence": "high",
      "status": "pass",
      "method": "Direct browser/CDP inspection across representative conditions.",
      "evidence": "Forecast headings explicitly state BST and all hourly entries progress coherently across the local day boundary.",
      "artifacts": [
        "evidence/hourly-dom-summary.json"
      ],
      "pathIds": [
        "hourly"
      ]
    },
    {
      "principleId": "be-trustworthy",
      "checkId": "no-dark-patterns",
      "confidence": "high",
      "status": "pass",
      "method": "Direct browser/CDP inspection across representative conditions.",
      "evidence": "Consent offers equally prominent Accept all and Reject all actions plus settings; no confirmshaming or forced account gate was observed.",
      "artifacts": [
        "evidence/home-desktop.png"
      ],
      "pathIds": [
        "today"
      ]
    },
    {
      "principleId": "be-trustworthy",
      "checkId": "humane-error-handling",
      "confidence": "high",
      "status": "pass",
      "method": "Direct browser/CDP inspection across representative conditions.",
      "evidence": "Empty login submission leaves both required controls invalid using native constraint validation; labels remain present and no data is lost.",
      "artifacts": [
        "evidence/login-invalid-submit.json"
      ],
      "pathIds": [
        "login"
      ]
    },
    {
      "principleId": "be-trustworthy",
      "checkId": "trustworthy-input-assistance",
      "confidence": "high",
      "status": "issues",
      "method": "Direct browser/CDP evidence and guidance comparison.",
      "evidence": "Login DOM shows both email and password inputs with empty autocomplete attributes; the site-search input explicitly uses autocomplete=\"off\".",
      "findingIds": [
        "F21"
      ],
      "pathIds": [
        "login"
      ],
      "artifacts": [
        "evidence/login-dom-summary.json",
        "evidence/login-invalid-submit.json"
      ]
    },
    {
      "principleId": "be-trustworthy",
      "checkId": "safe-commercial-and-account-flows",
      "confidence": "high",
      "status": "issues",
      "method": "Direct browser/CDP evidence and guidance comparison.",
      "evidence": "The login DOM contains email/password controls and no WebAuthn/passkey affordance; no permission prompt fired on load. Login DOM shows both email and password inputs with empty autocomplete attributes; the site-search input explicitly uses autocomplete=\"off\".",
      "findingIds": [
        "F19",
        "F21"
      ],
      "pathIds": [
        "login"
      ],
      "artifacts": [
        "evidence/login-dom-summary.json",
        "evidence/login-invalid-submit.json"
      ]
    },
    {
      "principleId": "be-sustainable",
      "checkId": "optimised-assets",
      "confidence": "high",
      "status": "issues",
      "method": "Direct browser/CDP evidence and guidance comparison.",
      "evidence": "Lighthouse reports the 256×256 Storm Radar PNG displayed around 70×70, with about 41 KiB potential savings; the image probe confirms a legacy PNG among otherwise SVG assets.",
      "findingIds": [
        "F22"
      ],
      "pathIds": [
        "today"
      ],
      "artifacts": [
        "evidence/lighthouse-home-summary.json",
        "evidence/home-images.json"
      ]
    },
    {
      "principleId": "be-sustainable",
      "checkId": "no-wasteful-work",
      "confidence": "high",
      "status": "issues",
      "method": "Direct browser/CDP evidence and guidance comparison.",
      "evidence": "HAR reports 1.40 MB third-party transfer across 78 requests; the largest scripts are recommendation and ad systems, while Lighthouse identifies their bundles as mostly unused.",
      "findingIds": [
        "F23"
      ],
      "pathIds": [
        "today"
      ],
      "artifacts": [
        "evidence/home-summary.json",
        "evidence/lighthouse-home-summary.json"
      ]
    },
    {
      "principleId": "be-sustainable",
      "checkId": "third-party-and-media-budget",
      "confidence": "high",
      "status": "issues",
      "method": "Direct browser/CDP evidence and guidance comparison.",
      "evidence": "HAR reports 1.40 MB third-party transfer across 78 requests; the largest scripts are recommendation and ad systems, while Lighthouse identifies their bundles as mostly unused.",
      "findingIds": [
        "F23"
      ],
      "pathIds": [
        "today"
      ],
      "artifacts": [
        "evidence/home-summary.json",
        "evidence/lighthouse-home-summary.json"
      ]
    },
    {
      "principleId": "be-agent-ready",
      "checkId": "structured-agent-capabilities",
      "confidence": "high",
      "status": "not-applicable",
      "method": "Applicability judgement from recon and audited scope.",
      "evidence": "No declared agent-facing transaction or tool surface was found; emerging WebMCP capability is optional here, while weather content remains machine-readable through server HTML and JSON-LD.",
      "reason": "No declared agent-facing transaction or tool surface was found; emerging WebMCP capability is optional here, while weather content remains machine-readable through server HTML and JSON-LD."
    },
    {
      "principleId": "be-agent-ready",
      "checkId": "on-device-inference",
      "confidence": "high",
      "status": "not-applicable",
      "method": "Applicability judgement from recon and audited scope.",
      "evidence": "No summarisation or generative interaction is offered, so on-device inference has no concrete user task to serve in the audited forecast/account scope.",
      "reason": "No summarisation or generative interaction is offered, so on-device inference has no concrete user task to serve in the audited forecast/account scope."
    },
    {
      "principleId": "be-memory-efficient",
      "checkId": "no-leak-under-repeated-interaction",
      "confidence": "high",
      "status": "pass",
      "method": "Direct browser/CDP inspection across representative conditions.",
      "evidence": "After 10 full-page scroll cycles, heap snapshot node count decreased by 393 and retained size changed only +10,284 bytes; DOM count stayed exactly 1,403.",
      "artifacts": [
        "evidence/heap-post-scroll.heapsnapshot"
      ],
      "pathIds": [
        "tenday"
      ]
    },
    {
      "principleId": "be-memory-efficient",
      "checkId": "bounded-footprint",
      "confidence": "high",
      "status": "pass",
      "method": "Direct browser/CDP inspection across representative conditions.",
      "evidence": "Baseline heap summary measured 623,558 nodes and 34.68 MB self size for the script-heavy forecast page; footprint remained stable after interaction.",
      "artifacts": [
        "evidence/heap-baseline.heapsnapshot"
      ],
      "pathIds": [
        "tenday"
      ]
    },
    {
      "principleId": "be-memory-efficient",
      "checkId": "no-detached-dom-or-unbounded-listeners",
      "confidence": "high",
      "status": "pass",
      "method": "Direct browser/CDP inspection across representative conditions.",
      "evidence": "Before/after heap constructor summaries show no Detached* population among top constructors; DOM count stayed 1,403 and closures decreased after repeated scroll.",
      "artifacts": [
        "evidence/heap-post-scroll.heapsnapshot"
      ],
      "pathIds": [
        "tenday"
      ]
    }
  ],
  "principleOutcomes": [
    {
      "principleId": "respect-user-preferences",
      "expectation": "default",
      "status": "issues",
      "findingIds": [
        "F01"
      ]
    },
    {
      "principleId": "implement-natural-interactions",
      "expectation": "default",
      "status": "issues",
      "findingIds": [
        "F02"
      ]
    },
    {
      "principleId": "provide-guided-navigation",
      "expectation": "default",
      "status": "issues",
      "findingIds": [
        "F03",
        "F04"
      ]
    },
    {
      "principleId": "maximize-content-reduce-noise",
      "expectation": "default",
      "status": "issues",
      "findingIds": [
        "F05",
        "F06"
      ]
    },
    {
      "principleId": "adapt-to-the-form-factor",
      "expectation": "default",
      "status": "pass"
    },
    {
      "principleId": "support-core-task-success",
      "expectation": "default",
      "status": "pass"
    },
    {
      "principleId": "be-fast-and-stable",
      "expectation": "default",
      "status": "issues",
      "findingIds": [
        "F07",
        "F08",
        "F09",
        "F10",
        "F11"
      ]
    },
    {
      "principleId": "be-inclusive",
      "expectation": "default",
      "status": "issues",
      "findingIds": [
        "F12"
      ]
    },
    {
      "principleId": "follow-best-practices",
      "expectation": "default",
      "status": "issues",
      "findingIds": [
        "F13",
        "F14"
      ]
    },
    {
      "principleId": "be-discoverable",
      "expectation": "default",
      "status": "issues",
      "findingIds": [
        "F15",
        "F16"
      ]
    },
    {
      "principleId": "be-private-and-secure",
      "expectation": "default",
      "status": "issues",
      "findingIds": [
        "F17",
        "F18",
        "F19"
      ]
    },
    {
      "principleId": "be-resilient",
      "expectation": "contextual",
      "status": "issues",
      "findingIds": [
        "F20"
      ]
    },
    {
      "principleId": "be-internationalised",
      "expectation": "contextual",
      "status": "pass"
    },
    {
      "principleId": "be-trustworthy",
      "expectation": "default",
      "status": "issues",
      "findingIds": [
        "F21",
        "F19"
      ]
    },
    {
      "principleId": "be-sustainable",
      "expectation": "contextual",
      "status": "issues",
      "findingIds": [
        "F22",
        "F23"
      ]
    },
    {
      "principleId": "be-agent-ready",
      "expectation": "contextual",
      "status": "not-applicable",
      "reason": "The audited forecast/account scope exposes no declared agent-facing tool or inference task; emerging agent capabilities are optional, while crawlable machine-readable content was evaluated separately."
    },
    {
      "principleId": "be-memory-efficient",
      "expectation": "default",
      "status": "pass"
    }
  ],
  "paths": [
    {
      "id": "today",
      "description": "Landing/current-conditions forecast and global navigation; representative forecast overview.",
      "url": "https://weather.com/en-GB/gb/england/greater-london/city/london/today?Goto=Redirected",
      "conditions": [
        "desktop",
        "360x800",
        "prefers-color-scheme: dark",
        "prefers-contrast: more",
        "prefers-reduced-motion: reduce",
        "no JavaScript crawler"
      ],
      "result": "issues"
    },
    {
      "id": "hourly",
      "description": "Hourly forecast listing, representing dense time-series weather content.",
      "url": "https://weather.com/en-GB/gb/england/greater-london/city/london/hourbyhour",
      "conditions": [
        "desktop DOM",
        "360x800"
      ],
      "result": "issues"
    },
    {
      "id": "tenday",
      "description": "Ten-day forecast listing and repeated long-page scroll interaction.",
      "url": "https://weather.com/en-GB/gb/england/greater-london/city/london/tenday",
      "conditions": [
        "desktop DOM",
        "360x800",
        "10 repeated scroll cycles",
        "heap before/after"
      ],
      "result": "issues"
    },
    {
      "id": "radar",
      "description": "Interactive radar entry, representing the map-heavy journey.",
      "url": "https://weather.com/en-GB/weather/radar/interactive/l/0b8697c01baca04214b4abd206319d3eba60db5fb05c191012c4e02f6bdb23a4",
      "conditions": [
        "desktop DOM",
        "360x800"
      ],
      "result": "failed"
    },
    {
      "id": "login",
      "description": "Account sign-in form, representing authentication and form handling.",
      "url": "https://weather.com/en-GB/login",
      "conditions": [
        "desktop DOM",
        "360x800",
        "empty submit"
      ],
      "result": "issues"
    },
    {
      "id": "not-found",
      "description": "Synthetic missing route, representing HTTP error recovery.",
      "url": "https://weather.com/en-GB/not-a-real-weather-page-web-uplift",
      "conditions": [
        "desktop DOM"
      ],
      "result": "pass"
    }
  ],
  "findings": [
    {
      "id": "F01",
      "severity": "medium",
      "confidence": "high",
      "principleId": "respect-user-preferences",
      "principleCheckId": "respects-color-scheme",
      "guidanceId": "dark-mode",
      "guidanceCategory": "user-experience",
      "summary": "The site does not adapt to the user’s dark colour preference.",
      "evidence": "Screenshots under default and prefers-color-scheme: dark are visually identical: the consent surface and page remain fixed light/white, and the DOM probe found no site dark-theme response.",
      "artifacts": [
        "evidence/home-dark.png",
        "evidence/home-desktop.png"
      ],
      "suggestedFix": "Declare color-scheme and provide preference-driven surface/text tokens with prefers-color-scheme or light-dark().",
      "effort": "medium",
      "pathId": "today"
    },
    {
      "id": "F02",
      "severity": "low",
      "confidence": "high",
      "principleId": "implement-natural-interactions",
      "principleCheckId": "view-transitions",
      "guidanceId": "same-document-transitions",
      "guidanceCategory": "user-experience",
      "summary": "Forecast route and state changes do not use View Transitions.",
      "evidence": "The comprehensive CSS probe found no view-transition rules even though daily, hourly, 10-day and radar are prominent state/route changes.",
      "artifacts": [
        "evidence/home-comprehensive.json"
      ],
      "suggestedFix": "Add same-document or cross-document View Transitions for forecast navigation, with a reduced-motion fallback.",
      "effort": "medium",
      "pathId": "today"
    },
    {
      "id": "F03",
      "severity": "low",
      "confidence": "high",
      "principleId": "provide-guided-navigation",
      "principleCheckId": "scroll-state-aware-chrome",
      "guidanceId": "shrinking-header-on-scroll",
      "guidanceCategory": "user-experience",
      "summary": "Long forecast pages do not expose scroll-state-aware chrome.",
      "evidence": "The DOM/CSS probe found no scroll timeline and the long hourly/10-day templates expose no progress or scroll-aware header state.",
      "artifacts": [
        "evidence/home-comprehensive.json",
        "evidence/hourly-dom-summary.json"
      ],
      "suggestedFix": "Use a sticky header plus scroll-state/container-query or progress treatment that preserves location context.",
      "effort": "medium",
      "pathId": "today"
    },
    {
      "id": "F04",
      "severity": "low",
      "confidence": "high",
      "principleId": "provide-guided-navigation",
      "principleCheckId": "anchored-positioning",
      "guidanceId": "declarative-dialog-popover-control",
      "guidanceCategory": "user-experience",
      "summary": "Menus and overlays are not built with CSS anchor positioning.",
      "evidence": "The page contains menu/dialog surfaces, while the CSS probe found no anchor-name, position-anchor, or position-try rules.",
      "artifacts": [
        "evidence/home-comprehensive.json"
      ],
      "suggestedFix": "Use popover plus CSS anchor positioning and position-try fallbacks for menus and transient overlays.",
      "effort": "medium",
      "pathId": "today"
    },
    {
      "id": "F05",
      "severity": "medium",
      "confidence": "high",
      "principleId": "maximize-content-reduce-noise",
      "principleCheckId": "no-intrusive-interruptions",
      "guidanceId": "declarative-dialog-popover-control",
      "guidanceCategory": "user-experience",
      "summary": "A first-visit consent dialog obscures the entire forecast until a choice is made.",
      "evidence": "Desktop and mobile load screenshots show a blocking cookie dialog covering the primary weather content; on mobile it consumes nearly the full viewport. Reject all is equally prominent, which avoids a deceptive-choice finding.",
      "artifacts": [
        "evidence/home-desktop.png",
        "evidence/home-mobile-full.png"
      ],
      "suggestedFix": "Minimise the initial notice, preserve equal accept/reject choices, and avoid obscuring the primary forecast where consent law permits.",
      "effort": "medium",
      "pathId": "today"
    },
    {
      "id": "F06",
      "severity": "medium",
      "confidence": "high",
      "principleId": "maximize-content-reduce-noise",
      "principleCheckId": "reduced-chrome",
      "guidanceId": "html",
      "guidanceCategory": "html",
      "summary": "Advertising and sponsored chrome repeatedly interrupt forecast content.",
      "evidence": "Rendered today/10-day DOM includes repeated “Advertisement” slots and “Sponsored Content”; the HAR records 78 third-party requests, while core forecast pages devote substantial structure to non-content modules.",
      "artifacts": [
        "evidence/tenday-dom-summary.json",
        "evidence/home-summary.json"
      ],
      "suggestedFix": "Reduce ad-slot frequency and reserve quieter, clearly separated placements after core forecast content.",
      "effort": "large",
      "pathId": "today"
    },
    {
      "id": "F07",
      "severity": "high",
      "confidence": "high",
      "principleId": "be-fast-and-stable",
      "principleCheckId": "good-core-web-vitals",
      "guidanceId": "performance",
      "guidanceCategory": "performance",
      "summary": "Lab loading performance misses the Core Web Vitals quality bar.",
      "evidence": "Lighthouse measured LCP 12.7 s, CLS 0.146 and TBT 530 ms (performance 45). The first-party trace was better at LCP 2.29 s and TBT 91.5 ms, showing variability but not negating the poor throttled result.",
      "artifacts": [
        "evidence/lighthouse-home-summary.json",
        "evidence/home-trace-summary.json"
      ],
      "suggestedFix": "Profile the LCP chain, prioritise the hero background, remove redirects, and defer non-critical ad/analytics work.",
      "effort": "large",
      "pathId": "today"
    },
    {
      "id": "F08",
      "severity": "medium",
      "confidence": "high",
      "principleId": "be-fast-and-stable",
      "principleCheckId": "visual-stability",
      "guidanceId": "performance",
      "guidanceCategory": "performance",
      "summary": "Late forecast content causes measurable layout shift.",
      "evidence": "Lighthouse measured CLS 0.146, including a 0.135 shift from an animated skeleton; the narrow layout probes were stable after their observation window.",
      "artifacts": [
        "evidence/lighthouse-home-summary.json",
        "evidence/home-mobile-layout.json"
      ],
      "suggestedFix": "Reserve final component geometry for forecast skeletons and media; do not replace placeholders with differently sized content.",
      "effort": "medium",
      "pathId": "today"
    },
    {
      "id": "F09",
      "severity": "high",
      "confidence": "high",
      "principleId": "be-fast-and-stable",
      "principleCheckId": "efficient-main-thread",
      "guidanceId": "identify-heavy-scripts",
      "guidanceCategory": "performance",
      "summary": "JavaScript keeps the main thread busy during load.",
      "evidence": "Lighthouse reports 3.4 s main-thread work, 2.3 s JavaScript execution, and 530 ms TBT; the trace also captured a 141.5 ms long task.",
      "artifacts": [
        "evidence/lighthouse-home-summary.json",
        "evidence/home-trace-summary.json"
      ],
      "suggestedFix": "Split and defer forecast-independent code, schedule lower-priority work, and delay ads/analytics until after core content is interactive.",
      "effort": "large",
      "pathId": "today"
    },
    {
      "id": "F10",
      "severity": "high",
      "confidence": "high",
      "principleId": "be-fast-and-stable",
      "principleCheckId": "efficient-resource-delivery",
      "guidanceId": "optimize-image-priority",
      "guidanceCategory": "performance",
      "summary": "The landing page ships a heavy, redirecting critical path.",
      "evidence": "HAR captured 143 requests and 2.42 MB transferred, including two document redirects and multiple parser-discovered high-priority scripts; Lighthouse estimates 850 ms redirect waste and reports a 12.7 s LCP without fetchpriority.",
      "artifacts": [
        "evidence/home.har",
        "evidence/home-summary.json",
        "evidence/lighthouse-home-summary.json"
      ],
      "suggestedFix": "Link directly to the resolved locale/location URL, prioritise the LCP image, and move non-critical scripts off the critical path.",
      "effort": "large",
      "pathId": "today"
    },
    {
      "id": "F11",
      "severity": "high",
      "confidence": "high",
      "principleId": "be-fast-and-stable",
      "principleCheckId": "trim-unused-and-duplicate-code",
      "guidanceId": "identify-heavy-scripts",
      "guidanceCategory": "performance",
      "summary": "Large unused and legacy JavaScript dominates transfer cost.",
      "evidence": "Lighthouse estimates 779 KiB unused JavaScript and 76 KiB legacy JavaScript. HAR shows 62 scripts and 2.09 MB script transfer, led by Taboola, Google Ads and Rubicon.",
      "artifacts": [
        "evidence/lighthouse-home-summary.json",
        "evidence/home-summary.json"
      ],
      "suggestedFix": "Conditionally load advertising, identity and analytics bundles after consent/intent; remove legacy transforms for modern browsers.",
      "effort": "large",
      "pathId": "today"
    },
    {
      "id": "F12",
      "severity": "medium",
      "confidence": "high",
      "principleId": "be-inclusive",
      "principleCheckId": "names-roles-labels",
      "guidanceId": "accessibility",
      "guidanceCategory": "accessibility",
      "summary": "Some interactive controls have incomplete or mismatched accessible names.",
      "evidence": "Lighthouse details multiple hourly links whose aria-label omits visible label content, and the DOM probe found five links plus several buttons with no text or aria-label.",
      "artifacts": [
        "evidence/lighthouse-home-summary.json",
        "evidence/home-comprehensive.json"
      ],
      "suggestedFix": "Make each accessible name include the visible time/temperature label and label icon-only links/buttons explicitly.",
      "effort": "small",
      "pathId": "today"
    },
    {
      "id": "F13",
      "severity": "medium",
      "confidence": "high",
      "principleId": "follow-best-practices",
      "principleCheckId": "no-console-errors",
      "guidanceId": "html",
      "guidanceCategory": "html",
      "summary": "The page logs runtime and hydration errors during load.",
      "evidence": "Lighthouse captured React hydration error #418, FedCM NetworkError and missing en-GB translation messages in the console.",
      "artifacts": [
        "evidence/lighthouse-home-summary.json"
      ],
      "suggestedFix": "Fix server/client markup divergence, guard FedCM failures, and supply all en-GB message keys without logging production errors.",
      "effort": "medium",
      "pathId": "today"
    },
    {
      "id": "F14",
      "severity": "low",
      "confidence": "high",
      "principleId": "follow-best-practices",
      "principleCheckId": "browser-platform-hygiene",
      "guidanceId": "html",
      "guidanceCategory": "html",
      "summary": "Production debugging and asset hygiene is incomplete.",
      "evidence": "Lighthouse found a large first-party JavaScript chunk without a source map and 24 KiB minification savings.",
      "artifacts": [
        "evidence/lighthouse-home-summary.json"
      ],
      "suggestedFix": "Publish correct production source maps to an authenticated error pipeline and fully minify shipped bundles.",
      "effort": "small",
      "pathId": "today"
    },
    {
      "id": "F15",
      "severity": "medium",
      "confidence": "high",
      "principleId": "be-discoverable",
      "principleCheckId": "crawlable-and-mobile-friendly",
      "guidanceId": "html",
      "guidanceCategory": "html",
      "summary": "Some crawlable links use non-descriptive text.",
      "evidence": "Lighthouse SEO found the hourly link text “More”; the DOM also includes empty links. The viewport and real hrefs otherwise passed.",
      "artifacts": [
        "evidence/lighthouse-home-summary.json",
        "evidence/home-recon.json"
      ],
      "suggestedFix": "Replace generic labels with destination-specific text such as “View full hourly forecast” and label logo/social links.",
      "effort": "small",
      "pathId": "today"
    },
    {
      "id": "F16",
      "severity": "low",
      "confidence": "high",
      "principleId": "be-discoverable",
      "principleCheckId": "canonical-and-indexing-signals",
      "guidanceId": "html",
      "guidanceCategory": "html",
      "summary": "One hreflang entry is invalid.",
      "evidence": "Lighthouse reports hreflang=\"xc-MN\" as an unexpected language code. Canonical, robots and sitemap signals were otherwise present and successful.",
      "artifacts": [
        "evidence/lighthouse-home-summary.json",
        "evidence/robots-sitemap.json"
      ],
      "suggestedFix": "Generate only valid BCP 47 hreflang values and validate the locale map before deployment.",
      "effort": "small",
      "pathId": "today"
    },
    {
      "id": "F17",
      "severity": "high",
      "confidence": "high",
      "principleId": "be-private-and-secure",
      "principleCheckId": "secure-transport-and-headers",
      "guidanceId": "security",
      "guidanceCategory": "security",
      "summary": "Core browser security headers and cookie attributes are incomplete.",
      "evidence": "Headers probe found no CSP, X-Content-Type-Options, Referrer-Policy or Permissions-Policy; clickjacking protection was absent. Cookie probe found 15 cookies flagged insecure and extensive SameSite=None use. HTTPS and HSTS passed.",
      "artifacts": [
        "evidence/home-headers.json",
        "evidence/home-cookies.json"
      ],
      "suggestedFix": "Deploy a nonce/hash CSP, nosniff, frame-ancestors, Referrer-Policy and a minimal Permissions-Policy; mark every HTTPS cookie Secure and narrow SameSite.",
      "effort": "large",
      "pathId": "today"
    },
    {
      "id": "F18",
      "severity": "high",
      "confidence": "high",
      "principleId": "be-private-and-secure",
      "principleCheckId": "data-minimisation-and-third-parties",
      "guidanceId": "privacy",
      "guidanceCategory": "privacy",
      "summary": "The default page load has a large advertising and tracking footprint.",
      "evidence": "Tracker probe found 16 third-party origins and eight known trackers. HAR attributed 78 requests and 1.40 MB to third parties, including Taboola, DoubleClick, Rubicon and Amazon Ads.",
      "artifacts": [
        "evidence/home-trackers.json",
        "evidence/home-summary.json",
        "evidence/home.har"
      ],
      "suggestedFix": "Gate non-essential vendors on consent, reduce the vendor set, batch analytics, and load third parties only where they provide visible user value.",
      "effort": "large",
      "pathId": "today"
    },
    {
      "id": "F19",
      "severity": "medium",
      "confidence": "high",
      "principleId": "be-private-and-secure",
      "principleCheckId": "in-context-permissions-and-modern-auth",
      "guidanceId": "security",
      "guidanceCategory": "security",
      "summary": "Sign-in exposes password-only authentication with no observed passkey path.",
      "evidence": "The login DOM contains email/password controls and no WebAuthn/passkey affordance; no permission prompt fired on load.",
      "artifacts": [
        "evidence/login-dom-summary.json"
      ],
      "suggestedFix": "Add passkey registration/authentication and retain password recovery as a fallback.",
      "effort": "large",
      "pathId": "login"
    },
    {
      "id": "F20",
      "severity": "low",
      "confidence": "high",
      "principleId": "be-resilient",
      "principleCheckId": "offline-and-installable",
      "guidanceId": "flicker-free-client-side-ab-testing",
      "guidanceCategory": "performance",
      "summary": "The app-like weather experience has no active offline runtime.",
      "evidence": "A web app manifest exists, but the runtime probe found no controlling service worker; forecast access therefore has no demonstrated offline fallback.",
      "artifacts": [
        "evidence/home-comprehensive.json"
      ],
      "suggestedFix": "Add a service worker with a lightweight offline shell and cache the last successful forecast with clear staleness messaging.",
      "effort": "large",
      "pathId": "today"
    },
    {
      "id": "F21",
      "severity": "medium",
      "confidence": "high",
      "principleId": "be-trustworthy",
      "principleCheckId": "trustworthy-input-assistance",
      "guidanceId": "forms",
      "guidanceCategory": "forms",
      "summary": "The sign-in fields omit standard autocomplete tokens.",
      "evidence": "Login DOM shows both email and password inputs with empty autocomplete attributes; the site-search input explicitly uses autocomplete=\"off\".",
      "artifacts": [
        "evidence/login-dom-summary.json",
        "evidence/login-invalid-submit.json"
      ],
      "suggestedFix": "Use autocomplete=\"username\" and autocomplete=\"current-password\"; keep search suggestions separate from browser autofill.",
      "effort": "trivial",
      "pathId": "login"
    },
    {
      "id": "F22",
      "severity": "low",
      "confidence": "high",
      "principleId": "be-sustainable",
      "principleCheckId": "optimised-assets",
      "guidanceId": "optimize-image-priority",
      "guidanceCategory": "performance",
      "summary": "A footer raster image is oversized and inefficient.",
      "evidence": "Lighthouse reports the 256×256 Storm Radar PNG displayed around 70×70, with about 41 KiB potential savings; the image probe confirms a legacy PNG among otherwise SVG assets.",
      "artifacts": [
        "evidence/lighthouse-home-summary.json",
        "evidence/home-images.json"
      ],
      "suggestedFix": "Serve an appropriately sized AVIF/WebP (or SVG where possible) with responsive variants.",
      "effort": "trivial",
      "pathId": "today"
    },
    {
      "id": "F23",
      "severity": "high",
      "confidence": "high",
      "principleId": "be-sustainable",
      "principleCheckId": "third-party-and-media-budget",
      "guidanceId": "efficient-background-processing",
      "guidanceCategory": "performance",
      "summary": "Third-party script cost is disproportionate to the core forecast task.",
      "evidence": "HAR reports 1.40 MB third-party transfer across 78 requests; the largest scripts are recommendation and ad systems, while Lighthouse identifies their bundles as mostly unused.",
      "artifacts": [
        "evidence/home-summary.json",
        "evidence/lighthouse-home-summary.json"
      ],
      "suggestedFix": "Set a third-party byte/request budget, remove low-value vendors, and defer the remainder until consent and visible need.",
      "effort": "large",
      "pathId": "today"
    }
  ],
  "taskList": [
    {
      "id": "T01",
      "title": "Cut third-party and unused JavaScript from the critical path",
      "priority": 1,
      "findingIds": [
        "F07",
        "F09",
        "F10",
        "F11",
        "F18",
        "F23"
      ],
      "guidanceId": "identify-heavy-scripts",
      "status": "open"
    },
    {
      "id": "T02",
      "title": "Deploy CSP, defensive headers, and secure cookie attributes",
      "priority": 2,
      "findingIds": [
        "F17"
      ],
      "guidanceId": "security",
      "status": "open"
    },
    {
      "id": "T03",
      "title": "Stabilise and prioritise the primary forecast/LCP component",
      "priority": 3,
      "findingIds": [
        "F07",
        "F08",
        "F10"
      ],
      "guidanceId": "performance",
      "status": "open"
    },
    {
      "id": "T04",
      "title": "Fix interactive accessible names and descriptive links",
      "priority": 4,
      "findingIds": [
        "F12",
        "F15"
      ],
      "guidanceId": "accessibility",
      "status": "open"
    },
    {
      "id": "T05",
      "title": "Reduce first-visit and advertising interruption",
      "priority": 5,
      "findingIds": [
        "F05",
        "F06"
      ],
      "guidanceId": "declarative-dialog-popover-control",
      "status": "open"
    },
    {
      "id": "T06",
      "title": "Add preference-driven dark mode",
      "priority": 6,
      "findingIds": [
        "F01"
      ],
      "guidanceId": "dark-mode",
      "status": "open"
    },
    {
      "id": "T07",
      "title": "Modernise authentication with autofill and passkeys",
      "priority": 7,
      "findingIds": [
        "F19",
        "F21"
      ],
      "guidanceId": "forms",
      "status": "open"
    },
    {
      "id": "T08",
      "title": "Resolve production console, source-map, and locale errors",
      "priority": 8,
      "findingIds": [
        "F13",
        "F14"
      ],
      "guidanceId": "html",
      "status": "open"
    },
    {
      "id": "T09",
      "title": "Add resilient offline access to the last forecast",
      "priority": 9,
      "findingIds": [
        "F20"
      ],
      "guidanceId": "flicker-free-client-side-ab-testing",
      "status": "open"
    },
    {
      "id": "T10",
      "title": "Fix hreflang and image delivery",
      "priority": 10,
      "findingIds": [
        "F16",
        "F22"
      ],
      "guidanceId": "html",
      "status": "open"
    },
    {
      "id": "T11",
      "title": "Progressively enhance navigation motion and anchored overlays",
      "priority": 11,
      "findingIds": [
        "F02",
        "F03",
        "F04"
      ],
      "guidanceId": "same-document-transitions",
      "status": "open"
    }
  ],
  "budget": {
    "pathCount": 6,
    "auditPasses": 1
  },
  "agent": "pi",
  "runId": "2026-07-24T08-46-49-037Z"
}
