{
  "url": "https://www.sportybet.com",
  "auditedAt": "2026-07-21T19:47:00.140Z",
  "mode": "report",
  "status": "completed",
  "statusDetail": "Coverage-complete remote audit. No source was provided and no state-changing wager, registration, login, or account action was performed.",
  "page": {
    "appType": "hybrid",
    "framework": "Multiple client-rendered bundles and embedded products; framework not conclusively identified",
    "notes": "Public Nigerian sports-betting dashboard with live data, event details, account recovery, help, and embedded games. Coverage excludes authenticated deposit, withdrawal, bet placement, cancellation, and account-management states because they require a real regulated account and financial action."
  },
  "evidenceUsed": [
    "screenshot",
    "dom",
    "evaluate-probe",
    "layout-metrics",
    "trace",
    "har",
    "discoverability",
    "headers",
    "cookies",
    "trackers",
    "images",
    "secrets",
    "heap-summary",
    "lighthouse",
    "robots.txt"
  ],
  "guidanceConsulted": [
    "dark-mode",
    "accessibility",
    "same-document-transitions",
    "shrinking-header-on-scroll",
    "declarative-dialog-popover-control",
    "overflow-clipping-control",
    "fluid-scaling",
    "size-aware-styling",
    "css",
    "accessible-error-announcement",
    "identify-inp-causes",
    "visually-stable-font-fallbacks",
    "break-up-long-tasks",
    "optimize-script-priority",
    "identify-heavy-scripts",
    "move-dom-element-without-losing-state",
    "improve-text-layout-and-legibility",
    "html",
    "security",
    "privacy",
    "flicker-free-client-side-ab-testing",
    "persistent-toast-notifications",
    "custom-button-actions",
    "forms",
    "autofill-sign-in-form",
    "deliver-optimized-decorative-images",
    "deprioritize-background-fetches",
    "efficient-background-processing",
    "webmcp",
    "memory",
    "adapt-scrollbar-to-contrast-preferences",
    "directional-navigation-transitions",
    "light-dismiss-a-dialog",
    "coordinate-global-events",
    "manage-recurring-intervals"
  ],
  "artifacts": [
    {
      "type": "other",
      "path": "evidence/cookies.json",
      "caption": "cookies",
      "findingIds": [
        "F-23"
      ]
    },
    {
      "type": "other",
      "path": "evidence/css-script-probe.json",
      "caption": "css script probe",
      "findingIds": [
        "F-03"
      ]
    },
    {
      "type": "discoverability",
      "path": "evidence/discoverability",
      "caption": "discoverability",
      "findingIds": [
        "F-22",
        "F-26",
        "F-28"
      ]
    },
    {
      "type": "screenshot",
      "path": "evidence/discoverability-crawler.png",
      "caption": "discoverability crawler",
      "findingIds": [
        "F-22",
        "F-26",
        "F-27",
        "F-28",
        "F-35"
      ]
    },
    {
      "type": "screenshot",
      "path": "evidence/discoverability-rendered.png",
      "caption": "discoverability rendered",
      "findingIds": [
        "F-22"
      ]
    },
    {
      "type": "screenshot",
      "path": "evidence/event-detail.png",
      "caption": "event detail",
      "findingIds": [
        "F-03"
      ]
    },
    {
      "type": "other",
      "path": "evidence/headers.json",
      "caption": "headers",
      "findingIds": [
        "F-23",
        "F-25"
      ]
    },
    {
      "type": "heap",
      "path": "evidence/heap-baseline.heapsnapshot",
      "caption": "heap baseline",
      "findingIds": [
        "F-36"
      ]
    },
    {
      "type": "heap",
      "path": "evidence/heap-post.heapsnapshot",
      "caption": "heap post",
      "findingIds": []
    },
    {
      "type": "screenshot",
      "path": "evidence/help.png",
      "caption": "help",
      "findingIds": []
    },
    {
      "type": "screenshot",
      "path": "evidence/home-dark.png",
      "caption": "home dark",
      "condition": "prefers-color-scheme: dark",
      "findingIds": [
        "F-01"
      ]
    },
    {
      "type": "screenshot",
      "path": "evidence/home-desktop.png",
      "caption": "home desktop",
      "findingIds": [
        "F-04",
        "F-06",
        "F-29"
      ]
    },
    {
      "type": "dom",
      "path": "evidence/home-dom.json",
      "caption": "home dom",
      "findingIds": [
        "F-01",
        "F-04"
      ]
    },
    {
      "type": "screenshot",
      "path": "evidence/home-forced-colors.png",
      "caption": "home forced colors",
      "condition": "forced-colors: active",
      "findingIds": []
    },
    {
      "type": "screenshot",
      "path": "evidence/home-mobile.png",
      "caption": "home mobile",
      "condition": "viewport: 360x800",
      "findingIds": [
        "F-07",
        "F-08",
        "F-18"
      ]
    },
    {
      "type": "har-summary",
      "path": "evidence/home-summary.json",
      "caption": "home summary",
      "findingIds": [
        "F-14",
        "F-24",
        "F-33",
        "F-34"
      ]
    },
    {
      "type": "trace-summary",
      "path": "evidence/home-trace-summary.json",
      "caption": "home trace summary",
      "findingIds": [
        "F-11",
        "F-13",
        "F-33"
      ]
    },
    {
      "type": "trace",
      "path": "evidence/home-trace.json",
      "caption": "home trace",
      "findingIds": []
    },
    {
      "type": "har",
      "path": "evidence/home.har",
      "caption": "home",
      "findingIds": [
        "F-14"
      ]
    },
    {
      "type": "other",
      "path": "evidence/images.json",
      "caption": "images",
      "findingIds": [
        "F-12",
        "F-16",
        "F-20",
        "F-32"
      ]
    },
    {
      "type": "layout",
      "path": "evidence/layout-mobile.json",
      "caption": "layout mobile",
      "condition": "viewport: 360x800",
      "findingIds": [
        "F-07",
        "F-12",
        "F-18",
        "F-19"
      ]
    },
    {
      "type": "lighthouse",
      "path": "evidence/lighthouse-summary.json",
      "caption": "lighthouse summary",
      "findingIds": [
        "F-11",
        "F-15",
        "F-16",
        "F-19",
        "F-21"
      ]
    },
    {
      "type": "lighthouse",
      "path": "evidence/lighthouse.json",
      "caption": "lighthouse",
      "findingIds": []
    },
    {
      "type": "screenshot",
      "path": "evidence/live.png",
      "caption": "live",
      "findingIds": []
    },
    {
      "type": "other",
      "path": "evidence/platform-probe.json",
      "caption": "platform probe",
      "findingIds": [
        "F-05",
        "F-08",
        "F-09",
        "F-16",
        "F-17",
        "F-27",
        "F-29",
        "F-31",
        "F-35"
      ]
    },
    {
      "type": "other",
      "path": "evidence/recon.json",
      "caption": "recon",
      "findingIds": []
    },
    {
      "type": "other",
      "path": "evidence/reduced-motion.json",
      "caption": "reduced motion",
      "findingIds": [
        "F-02"
      ]
    },
    {
      "type": "dom",
      "path": "evidence/reset-dom.json",
      "caption": "reset dom",
      "findingIds": [
        "F-10"
      ]
    },
    {
      "type": "screenshot",
      "path": "evidence/reset-invalid.png",
      "caption": "reset invalid",
      "findingIds": [
        "F-10",
        "F-30"
      ]
    },
    {
      "type": "screenshot",
      "path": "evidence/reset.png",
      "caption": "reset",
      "findingIds": []
    },
    {
      "type": "other",
      "path": "evidence/robots.json",
      "caption": "robots",
      "findingIds": []
    },
    {
      "type": "other",
      "path": "evidence/secrets.json",
      "caption": "secrets",
      "findingIds": []
    },
    {
      "type": "other",
      "path": "evidence/trackers.json",
      "caption": "trackers",
      "findingIds": [
        "F-24",
        "F-34"
      ]
    }
  ],
  "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": "Targeted visual, DOM, CDP metric, or external-tool evidence as described.",
      "evidence": "The dark-mode screenshot is visually identical to the light capture, while the DOM reports color-scheme: normal and a white html background.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/home-dark.png",
        "evidence/home-dom.json"
      ],
      "findingIds": [
        "F-01"
      ]
    },
    {
      "principleId": "respect-user-preferences",
      "checkId": "respects-reduced-motion",
      "status": "issues",
      "confidence": "high",
      "method": "Targeted visual, DOM, CDP metric, or external-tool evidence as described.",
      "evidence": "The reduced-motion probe matched reduce but still found a running 3,000 ms highlight animation.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/reduced-motion.json"
      ],
      "findingIds": [
        "F-02"
      ]
    },
    {
      "principleId": "respect-user-preferences",
      "checkId": "respects-contrast",
      "status": "pass",
      "confidence": "medium",
      "method": "Direct screenshot, rendered DOM, route walkthrough, Lighthouse, or CDP probe.",
      "evidence": "The forced-colors screenshot preserves visible text, controls, odds, focus outlines, and selected states across the first viewport.",
      "pathIds": [
        "home",
        "live",
        "event",
        "recovery",
        "help"
      ]
    },
    {
      "principleId": "implement-natural-interactions",
      "checkId": "view-transitions",
      "status": "issues",
      "confidence": "high",
      "method": "Targeted visual, DOM, CDP metric, or external-tool evidence as described.",
      "evidence": "The CSS/script probe found no ::view-transition rule or startViewTransition call across the interactive dashboard and detail route.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/css-script-probe.json",
        "evidence/event-detail.png"
      ],
      "findingIds": [
        "F-03"
      ]
    },
    {
      "principleId": "implement-natural-interactions",
      "checkId": "scroll-driven-animations",
      "status": "not-applicable",
      "confidence": "high",
      "method": "Recon across representative routes and interaction surfaces.",
      "evidence": "No parallax, scrollytelling, or scroll-linked reveal surface was observed on the representative pages.",
      "reason": "No parallax, scrollytelling, or scroll-linked reveal surface was observed on the representative pages.",
      "pathIds": [
        "home",
        "live",
        "event",
        "recovery",
        "help"
      ]
    },
    {
      "principleId": "implement-natural-interactions",
      "checkId": "physical-gestures",
      "status": "not-applicable",
      "confidence": "high",
      "method": "Recon across representative routes and interaction surfaces.",
      "evidence": "The audited desktop-oriented market, help, and recovery surfaces expose no required swipe, pull, or drag gesture journey.",
      "reason": "The audited desktop-oriented market, help, and recovery surfaces expose no required swipe, pull, or drag gesture journey.",
      "pathIds": [
        "home",
        "live",
        "event",
        "recovery",
        "help"
      ]
    },
    {
      "principleId": "provide-guided-navigation",
      "checkId": "scroll-state-aware-chrome",
      "status": "issues",
      "confidence": "high",
      "method": "Targeted visual, DOM, CDP metric, or external-tool evidence as described.",
      "evidence": "The 2,680 px home document uses static navigation and the CSS probe found no scroll-state or scroll-position treatment.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/home-desktop.png",
        "evidence/home-dom.json"
      ],
      "findingIds": [
        "F-04"
      ]
    },
    {
      "principleId": "provide-guided-navigation",
      "checkId": "anchored-positioning",
      "status": "not-applicable",
      "confidence": "high",
      "method": "Recon across representative routes and interaction surfaces.",
      "evidence": "No tooltip, popover, or viewport-edge overlay requiring anchored positioning was present in the exercised states.",
      "reason": "No tooltip, popover, or viewport-edge overlay requiring anchored positioning was present in the exercised states.",
      "pathIds": [
        "home",
        "live",
        "event",
        "recovery",
        "help"
      ]
    },
    {
      "principleId": "provide-guided-navigation",
      "checkId": "directs-attention",
      "status": "pass",
      "confidence": "medium",
      "method": "Direct screenshot, rendered DOM, route walkthrough, Lighthouse, or CDP probe.",
      "evidence": "Home, sport tabs, detail breadcrumb, active tab underlines, market grouping, and selected controls visibly orient the user across home and event detail.",
      "pathIds": [
        "home",
        "live",
        "event",
        "recovery",
        "help"
      ]
    },
    {
      "principleId": "maximize-content-reduce-noise",
      "checkId": "no-intrusive-interruptions",
      "status": "pass",
      "confidence": "medium",
      "method": "Direct screenshot, rendered DOM, route walkthrough, Lighthouse, or CDP probe.",
      "evidence": "Desktop, mobile, help, recovery, live, and event captures loaded without a modal, consent wall, or full-viewport interstitial obscuring content.",
      "pathIds": [
        "home",
        "live",
        "event",
        "recovery",
        "help"
      ]
    },
    {
      "principleId": "maximize-content-reduce-noise",
      "checkId": "semantic-dismissible-primitives",
      "status": "issues",
      "confidence": "high",
      "method": "Targeted visual, DOM, CDP metric, or external-tool evidence as described.",
      "evidence": "The platform probe found role=listbox, role=button spans, and checkbox divs, but no dialog, popover, or native disclosure primitives.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/platform-probe.json"
      ],
      "findingIds": [
        "F-05"
      ]
    },
    {
      "principleId": "maximize-content-reduce-noise",
      "checkId": "reduced-chrome",
      "status": "issues",
      "confidence": "high",
      "method": "Targeted visual, DOM, CDP metric, or external-tool evidence as described.",
      "evidence": "The desktop first viewport devotes large regions to two nav rows, promotional hero and banner, registration panel, winner feed, mini games, and betslip around the odds content.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/home-desktop.png"
      ],
      "findingIds": [
        "F-06"
      ]
    },
    {
      "principleId": "adapt-to-the-form-factor",
      "checkId": "responsive-no-horizontal-scroll",
      "status": "issues",
      "confidence": "high",
      "method": "Targeted visual, DOM, CDP metric, or external-tool evidence as described.",
      "evidence": "At a requested 360x800 viewport, layout metrics reported a 1,000 CSS px layout viewport, no viewport meta, and the screenshot shows the entire dense desktop page scaled to unreadable text.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/home-mobile.png",
        "evidence/layout-mobile.json"
      ],
      "findingIds": [
        "F-07"
      ]
    },
    {
      "principleId": "adapt-to-the-form-factor",
      "checkId": "component-level-responsiveness",
      "status": "issues",
      "confidence": "high",
      "method": "Targeted visual, DOM, CDP metric, or external-tool evidence as described.",
      "evidence": "The platform probe found zero container rules and the narrow screenshot preserves desktop sidebars and tables rather than adapting reusable cards and betslip modules.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/platform-probe.json",
        "evidence/home-mobile.png"
      ],
      "findingIds": [
        "F-08"
      ]
    },
    {
      "principleId": "adapt-to-the-form-factor",
      "checkId": "input-modality-aware",
      "status": "issues",
      "confidence": "high",
      "method": "Targeted visual, DOM, CDP metric, or external-tool evidence as described.",
      "evidence": "Focused phone and password fields had outline none and no box shadow; several controls measured 32 px high and the checkbox 13x13 px.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/platform-probe.json"
      ],
      "findingIds": [
        "F-09"
      ]
    },
    {
      "principleId": "support-core-task-success",
      "checkId": "clear-purpose-and-primary-action",
      "status": "pass",
      "confidence": "medium",
      "method": "Direct screenshot, rendered DOM, route walkthrough, Lighthouse, or CDP probe.",
      "evidence": "The first viewport clearly identifies sports betting, exposes odds as the primary action, and keeps a labelled betslip adjacent on desktop.",
      "pathIds": [
        "home",
        "live",
        "event",
        "recovery",
        "help"
      ]
    },
    {
      "principleId": "support-core-task-success",
      "checkId": "primary-flow-completion",
      "status": "pass",
      "confidence": "medium",
      "method": "Direct screenshot, rendered DOM, route walkthrough, Lighthouse, or CDP probe.",
      "evidence": "The non-transactional portion of the core flow is clear: event markets expose odds, selection leads to a labelled betslip, and account-required actions are visibly signposted.",
      "pathIds": [
        "home",
        "live",
        "event",
        "recovery",
        "help"
      ]
    },
    {
      "principleId": "support-core-task-success",
      "checkId": "clear-system-state-and-recovery",
      "status": "issues",
      "confidence": "high",
      "method": "Targeted visual, DOM, CDP metric, or external-tool evidence as described.",
      "evidence": "After entering a one-digit phone number on Forgot Password and attempting Next, the captured state remained unchanged with no visible validation explanation.",
      "pathIds": [
        "recovery"
      ],
      "artifacts": [
        "evidence/reset-invalid.png",
        "evidence/reset-dom.json"
      ],
      "findingIds": [
        "F-10"
      ]
    },
    {
      "principleId": "be-fast-and-stable",
      "checkId": "good-core-web-vitals",
      "status": "issues",
      "confidence": "high",
      "method": "Targeted visual, DOM, CDP metric, or external-tool evidence as described.",
      "evidence": "The trace measured LCP 8.54 s and 3.66 s total blocking time; Lighthouse measured LCP 19.4 s, TBT 990 ms, and performance 42.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/home-trace-summary.json",
        "evidence/lighthouse-summary.json"
      ],
      "findingIds": [
        "F-11"
      ]
    },
    {
      "principleId": "be-fast-and-stable",
      "checkId": "visual-stability",
      "status": "issues",
      "confidence": "high",
      "method": "Targeted visual, DOM, CDP metric, or external-tool evidence as described.",
      "evidence": "The mobile layout observer measured CLS 0.116 with seven shifts, including 0.063 and 0.042 shifts after four seconds; 31 images lacked dimensions.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/layout-mobile.json",
        "evidence/images.json"
      ],
      "findingIds": [
        "F-12"
      ]
    },
    {
      "principleId": "be-fast-and-stable",
      "checkId": "efficient-main-thread",
      "status": "issues",
      "confidence": "high",
      "method": "Targeted visual, DOM, CDP metric, or external-tool evidence as described.",
      "evidence": "The trace found seven long tasks, including a 3,438.86 ms task, with 3,655.35 ms total blocking time.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/home-trace-summary.json"
      ],
      "findingIds": [
        "F-13"
      ]
    },
    {
      "principleId": "be-fast-and-stable",
      "checkId": "efficient-resource-delivery",
      "status": "issues",
      "confidence": "high",
      "method": "Targeted visual, DOM, CDP metric, or external-tool evidence as described.",
      "evidence": "The HAR recorded 201 requests and 6.66 MB transferred, including 17 stylesheets, 61 scripts, 9 fonts, multiple parser-inserted stylesheets, and large assets without cache headers.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/home-summary.json",
        "evidence/home.har"
      ],
      "findingIds": [
        "F-14"
      ]
    },
    {
      "principleId": "be-fast-and-stable",
      "checkId": "trim-unused-and-duplicate-code",
      "status": "issues",
      "confidence": "high",
      "method": "Targeted visual, DOM, CDP metric, or external-tool evidence as described.",
      "evidence": "Lighthouse estimated 1,017 KiB of removable JavaScript, with several bundles between 48% and 75% unused.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/lighthouse-summary.json"
      ],
      "findingIds": [
        "F-15"
      ]
    },
    {
      "principleId": "be-inclusive",
      "checkId": "names-roles-labels",
      "status": "issues",
      "confidence": "high",
      "method": "Targeted visual, DOM, CDP metric, or external-tool evidence as described.",
      "evidence": "The DOM probe found login and registration fields with no labels or aria-labels, the images audit found 22 missing alt attributes, and Lighthouse found an unnamed logo link.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/platform-probe.json",
        "evidence/images.json",
        "evidence/lighthouse-summary.json"
      ],
      "findingIds": [
        "F-16"
      ]
    },
    {
      "principleId": "be-inclusive",
      "checkId": "sufficient-contrast",
      "status": "pass",
      "confidence": "medium",
      "method": "Direct screenshot, rendered DOM, route walkthrough, Lighthouse, or CDP probe.",
      "evidence": "Lighthouse color-contrast audit scored 1, and the forced-colors capture preserves distinguishable text and controls.",
      "pathIds": [
        "home",
        "live",
        "event",
        "recovery",
        "help"
      ]
    },
    {
      "principleId": "be-inclusive",
      "checkId": "structure-and-focus",
      "status": "issues",
      "confidence": "high",
      "method": "Targeted visual, DOM, CDP metric, or external-tool evidence as described.",
      "evidence": "The home page has no h1, starts its sparse headings at h5, has no main landmark, and focused text inputs show no visible outline.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/platform-probe.json"
      ],
      "findingIds": [
        "F-17"
      ]
    },
    {
      "principleId": "be-inclusive",
      "checkId": "legible-text",
      "status": "issues",
      "confidence": "high",
      "method": "Targeted visual, DOM, CDP metric, or external-tool evidence as described.",
      "evidence": "The 360 px screenshot scales a 1,000 px desktop surface down to 36%, making odds, labels, winner entries, and help text too small to read comfortably.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/home-mobile.png",
        "evidence/layout-mobile.json"
      ],
      "findingIds": [
        "F-18"
      ]
    },
    {
      "principleId": "be-inclusive",
      "checkId": "zoom-reflow-targets-and-media",
      "status": "issues",
      "confidence": "high",
      "method": "Targeted visual, DOM, CDP metric, or external-tool evidence as described.",
      "evidence": "Lighthouse found user-scalable=no or maximum-scale below 5, while the live page had no desktop viewport meta and rendered a fixed 1,000 px layout into 360 px.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/lighthouse-summary.json",
        "evidence/layout-mobile.json"
      ],
      "findingIds": [
        "F-19"
      ]
    },
    {
      "principleId": "follow-best-practices",
      "checkId": "no-console-errors",
      "status": "pass",
      "confidence": "medium",
      "method": "Direct screenshot, rendered DOM, route walkthrough, Lighthouse, or CDP probe.",
      "evidence": "Lighthouse recorded no browser errors in the console during the audited mobile load.",
      "pathIds": [
        "home",
        "live",
        "event",
        "recovery",
        "help"
      ]
    },
    {
      "principleId": "follow-best-practices",
      "checkId": "sound-document-and-assets",
      "status": "issues",
      "confidence": "high",
      "method": "Targeted visual, DOM, CDP metric, or external-tool evidence as described.",
      "evidence": "All 31 audited images lacked width and height, 22 below-fold images were not lazy-loaded, and 28 used legacy formats.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/images.json"
      ],
      "findingIds": [
        "F-20"
      ]
    },
    {
      "principleId": "follow-best-practices",
      "checkId": "browser-platform-hygiene",
      "status": "issues",
      "confidence": "high",
      "method": "Targeted visual, DOM, CDP metric, or external-tool evidence as described.",
      "evidence": "Lighthouse found a deprecated unload listener and six BFCache failure reasons, including an unload handler in the main frame.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/lighthouse-summary.json"
      ],
      "findingIds": [
        "F-21"
      ]
    },
    {
      "principleId": "be-discoverable",
      "checkId": "title-and-description",
      "status": "pass",
      "confidence": "medium",
      "method": "Direct screenshot, rendered DOM, route walkthrough, Lighthouse, or CDP probe.",
      "evidence": "Rendered DOM has a descriptive SportyBet sports-betting title and a concrete meta description.",
      "pathIds": [
        "home",
        "live",
        "event",
        "recovery",
        "help"
      ]
    },
    {
      "principleId": "be-discoverable",
      "checkId": "crawlable-and-mobile-friendly",
      "status": "issues",
      "confidence": "high",
      "method": "Targeted visual, DOM, CDP metric, or external-tool evidence as described.",
      "evidence": "The discoverability fetch returned HTTP 500 with 0% rendered-word coverage, no raw title or description, and only a JavaScript-required message in crawler view.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/discoverability",
        "evidence/discoverability-crawler.png",
        "evidence/discoverability-rendered.png"
      ],
      "findingIds": [
        "F-22"
      ]
    },
    {
      "principleId": "be-discoverable",
      "checkId": "canonical-and-indexing-signals",
      "status": "pass",
      "confidence": "medium",
      "method": "Direct screenshot, rendered DOM, route walkthrough, Lighthouse, or CDP probe.",
      "evidence": "Rendered head exposes a canonical /ng/ URL and localized hreflang alternatives; robots.txt permits core paths and points to sitemap.xml.",
      "pathIds": [
        "home",
        "live",
        "event",
        "recovery",
        "help"
      ]
    },
    {
      "principleId": "be-discoverable",
      "checkId": "structured-and-shareable-metadata",
      "status": "pass",
      "confidence": "medium",
      "method": "Direct screenshot, rendered DOM, route walkthrough, Lighthouse, or CDP probe.",
      "evidence": "Rendered head includes JSON-LD plus Open Graph title, description, image, URL, site name and type metadata.",
      "pathIds": [
        "home",
        "live",
        "event",
        "recovery",
        "help"
      ]
    },
    {
      "principleId": "be-private-and-secure",
      "checkId": "secure-transport-and-headers",
      "status": "issues",
      "confidence": "high",
      "method": "Targeted visual, DOM, CDP metric, or external-tool evidence as described.",
      "evidence": "HTTPS, HSTS, nosniff and X-Frame-Options are present, but CSP is missing and all 11 observed cookies lacked Secure and used SameSite=None.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/headers.json",
        "evidence/cookies.json"
      ],
      "findingIds": [
        "F-23"
      ]
    },
    {
      "principleId": "be-private-and-secure",
      "checkId": "data-minimisation-and-third-parties",
      "status": "issues",
      "confidence": "high",
      "method": "Targeted visual, DOM, CDP metric, or external-tool evidence as described.",
      "evidence": "The page contacted 15 third-party origins, including five known tracker domains; 152 third-party requests transferred 6.21 MB.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/trackers.json",
        "evidence/home-summary.json"
      ],
      "findingIds": [
        "F-24"
      ]
    },
    {
      "principleId": "be-private-and-secure",
      "checkId": "in-context-permissions-and-modern-auth",
      "status": "not-applicable",
      "confidence": "high",
      "method": "Recon across representative routes and interaction surfaces.",
      "evidence": "No permission prompt fired on load, and completing or changing authentication methods would require a real account; passkey availability was not asserted.",
      "reason": "No permission prompt fired on load, and completing or changing authentication methods would require a real account; passkey availability was not asserted.",
      "pathIds": [
        "home",
        "live",
        "event",
        "recovery",
        "help"
      ]
    },
    {
      "principleId": "be-private-and-secure",
      "checkId": "defensive-browser-policies",
      "status": "issues",
      "confidence": "high",
      "method": "Targeted visual, DOM, CDP metric, or external-tool evidence as described.",
      "evidence": "Headers include HSTS, nosniff, SAMEORIGIN and strict-origin-when-cross-origin, but omit both Content-Security-Policy and Permissions-Policy.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/headers.json"
      ],
      "findingIds": [
        "F-25"
      ]
    },
    {
      "principleId": "be-resilient",
      "checkId": "progressive-enhancement",
      "status": "issues",
      "confidence": "high",
      "method": "Targeted visual, DOM, CDP metric, or external-tool evidence as described.",
      "evidence": "The crawler/no-JS capture shows only a JavaScript-required notice; raw fetch returned 500 and had 0% coverage of rendered content words.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/discoverability",
        "evidence/discoverability-crawler.png"
      ],
      "findingIds": [
        "F-26"
      ]
    },
    {
      "principleId": "be-resilient",
      "checkId": "resilient-runtime-behaviour",
      "status": "pass",
      "confidence": "medium",
      "method": "Direct screenshot, rendered DOM, route walkthrough, Lighthouse, or CDP probe.",
      "evidence": "Representative home, live, event, help, and recovery routes loaded with stable visible content and no clipped modal or broken navigation state.",
      "pathIds": [
        "home",
        "live",
        "event",
        "recovery",
        "help"
      ]
    },
    {
      "principleId": "be-resilient",
      "checkId": "offline-and-installable",
      "status": "issues",
      "confidence": "high",
      "method": "Targeted visual, DOM, CDP metric, or external-tool evidence as described.",
      "evidence": "The platform probe found no manifest; the non-JS/failure state is only a generic JavaScript-required notice.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/platform-probe.json",
        "evidence/discoverability-crawler.png"
      ],
      "findingIds": [
        "F-27"
      ]
    },
    {
      "principleId": "be-resilient",
      "checkId": "network-and-http-failure-states",
      "status": "issues",
      "confidence": "high",
      "method": "Targeted visual, DOM, CDP metric, or external-tool evidence as described.",
      "evidence": "The raw document request returned 500 and crawler view exposed no retry, status, or useful fallback beyond enabling JavaScript.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/discoverability",
        "evidence/discoverability-crawler.png"
      ],
      "findingIds": [
        "F-28"
      ]
    },
    {
      "principleId": "be-internationalised",
      "checkId": "lang-dir-and-logical-properties",
      "status": "pass",
      "confidence": "medium",
      "method": "Direct screenshot, rendered DOM, route walkthrough, Lighthouse, or CDP probe.",
      "evidence": "The rendered Nigerian English document declares html lang=en, and localized hreflang alternatives are exposed for multiple markets.",
      "pathIds": [
        "home",
        "live",
        "event",
        "recovery",
        "help"
      ]
    },
    {
      "principleId": "be-internationalised",
      "checkId": "locale-aware-data",
      "status": "pass",
      "confidence": "medium",
      "method": "Direct screenshot, rendered DOM, route walkthrough, Lighthouse, or CDP probe.",
      "evidence": "Rendered content uses Nigerian NGN currency, +234 phone context, localized day/date labels, and region-specific country routing.",
      "pathIds": [
        "home",
        "live",
        "event",
        "recovery",
        "help"
      ]
    },
    {
      "principleId": "be-internationalised",
      "checkId": "time-zone-correctness",
      "status": "pass",
      "confidence": "medium",
      "method": "Direct screenshot, rendered DOM, route walkthrough, Lighthouse, or CDP probe.",
      "evidence": "The interface explicitly exposes GMT+01:00 next to live and scheduled market times, making the displayed time basis visible.",
      "pathIds": [
        "home",
        "live",
        "event",
        "recovery",
        "help"
      ]
    },
    {
      "principleId": "be-trustworthy",
      "checkId": "no-dark-patterns",
      "status": "issues",
      "confidence": "high",
      "method": "Targeted visual, DOM, CDP metric, or external-tool evidence as described.",
      "evidence": "The first viewport shows “Keep me signed in” selected by default next to sign-in, while deposit and registration prompts dominate the surrounding page.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/home-desktop.png",
        "evidence/platform-probe.json"
      ],
      "findingIds": [
        "F-29"
      ]
    },
    {
      "principleId": "be-trustworthy",
      "checkId": "humane-error-handling",
      "status": "issues",
      "confidence": "high",
      "method": "Targeted visual, DOM, CDP metric, or external-tool evidence as described.",
      "evidence": "A one-digit mobile number and Next attempt produced no visible field-level message or recovery instruction.",
      "pathIds": [
        "recovery"
      ],
      "artifacts": [
        "evidence/reset-invalid.png"
      ],
      "findingIds": [
        "F-30"
      ]
    },
    {
      "principleId": "be-trustworthy",
      "checkId": "trustworthy-input-assistance",
      "status": "issues",
      "confidence": "high",
      "method": "Targeted visual, DOM, CDP metric, or external-tool evidence as described.",
      "evidence": "The login phone and password inputs have autocomplete=off and no labels, preventing reliable autofill and password-manager semantics.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/platform-probe.json"
      ],
      "findingIds": [
        "F-31"
      ]
    },
    {
      "principleId": "be-trustworthy",
      "checkId": "safe-commercial-and-account-flows",
      "status": "pass",
      "confidence": "medium",
      "method": "Direct screenshot, rendered DOM, route walkthrough, Lighthouse, or CDP probe.",
      "evidence": "The audited unauthenticated states display odds, account recovery, responsible-gaming, terms, privacy, and self-exclusion navigation; no wager or account mutation was performed.",
      "pathIds": [
        "home",
        "live",
        "event",
        "recovery",
        "help"
      ]
    },
    {
      "principleId": "be-sustainable",
      "checkId": "optimised-assets",
      "status": "issues",
      "confidence": "high",
      "method": "Targeted visual, DOM, CDP metric, or external-tool evidence as described.",
      "evidence": "The images audit found 28 legacy-format images, 22 below-fold images without lazy loading, 11 without srcset, and all 31 without intrinsic dimensions.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/images.json"
      ],
      "findingIds": [
        "F-32"
      ]
    },
    {
      "principleId": "be-sustainable",
      "checkId": "no-wasteful-work",
      "status": "issues",
      "confidence": "high",
      "method": "Targeted visual, DOM, CDP metric, or external-tool evidence as described.",
      "evidence": "The load performs 201 requests, 61 scripts, 62 fetch/XHR requests, and a 3.44 s main-thread task before the dashboard settles.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/home-summary.json",
        "evidence/home-trace-summary.json"
      ],
      "findingIds": [
        "F-33"
      ]
    },
    {
      "principleId": "be-sustainable",
      "checkId": "third-party-and-media-budget",
      "status": "issues",
      "confidence": "high",
      "method": "Targeted visual, DOM, CDP metric, or external-tool evidence as described.",
      "evidence": "Third parties account for 152 requests and 6.21 MB, including 703.9 KB from Tag Manager and about 1.43 MB of fonts overall.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/home-summary.json",
        "evidence/trackers.json"
      ],
      "findingIds": [
        "F-34"
      ]
    },
    {
      "principleId": "be-agent-ready",
      "checkId": "structured-agent-capabilities",
      "status": "issues",
      "confidence": "high",
      "method": "Targeted visual, DOM, CDP metric, or external-tool evidence as described.",
      "evidence": "The platform probe found no agent tooling signal and the no-JS representation exposes none of the visible market or account-recovery capability.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/platform-probe.json",
        "evidence/discoverability-crawler.png"
      ],
      "findingIds": [
        "F-35"
      ]
    },
    {
      "principleId": "be-agent-ready",
      "checkId": "on-device-inference",
      "status": "not-applicable",
      "confidence": "high",
      "method": "Recon across representative routes and interaction surfaces.",
      "evidence": "On-device summarisation or language-model inference is not necessary for the betting, help, or account-recovery tasks audited.",
      "reason": "On-device summarisation or language-model inference is not necessary for the betting, help, or account-recovery tasks audited.",
      "pathIds": [
        "home",
        "live",
        "event",
        "recovery",
        "help"
      ]
    },
    {
      "principleId": "be-memory-efficient",
      "checkId": "no-leak-under-repeated-interaction",
      "status": "pass",
      "confidence": "medium",
      "method": "Direct screenshot, rendered DOM, route walkthrough, Lighthouse, or CDP probe.",
      "evidence": "After ten repeated odds select/deselect interactions, heap self size increased from 125.10 MB to 127.01 MB (1.5%) with no constructor showing runaway growth; this does not establish an unbounded leak.",
      "pathIds": [
        "home",
        "live",
        "event",
        "recovery",
        "help"
      ]
    },
    {
      "principleId": "be-memory-efficient",
      "checkId": "bounded-footprint",
      "status": "issues",
      "confidence": "high",
      "method": "Targeted visual, DOM, CDP metric, or external-tool evidence as described.",
      "evidence": "The baseline heap summary contains 3,123,569 nodes and 125.1 MB self size, including 523,055 native nodes and 464,305 closures, which is high for one dashboard view.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/heap-baseline.heapsnapshot"
      ],
      "findingIds": [
        "F-36"
      ]
    },
    {
      "principleId": "be-memory-efficient",
      "checkId": "no-detached-dom-or-unbounded-listeners",
      "status": "pass",
      "confidence": "medium",
      "method": "Direct screenshot, rendered DOM, route walkthrough, Lighthouse, or CDP probe.",
      "evidence": "Before/after heap summaries show small object and closure deltas and no Detached constructor among the leading retained populations.",
      "pathIds": [
        "home",
        "live",
        "event",
        "recovery",
        "help"
      ]
    }
  ],
  "principleOutcomes": [
    {
      "principleId": "respect-user-preferences",
      "expectation": "default",
      "status": "issues",
      "findingIds": [
        "F-01",
        "F-02"
      ]
    },
    {
      "principleId": "implement-natural-interactions",
      "expectation": "default",
      "status": "issues",
      "findingIds": [
        "F-03"
      ]
    },
    {
      "principleId": "provide-guided-navigation",
      "expectation": "default",
      "status": "issues",
      "findingIds": [
        "F-04"
      ]
    },
    {
      "principleId": "maximize-content-reduce-noise",
      "expectation": "default",
      "status": "issues",
      "findingIds": [
        "F-05",
        "F-06"
      ]
    },
    {
      "principleId": "adapt-to-the-form-factor",
      "expectation": "default",
      "status": "issues",
      "findingIds": [
        "F-07",
        "F-08",
        "F-09"
      ]
    },
    {
      "principleId": "support-core-task-success",
      "expectation": "default",
      "status": "issues",
      "findingIds": [
        "F-10"
      ]
    },
    {
      "principleId": "be-fast-and-stable",
      "expectation": "default",
      "status": "issues",
      "findingIds": [
        "F-11",
        "F-12",
        "F-13",
        "F-14",
        "F-15"
      ]
    },
    {
      "principleId": "be-inclusive",
      "expectation": "default",
      "status": "issues",
      "findingIds": [
        "F-16",
        "F-17",
        "F-18",
        "F-19"
      ]
    },
    {
      "principleId": "follow-best-practices",
      "expectation": "default",
      "status": "issues",
      "findingIds": [
        "F-20",
        "F-21"
      ]
    },
    {
      "principleId": "be-discoverable",
      "expectation": "default",
      "status": "issues",
      "findingIds": [
        "F-22"
      ]
    },
    {
      "principleId": "be-private-and-secure",
      "expectation": "default",
      "status": "issues",
      "findingIds": [
        "F-23",
        "F-24",
        "F-25"
      ]
    },
    {
      "principleId": "be-resilient",
      "expectation": "contextual",
      "status": "issues",
      "findingIds": [
        "F-26",
        "F-27",
        "F-28"
      ]
    },
    {
      "principleId": "be-internationalised",
      "expectation": "contextual",
      "status": "pass"
    },
    {
      "principleId": "be-trustworthy",
      "expectation": "default",
      "status": "issues",
      "findingIds": [
        "F-29",
        "F-30",
        "F-31"
      ]
    },
    {
      "principleId": "be-sustainable",
      "expectation": "contextual",
      "status": "issues",
      "findingIds": [
        "F-32",
        "F-33",
        "F-34"
      ]
    },
    {
      "principleId": "be-agent-ready",
      "expectation": "contextual",
      "status": "issues",
      "findingIds": [
        "F-35"
      ]
    },
    {
      "principleId": "be-memory-efficient",
      "expectation": "default",
      "status": "issues",
      "findingIds": [
        "F-36"
      ]
    }
  ],
  "paths": [
    {
      "id": "home",
      "description": "Public sports-betting home and primary odds-to-betslip surface; represents the main dashboard template.",
      "url": "https://www.sportybet.com/ng/",
      "conditions": [
        "1440x900",
        "360x800",
        "prefers-color-scheme: dark",
        "forced-colors: active",
        "prefers-reduced-motion: reduce",
        "no JavaScript crawler"
      ],
      "result": "issues"
    },
    {
      "id": "live",
      "description": "Live betting listing; represents real-time market content and high-update interaction.",
      "url": "https://www.sportybet.com/ng/sport/live/",
      "conditions": [
        "1440x900"
      ],
      "result": "issues"
    },
    {
      "id": "event",
      "description": "Football event detail; represents a market detail and selection journey.",
      "url": "https://www.sportybet.com/ng/sport/football/Brazil/Brasileiro_Serie_A/Atletico_Mineiro_MG_vs_EC_Bahia_BA/sr:match:66886848",
      "conditions": [
        "1440x900"
      ],
      "result": "issues"
    },
    {
      "id": "recovery",
      "description": "Forgot-password form; represents account recovery, labels, validation, and error handling.",
      "url": "https://www.sportybet.com/ng/profile/reset_password",
      "conditions": [
        "1440x900",
        "invalid one-digit input"
      ],
      "result": "issues"
    },
    {
      "id": "help",
      "description": "Responsible-gaming help; represents long-form help/disclosure and user-safety content.",
      "url": "https://www.sportybet.com/ng/help?nav=responsible-gaming",
      "conditions": [
        "1440x900"
      ],
      "result": "pass"
    }
  ],
  "findings": [
    {
      "id": "F-01",
      "pathId": "home",
      "url": "https://www.sportybet.com/ng/",
      "principleId": "respect-user-preferences",
      "principleCheckId": "respects-color-scheme",
      "severity": "high",
      "confidence": "high",
      "summary": "The interface ignores the user’s dark color-scheme preference",
      "evidence": "The dark-mode screenshot is visually identical to the light capture, while the DOM reports color-scheme: normal and a white html background.",
      "artifacts": [
        "evidence/home-dark.png",
        "evidence/home-dom.json"
      ],
      "suggestedFix": "Declare light and dark support early, then retint surfaces, text, controls, images, and browser chrome with prefers-color-scheme or light-dark().",
      "effort": "small",
      "guidanceId": "dark-mode",
      "guidanceCategory": "modern-web-guidance"
    },
    {
      "id": "F-02",
      "pathId": "home",
      "url": "https://www.sportybet.com/ng/",
      "principleId": "respect-user-preferences",
      "principleCheckId": "respects-reduced-motion",
      "severity": "medium",
      "confidence": "high",
      "summary": "Motion continues when reduced motion is requested",
      "evidence": "The reduced-motion probe matched reduce but still found a running 3,000 ms highlight animation.",
      "artifacts": [
        "evidence/reduced-motion.json"
      ],
      "suggestedFix": "Disable non-essential highlight and auto-advance animation inside prefers-reduced-motion: reduce.",
      "effort": "small",
      "guidanceId": "accessibility",
      "guidanceCategory": "modern-web-guidance"
    },
    {
      "id": "F-03",
      "pathId": "home",
      "url": "https://www.sportybet.com/ng/",
      "principleId": "implement-natural-interactions",
      "principleCheckId": "view-transitions",
      "severity": "low",
      "confidence": "high",
      "summary": "State and route changes do not use View Transitions",
      "evidence": "The CSS/script probe found no ::view-transition rule or startViewTransition call across the interactive dashboard and detail route.",
      "artifacts": [
        "evidence/css-script-probe.json",
        "evidence/event-detail.png"
      ],
      "suggestedFix": "Use same-document View Transitions for betslip and tab state changes, with a reduced-motion fallback.",
      "effort": "medium",
      "guidanceId": "same-document-transitions",
      "guidanceCategory": "modern-web-guidance"
    },
    {
      "id": "F-04",
      "pathId": "home",
      "url": "https://www.sportybet.com/ng/",
      "principleId": "provide-guided-navigation",
      "principleCheckId": "scroll-state-aware-chrome",
      "severity": "low",
      "confidence": "high",
      "summary": "Long pages lose primary navigation context while scrolling",
      "evidence": "The 2,680 px home document uses static navigation and the CSS probe found no scroll-state or scroll-position treatment.",
      "artifacts": [
        "evidence/home-desktop.png",
        "evidence/home-dom.json"
      ],
      "suggestedFix": "Use sticky chrome with a restrained scroll-state treatment so location and key actions remain understandable.",
      "effort": "small",
      "guidanceId": "shrinking-header-on-scroll",
      "guidanceCategory": "modern-web-guidance"
    },
    {
      "id": "F-05",
      "pathId": "home",
      "url": "https://www.sportybet.com/ng/",
      "principleId": "maximize-content-reduce-noise",
      "principleCheckId": "semantic-dismissible-primitives",
      "severity": "medium",
      "confidence": "high",
      "summary": "Rich controls rely on custom roles instead of native primitives",
      "evidence": "The platform probe found role=listbox, role=button spans, and checkbox divs, but no dialog, popover, or native disclosure primitives.",
      "artifacts": [
        "evidence/platform-probe.json"
      ],
      "suggestedFix": "Replace ad-hoc dropdown and disclosure controls with native select, details, popover, or dialog as appropriate.",
      "effort": "medium",
      "guidanceId": "declarative-dialog-popover-control",
      "guidanceCategory": "modern-web-guidance"
    },
    {
      "id": "F-06",
      "pathId": "home",
      "url": "https://www.sportybet.com/ng/",
      "principleId": "maximize-content-reduce-noise",
      "principleCheckId": "reduced-chrome",
      "severity": "high",
      "confidence": "high",
      "summary": "Promotional and application chrome crowds the core betting content",
      "evidence": "The desktop first viewport devotes large regions to two nav rows, promotional hero and banner, registration panel, winner feed, mini games, and betslip around the odds content.",
      "artifacts": [
        "evidence/home-desktop.png"
      ],
      "suggestedFix": "Remove or defer low-value promotional panels and reduce persistent framing around the primary odds and betslip task.",
      "effort": "medium",
      "guidanceId": "overflow-clipping-control",
      "guidanceCategory": "modern-web-guidance"
    },
    {
      "id": "F-07",
      "pathId": "home",
      "url": "https://www.sportybet.com/ng/",
      "principleId": "adapt-to-the-form-factor",
      "principleCheckId": "responsive-no-horizontal-scroll",
      "severity": "critical",
      "confidence": "high",
      "summary": "The mobile viewport receives a scaled desktop layout",
      "evidence": "At a requested 360x800 viewport, layout metrics reported a 1,000 CSS px layout viewport, no viewport meta, and the screenshot shows the entire dense desktop page scaled to unreadable text.",
      "artifacts": [
        "evidence/home-mobile.png",
        "evidence/layout-mobile.json"
      ],
      "suggestedFix": "Serve a real responsive layout with a valid viewport declaration, intrinsic sizing, and mobile reflow instead of shrinking a fixed desktop canvas.",
      "effort": "large",
      "guidanceId": "fluid-scaling",
      "guidanceCategory": "modern-web-guidance"
    },
    {
      "id": "F-08",
      "pathId": "home",
      "url": "https://www.sportybet.com/ng/",
      "principleId": "adapt-to-the-form-factor",
      "principleCheckId": "component-level-responsiveness",
      "severity": "medium",
      "confidence": "high",
      "summary": "Dashboard components do not adapt at component level",
      "evidence": "The platform probe found zero container rules and the narrow screenshot preserves desktop sidebars and tables rather than adapting reusable cards and betslip modules.",
      "artifacts": [
        "evidence/platform-probe.json",
        "evidence/home-mobile.png"
      ],
      "suggestedFix": "Add container-type to reusable regions and use @container rules to recompose market rows, sidebars, and betslip modules.",
      "effort": "large",
      "guidanceId": "size-aware-styling",
      "guidanceCategory": "modern-web-guidance"
    },
    {
      "id": "F-09",
      "pathId": "home",
      "url": "https://www.sportybet.com/ng/",
      "principleId": "adapt-to-the-form-factor",
      "principleCheckId": "input-modality-aware",
      "severity": "high",
      "confidence": "high",
      "summary": "Key inputs lack visible focus and targets are undersized",
      "evidence": "Focused phone and password fields had outline none and no box shadow; several controls measured 32 px high and the checkbox 13x13 px.",
      "artifacts": [
        "evidence/platform-probe.json"
      ],
      "suggestedFix": "Provide clear :focus-visible styles and bring interactive target boxes to an accessible touch size without removing native focus.",
      "effort": "small",
      "guidanceId": "css",
      "guidanceCategory": "modern-web-guidance"
    },
    {
      "id": "F-10",
      "pathId": "recovery",
      "url": "https://www.sportybet.com/ng/profile/reset_password",
      "principleId": "support-core-task-success",
      "principleCheckId": "clear-system-state-and-recovery",
      "severity": "medium",
      "confidence": "high",
      "summary": "Invalid recovery input gives no actionable feedback",
      "evidence": "After entering a one-digit phone number on Forgot Password and attempting Next, the captured state remained unchanged with no visible validation explanation.",
      "artifacts": [
        "evidence/reset-invalid.png",
        "evidence/reset-dom.json"
      ],
      "suggestedFix": "Validate after interaction, connect a specific error message to the field, and announce it through an accessible live region.",
      "effort": "small",
      "guidanceId": "accessible-error-announcement",
      "guidanceCategory": "modern-web-guidance"
    },
    {
      "id": "F-11",
      "pathId": "home",
      "url": "https://www.sportybet.com/ng/",
      "principleId": "be-fast-and-stable",
      "principleCheckId": "good-core-web-vitals",
      "severity": "critical",
      "confidence": "high",
      "summary": "The primary page loads far outside good performance ranges",
      "evidence": "The trace measured LCP 8.54 s and 3.66 s total blocking time; Lighthouse measured LCP 19.4 s, TBT 990 ms, and performance 42.",
      "artifacts": [
        "evidence/home-trace-summary.json",
        "evidence/lighthouse-summary.json"
      ],
      "suggestedFix": "Prioritize the LCP element, reduce startup JavaScript, and split or defer non-critical embeds and dashboard work.",
      "effort": "large",
      "guidanceId": "identify-inp-causes",
      "guidanceCategory": "modern-web-guidance"
    },
    {
      "id": "F-12",
      "pathId": "home",
      "url": "https://www.sportybet.com/ng/",
      "principleId": "be-fast-and-stable",
      "principleCheckId": "visual-stability",
      "severity": "medium",
      "confidence": "high",
      "summary": "Mobile load produces visible layout shift",
      "evidence": "The mobile layout observer measured CLS 0.116 with seven shifts, including 0.063 and 0.042 shifts after four seconds; 31 images lacked dimensions.",
      "artifacts": [
        "evidence/layout-mobile.json",
        "evidence/images.json"
      ],
      "suggestedFix": "Reserve image and dynamic-panel space with width, height, and aspect-ratio, and stabilize late content.",
      "effort": "medium",
      "guidanceId": "visually-stable-font-fallbacks",
      "guidanceCategory": "modern-web-guidance"
    },
    {
      "id": "F-13",
      "pathId": "home",
      "url": "https://www.sportybet.com/ng/",
      "principleId": "be-fast-and-stable",
      "principleCheckId": "efficient-main-thread",
      "severity": "critical",
      "confidence": "high",
      "summary": "A multi-second startup task blocks the main thread",
      "evidence": "The trace found seven long tasks, including a 3,438.86 ms task, with 3,655.35 ms total blocking time.",
      "artifacts": [
        "evidence/home-trace-summary.json"
      ],
      "suggestedFix": "Profile the startup task, split synchronous initialization, schedule lower-priority work, and defer below-fold widgets.",
      "effort": "large",
      "guidanceId": "break-up-long-tasks",
      "guidanceCategory": "modern-web-guidance"
    },
    {
      "id": "F-14",
      "pathId": "home",
      "url": "https://www.sportybet.com/ng/",
      "principleId": "be-fast-and-stable",
      "principleCheckId": "efficient-resource-delivery",
      "severity": "high",
      "confidence": "high",
      "summary": "The page ships a heavy, inefficient dependency chain",
      "evidence": "The HAR recorded 201 requests and 6.66 MB transferred, including 17 stylesheets, 61 scripts, 9 fonts, multiple parser-inserted stylesheets, and large assets without cache headers.",
      "artifacts": [
        "evidence/home-summary.json",
        "evidence/home.har"
      ],
      "suggestedFix": "Consolidate critical CSS, subset and modernize fonts, defer embedded products, and add durable caching to fingerprinted assets.",
      "effort": "large",
      "guidanceId": "optimize-script-priority",
      "guidanceCategory": "modern-web-guidance"
    },
    {
      "id": "F-15",
      "pathId": "home",
      "url": "https://www.sportybet.com/ng/",
      "principleId": "be-fast-and-stable",
      "principleCheckId": "trim-unused-and-duplicate-code",
      "severity": "high",
      "confidence": "high",
      "summary": "Large amounts of JavaScript are unused on initial load",
      "evidence": "Lighthouse estimated 1,017 KiB of removable JavaScript, with several bundles between 48% and 75% unused.",
      "artifacts": [
        "evidence/lighthouse-summary.json"
      ],
      "suggestedFix": "Route-split desktop/mobile and embedded product code, remove duplicate analytics loaders, and load optional features on demand.",
      "effort": "large",
      "guidanceId": "identify-heavy-scripts",
      "guidanceCategory": "modern-web-guidance"
    },
    {
      "id": "F-16",
      "pathId": "home",
      "url": "https://www.sportybet.com/ng/",
      "principleId": "be-inclusive",
      "principleCheckId": "names-roles-labels",
      "severity": "high",
      "confidence": "high",
      "summary": "Forms, images, and links lack accessible names",
      "evidence": "The DOM probe found login and registration fields with no labels or aria-labels, the images audit found 22 missing alt attributes, and Lighthouse found an unnamed logo link.",
      "artifacts": [
        "evidence/platform-probe.json",
        "evidence/images.json",
        "evidence/lighthouse-summary.json"
      ],
      "suggestedFix": "Add persistent labels and correct autocomplete, meaningful alt where needed, empty alt for decoration, and accessible names for icon/logo links.",
      "effort": "medium",
      "guidanceId": "accessibility",
      "guidanceCategory": "modern-web-guidance"
    },
    {
      "id": "F-17",
      "pathId": "home",
      "url": "https://www.sportybet.com/ng/",
      "principleId": "be-inclusive",
      "principleCheckId": "structure-and-focus",
      "severity": "high",
      "confidence": "high",
      "summary": "Heading, landmark, and focus structure is weak",
      "evidence": "The home page has no h1, starts its sparse headings at h5, has no main landmark, and focused text inputs show no visible outline.",
      "artifacts": [
        "evidence/platform-probe.json"
      ],
      "suggestedFix": "Add a logical h1-led hierarchy and main landmark, remove hidden controls from tab order, and preserve visible focus for every control.",
      "effort": "medium",
      "guidanceId": "move-dom-element-without-losing-state",
      "guidanceCategory": "modern-web-guidance"
    },
    {
      "id": "F-18",
      "pathId": "home",
      "url": "https://www.sportybet.com/ng/",
      "principleId": "be-inclusive",
      "principleCheckId": "legible-text",
      "severity": "high",
      "confidence": "high",
      "summary": "Mobile text is rendered at an unreadably small scale",
      "evidence": "The 360 px screenshot scales a 1,000 px desktop surface down to 36%, making odds, labels, winner entries, and help text too small to read comfortably.",
      "artifacts": [
        "evidence/home-mobile.png",
        "evidence/layout-mobile.json"
      ],
      "suggestedFix": "Reflow content at narrow widths and use fluid, user-scalable type with comfortable spacing and line lengths.",
      "effort": "large",
      "guidanceId": "improve-text-layout-and-legibility",
      "guidanceCategory": "modern-web-guidance"
    },
    {
      "id": "F-19",
      "pathId": "home",
      "url": "https://www.sportybet.com/ng/",
      "principleId": "be-inclusive",
      "principleCheckId": "zoom-reflow-targets-and-media",
      "severity": "critical",
      "confidence": "high",
      "summary": "The mobile viewport disables useful scaling and reflow",
      "evidence": "Lighthouse found user-scalable=no or maximum-scale below 5, while the live page had no desktop viewport meta and rendered a fixed 1,000 px layout into 360 px.",
      "artifacts": [
        "evidence/lighthouse-summary.json",
        "evidence/layout-mobile.json"
      ],
      "suggestedFix": "Remove zoom restrictions, set width=device-width, initial-scale=1, and verify 400% zoom/reflow with appropriately sized targets.",
      "effort": "medium",
      "guidanceId": "accessibility",
      "guidanceCategory": "modern-web-guidance"
    },
    {
      "id": "F-20",
      "pathId": "home",
      "url": "https://www.sportybet.com/ng/",
      "principleId": "follow-best-practices",
      "principleCheckId": "sound-document-and-assets",
      "severity": "medium",
      "confidence": "high",
      "summary": "Images omit intrinsic dimensions and modern delivery hints",
      "evidence": "All 31 audited images lacked width and height, 22 below-fold images were not lazy-loaded, and 28 used legacy formats.",
      "artifacts": [
        "evidence/images.json"
      ],
      "suggestedFix": "Set intrinsic dimensions, lazy-load below-fold images, and deliver responsive modern formats where appropriate.",
      "effort": "medium",
      "guidanceId": "html",
      "guidanceCategory": "modern-web-guidance"
    },
    {
      "id": "F-21",
      "pathId": "home",
      "url": "https://www.sportybet.com/ng/",
      "principleId": "follow-best-practices",
      "principleCheckId": "browser-platform-hygiene",
      "severity": "medium",
      "confidence": "high",
      "summary": "Deprecated unload handling blocks browser lifecycle optimizations",
      "evidence": "Lighthouse found a deprecated unload listener and six BFCache failure reasons, including an unload handler in the main frame.",
      "artifacts": [
        "evidence/lighthouse-summary.json"
      ],
      "suggestedFix": "Replace unload with pagehide or visibilitychange where needed and remove avoidable BFCache blockers.",
      "effort": "medium",
      "guidanceId": "html",
      "guidanceCategory": "modern-web-guidance"
    },
    {
      "id": "F-22",
      "pathId": "home",
      "url": "https://www.sportybet.com/ng/",
      "principleId": "be-discoverable",
      "principleCheckId": "crawlable-and-mobile-friendly",
      "severity": "high",
      "confidence": "high",
      "summary": "The public page is a JavaScript shell for non-JS crawlers",
      "evidence": "The discoverability fetch returned HTTP 500 with 0% rendered-word coverage, no raw title or description, and only a JavaScript-required message in crawler view.",
      "artifacts": [
        "evidence/discoverability",
        "evidence/discoverability-crawler.png",
        "evidence/discoverability-rendered.png"
      ],
      "suggestedFix": "Server-render core content and metadata with stable successful responses, then hydrate enhancements on the client.",
      "effort": "large",
      "guidanceId": "html",
      "guidanceCategory": "modern-web-guidance"
    },
    {
      "id": "F-23",
      "pathId": "home",
      "url": "https://www.sportybet.com/ng/",
      "principleId": "be-private-and-secure",
      "principleCheckId": "secure-transport-and-headers",
      "severity": "high",
      "confidence": "high",
      "summary": "Security policy and cookie protections are incomplete",
      "evidence": "HTTPS, HSTS, nosniff and X-Frame-Options are present, but CSP is missing and all 11 observed cookies lacked Secure and used SameSite=None.",
      "artifacts": [
        "evidence/headers.json",
        "evidence/cookies.json"
      ],
      "suggestedFix": "Deploy a tested CSP and set Secure plus an appropriate Lax, Strict, or narrowly justified None SameSite policy on cookies.",
      "effort": "medium",
      "guidanceId": "security",
      "guidanceCategory": "modern-web-guidance"
    },
    {
      "id": "F-24",
      "pathId": "home",
      "url": "https://www.sportybet.com/ng/",
      "principleId": "be-private-and-secure",
      "principleCheckId": "data-minimisation-and-third-parties",
      "severity": "high",
      "confidence": "high",
      "summary": "Tracking and third-party collection are extensive by default",
      "evidence": "The page contacted 15 third-party origins, including five known tracker domains; 152 third-party requests transferred 6.21 MB.",
      "artifacts": [
        "evidence/trackers.json",
        "evidence/home-summary.json"
      ],
      "suggestedFix": "Minimize default analytics, gate advertising tags on valid consent, batch telemetry, and remove third parties without clear user value.",
      "effort": "large",
      "guidanceId": "privacy",
      "guidanceCategory": "modern-web-guidance"
    },
    {
      "id": "F-25",
      "pathId": "home",
      "url": "https://www.sportybet.com/ng/",
      "principleId": "be-private-and-secure",
      "principleCheckId": "defensive-browser-policies",
      "severity": "medium",
      "confidence": "high",
      "summary": "Permissions and content security policies are incomplete",
      "evidence": "Headers include HSTS, nosniff, SAMEORIGIN and strict-origin-when-cross-origin, but omit both Content-Security-Policy and Permissions-Policy.",
      "artifacts": [
        "evidence/headers.json"
      ],
      "suggestedFix": "Add a restrictive CSP with frame-ancestors and a least-privilege Permissions-Policy, then monitor violations before enforcement.",
      "effort": "medium",
      "guidanceId": "security",
      "guidanceCategory": "modern-web-guidance"
    },
    {
      "id": "F-26",
      "pathId": "home",
      "url": "https://www.sportybet.com/ng/",
      "principleId": "be-resilient",
      "principleCheckId": "progressive-enhancement",
      "severity": "critical",
      "confidence": "high",
      "summary": "Core content disappears without JavaScript",
      "evidence": "The crawler/no-JS capture shows only a JavaScript-required notice; raw fetch returned 500 and had 0% coverage of rendered content words.",
      "artifacts": [
        "evidence/discoverability",
        "evidence/discoverability-crawler.png"
      ],
      "suggestedFix": "Deliver navigation, odds context, responsible-gaming information, and account recovery as functional HTML before enhancing with JavaScript.",
      "effort": "large",
      "guidanceId": "flicker-free-client-side-ab-testing",
      "guidanceCategory": "modern-web-guidance"
    },
    {
      "id": "F-27",
      "pathId": "home",
      "url": "https://www.sportybet.com/ng/",
      "principleId": "be-resilient",
      "principleCheckId": "offline-and-installable",
      "severity": "medium",
      "confidence": "high",
      "summary": "The app-like betting experience has no web manifest or offline fallback signal",
      "evidence": "The platform probe found no manifest; the non-JS/failure state is only a generic JavaScript-required notice.",
      "artifacts": [
        "evidence/platform-probe.json",
        "evidence/discoverability-crawler.png"
      ],
      "suggestedFix": "Provide a web app manifest and an intentional offline or flaky-network recovery surface for this app-like service.",
      "effort": "medium",
      "guidanceId": "html",
      "guidanceCategory": "modern-web-guidance"
    },
    {
      "id": "F-28",
      "pathId": "home",
      "url": "https://www.sportybet.com/ng/",
      "principleId": "be-resilient",
      "principleCheckId": "network-and-http-failure-states",
      "severity": "high",
      "confidence": "high",
      "summary": "The origin failure state is a broken shell rather than recovery UI",
      "evidence": "The raw document request returned 500 and crawler view exposed no retry, status, or useful fallback beyond enabling JavaScript.",
      "artifacts": [
        "evidence/discoverability",
        "evidence/discoverability-crawler.png"
      ],
      "suggestedFix": "Return a resilient server-rendered error state with retry, status link, and preserved navigation when data or script loading fails.",
      "effort": "medium",
      "guidanceId": "persistent-toast-notifications",
      "guidanceCategory": "modern-web-guidance"
    },
    {
      "id": "F-29",
      "pathId": "home",
      "url": "https://www.sportybet.com/ng/",
      "principleId": "be-trustworthy",
      "principleCheckId": "no-dark-patterns",
      "severity": "high",
      "confidence": "high",
      "summary": "The sign-in form defaults to persistent session retention",
      "evidence": "The first viewport shows “Keep me signed in” selected by default next to sign-in, while deposit and registration prompts dominate the surrounding page.",
      "artifacts": [
        "evidence/home-desktop.png",
        "evidence/platform-probe.json"
      ],
      "suggestedFix": "Make persistent sign-in an explicit unchecked choice and explain the privacy/security implications in plain language.",
      "effort": "small",
      "guidanceId": "custom-button-actions",
      "guidanceCategory": "modern-web-guidance"
    },
    {
      "id": "F-30",
      "pathId": "recovery",
      "url": "https://www.sportybet.com/ng/profile/reset_password",
      "principleId": "be-trustworthy",
      "principleCheckId": "humane-error-handling",
      "severity": "medium",
      "confidence": "high",
      "summary": "Account recovery does not explain invalid input",
      "evidence": "A one-digit mobile number and Next attempt produced no visible field-level message or recovery instruction.",
      "artifacts": [
        "evidence/reset-invalid.png"
      ],
      "suggestedFix": "Validate only after interaction, explain the required number format, associate the message with the input, and announce it accessibly.",
      "effort": "small",
      "guidanceId": "forms",
      "guidanceCategory": "modern-web-guidance"
    },
    {
      "id": "F-31",
      "pathId": "home",
      "url": "https://www.sportybet.com/ng/",
      "principleId": "be-trustworthy",
      "principleCheckId": "trustworthy-input-assistance",
      "severity": "high",
      "confidence": "high",
      "summary": "Sign-in inputs explicitly disable browser assistance",
      "evidence": "The login phone and password inputs have autocomplete=off and no labels, preventing reliable autofill and password-manager semantics.",
      "artifacts": [
        "evidence/platform-probe.json"
      ],
      "suggestedFix": "Use tel/username and current-password autocomplete tokens, with persistent labels and suitable inputmode.",
      "effort": "small",
      "guidanceId": "autofill-sign-in-form",
      "guidanceCategory": "modern-web-guidance"
    },
    {
      "id": "F-32",
      "pathId": "home",
      "url": "https://www.sportybet.com/ng/",
      "principleId": "be-sustainable",
      "principleCheckId": "optimised-assets",
      "severity": "high",
      "confidence": "high",
      "summary": "Asset delivery wastes bytes and decoding work",
      "evidence": "The images audit found 28 legacy-format images, 22 below-fold images without lazy loading, 11 without srcset, and all 31 without intrinsic dimensions.",
      "artifacts": [
        "evidence/images.json"
      ],
      "suggestedFix": "Use responsive AVIF/WebP sources, intrinsic dimensions, and lazy loading for non-critical imagery.",
      "effort": "medium",
      "guidanceId": "deliver-optimized-decorative-images",
      "guidanceCategory": "modern-web-guidance"
    },
    {
      "id": "F-33",
      "pathId": "home",
      "url": "https://www.sportybet.com/ng/",
      "principleId": "be-sustainable",
      "principleCheckId": "no-wasteful-work",
      "severity": "high",
      "confidence": "high",
      "summary": "Startup work and network activity are disproportionate",
      "evidence": "The load performs 201 requests, 61 scripts, 62 fetch/XHR requests, and a 3.44 s main-thread task before the dashboard settles.",
      "artifacts": [
        "evidence/home-summary.json",
        "evidence/home-trace-summary.json"
      ],
      "suggestedFix": "Defer background panels and telemetry, batch fetches, and initialize only the visible core market surface.",
      "effort": "large",
      "guidanceId": "deprioritize-background-fetches",
      "guidanceCategory": "modern-web-guidance"
    },
    {
      "id": "F-34",
      "pathId": "home",
      "url": "https://www.sportybet.com/ng/",
      "principleId": "be-sustainable",
      "principleCheckId": "third-party-and-media-budget",
      "severity": "high",
      "confidence": "high",
      "summary": "Third-party code and fonts consume most transferred bytes",
      "evidence": "Third parties account for 152 requests and 6.21 MB, including 703.9 KB from Tag Manager and about 1.43 MB of fonts overall.",
      "artifacts": [
        "evidence/home-summary.json",
        "evidence/trackers.json"
      ],
      "suggestedFix": "Set a third-party budget, remove duplicate tag loads, self-host/subset fonts, and defer mini-game and promotional embeds.",
      "effort": "large",
      "guidanceId": "efficient-background-processing",
      "guidanceCategory": "modern-web-guidance"
    },
    {
      "id": "F-35",
      "pathId": "home",
      "url": "https://www.sportybet.com/ng/",
      "principleId": "be-agent-ready",
      "principleCheckId": "structured-agent-capabilities",
      "severity": "low",
      "confidence": "high",
      "summary": "Transactional capabilities are not exposed in a structured agent-safe form",
      "evidence": "The platform probe found no agent tooling signal and the no-JS representation exposes none of the visible market or account-recovery capability.",
      "artifacts": [
        "evidence/platform-probe.json",
        "evidence/discoverability-crawler.png"
      ],
      "suggestedFix": "For explicitly supported agent use cases, expose narrow, confirmable tools with clear schemas, authorization, and human confirmation for wagers.",
      "effort": "large",
      "guidanceId": "webmcp",
      "guidanceCategory": "modern-web-guidance"
    },
    {
      "id": "F-36",
      "pathId": "home",
      "url": "https://www.sportybet.com/ng/",
      "principleId": "be-memory-efficient",
      "principleCheckId": "bounded-footprint",
      "severity": "medium",
      "confidence": "high",
      "summary": "The initial page has a very large memory footprint",
      "evidence": "The baseline heap summary contains 3,123,569 nodes and 125.1 MB self size, including 523,055 native nodes and 464,305 closures, which is high for one dashboard view.",
      "artifacts": [
        "evidence/heap-baseline.heapsnapshot"
      ],
      "suggestedFix": "Lazy-mount below-fold and embedded products, reduce retained closures, and set memory budgets for initial and long-lived sessions.",
      "effort": "large",
      "guidanceId": "memory",
      "guidanceCategory": "modern-web-guidance"
    }
  ],
  "taskList": [
    {
      "id": "T-01",
      "title": "Serve a real responsive layout with a valid viewport declaration, intrinsic sizing, and mobile reflow instead of shrinking a fixed desktop canvas.",
      "priority": 1,
      "findingIds": [
        "F-07"
      ],
      "guidanceId": "fluid-scaling",
      "status": "open"
    },
    {
      "id": "T-02",
      "title": "Prioritize the LCP element, reduce startup JavaScript, and split or defer non-critical embeds and dashboard work.",
      "priority": 2,
      "findingIds": [
        "F-11"
      ],
      "guidanceId": "identify-inp-causes",
      "status": "open"
    },
    {
      "id": "T-03",
      "title": "Profile the startup task, split synchronous initialization, schedule lower-priority work, and defer below-fold widgets.",
      "priority": 3,
      "findingIds": [
        "F-13"
      ],
      "guidanceId": "break-up-long-tasks",
      "status": "open"
    },
    {
      "id": "T-04",
      "title": "Remove zoom restrictions, set width=device-width, initial-scale=1, and verify 400% zoom/reflow with appropriately sized targets.",
      "priority": 4,
      "findingIds": [
        "F-19"
      ],
      "guidanceId": "accessibility",
      "status": "open"
    },
    {
      "id": "T-05",
      "title": "Deliver navigation, odds context, responsible-gaming information, and account recovery as functional HTML before enhancing with JavaScript.",
      "priority": 5,
      "findingIds": [
        "F-26"
      ],
      "guidanceId": "flicker-free-client-side-ab-testing",
      "status": "open"
    },
    {
      "id": "T-06",
      "title": "Declare light and dark support early, then retint surfaces, text, controls, images, and browser chrome with prefers-color-scheme or light-dark().",
      "priority": 6,
      "findingIds": [
        "F-01"
      ],
      "guidanceId": "dark-mode",
      "status": "open"
    },
    {
      "id": "T-07",
      "title": "Remove or defer low-value promotional panels and reduce persistent framing around the primary odds and betslip task.",
      "priority": 7,
      "findingIds": [
        "F-06"
      ],
      "guidanceId": "overflow-clipping-control",
      "status": "open"
    },
    {
      "id": "T-08",
      "title": "Provide clear :focus-visible styles and bring interactive target boxes to an accessible touch size without removing native focus.",
      "priority": 8,
      "findingIds": [
        "F-09"
      ],
      "guidanceId": "css",
      "status": "open"
    },
    {
      "id": "T-09",
      "title": "Consolidate critical CSS, subset and modernize fonts, defer embedded products, and add durable caching to fingerprinted assets.",
      "priority": 9,
      "findingIds": [
        "F-14"
      ],
      "guidanceId": "optimize-script-priority",
      "status": "open"
    },
    {
      "id": "T-10",
      "title": "Route-split desktop/mobile and embedded product code, remove duplicate analytics loaders, and load optional features on demand.",
      "priority": 10,
      "findingIds": [
        "F-15"
      ],
      "guidanceId": "identify-heavy-scripts",
      "status": "open"
    },
    {
      "id": "T-11",
      "title": "Add persistent labels and correct autocomplete, meaningful alt where needed, empty alt for decoration, and accessible names for icon/logo links.",
      "priority": 11,
      "findingIds": [
        "F-16"
      ],
      "guidanceId": "accessibility",
      "status": "open"
    },
    {
      "id": "T-12",
      "title": "Add a logical h1-led hierarchy and main landmark, remove hidden controls from tab order, and preserve visible focus for every control.",
      "priority": 12,
      "findingIds": [
        "F-17"
      ],
      "guidanceId": "move-dom-element-without-losing-state",
      "status": "open"
    },
    {
      "id": "T-13",
      "title": "Reflow content at narrow widths and use fluid, user-scalable type with comfortable spacing and line lengths.",
      "priority": 13,
      "findingIds": [
        "F-18"
      ],
      "guidanceId": "improve-text-layout-and-legibility",
      "status": "open"
    },
    {
      "id": "T-14",
      "title": "Server-render core content and metadata with stable successful responses, then hydrate enhancements on the client.",
      "priority": 14,
      "findingIds": [
        "F-22"
      ],
      "guidanceId": "html",
      "status": "open"
    },
    {
      "id": "T-15",
      "title": "Deploy a tested CSP and set Secure plus an appropriate Lax, Strict, or narrowly justified None SameSite policy on cookies.",
      "priority": 15,
      "findingIds": [
        "F-23"
      ],
      "guidanceId": "security",
      "status": "open"
    },
    {
      "id": "T-16",
      "title": "Minimize default analytics, gate advertising tags on valid consent, batch telemetry, and remove third parties without clear user value.",
      "priority": 16,
      "findingIds": [
        "F-24"
      ],
      "guidanceId": "privacy",
      "status": "open"
    },
    {
      "id": "T-17",
      "title": "Return a resilient server-rendered error state with retry, status link, and preserved navigation when data or script loading fails.",
      "priority": 17,
      "findingIds": [
        "F-28"
      ],
      "guidanceId": "persistent-toast-notifications",
      "status": "open"
    },
    {
      "id": "T-18",
      "title": "Make persistent sign-in an explicit unchecked choice and explain the privacy/security implications in plain language.",
      "priority": 18,
      "findingIds": [
        "F-29"
      ],
      "guidanceId": "custom-button-actions",
      "status": "open"
    },
    {
      "id": "T-19",
      "title": "Use tel/username and current-password autocomplete tokens, with persistent labels and suitable inputmode.",
      "priority": 19,
      "findingIds": [
        "F-31"
      ],
      "guidanceId": "autofill-sign-in-form",
      "status": "open"
    },
    {
      "id": "T-20",
      "title": "Use responsive AVIF/WebP sources, intrinsic dimensions, and lazy loading for non-critical imagery.",
      "priority": 20,
      "findingIds": [
        "F-32"
      ],
      "guidanceId": "deliver-optimized-decorative-images",
      "status": "open"
    },
    {
      "id": "T-21",
      "title": "Defer background panels and telemetry, batch fetches, and initialize only the visible core market surface.",
      "priority": 21,
      "findingIds": [
        "F-33"
      ],
      "guidanceId": "deprioritize-background-fetches",
      "status": "open"
    },
    {
      "id": "T-22",
      "title": "Set a third-party budget, remove duplicate tag loads, self-host/subset fonts, and defer mini-game and promotional embeds.",
      "priority": 22,
      "findingIds": [
        "F-34"
      ],
      "guidanceId": "efficient-background-processing",
      "status": "open"
    },
    {
      "id": "T-23",
      "title": "Disable non-essential highlight and auto-advance animation inside prefers-reduced-motion: reduce.",
      "priority": 23,
      "findingIds": [
        "F-02"
      ],
      "guidanceId": "accessibility",
      "status": "open"
    },
    {
      "id": "T-24",
      "title": "Replace ad-hoc dropdown and disclosure controls with native select, details, popover, or dialog as appropriate.",
      "priority": 24,
      "findingIds": [
        "F-05"
      ],
      "guidanceId": "declarative-dialog-popover-control",
      "status": "open"
    },
    {
      "id": "T-25",
      "title": "Add container-type to reusable regions and use @container rules to recompose market rows, sidebars, and betslip modules.",
      "priority": 25,
      "findingIds": [
        "F-08"
      ],
      "guidanceId": "size-aware-styling",
      "status": "open"
    },
    {
      "id": "T-26",
      "title": "Validate after interaction, connect a specific error message to the field, and announce it through an accessible live region.",
      "priority": 26,
      "findingIds": [
        "F-10"
      ],
      "guidanceId": "accessible-error-announcement",
      "status": "open"
    },
    {
      "id": "T-27",
      "title": "Reserve image and dynamic-panel space with width, height, and aspect-ratio, and stabilize late content.",
      "priority": 27,
      "findingIds": [
        "F-12"
      ],
      "guidanceId": "visually-stable-font-fallbacks",
      "status": "open"
    },
    {
      "id": "T-28",
      "title": "Set intrinsic dimensions, lazy-load below-fold images, and deliver responsive modern formats where appropriate.",
      "priority": 28,
      "findingIds": [
        "F-20"
      ],
      "guidanceId": "html",
      "status": "open"
    },
    {
      "id": "T-29",
      "title": "Replace unload with pagehide or visibilitychange where needed and remove avoidable BFCache blockers.",
      "priority": 29,
      "findingIds": [
        "F-21"
      ],
      "guidanceId": "html",
      "status": "open"
    },
    {
      "id": "T-30",
      "title": "Add a restrictive CSP with frame-ancestors and a least-privilege Permissions-Policy, then monitor violations before enforcement.",
      "priority": 30,
      "findingIds": [
        "F-25"
      ],
      "guidanceId": "security",
      "status": "open"
    },
    {
      "id": "T-31",
      "title": "Provide a web app manifest and an intentional offline or flaky-network recovery surface for this app-like service.",
      "priority": 31,
      "findingIds": [
        "F-27"
      ],
      "guidanceId": "html",
      "status": "open"
    },
    {
      "id": "T-32",
      "title": "Validate only after interaction, explain the required number format, associate the message with the input, and announce it accessibly.",
      "priority": 32,
      "findingIds": [
        "F-30"
      ],
      "guidanceId": "forms",
      "status": "open"
    },
    {
      "id": "T-33",
      "title": "Lazy-mount below-fold and embedded products, reduce retained closures, and set memory budgets for initial and long-lived sessions.",
      "priority": 33,
      "findingIds": [
        "F-36"
      ],
      "guidanceId": "memory",
      "status": "open"
    },
    {
      "id": "T-34",
      "title": "Use same-document View Transitions for betslip and tab state changes, with a reduced-motion fallback.",
      "priority": 34,
      "findingIds": [
        "F-03"
      ],
      "guidanceId": "same-document-transitions",
      "status": "open"
    },
    {
      "id": "T-35",
      "title": "Use sticky chrome with a restrained scroll-state treatment so location and key actions remain understandable.",
      "priority": 35,
      "findingIds": [
        "F-04"
      ],
      "guidanceId": "shrinking-header-on-scroll",
      "status": "open"
    },
    {
      "id": "T-36",
      "title": "For explicitly supported agent use cases, expose narrow, confirmable tools with clear schemas, authorization, and human confirmation for wagers.",
      "priority": 36,
      "findingIds": [
        "F-35"
      ],
      "guidanceId": "webmcp",
      "status": "open"
    }
  ],
  "budget": {
    "pathCount": 5,
    "auditPasses": 1
  },
  "agent": "pi",
  "runId": "2026-07-21T19-47-00-140Z"
}
