{
  "url": "https://sinoptik.ua",
  "auditedAt": "2026-07-22T13:03:56.619Z",
  "mode": "report",
  "status": "completed",
  "statusDetail": "Coverage-complete report-mode audit of representative public forecast, long-range, feedback, legal, and error templates.",
  "page": {
    "appType": "hybrid",
    "framework": "Client-rendered bundles over substantial server HTML",
    "notes": "Public Ukrainian weather service with desktop-first forecast layout, PWA registration, advertising and Google Funding Choices consent."
  },
  "evidenceUsed": [
    "screenshot",
    "dom",
    "layout-metrics",
    "evaluate-probe",
    "trace",
    "har",
    "discoverability",
    "headers",
    "cookies",
    "trackers",
    "secrets",
    "images",
    "heap-summary",
    "lighthouse",
    "robots/manifest/service-worker fetch",
    "modern-web-guidance"
  ],
  "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-probe.json",
      "caption": "404 probe",
      "findingIds": []
    },
    {
      "type": "screenshot",
      "path": "evidence/404.png",
      "caption": "404",
      "findingIds": []
    },
    {
      "type": "screenshot",
      "path": "evidence/agreement.png",
      "caption": "agreement",
      "findingIds": [
        "F04"
      ]
    },
    {
      "type": "other",
      "path": "evidence/cookies-kyiv.json",
      "caption": "cookies kyiv",
      "findingIds": []
    },
    {
      "type": "screenshot",
      "path": "evidence/discoverability-kyiv-crawler.png",
      "caption": "discoverability kyiv crawler",
      "findingIds": []
    },
    {
      "type": "screenshot",
      "path": "evidence/discoverability-kyiv-rendered.png",
      "caption": "discoverability kyiv rendered",
      "findingIds": []
    },
    {
      "type": "discoverability",
      "path": "evidence/discoverability-kyiv.json",
      "caption": "discoverability kyiv",
      "findingIds": []
    },
    {
      "type": "dom",
      "path": "evidence/feedback-dom.json",
      "caption": "feedback dom",
      "findingIds": [
        "F31"
      ]
    },
    {
      "type": "other",
      "path": "evidence/feedback-probe.json",
      "caption": "feedback probe",
      "findingIds": [
        "F32"
      ]
    },
    {
      "type": "screenshot",
      "path": "evidence/feedback.png",
      "caption": "feedback",
      "findingIds": []
    },
    {
      "type": "other",
      "path": "evidence/guidance-consulted-ids.json",
      "caption": "guidance consulted ids",
      "findingIds": []
    },
    {
      "type": "other",
      "path": "evidence/guidance-list.json",
      "caption": "guidance list",
      "findingIds": []
    },
    {
      "type": "other",
      "path": "evidence/headers-kyiv.json",
      "caption": "headers kyiv",
      "findingIds": [
        "F25",
        "F27"
      ]
    },
    {
      "type": "heap",
      "path": "evidence/heap-baseline.json",
      "caption": "heap baseline",
      "findingIds": [
        "F36"
      ]
    },
    {
      "type": "heap",
      "path": "evidence/heap-post-interaction.json",
      "caption": "heap post interaction",
      "findingIds": []
    },
    {
      "type": "heap",
      "path": "evidence/heap-post.json",
      "caption": "heap post",
      "findingIds": []
    },
    {
      "type": "screenshot",
      "path": "evidence/home-consented.png",
      "caption": "home consented",
      "findingIds": []
    },
    {
      "type": "screenshot",
      "path": "evidence/home-desktop.png",
      "caption": "home desktop",
      "findingIds": [
        "F06",
        "F08",
        "F12",
        "F30"
      ]
    },
    {
      "type": "dom",
      "path": "evidence/home-dom.json",
      "caption": "home dom",
      "findingIds": [
        "F03"
      ]
    },
    {
      "type": "layout",
      "path": "evidence/home-mobile-layout.json",
      "caption": "home mobile layout",
      "findingIds": [
        "F09",
        "F22"
      ]
    },
    {
      "type": "screenshot",
      "path": "evidence/home-mobile.png",
      "caption": "home mobile",
      "findingIds": [
        "F28"
      ]
    },
    {
      "type": "other",
      "path": "evidence/images-kyiv.json",
      "caption": "images kyiv",
      "findingIds": [
        "F23",
        "F33"
      ]
    },
    {
      "type": "dom",
      "path": "evidence/kyiv-10day-dom.json",
      "caption": "kyiv 10day dom",
      "findingIds": []
    },
    {
      "type": "layout",
      "path": "evidence/kyiv-10day-mobile-layout.json",
      "caption": "kyiv 10day mobile layout",
      "findingIds": []
    },
    {
      "type": "screenshot",
      "path": "evidence/kyiv-10day.png",
      "caption": "kyiv 10day",
      "findingIds": [
        "F05"
      ]
    },
    {
      "type": "screenshot",
      "path": "evidence/kyiv-consented.png",
      "caption": "kyiv consented",
      "findingIds": []
    },
    {
      "type": "screenshot",
      "path": "evidence/kyiv-content.png",
      "caption": "kyiv content",
      "findingIds": []
    },
    {
      "type": "screenshot",
      "path": "evidence/kyiv-contrast.png",
      "caption": "kyiv contrast",
      "findingIds": [
        "F02"
      ]
    },
    {
      "type": "screenshot",
      "path": "evidence/kyiv-dark.png",
      "caption": "kyiv dark",
      "findingIds": [
        "F01"
      ]
    },
    {
      "type": "layout",
      "path": "evidence/kyiv-layout.json",
      "caption": "kyiv layout",
      "findingIds": [
        "F14"
      ]
    },
    {
      "type": "screenshot",
      "path": "evidence/kyiv-mobile.png",
      "caption": "kyiv mobile",
      "findingIds": [
        "F21"
      ]
    },
    {
      "type": "har-summary",
      "path": "evidence/kyiv-summary.json",
      "caption": "kyiv summary",
      "findingIds": [
        "F16",
        "F34"
      ]
    },
    {
      "type": "trace-summary",
      "path": "evidence/kyiv-trace-summary.json",
      "caption": "kyiv trace summary",
      "findingIds": []
    },
    {
      "type": "trace",
      "path": "evidence/kyiv-trace.json",
      "caption": "kyiv trace",
      "findingIds": []
    },
    {
      "type": "har",
      "path": "evidence/kyiv.har",
      "caption": "kyiv",
      "findingIds": []
    },
    {
      "type": "lighthouse",
      "path": "evidence/lighthouse-kyiv.json",
      "caption": "lighthouse kyiv",
      "findingIds": []
    },
    {
      "type": "lighthouse",
      "path": "evidence/lighthouse-summary.json",
      "caption": "lighthouse summary",
      "findingIds": [
        "F13",
        "F15",
        "F17",
        "F18",
        "F19",
        "F24"
      ]
    },
    {
      "type": "other",
      "path": "evidence/manifest.json",
      "caption": "manifest",
      "findingIds": []
    },
    {
      "type": "other",
      "path": "evidence/meta-i18n-probe.json",
      "caption": "meta i18n probe",
      "findingIds": [
        "F29"
      ]
    },
    {
      "type": "other",
      "path": "evidence/probe-kyiv.json",
      "caption": "probe kyiv",
      "findingIds": [
        "F07",
        "F10",
        "F11",
        "F20"
      ]
    },
    {
      "type": "other",
      "path": "evidence/pwa-probe.json",
      "caption": "pwa probe",
      "findingIds": []
    },
    {
      "type": "other",
      "path": "evidence/reduced-motion-probe.json",
      "caption": "reduced motion probe",
      "findingIds": []
    },
    {
      "type": "other",
      "path": "evidence/robots.txt",
      "caption": "robots",
      "findingIds": []
    },
    {
      "type": "other",
      "path": "evidence/secrets-kyiv.json",
      "caption": "secrets kyiv",
      "findingIds": []
    },
    {
      "type": "other",
      "path": "evidence/serviceworker.js",
      "caption": "serviceworker",
      "findingIds": []
    },
    {
      "type": "other",
      "path": "evidence/sitemap.xml",
      "caption": "sitemap",
      "findingIds": []
    },
    {
      "type": "other",
      "path": "evidence/trackers-kyiv.json",
      "caption": "trackers kyiv",
      "findingIds": [
        "F26",
        "F35"
      ]
    }
  ],
  "config": {
    "loaded": false
  },
  "coverage": {
    "catalogVersion": "modern-web-guidance@0.0.172",
    "catalogChecksum": "sha256:78ccfdb2d483f4c57d9dafed80fd86c6265585a56457c8dcfddc254b80fb44d7",
    "expected": 58,
    "recorded": 58,
    "judged": 58,
    "blocked": 0,
    "notRun": 0,
    "missing": 0,
    "unknown": 0,
    "duplicates": 0,
    "complete": true
  },
  "checkOutcomes": [
    {
      "principleId": "respect-user-preferences",
      "checkId": "respects-color-scheme",
      "status": "issues",
      "confidence": "high",
      "method": "Direct browser evidence and mapped guidance review",
      "evidence": "The dark and default screenshots are byte-identical (91,884 bytes), and the computed root color-scheme is \"normal\".",
      "pathIds": [
        "kyiv-forecast"
      ],
      "artifacts": [
        "evidence/kyiv-dark.png"
      ],
      "findingIds": [
        "F01"
      ]
    },
    {
      "principleId": "respect-user-preferences",
      "checkId": "respects-reduced-motion",
      "status": "pass",
      "confidence": "medium",
      "method": "Representative-path screenshot, DOM, and active browser probe",
      "evidence": "Reduced-motion probe matched reduce=true and returned zero active document animations.",
      "pathIds": [
        "kyiv-forecast"
      ]
    },
    {
      "principleId": "respect-user-preferences",
      "checkId": "respects-contrast",
      "status": "issues",
      "confidence": "high",
      "method": "Direct browser evidence and mapped guidance review",
      "evidence": "The prefers-contrast screenshot is unchanged, while Lighthouse fails color-contrast.",
      "pathIds": [
        "kyiv-forecast"
      ],
      "artifacts": [
        "evidence/kyiv-contrast.png"
      ],
      "findingIds": [
        "F02"
      ]
    },
    {
      "principleId": "implement-natural-interactions",
      "checkId": "view-transitions",
      "status": "issues",
      "confidence": "high",
      "method": "Direct browser evidence and mapped guidance review",
      "evidence": "DOM/CSS inspection found no view-transition declarations for navigation between forecast views.",
      "pathIds": [
        "kyiv-forecast"
      ],
      "artifacts": [
        "evidence/home-dom.json"
      ],
      "findingIds": [
        "F03"
      ]
    },
    {
      "principleId": "implement-natural-interactions",
      "checkId": "scroll-driven-animations",
      "status": "pass",
      "confidence": "medium",
      "method": "Representative-path screenshot, DOM, and active browser probe",
      "evidence": "DOM/CSS inspection and the animation probe found no scroll-linked animation or custom animated scrolling to implement inefficiently.",
      "pathIds": [
        "kyiv-forecast"
      ]
    },
    {
      "principleId": "implement-natural-interactions",
      "checkId": "physical-gestures",
      "status": "pass",
      "confidence": "medium",
      "method": "Representative-path screenshot, DOM, and active browser probe",
      "evidence": "Representative forecast pages use ordinary links and native scrolling; no custom pointer/gesture handler surface was observed.",
      "pathIds": [
        "kyiv-forecast"
      ]
    },
    {
      "principleId": "provide-guided-navigation",
      "checkId": "scroll-state-aware-chrome",
      "status": "issues",
      "confidence": "high",
      "method": "Direct browser evidence and mapped guidance review",
      "evidence": "CSS inspection found no scroll-state container query or progress indicator on long forecast/legal pages.",
      "pathIds": [
        "kyiv-forecast"
      ],
      "artifacts": [
        "evidence/agreement.png"
      ],
      "findingIds": [
        "F04"
      ]
    },
    {
      "principleId": "provide-guided-navigation",
      "checkId": "anchored-positioning",
      "status": "not-applicable",
      "confidence": "high",
      "method": "Representative-path DOM and interaction inspection",
      "evidence": "No anchored tooltip, menu, or popover surface was present on the representative paths.",
      "reason": "No anchored tooltip, menu, or popover surface was present on the representative paths."
    },
    {
      "principleId": "provide-guided-navigation",
      "checkId": "directs-attention",
      "status": "issues",
      "confidence": "high",
      "method": "Direct browser evidence and mapped guidance review",
      "evidence": "Forecast-day and 10-day navigation use ordinary abrupt link swaps with no transition/highlight cue.",
      "pathIds": [
        "kyiv-forecast"
      ],
      "artifacts": [
        "evidence/kyiv-10day.png"
      ],
      "findingIds": [
        "F05"
      ]
    },
    {
      "principleId": "maximize-content-reduce-noise",
      "checkId": "no-intrusive-interruptions",
      "status": "issues",
      "confidence": "high",
      "method": "Direct browser evidence and mapped guidance review",
      "evidence": "Load screenshots show a full modal and dimmed page before any user action; on 360px it is clipped off-screen.",
      "pathIds": [
        "kyiv-forecast"
      ],
      "artifacts": [
        "evidence/home-desktop.png"
      ],
      "findingIds": [
        "F06"
      ]
    },
    {
      "principleId": "maximize-content-reduce-noise",
      "checkId": "semantic-dismissible-primitives",
      "status": "issues",
      "confidence": "high",
      "method": "Direct browser evidence and mapped guidance review",
      "evidence": "DOM probe reports four DIV role=dialog surfaces, no dialog elements, no popovers, and no aria-modal.",
      "pathIds": [
        "kyiv-forecast"
      ],
      "artifacts": [
        "evidence/probe-kyiv.json"
      ],
      "findingIds": [
        "F07"
      ]
    },
    {
      "principleId": "maximize-content-reduce-noise",
      "checkId": "reduced-chrome",
      "status": "issues",
      "confidence": "high",
      "method": "Direct browser evidence and mapped guidance review",
      "evidence": "The first viewport is entirely consent chrome; HAR shows most transferred script bytes come from advertising/analytics.",
      "pathIds": [
        "kyiv-forecast"
      ],
      "artifacts": [
        "evidence/home-desktop.png"
      ],
      "findingIds": [
        "F08"
      ]
    },
    {
      "principleId": "adapt-to-the-form-factor",
      "checkId": "responsive-no-horizontal-scroll",
      "status": "issues",
      "confidence": "high",
      "method": "Direct browser evidence and mapped guidance review",
      "evidence": "At a 360px viewport, layout reports scrollWidth/innerWidth 1010px and 650px overflow; the consent panel is clipped.",
      "pathIds": [
        "kyiv-forecast"
      ],
      "artifacts": [
        "evidence/home-mobile-layout.json"
      ],
      "findingIds": [
        "F09"
      ]
    },
    {
      "principleId": "adapt-to-the-form-factor",
      "checkId": "component-level-responsiveness",
      "status": "issues",
      "confidence": "high",
      "method": "Direct browser evidence and mapped guidance review",
      "evidence": "The computed CSS probe found zero container rules; reused forecast cards retain fixed desktop sizing at 360px.",
      "pathIds": [
        "kyiv-forecast"
      ],
      "artifacts": [
        "evidence/probe-kyiv.json"
      ],
      "findingIds": [
        "F10"
      ]
    },
    {
      "principleId": "adapt-to-the-form-factor",
      "checkId": "input-modality-aware",
      "status": "issues",
      "confidence": "high",
      "method": "Direct browser evidence and mapped guidance review",
      "evidence": "The focus probe reports outline style none for sampled links, inputs, and buttons; many links are only 14px high and buttons 17-28px high.",
      "pathIds": [
        "kyiv-forecast"
      ],
      "artifacts": [
        "evidence/probe-kyiv.json"
      ],
      "findingIds": [
        "F11"
      ]
    },
    {
      "principleId": "support-core-task-success",
      "checkId": "clear-purpose-and-primary-action",
      "status": "pass",
      "confidence": "medium",
      "method": "Representative-path screenshot, DOM, and active browser probe",
      "evidence": "H1 and first forecast content clearly identify the Kyiv forecast and expose week/10-day navigation.",
      "pathIds": [
        "kyiv-forecast"
      ]
    },
    {
      "principleId": "support-core-task-success",
      "checkId": "primary-flow-completion",
      "status": "issues",
      "confidence": "high",
      "method": "Direct browser evidence and mapped guidance review",
      "evidence": "All primary-path screenshots open behind a full consent wall naming 234 partners; the forecast cannot be read until it is handled.",
      "pathIds": [
        "kyiv-forecast"
      ],
      "artifacts": [
        "evidence/home-desktop.png"
      ],
      "findingIds": [
        "F12"
      ]
    },
    {
      "principleId": "support-core-task-success",
      "checkId": "clear-system-state-and-recovery",
      "status": "pass",
      "confidence": "medium",
      "method": "Representative-path screenshot, DOM, and active browser probe",
      "evidence": "The exercised invalid route renders a clear not-found explanation and directs users to the place-search form.",
      "pathIds": [
        "kyiv-forecast"
      ]
    },
    {
      "principleId": "be-fast-and-stable",
      "checkId": "good-core-web-vitals",
      "status": "issues",
      "confidence": "high",
      "method": "Direct browser evidence and mapped guidance review",
      "evidence": "Lighthouse reports LCP 9.5s, TBT 218.5ms, performance 0.70; desktop layout independently observed CLS 0.119.",
      "pathIds": [
        "kyiv-forecast"
      ],
      "artifacts": [
        "evidence/lighthouse-summary.json"
      ],
      "findingIds": [
        "F13"
      ]
    },
    {
      "principleId": "be-fast-and-stable",
      "checkId": "visual-stability",
      "status": "issues",
      "confidence": "high",
      "method": "Direct browser evidence and mapped guidance review",
      "evidence": "The layout primitive recorded CLS 0.1193 on the Kyiv page, including an initial 0.1126 shift; images lack dimensions.",
      "pathIds": [
        "kyiv-forecast"
      ],
      "artifacts": [
        "evidence/kyiv-layout.json"
      ],
      "findingIds": [
        "F14"
      ]
    },
    {
      "principleId": "be-fast-and-stable",
      "checkId": "efficient-main-thread",
      "status": "issues",
      "confidence": "high",
      "method": "Direct browser evidence and mapped guidance review",
      "evidence": "Lighthouse reports 218.5ms TBT and forced-reflow insight failure; 13 scripts are loaded.",
      "pathIds": [
        "kyiv-forecast"
      ],
      "artifacts": [
        "evidence/lighthouse-summary.json"
      ],
      "findingIds": [
        "F15"
      ]
    },
    {
      "principleId": "be-fast-and-stable",
      "checkId": "efficient-resource-delivery",
      "status": "issues",
      "confidence": "high",
      "method": "Direct browser evidence and mapped guidance review",
      "evidence": "HAR captures 87 requests/1.43MB, including 1.03MB script and 175KB fonts; Lighthouse flags render blocking, font display, caching, and dependency-tree insights.",
      "pathIds": [
        "kyiv-forecast"
      ],
      "artifacts": [
        "evidence/kyiv-summary.json"
      ],
      "findingIds": [
        "F16"
      ]
    },
    {
      "principleId": "be-fast-and-stable",
      "checkId": "trim-unused-and-duplicate-code",
      "status": "issues",
      "confidence": "high",
      "method": "Direct browser evidence and mapped guidance review",
      "evidence": "Lighthouse estimates 367KiB unused JavaScript and 24KiB unused CSS; HAR shows duplicate Google tag payloads near 157KB each.",
      "pathIds": [
        "kyiv-forecast"
      ],
      "artifacts": [
        "evidence/lighthouse-summary.json"
      ],
      "findingIds": [
        "F17"
      ]
    },
    {
      "principleId": "be-inclusive",
      "checkId": "names-roles-labels",
      "status": "issues",
      "confidence": "high",
      "method": "Direct browser evidence and mapped guidance review",
      "evidence": "Lighthouse fails button-name, aria-prohibited-attr, aria-required-children, aria-required-parent, and label-content-name-mismatch.",
      "pathIds": [
        "kyiv-forecast"
      ],
      "artifacts": [
        "evidence/lighthouse-summary.json"
      ],
      "findingIds": [
        "F18"
      ]
    },
    {
      "principleId": "be-inclusive",
      "checkId": "sufficient-contrast",
      "status": "issues",
      "confidence": "high",
      "method": "Direct browser evidence and mapped guidance review",
      "evidence": "Lighthouse explicitly fails the color-contrast audit on the representative forecast page.",
      "pathIds": [
        "kyiv-forecast"
      ],
      "artifacts": [
        "evidence/lighthouse-summary.json"
      ],
      "findingIds": [
        "F19"
      ]
    },
    {
      "principleId": "be-inclusive",
      "checkId": "structure-and-focus",
      "status": "issues",
      "confidence": "high",
      "method": "Direct browser evidence and mapped guidance review",
      "evidence": "All sampled interactive elements compute outline:none; the consent DOM injects hundreds of H2s and several H1s into the page hierarchy.",
      "pathIds": [
        "kyiv-forecast"
      ],
      "artifacts": [
        "evidence/probe-kyiv.json"
      ],
      "findingIds": [
        "F20"
      ]
    },
    {
      "principleId": "be-inclusive",
      "checkId": "legible-text",
      "status": "issues",
      "confidence": "high",
      "method": "Direct browser evidence and mapped guidance review",
      "evidence": "At 360px the page lays out at 1010px; the screenshot exposes only a narrow slice and many links compute to 14px high.",
      "pathIds": [
        "kyiv-forecast"
      ],
      "artifacts": [
        "evidence/kyiv-mobile.png"
      ],
      "findingIds": [
        "F21"
      ]
    },
    {
      "principleId": "be-inclusive",
      "checkId": "zoom-reflow-targets-and-media",
      "status": "issues",
      "confidence": "high",
      "method": "Direct browser evidence and mapped guidance review",
      "evidence": "Mobile layout has 650px horizontal overflow, while focus probe shows multiple controls below 24px tall.",
      "pathIds": [
        "kyiv-forecast"
      ],
      "artifacts": [
        "evidence/home-mobile-layout.json"
      ],
      "findingIds": [
        "F22"
      ]
    },
    {
      "principleId": "follow-best-practices",
      "checkId": "no-console-errors",
      "status": "pass",
      "confidence": "medium",
      "method": "Representative-path screenshot, DOM, and active browser probe",
      "evidence": "Lighthouse best-practices scored 1.0 and reported no console-error audit failure during representative load.",
      "pathIds": [
        "kyiv-forecast"
      ]
    },
    {
      "principleId": "follow-best-practices",
      "checkId": "sound-document-and-assets",
      "status": "issues",
      "confidence": "high",
      "method": "Direct browser evidence and mapped guidance review",
      "evidence": "Images primitive finds all three images without width/height attributes; one below-fold image is not lazy and one PNG lacks a responsive source.",
      "pathIds": [
        "kyiv-forecast"
      ],
      "artifacts": [
        "evidence/images-kyiv.json"
      ],
      "findingIds": [
        "F23"
      ]
    },
    {
      "principleId": "follow-best-practices",
      "checkId": "browser-platform-hygiene",
      "status": "issues",
      "confidence": "high",
      "method": "Direct browser evidence and mapped guidance review",
      "evidence": "Lighthouse reports three BFCache failure reasons.",
      "pathIds": [
        "kyiv-forecast"
      ],
      "artifacts": [
        "evidence/lighthouse-summary.json"
      ],
      "findingIds": [
        "F24"
      ]
    },
    {
      "principleId": "be-discoverable",
      "checkId": "title-and-description",
      "status": "pass",
      "confidence": "medium",
      "method": "Representative-path screenshot, DOM, and active browser probe",
      "evidence": "DOM probe reads a unique descriptive Kyiv title and a matching forecast meta description.",
      "pathIds": [
        "kyiv-forecast"
      ]
    },
    {
      "principleId": "be-discoverable",
      "checkId": "crawlable-and-mobile-friendly",
      "status": "pass",
      "confidence": "medium",
      "method": "Representative-path screenshot, DOM, and active browser probe",
      "evidence": "Main forecast navigation uses real href values, viewport meta is present, and robots.txt permits public forecast paths.",
      "pathIds": [
        "kyiv-forecast"
      ]
    },
    {
      "principleId": "be-discoverable",
      "checkId": "canonical-and-indexing-signals",
      "status": "pass",
      "confidence": "medium",
      "method": "Representative-path screenshot, DOM, and active browser probe",
      "evidence": "Kyiv returns 200 and exposes canonical URL plus uk, ru-UA, and x-default hreflang; robots has no accidental noindex.",
      "pathIds": [
        "kyiv-forecast"
      ]
    },
    {
      "principleId": "be-discoverable",
      "checkId": "structured-and-shareable-metadata",
      "status": "pass",
      "confidence": "medium",
      "method": "Representative-path screenshot, DOM, and active browser probe",
      "evidence": "Probe finds matching WebPage/Place JSON-LD and complete Open Graph title, description, URL, and image metadata.",
      "pathIds": [
        "kyiv-forecast"
      ]
    },
    {
      "principleId": "be-private-and-secure",
      "checkId": "secure-transport-and-headers",
      "status": "issues",
      "confidence": "high",
      "method": "Direct browser evidence and mapped guidance review",
      "evidence": "Headers primitive finds no CSP; cookies primitive reports six cookies without Secure and several SameSite=None, long-lived cookies.",
      "pathIds": [
        "kyiv-forecast"
      ],
      "artifacts": [
        "evidence/headers-kyiv.json"
      ],
      "findingIds": [
        "F25"
      ]
    },
    {
      "principleId": "be-private-and-secure",
      "checkId": "data-minimisation-and-third-parties",
      "status": "issues",
      "confidence": "high",
      "method": "Direct browser evidence and mapped guidance review",
      "evidence": "Trackers primitive finds 20 third-party origins and three known trackers; consent names 234 partners and HAR records 38 XHR/fetch requests.",
      "pathIds": [
        "kyiv-forecast"
      ],
      "artifacts": [
        "evidence/trackers-kyiv.json"
      ],
      "findingIds": [
        "F26"
      ]
    },
    {
      "principleId": "be-private-and-secure",
      "checkId": "in-context-permissions-and-modern-auth",
      "status": "pass",
      "confidence": "high",
      "method": "Representative-path DOM and interaction inspection",
      "evidence": "No geolocation/notification permission prompt fired on load and no authentication surface exists on this public forecast service.",
      "pathIds": [
        "kyiv-forecast"
      ]
    },
    {
      "principleId": "be-private-and-secure",
      "checkId": "defensive-browser-policies",
      "status": "issues",
      "confidence": "high",
      "method": "Direct browser evidence and mapped guidance review",
      "evidence": "Headers primitive confirms HSTS, nosniff, and X-Frame-Options, but finds no CSP, Referrer-Policy, or Permissions-Policy.",
      "pathIds": [
        "kyiv-forecast"
      ],
      "artifacts": [
        "evidence/headers-kyiv.json"
      ],
      "findingIds": [
        "F27"
      ]
    },
    {
      "principleId": "be-resilient",
      "checkId": "progressive-enhancement",
      "status": "pass",
      "confidence": "medium",
      "method": "Representative-path screenshot, DOM, and active browser probe",
      "evidence": "Discoverability capture returns 83% raw/rendered content coverage with title, H1 and description in server HTML; not a JS shell.",
      "pathIds": [
        "kyiv-forecast"
      ]
    },
    {
      "principleId": "be-resilient",
      "checkId": "resilient-runtime-behaviour",
      "status": "issues",
      "confidence": "high",
      "method": "Direct browser evidence and mapped guidance review",
      "evidence": "The 360x800 screenshot shows only the right portion of the consent panel and action area because the document remains 1010px wide.",
      "pathIds": [
        "kyiv-forecast"
      ],
      "artifacts": [
        "evidence/home-mobile.png"
      ],
      "findingIds": [
        "F28"
      ]
    },
    {
      "principleId": "be-resilient",
      "checkId": "offline-and-installable",
      "status": "pass",
      "confidence": "medium",
      "method": "Representative-path screenshot, DOM, and active browser probe",
      "evidence": "A manifest is linked and an active service worker is registered; serviceworker.js contains cache/fetch handling and explicit offline behavior.",
      "pathIds": [
        "kyiv-forecast"
      ]
    },
    {
      "principleId": "be-resilient",
      "checkId": "network-and-http-failure-states",
      "status": "pass",
      "confidence": "medium",
      "method": "Representative-path screenshot, DOM, and active browser probe",
      "evidence": "The invalid route produces a useful 404 state with explanation and a recovery path to place search instead of a blank shell.",
      "pathIds": [
        "kyiv-forecast"
      ]
    },
    {
      "principleId": "be-internationalised",
      "checkId": "lang-dir-and-logical-properties",
      "status": "issues",
      "confidence": "high",
      "method": "Direct browser evidence and mapped guidance review",
      "evidence": "The page correctly sets lang=uk and exposes uk/ru-UA hreflang, but CSS inspection counts 121 physical left/right rules and the root has no explicit dir.",
      "pathIds": [
        "kyiv-forecast"
      ],
      "artifacts": [
        "evidence/meta-i18n-probe.json"
      ],
      "findingIds": [
        "F29"
      ]
    },
    {
      "principleId": "be-internationalised",
      "checkId": "locale-aware-data",
      "status": "pass",
      "confidence": "medium",
      "method": "Representative-path screenshot, DOM, and active browser probe",
      "evidence": "Rendered weekday/date/temperature labels are localized in Ukrainian, matching html lang=uk and structured inLanguage uk-UA.",
      "pathIds": [
        "kyiv-forecast"
      ]
    },
    {
      "principleId": "be-internationalised",
      "checkId": "time-zone-correctness",
      "status": "pass",
      "confidence": "medium",
      "method": "Representative-path screenshot, DOM, and active browser probe",
      "evidence": "Structured data carries explicit +03:00 offsets and the forecast labels local hourly conditions for the selected city.",
      "pathIds": [
        "kyiv-forecast"
      ]
    },
    {
      "principleId": "be-trustworthy",
      "checkId": "no-dark-patterns",
      "status": "issues",
      "confidence": "high",
      "method": "Direct browser evidence and mapped guidance review",
      "evidence": "The opening dialog prominently offers Settings and Agree, with no equally visible Reject action, while stating 234 partners may process data.",
      "pathIds": [
        "kyiv-forecast"
      ],
      "artifacts": [
        "evidence/home-desktop.png"
      ],
      "findingIds": [
        "F30"
      ]
    },
    {
      "principleId": "be-trustworthy",
      "checkId": "humane-error-handling",
      "status": "issues",
      "confidence": "high",
      "method": "Direct browser evidence and mapped guidance review",
      "evidence": "Email and message fields are not required in markup and the submit button starts disabled; the initial DOM exposes no error/help association or live status.",
      "pathIds": [
        "kyiv-forecast"
      ],
      "artifacts": [
        "evidence/feedback-dom.json"
      ],
      "findingIds": [
        "F31"
      ]
    },
    {
      "principleId": "be-trustworthy",
      "checkId": "trustworthy-input-assistance",
      "status": "issues",
      "confidence": "high",
      "method": "Direct browser evidence and mapped guidance review",
      "evidence": "Feedback probe finds inputmode=email but an empty autocomplete token on the response email field.",
      "pathIds": [
        "kyiv-forecast"
      ],
      "artifacts": [
        "evidence/feedback-probe.json"
      ],
      "findingIds": [
        "F32"
      ]
    },
    {
      "principleId": "be-trustworthy",
      "checkId": "safe-commercial-and-account-flows",
      "status": "not-applicable",
      "confidence": "high",
      "method": "Representative-path DOM and interaction inspection",
      "evidence": "No checkout, subscription, authentication, or account-management flow exists in the audited public weather and feedback surfaces.",
      "reason": "No checkout, subscription, authentication, or account-management flow exists in the audited public weather and feedback surfaces."
    },
    {
      "principleId": "be-sustainable",
      "checkId": "optimised-assets",
      "status": "issues",
      "confidence": "high",
      "method": "Direct browser evidence and mapped guidance review",
      "evidence": "Images primitive reports three missing intrinsic dimensions, one non-lazy below-fold image, a legacy PNG, and a missing responsive source.",
      "pathIds": [
        "kyiv-forecast"
      ],
      "artifacts": [
        "evidence/images-kyiv.json"
      ],
      "findingIds": [
        "F33"
      ]
    },
    {
      "principleId": "be-sustainable",
      "checkId": "no-wasteful-work",
      "status": "issues",
      "confidence": "high",
      "method": "Direct browser evidence and mapped guidance review",
      "evidence": "HAR records 87 requests including 38 XHR/fetch and 1.03MB scripts; top payloads are ad-tech and duplicate analytics resources.",
      "pathIds": [
        "kyiv-forecast"
      ],
      "artifacts": [
        "evidence/kyiv-summary.json"
      ],
      "findingIds": [
        "F34"
      ]
    },
    {
      "principleId": "be-sustainable",
      "checkId": "third-party-and-media-budget",
      "status": "issues",
      "confidence": "high",
      "method": "Direct browser evidence and mapped guidance review",
      "evidence": "20 of 21 observed origins are third party; large ad/analytics scripts dominate the 1.43MB transfer for a text-and-icon forecast.",
      "pathIds": [
        "kyiv-forecast"
      ],
      "artifacts": [
        "evidence/trackers-kyiv.json"
      ],
      "findingIds": [
        "F35"
      ]
    },
    {
      "principleId": "be-agent-ready",
      "checkId": "structured-agent-capabilities",
      "status": "not-applicable",
      "confidence": "high",
      "method": "Representative-path DOM and interaction inspection",
      "evidence": "The public forecast is already server-rendered and structured with JSON-LD; no transactional agent capability is needed for the selected scope.",
      "reason": "The public forecast is already server-rendered and structured with JSON-LD; no transactional agent capability is needed for the selected scope."
    },
    {
      "principleId": "be-agent-ready",
      "checkId": "on-device-inference",
      "status": "not-applicable",
      "confidence": "high",
      "method": "Representative-path DOM and interaction inspection",
      "evidence": "No summarisation or generative task was identified where on-device inference would improve this deterministic weather forecast.",
      "reason": "No summarisation or generative task was identified where on-device inference would improve this deterministic weather forecast."
    },
    {
      "principleId": "be-memory-efficient",
      "checkId": "no-leak-under-repeated-interaction",
      "status": "pass",
      "confidence": "medium",
      "method": "Representative-path screenshot, DOM, and active browser probe",
      "evidence": "After 10 repeated detail-button toggles, nodes fell 465,530→464,406 and heap changed only +82,163 bytes; no unbounded retained growth signal.",
      "pathIds": [
        "kyiv-forecast"
      ]
    },
    {
      "principleId": "be-memory-efficient",
      "checkId": "bounded-footprint",
      "status": "issues",
      "confidence": "high",
      "method": "Direct browser evidence and mapped guidance review",
      "evidence": "Baseline heap summary contains 465,530 nodes and 26.26MB self size; the consent vendor UI contributes hundreds of headings and 755 links.",
      "pathIds": [
        "kyiv-forecast"
      ],
      "artifacts": [
        "evidence/heap-baseline.json"
      ],
      "findingIds": [
        "F36"
      ]
    },
    {
      "principleId": "be-memory-efficient",
      "checkId": "no-detached-dom-or-unbounded-listeners",
      "status": "pass",
      "confidence": "medium",
      "method": "Representative-path screenshot, DOM, and active browser probe",
      "evidence": "Baseline and post-interaction heap summaries contain no Detached* constructors and node count decreased after repetition.",
      "pathIds": [
        "kyiv-forecast"
      ]
    }
  ],
  "principleOutcomes": [
    {
      "principleId": "respect-user-preferences",
      "expectation": "default",
      "status": "issues",
      "findingIds": [
        "F01",
        "F02"
      ]
    },
    {
      "principleId": "implement-natural-interactions",
      "expectation": "default",
      "status": "issues",
      "findingIds": [
        "F03"
      ]
    },
    {
      "principleId": "provide-guided-navigation",
      "expectation": "default",
      "status": "issues",
      "findingIds": [
        "F04",
        "F05"
      ]
    },
    {
      "principleId": "maximize-content-reduce-noise",
      "expectation": "default",
      "status": "issues",
      "findingIds": [
        "F06",
        "F07",
        "F08"
      ]
    },
    {
      "principleId": "adapt-to-the-form-factor",
      "expectation": "default",
      "status": "issues",
      "findingIds": [
        "F09",
        "F10",
        "F11"
      ]
    },
    {
      "principleId": "support-core-task-success",
      "expectation": "default",
      "status": "issues",
      "findingIds": [
        "F12"
      ]
    },
    {
      "principleId": "be-fast-and-stable",
      "expectation": "default",
      "status": "issues",
      "findingIds": [
        "F13",
        "F14",
        "F15",
        "F16",
        "F17"
      ]
    },
    {
      "principleId": "be-inclusive",
      "expectation": "default",
      "status": "issues",
      "findingIds": [
        "F18",
        "F19",
        "F20",
        "F21",
        "F22"
      ]
    },
    {
      "principleId": "follow-best-practices",
      "expectation": "default",
      "status": "issues",
      "findingIds": [
        "F23",
        "F24"
      ]
    },
    {
      "principleId": "be-discoverable",
      "expectation": "default",
      "status": "pass",
      "findingIds": []
    },
    {
      "principleId": "be-private-and-secure",
      "expectation": "default",
      "status": "issues",
      "findingIds": [
        "F25",
        "F26",
        "F27"
      ]
    },
    {
      "principleId": "be-resilient",
      "expectation": "contextual",
      "status": "issues",
      "findingIds": [
        "F28"
      ]
    },
    {
      "principleId": "be-internationalised",
      "expectation": "contextual",
      "status": "issues",
      "findingIds": [
        "F29"
      ]
    },
    {
      "principleId": "be-trustworthy",
      "expectation": "default",
      "status": "issues",
      "findingIds": [
        "F30",
        "F31",
        "F32"
      ]
    },
    {
      "principleId": "be-sustainable",
      "expectation": "contextual",
      "status": "issues",
      "findingIds": [
        "F33",
        "F34",
        "F35"
      ]
    },
    {
      "principleId": "be-agent-ready",
      "expectation": "contextual",
      "status": "not-applicable",
      "findingIds": [],
      "reason": "Both emerging agent-readiness checks were judged out of scope for this deterministic, server-rendered public forecast."
    },
    {
      "principleId": "be-memory-efficient",
      "expectation": "default",
      "status": "issues",
      "findingIds": [
        "F36"
      ]
    }
  ],
  "paths": [
    {
      "id": "home-entry",
      "description": "Homepage/auto-located forecast entry and initial consent state; represents acquisition and city discovery.",
      "url": "https://sinoptik.ua/",
      "conditions": [
        "desktop",
        "360x800",
        "initial load"
      ],
      "result": "issues"
    },
    {
      "id": "kyiv-forecast",
      "description": "Kyiv seven-day detail, the core forecast template and primary task.",
      "url": "https://sinoptik.ua/pohoda/kyiv",
      "conditions": [
        "desktop",
        "360x800",
        "dark",
        "more contrast",
        "reduced motion",
        "keyboard focus",
        "throttled Lighthouse"
      ],
      "result": "issues"
    },
    {
      "id": "kyiv-10day",
      "description": "Long-range forecast variant and period-navigation destination.",
      "url": "https://sinoptik.ua/pohoda/kyiv/10-dniv",
      "conditions": [
        "desktop",
        "360x800"
      ],
      "result": "issues"
    },
    {
      "id": "feedback-or-consent",
      "description": "Support feedback form, representing the primary authored form plus consent decision.",
      "url": "https://sinoptik.ua/feedback?skin=desktop&lang=uk",
      "conditions": [
        "desktop",
        "DOM/form semantics"
      ],
      "result": "issues"
    },
    {
      "id": "agreement",
      "description": "Long-form legal/content template used to inspect reading chrome and orientation.",
      "url": "https://sinoptik.ua/agreement",
      "conditions": [
        "desktop"
      ],
      "result": "issues"
    },
    {
      "id": "error-and-resilience",
      "description": "Invalid route used to inspect not-found recovery behavior.",
      "url": "https://sinoptik.ua/not-a-real-weather-route",
      "conditions": [
        "desktop"
      ],
      "result": "pass"
    }
  ],
  "findings": [
    {
      "id": "F01",
      "principleId": "respect-user-preferences",
      "principleCheckId": "respects-color-scheme",
      "severity": "medium",
      "confidence": "high",
      "summary": "No user-preference dark theme",
      "evidence": "The dark and default screenshots are byte-identical (91,884 bytes), and the computed root color-scheme is \"normal\".",
      "suggestedFix": "Declare color-scheme and theme surfaces through prefers-color-scheme or light-dark().",
      "guidanceId": "dark-mode",
      "guidanceCategory": "modern-web-guidance",
      "effort": "medium",
      "artifacts": [
        "evidence/kyiv-dark.png"
      ],
      "pathId": "kyiv-forecast",
      "url": "https://sinoptik.ua/pohoda/kyiv"
    },
    {
      "id": "F02",
      "principleId": "respect-user-preferences",
      "principleCheckId": "respects-contrast",
      "severity": "medium",
      "confidence": "high",
      "summary": "Contrast preferences and minimum contrast are not fully supported",
      "evidence": "The prefers-contrast screenshot is unchanged, while Lighthouse fails color-contrast.",
      "suggestedFix": "Use system colors/forced-colors support and ensure WCAG contrast in the normal palette.",
      "guidanceId": "accessibility",
      "guidanceCategory": "modern-web-guidance",
      "effort": "medium",
      "artifacts": [
        "evidence/kyiv-contrast.png"
      ],
      "pathId": "kyiv-forecast",
      "url": "https://sinoptik.ua/pohoda/kyiv"
    },
    {
      "id": "F03",
      "principleId": "implement-natural-interactions",
      "principleCheckId": "view-transitions",
      "severity": "low",
      "confidence": "high",
      "summary": "Route and forecast-state changes are abrupt",
      "evidence": "DOM/CSS inspection found no view-transition declarations for navigation between forecast views.",
      "suggestedFix": "Use same-document or cross-document View Transitions with reduced-motion handling.",
      "guidanceId": "cross-document-transitions",
      "guidanceCategory": "modern-web-guidance",
      "effort": "small",
      "artifacts": [
        "evidence/home-dom.json"
      ],
      "pathId": "kyiv-forecast",
      "url": "https://sinoptik.ua/pohoda/kyiv"
    },
    {
      "id": "F04",
      "principleId": "provide-guided-navigation",
      "principleCheckId": "scroll-state-aware-chrome",
      "severity": "low",
      "confidence": "high",
      "summary": "Navigation chrome does not reflect scroll position",
      "evidence": "CSS inspection found no scroll-state container query or progress indicator on long forecast/legal pages.",
      "suggestedFix": "Add a lightweight scroll-state-aware header or progress affordance where it helps orientation.",
      "guidanceId": "scroll-progress-indicator",
      "guidanceCategory": "modern-web-guidance",
      "effort": "small",
      "artifacts": [
        "evidence/agreement.png"
      ],
      "pathId": "kyiv-forecast",
      "url": "https://sinoptik.ua/pohoda/kyiv"
    },
    {
      "id": "F05",
      "principleId": "provide-guided-navigation",
      "principleCheckId": "directs-attention",
      "severity": "low",
      "confidence": "high",
      "summary": "Navigation changes provide no attention cue",
      "evidence": "Forecast-day and 10-day navigation use ordinary abrupt link swaps with no transition/highlight cue.",
      "suggestedFix": "Preserve and visibly cue the selected forecast period and transition direction.",
      "guidanceId": "directional-navigation-transitions",
      "guidanceCategory": "modern-web-guidance",
      "effort": "small",
      "artifacts": [
        "evidence/kyiv-10day.png"
      ],
      "pathId": "kyiv-forecast",
      "url": "https://sinoptik.ua/pohoda/kyiv"
    },
    {
      "id": "F06",
      "principleId": "maximize-content-reduce-noise",
      "principleCheckId": "no-intrusive-interruptions",
      "severity": "high",
      "confidence": "high",
      "summary": "Consent interstitial obscures the entire primary forecast",
      "evidence": "Load screenshots show a full modal and dimmed page before any user action; on 360px it is clipped off-screen.",
      "suggestedFix": "Use a compact, immediately dismissible consent surface with an equally prominent reject choice.",
      "guidanceId": "light-dismiss-a-dialog",
      "guidanceCategory": "modern-web-guidance",
      "effort": "small",
      "artifacts": [
        "evidence/home-desktop.png"
      ],
      "pathId": "kyiv-forecast",
      "url": "https://sinoptik.ua/pohoda/kyiv"
    },
    {
      "id": "F07",
      "principleId": "maximize-content-reduce-noise",
      "principleCheckId": "semantic-dismissible-primitives",
      "severity": "medium",
      "confidence": "high",
      "summary": "Consent UI is implemented as custom dialog divs",
      "evidence": "DOM probe reports four DIV role=dialog surfaces, no dialog elements, no popovers, and no aria-modal.",
      "suggestedFix": "Use dialog/popover semantics, focus management, Escape handling, and declarative dismissal.",
      "guidanceId": "declarative-dialog-popover-control",
      "guidanceCategory": "modern-web-guidance",
      "effort": "small",
      "artifacts": [
        "evidence/probe-kyiv.json"
      ],
      "pathId": "kyiv-forecast",
      "url": "https://sinoptik.ua/pohoda/kyiv"
    },
    {
      "id": "F08",
      "principleId": "maximize-content-reduce-noise",
      "principleCheckId": "reduced-chrome",
      "severity": "medium",
      "confidence": "high",
      "summary": "Advertising and consent chrome dominate content",
      "evidence": "The first viewport is entirely consent chrome; HAR shows most transferred script bytes come from advertising/analytics.",
      "suggestedFix": "Reduce non-content chrome and defer advertising until after the forecast is usable.",
      "guidanceId": "defer-rendering-heavy-content",
      "guidanceCategory": "modern-web-guidance",
      "effort": "small",
      "artifacts": [
        "evidence/home-desktop.png"
      ],
      "pathId": "kyiv-forecast",
      "url": "https://sinoptik.ua/pohoda/kyiv"
    },
    {
      "id": "F09",
      "principleId": "adapt-to-the-form-factor",
      "principleCheckId": "responsive-no-horizontal-scroll",
      "severity": "critical",
      "confidence": "high",
      "summary": "Forecast pages force a desktop-width canvas on mobile",
      "evidence": "At a 360px viewport, layout reports scrollWidth/innerWidth 1010px and 650px overflow; the consent panel is clipped.",
      "suggestedFix": "Use a device-width layout with intrinsic sizing, wrapping forecast rows, and no fixed 1010px minimum.",
      "guidanceId": "css-layout",
      "guidanceCategory": "modern-web-guidance",
      "effort": "small",
      "artifacts": [
        "evidence/home-mobile-layout.json"
      ],
      "pathId": "kyiv-forecast",
      "url": "https://sinoptik.ua/pohoda/kyiv"
    },
    {
      "id": "F10",
      "principleId": "adapt-to-the-form-factor",
      "principleCheckId": "component-level-responsiveness",
      "severity": "medium",
      "confidence": "high",
      "summary": "Forecast components do not adapt to their containers",
      "evidence": "The computed CSS probe found zero container rules; reused forecast cards retain fixed desktop sizing at 360px.",
      "suggestedFix": "Adopt container queries for forecast grids/cards that appear in different available widths.",
      "guidanceId": "size-aware-styling",
      "guidanceCategory": "modern-web-guidance",
      "effort": "small",
      "artifacts": [
        "evidence/probe-kyiv.json"
      ],
      "pathId": "kyiv-forecast",
      "url": "https://sinoptik.ua/pohoda/kyiv"
    },
    {
      "id": "F11",
      "principleId": "adapt-to-the-form-factor",
      "principleCheckId": "input-modality-aware",
      "severity": "high",
      "confidence": "high",
      "summary": "Keyboard focus is invisible and several targets are too small",
      "evidence": "The focus probe reports outline style none for sampled links, inputs, and buttons; many links are only 14px high and buttons 17-28px high.",
      "suggestedFix": "Provide visible :focus-visible styles and at least 24px, preferably 44px, pointer target areas.",
      "guidanceId": "accessibility",
      "guidanceCategory": "modern-web-guidance",
      "effort": "medium",
      "artifacts": [
        "evidence/probe-kyiv.json"
      ],
      "pathId": "kyiv-forecast",
      "url": "https://sinoptik.ua/pohoda/kyiv"
    },
    {
      "id": "F12",
      "principleId": "support-core-task-success",
      "principleCheckId": "primary-flow-completion",
      "severity": "high",
      "confidence": "high",
      "summary": "Consent wall blocks the core weather task on entry",
      "evidence": "All primary-path screenshots open behind a full consent wall naming 234 partners; the forecast cannot be read until it is handled.",
      "suggestedFix": "Keep core forecast content available while presenting a proportionate consent decision with accept and reject.",
      "guidanceId": "light-dismiss-a-dialog",
      "guidanceCategory": "modern-web-guidance",
      "effort": "small",
      "artifacts": [
        "evidence/home-desktop.png"
      ],
      "pathId": "kyiv-forecast",
      "url": "https://sinoptik.ua/pohoda/kyiv"
    },
    {
      "id": "F13",
      "principleId": "be-fast-and-stable",
      "principleCheckId": "good-core-web-vitals",
      "severity": "high",
      "confidence": "high",
      "summary": "Throttled LCP is far outside the good range",
      "evidence": "Lighthouse reports LCP 9.5s, TBT 218.5ms, performance 0.70; desktop layout independently observed CLS 0.119.",
      "suggestedFix": "Prioritise the LCP forecast content and delay consent/ad/analytics work.",
      "guidanceId": "optimize-image-priority",
      "guidanceCategory": "modern-web-guidance",
      "effort": "small",
      "artifacts": [
        "evidence/lighthouse-summary.json"
      ],
      "pathId": "kyiv-forecast",
      "url": "https://sinoptik.ua/pohoda/kyiv"
    },
    {
      "id": "F14",
      "principleId": "be-fast-and-stable",
      "principleCheckId": "visual-stability",
      "severity": "medium",
      "confidence": "high",
      "summary": "Late content causes visible layout instability",
      "evidence": "The layout primitive recorded CLS 0.1193 on the Kyiv page, including an initial 0.1126 shift; images lack dimensions.",
      "suggestedFix": "Reserve space for images, ads, fonts, and consent content before they load.",
      "guidanceId": "visually-stable-font-fallbacks",
      "guidanceCategory": "modern-web-guidance",
      "effort": "small",
      "artifacts": [
        "evidence/kyiv-layout.json"
      ],
      "pathId": "kyiv-forecast",
      "url": "https://sinoptik.ua/pohoda/kyiv"
    },
    {
      "id": "F15",
      "principleId": "be-fast-and-stable",
      "principleCheckId": "efficient-main-thread",
      "severity": "medium",
      "confidence": "high",
      "summary": "Main-thread work misses the interaction budget under throttling",
      "evidence": "Lighthouse reports 218.5ms TBT and forced-reflow insight failure; 13 scripts are loaded.",
      "suggestedFix": "Split and schedule work, remove forced synchronous layout, and defer nonessential scripts.",
      "guidanceId": "break-up-long-tasks",
      "guidanceCategory": "modern-web-guidance",
      "effort": "small",
      "artifacts": [
        "evidence/lighthouse-summary.json"
      ],
      "pathId": "kyiv-forecast",
      "url": "https://sinoptik.ua/pohoda/kyiv"
    },
    {
      "id": "F16",
      "principleId": "be-fast-and-stable",
      "principleCheckId": "efficient-resource-delivery",
      "severity": "medium",
      "confidence": "high",
      "summary": "Critical delivery is burdened by fonts and third parties",
      "evidence": "HAR captures 87 requests/1.43MB, including 1.03MB script and 175KB fonts; Lighthouse flags render blocking, font display, caching, and dependency-tree insights.",
      "suggestedFix": "Self-host/subset fonts, shorten critical chains, cache well, and defer ad/analytics resources.",
      "guidanceId": "optimize-script-priority",
      "guidanceCategory": "modern-web-guidance",
      "effort": "small",
      "artifacts": [
        "evidence/kyiv-summary.json"
      ],
      "pathId": "kyiv-forecast",
      "url": "https://sinoptik.ua/pohoda/kyiv"
    },
    {
      "id": "F17",
      "principleId": "be-fast-and-stable",
      "principleCheckId": "trim-unused-and-duplicate-code",
      "severity": "medium",
      "confidence": "high",
      "summary": "Large unused JavaScript is shipped",
      "evidence": "Lighthouse estimates 367KiB unused JavaScript and 24KiB unused CSS; HAR shows duplicate Google tag payloads near 157KB each.",
      "suggestedFix": "Remove duplicate tags and conditionally load advertising/analytics and route-specific code.",
      "guidanceId": "identify-heavy-scripts",
      "guidanceCategory": "modern-web-guidance",
      "effort": "small",
      "artifacts": [
        "evidence/lighthouse-summary.json"
      ],
      "pathId": "kyiv-forecast",
      "url": "https://sinoptik.ua/pohoda/kyiv"
    },
    {
      "id": "F18",
      "principleId": "be-inclusive",
      "principleCheckId": "names-roles-labels",
      "severity": "high",
      "confidence": "high",
      "summary": "Interactive ARIA semantics are invalid or unnamed",
      "evidence": "Lighthouse fails button-name, aria-prohibited-attr, aria-required-children, aria-required-parent, and label-content-name-mismatch.",
      "suggestedFix": "Use native elements and correct accessible names/role relationships, then retest the accessibility tree.",
      "guidanceId": "accessibility",
      "guidanceCategory": "modern-web-guidance",
      "effort": "medium",
      "artifacts": [
        "evidence/lighthouse-summary.json"
      ],
      "pathId": "kyiv-forecast",
      "url": "https://sinoptik.ua/pohoda/kyiv"
    },
    {
      "id": "F19",
      "principleId": "be-inclusive",
      "principleCheckId": "sufficient-contrast",
      "severity": "high",
      "confidence": "high",
      "summary": "Text and UI fail minimum contrast",
      "evidence": "Lighthouse explicitly fails the color-contrast audit on the representative forecast page.",
      "suggestedFix": "Adjust foreground/background tokens to meet WCAG AA in all states.",
      "guidanceId": "accessibility",
      "guidanceCategory": "modern-web-guidance",
      "effort": "medium",
      "artifacts": [
        "evidence/lighthouse-summary.json"
      ],
      "pathId": "kyiv-forecast",
      "url": "https://sinoptik.ua/pohoda/kyiv"
    },
    {
      "id": "F20",
      "principleId": "be-inclusive",
      "principleCheckId": "structure-and-focus",
      "severity": "high",
      "confidence": "high",
      "summary": "Focus visibility and heading structure are compromised",
      "evidence": "All sampled interactive elements compute outline:none; the consent DOM injects hundreds of H2s and several H1s into the page hierarchy.",
      "suggestedFix": "Restore visible focus and isolate dialog headings while keeping one logical page H1.",
      "guidanceId": "accessibility",
      "guidanceCategory": "modern-web-guidance",
      "effort": "medium",
      "artifacts": [
        "evidence/probe-kyiv.json"
      ],
      "pathId": "kyiv-forecast",
      "url": "https://sinoptik.ua/pohoda/kyiv"
    },
    {
      "id": "F21",
      "principleId": "be-inclusive",
      "principleCheckId": "legible-text",
      "severity": "medium",
      "confidence": "high",
      "summary": "Mobile forecast text is scaled and clipped instead of reflowed",
      "evidence": "At 360px the page lays out at 1010px; the screenshot exposes only a narrow slice and many links compute to 14px high.",
      "suggestedFix": "Reflow forecast content at narrow widths and preserve comfortable readable text sizing.",
      "guidanceId": "improve-text-layout-and-legibility",
      "guidanceCategory": "modern-web-guidance",
      "effort": "small",
      "artifacts": [
        "evidence/kyiv-mobile.png"
      ],
      "pathId": "kyiv-forecast",
      "url": "https://sinoptik.ua/pohoda/kyiv"
    },
    {
      "id": "F22",
      "principleId": "be-inclusive",
      "principleCheckId": "zoom-reflow-targets-and-media",
      "severity": "high",
      "confidence": "high",
      "summary": "Reflow and target sizing fail on mobile",
      "evidence": "Mobile layout has 650px horizontal overflow, while focus probe shows multiple controls below 24px tall.",
      "suggestedFix": "Support 320/360px reflow and enlarge interactive hit areas without preventing zoom.",
      "guidanceId": "fluid-scaling",
      "guidanceCategory": "modern-web-guidance",
      "effort": "small",
      "artifacts": [
        "evidence/home-mobile-layout.json"
      ],
      "pathId": "kyiv-forecast",
      "url": "https://sinoptik.ua/pohoda/kyiv"
    },
    {
      "id": "F23",
      "principleId": "follow-best-practices",
      "principleCheckId": "sound-document-and-assets",
      "severity": "medium",
      "confidence": "high",
      "summary": "Images omit intrinsic dimensions",
      "evidence": "Images primitive finds all three images without width/height attributes; one below-fold image is not lazy and one PNG lacks a responsive source.",
      "suggestedFix": "Set intrinsic dimensions/aspect-ratio, lazy-load below-fold media, and provide responsive modern sources.",
      "guidanceId": "optimize-image-priority",
      "guidanceCategory": "modern-web-guidance",
      "effort": "small",
      "artifacts": [
        "evidence/images-kyiv.json"
      ],
      "pathId": "kyiv-forecast",
      "url": "https://sinoptik.ua/pohoda/kyiv"
    },
    {
      "id": "F24",
      "principleId": "follow-best-practices",
      "principleCheckId": "browser-platform-hygiene",
      "severity": "medium",
      "confidence": "high",
      "summary": "The page is not eligible for back/forward cache",
      "evidence": "Lighthouse reports three BFCache failure reasons.",
      "suggestedFix": "Remove avoidable unload/runtime blockers and verify restoration in the BFCache diagnostics.",
      "guidanceId": "html",
      "guidanceCategory": "modern-web-guidance",
      "effort": "small",
      "artifacts": [
        "evidence/lighthouse-summary.json"
      ],
      "pathId": "kyiv-forecast",
      "url": "https://sinoptik.ua/pohoda/kyiv"
    },
    {
      "id": "F25",
      "principleId": "be-private-and-secure",
      "principleCheckId": "secure-transport-and-headers",
      "severity": "high",
      "confidence": "high",
      "summary": "CSP is missing and multiple cookies are not Secure",
      "evidence": "Headers primitive finds no CSP; cookies primitive reports six cookies without Secure and several SameSite=None, long-lived cookies.",
      "suggestedFix": "Deploy a restrictive CSP and set Secure/SameSite/expiry according to cookie purpose.",
      "guidanceId": "security",
      "guidanceCategory": "modern-web-guidance",
      "effort": "medium",
      "artifacts": [
        "evidence/headers-kyiv.json"
      ],
      "pathId": "kyiv-forecast",
      "url": "https://sinoptik.ua/pohoda/kyiv"
    },
    {
      "id": "F26",
      "principleId": "be-private-and-secure",
      "principleCheckId": "data-minimisation-and-third-parties",
      "severity": "high",
      "confidence": "high",
      "summary": "Tracking footprint is disproportionate to a weather lookup",
      "evidence": "Trackers primitive finds 20 third-party origins and three known trackers; consent names 234 partners and HAR records 38 XHR/fetch requests.",
      "suggestedFix": "Minimise vendors, gate tracking on consent, and batch only essential analytics.",
      "guidanceId": "privacy",
      "guidanceCategory": "modern-web-guidance",
      "effort": "medium",
      "artifacts": [
        "evidence/trackers-kyiv.json"
      ],
      "pathId": "kyiv-forecast",
      "url": "https://sinoptik.ua/pohoda/kyiv"
    },
    {
      "id": "F27",
      "principleId": "be-private-and-secure",
      "principleCheckId": "defensive-browser-policies",
      "severity": "medium",
      "confidence": "high",
      "summary": "Referrer-Policy and Permissions-Policy are absent",
      "evidence": "Headers primitive confirms HSTS, nosniff, and X-Frame-Options, but finds no CSP, Referrer-Policy, or Permissions-Policy.",
      "suggestedFix": "Add least-privilege Referrer-Policy and Permissions-Policy alongside CSP.",
      "guidanceId": "security",
      "guidanceCategory": "modern-web-guidance",
      "effort": "small",
      "artifacts": [
        "evidence/headers-kyiv.json"
      ],
      "pathId": "kyiv-forecast",
      "url": "https://sinoptik.ua/pohoda/kyiv"
    },
    {
      "id": "F28",
      "principleId": "be-resilient",
      "principleCheckId": "resilient-runtime-behaviour",
      "severity": "high",
      "confidence": "high",
      "summary": "Consent dialog is cut off at narrow viewports",
      "evidence": "The 360x800 screenshot shows only the right portion of the consent panel and action area because the document remains 1010px wide.",
      "suggestedFix": "Make the modal fit the visual viewport with internal scrolling and resilient focus/dismiss behavior.",
      "guidanceId": "resilient-context-menus-and-nested-dropdowns",
      "guidanceCategory": "modern-web-guidance",
      "effort": "small",
      "artifacts": [
        "evidence/home-mobile.png"
      ],
      "pathId": "error-and-resilience",
      "url": "https://sinoptik.ua/pohoda/kyiv"
    },
    {
      "id": "F29",
      "principleId": "be-internationalised",
      "principleCheckId": "lang-dir-and-logical-properties",
      "severity": "medium",
      "confidence": "high",
      "summary": "Layout is not writing-mode resilient",
      "evidence": "The page correctly sets lang=uk and exposes uk/ru-UA hreflang, but CSS inspection counts 121 physical left/right rules and the root has no explicit dir.",
      "suggestedFix": "Set dir and migrate layout-critical spacing/positioning to logical properties.",
      "guidanceId": "translator",
      "guidanceCategory": "modern-web-guidance",
      "effort": "small",
      "artifacts": [
        "evidence/meta-i18n-probe.json"
      ],
      "pathId": "kyiv-forecast",
      "url": "https://sinoptik.ua/pohoda/kyiv"
    },
    {
      "id": "F30",
      "principleId": "be-trustworthy",
      "principleCheckId": "no-dark-patterns",
      "severity": "high",
      "confidence": "high",
      "summary": "Consent choice is asymmetric and vendor-heavy",
      "evidence": "The opening dialog prominently offers Settings and Agree, with no equally visible Reject action, while stating 234 partners may process data.",
      "suggestedFix": "Offer honest defaults and equally prominent accept/reject controls without obstructing the forecast.",
      "guidanceId": "custom-button-actions",
      "guidanceCategory": "modern-web-guidance",
      "effort": "medium",
      "artifacts": [
        "evidence/home-desktop.png"
      ],
      "pathId": "feedback-or-consent",
      "url": "https://sinoptik.ua/pohoda/kyiv"
    },
    {
      "id": "F31",
      "principleId": "be-trustworthy",
      "principleCheckId": "humane-error-handling",
      "severity": "medium",
      "confidence": "high",
      "summary": "Feedback form gives no pre-submit explanation for a disabled action",
      "evidence": "Email and message fields are not required in markup and the submit button starts disabled; the initial DOM exposes no error/help association or live status.",
      "suggestedFix": "Use required/input constraints, validate after interaction, and announce specific errors with aria-describedby/live regions.",
      "guidanceId": "accessible-error-announcement",
      "guidanceCategory": "modern-web-guidance",
      "effort": "small",
      "artifacts": [
        "evidence/feedback-dom.json"
      ],
      "pathId": "feedback-or-consent",
      "url": "https://sinoptik.ua/pohoda/kyiv"
    },
    {
      "id": "F32",
      "principleId": "be-trustworthy",
      "principleCheckId": "trustworthy-input-assistance",
      "severity": "low",
      "confidence": "high",
      "summary": "Email input omits autocomplete",
      "evidence": "Feedback probe finds inputmode=email but an empty autocomplete token on the response email field.",
      "suggestedFix": "Use type=email and autocomplete=email to assist entry and validation.",
      "guidanceId": "autofill-sign-up-form",
      "guidanceCategory": "modern-web-guidance",
      "effort": "small",
      "artifacts": [
        "evidence/feedback-probe.json"
      ],
      "pathId": "feedback-or-consent",
      "url": "https://sinoptik.ua/pohoda/kyiv"
    },
    {
      "id": "F33",
      "principleId": "be-sustainable",
      "principleCheckId": "optimised-assets",
      "severity": "medium",
      "confidence": "high",
      "summary": "Asset delivery misses basic image optimisations",
      "evidence": "Images primitive reports three missing intrinsic dimensions, one non-lazy below-fold image, a legacy PNG, and a missing responsive source.",
      "suggestedFix": "Serve appropriately sized modern images with dimensions, srcset, and lazy loading.",
      "guidanceId": "deliver-optimized-decorative-images",
      "guidanceCategory": "modern-web-guidance",
      "effort": "small",
      "artifacts": [
        "evidence/images-kyiv.json"
      ],
      "pathId": "kyiv-forecast",
      "url": "https://sinoptik.ua/pohoda/kyiv"
    },
    {
      "id": "F34",
      "principleId": "be-sustainable",
      "principleCheckId": "no-wasteful-work",
      "severity": "high",
      "confidence": "high",
      "summary": "Advertising and analytics create substantial background work",
      "evidence": "HAR records 87 requests including 38 XHR/fetch and 1.03MB scripts; top payloads are ad-tech and duplicate analytics resources.",
      "suggestedFix": "Eliminate duplicate analytics, reduce vendors, and defer/batch background work.",
      "guidanceId": "efficient-background-processing",
      "guidanceCategory": "modern-web-guidance",
      "effort": "small",
      "artifacts": [
        "evidence/kyiv-summary.json"
      ],
      "pathId": "kyiv-forecast",
      "url": "https://sinoptik.ua/pohoda/kyiv"
    },
    {
      "id": "F35",
      "principleId": "be-sustainable",
      "principleCheckId": "third-party-and-media-budget",
      "severity": "high",
      "confidence": "high",
      "summary": "Third-party script budget exceeds visible user value",
      "evidence": "20 of 21 observed origins are third party; large ad/analytics scripts dominate the 1.43MB transfer for a text-and-icon forecast.",
      "suggestedFix": "Set a strict third-party budget and load optional advertising only after consent and idle.",
      "guidanceId": "deprioritize-background-fetches",
      "guidanceCategory": "modern-web-guidance",
      "effort": "small",
      "artifacts": [
        "evidence/trackers-kyiv.json"
      ],
      "pathId": "kyiv-forecast",
      "url": "https://sinoptik.ua/pohoda/kyiv"
    },
    {
      "id": "F36",
      "principleId": "be-memory-efficient",
      "principleCheckId": "bounded-footprint",
      "severity": "medium",
      "confidence": "high",
      "summary": "DOM/heap footprint is excessive for a forecast page",
      "evidence": "Baseline heap summary contains 465,530 nodes and 26.26MB self size; the consent vendor UI contributes hundreds of headings and 755 links.",
      "suggestedFix": "Render vendor detail on demand, virtualise long lists, and unload third-party consent/ad structures when closed.",
      "guidanceId": "defer-rendering-heavy-content",
      "guidanceCategory": "modern-web-guidance",
      "effort": "small",
      "artifacts": [
        "evidence/heap-baseline.json"
      ],
      "pathId": "kyiv-forecast",
      "url": "https://sinoptik.ua/pohoda/kyiv"
    }
  ],
  "taskList": [
    {
      "id": "T01",
      "title": "Use a device-width layout with intrinsic sizing, wrapping forecast rows, and no fixed 1010px minimum.",
      "priority": 1,
      "findingIds": [
        "F09"
      ],
      "guidanceId": "css-layout",
      "status": "open"
    },
    {
      "id": "T02",
      "title": "Use a compact, immediately dismissible consent surface with an equally prominent reject choice.",
      "priority": 2,
      "findingIds": [
        "F06"
      ],
      "guidanceId": "light-dismiss-a-dialog",
      "status": "open"
    },
    {
      "id": "T03",
      "title": "Provide visible :focus-visible styles and at least 24px, preferably 44px, pointer target areas.",
      "priority": 3,
      "findingIds": [
        "F11"
      ],
      "guidanceId": "accessibility",
      "status": "open"
    },
    {
      "id": "T04",
      "title": "Keep core forecast content available while presenting a proportionate consent decision with accept and reject.",
      "priority": 4,
      "findingIds": [
        "F12"
      ],
      "guidanceId": "light-dismiss-a-dialog",
      "status": "open"
    },
    {
      "id": "T05",
      "title": "Prioritise the LCP forecast content and delay consent/ad/analytics work.",
      "priority": 5,
      "findingIds": [
        "F13"
      ],
      "guidanceId": "optimize-image-priority",
      "status": "open"
    },
    {
      "id": "T06",
      "title": "Use native elements and correct accessible names/role relationships, then retest the accessibility tree.",
      "priority": 6,
      "findingIds": [
        "F18"
      ],
      "guidanceId": "accessibility",
      "status": "open"
    },
    {
      "id": "T07",
      "title": "Adjust foreground/background tokens to meet WCAG AA in all states.",
      "priority": 7,
      "findingIds": [
        "F19"
      ],
      "guidanceId": "accessibility",
      "status": "open"
    },
    {
      "id": "T08",
      "title": "Restore visible focus and isolate dialog headings while keeping one logical page H1.",
      "priority": 8,
      "findingIds": [
        "F20"
      ],
      "guidanceId": "accessibility",
      "status": "open"
    },
    {
      "id": "T09",
      "title": "Support 320/360px reflow and enlarge interactive hit areas without preventing zoom.",
      "priority": 9,
      "findingIds": [
        "F22"
      ],
      "guidanceId": "fluid-scaling",
      "status": "open"
    },
    {
      "id": "T10",
      "title": "Deploy a restrictive CSP and set Secure/SameSite/expiry according to cookie purpose.",
      "priority": 10,
      "findingIds": [
        "F25"
      ],
      "guidanceId": "security",
      "status": "open"
    },
    {
      "id": "T11",
      "title": "Minimise vendors, gate tracking on consent, and batch only essential analytics.",
      "priority": 11,
      "findingIds": [
        "F26"
      ],
      "guidanceId": "privacy",
      "status": "open"
    },
    {
      "id": "T12",
      "title": "Make the modal fit the visual viewport with internal scrolling and resilient focus/dismiss behavior.",
      "priority": 12,
      "findingIds": [
        "F28"
      ],
      "guidanceId": "resilient-context-menus-and-nested-dropdowns",
      "status": "open"
    },
    {
      "id": "T13",
      "title": "Offer honest defaults and equally prominent accept/reject controls without obstructing the forecast.",
      "priority": 13,
      "findingIds": [
        "F30"
      ],
      "guidanceId": "custom-button-actions",
      "status": "open"
    },
    {
      "id": "T14",
      "title": "Eliminate duplicate analytics, reduce vendors, and defer/batch background work.",
      "priority": 14,
      "findingIds": [
        "F34"
      ],
      "guidanceId": "efficient-background-processing",
      "status": "open"
    },
    {
      "id": "T15",
      "title": "Set a strict third-party budget and load optional advertising only after consent and idle.",
      "priority": 15,
      "findingIds": [
        "F35"
      ],
      "guidanceId": "deprioritize-background-fetches",
      "status": "open"
    },
    {
      "id": "T16",
      "title": "Declare color-scheme and theme surfaces through prefers-color-scheme or light-dark().",
      "priority": 16,
      "findingIds": [
        "F01"
      ],
      "guidanceId": "dark-mode",
      "status": "open"
    },
    {
      "id": "T17",
      "title": "Use system colors/forced-colors support and ensure WCAG contrast in the normal palette.",
      "priority": 17,
      "findingIds": [
        "F02"
      ],
      "guidanceId": "accessibility",
      "status": "open"
    },
    {
      "id": "T18",
      "title": "Use dialog/popover semantics, focus management, Escape handling, and declarative dismissal.",
      "priority": 18,
      "findingIds": [
        "F07"
      ],
      "guidanceId": "declarative-dialog-popover-control",
      "status": "open"
    },
    {
      "id": "T19",
      "title": "Reduce non-content chrome and defer advertising until after the forecast is usable.",
      "priority": 19,
      "findingIds": [
        "F08"
      ],
      "guidanceId": "defer-rendering-heavy-content",
      "status": "open"
    },
    {
      "id": "T20",
      "title": "Adopt container queries for forecast grids/cards that appear in different available widths.",
      "priority": 20,
      "findingIds": [
        "F10"
      ],
      "guidanceId": "size-aware-styling",
      "status": "open"
    },
    {
      "id": "T21",
      "title": "Reserve space for images, ads, fonts, and consent content before they load.",
      "priority": 21,
      "findingIds": [
        "F14"
      ],
      "guidanceId": "visually-stable-font-fallbacks",
      "status": "open"
    },
    {
      "id": "T22",
      "title": "Split and schedule work, remove forced synchronous layout, and defer nonessential scripts.",
      "priority": 22,
      "findingIds": [
        "F15"
      ],
      "guidanceId": "break-up-long-tasks",
      "status": "open"
    },
    {
      "id": "T23",
      "title": "Self-host/subset fonts, shorten critical chains, cache well, and defer ad/analytics resources.",
      "priority": 23,
      "findingIds": [
        "F16"
      ],
      "guidanceId": "optimize-script-priority",
      "status": "open"
    },
    {
      "id": "T24",
      "title": "Remove duplicate tags and conditionally load advertising/analytics and route-specific code.",
      "priority": 24,
      "findingIds": [
        "F17"
      ],
      "guidanceId": "identify-heavy-scripts",
      "status": "open"
    },
    {
      "id": "T25",
      "title": "Reflow forecast content at narrow widths and preserve comfortable readable text sizing.",
      "priority": 25,
      "findingIds": [
        "F21"
      ],
      "guidanceId": "improve-text-layout-and-legibility",
      "status": "open"
    },
    {
      "id": "T26",
      "title": "Set intrinsic dimensions/aspect-ratio, lazy-load below-fold media, and provide responsive modern sources.",
      "priority": 26,
      "findingIds": [
        "F23"
      ],
      "guidanceId": "optimize-image-priority",
      "status": "open"
    },
    {
      "id": "T27",
      "title": "Remove avoidable unload/runtime blockers and verify restoration in the BFCache diagnostics.",
      "priority": 27,
      "findingIds": [
        "F24"
      ],
      "guidanceId": "html",
      "status": "open"
    },
    {
      "id": "T28",
      "title": "Add least-privilege Referrer-Policy and Permissions-Policy alongside CSP.",
      "priority": 28,
      "findingIds": [
        "F27"
      ],
      "guidanceId": "security",
      "status": "open"
    },
    {
      "id": "T29",
      "title": "Set dir and migrate layout-critical spacing/positioning to logical properties.",
      "priority": 29,
      "findingIds": [
        "F29"
      ],
      "guidanceId": "translator",
      "status": "open"
    },
    {
      "id": "T30",
      "title": "Use required/input constraints, validate after interaction, and announce specific errors with aria-describedby/live regions.",
      "priority": 30,
      "findingIds": [
        "F31"
      ],
      "guidanceId": "accessible-error-announcement",
      "status": "open"
    },
    {
      "id": "T31",
      "title": "Serve appropriately sized modern images with dimensions, srcset, and lazy loading.",
      "priority": 31,
      "findingIds": [
        "F33"
      ],
      "guidanceId": "deliver-optimized-decorative-images",
      "status": "open"
    },
    {
      "id": "T32",
      "title": "Render vendor detail on demand, virtualise long lists, and unload third-party consent/ad structures when closed.",
      "priority": 32,
      "findingIds": [
        "F36"
      ],
      "guidanceId": "defer-rendering-heavy-content",
      "status": "open"
    },
    {
      "id": "T33",
      "title": "Use same-document or cross-document View Transitions with reduced-motion handling.",
      "priority": 33,
      "findingIds": [
        "F03"
      ],
      "guidanceId": "cross-document-transitions",
      "status": "open"
    },
    {
      "id": "T34",
      "title": "Add a lightweight scroll-state-aware header or progress affordance where it helps orientation.",
      "priority": 34,
      "findingIds": [
        "F04"
      ],
      "guidanceId": "scroll-progress-indicator",
      "status": "open"
    },
    {
      "id": "T35",
      "title": "Preserve and visibly cue the selected forecast period and transition direction.",
      "priority": 35,
      "findingIds": [
        "F05"
      ],
      "guidanceId": "directional-navigation-transitions",
      "status": "open"
    },
    {
      "id": "T36",
      "title": "Use type=email and autocomplete=email to assist entry and validation.",
      "priority": 36,
      "findingIds": [
        "F32"
      ],
      "guidanceId": "autofill-sign-up-form",
      "status": "open"
    }
  ],
  "budget": {
    "pathCount": 6,
    "auditPasses": 1
  },
  "agent": "pi",
  "runId": "2026-07-22T13-03-56-619Z"
}
