{
  "url": "https://www.wetter.com",
  "auditedAt": "2026-07-23T16:17:20.790Z",
  "mode": "report",
  "status": "completed",
  "statusDetail": "Atomic coverage complete across 58 checks and seven representative paths.",
  "page": {
    "appType": "hybrid",
    "framework": "Next.js fragments within a server-rendered multi-page site",
    "notes": "Public German weather portal. Representative templates cover landing, listing, city forecast, interactive radar, editorial article, search results, and HTTP error recovery. Not covered: account/native-app-only, paid contentpass checkout, or destructive/commercial flows because they were not part of the public core weather journey."
  },
  "evidenceUsed": [
    "screenshot",
    "dom",
    "layout-metrics",
    "evaluate-probe",
    "trace",
    "har",
    "headers",
    "cookies",
    "trackers",
    "secrets",
    "images",
    "discoverability",
    "heap-summary",
    "Lighthouse",
    "axe-core",
    "raw HTTP/robots/sitemap/manifest"
  ],
  "guidanceConsulted": [
    "dark-mode",
    "component-specific-light-dark-theme",
    "accessibility",
    "adapt-scrollbar-to-contrast-preferences",
    "same-document-transitions",
    "cross-document-transitions",
    "group-element-transitions",
    "faster-spa-view-transitions",
    "scrollytelling",
    "parallax-scroll-effects",
    "scroll-entry-exit-effects",
    "carousel-slide-effects",
    "physics-based-easing",
    "individual-transform-properties",
    "animate-element-entry-exit",
    "animate-to-from-top-layer",
    "animate-to-intrinsic-sizes",
    "dynamic-sibling-animations",
    "interactive-content-reveal",
    "pull-to-reveal",
    "swipe-to-remove",
    "shrinking-header-on-scroll",
    "scroll-progress-indicator",
    "scroll-position-aware-elements",
    "scroll-snap-realtime-feedback",
    "scroll-snap-state-sync",
    "scroll-target-on-load",
    "soft-edge-content-fade",
    "scrollability-affordance-hints",
    "anchor-positioning-tab-underline",
    "position-aware-tooltips",
    "interest-triggered-tooltips",
    "interest-triggered-action-previews",
    "directional-navigation-transitions",
    "carousel-snap-highlights",
    "navigation-drawer",
    "stack-drill-down",
    "persistent-app-tours",
    "persistent-toast-notifications",
    "light-dismiss-a-dialog",
    "platform-controls-dismiss-dialog",
    "declarative-dialog-popover-control",
    "animated-select-picker",
    "branded-select-styling",
    "brand-consistent-forms",
    "custom-select-picker-layouts",
    "rich-media-picker",
    "complex-shapes",
    "shaped-cutouts",
    "overflow-clipping-control",
    "visually-texture-content",
    "apply-webgl-shaders",
    "interactive-content-in-3d-scenes",
    "highlight-text-ranges",
    "prevent-text-wrapping",
    "customize-scrollbar-color-and-thickness",
    "export-html-media-from-canvas",
    "fluid-scaling",
    "calculate-with-intrinsic-sizes",
    "css-layout",
    "size-aware-styling",
    "content-based-styling",
    "child-state-based-styling",
    "design-token-reactivity",
    "dynamic-sibling-styling",
    "form-fields-automatically-fit-contents",
    "improve-text-layout-and-legibility",
    "forms",
    "accessible-error-announcement",
    "required-field-feedback",
    "validate-input-after-interaction",
    "identify-inp-causes",
    "schedule-tasks-by-priority",
    "optimize-preload-priority",
    "improve-next-page-load-performance",
    "interactions-in-complex-layouts",
    "performance",
    "visually-stable-font-fallbacks",
    "break-up-long-tasks",
    "identify-heavy-scripts",
    "optimize-script-priority",
    "defer-rendering-heavy-content",
    "defer-work-until-scroll-ends",
    "optimize-image-priority",
    "conditional-async-dependencies",
    "expose-canvas-content-to-browser-features",
    "move-dom-element-without-losing-state",
    "precise-text-alignment",
    "visually-stable-mixed-fonts",
    "css",
    "html",
    "reduce-style-repetition",
    "security",
    "privacy",
    "batch-analytics-events",
    "full-session-analytics",
    "calculate-total-foreground-time",
    "passkeys",
    "passkey-registration",
    "passkey-authentication",
    "passkey-reauthentication",
    "passkey-conditional-create",
    "passkey-management",
    "flicker-free-client-side-ab-testing",
    "consistent-cross-document-transitions",
    "stabilize-reactive-state",
    "resilient-context-menus-and-nested-dropdowns",
    "persistent-top-layer-ui",
    "detect-initial-visibility-state",
    "sequence-distributed-events",
    "translator",
    "language-detection",
    "support-global-calendar-systems",
    "capture-location-agnostic-data",
    "format-human-readable-durations",
    "manage-recurring-intervals",
    "calculate-event-differentials",
    "coordinate-global-events",
    "model-partial-time-concepts",
    "search-hidden-content",
    "select-menu-interaction",
    "style-parent-with-has",
    "autofill-address-form",
    "autofill-payment-form",
    "autofill-sign-in-form",
    "autofill-sign-up-form",
    "autofill-highlight-inputs",
    "deliver-optimized-decorative-images",
    "resolution-optimized-pseudo-elements",
    "deprioritize-background-fetches",
    "efficient-background-processing",
    "webmcp",
    "agentic-forms",
    "agentic-javascript-tools",
    "language-model",
    "summarizer"
  ],
  "artifacts": [
    {
      "type": "other",
      "path": "evidence/404-headers.txt",
      "caption": "404 headers",
      "findingIds": []
    },
    {
      "type": "screenshot",
      "path": "evidence/article-discoverability-crawler.png",
      "caption": "article discoverability crawler",
      "findingIds": []
    },
    {
      "type": "screenshot",
      "path": "evidence/article-discoverability-rendered.png",
      "caption": "article discoverability rendered",
      "findingIds": []
    },
    {
      "type": "discoverability",
      "path": "evidence/article-discoverability.json",
      "caption": "article discoverability",
      "findingIds": []
    },
    {
      "type": "layout",
      "path": "evidence/article-layout.json",
      "caption": "article layout",
      "findingIds": []
    },
    {
      "type": "screenshot",
      "path": "evidence/article-mobile.png",
      "caption": "article mobile",
      "findingIds": [
        "F017"
      ]
    },
    {
      "type": "other",
      "path": "evidence/axe-home.json",
      "caption": "axe home",
      "findingIds": [
        "F007",
        "F008",
        "F009"
      ]
    },
    {
      "type": "screenshot",
      "path": "evidence/city-discoverability-crawler.png",
      "caption": "city discoverability crawler",
      "findingIds": []
    },
    {
      "type": "screenshot",
      "path": "evidence/city-discoverability-rendered.png",
      "caption": "city discoverability rendered",
      "findingIds": []
    },
    {
      "type": "discoverability",
      "path": "evidence/city-discoverability.json",
      "caption": "city discoverability",
      "findingIds": []
    },
    {
      "type": "other",
      "path": "evidence/city-i18n.json",
      "caption": "city i18n",
      "findingIds": []
    },
    {
      "type": "layout",
      "path": "evidence/city-layout.json",
      "caption": "city layout",
      "findingIds": [
        "F002"
      ]
    },
    {
      "type": "screenshot",
      "path": "evidence/city-mobile.png",
      "caption": "city mobile",
      "findingIds": [
        "F001",
        "F002",
        "F016",
        "F017"
      ]
    },
    {
      "type": "other",
      "path": "evidence/consent-mobile-probe.json",
      "caption": "consent mobile probe",
      "findingIds": [
        "F002",
        "F016",
        "F017"
      ]
    },
    {
      "type": "other",
      "path": "evidence/cookies.json",
      "caption": "cookies",
      "findingIds": [
        "F013"
      ]
    },
    {
      "type": "other",
      "path": "evidence/error-404.json",
      "caption": "error 404",
      "findingIds": []
    },
    {
      "type": "screenshot",
      "path": "evidence/error-404.png",
      "caption": "error 404",
      "findingIds": []
    },
    {
      "type": "other",
      "path": "evidence/headers.json",
      "caption": "headers",
      "findingIds": [
        "F013"
      ]
    },
    {
      "type": "heap",
      "path": "evidence/heap-baseline.json",
      "caption": "heap baseline",
      "findingIds": []
    },
    {
      "type": "heap",
      "path": "evidence/heap-post-menu.json",
      "caption": "heap post menu",
      "findingIds": []
    },
    {
      "type": "screenshot",
      "path": "evidence/home-dark.png",
      "caption": "home dark",
      "findingIds": [
        "F001",
        "F003"
      ]
    },
    {
      "type": "screenshot",
      "path": "evidence/home-desktop.png",
      "caption": "home desktop",
      "findingIds": []
    },
    {
      "type": "screenshot",
      "path": "evidence/home-discoverability-crawler.png",
      "caption": "home discoverability crawler",
      "findingIds": []
    },
    {
      "type": "screenshot",
      "path": "evidence/home-discoverability-rendered.png",
      "caption": "home discoverability rendered",
      "findingIds": []
    },
    {
      "type": "discoverability",
      "path": "evidence/home-discoverability.json",
      "caption": "home discoverability",
      "findingIds": []
    },
    {
      "type": "dom",
      "path": "evidence/home-dom.json",
      "caption": "home dom",
      "findingIds": []
    },
    {
      "type": "screenshot",
      "path": "evidence/home-high-contrast.png",
      "caption": "home high contrast",
      "findingIds": [
        "F008"
      ]
    },
    {
      "type": "other",
      "path": "evidence/home-images.json",
      "caption": "home images",
      "findingIds": [
        "F012"
      ]
    },
    {
      "type": "layout",
      "path": "evidence/home-mobile-layout.json",
      "caption": "home mobile layout",
      "findingIds": [
        "F002",
        "F015"
      ]
    },
    {
      "type": "screenshot",
      "path": "evidence/home-mobile.png",
      "caption": "home mobile",
      "findingIds": [
        "F015"
      ]
    },
    {
      "type": "har-summary",
      "path": "evidence/home-summary.json",
      "caption": "home summary",
      "findingIds": [
        "F006"
      ]
    },
    {
      "type": "trace-summary",
      "path": "evidence/home-trace-summary.json",
      "caption": "home trace summary",
      "findingIds": [
        "F005"
      ]
    },
    {
      "type": "trace",
      "path": "evidence/home-trace.json",
      "caption": "home trace",
      "findingIds": [
        "F005"
      ]
    },
    {
      "type": "har",
      "path": "evidence/home.har",
      "caption": "home",
      "findingIds": []
    },
    {
      "type": "lighthouse",
      "path": "evidence/lighthouse-detail-summary.json",
      "caption": "lighthouse detail summary",
      "findingIds": [
        "F009",
        "F011"
      ]
    },
    {
      "type": "har-summary",
      "path": "evidence/lighthouse-home-summary.json",
      "caption": "lighthouse home summary",
      "findingIds": [
        "F005",
        "F006",
        "F007",
        "F008",
        "F014"
      ]
    },
    {
      "type": "lighthouse",
      "path": "evidence/lighthouse-home.json",
      "caption": "lighthouse home",
      "findingIds": [
        "F006"
      ]
    },
    {
      "type": "screenshot",
      "path": "evidence/listing-discoverability-crawler.png",
      "caption": "listing discoverability crawler",
      "findingIds": []
    },
    {
      "type": "screenshot",
      "path": "evidence/listing-discoverability-rendered.png",
      "caption": "listing discoverability rendered",
      "findingIds": []
    },
    {
      "type": "discoverability",
      "path": "evidence/listing-discoverability.json",
      "caption": "listing discoverability",
      "findingIds": []
    },
    {
      "type": "layout",
      "path": "evidence/listing-layout.json",
      "caption": "listing layout",
      "findingIds": []
    },
    {
      "type": "screenshot",
      "path": "evidence/listing-mobile.png",
      "caption": "listing mobile",
      "findingIds": []
    },
    {
      "type": "other",
      "path": "evidence/manifest-summary.json",
      "caption": "manifest summary",
      "findingIds": []
    },
    {
      "type": "other",
      "path": "evidence/manifest.json",
      "caption": "manifest",
      "findingIds": []
    },
    {
      "type": "other",
      "path": "evidence/memory-metrics.json",
      "caption": "memory metrics",
      "findingIds": []
    },
    {
      "type": "other",
      "path": "evidence/memory-warmed-series.json",
      "caption": "memory warmed series",
      "findingIds": []
    },
    {
      "type": "other",
      "path": "evidence/overlays.json",
      "caption": "overlays",
      "findingIds": [
        "F001"
      ]
    },
    {
      "type": "other",
      "path": "evidence/platform-features.json",
      "caption": "platform features",
      "findingIds": [
        "F003",
        "F014"
      ]
    },
    {
      "type": "other",
      "path": "evidence/preferences-focus.json",
      "caption": "preferences focus",
      "findingIds": [
        "F003",
        "F004",
        "F010"
      ]
    },
    {
      "type": "screenshot",
      "path": "evidence/radar-discoverability-crawler.png",
      "caption": "radar discoverability crawler",
      "findingIds": []
    },
    {
      "type": "screenshot",
      "path": "evidence/radar-discoverability-rendered.png",
      "caption": "radar discoverability rendered",
      "findingIds": []
    },
    {
      "type": "discoverability",
      "path": "evidence/radar-discoverability.json",
      "caption": "radar discoverability",
      "findingIds": []
    },
    {
      "type": "layout",
      "path": "evidence/radar-layout.json",
      "caption": "radar layout",
      "findingIds": []
    },
    {
      "type": "screenshot",
      "path": "evidence/radar-mobile.png",
      "caption": "radar mobile",
      "findingIds": []
    },
    {
      "type": "other",
      "path": "evidence/recon.json",
      "caption": "recon",
      "findingIds": [
        "F007"
      ]
    },
    {
      "type": "other",
      "path": "evidence/robots.txt",
      "caption": "robots",
      "findingIds": []
    },
    {
      "type": "other",
      "path": "evidence/routes.json",
      "caption": "routes",
      "findingIds": []
    },
    {
      "type": "screenshot",
      "path": "evidence/search-discoverability-crawler.png",
      "caption": "search discoverability crawler",
      "findingIds": []
    },
    {
      "type": "screenshot",
      "path": "evidence/search-discoverability-rendered.png",
      "caption": "search discoverability rendered",
      "findingIds": []
    },
    {
      "type": "discoverability",
      "path": "evidence/search-discoverability.json",
      "caption": "search discoverability",
      "findingIds": []
    },
    {
      "type": "other",
      "path": "evidence/search-flow.json",
      "caption": "search flow",
      "findingIds": []
    },
    {
      "type": "layout",
      "path": "evidence/search-layout.json",
      "caption": "search layout",
      "findingIds": []
    },
    {
      "type": "screenshot",
      "path": "evidence/search-mobile.png",
      "caption": "search mobile",
      "findingIds": []
    },
    {
      "type": "other",
      "path": "evidence/secrets.json",
      "caption": "secrets",
      "findingIds": []
    },
    {
      "type": "other",
      "path": "evidence/semantics.json",
      "caption": "semantics",
      "findingIds": [
        "F004",
        "F009",
        "F010"
      ]
    },
    {
      "type": "other",
      "path": "evidence/sitemap.xml",
      "caption": "sitemap",
      "findingIds": []
    },
    {
      "type": "other",
      "path": "evidence/trackers.json",
      "caption": "trackers",
      "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",
      "method": "Evidence selected from the catalog hint: 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": "Preference-emulated screenshots and computed media/style probes were compared.",
      "pathIds": [
        "home"
      ],
      "status": "issues",
      "findingIds": [
        "F003"
      ],
      "artifacts": [
        "evidence/home-dark.png",
        "evidence/preferences-focus.json",
        "evidence/platform-features.json"
      ]
    },
    {
      "principleId": "respect-user-preferences",
      "checkId": "respects-reduced-motion",
      "confidence": "high",
      "method": "Evidence selected from the catalog 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": "Preference-emulated screenshots and computed media/style probes were compared.",
      "pathIds": [
        "home"
      ],
      "status": "issues",
      "findingIds": [
        "F004"
      ],
      "artifacts": [
        "evidence/preferences-focus.json",
        "evidence/semantics.json"
      ]
    },
    {
      "principleId": "respect-user-preferences",
      "checkId": "respects-contrast",
      "confidence": "high",
      "method": "Evidence selected from the catalog 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": "Preference-emulated screenshots and computed media/style probes were compared.",
      "pathIds": [
        "home"
      ],
      "status": "pass"
    },
    {
      "principleId": "implement-natural-interactions",
      "checkId": "view-transitions",
      "confidence": "medium",
      "method": "Evidence selected from the catalog hint: a transition video of a route/state change shows whether it animates; the page source / ::view-transition usage corroborates. The model chooses.",
      "evidence": "The covered MPA links use ordinary full-document navigation; no SPA state morph or abrupt custom transition was present, so native navigation remained predictable.",
      "pathIds": [
        "home"
      ],
      "status": "pass"
    },
    {
      "principleId": "implement-natural-interactions",
      "checkId": "scroll-driven-animations",
      "confidence": "medium",
      "method": "Evidence selected from the catalog 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": "CSS inspection found no animation-timeline and layout observers found no scroll long tasks; the site uses native scrolling rather than main-thread scroll animation.",
      "pathIds": [
        "home"
      ],
      "status": "pass"
    },
    {
      "principleId": "implement-natural-interactions",
      "checkId": "physical-gestures",
      "confidence": "medium",
      "method": "Evidence selected from the catalog hint: CSS inspection for scroll-snap / overscroll-behavior / physics-based easing vs custom pointermove listeners. The model chooses.",
      "evidence": "Core tasks use links, form submission, and map controls rather than gesture-only handlers; no custom pointer trap was observed.",
      "pathIds": [
        "home"
      ],
      "status": "pass"
    },
    {
      "principleId": "provide-guided-navigation",
      "checkId": "scroll-state-aware-chrome",
      "confidence": "medium",
      "method": "Evidence selected from the catalog hint: a transition video of scrolling, or CSS inspection for scroll-state container queries. The model chooses.",
      "evidence": "Mobile captures retain a compact branded header/search entry and clear section headings while content scrolls.",
      "pathIds": [
        "home"
      ],
      "status": "pass"
    },
    {
      "principleId": "provide-guided-navigation",
      "checkId": "anchored-positioning",
      "confidence": "medium",
      "method": "Evidence selected from the catalog 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": "Desktop/mobile screenshots, semantic navigation inspection, and overlay geometry were reviewed.",
      "pathIds": [
        "home"
      ],
      "status": "issues",
      "findingIds": [
        "F001"
      ],
      "artifacts": [
        "evidence/home-dark.png",
        "evidence/city-mobile.png",
        "evidence/overlays.json"
      ]
    },
    {
      "principleId": "provide-guided-navigation",
      "checkId": "directs-attention",
      "confidence": "medium",
      "method": "Evidence selected from the catalog hint: CSS inspection for ::highlight / scroll-marker; a transition video can show whether attention is cued after navigation. The model chooses.",
      "evidence": "The first content viewport clearly labels “Wetter für Deutschland heute” and puts forecast/radar/warning choices directly above the map.",
      "pathIds": [
        "home"
      ],
      "status": "pass"
    },
    {
      "principleId": "maximize-content-reduce-noise",
      "checkId": "no-intrusive-interruptions",
      "confidence": "high",
      "method": "Evidence selected from the catalog hint: a screenshot on load, or a DOM probe for full-viewport overlays present before interaction. The model chooses.",
      "evidence": "Load screenshots, fixed-overlay probe, and full-page mobile length were reviewed.",
      "pathIds": [
        "home"
      ],
      "status": "issues",
      "findingIds": [
        "F001"
      ],
      "artifacts": [
        "evidence/home-dark.png",
        "evidence/city-mobile.png",
        "evidence/overlays.json"
      ]
    },
    {
      "principleId": "maximize-content-reduce-noise",
      "checkId": "semantic-dismissible-primitives",
      "confidence": "high",
      "method": "Evidence selected from the catalog hint: DOM/source inspection for popover / <dialog> / <details> vs custom overlay divs with manual dismiss handling. The model chooses.",
      "evidence": "Load screenshots, fixed-overlay probe, and full-page mobile length were reviewed.",
      "pathIds": [
        "home"
      ],
      "status": "issues",
      "findingIds": [
        "F001"
      ],
      "artifacts": [
        "evidence/home-dark.png",
        "evidence/city-mobile.png",
        "evidence/overlays.json"
      ]
    },
    {
      "principleId": "maximize-content-reduce-noise",
      "checkId": "reduced-chrome",
      "confidence": "high",
      "method": "Evidence selected from the catalog hint: a screenshot plus layout metrics can show the proportion of the viewport given to chrome vs content. The model chooses.",
      "evidence": "Load screenshots, fixed-overlay probe, and full-page mobile length were reviewed.",
      "pathIds": [
        "home"
      ],
      "status": "issues",
      "findingIds": [
        "F015"
      ],
      "artifacts": [
        "evidence/home-mobile.png",
        "evidence/home-mobile-layout.json"
      ]
    },
    {
      "principleId": "adapt-to-the-form-factor",
      "checkId": "responsive-no-horizontal-scroll",
      "confidence": "high",
      "method": "Evidence selected from the catalog hint: layout metrics (scrollWidth vs innerWidth) and a screenshot at an emulated narrow mobile viewport reveal overflow. The model chooses.",
      "evidence": "Five archetypes were measured at 360×800 and keyboard focus/control geometry was probed.",
      "pathIds": [
        "home",
        "listing",
        "city",
        "radar",
        "article",
        "search"
      ],
      "status": "issues",
      "findingIds": [
        "F002"
      ],
      "artifacts": [
        "evidence/city-mobile.png",
        "evidence/consent-mobile-probe.json",
        "evidence/home-mobile-layout.json",
        "evidence/city-layout.json"
      ]
    },
    {
      "principleId": "adapt-to-the-form-factor",
      "checkId": "component-level-responsiveness",
      "confidence": "high",
      "method": "Evidence selected from the catalog 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": "Five archetypes were measured at 360×800 and keyboard focus/control geometry was probed.",
      "pathIds": [
        "home",
        "listing",
        "city",
        "radar",
        "article",
        "search"
      ],
      "status": "issues",
      "findingIds": [
        "F002"
      ],
      "artifacts": [
        "evidence/city-mobile.png",
        "evidence/consent-mobile-probe.json",
        "evidence/home-mobile-layout.json",
        "evidence/city-layout.json"
      ]
    },
    {
      "principleId": "adapt-to-the-form-factor",
      "checkId": "input-modality-aware",
      "confidence": "high",
      "method": "Evidence selected from the catalog 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": "Five archetypes were measured at 360×800 and keyboard focus/control geometry was probed.",
      "pathIds": [
        "home",
        "listing",
        "city",
        "radar",
        "article",
        "search"
      ],
      "status": "issues",
      "findingIds": [
        "F010"
      ],
      "artifacts": [
        "evidence/semantics.json",
        "evidence/preferences-focus.json"
      ]
    },
    {
      "principleId": "support-core-task-success",
      "checkId": "clear-purpose-and-primary-action",
      "confidence": "high",
      "method": "Evidence selected from the catalog 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, Berlin forecast, radar, search result, article, and 404 recovery journeys were exercised.",
      "pathIds": [
        "home",
        "city",
        "radar",
        "search",
        "error"
      ],
      "status": "issues",
      "findingIds": [
        "F017"
      ],
      "artifacts": [
        "evidence/city-mobile.png",
        "evidence/article-mobile.png",
        "evidence/consent-mobile-probe.json"
      ]
    },
    {
      "principleId": "support-core-task-success",
      "checkId": "primary-flow-completion",
      "confidence": "high",
      "method": "Evidence selected from the catalog 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": "Homepage, Berlin forecast, radar, search result, article, and 404 recovery journeys were exercised.",
      "pathIds": [
        "home",
        "city",
        "radar",
        "search",
        "error"
      ],
      "status": "issues",
      "findingIds": [
        "F017"
      ],
      "artifacts": [
        "evidence/city-mobile.png",
        "evidence/article-mobile.png",
        "evidence/consent-mobile-probe.json"
      ]
    },
    {
      "principleId": "support-core-task-success",
      "checkId": "clear-system-state-and-recovery",
      "confidence": "high",
      "method": "Evidence selected from the catalog 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": "Radar displays a plain-language loading state; search returns named results; the real 404 names the error and links to news, home, and search.",
      "pathIds": [
        "home",
        "city",
        "radar",
        "search",
        "error"
      ],
      "status": "pass"
    },
    {
      "principleId": "be-fast-and-stable",
      "checkId": "good-core-web-vitals",
      "confidence": "high",
      "method": "Evidence selected from the catalog 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, trace summary, layout observers, HAR summary, and image evidence were combined.",
      "pathIds": [
        "home"
      ],
      "status": "issues",
      "findingIds": [
        "F005"
      ],
      "artifacts": [
        "evidence/lighthouse-home-summary.json",
        "evidence/home-trace-summary.json",
        "evidence/home-trace.json"
      ]
    },
    {
      "principleId": "be-fast-and-stable",
      "checkId": "visual-stability",
      "confidence": "high",
      "method": "Evidence selected from the catalog hint: the layout primitive's CLS observer captures shifts; a transition video of the first seconds shows content jumping. The model chooses.",
      "evidence": "Layout observers measured CLS 0 on home/listing/radar/search, 0.00002 on city, and 0.025 on article, all below the 0.1 good threshold.",
      "pathIds": [
        "home"
      ],
      "status": "pass"
    },
    {
      "principleId": "be-fast-and-stable",
      "checkId": "efficient-main-thread",
      "confidence": "high",
      "method": "Evidence selected from the catalog hint: the layout primitive records long tasks; a heap summary shows the object population; Lighthouse reports TBT. The model chooses.",
      "evidence": "Trace and layout observers found zero long tasks and Lighthouse TBT was 49.7ms.",
      "pathIds": [
        "home"
      ],
      "status": "pass"
    },
    {
      "principleId": "be-fast-and-stable",
      "checkId": "efficient-resource-delivery",
      "confidence": "high",
      "method": "Evidence selected from the catalog 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": "Lighthouse, trace summary, layout observers, HAR summary, and image evidence were combined.",
      "pathIds": [
        "home"
      ],
      "status": "issues",
      "findingIds": [
        "F006"
      ],
      "artifacts": [
        "evidence/home-summary.json",
        "evidence/lighthouse-home-summary.json",
        "evidence/lighthouse-home.json"
      ]
    },
    {
      "principleId": "be-fast-and-stable",
      "checkId": "trim-unused-and-duplicate-code",
      "confidence": "high",
      "method": "Evidence selected from the catalog 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, trace summary, layout observers, HAR summary, and image evidence were combined.",
      "pathIds": [
        "home"
      ],
      "status": "issues",
      "findingIds": [
        "F006"
      ],
      "artifacts": [
        "evidence/home-summary.json",
        "evidence/lighthouse-home-summary.json",
        "evidence/lighthouse-home.json"
      ]
    },
    {
      "principleId": "be-inclusive",
      "checkId": "names-roles-labels",
      "confidence": "high",
      "method": "Evidence selected from the catalog 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, Lighthouse accessibility, semantics, focus/control geometry, and screenshots were combined.",
      "pathIds": [
        "home"
      ],
      "status": "issues",
      "findingIds": [
        "F009"
      ],
      "artifacts": [
        "evidence/axe-home.json",
        "evidence/lighthouse-detail-summary.json",
        "evidence/semantics.json"
      ]
    },
    {
      "principleId": "be-inclusive",
      "checkId": "sufficient-contrast",
      "confidence": "high",
      "method": "Evidence selected from the catalog hint: axe contrast rules, a Lighthouse contrast audit, or an in-page probe computing contrast ratios from computed colours. The model chooses.",
      "evidence": "axe-core, Lighthouse accessibility, semantics, focus/control geometry, and screenshots were combined.",
      "pathIds": [
        "home"
      ],
      "status": "issues",
      "findingIds": [
        "F008"
      ],
      "artifacts": [
        "evidence/axe-home.json",
        "evidence/lighthouse-home-summary.json",
        "evidence/home-high-contrast.png"
      ]
    },
    {
      "principleId": "be-inclusive",
      "checkId": "structure-and-focus",
      "confidence": "high",
      "method": "Evidence selected from the catalog 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-core, Lighthouse accessibility, semantics, focus/control geometry, and screenshots were combined.",
      "pathIds": [
        "home"
      ],
      "status": "issues",
      "findingIds": [
        "F009"
      ],
      "artifacts": [
        "evidence/axe-home.json",
        "evidence/lighthouse-detail-summary.json",
        "evidence/semantics.json"
      ]
    },
    {
      "principleId": "be-inclusive",
      "checkId": "legible-text",
      "confidence": "high",
      "method": "Evidence selected from the catalog hint: a screenshot of body and heading text, plus CSS inspection for text-wrap / text alignment / font fallback handling. The model chooses.",
      "evidence": "axe-core, Lighthouse accessibility, semantics, focus/control geometry, and screenshots were combined.",
      "pathIds": [
        "home"
      ],
      "status": "issues",
      "findingIds": [
        "F008"
      ],
      "artifacts": [
        "evidence/axe-home.json",
        "evidence/lighthouse-home-summary.json",
        "evidence/home-high-contrast.png"
      ]
    },
    {
      "principleId": "be-inclusive",
      "checkId": "zoom-reflow-targets-and-media",
      "confidence": "high",
      "method": "Evidence selected from the catalog 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": "axe-core, Lighthouse accessibility, semantics, focus/control geometry, and screenshots were combined.",
      "pathIds": [
        "home"
      ],
      "status": "issues",
      "findingIds": [
        "F007"
      ],
      "artifacts": [
        "evidence/recon.json",
        "evidence/axe-home.json",
        "evidence/lighthouse-home-summary.json"
      ]
    },
    {
      "principleId": "follow-best-practices",
      "checkId": "no-console-errors",
      "confidence": "high",
      "method": "Evidence selected from the catalog hint: capture Runtime/Log CDP events, or a probe that reads collected errors; Lighthouse reports this too. The model chooses.",
      "evidence": "Lighthouse diagnostics plus doctype/charset/image and DOM probes were reviewed.",
      "pathIds": [
        "home"
      ],
      "status": "issues",
      "findingIds": [
        "F011"
      ],
      "artifacts": [
        "evidence/lighthouse-detail-summary.json"
      ]
    },
    {
      "principleId": "follow-best-practices",
      "checkId": "sound-document-and-assets",
      "confidence": "high",
      "method": "Evidence selected from the catalog 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": "Lighthouse diagnostics plus doctype/charset/image and DOM probes were reviewed.",
      "pathIds": [
        "home"
      ],
      "status": "issues",
      "findingIds": [
        "F012"
      ],
      "artifacts": [
        "evidence/home-images.json"
      ]
    },
    {
      "principleId": "follow-best-practices",
      "checkId": "browser-platform-hygiene",
      "confidence": "high",
      "method": "Evidence selected from the catalog 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 diagnostics plus doctype/charset/image and DOM probes were reviewed.",
      "pathIds": [
        "home"
      ],
      "status": "pass"
    },
    {
      "principleId": "be-discoverable",
      "checkId": "title-and-description",
      "confidence": "high",
      "method": "Evidence selected from the catalog hint: a DOM probe reads <title> and meta[name=description]; Lighthouse SEO audits cover the same ground. The model chooses.",
      "evidence": "All six representative pages retained title, H1, and meta description in raw HTML.",
      "pathIds": [
        "home",
        "listing",
        "city",
        "radar",
        "article",
        "search"
      ],
      "status": "pass"
    },
    {
      "principleId": "be-discoverable",
      "checkId": "crawlable-and-mobile-friendly",
      "confidence": "high",
      "method": "Evidence selected from the catalog hint: a DOM probe for anchor hrefs, viewport meta, and robots; Lighthouse SEO audits corroborate. The model chooses.",
      "evidence": "Discoverability coverage was 53–81%, no page was a JS shell, anchors have hrefs, and a viewport meta is present (zoom restriction is reported under inclusivity).",
      "pathIds": [
        "home",
        "listing",
        "city",
        "radar",
        "article",
        "search"
      ],
      "status": "pass"
    },
    {
      "principleId": "be-discoverable",
      "checkId": "canonical-and-indexing-signals",
      "confidence": "high",
      "method": "Evidence selected from the catalog 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": "Homepage returned 200 with canonical, INDEX/FOLLOW robots meta, hreflang, robots.txt, and a populated sitemap; the error test returned HTTP/2 404.",
      "pathIds": [
        "home",
        "listing",
        "city",
        "radar",
        "article",
        "search"
      ],
      "status": "pass"
    },
    {
      "principleId": "be-discoverable",
      "checkId": "structured-and-shareable-metadata",
      "confidence": "high",
      "method": "Evidence selected from the catalog 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": "The page exposes ItemList, VideoObject, WebSite SearchAction, Organization JSON-LD plus complete Open Graph fields.",
      "pathIds": [
        "home",
        "listing",
        "city",
        "radar",
        "article",
        "search"
      ],
      "status": "pass"
    },
    {
      "principleId": "be-private-and-secure",
      "checkId": "secure-transport-and-headers",
      "confidence": "high",
      "method": "Evidence selected from the catalog 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 headers, cookies, secrets scan, tracker inventory, and HAR third-party summary were reviewed.",
      "pathIds": [
        "home"
      ],
      "status": "issues",
      "findingIds": [
        "F013"
      ],
      "artifacts": [
        "evidence/headers.json",
        "evidence/cookies.json"
      ]
    },
    {
      "principleId": "be-private-and-secure",
      "checkId": "data-minimisation-and-third-parties",
      "confidence": "high",
      "method": "Evidence selected from the catalog hint: inspect network requests and third-party origins; a probe of analytics/beacon calls. The model chooses.",
      "evidence": "Tracker inventory found no known tracker domains before consent; third parties were chiefly first-party asset subdomains and Usercentrics CMP endpoints.",
      "pathIds": [
        "home"
      ],
      "status": "pass"
    },
    {
      "principleId": "be-private-and-secure",
      "checkId": "in-context-permissions-and-modern-auth",
      "confidence": "high",
      "method": "Evidence selected from the catalog hint: a probe for permission requests fired on load; source inspection for passkey / WebAuthn / navigator.credentials usage in auth flows. The model chooses.",
      "evidence": "No permission request or authentication flow exists on the representative public, read-only paths, so passkey/auth judgement is not applicable.",
      "status": "not-applicable",
      "reason": "No permission request or authentication flow exists on the representative public, read-only paths, so passkey/auth judgement is not applicable."
    },
    {
      "principleId": "be-private-and-secure",
      "checkId": "defensive-browser-policies",
      "confidence": "high",
      "method": "Evidence selected from the catalog 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": "HTTPS headers, cookies, secrets scan, tracker inventory, and HAR third-party summary were reviewed.",
      "pathIds": [
        "home"
      ],
      "status": "issues",
      "findingIds": [
        "F013"
      ],
      "artifacts": [
        "evidence/headers.json",
        "evidence/cookies.json"
      ]
    },
    {
      "principleId": "be-resilient",
      "checkId": "progressive-enhancement",
      "confidence": "high",
      "method": "Evidence selected from the catalog 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 server HTML preserved 53–81% of rendered words and title/H1/description across all six templates; none was an empty JS shell.",
      "pathIds": [
        "home",
        "radar",
        "search",
        "error"
      ],
      "status": "pass"
    },
    {
      "principleId": "be-resilient",
      "checkId": "resilient-runtime-behaviour",
      "confidence": "high",
      "method": "Evidence selected from the catalog hint: exercise menus near viewport edges with a screenshot; a probe of async/visibility behaviour. The model chooses.",
      "evidence": "No-JS crawler views, manifest/service-worker probe, loading surface, search result, and real HTTP 404 recovery were reviewed.",
      "pathIds": [
        "home",
        "radar",
        "search",
        "error"
      ],
      "status": "pass"
    },
    {
      "principleId": "be-resilient",
      "checkId": "offline-and-installable",
      "confidence": "high",
      "method": "Evidence selected from the catalog hint: a probe for a service worker registration and a web app manifest; test behaviour offline. The model chooses.",
      "evidence": "The audited surface is a public MPA content/weather service and no offline intent is declared; the manifest supports home-screen presentation, but offline operation is not treated as a required core outcome.",
      "status": "not-applicable",
      "reason": "The audited surface is a public MPA content/weather service and no offline intent is declared; the manifest supports home-screen presentation, but offline operation is not treated as a required core outcome."
    },
    {
      "principleId": "be-resilient",
      "checkId": "network-and-http-failure-states",
      "confidence": "high",
      "method": "Evidence selected from the catalog 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": "A real HTTP/2 404 renders a clear German explanation with routes back to current news, homepage, and search.",
      "pathIds": [
        "home",
        "radar",
        "search",
        "error"
      ],
      "status": "pass"
    },
    {
      "principleId": "be-internationalised",
      "checkId": "lang-dir-and-logical-properties",
      "confidence": "medium",
      "method": "Evidence selected from the catalog hint: a DOM probe for <html lang>/dir and CSS inspection for logical vs physical properties. The model chooses.",
      "evidence": "html lang is de-DE and alternate locales are declared via hreflang; no RTL locale is offered on this German page.",
      "pathIds": [
        "home",
        "city"
      ],
      "status": "pass"
    },
    {
      "principleId": "be-internationalised",
      "checkId": "locale-aware-data",
      "confidence": "medium",
      "method": "Evidence selected from the catalog hint: source inspection for Intl.* usage vs hand-rolled formatting; a probe of rendered dates/numbers under a different locale. The model chooses.",
      "evidence": "Berlin renders German dates (Do 23.07.2026), decimal commas, narrow no-break spacing, °C, l/m², km/h, and hPa.",
      "pathIds": [
        "home",
        "city"
      ],
      "status": "pass"
    },
    {
      "principleId": "be-internationalised",
      "checkId": "time-zone-correctness",
      "confidence": "medium",
      "method": "Evidence selected from the catalog hint: source inspection for time-zone-aware date handling vs naive local Date math. The model chooses.",
      "evidence": "Location-specific sunrise/sunset and hourly forecast times are rendered for Berlin alongside the place forecast; no contradictory client-local conversion was observed.",
      "pathIds": [
        "home",
        "city"
      ],
      "status": "pass"
    },
    {
      "principleId": "be-trustworthy",
      "checkId": "no-dark-patterns",
      "confidence": "high",
      "method": "Evidence selected from the catalog hint: a screenshot of consent/upsell/cancel flows; source inspection for declarative button actions vs misleading controls. The model chooses.",
      "evidence": "Consent choice geometry, search form semantics, and humane 404 recovery were reviewed.",
      "pathIds": [
        "home"
      ],
      "status": "issues",
      "findingIds": [
        "F016"
      ],
      "artifacts": [
        "evidence/city-mobile.png",
        "evidence/consent-mobile-probe.json"
      ]
    },
    {
      "principleId": "be-trustworthy",
      "checkId": "humane-error-handling",
      "confidence": "high",
      "method": "Evidence selected from the catalog 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": "The required search form produces a clear result page; the 404 explains the failure without blame and offers recovery links.",
      "pathIds": [
        "home"
      ],
      "status": "pass"
    },
    {
      "principleId": "be-trustworthy",
      "checkId": "trustworthy-input-assistance",
      "confidence": "high",
      "method": "Evidence selected from the catalog hint: source/DOM inspection for autocomplete attributes on form fields; a probe of autofill affordances. The model chooses.",
      "evidence": "Search inputs use type=search, name=q, required, and explicit accessible labels; autocomplete off is reasonable for live place suggestions.",
      "pathIds": [
        "home"
      ],
      "status": "pass"
    },
    {
      "principleId": "be-trustworthy",
      "checkId": "safe-commercial-and-account-flows",
      "confidence": "high",
      "method": "Evidence selected from the catalog 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 checkout, subscription management, account, or authentication journey was in the representative public scope.",
      "status": "not-applicable",
      "reason": "No checkout, subscription management, account, or authentication journey was in the representative public scope."
    },
    {
      "principleId": "be-sustainable",
      "checkId": "optimised-assets",
      "confidence": "high",
      "method": "Evidence selected from the catalog hint: inspect transferred image bytes vs displayed size; source inspection for modern formats and resolution handling. The model chooses.",
      "evidence": "HAR transfer/third-party totals, image audit, trace, and idle long-task signals were reviewed.",
      "pathIds": [
        "home"
      ],
      "status": "issues",
      "findingIds": [
        "F012"
      ],
      "artifacts": [
        "evidence/home-images.json"
      ]
    },
    {
      "principleId": "be-sustainable",
      "checkId": "no-wasteful-work",
      "confidence": "high",
      "method": "Evidence selected from the catalog hint: a long-task / network probe for background fetches and processing while idle or backgrounded. The model chooses.",
      "evidence": "Trace/layout observers found no long tasks, and the no-consent tracker run found no known analytics tracker activity.",
      "pathIds": [
        "home"
      ],
      "status": "pass"
    },
    {
      "principleId": "be-sustainable",
      "checkId": "third-party-and-media-budget",
      "confidence": "high",
      "method": "Evidence selected from the catalog 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 transfer/third-party totals, image audit, trace, and idle long-task signals were reviewed.",
      "pathIds": [
        "home"
      ],
      "status": "issues",
      "findingIds": [
        "F006",
        "F012"
      ],
      "artifacts": [
        "evidence/home-summary.json",
        "evidence/lighthouse-home-summary.json",
        "evidence/lighthouse-home.json",
        "evidence/home-images.json"
      ]
    },
    {
      "principleId": "be-agent-ready",
      "checkId": "structured-agent-capabilities",
      "confidence": "high",
      "method": "Evidence selected from the catalog hint: source inspection for WebMCP / agentic-tool registration and agent-readable affordances. The model chooses.",
      "evidence": "Raw discoverability, structured metadata, Lighthouse agentic signal, and WebMCP/built-in AI probes were reviewed.",
      "pathIds": [
        "home"
      ],
      "status": "issues",
      "findingIds": [
        "F014"
      ],
      "artifacts": [
        "evidence/platform-features.json",
        "evidence/lighthouse-home-summary.json"
      ]
    },
    {
      "principleId": "be-agent-ready",
      "checkId": "on-device-inference",
      "confidence": "high",
      "method": "Evidence selected from the catalog hint: source inspection for built-in AI (language model / summariser) usage. The model chooses.",
      "evidence": "The core task is retrieval of authoritative server weather data, not local summarisation or generation; an on-device inference feature has no demonstrated use case.",
      "status": "not-applicable",
      "reason": "The core task is retrieval of authoritative server weather data, not local summarisation or generation; an on-device inference feature has no demonstrated use case."
    },
    {
      "principleId": "be-memory-efficient",
      "checkId": "no-leak-under-repeated-interaction",
      "confidence": "high",
      "method": "Evidence selected from the catalog hint: 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 intera",
      "evidence": "After one warm-up menu cycle, DOM nodes remained exactly 2,558 after 10 and 20 further cycles; heap fell after warm-up and changed only from 9.18MB to 9.59MB between cycles 10 and 20.",
      "pathIds": [
        "home"
      ],
      "status": "pass"
    },
    {
      "principleId": "be-memory-efficient",
      "checkId": "bounded-footprint",
      "confidence": "high",
      "method": "Evidence selected from the catalog 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": "The baseline heap summary was 7.10MB self size and 108,750 snapshot nodes; the warmed same-session series settled near 9–10MB JS heap for this content-heavy page.",
      "pathIds": [
        "home"
      ],
      "status": "pass"
    },
    {
      "principleId": "be-memory-efficient",
      "checkId": "no-detached-dom-or-unbounded-listeners",
      "confidence": "high",
      "method": "Evidence selected from the catalog 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. ",
      "evidence": "The same-session repeated menu test accumulated zero DOM nodes after warm-up, and the sampled live DOM reported no detached nodes.",
      "pathIds": [
        "home"
      ],
      "status": "pass"
    }
  ],
  "principleOutcomes": [
    {
      "principleId": "respect-user-preferences",
      "expectation": "default",
      "status": "issues",
      "findingIds": [
        "F003",
        "F004"
      ]
    },
    {
      "principleId": "implement-natural-interactions",
      "expectation": "default",
      "status": "pass"
    },
    {
      "principleId": "provide-guided-navigation",
      "expectation": "default",
      "status": "issues",
      "findingIds": [
        "F001"
      ]
    },
    {
      "principleId": "maximize-content-reduce-noise",
      "expectation": "default",
      "status": "issues",
      "findingIds": [
        "F001",
        "F015"
      ]
    },
    {
      "principleId": "adapt-to-the-form-factor",
      "expectation": "default",
      "status": "issues",
      "findingIds": [
        "F002",
        "F010"
      ]
    },
    {
      "principleId": "support-core-task-success",
      "expectation": "default",
      "status": "issues",
      "findingIds": [
        "F017"
      ]
    },
    {
      "principleId": "be-fast-and-stable",
      "expectation": "default",
      "status": "issues",
      "findingIds": [
        "F005",
        "F006"
      ]
    },
    {
      "principleId": "be-inclusive",
      "expectation": "default",
      "status": "issues",
      "findingIds": [
        "F009",
        "F008",
        "F007"
      ]
    },
    {
      "principleId": "follow-best-practices",
      "expectation": "default",
      "status": "issues",
      "findingIds": [
        "F011",
        "F012"
      ]
    },
    {
      "principleId": "be-discoverable",
      "expectation": "default",
      "status": "pass"
    },
    {
      "principleId": "be-private-and-secure",
      "expectation": "default",
      "status": "issues",
      "findingIds": [
        "F013"
      ]
    },
    {
      "principleId": "be-resilient",
      "expectation": "contextual",
      "status": "pass"
    },
    {
      "principleId": "be-internationalised",
      "expectation": "contextual",
      "status": "pass"
    },
    {
      "principleId": "be-trustworthy",
      "expectation": "default",
      "status": "issues",
      "findingIds": [
        "F016"
      ]
    },
    {
      "principleId": "be-sustainable",
      "expectation": "contextual",
      "status": "issues",
      "findingIds": [
        "F012",
        "F006"
      ]
    },
    {
      "principleId": "be-agent-ready",
      "expectation": "contextual",
      "status": "issues",
      "findingIds": [
        "F014"
      ]
    },
    {
      "principleId": "be-memory-efficient",
      "expectation": "default",
      "status": "pass"
    }
  ],
  "paths": [
    {
      "id": "home",
      "description": "Homepage and national-weather landing template; inspected primary purpose, navigation, consent, preferences, performance, security, semantics, and network.",
      "url": "https://www.wetter.com/",
      "conditions": [
        "desktop",
        "viewport: 360x800",
        "prefers-color-scheme: dark",
        "prefers-reduced-motion: reduce",
        "prefers-contrast: more",
        "keyboard focus"
      ],
      "result": "issues"
    },
    {
      "id": "listing",
      "description": "Germany forecast listing/index template, representing country and regional listings.",
      "url": "https://www.wetter.com/deutschland/EUDE.html",
      "conditions": [
        "viewport: 360x800",
        "JavaScript disabled crawler view"
      ],
      "result": "pass"
    },
    {
      "id": "city",
      "description": "Berlin location-detail template, representing the core local forecast journey.",
      "url": "https://www.wetter.com/deutschland/berlin/DE0001020.html",
      "conditions": [
        "viewport: 360x800",
        "JavaScript disabled crawler view"
      ],
      "result": "issues"
    },
    {
      "id": "radar",
      "description": "Interactive rain-radar template, representing map/loading and richer interaction surfaces.",
      "url": "https://www.wetter.com/wetterkarten/regenradar/",
      "conditions": [
        "viewport: 360x800",
        "JavaScript disabled crawler view"
      ],
      "result": "pass"
    },
    {
      "id": "article",
      "description": "Current news article template, representing editorial content and share/discovery surfaces.",
      "url": "https://www.wetter.com/news/europa-kaempft-gegen-waldbraende-die-aktuelle-lage-nach-laendern_aid_6a61d9b91a223b69b8008f2b.html",
      "conditions": [
        "viewport: 360x800",
        "JavaScript disabled crawler view"
      ],
      "result": "issues"
    },
    {
      "id": "search",
      "description": "Search results flow for Berlin, representing the primary place-finding form and result state.",
      "url": "https://www.wetter.com/suche/?q=Berlin",
      "conditions": [
        "GET form submission",
        "viewport: 360x800",
        "JavaScript disabled crawler view"
      ],
      "result": "pass"
    },
    {
      "id": "error",
      "description": "Deliberate unknown URL, representing HTTP error messaging and recovery.",
      "url": "https://www.wetter.com/this-page-does-not-exist-audit-404",
      "conditions": [
        "HTTP 404",
        "viewport: 360x800"
      ],
      "result": "pass"
    }
  ],
  "findings": [
    {
      "id": "F001",
      "severity": "critical",
      "confidence": "high",
      "summary": "The consent wall interrupts content before any user request and is not exposed as a semantic modal.",
      "evidence": "Load screenshots and the overlay probe show a fixed 780×493 custom DIV at z-index 900000 on desktop, with no role, aria-modal, label, <dialog>, or popover; city and article captures are entirely covered.",
      "suggestedFix": "Present a compact, accessible consent dialog only when legally required; use <dialog> with showModal(), a clear accessible name, Escape/cancel behavior where allowed, focus containment, and equal access to privacy choices.",
      "principleId": "maximize-content-reduce-noise",
      "principleCheckId": "no-intrusive-interruptions",
      "guidanceId": "declarative-dialog-popover-control",
      "artifacts": [
        "evidence/home-dark.png",
        "evidence/city-mobile.png",
        "evidence/overlays.json"
      ],
      "effort": "medium",
      "pathId": "home",
      "url": "https://www.wetter.com/"
    },
    {
      "id": "F002",
      "severity": "critical",
      "confidence": "high",
      "summary": "The consent UI is wider than a phone viewport and clips both primary choices.",
      "evidence": "At 360px, layout reports scrollWidth 740px. The consent probe places “Akzeptieren und weiter” from x=-130 to 148.5 and the paid choice from x=229.5 to 507, so neither option is fully visible. Home and city layout reports show 380px horizontal overflow whenever this wall appears.",
      "suggestedFix": "Replace the fixed two-column desktop layout with a single-column mobile layout constrained by inline-size: min(100% - 2rem, ...); ensure every action remains fully visible without horizontal scrolling.",
      "principleId": "adapt-to-the-form-factor",
      "principleCheckId": "responsive-no-horizontal-scroll",
      "guidanceId": "fluid-scaling",
      "artifacts": [
        "evidence/city-mobile.png",
        "evidence/consent-mobile-probe.json",
        "evidence/home-mobile-layout.json",
        "evidence/city-layout.json"
      ],
      "effort": "medium",
      "pathId": "home",
      "url": "https://www.wetter.com/"
    },
    {
      "id": "F003",
      "severity": "medium",
      "confidence": "high",
      "summary": "The site does not adapt to the user’s dark color preference.",
      "evidence": "The dark-mode screenshot is visually identical to the light capture; computed color-scheme is “normal”, and stylesheet inspection found no prefers-color-scheme rule.",
      "suggestedFix": "Declare color-scheme and provide dark surface/text tokens using prefers-color-scheme or light-dark(), including the consent experience.",
      "principleId": "respect-user-preferences",
      "principleCheckId": "respects-color-scheme",
      "guidanceId": "dark-mode",
      "artifacts": [
        "evidence/home-dark.png",
        "evidence/preferences-focus.json",
        "evidence/platform-features.json"
      ],
      "effort": "medium",
      "pathId": "home",
      "url": "https://www.wetter.com/"
    },
    {
      "id": "F004",
      "severity": "low",
      "confidence": "high",
      "summary": "Reduced-motion preference leaves smooth scrolling enabled.",
      "evidence": "Under prefers-reduced-motion: reduce, the probe confirms the media query is active but html still computes scroll-behavior: smooth; stylesheet inspection found no reduced-motion branch.",
      "suggestedFix": "Under prefers-reduced-motion: reduce, switch scroll-behavior to auto and suppress nonessential animated media/transitions.",
      "principleId": "respect-user-preferences",
      "principleCheckId": "respects-reduced-motion",
      "guidanceId": "accessibility",
      "artifacts": [
        "evidence/preferences-focus.json",
        "evidence/semantics.json"
      ],
      "effort": "trivial",
      "pathId": "home",
      "url": "https://www.wetter.com/"
    },
    {
      "id": "F005",
      "severity": "high",
      "confidence": "high",
      "summary": "Largest Contentful Paint is slow on the primary landing page.",
      "evidence": "Lighthouse measured LCP 6.9s (performance 0.74); the independent trace measured LCP 4.24s and FCP 2.87s. Both exceed the good LCP threshold.",
      "suggestedFix": "Profile the LCP element, prioritize its request, reduce render-blocking styles/scripts, and avoid making consent/layout work compete with primary content.",
      "principleId": "be-fast-and-stable",
      "principleCheckId": "good-core-web-vitals",
      "guidanceId": "identify-inp-causes",
      "artifacts": [
        "evidence/lighthouse-home-summary.json",
        "evidence/home-trace-summary.json",
        "evidence/home-trace.json"
      ],
      "effort": "medium",
      "pathId": "home",
      "url": "https://www.wetter.com/"
    },
    {
      "id": "F006",
      "severity": "medium",
      "confidence": "high",
      "summary": "Render-blocking and unused/duplicated front-end code delay useful content.",
      "evidence": "HAR identifies six parser-inserted VeryHigh-priority stylesheets plus high-priority scripts; Lighthouse estimates 15KiB unused CSS, 33KiB unused JS, and 20KiB duplicated JS.",
      "suggestedFix": "Inline only critical CSS, consolidate breakpoint styles, defer noncritical code, split by template, and remove duplicate/unused modules.",
      "principleId": "be-fast-and-stable",
      "principleCheckId": "trim-unused-and-duplicate-code",
      "guidanceId": "defer-rendering-heavy-content",
      "artifacts": [
        "evidence/home-summary.json",
        "evidence/lighthouse-home-summary.json",
        "evidence/lighthouse-home.json"
      ],
      "effort": "medium",
      "pathId": "home",
      "url": "https://www.wetter.com/"
    },
    {
      "id": "F007",
      "severity": "critical",
      "confidence": "high",
      "summary": "The viewport configuration disables user zoom.",
      "evidence": "The DOM contains maximum-scale=1.0 and user-scalable=no; axe reports meta-viewport as critical and Lighthouse accessibility is 0.93.",
      "suggestedFix": "Remove maximum-scale and user-scalable restrictions so pinch zoom and text scaling remain available.",
      "principleId": "be-inclusive",
      "principleCheckId": "zoom-reflow-targets-and-media",
      "guidanceId": "accessibility",
      "artifacts": [
        "evidence/recon.json",
        "evidence/axe-home.json",
        "evidence/lighthouse-home-summary.json"
      ],
      "effort": "trivial",
      "pathId": "home",
      "url": "https://www.wetter.com/"
    },
    {
      "id": "F008",
      "severity": "high",
      "confidence": "high",
      "summary": "Several text elements fail minimum color contrast.",
      "evidence": "axe reports four serious color-contrast failures and 31 additional elements requiring review; Lighthouse independently fails the color-contrast audit.",
      "suggestedFix": "Adjust foreground/background design tokens to meet WCAG AA in normal, high-contrast, and consent states; verify with axe and forced-colors/prefers-contrast.",
      "principleId": "be-inclusive",
      "principleCheckId": "sufficient-contrast",
      "guidanceId": "accessibility",
      "artifacts": [
        "evidence/axe-home.json",
        "evidence/lighthouse-home-summary.json",
        "evidence/home-high-contrast.png"
      ],
      "effort": "small",
      "pathId": "home",
      "url": "https://www.wetter.com/"
    },
    {
      "id": "F009",
      "severity": "medium",
      "confidence": "high",
      "summary": "Accessibility semantics and reading order contain repeatable defects.",
      "evidence": "axe reports 37 invalid list items, duplicate/nested banner landmarks, heading-order failure, and uncovered content; Lighthouse also finds accessible-name/visible-label mismatches and positive tabindex.",
      "suggestedFix": "Restore native list semantics, keep one top-level banner, put content in named landmarks, fix heading order, remove positive tabindex, and ensure accessible names contain visible labels.",
      "principleId": "be-inclusive",
      "principleCheckId": "structure-and-focus",
      "guidanceId": "accessibility",
      "artifacts": [
        "evidence/axe-home.json",
        "evidence/lighthouse-detail-summary.json",
        "evidence/semantics.json"
      ],
      "effort": "medium",
      "pathId": "home",
      "url": "https://www.wetter.com/"
    },
    {
      "id": "F010",
      "severity": "medium",
      "confidence": "high",
      "summary": "Some controls are too small or lose a visible focus indicator.",
      "evidence": "The control probe found 20×20 carousel buttons and a 27px-wide search submit control; focused search/menu links computed outline-style none in sampled states.",
      "suggestedFix": "Provide at least 44×44 CSS-pixel hit areas where practical and use :focus-visible with a high-contrast outline that is never removed without replacement.",
      "principleId": "adapt-to-the-form-factor",
      "principleCheckId": "input-modality-aware",
      "guidanceId": "accessibility",
      "artifacts": [
        "evidence/semantics.json",
        "evidence/preferences-focus.json"
      ],
      "effort": "small",
      "pathId": "home",
      "url": "https://www.wetter.com/"
    },
    {
      "id": "F011",
      "severity": "low",
      "confidence": "high",
      "summary": "A JavaScript console error occurs during load.",
      "evidence": "Lighthouse reports “Refused to set unsafe header Accept-Encoding” and fails the errors-in-console audit.",
      "suggestedFix": "Stop client code from setting forbidden request headers and confirm a clean Runtime/console log.",
      "principleId": "follow-best-practices",
      "principleCheckId": "no-console-errors",
      "guidanceId": "html",
      "artifacts": [
        "evidence/lighthouse-detail-summary.json"
      ],
      "effort": "trivial",
      "pathId": "home",
      "url": "https://www.wetter.com/"
    },
    {
      "id": "F012",
      "severity": "medium",
      "confidence": "high",
      "summary": "Image delivery and dimensions waste bandwidth and create avoidable layout risk.",
      "evidence": "The images primitive found 40 images without dimensions, 65 below-fold images not lazy-loaded, 30 oversized images, 43 without srcset, and 10 legacy-format images.",
      "suggestedFix": "Reserve intrinsic dimensions, lazy-load below-fold media, emit responsive srcset/sizes, and prefer AVIF/WebP while preserving appropriate SVG assets.",
      "principleId": "be-sustainable",
      "principleCheckId": "optimised-assets",
      "guidanceId": "optimize-image-priority",
      "artifacts": [
        "evidence/home-images.json"
      ],
      "effort": "medium",
      "pathId": "home",
      "url": "https://www.wetter.com/"
    },
    {
      "id": "F013",
      "severity": "high",
      "confidence": "high",
      "summary": "Defensive browser policy is incomplete and one cookie is insecurely scoped.",
      "evidence": "Headers evidence finds no Content-Security-Policy or Permissions-Policy. Cookie evidence finds deflang without Secure and with SameSite=None despite first-party use.",
      "suggestedFix": "Deploy a nonce/hash-based CSP, a least-privilege Permissions-Policy, and set the language cookie Secure with Lax or Strict SameSite unless cross-site use is demonstrated.",
      "principleId": "be-private-and-secure",
      "principleCheckId": "defensive-browser-policies",
      "guidanceId": "security",
      "artifacts": [
        "evidence/headers.json",
        "evidence/cookies.json"
      ],
      "effort": "medium",
      "pathId": "home",
      "url": "https://www.wetter.com/"
    },
    {
      "id": "F014",
      "severity": "medium",
      "confidence": "high",
      "summary": "The public weather/search experience has no structured agent capability surface.",
      "evidence": "The page is server-rendered and discoverable, but the platform probe found no WebMCP registration; Lighthouse’s agentic-browsing category scored 0.5.",
      "suggestedFix": "Expose narrowly scoped, read-only agent tools for place search, current conditions, forecasts, and warnings, with explicit schemas and user control.",
      "principleId": "be-agent-ready",
      "principleCheckId": "structured-agent-capabilities",
      "guidanceId": "webmcp",
      "artifacts": [
        "evidence/platform-features.json",
        "evidence/lighthouse-home-summary.json"
      ],
      "effort": "large",
      "pathId": "home",
      "url": "https://www.wetter.com/"
    },
    {
      "id": "F015",
      "severity": "medium",
      "confidence": "high",
      "summary": "The landing page buries core weather content in a very long mixed feed.",
      "evidence": "The mobile homepage is 9,045px tall and mixes forecasts, news, promotions, recommendations, webcams, maps, destination lists, and a large footer after the primary map.",
      "suggestedFix": "Prioritize current conditions, forecast, radar, and warnings; collapse secondary discovery modules behind clear section links and defer offscreen rendering.",
      "principleId": "maximize-content-reduce-noise",
      "principleCheckId": "reduced-chrome",
      "guidanceId": "defer-rendering-heavy-content",
      "artifacts": [
        "evidence/home-mobile.png",
        "evidence/home-mobile-layout.json"
      ],
      "effort": "medium",
      "pathId": "home",
      "url": "https://www.wetter.com/"
    },
    {
      "id": "F016",
      "severity": "high",
      "confidence": "high",
      "summary": "The consent choice architecture is visually coercive and hard to compare on mobile.",
      "evidence": "The mobile probe shows “accept and continue” clipped on the left and the paid alternative clipped on the right, while privacy settings are secondary text links; users cannot view equal choices together.",
      "suggestedFix": "Present equally legible accept, reject/customize, and paid options in one responsive view with neutral hierarchy and concise consequences.",
      "principleId": "be-trustworthy",
      "principleCheckId": "no-dark-patterns",
      "guidanceId": "privacy",
      "artifacts": [
        "evidence/city-mobile.png",
        "evidence/consent-mobile-probe.json"
      ],
      "effort": "medium",
      "pathId": "home",
      "url": "https://www.wetter.com/"
    },
    {
      "id": "F017",
      "severity": "high",
      "confidence": "high",
      "summary": "The core local-forecast and article journeys can be blocked by an unusable consent step.",
      "evidence": "Fresh mobile captures of both the Berlin detail and article templates show only the clipped consent wall rather than the requested forecast/article.",
      "suggestedFix": "Make the consent step responsive and keyboard/screen-reader operable, preserve the requested destination, and return focus to the original task after the choice.",
      "principleId": "support-core-task-success",
      "principleCheckId": "primary-flow-completion",
      "guidanceId": "privacy",
      "artifacts": [
        "evidence/city-mobile.png",
        "evidence/article-mobile.png",
        "evidence/consent-mobile-probe.json"
      ],
      "effort": "medium",
      "pathId": "home",
      "url": "https://www.wetter.com/"
    }
  ],
  "taskList": [
    {
      "id": "T001",
      "title": "Rebuild the consent experience as an accessible, responsive, neutral dialog",
      "priority": 1,
      "findingIds": [
        "F001",
        "F002",
        "F016",
        "F017"
      ],
      "guidanceId": "declarative-dialog-popover-control",
      "status": "open"
    },
    {
      "id": "T002",
      "title": "Restore zoom, semantic structure, contrast, focus, and target sizing",
      "priority": 2,
      "findingIds": [
        "F007",
        "F008",
        "F009",
        "F010"
      ],
      "guidanceId": "accessibility",
      "status": "open"
    },
    {
      "id": "T003",
      "title": "Reduce LCP and remove render-blocking, unused, and duplicate code",
      "priority": 3,
      "findingIds": [
        "F005",
        "F006"
      ],
      "guidanceId": "defer-rendering-heavy-content",
      "status": "open"
    },
    {
      "id": "T004",
      "title": "Deploy CSP/Permissions-Policy and secure the language cookie",
      "priority": 4,
      "findingIds": [
        "F013"
      ],
      "guidanceId": "security",
      "status": "open"
    },
    {
      "id": "T005",
      "title": "Add responsive image sizing, intrinsic dimensions, lazy loading, and modern formats",
      "priority": 5,
      "findingIds": [
        "F012"
      ],
      "guidanceId": "optimize-image-priority",
      "status": "open"
    },
    {
      "id": "T006",
      "title": "Add dark and reduced-motion preference styles",
      "priority": 6,
      "findingIds": [
        "F003",
        "F004"
      ],
      "guidanceId": "dark-mode",
      "status": "open"
    },
    {
      "id": "T007",
      "title": "Refocus the homepage on forecast, radar, and warnings",
      "priority": 7,
      "findingIds": [
        "F015"
      ],
      "guidanceId": "defer-rendering-heavy-content",
      "status": "open"
    },
    {
      "id": "T008",
      "title": "Expose safe read-only weather and warning capabilities to agents",
      "priority": 8,
      "findingIds": [
        "F014"
      ],
      "guidanceId": "webmcp",
      "status": "open"
    },
    {
      "id": "T009",
      "title": "Remove the forbidden-header console error",
      "priority": 9,
      "findingIds": [
        "F011"
      ],
      "guidanceId": "html",
      "status": "open"
    }
  ],
  "budget": {
    "pathCount": 7,
    "auditPasses": 1
  },
  "agent": "pi",
  "runId": "2026-07-23T16-17-20-790Z"
}
