{
  "url": "https://www.betika.com",
  "auditedAt": "2026-07-23T08:00:00.000Z",
  "mode": "report",
  "status": "completed",
  "statusDetail": "Coverage-complete representative audit of home betting, casino listing, registration, and failure-state surfaces.",
  "page": {
    "appType": "spa",
    "framework": "Vue-style client-rendered SPA",
    "notes": "Public Kenya betting/casino application. Fresh sessions show an advertising roadblock. Source was not provided."
  },
  "evidenceUsed": [
    "screenshot",
    "dom",
    "layout-metrics",
    "evaluate-probe",
    "trace",
    "har",
    "discoverability",
    "headers",
    "cookies",
    "trackers",
    "secrets",
    "images",
    "heap-summary",
    "axe-core",
    "lighthouse"
  ],
  "guidanceConsulted": [
    "dark-mode",
    "accessibility",
    "adapt-scrollbar-to-contrast-preferences",
    "same-document-transitions",
    "scrollytelling",
    "physics-based-easing",
    "shrinking-header-on-scroll",
    "anchor-positioning-tab-underline",
    "directional-navigation-transitions",
    "light-dismiss-a-dialog",
    "declarative-dialog-popover-control",
    "complex-shapes",
    "fluid-scaling",
    "size-aware-styling",
    "improve-text-layout-and-legibility",
    "forms",
    "accessible-error-announcement",
    "identify-inp-causes",
    "visually-stable-font-fallbacks",
    "break-up-long-tasks",
    "optimize-image-priority",
    "identify-heavy-scripts",
    "move-dom-element-without-losing-state",
    "css",
    "html",
    "security",
    "privacy",
    "passkeys",
    "flicker-free-client-side-ab-testing",
    "resilient-context-menus-and-nested-dropdowns",
    "persistent-toast-notifications",
    "translator",
    "support-global-calendar-systems",
    "coordinate-global-events",
    "search-hidden-content",
    "autofill-address-form",
    "autofill-payment-form",
    "deliver-optimized-decorative-images",
    "deprioritize-background-fetches",
    "webmcp",
    "language-model",
    "manage-recurring-intervals"
  ],
  "artifacts": [
    {
      "type": "other",
      "path": "evidence/axe-home.json",
      "caption": "axe home",
      "findingIds": [
        "F09",
        "F17",
        "F18",
        "F19",
        "F20",
        "F32"
      ]
    },
    {
      "type": "screenshot",
      "path": "evidence/betslip-selected.png",
      "caption": "betslip selected",
      "findingIds": []
    },
    {
      "type": "dom",
      "path": "evidence/casino-dom.json",
      "caption": "casino dom",
      "findingIds": []
    },
    {
      "type": "screenshot",
      "path": "evidence/casino-mobile.png",
      "caption": "casino mobile",
      "findingIds": []
    },
    {
      "type": "other",
      "path": "evidence/cookies.json",
      "caption": "cookies",
      "findingIds": [
        "F26"
      ]
    },
    {
      "type": "screenshot",
      "path": "evidence/discoverability-crawler.png",
      "caption": "discoverability crawler",
      "findingIds": [
        "F29"
      ]
    },
    {
      "type": "screenshot",
      "path": "evidence/discoverability-rendered.png",
      "caption": "discoverability rendered",
      "findingIds": []
    },
    {
      "type": "discoverability",
      "path": "evidence/discoverability.json",
      "caption": "discoverability",
      "findingIds": [
        "F29"
      ]
    },
    {
      "type": "other",
      "path": "evidence/headers.json",
      "caption": "headers",
      "findingIds": [
        "F26"
      ]
    },
    {
      "type": "heap",
      "path": "evidence/heap-baseline.json",
      "caption": "heap baseline",
      "findingIds": [
        "F39"
      ]
    },
    {
      "type": "heap",
      "path": "evidence/heap-post-scroll.json",
      "caption": "heap post scroll",
      "findingIds": [
        "F39"
      ]
    },
    {
      "type": "screenshot",
      "path": "evidence/home-dark-pref.png",
      "caption": "home dark pref",
      "findingIds": [
        "F02"
      ]
    },
    {
      "type": "screenshot",
      "path": "evidence/home-desktop.png",
      "caption": "home desktop",
      "findingIds": [
        "F01",
        "F10",
        "F30",
        "F33"
      ]
    },
    {
      "type": "dom",
      "path": "evidence/home-dom.json",
      "caption": "home dom",
      "findingIds": [
        "F32"
      ]
    },
    {
      "type": "screenshot",
      "path": "evidence/home-forced-colors.png",
      "caption": "home forced colors",
      "findingIds": []
    },
    {
      "type": "screenshot",
      "path": "evidence/home-light-pref.png",
      "caption": "home light pref",
      "findingIds": [
        "F02"
      ]
    },
    {
      "type": "layout",
      "path": "evidence/home-mobile-layout.json",
      "caption": "home mobile layout",
      "findingIds": [
        "F13"
      ]
    },
    {
      "type": "screenshot",
      "path": "evidence/home-mobile.png",
      "caption": "home mobile",
      "findingIds": [
        "F05",
        "F07"
      ]
    },
    {
      "type": "other",
      "path": "evidence/home-probe.json",
      "caption": "home probe",
      "findingIds": [
        "F04",
        "F06",
        "F08",
        "F30"
      ]
    },
    {
      "type": "har-summary",
      "path": "evidence/home-summary.json",
      "caption": "home summary",
      "findingIds": [
        "F15",
        "F27",
        "F37",
        "F38"
      ]
    },
    {
      "type": "trace-summary",
      "path": "evidence/home-trace-summary.json",
      "caption": "home trace summary",
      "findingIds": [
        "F12",
        "F14"
      ]
    },
    {
      "type": "trace",
      "path": "evidence/home-trace.json",
      "caption": "home trace",
      "findingIds": []
    },
    {
      "type": "har",
      "path": "evidence/home.har",
      "caption": "home",
      "findingIds": [
        "F15"
      ]
    },
    {
      "type": "other",
      "path": "evidence/images.json",
      "caption": "images",
      "findingIds": [
        "F13",
        "F17",
        "F22",
        "F36"
      ]
    },
    {
      "type": "lighthouse",
      "path": "evidence/lighthouse.json",
      "caption": "lighthouse",
      "findingIds": [
        "F12",
        "F14",
        "F16",
        "F21",
        "F23",
        "F24",
        "F25"
      ]
    },
    {
      "type": "screenshot",
      "path": "evidence/not-found-mobile.png",
      "caption": "not found mobile",
      "findingIds": [
        "F11"
      ]
    },
    {
      "type": "other",
      "path": "evidence/reduced-motion-probe.json",
      "caption": "reduced motion probe",
      "findingIds": [
        "F03"
      ]
    },
    {
      "type": "dom",
      "path": "evidence/register-dom.json",
      "caption": "register dom",
      "findingIds": []
    },
    {
      "type": "screenshot",
      "path": "evidence/register-invalid.png",
      "caption": "register invalid",
      "findingIds": [
        "F11",
        "F34"
      ]
    },
    {
      "type": "screenshot",
      "path": "evidence/register-mobile.png",
      "caption": "register mobile",
      "findingIds": [
        "F28"
      ]
    },
    {
      "type": "other",
      "path": "evidence/register-probe.json",
      "caption": "register probe",
      "findingIds": [
        "F09",
        "F19",
        "F28",
        "F34",
        "F35"
      ]
    },
    {
      "type": "other",
      "path": "evidence/secrets.json",
      "caption": "secrets",
      "findingIds": []
    },
    {
      "type": "other",
      "path": "evidence/service-worker-probe.json",
      "caption": "service worker probe",
      "findingIds": [
        "F31"
      ]
    },
    {
      "type": "other",
      "path": "evidence/site-signals.json",
      "caption": "site signals",
      "findingIds": [
        "F24",
        "F25",
        "F31"
      ]
    },
    {
      "type": "other",
      "path": "evidence/trackers.json",
      "caption": "trackers",
      "findingIds": [
        "F27",
        "F38"
      ]
    }
  ],
  "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": "a screenshot or computed background under an emulated prefers-color-scheme: dark condition will reveal whether surfaces re-tint; the page CSS / a color-scheme declaration is corroborating evidence. The model chooses the method.",
      "evidence": "Separate light- and dark-preference screenshots both rendered the same html.dark theme; the DOM contains a manual dark class and no root color-scheme declaration driven by the media preference.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/home-light-pref.png",
        "evidence/home-dark-pref.png"
      ],
      "findingIds": [
        "F02"
      ]
    },
    {
      "principleId": "respect-user-preferences",
      "checkId": "respects-reduced-motion",
      "status": "issues",
      "confidence": "high",
      "method": "a transition video, or an in-page probe of getAnimations()/computed animation under an emulated prefers-reduced-motion: reduce condition, can show whether motion stops. The model chooses.",
      "evidence": "Under prefers-reduced-motion: reduce, the probe still found a running 500 ms animation and found no prefers-reduced-motion rule.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/reduced-motion-probe.json"
      ],
      "findingIds": [
        "F03"
      ]
    },
    {
      "principleId": "respect-user-preferences",
      "checkId": "respects-contrast",
      "status": "pass",
      "confidence": "high",
      "method": "a screenshot under emulated prefers-contrast: more / forced-colors, or an axe/contrast probe, can show whether controls and text survive. The model chooses.",
      "evidence": "The forced-colors/prefers-contrast screenshot retained visible navigation labels, controls, and close affordance around the promotional image.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/home-probe.json"
      ]
    },
    {
      "principleId": "implement-natural-interactions",
      "checkId": "view-transitions",
      "status": "issues",
      "confidence": "high",
      "method": "a transition video of a route/state change shows whether it animates; the page source / ::view-transition usage corroborates. The model chooses.",
      "evidence": "The DOM/CSS feature probe found no View Transition rules, and route changes use full abrupt state swaps.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/home-probe.json"
      ],
      "findingIds": [
        "F04"
      ]
    },
    {
      "principleId": "implement-natural-interactions",
      "checkId": "scroll-driven-animations",
      "status": "not-applicable",
      "confidence": "high",
      "method": "source/CSS inspection for animation-timeline: scroll()/view(); a long-task / scroll-handler probe can flag the main-thread anti-pattern. The model chooses.",
      "evidence": "No scroll-linked parallax, scrollytelling, reveal, or carousel animation was present on the representative pages, so there is no scroll-linked implementation to assess.",
      "pathIds": [
        "home"
      ],
      "reason": "No scroll-linked parallax, scrollytelling, reveal, or carousel animation was present on the representative pages, so there is no scroll-linked implementation to assess."
    },
    {
      "principleId": "implement-natural-interactions",
      "checkId": "physical-gestures",
      "status": "pass",
      "confidence": "high",
      "method": "CSS inspection for scroll-snap / overscroll-behavior / physics-based easing vs custom pointermove listeners. The model chooses.",
      "evidence": "The mobile catalog uses native vertical scrolling and ordinary click/tap controls; no custom pointermove gesture layer was found in the DOM/CSS probe.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/home-probe.json"
      ]
    },
    {
      "principleId": "provide-guided-navigation",
      "checkId": "scroll-state-aware-chrome",
      "status": "issues",
      "confidence": "high",
      "method": "a transition video of scrolling, or CSS inspection for scroll-state container queries. The model chooses.",
      "evidence": "Mobile evidence shows top navigation, sports navigation, filters, and bottom navigation remain fixed/static while scrolling; the CSS probe found no scroll-state query.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/home-mobile.png"
      ],
      "findingIds": [
        "F05"
      ]
    },
    {
      "principleId": "provide-guided-navigation",
      "checkId": "anchored-positioning",
      "status": "not-applicable",
      "confidence": "high",
      "method": "CSS inspection for anchor-name / position-anchor / position-try on overlays; a screenshot of an open overlay near a viewport edge can show drift. The model chooses.",
      "evidence": "No tooltip, edge-positioned popover, or anchored transient menu was exposed in the representative public paths.",
      "pathIds": [
        "home"
      ],
      "reason": "No tooltip, edge-positioned popover, or anchored transient menu was exposed in the representative public paths."
    },
    {
      "principleId": "provide-guided-navigation",
      "checkId": "directs-attention",
      "status": "pass",
      "confidence": "high",
      "method": "CSS inspection for ::highlight / scroll-marker; a transition video can show whether attention is cued after navigation. The model chooses.",
      "evidence": "Mobile screenshots show selected Home/Casino destinations, selected filters, and active navigation state with distinct yellow/green treatment.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/home-probe.json"
      ]
    },
    {
      "principleId": "maximize-content-reduce-noise",
      "checkId": "no-intrusive-interruptions",
      "status": "issues",
      "confidence": "high",
      "method": "a screenshot on load, or a DOM probe for full-viewport overlays present before interaction. The model chooses.",
      "evidence": "The first-load desktop screenshot is almost entirely covered by an advertising roadblock; at the 780x493 evidence viewport its close button is outside the visible modal bounds.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/home-desktop.png"
      ],
      "findingIds": [
        "F01"
      ]
    },
    {
      "principleId": "maximize-content-reduce-noise",
      "checkId": "semantic-dismissible-primitives",
      "status": "issues",
      "confidence": "high",
      "method": "DOM/source inspection for popover / <dialog> / <details> vs custom overlay divs with manual dismiss handling. The model chooses.",
      "evidence": "The rendered overlay is a fixed DIV.modal mask; the probe found zero dialog, popover, and details elements.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/home-probe.json"
      ],
      "findingIds": [
        "F06"
      ]
    },
    {
      "principleId": "maximize-content-reduce-noise",
      "checkId": "reduced-chrome",
      "status": "issues",
      "confidence": "high",
      "method": "a screenshot plus layout metrics can show the proportion of the viewport given to chrome vs content. The model chooses.",
      "evidence": "The mobile home view stacks a header, sports strip, tabs, filters, promotional carousel, and bottom bar, substantially reducing the match-content area.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/home-mobile.png"
      ],
      "findingIds": [
        "F07"
      ]
    },
    {
      "principleId": "adapt-to-the-form-factor",
      "checkId": "responsive-no-horizontal-scroll",
      "status": "pass",
      "confidence": "high",
      "method": "layout metrics (scrollWidth vs innerWidth) and a screenshot at an emulated narrow mobile viewport reveal overflow. The model chooses.",
      "evidence": "At 360x800 the layout primitive measured scrollWidth=clientWidth=360 and 0 px horizontal overflow; home, casino, and registration screenshots reflow to one-column/mobile layouts.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/home-mobile-layout.json",
        "evidence/home-mobile.png"
      ]
    },
    {
      "principleId": "adapt-to-the-form-factor",
      "checkId": "component-level-responsiveness",
      "status": "issues",
      "confidence": "high",
      "method": "CSS inspection for @container / container-type; a computed-style probe of the same component in a wide vs narrow container shows whether it adapts. The model chooses.",
      "evidence": "The CSS/DOM probe found no @container rules on a component-rich responsive application; adaptation is viewport-wide only.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/home-probe.json"
      ],
      "findingIds": [
        "F08"
      ]
    },
    {
      "principleId": "adapt-to-the-form-factor",
      "checkId": "input-modality-aware",
      "status": "issues",
      "confidence": "high",
      "method": "a focus probe (focus an element, read the computed outline) or an axe target-size check; a screenshot of a focused control corroborates. The model chooses.",
      "evidence": "The viewport disables scaling, visible controls include 26-32 px targets, and the focused registration link computed outline-style none with no box shadow.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/register-probe.json",
        "evidence/axe-home.json"
      ],
      "findingIds": [
        "F09"
      ]
    },
    {
      "principleId": "support-core-task-success",
      "checkId": "clear-purpose-and-primary-action",
      "status": "pass",
      "confidence": "high",
      "method": "screenshot the first viewport and key scrolled states; inspect heading structure, nav labels, button text, and visual hierarchy; a task walkthrough can show whether the next action is obvious. The model chooses.",
      "evidence": "Home immediately identifies soccer betting with match odds, while registration clearly labels its purpose and primary Register action.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/home-probe.json"
      ]
    },
    {
      "principleId": "support-core-task-success",
      "checkId": "primary-flow-completion",
      "status": "issues",
      "confidence": "high",
      "method": "run the flow manually with screenshots/DOM snapshots at each step; compare expected vs actual path length; inspect form requirements, navigation continuity, and blockers. The model chooses.",
      "evidence": "The mandatory roadblock precedes the betting surface and, at the desktop evidence height, its dismiss control was measured above the viewport; this creates an avoidable detour/blocker before the core flow.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/home-desktop.png"
      ],
      "findingIds": [
        "F10"
      ]
    },
    {
      "principleId": "support-core-task-success",
      "checkId": "clear-system-state-and-recovery",
      "status": "issues",
      "confidence": "high",
      "method": "exercise network delay/failure, invalid input, empty data and success states; screenshot the state messaging and recovery controls; inspect whether browser history and focus remain sensible. The model chooses.",
      "evidence": "A deliberately unknown URL rendered the normal betting homepage with no 404/error explanation or recovery state; empty registration submission produced no visible field feedback.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/not-found-mobile.png",
        "evidence/register-invalid.png"
      ],
      "findingIds": [
        "F11"
      ]
    },
    {
      "principleId": "be-fast-and-stable",
      "checkId": "good-core-web-vitals",
      "status": "issues",
      "confidence": "high",
      "method": "Lighthouse reports LCP/CLS/TBT directly and the model may run it; layout metrics + a layout-shift observer + a long-task observer (the evidence primitives) give the same signal first-party. The model chooses.",
      "evidence": "Lighthouse measured LCP 34.1 s, TBT 940 ms, and CLS 0.134; the trace independently measured LCP 42.65 s.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/lighthouse.json",
        "evidence/home-trace-summary.json"
      ],
      "findingIds": [
        "F12"
      ]
    },
    {
      "principleId": "be-fast-and-stable",
      "checkId": "visual-stability",
      "status": "issues",
      "confidence": "high",
      "method": "the layout primitive's CLS observer captures shifts; a transition video of the first seconds shows content jumping. The model chooses.",
      "evidence": "The mobile layout observer recorded CLS 0.779 with a 0.664 shift; 21 of 25 images lack explicit dimensions.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/home-mobile-layout.json",
        "evidence/images.json"
      ],
      "findingIds": [
        "F13"
      ]
    },
    {
      "principleId": "be-fast-and-stable",
      "checkId": "efficient-main-thread",
      "status": "issues",
      "confidence": "high",
      "method": "the layout primitive records long tasks; a heap summary shows the object population; Lighthouse reports TBT. The model chooses.",
      "evidence": "Lighthouse measured 940 ms TBT; the trace recorded three long tasks up to 107 ms and 112 ms total blocking time in its capture.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/lighthouse.json",
        "evidence/home-trace-summary.json"
      ],
      "findingIds": [
        "F14"
      ]
    },
    {
      "principleId": "be-fast-and-stable",
      "checkId": "efficient-resource-delivery",
      "status": "issues",
      "confidence": "high",
      "method": "a HAR summary can reveal cache headers, redirects, render-blocking candidates, weight offenders and dependency shape; a trace/Lighthouse insight report can corroborate LCP discovery, render-blocking, font-display and document latency. The model chooses.",
      "evidence": "HAR recorded 172 requests and 5.86 MB transferred, parser-blocking CSS plus init.js, 12 redirects, and large/slow scripts and banners.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/home-summary.json",
        "evidence/home.har"
      ],
      "findingIds": [
        "F15"
      ]
    },
    {
      "principleId": "be-fast-and-stable",
      "checkId": "trim-unused-and-duplicate-code",
      "status": "issues",
      "confidence": "high",
      "method": "Lighthouse/trace/code-coverage style evidence can flag unused JS/CSS, duplicated JavaScript and legacy code; a HAR summary shows third-party byte cost and request count. The model chooses.",
      "evidence": "Lighthouse estimated 1,450 KiB unused JavaScript across 16 resources and 35 KiB unused CSS.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/lighthouse.json"
      ],
      "findingIds": [
        "F16"
      ]
    },
    {
      "principleId": "be-inclusive",
      "checkId": "names-roles-labels",
      "status": "issues",
      "confidence": "high",
      "method": "axe-core (injectable via the evaluate primitive) or Lighthouse's a11y audits enumerate these; a DOM probe of the accessibility-relevant attributes is a first-party alternative. The model chooses.",
      "evidence": "axe found two unnamed buttons, six unnamed links, and an unlabeled form element; the image audit also found five images without alt text.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/axe-home.json",
        "evidence/images.json"
      ],
      "findingIds": [
        "F17"
      ]
    },
    {
      "principleId": "be-inclusive",
      "checkId": "sufficient-contrast",
      "status": "issues",
      "confidence": "high",
      "method": "axe contrast rules, a Lighthouse contrast audit, or an in-page probe computing contrast ratios from computed colours. The model chooses.",
      "evidence": "axe found ten contrast failures in the direct run, including Register and sports-navigation labels; Lighthouse also failed color-contrast.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/axe-home.json"
      ],
      "findingIds": [
        "F18"
      ]
    },
    {
      "principleId": "be-inclusive",
      "checkId": "structure-and-focus",
      "status": "issues",
      "confidence": "high",
      "method": "axe/Lighthouse structural audits; a focus-walk probe (tab through, read activeElement + computed outline) is a first-party alternative. The model chooses.",
      "evidence": "axe found content outside landmarks, an invalid list item, and a non-keyboard-focusable scrolling region; the focus probe found no visible outline on the tested registration link.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/axe-home.json",
        "evidence/register-probe.json"
      ],
      "findingIds": [
        "F19"
      ]
    },
    {
      "principleId": "be-inclusive",
      "checkId": "legible-text",
      "status": "pass",
      "confidence": "high",
      "method": "a screenshot of body and heading text, plus CSS inspection for text-wrap / text alignment / font fallback handling. The model chooses.",
      "evidence": "Registration and casino mobile screenshots show readable text sizes, consistent alignment, and no text clipping in the representative viewports.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/home-probe.json"
      ]
    },
    {
      "principleId": "be-inclusive",
      "checkId": "zoom-reflow-targets-and-media",
      "status": "issues",
      "confidence": "high",
      "method": "Lighthouse/axe target-size, meta-viewport and media-caption audits are useful signals; screenshots at narrow and zoomed conditions plus DOM/media inspection can corroborate. The model chooses.",
      "evidence": "The viewport declares maximum-scale=1,user-scalable=0; axe/Lighthouse fail the viewport zoom audit, and several controls are below a comfortable 44 px touch target.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/axe-home.json"
      ],
      "findingIds": [
        "F20"
      ]
    },
    {
      "principleId": "follow-best-practices",
      "checkId": "no-console-errors",
      "status": "issues",
      "confidence": "high",
      "method": "capture Runtime/Log CDP events, or a probe that reads collected errors; Lighthouse reports this too. The model chooses.",
      "evidence": "Lighthouse captured four browser console errors during load.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/lighthouse.json"
      ],
      "findingIds": [
        "F21"
      ]
    },
    {
      "principleId": "follow-best-practices",
      "checkId": "sound-document-and-assets",
      "status": "issues",
      "confidence": "high",
      "method": "a DOM/source probe for doctype/charset/img dimensions; CSS inspection for repetition; Lighthouse best-practices audits cover the rest. The model chooses.",
      "evidence": "The document has a valid doctype and charset, but 21/25 images lack explicit dimensions and 20/25 are oversized for display.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/images.json"
      ],
      "findingIds": [
        "F22"
      ]
    },
    {
      "principleId": "follow-best-practices",
      "checkId": "browser-platform-hygiene",
      "status": "issues",
      "confidence": "high",
      "method": "Lighthouse best-practices audits and DevTools inspector/deprecation signals can surface these; DOM/source probes can verify paste handlers and prompt timing. The model chooses.",
      "evidence": "Lighthouse found three deprecated-API warnings, 12 large first-party scripts without valid source maps, and a DevTools inspector issue.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/lighthouse.json"
      ],
      "findingIds": [
        "F23"
      ]
    },
    {
      "principleId": "be-discoverable",
      "checkId": "title-and-description",
      "status": "pass",
      "confidence": "high",
      "method": "a DOM probe reads <title> and meta[name=description]; Lighthouse SEO audits cover the same ground. The model chooses.",
      "evidence": "The rendered home page has a descriptive soccer-betting title and meta description; the registration and casino routes also have route-specific titles.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/home-probe.json",
        "evidence/site-signals.json"
      ]
    },
    {
      "principleId": "be-discoverable",
      "checkId": "crawlable-and-mobile-friendly",
      "status": "issues",
      "confidence": "high",
      "method": "a DOM probe for anchor hrefs, viewport meta, and robots; Lighthouse SEO audits corroborate. The model chooses.",
      "evidence": "Lighthouse found 13 non-crawlable anchors; the viewport prevents zoom even though robots.txt allows public routes.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/lighthouse.json",
        "evidence/site-signals.json"
      ],
      "findingIds": [
        "F24"
      ]
    },
    {
      "principleId": "be-discoverable",
      "checkId": "canonical-and-indexing-signals",
      "status": "issues",
      "confidence": "high",
      "method": "inspect response status and headers, <link rel=canonical>, hreflang links, robots meta, robots.txt and sitemap.xml; Lighthouse SEO audits cover several of these. The model chooses.",
      "evidence": "Lighthouse reports no valid canonical, and fetching /sitemap.xml returned the application HTML shell rather than XML sitemap entries.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/lighthouse.json",
        "evidence/site-signals.json"
      ],
      "findingIds": [
        "F25"
      ]
    },
    {
      "principleId": "be-discoverable",
      "checkId": "structured-and-shareable-metadata",
      "status": "pass",
      "confidence": "high",
      "method": "inspect JSON-LD/microdata and social preview tags against visible content; Lighthouse has a manual structured-data audit, and ad-hoc probes can parse schema.org blocks. The model chooses.",
      "evidence": "The rendered homepage exposes Open Graph title, description, URL and image plus one JSON-LD block aligned with the visible soccer-betting page.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/home-probe.json",
        "evidence/site-signals.json"
      ]
    },
    {
      "principleId": "be-private-and-secure",
      "checkId": "secure-transport-and-headers",
      "status": "issues",
      "confidence": "high",
      "method": "inspect response headers / page protocol via an evaluate probe or the network layer; Lighthouse best-practices flags HTTPS and CSP issues. The model chooses.",
      "evidence": "HTTPS is used, but the headers primitive found no CSP, HSTS, nosniff, frame protection, Referrer-Policy, or Permissions-Policy; the cookie audit found 24 flagged cookies including non-Secure values.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/headers.json",
        "evidence/cookies.json"
      ],
      "findingIds": [
        "F26"
      ]
    },
    {
      "principleId": "be-private-and-secure",
      "checkId": "data-minimisation-and-third-parties",
      "status": "issues",
      "confidence": "high",
      "method": "inspect network requests and third-party origins; a probe of analytics/beacon calls. The model chooses.",
      "evidence": "The tracker probe found 58 third-party origins and 15 known tracker domains on first load; HAR attributed 146 requests and 4.67 MB to third-party origins.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/trackers.json",
        "evidence/home-summary.json"
      ],
      "findingIds": [
        "F27"
      ]
    },
    {
      "principleId": "be-private-and-secure",
      "checkId": "in-context-permissions-and-modern-auth",
      "status": "issues",
      "confidence": "high",
      "method": "a probe for permission requests fired on load; source inspection for passkey / WebAuthn / navigator.credentials usage in auth flows. The model chooses.",
      "evidence": "No permission prompt fired on load, but registration exposes password-only account creation and the probes found no passkey/WebAuthn affordance.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/register-probe.json",
        "evidence/register-mobile.png"
      ],
      "findingIds": [
        "F28"
      ]
    },
    {
      "principleId": "be-private-and-secure",
      "checkId": "defensive-browser-policies",
      "status": "issues",
      "confidence": "high",
      "method": "inspect response headers and browser security state; Lighthouse/DevTools security audits can corroborate HSTS, clickjacking, Trusted Types, origin isolation and third-party cookie findings. The model chooses.",
      "evidence": "The headers primitive found no clickjacking defense, CSP/frame-ancestors, HSTS, Referrer-Policy, or Permissions-Policy.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/headers.json",
        "evidence/cookies.json"
      ],
      "findingIds": [
        "F26"
      ]
    },
    {
      "principleId": "be-resilient",
      "checkId": "progressive-enhancement",
      "status": "issues",
      "confidence": "high",
      "method": "load with scripting disabled or compare a no-JS fetch of the HTML against the rendered page; check for Baseline-aware fallbacks in source. The model chooses.",
      "evidence": "Discoverability measured only 2% raw-HTML content coverage, no raw H1/title, and classified the page as a JavaScript shell.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/discoverability.json",
        "evidence/discoverability-crawler.png"
      ],
      "findingIds": [
        "F29"
      ]
    },
    {
      "principleId": "be-resilient",
      "checkId": "resilient-runtime-behaviour",
      "status": "issues",
      "confidence": "high",
      "method": "exercise menus near viewport edges with a screenshot; a probe of async/visibility behaviour. The model chooses.",
      "evidence": "The roadblock modal is a custom fixed DIV and its desktop close button was measured at y=-89, outside the 493 px viewport, leaving the overlay cut off.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/home-desktop.png",
        "evidence/home-probe.json"
      ],
      "findingIds": [
        "F30"
      ]
    },
    {
      "principleId": "be-resilient",
      "checkId": "offline-and-installable",
      "status": "issues",
      "confidence": "high",
      "method": "a probe for a service worker registration and a web app manifest; test behaviour offline. The model chooses.",
      "evidence": "A manifest exists, but the service-worker probe found zero registrations and zero caches, so this app-like site has no evidenced offline fallback.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/service-worker-probe.json",
        "evidence/site-signals.json"
      ],
      "findingIds": [
        "F31"
      ]
    },
    {
      "principleId": "be-resilient",
      "checkId": "network-and-http-failure-states",
      "status": "issues",
      "confidence": "high",
      "method": "simulate failed fetches/offline mode or inspect representative 404/500 routes; screenshots and DOM snapshots of error/loading/empty states show whether recovery is possible. The model chooses.",
      "evidence": "The unknown-route screenshot silently falls back to the betting homepage instead of showing an intentional not-found state or recovery explanation.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/not-found-mobile.png",
        "evidence/register-invalid.png"
      ],
      "findingIds": [
        "F11"
      ]
    },
    {
      "principleId": "be-internationalised",
      "checkId": "lang-dir-and-logical-properties",
      "status": "issues",
      "confidence": "high",
      "method": "a DOM probe for <html lang>/dir and CSS inspection for logical vs physical properties. The model chooses.",
      "evidence": "Across home, casino, and registration the html lang value is empty; axe/Lighthouse fail html-has-lang.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/axe-home.json",
        "evidence/home-dom.json"
      ],
      "findingIds": [
        "F32"
      ]
    },
    {
      "principleId": "be-internationalised",
      "checkId": "locale-aware-data",
      "status": "pass",
      "confidence": "high",
      "method": "source inspection for Intl.* usage vs hand-rolled formatting; a probe of rendered dates/numbers under a different locale. The model chooses.",
      "evidence": "Visible prices use KES and match schedules use a Kenya-appropriate day/month and 24-hour presentation on the localized /en-ke route.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/home-dom.json",
        "evidence/home-mobile.png"
      ]
    },
    {
      "principleId": "be-internationalised",
      "checkId": "time-zone-correctness",
      "status": "pass",
      "confidence": "medium",
      "method": "source inspection for time-zone-aware date handling vs naive local Date math. The model chooses.",
      "evidence": "Representative match schedules consistently render one localized time convention for the Kenya route; no contradictory or ambiguous cross-zone event state was observed.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/home-dom.json",
        "evidence/home-mobile.png"
      ]
    },
    {
      "principleId": "be-trustworthy",
      "checkId": "no-dark-patterns",
      "status": "issues",
      "confidence": "high",
      "method": "a screenshot of consent/upsell/cancel flows; source inspection for declarative button actions vs misleading controls. The model chooses.",
      "evidence": "An unsolicited, full-screen gambling promotion interrupts every fresh session before content and uses a dominant PLAY NOW action while dismissal is not visible at the desktop evidence height.",
      "pathIds": [
        "registration"
      ],
      "artifacts": [
        "evidence/home-desktop.png"
      ],
      "findingIds": [
        "F33"
      ]
    },
    {
      "principleId": "be-trustworthy",
      "checkId": "humane-error-handling",
      "status": "issues",
      "confidence": "high",
      "method": "exercise a form, submit invalid input, and observe timing and clarity of errors via a screenshot or a :user-invalid / aria-invalid probe. The model chooses.",
      "evidence": "Submitting the empty registration state produced no visible error announcement; inputs also lack required semantics and field-specific invalid state.",
      "pathIds": [
        "registration"
      ],
      "artifacts": [
        "evidence/register-invalid.png",
        "evidence/register-probe.json"
      ],
      "findingIds": [
        "F34"
      ]
    },
    {
      "principleId": "be-trustworthy",
      "checkId": "trustworthy-input-assistance",
      "status": "issues",
      "confidence": "high",
      "method": "source/DOM inspection for autocomplete attributes on form fields; a probe of autofill affordances. The model chooses.",
      "evidence": "Phone and password fields use generic autocomplete=\"on\" rather than tel/new-password tokens, reducing reliable autofill and password-manager assistance.",
      "pathIds": [
        "registration"
      ],
      "artifacts": [
        "evidence/register-probe.json"
      ],
      "findingIds": [
        "F35"
      ]
    },
    {
      "principleId": "be-trustworthy",
      "checkId": "safe-commercial-and-account-flows",
      "status": "pass",
      "confidence": "high",
      "method": "walkthrough checkout/subscription/auth/account flows when present; screenshot pricing, confirmation, cancellation and reauthentication states; inspect passkey/autocomplete support for sign-in and payment. The model chooses.",
      "evidence": "The registration screenshot presents the age requirement, terms/privacy links, confirmation checkbox, and account-code alternative before submission.",
      "pathIds": [
        "registration"
      ],
      "artifacts": [
        "evidence/home-probe.json"
      ]
    },
    {
      "principleId": "be-sustainable",
      "checkId": "optimised-assets",
      "status": "issues",
      "confidence": "high",
      "method": "inspect transferred image bytes vs displayed size; source inspection for modern formats and resolution handling. The model chooses.",
      "evidence": "Image audit found 20 oversized images, 18 without srcset, and 20 legacy-format assets; banner originals reach 2000-2779 px for a 764 px display.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/images.json"
      ],
      "findingIds": [
        "F36"
      ]
    },
    {
      "principleId": "be-sustainable",
      "checkId": "no-wasteful-work",
      "status": "issues",
      "confidence": "high",
      "method": "a long-task / network probe for background fetches and processing while idle or backgrounded. The model chooses.",
      "evidence": "The page starts 172 requests, 51 scripts, 56 XHR/fetches, multiple analytics stacks, and ships an uncompressed 268 KB terms JSON on initial load.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/home-summary.json"
      ],
      "findingIds": [
        "F37"
      ]
    },
    {
      "principleId": "be-sustainable",
      "checkId": "third-party-and-media-budget",
      "status": "issues",
      "confidence": "high",
      "method": "a HAR summary shows third-party bytes, font/media weight and caching; screenshots/video reveal autoplay and decorative media; trace/layout evidence shows whether media/animation keeps work running. The model chooses.",
      "evidence": "HAR records 4.67 MB third-party transfer and 2.52 MB of images; tracker evidence identifies 58 third-party origins and 15 known trackers.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/home-summary.json",
        "evidence/trackers.json"
      ],
      "findingIds": [
        "F38"
      ]
    },
    {
      "principleId": "be-agent-ready",
      "checkId": "structured-agent-capabilities",
      "status": "not-applicable",
      "confidence": "high",
      "method": "source inspection for WebMCP / agentic-tool registration and agent-readable affordances. The model chooses.",
      "evidence": "For a regulated gambling service, autonomous agent actions are not an appropriate default without an explicit, safety-reviewed agent-facing scope; none was declared.",
      "pathIds": [
        "home"
      ],
      "reason": "For a regulated gambling service, autonomous agent actions are not an appropriate default without an explicit, safety-reviewed agent-facing scope; none was declared."
    },
    {
      "principleId": "be-agent-ready",
      "checkId": "on-device-inference",
      "status": "not-applicable",
      "confidence": "high",
      "method": "source inspection for built-in AI (language model / summariser) usage. The model chooses.",
      "evidence": "No user task in the audited betting, casino, or registration surfaces requires on-device generative inference.",
      "pathIds": [
        "home"
      ],
      "reason": "No user task in the audited betting, casino, or registration surfaces requires on-device generative inference."
    },
    {
      "principleId": "be-memory-efficient",
      "checkId": "no-leak-under-repeated-interaction",
      "status": "pass",
      "confidence": "high",
      "method": "compare heap snapshots for retained growth - a baseline, then one taken after repeating the interaction with `--interact` about 10x (the memory-tracer methodology: baseline -> repeat -> post -> compare). Performance.getMetrics (JSHeapUsedSize, Nodes) across the same before/after window is corroboration. If Chrome DevTools MCP is available, follow its memory-leak-debugging skill: capture baseline, target, and final snapshots, then use memlab or the provided comparison workflow rather than reading",
      "evidence": "After ten representative casino catalog scroll cycles, heap self-size grew 744,018 bytes (1.15%) from a separate fresh baseline, with no evidence of unbounded retained growth.",
      "pathIds": [
        "casino"
      ],
      "artifacts": [
        "evidence/heap-baseline.json",
        "evidence/heap-post-scroll.json"
      ]
    },
    {
      "principleId": "be-memory-efficient",
      "checkId": "bounded-footprint",
      "status": "issues",
      "confidence": "high",
      "method": "a single `heap` summary's totals (nodeCount, totalSelfSizeBytes, constructor population) plus Performance.getMetrics (Nodes, JSHeapUsedSize) give the current footprint to judge against the page's purpose. Chrome DevTools MCP heap snapshots and memlab snapshot analysis can provide the same memory distribution when available. Read summaries or derived analysis, never raw snapshots unless a dedicated heap-analysis tool is doing the analysis. The model chooses.",
      "evidence": "A single casino state retained about 64.7 MB across 1.18 million heap nodes, a disproportionate footprint for a game-listing view before gameplay.",
      "pathIds": [
        "casino"
      ],
      "artifacts": [
        "evidence/heap-baseline.json",
        "evidence/heap-post-scroll.json"
      ],
      "findingIds": [
        "F39"
      ]
    },
    {
      "principleId": "be-memory-efficient",
      "checkId": "no-detached-dom-or-unbounded-listeners",
      "status": "pass",
      "confidence": "high",
      "method": "the `heap` summary by constructor (Detached* nodes) compared across a before/after pair shows a growing detached-DOM population; an `evaluate` probe can sample listener/timer counts (e.g. getEventListeners-style counting, or instrumenting addEventListener/setInterval) before and after the repeated interaction to spot growth. Chrome DevTools MCP heap snapshots plus the memory-leak-debugging skill's common-leak guidance can corroborate detached DOM, listeners, closures, globals, and unbounded cach",
      "evidence": "Neither heap summary exposed Detached* among top constructors, and the repeated-scroll comparison showed only 1.15% total self-size growth.",
      "pathIds": [
        "casino"
      ],
      "artifacts": [
        "evidence/heap-baseline.json",
        "evidence/heap-post-scroll.json"
      ]
    }
  ],
  "principleOutcomes": [
    {
      "principleId": "respect-user-preferences",
      "expectation": "default",
      "status": "issues",
      "findingIds": [
        "F02",
        "F03"
      ]
    },
    {
      "principleId": "implement-natural-interactions",
      "expectation": "default",
      "status": "issues",
      "findingIds": [
        "F04"
      ]
    },
    {
      "principleId": "provide-guided-navigation",
      "expectation": "default",
      "status": "issues",
      "findingIds": [
        "F05"
      ]
    },
    {
      "principleId": "maximize-content-reduce-noise",
      "expectation": "default",
      "status": "issues",
      "findingIds": [
        "F01",
        "F06",
        "F07"
      ]
    },
    {
      "principleId": "adapt-to-the-form-factor",
      "expectation": "default",
      "status": "issues",
      "findingIds": [
        "F08",
        "F09"
      ]
    },
    {
      "principleId": "support-core-task-success",
      "expectation": "default",
      "status": "issues",
      "findingIds": [
        "F10",
        "F11"
      ]
    },
    {
      "principleId": "be-fast-and-stable",
      "expectation": "default",
      "status": "issues",
      "findingIds": [
        "F12",
        "F13",
        "F14",
        "F15",
        "F16"
      ]
    },
    {
      "principleId": "be-inclusive",
      "expectation": "default",
      "status": "issues",
      "findingIds": [
        "F17",
        "F18",
        "F19",
        "F20"
      ]
    },
    {
      "principleId": "follow-best-practices",
      "expectation": "default",
      "status": "issues",
      "findingIds": [
        "F21",
        "F22",
        "F23"
      ]
    },
    {
      "principleId": "be-discoverable",
      "expectation": "default",
      "status": "issues",
      "findingIds": [
        "F24",
        "F25"
      ]
    },
    {
      "principleId": "be-private-and-secure",
      "expectation": "default",
      "status": "issues",
      "findingIds": [
        "F26",
        "F27",
        "F28"
      ]
    },
    {
      "principleId": "be-resilient",
      "expectation": "contextual",
      "status": "issues",
      "findingIds": [
        "F29",
        "F30",
        "F31",
        "F11"
      ]
    },
    {
      "principleId": "be-internationalised",
      "expectation": "contextual",
      "status": "issues",
      "findingIds": [
        "F32"
      ]
    },
    {
      "principleId": "be-trustworthy",
      "expectation": "default",
      "status": "issues",
      "findingIds": [
        "F33",
        "F34",
        "F35"
      ]
    },
    {
      "principleId": "be-sustainable",
      "expectation": "contextual",
      "status": "issues",
      "findingIds": [
        "F36",
        "F37",
        "F38"
      ]
    },
    {
      "principleId": "be-agent-ready",
      "expectation": "contextual",
      "status": "not-applicable",
      "reason": "All checks were judged contextually not applicable for this regulated site and audited scope."
    },
    {
      "principleId": "be-memory-efficient",
      "expectation": "default",
      "status": "issues",
      "findingIds": [
        "F39"
      ]
    }
  ],
  "paths": [
    {
      "id": "home",
      "description": "Homepage betting archetype and primary odds-selection entry; tested desktop/mobile, preferences, performance, privacy, accessibility, crawler view, and unknown-route recovery.",
      "url": "https://www.betika.com/en-ke/",
      "conditions": [
        "fresh session",
        "780x493 desktop",
        "360x800 mobile",
        "prefers-color-scheme light/dark",
        "prefers-reduced-motion reduce",
        "forced-colors active",
        "crawler without JavaScript"
      ],
      "result": "issues"
    },
    {
      "id": "casino",
      "description": "Casino listing archetype representing image-dense game catalogs; tested mobile layout and repeated catalog scrolling for memory.",
      "url": "https://www.betika.com/en-ke/casino",
      "conditions": [
        "360x800 mobile",
        "10 repeated catalog scroll cycles"
      ],
      "result": "issues"
    },
    {
      "id": "registration",
      "description": "Primary account-creation form; inspected labels, autofill, focus, terms, password flow, and empty submission behavior without creating an account.",
      "url": "https://www.betika.com/en-ke/register",
      "conditions": [
        "360x800 mobile",
        "keyboard focus probe",
        "empty submit"
      ],
      "result": "issues"
    },
    {
      "id": "not-found",
      "description": "Unknown-route recovery probe representing HTTP/navigation failure handling.",
      "url": "https://www.betika.com/en-ke/not-a-real-page-web-uplift",
      "conditions": [
        "360x800 mobile"
      ],
      "result": "issues"
    }
  ],
  "findings": [
    {
      "id": "F01",
      "severity": "critical",
      "confidence": "high",
      "summary": "An advertising roadblock obscures the core experience on load",
      "evidence": "The first-load desktop screenshot is almost entirely covered by an advertising roadblock; at the 780x493 evidence viewport its close button is outside the visible modal bounds.",
      "suggestedFix": "Replace the automatic roadblock with an in-flow promotion or a semantic, focus-managed dialog whose close control is always visible.",
      "guidanceId": "light-dismiss-a-dialog",
      "guidanceCategory": "user-experience",
      "effort": "medium",
      "pathId": "home",
      "url": "https://www.betika.com/en-ke/",
      "principleId": "maximize-content-reduce-noise",
      "principleCheckId": "no-intrusive-interruptions",
      "artifacts": [
        "evidence/home-desktop.png"
      ]
    },
    {
      "id": "F02",
      "severity": "medium",
      "confidence": "high",
      "summary": "Theme is not driven by the system color preference",
      "evidence": "Separate light- and dark-preference screenshots both rendered the same html.dark theme; the DOM contains a manual dark class and no root color-scheme declaration driven by the media preference.",
      "suggestedFix": "Declare color-scheme on the root and default theme tokens from prefers-color-scheme, preserving any manual override.",
      "guidanceId": "dark-mode",
      "guidanceCategory": "user-experience",
      "effort": "medium",
      "pathId": "home",
      "url": "https://www.betika.com/en-ke/",
      "principleId": "respect-user-preferences",
      "principleCheckId": "respects-color-scheme",
      "artifacts": [
        "evidence/home-light-pref.png",
        "evidence/home-dark-pref.png"
      ]
    },
    {
      "id": "F03",
      "severity": "medium",
      "confidence": "high",
      "summary": "Motion continues when reduced motion is requested",
      "evidence": "Under prefers-reduced-motion: reduce, the probe still found a running 500 ms animation and found no prefers-reduced-motion rule.",
      "suggestedFix": "Add a prefers-reduced-motion: reduce branch that removes non-essential transitions and auto-animation.",
      "guidanceId": "accessibility",
      "guidanceCategory": "accessibility",
      "effort": "small",
      "pathId": "home",
      "url": "https://www.betika.com/en-ke/",
      "principleId": "respect-user-preferences",
      "principleCheckId": "respects-reduced-motion",
      "artifacts": [
        "evidence/reduced-motion-probe.json"
      ]
    },
    {
      "id": "F04",
      "severity": "low",
      "confidence": "high",
      "summary": "Route and state changes are abrupt",
      "evidence": "The DOM/CSS feature probe found no View Transition rules, and route changes use full abrupt state swaps.",
      "suggestedFix": "Progressively enhance meaningful route/state changes with same-document View Transitions and reduced-motion handling.",
      "guidanceId": "same-document-transitions",
      "guidanceCategory": "animation",
      "effort": "medium",
      "pathId": "home",
      "url": "https://www.betika.com/en-ke/",
      "principleId": "implement-natural-interactions",
      "principleCheckId": "view-transitions",
      "artifacts": [
        "evidence/home-probe.json"
      ]
    },
    {
      "id": "F05",
      "severity": "low",
      "confidence": "high",
      "summary": "Persistent navigation does not adapt to scroll state",
      "evidence": "Mobile evidence shows top navigation, sports navigation, filters, and bottom navigation remain fixed/static while scrolling; the CSS probe found no scroll-state query.",
      "suggestedFix": "Reduce or collapse non-essential sticky chrome after scrolling while preserving orientation and access.",
      "guidanceId": "shrinking-header-on-scroll",
      "guidanceCategory": "css",
      "effort": "medium",
      "pathId": "home",
      "url": "https://www.betika.com/en-ke/",
      "principleId": "provide-guided-navigation",
      "principleCheckId": "scroll-state-aware-chrome",
      "artifacts": [
        "evidence/home-mobile.png"
      ]
    },
    {
      "id": "F06",
      "severity": "medium",
      "confidence": "high",
      "summary": "The modal is an ad-hoc DIV rather than a platform primitive",
      "evidence": "The rendered overlay is a fixed DIV.modal mask; the probe found zero dialog, popover, and details elements.",
      "suggestedFix": "Use dialog/showModal for the blocking flow, with native focus semantics and declarative dismissal.",
      "guidanceId": "declarative-dialog-popover-control",
      "guidanceCategory": "html",
      "effort": "medium",
      "pathId": "home",
      "url": "https://www.betika.com/en-ke/",
      "principleId": "maximize-content-reduce-noise",
      "principleCheckId": "semantic-dismissible-primitives",
      "artifacts": [
        "evidence/home-probe.json"
      ]
    },
    {
      "id": "F07",
      "severity": "medium",
      "confidence": "high",
      "summary": "Stacked navigation and filters crowd the betting content",
      "evidence": "The mobile home view stacks a header, sports strip, tabs, filters, promotional carousel, and bottom bar, substantially reducing the match-content area.",
      "suggestedFix": "Consolidate repeated chrome and reserve the first viewport for core match content and primary actions.",
      "guidanceId": "improve-text-layout-and-legibility",
      "guidanceCategory": "user-experience",
      "effort": "medium",
      "pathId": "home",
      "url": "https://www.betika.com/en-ke/",
      "principleId": "maximize-content-reduce-noise",
      "principleCheckId": "reduced-chrome",
      "artifacts": [
        "evidence/home-mobile.png"
      ]
    },
    {
      "id": "F08",
      "severity": "low",
      "confidence": "high",
      "summary": "Reusable components do not use container-aware adaptation",
      "evidence": "The CSS/DOM probe found no @container rules on a component-rich responsive application; adaptation is viewport-wide only.",
      "suggestedFix": "Add container-type to reusable rails/cards and use @container rules where components appear at multiple widths.",
      "guidanceId": "size-aware-styling",
      "guidanceCategory": "css",
      "effort": "medium",
      "pathId": "home",
      "url": "https://www.betika.com/en-ke/",
      "principleId": "adapt-to-the-form-factor",
      "principleCheckId": "component-level-responsiveness",
      "artifacts": [
        "evidence/home-probe.json"
      ]
    },
    {
      "id": "F09",
      "severity": "high",
      "confidence": "high",
      "summary": "Zoom, target sizing, and focus treatment exclude input modes",
      "evidence": "The viewport disables scaling, visible controls include 26-32 px targets, and the focused registration link computed outline-style none with no box shadow.",
      "suggestedFix": "Allow zoom, enlarge small targets, and provide a clear :focus-visible indicator for all interactive controls.",
      "guidanceId": "accessibility",
      "guidanceCategory": "accessibility",
      "effort": "medium",
      "pathId": "home",
      "url": "https://www.betika.com/en-ke/",
      "principleId": "adapt-to-the-form-factor",
      "principleCheckId": "input-modality-aware",
      "artifacts": [
        "evidence/register-probe.json",
        "evidence/axe-home.json"
      ]
    },
    {
      "id": "F10",
      "severity": "high",
      "confidence": "high",
      "summary": "The promotional roadblock blocks the primary betting journey",
      "evidence": "The mandatory roadblock precedes the betting surface and, at the desktop evidence height, its dismiss control was measured above the viewport; this creates an avoidable detour/blocker before the core flow.",
      "suggestedFix": "Remove the mandatory pre-flow ad and let users reach odds and betslip directly.",
      "guidanceId": "forms",
      "guidanceCategory": "forms",
      "effort": "medium",
      "pathId": "home",
      "url": "https://www.betika.com/en-ke/",
      "principleId": "support-core-task-success",
      "principleCheckId": "primary-flow-completion",
      "artifacts": [
        "evidence/home-desktop.png"
      ]
    },
    {
      "id": "F11",
      "severity": "medium",
      "confidence": "high",
      "summary": "Error and not-found states provide no actionable recovery",
      "evidence": "A deliberately unknown URL rendered the normal betting homepage with no 404/error explanation or recovery state; empty registration submission produced no visible field feedback.",
      "suggestedFix": "Return a real 404 route and provide explicit, accessible validation/error messages with retry or back actions.",
      "guidanceId": "accessible-error-announcement",
      "guidanceCategory": "accessibility",
      "effort": "medium",
      "pathId": "home",
      "url": "https://www.betika.com/en-ke/",
      "principleId": "support-core-task-success",
      "principleCheckId": "clear-system-state-and-recovery",
      "artifacts": [
        "evidence/not-found-mobile.png",
        "evidence/register-invalid.png"
      ]
    },
    {
      "id": "F12",
      "severity": "high",
      "confidence": "high",
      "summary": "Core Web Vitals are far outside good ranges",
      "evidence": "Lighthouse measured LCP 34.1 s, TBT 940 ms, and CLS 0.134; the trace independently measured LCP 42.65 s.",
      "suggestedFix": "Prioritize the LCP resource, cut initial scripts/trackers, and reserve layout space; verify LCP, CLS and interaction latency again.",
      "guidanceId": "identify-inp-causes",
      "guidanceCategory": "performance",
      "effort": "large",
      "pathId": "home",
      "url": "https://www.betika.com/en-ke/",
      "principleId": "be-fast-and-stable",
      "principleCheckId": "good-core-web-vitals",
      "artifacts": [
        "evidence/lighthouse.json",
        "evidence/home-trace-summary.json"
      ]
    },
    {
      "id": "F13",
      "severity": "high",
      "confidence": "high",
      "summary": "Late content causes severe layout shift",
      "evidence": "The mobile layout observer recorded CLS 0.779 with a 0.664 shift; 21 of 25 images lack explicit dimensions.",
      "suggestedFix": "Add intrinsic dimensions/aspect-ratio to imagery and reserve stable slots for banners and asynchronously loaded content.",
      "guidanceId": "visually-stable-font-fallbacks",
      "guidanceCategory": "performance",
      "effort": "medium",
      "pathId": "home",
      "url": "https://www.betika.com/en-ke/",
      "principleId": "be-fast-and-stable",
      "principleCheckId": "visual-stability",
      "artifacts": [
        "evidence/home-mobile-layout.json",
        "evidence/images.json"
      ]
    },
    {
      "id": "F14",
      "severity": "medium",
      "confidence": "high",
      "summary": "Heavy scripting blocks the main thread",
      "evidence": "Lighthouse measured 940 ms TBT; the trace recorded three long tasks up to 107 ms and 112 ms total blocking time in its capture.",
      "suggestedFix": "Break up long tasks, defer non-critical initialization, and schedule lower-priority work after interaction readiness.",
      "guidanceId": "break-up-long-tasks",
      "guidanceCategory": "performance",
      "effort": "large",
      "pathId": "home",
      "url": "https://www.betika.com/en-ke/",
      "principleId": "be-fast-and-stable",
      "principleCheckId": "efficient-main-thread",
      "artifacts": [
        "evidence/lighthouse.json",
        "evidence/home-trace-summary.json"
      ]
    },
    {
      "id": "F15",
      "severity": "high",
      "confidence": "high",
      "summary": "Initial resource delivery is excessively heavy and delayed",
      "evidence": "HAR recorded 172 requests and 5.86 MB transferred, parser-blocking CSS plus init.js, 12 redirects, and large/slow scripts and banners.",
      "suggestedFix": "Shorten render-blocking chains, optimize image priority, compress/cache resources, and defer non-critical scripts.",
      "guidanceId": "optimize-image-priority",
      "guidanceCategory": "performance",
      "effort": "large",
      "pathId": "home",
      "url": "https://www.betika.com/en-ke/",
      "principleId": "be-fast-and-stable",
      "principleCheckId": "efficient-resource-delivery",
      "artifacts": [
        "evidence/home-summary.json",
        "evidence/home.har"
      ]
    },
    {
      "id": "F16",
      "severity": "high",
      "confidence": "high",
      "summary": "The page ships about 1.45 MiB of unused JavaScript",
      "evidence": "Lighthouse estimated 1,450 KiB unused JavaScript across 16 resources and 35 KiB unused CSS.",
      "suggestedFix": "Code-split by route and conditionally load casino, video, support, and analytics features only when needed.",
      "guidanceId": "identify-heavy-scripts",
      "guidanceCategory": "performance",
      "effort": "large",
      "pathId": "home",
      "url": "https://www.betika.com/en-ke/",
      "principleId": "be-fast-and-stable",
      "principleCheckId": "trim-unused-and-duplicate-code",
      "artifacts": [
        "evidence/lighthouse.json"
      ]
    },
    {
      "id": "F17",
      "severity": "high",
      "confidence": "high",
      "summary": "Controls, links, fields, and images lack accessible names",
      "evidence": "axe found two unnamed buttons, six unnamed links, and an unlabeled form element; the image audit also found five images without alt text.",
      "suggestedFix": "Give every interactive control a discernible name, associate labels, and provide meaningful alt text.",
      "guidanceId": "accessibility",
      "guidanceCategory": "accessibility",
      "effort": "medium",
      "pathId": "home",
      "url": "https://www.betika.com/en-ke/",
      "principleId": "be-inclusive",
      "principleCheckId": "names-roles-labels",
      "artifacts": [
        "evidence/axe-home.json",
        "evidence/images.json"
      ]
    },
    {
      "id": "F18",
      "severity": "high",
      "confidence": "high",
      "summary": "Text and control colors fail minimum contrast",
      "evidence": "axe found ten contrast failures in the direct run, including Register and sports-navigation labels; Lighthouse also failed color-contrast.",
      "suggestedFix": "Adjust affected foreground/background tokens to meet WCAG AA in every theme and state.",
      "guidanceId": "accessibility",
      "guidanceCategory": "accessibility",
      "effort": "medium",
      "pathId": "home",
      "url": "https://www.betika.com/en-ke/",
      "principleId": "be-inclusive",
      "principleCheckId": "sufficient-contrast",
      "artifacts": [
        "evidence/axe-home.json"
      ]
    },
    {
      "id": "F19",
      "severity": "high",
      "confidence": "high",
      "summary": "Landmark, list, scroll-region, and focus semantics are incomplete",
      "evidence": "axe found content outside landmarks, an invalid list item, and a non-keyboard-focusable scrolling region; the focus probe found no visible outline on the tested registration link.",
      "suggestedFix": "Use semantic landmarks/lists, make scrolling regions keyboard reachable, and preserve a visible logical focus path.",
      "guidanceId": "move-dom-element-without-losing-state",
      "guidanceCategory": "accessibility",
      "effort": "medium",
      "pathId": "home",
      "url": "https://www.betika.com/en-ke/",
      "principleId": "be-inclusive",
      "principleCheckId": "structure-and-focus",
      "artifacts": [
        "evidence/axe-home.json",
        "evidence/register-probe.json"
      ]
    },
    {
      "id": "F20",
      "severity": "high",
      "confidence": "high",
      "summary": "The viewport prevents user zoom",
      "evidence": "The viewport declares maximum-scale=1,user-scalable=0; axe/Lighthouse fail the viewport zoom audit, and several controls are below a comfortable 44 px touch target.",
      "suggestedFix": "Remove maximum-scale=1 and user-scalable=0 and verify 200-400% reflow and target sizing.",
      "guidanceId": "fluid-scaling",
      "guidanceCategory": "css",
      "effort": "small",
      "pathId": "home",
      "url": "https://www.betika.com/en-ke/",
      "principleId": "be-inclusive",
      "principleCheckId": "zoom-reflow-targets-and-media",
      "artifacts": [
        "evidence/axe-home.json"
      ]
    },
    {
      "id": "F21",
      "severity": "medium",
      "confidence": "high",
      "summary": "The page logs browser errors",
      "evidence": "Lighthouse captured four browser console errors during load.",
      "suggestedFix": "Resolve the four Lighthouse-captured console errors and fail CI on uncaught runtime errors.",
      "guidanceId": "html",
      "guidanceCategory": "html",
      "effort": "medium",
      "pathId": "home",
      "url": "https://www.betika.com/en-ke/",
      "principleId": "follow-best-practices",
      "principleCheckId": "no-console-errors",
      "artifacts": [
        "evidence/lighthouse.json"
      ]
    },
    {
      "id": "F22",
      "severity": "medium",
      "confidence": "high",
      "summary": "Images lack stable dimensions and are oversized",
      "evidence": "The document has a valid doctype and charset, but 21/25 images lack explicit dimensions and 20/25 are oversized for display.",
      "suggestedFix": "Emit width/height or aspect-ratio and responsive sources sized for each rendered slot.",
      "guidanceId": "optimize-image-priority",
      "guidanceCategory": "performance",
      "effort": "medium",
      "pathId": "home",
      "url": "https://www.betika.com/en-ke/",
      "principleId": "follow-best-practices",
      "principleCheckId": "sound-document-and-assets",
      "artifacts": [
        "evidence/images.json"
      ]
    },
    {
      "id": "F23",
      "severity": "medium",
      "confidence": "high",
      "summary": "Deprecated APIs, missing source maps, and inspector issues reduce platform hygiene",
      "evidence": "Lighthouse found three deprecated-API warnings, 12 large first-party scripts without valid source maps, and a DevTools inspector issue.",
      "suggestedFix": "Remove deprecated calls, publish valid production source maps to controlled access, and clear DevTools issues.",
      "guidanceId": "html",
      "guidanceCategory": "html",
      "effort": "medium",
      "pathId": "home",
      "url": "https://www.betika.com/en-ke/",
      "principleId": "follow-best-practices",
      "principleCheckId": "browser-platform-hygiene",
      "artifacts": [
        "evidence/lighthouse.json"
      ]
    },
    {
      "id": "F24",
      "severity": "medium",
      "confidence": "high",
      "summary": "Some links are not crawlable and the viewport is hostile to mobile users",
      "evidence": "Lighthouse found 13 non-crawlable anchors; the viewport prevents zoom even though robots.txt allows public routes.",
      "suggestedFix": "Use real href destinations with descriptive names and restore user scaling.",
      "guidanceId": "html",
      "guidanceCategory": "html",
      "effort": "small",
      "pathId": "home",
      "url": "https://www.betika.com/en-ke/",
      "principleId": "be-discoverable",
      "principleCheckId": "crawlable-and-mobile-friendly",
      "artifacts": [
        "evidence/lighthouse.json",
        "evidence/site-signals.json"
      ]
    },
    {
      "id": "F25",
      "severity": "high",
      "confidence": "high",
      "summary": "Canonical and sitemap signals are broken",
      "evidence": "Lighthouse reports no valid canonical, and fetching /sitemap.xml returned the application HTML shell rather than XML sitemap entries.",
      "suggestedFix": "Publish a valid self-canonical and return XML sitemap content from declared sitemap URLs.",
      "guidanceId": "html",
      "guidanceCategory": "html",
      "effort": "medium",
      "pathId": "home",
      "url": "https://www.betika.com/en-ke/",
      "principleId": "be-discoverable",
      "principleCheckId": "canonical-and-indexing-signals",
      "artifacts": [
        "evidence/lighthouse.json",
        "evidence/site-signals.json"
      ]
    },
    {
      "id": "F26",
      "severity": "high",
      "confidence": "high",
      "summary": "Security headers and cookie protections are missing",
      "evidence": "HTTPS is used, but the headers primitive found no CSP, HSTS, nosniff, frame protection, Referrer-Policy, or Permissions-Policy; the cookie audit found 24 flagged cookies including non-Secure values.",
      "suggestedFix": "Deploy CSP, HSTS, nosniff, frame-ancestors, Referrer-Policy and Permissions-Policy; mark all eligible cookies Secure/SameSite.",
      "guidanceId": "security",
      "guidanceCategory": "security",
      "effort": "medium",
      "pathId": "registration",
      "url": "https://www.betika.com/en-ke/",
      "principleId": "be-private-and-secure",
      "principleCheckId": "secure-transport-and-headers",
      "artifacts": [
        "evidence/headers.json",
        "evidence/cookies.json"
      ]
    },
    {
      "id": "F27",
      "severity": "high",
      "confidence": "high",
      "summary": "Tracking starts across 58 third-party origins",
      "evidence": "The tracker probe found 58 third-party origins and 15 known tracker domains on first load; HAR attributed 146 requests and 4.67 MB to third-party origins.",
      "suggestedFix": "Gate non-essential trackers behind informed consent, remove duplicates, minimize data, and batch remaining analytics.",
      "guidanceId": "privacy",
      "guidanceCategory": "privacy",
      "effort": "large",
      "pathId": "registration",
      "url": "https://www.betika.com/en-ke/",
      "principleId": "be-private-and-secure",
      "principleCheckId": "data-minimisation-and-third-parties",
      "artifacts": [
        "evidence/trackers.json",
        "evidence/home-summary.json"
      ]
    },
    {
      "id": "F28",
      "severity": "medium",
      "confidence": "high",
      "summary": "Registration offers passwords but no phishing-resistant option",
      "evidence": "No permission prompt fired on load, but registration exposes password-only account creation and the probes found no passkey/WebAuthn affordance.",
      "suggestedFix": "Offer passkey registration and authentication, retaining a well-assisted fallback.",
      "guidanceId": "passkeys",
      "guidanceCategory": "security",
      "effort": "large",
      "pathId": "registration",
      "url": "https://www.betika.com/en-ke/",
      "principleId": "be-private-and-secure",
      "principleCheckId": "in-context-permissions-and-modern-auth",
      "artifacts": [
        "evidence/register-probe.json",
        "evidence/register-mobile.png"
      ]
    },
    {
      "id": "F29",
      "severity": "high",
      "confidence": "high",
      "summary": "Public content is a 2% JavaScript shell",
      "evidence": "Discoverability measured only 2% raw-HTML content coverage, no raw H1/title, and classified the page as a JavaScript shell.",
      "suggestedFix": "Server-render or statically render route titles, headings, content, and crawlable links; hydrate only enhancements.",
      "guidanceId": "flicker-free-client-side-ab-testing",
      "guidanceCategory": "performance",
      "effort": "large",
      "pathId": "home",
      "url": "https://www.betika.com/en-ke/",
      "principleId": "be-resilient",
      "principleCheckId": "progressive-enhancement",
      "artifacts": [
        "evidence/discoverability.json",
        "evidence/discoverability-crawler.png"
      ]
    },
    {
      "id": "F30",
      "severity": "high",
      "confidence": "high",
      "summary": "The custom overlay is cut off at a common desktop viewport",
      "evidence": "The roadblock modal is a custom fixed DIV and its desktop close button was measured at y=-89, outside the 493 px viewport, leaving the overlay cut off.",
      "suggestedFix": "Use top-layer dialog semantics and constrain/reposition content so dismissal remains visible at every viewport.",
      "guidanceId": "resilient-context-menus-and-nested-dropdowns",
      "guidanceCategory": "css",
      "effort": "medium",
      "pathId": "home",
      "url": "https://www.betika.com/en-ke/",
      "principleId": "be-resilient",
      "principleCheckId": "resilient-runtime-behaviour",
      "artifacts": [
        "evidence/home-desktop.png",
        "evidence/home-probe.json"
      ]
    },
    {
      "id": "F31",
      "severity": "medium",
      "confidence": "high",
      "summary": "The app-like site has no active offline fallback",
      "evidence": "A manifest exists, but the service-worker probe found zero registrations and zero caches, so this app-like site has no evidenced offline fallback.",
      "suggestedFix": "Register a service worker with a minimal offline shell/fallback and verify navigation under network loss.",
      "guidanceId": "html",
      "guidanceCategory": "html",
      "effort": "large",
      "pathId": "home",
      "url": "https://www.betika.com/en-ke/",
      "principleId": "be-resilient",
      "principleCheckId": "offline-and-installable",
      "artifacts": [
        "evidence/service-worker-probe.json",
        "evidence/site-signals.json"
      ]
    },
    {
      "id": "F32",
      "severity": "high",
      "confidence": "high",
      "summary": "The document language is missing",
      "evidence": "Across home, casino, and registration the html lang value is empty; axe/Lighthouse fail html-has-lang.",
      "suggestedFix": "Set the correct lang on every locale route and keep it synchronized on client-side navigation.",
      "guidanceId": "translator",
      "guidanceCategory": "built-in-ai",
      "effort": "small",
      "pathId": "home",
      "url": "https://www.betika.com/en-ke/",
      "principleId": "be-internationalised",
      "principleCheckId": "lang-dir-and-logical-properties",
      "artifacts": [
        "evidence/axe-home.json",
        "evidence/home-dom.json"
      ]
    },
    {
      "id": "F33",
      "severity": "high",
      "confidence": "high",
      "summary": "An aggressive gambling promotion is forced before content",
      "evidence": "An unsolicited, full-screen gambling promotion interrupts every fresh session before content and uses a dominant PLAY NOW action while dismissal is not visible at the desktop evidence height.",
      "suggestedFix": "Remove forced continuity into promotions; show honest, optional offers in context with equal dismissal prominence.",
      "guidanceId": "custom-button-actions",
      "guidanceCategory": "html",
      "effort": "medium",
      "pathId": "registration",
      "url": "https://www.betika.com/en-ke/register",
      "principleId": "be-trustworthy",
      "principleCheckId": "no-dark-patterns",
      "artifacts": [
        "evidence/home-desktop.png"
      ]
    },
    {
      "id": "F34",
      "severity": "medium",
      "confidence": "high",
      "summary": "Registration does not surface humane invalid-state feedback",
      "evidence": "Submitting the empty registration state produced no visible error announcement; inputs also lack required semantics and field-specific invalid state.",
      "suggestedFix": "Use required constraints, :user-invalid/aria-invalid after interaction, and an accessible error summary.",
      "guidanceId": "accessible-error-announcement",
      "guidanceCategory": "accessibility",
      "effort": "medium",
      "pathId": "registration",
      "url": "https://www.betika.com/en-ke/register",
      "principleId": "be-trustworthy",
      "principleCheckId": "humane-error-handling",
      "artifacts": [
        "evidence/register-invalid.png",
        "evidence/register-probe.json"
      ]
    },
    {
      "id": "F35",
      "severity": "medium",
      "confidence": "high",
      "summary": "Registration fields lack specific autocomplete tokens",
      "evidence": "Phone and password fields use generic autocomplete=\"on\" rather than tel/new-password tokens, reducing reliable autofill and password-manager assistance.",
      "suggestedFix": "Use autocomplete=\"tel\" and autocomplete=\"new-password\" with appropriate inputmode and labels.",
      "guidanceId": "autofill-sign-up-form",
      "guidanceCategory": "forms",
      "effort": "small",
      "pathId": "registration",
      "url": "https://www.betika.com/en-ke/register",
      "principleId": "be-trustworthy",
      "principleCheckId": "trustworthy-input-assistance",
      "artifacts": [
        "evidence/register-probe.json"
      ]
    },
    {
      "id": "F36",
      "severity": "high",
      "confidence": "high",
      "summary": "Most imagery is oversized, legacy format, and non-responsive",
      "evidence": "Image audit found 20 oversized images, 18 without srcset, and 20 legacy-format assets; banner originals reach 2000-2779 px for a 764 px display.",
      "suggestedFix": "Generate AVIF/WebP variants and width-based srcset/sizes matched to each slot.",
      "guidanceId": "deliver-optimized-decorative-images",
      "guidanceCategory": "performance",
      "effort": "large",
      "pathId": "home",
      "url": "https://www.betika.com/en-ke/",
      "principleId": "be-sustainable",
      "principleCheckId": "optimised-assets",
      "artifacts": [
        "evidence/images.json"
      ]
    },
    {
      "id": "F37",
      "severity": "high",
      "confidence": "high",
      "summary": "Initial load performs extensive wasteful background work",
      "evidence": "The page starts 172 requests, 51 scripts, 56 XHR/fetches, multiple analytics stacks, and ships an uncompressed 268 KB terms JSON on initial load.",
      "suggestedFix": "Remove duplicate analytics, defer support/experiments, and avoid fetching large terms data until requested.",
      "guidanceId": "deprioritize-background-fetches",
      "guidanceCategory": "performance",
      "effort": "large",
      "pathId": "home",
      "url": "https://www.betika.com/en-ke/",
      "principleId": "be-sustainable",
      "principleCheckId": "no-wasteful-work",
      "artifacts": [
        "evidence/home-summary.json"
      ]
    },
    {
      "id": "F38",
      "severity": "high",
      "confidence": "high",
      "summary": "Third-party and media weight is disproportionate",
      "evidence": "HAR records 4.67 MB third-party transfer and 2.52 MB of images; tracker evidence identifies 58 third-party origins and 15 known trackers.",
      "suggestedFix": "Set a route budget, defer offscreen media, and reduce third-party scripts to those with evidenced user value.",
      "guidanceId": "efficient-background-processing",
      "guidanceCategory": "performance",
      "effort": "large",
      "pathId": "home",
      "url": "https://www.betika.com/en-ke/",
      "principleId": "be-sustainable",
      "principleCheckId": "third-party-and-media-budget",
      "artifacts": [
        "evidence/home-summary.json",
        "evidence/trackers.json"
      ]
    },
    {
      "id": "F39",
      "severity": "medium",
      "confidence": "high",
      "summary": "The casino listing has a large baseline heap footprint",
      "evidence": "A single casino state retained about 64.7 MB across 1.18 million heap nodes, a disproportionate footprint for a game-listing view before gameplay.",
      "suggestedFix": "Profile the 64.7 MB/1.18M-node state, remove unnecessary retained app/analytics objects, and lazy-create offscreen game content.",
      "guidanceId": "manage-recurring-intervals",
      "guidanceCategory": "javascript",
      "effort": "large",
      "pathId": "casino",
      "url": "https://www.betika.com/en-ke/",
      "principleId": "be-memory-efficient",
      "principleCheckId": "bounded-footprint",
      "artifacts": [
        "evidence/heap-baseline.json",
        "evidence/heap-post-scroll.json"
      ]
    }
  ],
  "taskList": [
    {
      "id": "T01",
      "title": "Remove the mandatory roadblock and replace it with an accessible optional promotion",
      "priority": 1,
      "findingIds": [
        "F01",
        "F06",
        "F10",
        "F30",
        "F33"
      ],
      "guidanceId": "light-dismiss-a-dialog",
      "status": "open"
    },
    {
      "id": "T02",
      "title": "Cut initial JavaScript, trackers, and media to meet a route performance budget",
      "priority": 2,
      "findingIds": [
        "F12",
        "F14",
        "F15",
        "F16",
        "F27",
        "F36",
        "F37",
        "F38",
        "F39"
      ],
      "guidanceId": "identify-heavy-scripts",
      "status": "open"
    },
    {
      "id": "T03",
      "title": "Reserve image/banner space and serve responsive modern images",
      "priority": 3,
      "findingIds": [
        "F13",
        "F22",
        "F36"
      ],
      "guidanceId": "optimize-image-priority",
      "status": "open"
    },
    {
      "id": "T04",
      "title": "Add core accessibility semantics, contrast, focus, zoom, and language",
      "priority": 4,
      "findingIds": [
        "F09",
        "F17",
        "F18",
        "F19",
        "F20",
        "F32"
      ],
      "guidanceId": "accessibility",
      "status": "open"
    },
    {
      "id": "T05",
      "title": "Deploy security headers and tighten cookie policy",
      "priority": 5,
      "findingIds": [
        "F26"
      ],
      "guidanceId": "security",
      "status": "open"
    },
    {
      "id": "T06",
      "title": "Server-render public route content and repair canonical/sitemaps",
      "priority": 6,
      "findingIds": [
        "F24",
        "F25",
        "F29"
      ],
      "guidanceId": "html",
      "status": "open"
    },
    {
      "id": "T07",
      "title": "Build explicit 404, network, and form validation recovery states",
      "priority": 7,
      "findingIds": [
        "F11",
        "F34"
      ],
      "guidanceId": "accessible-error-announcement",
      "status": "open"
    },
    {
      "id": "T08",
      "title": "Add passkeys and correct registration autofill metadata",
      "priority": 8,
      "findingIds": [
        "F28",
        "F35"
      ],
      "guidanceId": "passkeys",
      "status": "open"
    },
    {
      "id": "T09",
      "title": "Respect color, motion, and input preferences",
      "priority": 9,
      "findingIds": [
        "F02",
        "F03"
      ],
      "guidanceId": "dark-mode",
      "status": "open"
    },
    {
      "id": "T10",
      "title": "Modernize responsive and navigation behavior progressively",
      "priority": 10,
      "findingIds": [
        "F04",
        "F05",
        "F08"
      ],
      "guidanceId": "size-aware-styling",
      "status": "open"
    },
    {
      "id": "T11",
      "title": "Clear browser errors, deprecated APIs, and missing source maps",
      "priority": 11,
      "findingIds": [
        "F21",
        "F23"
      ],
      "guidanceId": "html",
      "status": "open"
    },
    {
      "id": "T12",
      "title": "Register and verify an offline fallback for the installable app",
      "priority": 12,
      "findingIds": [
        "F31"
      ],
      "guidanceId": "html",
      "status": "open"
    }
  ],
  "budget": {
    "pathCount": 4,
    "auditPasses": 1
  },
  "agent": "pi",
  "runId": "2026-07-23T07-56-09-848Z"
}
