{
  "url": "https://www.betway.co.za",
  "auditedAt": "2026-07-17T23:15:40.708Z",
  "mode": "report",
  "status": "completed",
  "statusDetail": "Complete 58-check audit. The requested South African host redirected to the UK experience; findings describe the observed redirect destination and original-host chain.",
  "page": {
    "appType": "hybrid",
    "framework": "Next.js homepage plus separate sports/casino applications",
    "notes": "The requested .co.za host redirects through four hops to betway.com/en-gb/. Representative high-risk templates were audited without authentication or placing a wager."
  },
  "evidenceUsed": [
    "screenshot",
    "dom",
    "evaluate-probe",
    "layout-metrics",
    "trace",
    "har",
    "discoverability",
    "headers",
    "cookies",
    "trackers",
    "secrets",
    "images",
    "heap-summary",
    "lighthouse"
  ],
  "guidanceConsulted": [
    "accessibility",
    "accessible-error-announcement",
    "adapt-scrollbar-to-contrast-preferences",
    "agentic-forms",
    "agentic-javascript-tools",
    "anchor-positioning-tab-underline",
    "animate-element-entry-exit",
    "animate-to-from-top-layer",
    "animate-to-intrinsic-sizes",
    "animated-select-picker",
    "apply-webgl-shaders",
    "autofill-address-form",
    "autofill-highlight-inputs",
    "autofill-payment-form",
    "autofill-sign-in-form",
    "autofill-sign-up-form",
    "batch-analytics-events",
    "brand-consistent-forms",
    "branded-select-styling",
    "break-up-long-tasks",
    "calculate-event-differentials",
    "calculate-total-foreground-time",
    "calculate-with-intrinsic-sizes",
    "capture-location-agnostic-data",
    "carousel-slide-effects",
    "carousel-snap-highlights",
    "child-state-based-styling",
    "complex-shapes",
    "component-specific-light-dark-theme",
    "conditional-async-dependencies",
    "consistent-cross-document-transitions",
    "content-based-styling",
    "coordinate-global-events",
    "cross-document-transitions",
    "css",
    "css-layout",
    "custom-select-picker-layouts",
    "customize-scrollbar-color-and-thickness",
    "dark-mode",
    "declarative-dialog-popover-control",
    "defer-rendering-heavy-content",
    "defer-work-until-scroll-ends",
    "deliver-optimized-decorative-images",
    "deprioritize-background-fetches",
    "design-token-reactivity",
    "detect-initial-visibility-state",
    "directional-navigation-transitions",
    "dynamic-sibling-animations",
    "dynamic-sibling-styling",
    "efficient-background-processing",
    "export-html-media-from-canvas",
    "expose-canvas-content-to-browser-features",
    "faster-spa-view-transitions",
    "flicker-free-client-side-ab-testing",
    "fluid-scaling",
    "form-fields-automatically-fit-contents",
    "format-human-readable-durations",
    "forms",
    "full-session-analytics",
    "group-element-transitions",
    "highlight-text-ranges",
    "html",
    "identify-heavy-scripts",
    "identify-inp-causes",
    "improve-next-page-load-performance",
    "improve-text-layout-and-legibility",
    "individual-transform-properties",
    "interactions-in-complex-layouts",
    "interactive-content-in-3d-scenes",
    "interactive-content-reveal",
    "interest-triggered-action-previews",
    "interest-triggered-tooltips",
    "language-detection",
    "language-model",
    "light-dismiss-a-dialog",
    "manage-recurring-intervals",
    "model-partial-time-concepts",
    "move-dom-element-without-losing-state",
    "navigation-drawer",
    "optimize-image-priority",
    "optimize-preload-priority",
    "optimize-script-priority",
    "overflow-clipping-control",
    "parallax-scroll-effects",
    "passkey-authentication",
    "passkey-conditional-create",
    "passkey-management",
    "passkey-reauthentication",
    "passkey-registration",
    "passkeys",
    "performance",
    "persistent-app-tours",
    "persistent-toast-notifications",
    "persistent-top-layer-ui",
    "physics-based-easing",
    "platform-controls-dismiss-dialog",
    "position-aware-tooltips",
    "precise-text-alignment",
    "prevent-text-wrapping",
    "privacy",
    "pull-to-reveal",
    "reduce-style-repetition",
    "required-field-feedback",
    "resilient-context-menus-and-nested-dropdowns",
    "resolution-optimized-pseudo-elements",
    "rich-media-picker",
    "same-document-transitions",
    "schedule-tasks-by-priority",
    "scroll-entry-exit-effects",
    "scroll-position-aware-elements",
    "scroll-progress-indicator",
    "scroll-snap-realtime-feedback",
    "scroll-snap-state-sync",
    "scroll-target-on-load",
    "scrollability-affordance-hints",
    "scrollytelling",
    "search-hidden-content",
    "security",
    "select-menu-interaction",
    "sequence-distributed-events",
    "shaped-cutouts",
    "shrinking-header-on-scroll",
    "size-aware-styling",
    "soft-edge-content-fade",
    "stabilize-reactive-state",
    "stack-drill-down",
    "style-parent-with-has",
    "summarizer",
    "support-global-calendar-systems",
    "swipe-to-remove",
    "translator",
    "validate-input-after-interaction",
    "visually-stable-font-fallbacks",
    "visually-stable-mixed-fonts",
    "visually-texture-content",
    "webmcp"
  ],
  "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": "Compared default and emulated dark screenshots and computed color-scheme.",
      "evidence": "The dark capture is visually unchanged and the DOM reports color-scheme: normal, so the site does not expose or adapt to the system scheme.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/home-desktop.png",
        "evidence/home-dark.png",
        "evidence/home-dom.json"
      ],
      "findingIds": [
        "F003"
      ]
    },
    {
      "principleId": "respect-user-preferences",
      "checkId": "respects-reduced-motion",
      "status": "issues",
      "confidence": "high",
      "method": "Emulated prefers-reduced-motion: reduce and queried document animations.",
      "evidence": "Four animations remained running under reduce, including a 12,000 ms hero progress animation.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/preferences.json"
      ],
      "findingIds": [
        "F004"
      ]
    },
    {
      "principleId": "respect-user-preferences",
      "checkId": "respects-contrast",
      "status": "issues",
      "confidence": "high",
      "method": "Emulated prefers-contrast and corroborated with Lighthouse contrast analysis.",
      "evidence": "Lighthouse found the Login and Sign up controls at 3.16:1 instead of 4.5:1; the contrast preference did not change their styling.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/preferences.json",
        "evidence/lighthouse-summary.json"
      ],
      "findingIds": [
        "F005"
      ]
    },
    {
      "principleId": "implement-natural-interactions",
      "checkId": "view-transitions",
      "status": "issues",
      "confidence": "high",
      "method": "Inspected rendered CSS/DOM for View Transition use and observed route/state surfaces.",
      "evidence": "The probe found no view-transition usage; navigation and major state changes use abrupt replacement while only carousel chrome animates.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/recon.json",
        "evidence/home-desktop.png"
      ],
      "findingIds": [
        "F006"
      ]
    },
    {
      "principleId": "implement-natural-interactions",
      "checkId": "scroll-driven-animations",
      "status": "pass",
      "confidence": "high",
      "method": "Inspected authored rendered CSS and mobile long-task/scroll layout evidence.",
      "evidence": "No animation-timeline or custom scroll-animation implementation was present, and mobile layouts scroll natively without horizontal overflow.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/recon.json",
        "evidence/home-mobile-layout.json",
        "evidence/sports-mobile-layout.json"
      ]
    },
    {
      "principleId": "implement-natural-interactions",
      "checkId": "physical-gestures",
      "status": "pass",
      "confidence": "high",
      "method": "Inspected carousel and sports controls in desktop/mobile screenshots and DOM.",
      "evidence": "Carousel paging and horizontally arranged category controls use native buttons/links and remain operable at mobile width; no custom pointer-only surface was observed.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/home-mobile.png",
        "evidence/casino-mobile.png",
        "evidence/deep-probe.json"
      ]
    },
    {
      "principleId": "provide-guided-navigation",
      "checkId": "scroll-state-aware-chrome",
      "status": "pass",
      "confidence": "high",
      "method": "Compared navigation chrome on long homepage, sports and casino templates.",
      "evidence": "Persistent compact navigation remains visible on long sports/casino pages, and category state is visibly selected.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/sports-desktop.png",
        "evidence/casino-mobile.png"
      ]
    },
    {
      "principleId": "provide-guided-navigation",
      "checkId": "anchored-positioning",
      "status": "pass",
      "confidence": "high",
      "method": "Captured the sports onboarding callout near its target at a viewport edge.",
      "evidence": "The offer callout remains attached to the offer control and inside the viewport without clipping.",
      "pathIds": [
        "sports"
      ],
      "artifacts": [
        "evidence/sports-desktop.png"
      ]
    },
    {
      "principleId": "provide-guided-navigation",
      "checkId": "directs-attention",
      "status": "pass",
      "confidence": "high",
      "method": "Reviewed screenshots of the hero carousel, selected tabs and onboarding cue.",
      "evidence": "Active carousel dots, selected tabs and the sports onboarding callout provide visible state and attention cues.",
      "pathIds": [
        "home",
        "sports",
        "casino"
      ],
      "artifacts": [
        "evidence/home-mobile.png",
        "evidence/sports-desktop.png",
        "evidence/casino-mobile.png"
      ]
    },
    {
      "principleId": "maximize-content-reduce-noise",
      "checkId": "no-intrusive-interruptions",
      "status": "issues",
      "confidence": "high",
      "method": "Captured first-load states on homepage, sports and casino.",
      "evidence": "The sports path simultaneously dims the page for onboarding and covers the lower viewport with a cookie modal, leaving core betting content inaccessible on arrival.",
      "pathIds": [
        "sports"
      ],
      "artifacts": [
        "evidence/sports-desktop.png"
      ],
      "findingIds": [
        "F007"
      ]
    },
    {
      "principleId": "maximize-content-reduce-noise",
      "checkId": "semantic-dismissible-primitives",
      "status": "issues",
      "confidence": "high",
      "method": "Inspected overlay semantics and Lighthouse accessibility output.",
      "evidence": "The hero is a custom role=dialog without an accessible name; no native dialog element is used, and Lighthouse flags aria-dialog-name.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/home-dom.json",
        "evidence/deep-probe.json",
        "evidence/lighthouse.json"
      ],
      "findingIds": [
        "F008"
      ]
    },
    {
      "principleId": "maximize-content-reduce-noise",
      "checkId": "reduced-chrome",
      "status": "issues",
      "confidence": "high",
      "method": "Compared first viewports across representative templates.",
      "evidence": "Stacked consent and onboarding chrome occupies or obscures most of the useful sports viewport before the user can inspect content.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/sports-desktop.png",
        "evidence/home-mobile.png"
      ],
      "findingIds": [
        "F007"
      ]
    },
    {
      "principleId": "adapt-to-the-form-factor",
      "checkId": "responsive-no-horizontal-scroll",
      "status": "pass",
      "confidence": "high",
      "method": "Measured layout at 360x800 on homepage and sports.",
      "evidence": "Both layout captures report scrollWidth=clientWidth=360 and horizontalOverflowPx=0.",
      "pathIds": [
        "home",
        "sports"
      ],
      "artifacts": [
        "evidence/home-mobile-layout.json",
        "evidence/sports-mobile-layout.json"
      ]
    },
    {
      "principleId": "adapt-to-the-form-factor",
      "checkId": "component-level-responsiveness",
      "status": "pass",
      "confidence": "high",
      "method": "Compared hero, navigation, consent and game-card components at desktop and mobile widths.",
      "evidence": "Components reflow from desktop rows to compact mobile navigation/cards without viewport overflow.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/home-desktop.png",
        "evidence/home-mobile.png",
        "evidence/sports-desktop.png",
        "evidence/casino-mobile.png"
      ]
    },
    {
      "principleId": "adapt-to-the-form-factor",
      "checkId": "input-modality-aware",
      "status": "issues",
      "confidence": "high",
      "method": "Programmatically focused the first 25 controls and read computed focus styles; checked Lighthouse target size.",
      "evidence": "Several carousel/team controls did not accept focus or expose no visible outline, although Lighthouse target-size passed.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/deep-probe.json",
        "evidence/lighthouse-summary.json"
      ],
      "findingIds": [
        "F009"
      ]
    },
    {
      "principleId": "support-core-task-success",
      "checkId": "clear-purpose-and-primary-action",
      "status": "pass",
      "confidence": "high",
      "method": "Reviewed first viewports and headings across home, sports, casino and safer-gambling surfaces.",
      "evidence": "The welcome offer, Register/Join actions, sports markets, casino games and safer-gambling tools each communicate a clear purpose and next action.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/home-desktop.png",
        "evidence/sports-desktop.png",
        "evidence/casino-mobile.png",
        "evidence/account-mobile.png"
      ]
    },
    {
      "principleId": "support-core-task-success",
      "checkId": "primary-flow-completion",
      "status": "issues",
      "confidence": "high",
      "method": "Navigated directly to the linked registration route and recorded final URL/content.",
      "evidence": "https://betway.com/gb/en/account/registration redirects to /gb/en/sports and renders no registration form, so the primary signup flow cannot start.",
      "pathIds": [
        "registration"
      ],
      "artifacts": [
        "evidence/registration-mobile.png",
        "evidence/registration-recon.json"
      ],
      "findingIds": [
        "F002"
      ]
    },
    {
      "principleId": "support-core-task-success",
      "checkId": "clear-system-state-and-recovery",
      "status": "pass",
      "confidence": "high",
      "method": "Opened a broken legal route and inspected its rendered recovery state.",
      "evidence": "The error surface clearly says “Oops... page not found” and offers a return to the homepage.",
      "pathIds": [
        "terms"
      ],
      "artifacts": [
        "evidence/terms-mobile.png",
        "evidence/terms-recon.json"
      ]
    },
    {
      "principleId": "be-fast-and-stable",
      "checkId": "good-core-web-vitals",
      "status": "issues",
      "confidence": "high",
      "method": "Ran Lighthouse plus a DevTools trace and mobile layout observation.",
      "evidence": "Mobile Lighthouse measured LCP 3.62 s and FCP 3.11 s (needs improvement), despite low CLS 0.011 and TBT 32.5 ms.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/lighthouse-summary.json",
        "evidence/home-trace-summary.json",
        "evidence/home-mobile-layout.json"
      ],
      "findingIds": [
        "F011"
      ]
    },
    {
      "principleId": "be-fast-and-stable",
      "checkId": "visual-stability",
      "status": "pass",
      "confidence": "high",
      "method": "Observed layout shifts for five seconds on home and sports mobile.",
      "evidence": "CLS stayed low at 0.0118 on home and 0.0111 on sports with no horizontal overflow.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/home-mobile-layout.json",
        "evidence/sports-mobile-layout.json"
      ]
    },
    {
      "principleId": "be-fast-and-stable",
      "checkId": "efficient-main-thread",
      "status": "issues",
      "confidence": "high",
      "method": "Read Lighthouse main-thread diagnostics and sports long-task observer output.",
      "evidence": "Lighthouse reports 2.2 s main-thread work and 9.2 s time-to-interactive; sports recorded five long tasks up to 183 ms.",
      "pathIds": [],
      "artifacts": [
        "evidence/lighthouse.json",
        "evidence/sports-mobile-layout.json"
      ],
      "findingIds": [
        "F012"
      ],
      "reason": [
        "sports"
      ]
    },
    {
      "principleId": "be-fast-and-stable",
      "checkId": "efficient-resource-delivery",
      "status": "issues",
      "confidence": "high",
      "method": "Captured HAR, confirmed script defer/async attributes against DOM, and reviewed Lighthouse insights.",
      "evidence": "The original URL takes four redirects (estimated 2.09 s), with four render-blocking stylesheets and Lighthouse estimating 150 ms render-blocking savings.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/home-summary.json",
        "evidence/resource-dom.json",
        "evidence/lighthouse.json"
      ],
      "findingIds": [
        "F013"
      ]
    },
    {
      "principleId": "be-fast-and-stable",
      "checkId": "trim-unused-and-duplicate-code",
      "status": "issues",
      "confidence": "high",
      "method": "Ran Lighthouse coverage diagnostics and reviewed HAR script weight.",
      "evidence": "Lighthouse estimates 244 KiB unused JavaScript and 19 KiB unused CSS; GTM, gtag, OneTrust and FullStory dominate waste.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/lighthouse-summary.json",
        "evidence/home-summary.json"
      ],
      "findingIds": [
        "F014"
      ]
    },
    {
      "principleId": "be-inclusive",
      "checkId": "names-roles-labels",
      "status": "issues",
      "confidence": "high",
      "method": "Ran Lighthouse accessibility checks and inspected rendered dialogs.",
      "evidence": "Lighthouse reports an unnamed role=dialog; the probe confirms the promotional dialog has no aria-label or aria-labelledby.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/lighthouse.json",
        "evidence/deep-probe.json"
      ],
      "findingIds": [
        "F008"
      ]
    },
    {
      "principleId": "be-inclusive",
      "checkId": "sufficient-contrast",
      "status": "issues",
      "confidence": "high",
      "method": "Ran Lighthouse color-contrast audit.",
      "evidence": "Login and Sign up controls are 3.16:1 against the required 4.5:1 for their text size.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/lighthouse-summary.json"
      ],
      "findingIds": [
        "F005"
      ]
    },
    {
      "principleId": "be-inclusive",
      "checkId": "structure-and-focus",
      "status": "issues",
      "confidence": "high",
      "method": "Focused interactive elements and inspected landmarks/headings.",
      "evidence": "The homepage has no main landmark, two H1s and several controls that either fail focus or show no visible focus indicator.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/deep-probe.json",
        "evidence/recon.json"
      ],
      "findingIds": [
        "F009"
      ]
    },
    {
      "principleId": "be-inclusive",
      "checkId": "legible-text",
      "status": "pass",
      "confidence": "high",
      "method": "Visually inspected desktop and mobile captures across content-rich and tool pages.",
      "evidence": "Body copy and primary headings remain readable without clipping on home, casino and safer-gambling mobile captures.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/home-mobile.png",
        "evidence/casino-mobile.png",
        "evidence/account-mobile.png"
      ]
    },
    {
      "principleId": "be-inclusive",
      "checkId": "zoom-reflow-targets-and-media",
      "status": "pass",
      "confidence": "high",
      "method": "Checked viewport metadata, 360px reflow and Lighthouse target-size.",
      "evidence": "Viewport zoom is not disabled, both measured mobile layouts reflow without overflow, and Lighthouse target-size passes.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/recon.json",
        "evidence/home-mobile-layout.json",
        "evidence/sports-mobile-layout.json",
        "evidence/lighthouse-summary.json"
      ]
    },
    {
      "principleId": "follow-best-practices",
      "checkId": "no-console-errors",
      "status": "pass",
      "confidence": "high",
      "method": "Ran Lighthouse console-error audit.",
      "evidence": "Lighthouse recorded no browser console errors during the audited load.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/lighthouse-summary.json"
      ]
    },
    {
      "principleId": "follow-best-practices",
      "checkId": "sound-document-and-assets",
      "status": "issues",
      "confidence": "high",
      "method": "Ran doctype/charset and image audits.",
      "evidence": "Doctype and charset pass, but all 12 inspected images omit width/height attributes, weakening intrinsic sizing guarantees.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/lighthouse-summary.json",
        "evidence/images.json"
      ],
      "findingIds": [
        "F015"
      ]
    },
    {
      "principleId": "follow-best-practices",
      "checkId": "browser-platform-hygiene",
      "status": "pass",
      "confidence": "high",
      "method": "Ran Lighthouse best-practices and inspected permission/auth API triggers.",
      "evidence": "No permission request-on-load or console error was found; document doctype and charset are valid.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/lighthouse-summary.json",
        "evidence/deep-probe.json"
      ]
    },
    {
      "principleId": "be-discoverable",
      "checkId": "title-and-description",
      "status": "pass",
      "confidence": "high",
      "method": "Inspected rendered and raw metadata and ran Lighthouse SEO.",
      "evidence": "The final homepage has a descriptive title and meta description, both present in raw server HTML; Lighthouse passes both.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/recon.json",
        "evidence/discoverability.json",
        "evidence/lighthouse-summary.json"
      ]
    },
    {
      "principleId": "be-discoverable",
      "checkId": "crawlable-and-mobile-friendly",
      "status": "pass",
      "confidence": "high",
      "method": "Ran discoverability and Lighthouse crawlability checks and measured mobile layouts.",
      "evidence": "Links are crawlable, viewport metadata is present, and 92% of rendered content words exist in raw HTML.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/discoverability.json",
        "evidence/lighthouse-summary.json",
        "evidence/home-mobile-layout.json"
      ]
    },
    {
      "principleId": "be-discoverable",
      "checkId": "canonical-and-indexing-signals",
      "status": "issues",
      "confidence": "high",
      "method": "Fetched original-domain robots/sitemap paths and inspected final canonical/redirect chain.",
      "evidence": "The .co.za robots.txt and sitemap.xml requests redirect through the homepage chain to UK content; the final canonical is https://betway.com/en-gb/, not a South African locale.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/robots-sitemap.txt",
        "evidence/recon.json",
        "evidence/home-summary.json"
      ],
      "findingIds": [
        "F001"
      ]
    },
    {
      "principleId": "be-discoverable",
      "checkId": "structured-and-shareable-metadata",
      "status": "issues",
      "confidence": "high",
      "method": "Inspected rendered JSON-LD and Open Graph metadata.",
      "evidence": "The homepage exposes zero JSON-LD blocks and no Open Graph properties, despite public offer/content pages that would benefit from share previews and structured identity.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/deep-probe.json"
      ],
      "findingIds": [
        "F017"
      ]
    },
    {
      "principleId": "be-private-and-secure",
      "checkId": "secure-transport-and-headers",
      "status": "issues",
      "confidence": "high",
      "method": "Audited final-document security headers and transport.",
      "evidence": "HTTPS/HSTS/frame denial are present, but X-Content-Type-Options, Referrer-Policy and Permissions-Policy are missing; CSP only defines frame-ancestors.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/headers.json"
      ],
      "findingIds": [
        "F018"
      ]
    },
    {
      "principleId": "be-private-and-secure",
      "checkId": "data-minimisation-and-third-parties",
      "status": "issues",
      "confidence": "high",
      "method": "Captured HAR and tracker inventory before consent.",
      "evidence": "The load contacts 11 third-party origins, including Google Tag Manager and FullStory; 69 requests and 1.47 MB are classified third-party relative to the requested .co.za origin.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/trackers.json",
        "evidence/home-summary.json"
      ],
      "findingIds": [
        "F019"
      ]
    },
    {
      "principleId": "be-private-and-secure",
      "checkId": "in-context-permissions-and-modern-auth",
      "status": "issues",
      "confidence": "high",
      "method": "Inspected permission triggers/WebAuthn use and attempted the public account registration route.",
      "evidence": "No permission prompt fires on load, but no WebAuthn/passkey signal is present and the registration route redirects to sports instead of an auth surface.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/deep-probe.json",
        "evidence/registration-recon.json"
      ],
      "findingIds": [
        "F020"
      ]
    },
    {
      "principleId": "be-private-and-secure",
      "checkId": "defensive-browser-policies",
      "status": "issues",
      "confidence": "high",
      "method": "Audited CSP, HSTS, frame protection, referrer and permissions policies plus cookies.",
      "evidence": "HSTS and X-Frame-Options are set, but the CSP lacks script restrictions and the response omits Referrer-Policy, Permissions-Policy and nosniff.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/headers.json",
        "evidence/cookies.json"
      ],
      "findingIds": [
        "F018"
      ]
    },
    {
      "principleId": "be-resilient",
      "checkId": "progressive-enhancement",
      "status": "pass",
      "confidence": "high",
      "method": "Compared raw no-JS HTML with rendered content and crawler screenshot.",
      "evidence": "The page is server-rendered rather than a JS shell, with 92% raw/rendered word coverage and title/H1/description preserved.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/discoverability.json",
        "evidence/discoverability-crawler.png"
      ]
    },
    {
      "principleId": "be-resilient",
      "checkId": "resilient-runtime-behaviour",
      "status": "pass",
      "confidence": "high",
      "method": "Reviewed edge-positioned overlays, console errors and mobile states.",
      "evidence": "No console errors occurred, layouts avoid overflow, and the sports callout remains within the viewport.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/lighthouse-summary.json",
        "evidence/sports-desktop.png",
        "evidence/sports-mobile-layout.json"
      ]
    },
    {
      "principleId": "be-resilient",
      "checkId": "offline-and-installable",
      "status": "not-applicable",
      "confidence": "high",
      "method": "Checked manifest and service-worker registrations.",
      "evidence": "A manifest exists but no service worker is registered. Transactional betting requires live odds/account state, so offline completion is not a safe or meaningful expectation.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/pwa.json"
      ],
      "reason": "Transactional betting is intrinsically online; offline wagering would be unsafe and stale."
    },
    {
      "principleId": "be-resilient",
      "checkId": "network-and-http-failure-states",
      "status": "pass",
      "confidence": "high",
      "method": "Inspected the rendered not-found route and recovery action.",
      "evidence": "The not-found state clearly explains the failure and provides a route back to the homepage.",
      "pathIds": [
        "terms"
      ],
      "artifacts": [
        "evidence/terms-mobile.png",
        "evidence/terms-recon.json"
      ]
    },
    {
      "principleId": "be-internationalised",
      "checkId": "lang-dir-and-logical-properties",
      "status": "issues",
      "confidence": "high",
      "method": "Compared requested host/locale with final URL and document language.",
      "evidence": "A South African .co.za request is redirected to en-GB content with html lang=en-gb, creating a locale mismatch for the requested market.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/recon.json",
        "evidence/home-summary.json"
      ],
      "findingIds": [
        "F001"
      ]
    },
    {
      "principleId": "be-internationalised",
      "checkId": "locale-aware-data",
      "status": "issues",
      "confidence": "high",
      "method": "Inspected locale, currency and final content after the geo redirect.",
      "evidence": "The .co.za request lands on UK offers and pound-denominated amounts rather than South African locale/currency content.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/home-desktop.png",
        "evidence/recon.json"
      ],
      "findingIds": [
        "F001"
      ]
    },
    {
      "principleId": "be-internationalised",
      "checkId": "time-zone-correctness",
      "status": "pass",
      "confidence": "high",
      "method": "Reviewed sports event labels for explicit dates/times in the selected en-GB experience.",
      "evidence": "Sports listings consistently present explicit dated/time-labelled events in the active locale; no contradictory time-zone rendering was observed.",
      "pathIds": [
        "sports"
      ],
      "artifacts": [
        "evidence/registration-recon.json"
      ]
    },
    {
      "principleId": "be-trustworthy",
      "checkId": "no-dark-patterns",
      "status": "pass",
      "confidence": "high",
      "method": "Reviewed consent and safer-gambling first viewports.",
      "evidence": "Consent offers equally prominent Accept and Reject all controls, and safer-gambling controls are prominent and plainly labelled.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/home-mobile.png",
        "evidence/account-mobile.png"
      ]
    },
    {
      "principleId": "be-trustworthy",
      "checkId": "humane-error-handling",
      "status": "pass",
      "confidence": "high",
      "method": "Reviewed the broken-route error state.",
      "evidence": "The 404-equivalent page uses plain language and offers a direct return to the homepage rather than blaming the user.",
      "pathIds": [
        "terms"
      ],
      "artifacts": [
        "evidence/terms-mobile.png",
        "evidence/terms-recon.json"
      ]
    },
    {
      "principleId": "be-trustworthy",
      "checkId": "trustworthy-input-assistance",
      "status": "issues",
      "confidence": "high",
      "method": "Attempted the registration path and inspected forms/autocomplete.",
      "evidence": "The registration URL redirects to sports and exposes no form fields, so expected signup/autofill assistance is unavailable.",
      "pathIds": [
        "registration"
      ],
      "artifacts": [
        "evidence/registration-recon.json"
      ],
      "findingIds": [
        "F002"
      ]
    },
    {
      "principleId": "be-trustworthy",
      "checkId": "safe-commercial-and-account-flows",
      "status": "issues",
      "confidence": "high",
      "method": "Followed the homepage Terms & Conditions link and registration route.",
      "evidence": "The legal terms link renders “Oops... page not found” with an empty document title, while registration redirects to sports; key commercial/account assurances are inaccessible.",
      "pathIds": [
        "terms",
        "registration"
      ],
      "artifacts": [
        "evidence/terms-recon.json",
        "evidence/registration-recon.json"
      ],
      "findingIds": [
        "F010",
        "F002"
      ]
    },
    {
      "principleId": "be-sustainable",
      "checkId": "optimised-assets",
      "status": "issues",
      "confidence": "high",
      "method": "Ran image audit and reviewed transfer formats.",
      "evidence": "Seven of 12 inspected images use legacy formats and all 12 lack explicit dimensions, although responsive srcset is generally present.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/images.json"
      ],
      "findingIds": [
        "F021"
      ]
    },
    {
      "principleId": "be-sustainable",
      "checkId": "no-wasteful-work",
      "status": "issues",
      "confidence": "high",
      "method": "Reviewed HAR, tracker inventory and Lighthouse unused-code estimates.",
      "evidence": "Analytics/consent/session-replay scripts load on arrival; Lighthouse estimates 244 KiB unused JS and the tracker inventory finds FullStory and Google tags.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/home-summary.json",
        "evidence/trackers.json",
        "evidence/lighthouse-summary.json"
      ],
      "findingIds": [
        "F019",
        "F014"
      ]
    },
    {
      "principleId": "be-sustainable",
      "checkId": "third-party-and-media-budget",
      "status": "issues",
      "confidence": "high",
      "method": "Measured network transfer by party and largest resources.",
      "evidence": "The page transfers 1.47 MB across 71 requests; 69 requests are third-party relative to .co.za, led by GTM, gtag, OneTrust and FullStory.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/home-summary.json"
      ],
      "findingIds": [
        "F019"
      ]
    },
    {
      "principleId": "be-agent-ready",
      "checkId": "structured-agent-capabilities",
      "status": "not-applicable",
      "confidence": "high",
      "method": "Inspected scripts for WebMCP/tool registration and considered the wagering context.",
      "evidence": "No agent tool registration is exposed. Autonomous wagering is a sensitive high-risk action and no declared agent-facing intent exists.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/deep-probe.json"
      ],
      "reason": "No declared agent-facing surface; autonomous gambling actions should not be inferred or exposed by default."
    },
    {
      "principleId": "be-agent-ready",
      "checkId": "on-device-inference",
      "status": "not-applicable",
      "confidence": "high",
      "method": "Inspected rendered scripts for built-in AI APIs and page purpose.",
      "evidence": "No on-device language-model or summarizer use is present, and the transactional gambling surfaces do not require local inference.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/deep-probe.json"
      ],
      "reason": "No summarisation or local-inference use case is evident on the audited transactional surfaces."
    },
    {
      "principleId": "be-memory-efficient",
      "checkId": "no-leak-under-repeated-interaction",
      "status": "pass",
      "confidence": "high",
      "method": "Compared baseline and post heap summaries after ten carousel-next interactions.",
      "evidence": "Heap self size rose only 180,286 bytes (1.1%) and nodes 2,444 (0.8%) across independent equivalent loads, with no Detached constructor in either summary.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/heap-baseline.heapsnapshot",
        "evidence/heap-post.heapsnapshot"
      ]
    },
    {
      "principleId": "be-memory-efficient",
      "checkId": "bounded-footprint",
      "status": "pass",
      "confidence": "high",
      "method": "Read heap summary totals and constructor distributions.",
      "evidence": "The homepage footprint is about 16.25 MB baseline and 16.43 MB post-interaction, proportionate to this media-rich page.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/heap-baseline.heapsnapshot",
        "evidence/heap-post.heapsnapshot"
      ]
    },
    {
      "principleId": "be-memory-efficient",
      "checkId": "no-detached-dom-or-unbounded-listeners",
      "status": "pass",
      "confidence": "high",
      "method": "Compared top constructors before/after and searched summaries for Detached nodes.",
      "evidence": "Neither summary reports a Detached constructor and the small post-interaction growth does not indicate unbounded listener/DOM accumulation.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/heap-baseline.heapsnapshot",
        "evidence/heap-post.heapsnapshot"
      ]
    }
  ],
  "principleOutcomes": [
    {
      "principleId": "respect-user-preferences",
      "expectation": "default",
      "status": "issues",
      "findingIds": [
        "F003",
        "F004",
        "F005"
      ]
    },
    {
      "principleId": "implement-natural-interactions",
      "expectation": "default",
      "status": "issues",
      "findingIds": [
        "F006"
      ]
    },
    {
      "principleId": "provide-guided-navigation",
      "expectation": "default",
      "status": "pass"
    },
    {
      "principleId": "maximize-content-reduce-noise",
      "expectation": "default",
      "status": "issues",
      "findingIds": [
        "F007",
        "F008"
      ]
    },
    {
      "principleId": "adapt-to-the-form-factor",
      "expectation": "default",
      "status": "issues",
      "findingIds": [
        "F009"
      ]
    },
    {
      "principleId": "support-core-task-success",
      "expectation": "default",
      "status": "issues",
      "findingIds": [
        "F002"
      ]
    },
    {
      "principleId": "be-fast-and-stable",
      "expectation": "default",
      "status": "issues",
      "findingIds": [
        "F011",
        "F012",
        "F013",
        "F014"
      ]
    },
    {
      "principleId": "be-inclusive",
      "expectation": "default",
      "status": "issues",
      "findingIds": [
        "F008",
        "F005",
        "F009"
      ]
    },
    {
      "principleId": "follow-best-practices",
      "expectation": "default",
      "status": "issues",
      "findingIds": [
        "F015"
      ]
    },
    {
      "principleId": "be-discoverable",
      "expectation": "default",
      "status": "issues",
      "findingIds": [
        "F001",
        "F017"
      ]
    },
    {
      "principleId": "be-private-and-secure",
      "expectation": "default",
      "status": "issues",
      "findingIds": [
        "F018",
        "F019",
        "F020"
      ]
    },
    {
      "principleId": "be-resilient",
      "expectation": "contextual",
      "status": "pass"
    },
    {
      "principleId": "be-internationalised",
      "expectation": "contextual",
      "status": "issues",
      "findingIds": [
        "F001"
      ]
    },
    {
      "principleId": "be-trustworthy",
      "expectation": "default",
      "status": "issues",
      "findingIds": [
        "F002",
        "F010"
      ]
    },
    {
      "principleId": "be-sustainable",
      "expectation": "contextual",
      "status": "issues",
      "findingIds": [
        "F021",
        "F019",
        "F014"
      ]
    },
    {
      "principleId": "be-agent-ready",
      "expectation": "contextual",
      "status": "not-applicable",
      "reason": "No declared agent-facing surface; autonomous gambling actions should not be inferred or exposed by default. No summarisation or local-inference use case is evident on the audited transactional surfaces."
    },
    {
      "principleId": "be-memory-efficient",
      "expectation": "default",
      "status": "pass"
    }
  ],
  "paths": [
    {
      "id": "home",
      "description": "Requested .co.za entry and redirected UK marketing homepage; tests global navigation, offer, consent, metadata and system preferences.",
      "url": "https://www.betway.co.za",
      "conditions": [
        "desktop 1440x900",
        "mobile 360x800",
        "prefers-color-scheme: dark",
        "prefers-reduced-motion: reduce",
        "prefers-contrast: more",
        "crawler without JavaScript"
      ],
      "result": "issues"
    },
    {
      "id": "sports",
      "description": "Sports listing and betting discovery template; tests dense interactive layout, navigation, onboarding and long tasks.",
      "url": "https://betway.com/en/sports",
      "conditions": [
        "desktop 1440x900",
        "mobile 360x800"
      ],
      "result": "issues"
    },
    {
      "id": "casino",
      "description": "Casino listing/template representative of media-heavy game browsing.",
      "url": "https://betway.com/en/casino",
      "conditions": [
        "mobile 360x800"
      ],
      "result": "issues"
    },
    {
      "id": "registration",
      "description": "Primary commercial signup journey reached from public Register/Sign up links.",
      "url": "https://betway.com/gb/en/account/registration",
      "conditions": [
        "mobile 360x800",
        "fresh unauthenticated session"
      ],
      "result": "failed"
    },
    {
      "id": "account",
      "description": "Safer-gambling/account-management information surface.",
      "url": "https://account.betway.com/v1",
      "conditions": [
        "mobile 360x800",
        "unauthenticated"
      ],
      "result": "pass"
    },
    {
      "id": "terms",
      "description": "Terms & Conditions legal route linked from the homepage.",
      "url": "https://betway.com/p/terms/en-gb/",
      "conditions": [
        "mobile 360x800"
      ],
      "result": "failed"
    }
  ],
  "findings": [
    {
      "id": "F001",
      "severity": "high",
      "confidence": "high",
      "summary": "South African domain redirects to UK locale",
      "evidence": "A request for www.betway.co.za takes four redirects to https://betway.com/en-gb/, with lang=en-gb, pound offers and UK canonical; original robots/sitemap paths also resolve through that homepage chain.",
      "suggestedFix": "Preserve the requested market or redirect to an explicit South African locale with matching lang, currency, canonical, robots and sitemap signals.",
      "principleId": "be-internationalised",
      "principleCheckId": "locale-aware-data",
      "guidanceId": "translator",
      "guidanceCategory": "built-in-ai",
      "artifacts": [
        "evidence/home-summary.json",
        "evidence/recon.json",
        "evidence/home-desktop.png",
        "evidence/robots-sitemap.txt"
      ],
      "effort": "large",
      "pathId": "home",
      "url": "https://www.betway.co.za"
    },
    {
      "id": "F002",
      "severity": "high",
      "confidence": "high",
      "summary": "Registration route does not open registration",
      "evidence": "The linked /gb/en/account/registration URL resolves to /gb/en/sports and renders no form.",
      "suggestedFix": "Restore a stable registration route and a labelled, autofill-ready form; keep return/navigation state intact.",
      "principleId": "support-core-task-success",
      "principleCheckId": "primary-flow-completion",
      "guidanceId": "forms",
      "guidanceCategory": "forms",
      "artifacts": [
        "evidence/registration-mobile.png",
        "evidence/registration-recon.json"
      ],
      "effort": "large",
      "pathId": "registration",
      "url": "https://betway.com/gb/en/account/registration"
    },
    {
      "id": "F003",
      "severity": "low",
      "confidence": "high",
      "summary": "System color scheme is ignored",
      "evidence": "Default and dark-emulated screenshots are unchanged and computed color-scheme is normal.",
      "suggestedFix": "Declare color-scheme and map surfaces through prefers-color-scheme/light-dark() while preserving brand contrast.",
      "principleId": "respect-user-preferences",
      "principleCheckId": "respects-color-scheme",
      "guidanceId": "dark-mode",
      "guidanceCategory": "performance",
      "artifacts": [
        "evidence/home-desktop.png",
        "evidence/home-dark.png",
        "evidence/home-dom.json"
      ],
      "effort": "medium",
      "pathId": "home",
      "url": "https://www.betway.co.za"
    },
    {
      "id": "F004",
      "severity": "medium",
      "confidence": "high",
      "summary": "Reduced-motion preference leaves long animations running",
      "evidence": "Under prefers-reduced-motion: reduce, four animations remain active, including the 12-second hero progress animation.",
      "suggestedFix": "Use a reduce media query to stop autoplay/progress motion and replace transitions with instant state changes.",
      "principleId": "respect-user-preferences",
      "principleCheckId": "respects-reduced-motion",
      "guidanceId": "accessibility",
      "guidanceCategory": "accessibility",
      "artifacts": [
        "evidence/preferences.json"
      ],
      "effort": "small",
      "pathId": "home",
      "url": "https://www.betway.co.za"
    },
    {
      "id": "F005",
      "severity": "medium",
      "confidence": "high",
      "summary": "Primary account buttons fail text contrast",
      "evidence": "Lighthouse measures Login and Sign up at 3.16:1 against a required 4.5:1.",
      "suggestedFix": "Darken the green or change foreground/background tokens so normal-size button text reaches at least 4.5:1.",
      "principleId": "be-inclusive",
      "principleCheckId": "sufficient-contrast",
      "guidanceId": "accessibility",
      "guidanceCategory": "accessibility",
      "artifacts": [
        "evidence/lighthouse-summary.json"
      ],
      "effort": "small",
      "pathId": "home",
      "url": "https://www.betway.co.za"
    },
    {
      "id": "F006",
      "severity": "low",
      "confidence": "high",
      "summary": "Route and state changes lack View Transitions",
      "evidence": "Rendered CSS/DOM has no view-transition usage while navigation/state replacement is abrupt.",
      "suggestedFix": "Add same-document or cross-document View Transitions for meaningful route/state continuity, with reduced-motion fallback.",
      "principleId": "implement-natural-interactions",
      "principleCheckId": "view-transitions",
      "guidanceId": "same-document-transitions",
      "guidanceCategory": "performance",
      "artifacts": [
        "evidence/recon.json"
      ],
      "effort": "medium",
      "pathId": "home",
      "url": "https://www.betway.co.za"
    },
    {
      "id": "F007",
      "severity": "high",
      "confidence": "high",
      "summary": "Stacked onboarding and consent overlays obscure the core sports task",
      "evidence": "The first sports viewport is dimmed by onboarding while a cookie modal covers the bottom, leaving betting content inaccessible.",
      "suggestedFix": "Sequence nonessential onboarding after consent and user intent; never stack modal layers, and preserve an immediate dismiss path.",
      "principleId": "maximize-content-reduce-noise",
      "principleCheckId": "no-intrusive-interruptions",
      "guidanceId": "light-dismiss-a-dialog",
      "guidanceCategory": "performance",
      "artifacts": [
        "evidence/sports-desktop.png"
      ],
      "effort": "medium",
      "pathId": "sports",
      "url": "https://betway.com/en/sports"
    },
    {
      "id": "F008",
      "severity": "medium",
      "confidence": "high",
      "summary": "Custom promotional dialog has no accessible name",
      "evidence": "The DOM exposes role=dialog without aria-label/aria-labelledby and Lighthouse fails aria-dialog-name.",
      "suggestedFix": "Use a native dialog/popover where appropriate and provide an accessible name linked to its visible heading.",
      "principleId": "be-inclusive",
      "principleCheckId": "names-roles-labels",
      "guidanceId": "accessibility",
      "guidanceCategory": "accessibility",
      "artifacts": [
        "evidence/deep-probe.json",
        "evidence/lighthouse.json"
      ],
      "effort": "small",
      "pathId": "home",
      "url": "https://www.betway.co.za"
    },
    {
      "id": "F009",
      "severity": "medium",
      "confidence": "high",
      "summary": "Landmark and focus treatment is inconsistent",
      "evidence": "The homepage has no main landmark; multiple carousel/team controls fail focus or show no visible outline in the focus probe.",
      "suggestedFix": "Add a main landmark and consistent :focus-visible styling; ensure every interactive carousel control is keyboard-focusable.",
      "principleId": "be-inclusive",
      "principleCheckId": "structure-and-focus",
      "guidanceId": "accessibility",
      "guidanceCategory": "accessibility",
      "artifacts": [
        "evidence/deep-probe.json",
        "evidence/recon.json"
      ],
      "effort": "medium",
      "pathId": "home",
      "url": "https://www.betway.co.za"
    },
    {
      "id": "F010",
      "severity": "high",
      "confidence": "high",
      "summary": "Terms & Conditions link leads to a not-found page",
      "evidence": "The homepage Terms & Conditions destination renders “Oops... page not found” and has an empty title.",
      "suggestedFix": "Restore the legal document at the advertised URL, return a correct status/title/canonical, and monitor legal navigation links.",
      "principleId": "be-trustworthy",
      "principleCheckId": "safe-commercial-and-account-flows",
      "guidanceId": "custom-button-actions",
      "guidanceCategory": "performance",
      "artifacts": [
        "evidence/terms-mobile.png",
        "evidence/terms-recon.json"
      ],
      "effort": "small",
      "pathId": "terms",
      "url": "https://betway.com/p/terms/en-gb/"
    },
    {
      "id": "F011",
      "severity": "medium",
      "confidence": "high",
      "summary": "Mobile LCP needs improvement",
      "evidence": "Lighthouse measured FCP 3.11 s and LCP 3.62 s; CLS and TBT were good.",
      "suggestedFix": "Remove redirect latency and prioritize the actual LCP image/content while deferring noncritical analytics and styles.",
      "principleId": "be-fast-and-stable",
      "principleCheckId": "good-core-web-vitals",
      "guidanceId": "optimize-image-priority",
      "guidanceCategory": "performance",
      "artifacts": [
        "evidence/lighthouse-summary.json",
        "evidence/home-trace-summary.json"
      ],
      "effort": "medium",
      "pathId": "home",
      "url": "https://www.betway.co.za"
    },
    {
      "id": "F012",
      "severity": "medium",
      "confidence": "high",
      "summary": "Sports template produces long main-thread tasks",
      "evidence": "The mobile sports observer recorded five long tasks, including 138 ms and 183 ms tasks; Lighthouse reports 2.2 s main-thread work.",
      "suggestedFix": "Profile sports hydration/data processing and split or schedule work so tasks stay below 50 ms.",
      "principleId": "be-fast-and-stable",
      "principleCheckId": "efficient-main-thread",
      "guidanceId": "break-up-long-tasks",
      "guidanceCategory": "performance",
      "artifacts": [
        "evidence/sports-mobile-layout.json",
        "evidence/lighthouse.json"
      ],
      "effort": "large",
      "pathId": "sports",
      "url": "https://betway.com/en/sports"
    },
    {
      "id": "F013",
      "severity": "medium",
      "confidence": "high",
      "summary": "Redirect chain and blocking CSS delay delivery",
      "evidence": "The entry URL takes four redirects; Lighthouse estimates 2.09 s redirect savings and 150 ms render-blocking savings.",
      "suggestedFix": "Collapse redirects to one market-aware hop and inline/split critical CSS while loading noncritical styles later.",
      "principleId": "be-fast-and-stable",
      "principleCheckId": "efficient-resource-delivery",
      "guidanceId": "optimize-preload-priority",
      "guidanceCategory": "performance",
      "artifacts": [
        "evidence/home-summary.json",
        "evidence/resource-dom.json",
        "evidence/lighthouse.json"
      ],
      "effort": "medium",
      "pathId": "home",
      "url": "https://www.betway.co.za"
    },
    {
      "id": "F014",
      "severity": "medium",
      "confidence": "high",
      "summary": "Large unused client payload ships on first load",
      "evidence": "Lighthouse estimates 244 KiB unused JS and 19 KiB unused CSS, mainly analytics/consent/session replay.",
      "suggestedFix": "Conditionally load third-party dependencies after consent/need and split page code by template.",
      "principleId": "be-fast-and-stable",
      "principleCheckId": "trim-unused-and-duplicate-code",
      "guidanceId": "identify-heavy-scripts",
      "guidanceCategory": "performance",
      "artifacts": [
        "evidence/lighthouse-summary.json",
        "evidence/home-summary.json"
      ],
      "effort": "large",
      "pathId": "home",
      "url": "https://www.betway.co.za"
    },
    {
      "id": "F015",
      "severity": "low",
      "confidence": "high",
      "summary": "Images omit intrinsic width and height",
      "evidence": "The image audit found all 12 images without width/height attributes.",
      "suggestedFix": "Emit intrinsic width/height or aspect-ratio for every image while retaining responsive srcset.",
      "principleId": "follow-best-practices",
      "principleCheckId": "sound-document-and-assets",
      "guidanceId": "html",
      "guidanceCategory": "html",
      "artifacts": [
        "evidence/images.json"
      ],
      "effort": "small",
      "pathId": "home",
      "url": "https://www.betway.co.za"
    },
    {
      "id": "F017",
      "severity": "medium",
      "confidence": "high",
      "summary": "Public homepage lacks structured/share metadata",
      "evidence": "The rendered page has zero JSON-LD blocks and no Open Graph properties.",
      "suggestedFix": "Add accurate Organization/WebSite/Offer JSON-LD and Open Graph metadata matching visible content and locale.",
      "principleId": "be-discoverable",
      "principleCheckId": "structured-and-shareable-metadata",
      "guidanceId": "html",
      "guidanceCategory": "html",
      "artifacts": [
        "evidence/deep-probe.json"
      ],
      "effort": "small",
      "pathId": "home",
      "url": "https://www.betway.co.za"
    },
    {
      "id": "F018",
      "severity": "medium",
      "confidence": "high",
      "summary": "Defensive response policy is incomplete",
      "evidence": "Headers omit nosniff, Referrer-Policy and Permissions-Policy; CSP only contains frame-ancestors.",
      "suggestedFix": "Add nosniff, a strict referrer policy, least-privilege permissions policy, and a nonce/hash-based script/style CSP.",
      "principleId": "be-private-and-secure",
      "principleCheckId": "defensive-browser-policies",
      "guidanceId": "security",
      "guidanceCategory": "security",
      "artifacts": [
        "evidence/headers.json"
      ],
      "effort": "medium",
      "pathId": "home",
      "url": "https://www.betway.co.za"
    },
    {
      "id": "F019",
      "severity": "high",
      "confidence": "high",
      "summary": "Tracking and third-party code loads before consent choice",
      "evidence": "Initial load contacts 11 third-party origins including GTM and FullStory; 69 requests and 1.47 MB are third-party relative to .co.za.",
      "suggestedFix": "Block nonessential analytics/session replay until explicit consent, minimize vendors, and enforce a measurable third-party byte/request budget.",
      "principleId": "be-private-and-secure",
      "principleCheckId": "data-minimisation-and-third-parties",
      "guidanceId": "privacy",
      "guidanceCategory": "privacy",
      "artifacts": [
        "evidence/trackers.json",
        "evidence/home-summary.json",
        "evidence/home-mobile.png"
      ],
      "effort": "large",
      "pathId": "home",
      "url": "https://www.betway.co.za"
    },
    {
      "id": "F020",
      "severity": "low",
      "confidence": "high",
      "summary": "Account surface exposes no modern authentication path",
      "evidence": "No WebAuthn/passkey signal is present and the registration route returns sports content.",
      "suggestedFix": "After restoring account routes, offer passkeys and request credentials only from explicit sign-in/register actions.",
      "principleId": "be-private-and-secure",
      "principleCheckId": "in-context-permissions-and-modern-auth",
      "guidanceId": "passkeys",
      "guidanceCategory": "performance",
      "artifacts": [
        "evidence/deep-probe.json",
        "evidence/registration-recon.json"
      ],
      "effort": "large",
      "pathId": "registration",
      "url": "https://betway.com/gb/en/account/registration"
    },
    {
      "id": "F021",
      "severity": "low",
      "confidence": "high",
      "summary": "Image delivery still relies on legacy formats",
      "evidence": "Seven of 12 inspected images are PNG/JPG-style legacy assets, though srcset is generally present.",
      "suggestedFix": "Negotiate AVIF/WebP for photographic/decorative assets and preserve responsive source selection.",
      "principleId": "be-sustainable",
      "principleCheckId": "optimised-assets",
      "guidanceId": "deliver-optimized-decorative-images",
      "guidanceCategory": "performance",
      "artifacts": [
        "evidence/images.json"
      ],
      "effort": "medium",
      "pathId": "home",
      "url": "https://www.betway.co.za"
    }
  ],
  "artifacts": [
    {
      "type": "screenshot",
      "path": "evidence/account-mobile.png",
      "caption": "account mobile",
      "findingIds": []
    },
    {
      "type": "other",
      "path": "evidence/account-recon.json",
      "caption": "account recon",
      "findingIds": []
    },
    {
      "type": "screenshot",
      "path": "evidence/casino-mobile.png",
      "caption": "casino mobile",
      "findingIds": []
    },
    {
      "type": "other",
      "path": "evidence/casino-recon.json",
      "caption": "casino recon",
      "findingIds": []
    },
    {
      "type": "other",
      "path": "evidence/cookies.json",
      "caption": "cookies",
      "findingIds": []
    },
    {
      "type": "other",
      "path": "evidence/deep-probe.json",
      "caption": "deep probe",
      "findingIds": [
        "F008",
        "F009",
        "F017",
        "F020"
      ]
    },
    {
      "type": "screenshot",
      "path": "evidence/discoverability-crawler.png",
      "caption": "discoverability crawler",
      "findingIds": []
    },
    {
      "type": "screenshot",
      "path": "evidence/discoverability-rendered.png",
      "caption": "discoverability rendered",
      "findingIds": []
    },
    {
      "type": "discoverability",
      "path": "evidence/discoverability.json",
      "caption": "discoverability",
      "findingIds": []
    },
    {
      "type": "other",
      "path": "evidence/headers.json",
      "caption": "headers",
      "findingIds": [
        "F018"
      ]
    },
    {
      "type": "heap",
      "path": "evidence/heap-baseline.heapsnapshot",
      "caption": "heap baseline",
      "findingIds": []
    },
    {
      "type": "heap",
      "path": "evidence/heap-post.heapsnapshot",
      "caption": "heap post",
      "findingIds": []
    },
    {
      "type": "screenshot",
      "path": "evidence/home-dark.png",
      "caption": "home dark",
      "findingIds": [
        "F003"
      ]
    },
    {
      "type": "screenshot",
      "path": "evidence/home-desktop.png",
      "caption": "home desktop",
      "findingIds": [
        "F001",
        "F003"
      ]
    },
    {
      "type": "dom",
      "path": "evidence/home-dom.json",
      "caption": "home dom",
      "findingIds": [
        "F003"
      ]
    },
    {
      "type": "layout",
      "path": "evidence/home-mobile-layout.json",
      "caption": "home mobile layout",
      "findingIds": []
    },
    {
      "type": "screenshot",
      "path": "evidence/home-mobile.png",
      "caption": "home mobile",
      "findingIds": [
        "F019"
      ]
    },
    {
      "type": "screenshot",
      "path": "evidence/home-rejected.png",
      "caption": "home rejected",
      "findingIds": []
    },
    {
      "type": "har-summary",
      "path": "evidence/home-summary.json",
      "caption": "home summary",
      "findingIds": [
        "F001",
        "F013",
        "F014",
        "F019"
      ]
    },
    {
      "type": "trace-summary",
      "path": "evidence/home-trace-summary.json",
      "caption": "home trace summary",
      "findingIds": [
        "F011"
      ]
    },
    {
      "type": "trace",
      "path": "evidence/home-trace.json",
      "caption": "home trace",
      "findingIds": []
    },
    {
      "type": "har",
      "path": "evidence/home.har",
      "caption": "home",
      "findingIds": []
    },
    {
      "type": "other",
      "path": "evidence/images.json",
      "caption": "images",
      "findingIds": [
        "F015",
        "F021"
      ]
    },
    {
      "type": "lighthouse",
      "path": "evidence/lighthouse-summary.json",
      "caption": "lighthouse summary",
      "findingIds": [
        "F005",
        "F011",
        "F014"
      ]
    },
    {
      "type": "lighthouse",
      "path": "evidence/lighthouse.json",
      "caption": "lighthouse",
      "findingIds": [
        "F008",
        "F012",
        "F013"
      ]
    },
    {
      "type": "other",
      "path": "evidence/login-state.json",
      "caption": "login state",
      "findingIds": []
    },
    {
      "type": "screenshot",
      "path": "evidence/login-state.png",
      "caption": "login state",
      "findingIds": []
    },
    {
      "type": "other",
      "path": "evidence/preferences.json",
      "caption": "preferences",
      "findingIds": [
        "F004"
      ]
    },
    {
      "type": "other",
      "path": "evidence/pwa.json",
      "caption": "pwa",
      "findingIds": []
    },
    {
      "type": "other",
      "path": "evidence/recon.json",
      "caption": "recon",
      "findingIds": [
        "F001",
        "F006",
        "F009"
      ]
    },
    {
      "type": "screenshot",
      "path": "evidence/registration-mobile.png",
      "caption": "registration mobile",
      "findingIds": [
        "F002"
      ]
    },
    {
      "type": "other",
      "path": "evidence/registration-recon.json",
      "caption": "registration recon",
      "findingIds": [
        "F002",
        "F020"
      ]
    },
    {
      "type": "dom",
      "path": "evidence/resource-dom.json",
      "caption": "resource dom",
      "findingIds": [
        "F013"
      ]
    },
    {
      "type": "other",
      "path": "evidence/robots-sitemap.txt",
      "caption": "robots sitemap",
      "findingIds": [
        "F001"
      ]
    },
    {
      "type": "other",
      "path": "evidence/secrets.json",
      "caption": "secrets",
      "findingIds": []
    },
    {
      "type": "screenshot",
      "path": "evidence/sports-desktop.png",
      "caption": "sports desktop",
      "findingIds": [
        "F007"
      ]
    },
    {
      "type": "layout",
      "path": "evidence/sports-mobile-layout.json",
      "caption": "sports mobile layout",
      "findingIds": [
        "F012"
      ]
    },
    {
      "type": "screenshot",
      "path": "evidence/terms-mobile.png",
      "caption": "terms mobile",
      "findingIds": [
        "F010"
      ]
    },
    {
      "type": "other",
      "path": "evidence/terms-recon.json",
      "caption": "terms recon",
      "findingIds": [
        "F010"
      ]
    },
    {
      "type": "other",
      "path": "evidence/trackers.json",
      "caption": "trackers",
      "findingIds": [
        "F019"
      ]
    }
  ],
  "taskList": [
    {
      "id": "T001",
      "title": "Preserve the requested market or redirect to an explicit South African locale with matching lang, currency, canonical, robots and sitemap signals.",
      "priority": 1,
      "findingIds": [
        "F001"
      ],
      "guidanceId": "translator",
      "status": "open"
    },
    {
      "id": "T002",
      "title": "Restore a stable registration route and a labelled, autofill-ready form; keep return/navigation state intact.",
      "priority": 2,
      "findingIds": [
        "F002"
      ],
      "guidanceId": "forms",
      "status": "open"
    },
    {
      "id": "T003",
      "title": "Sequence nonessential onboarding after consent and user intent; never stack modal layers, and preserve an immediate dismiss path.",
      "priority": 3,
      "findingIds": [
        "F007"
      ],
      "guidanceId": "light-dismiss-a-dialog",
      "status": "open"
    },
    {
      "id": "T004",
      "title": "Restore the legal document at the advertised URL, return a correct status/title/canonical, and monitor legal navigation links.",
      "priority": 4,
      "findingIds": [
        "F010"
      ],
      "guidanceId": "custom-button-actions",
      "status": "open"
    },
    {
      "id": "T005",
      "title": "Block nonessential analytics/session replay until explicit consent, minimize vendors, and enforce a measurable third-party byte/request budget.",
      "priority": 5,
      "findingIds": [
        "F019"
      ],
      "guidanceId": "privacy",
      "status": "open"
    },
    {
      "id": "T006",
      "title": "Use a reduce media query to stop autoplay/progress motion and replace transitions with instant state changes.",
      "priority": 6,
      "findingIds": [
        "F004"
      ],
      "guidanceId": "accessibility",
      "status": "open"
    },
    {
      "id": "T007",
      "title": "Darken the green or change foreground/background tokens so normal-size button text reaches at least 4.5:1.",
      "priority": 7,
      "findingIds": [
        "F005"
      ],
      "guidanceId": "accessibility",
      "status": "open"
    },
    {
      "id": "T008",
      "title": "Use a native dialog/popover where appropriate and provide an accessible name linked to its visible heading.",
      "priority": 8,
      "findingIds": [
        "F008"
      ],
      "guidanceId": "accessibility",
      "status": "open"
    },
    {
      "id": "T009",
      "title": "Add a main landmark and consistent :focus-visible styling; ensure every interactive carousel control is keyboard-focusable.",
      "priority": 9,
      "findingIds": [
        "F009"
      ],
      "guidanceId": "accessibility",
      "status": "open"
    },
    {
      "id": "T010",
      "title": "Remove redirect latency and prioritize the actual LCP image/content while deferring noncritical analytics and styles.",
      "priority": 10,
      "findingIds": [
        "F011"
      ],
      "guidanceId": "optimize-image-priority",
      "status": "open"
    },
    {
      "id": "T011",
      "title": "Profile sports hydration/data processing and split or schedule work so tasks stay below 50 ms.",
      "priority": 11,
      "findingIds": [
        "F012"
      ],
      "guidanceId": "break-up-long-tasks",
      "status": "open"
    },
    {
      "id": "T012",
      "title": "Collapse redirects to one market-aware hop and inline/split critical CSS while loading noncritical styles later.",
      "priority": 12,
      "findingIds": [
        "F013"
      ],
      "guidanceId": "optimize-preload-priority",
      "status": "open"
    },
    {
      "id": "T013",
      "title": "Conditionally load third-party dependencies after consent/need and split page code by template.",
      "priority": 13,
      "findingIds": [
        "F014"
      ],
      "guidanceId": "identify-heavy-scripts",
      "status": "open"
    },
    {
      "id": "T014",
      "title": "Add accurate Organization/WebSite/Offer JSON-LD and Open Graph metadata matching visible content and locale.",
      "priority": 14,
      "findingIds": [
        "F017"
      ],
      "guidanceId": "html",
      "status": "open"
    },
    {
      "id": "T015",
      "title": "Add nosniff, a strict referrer policy, least-privilege permissions policy, and a nonce/hash-based script/style CSP.",
      "priority": 15,
      "findingIds": [
        "F018"
      ],
      "guidanceId": "security",
      "status": "open"
    },
    {
      "id": "T016",
      "title": "Declare color-scheme and map surfaces through prefers-color-scheme/light-dark() while preserving brand contrast.",
      "priority": 16,
      "findingIds": [
        "F003"
      ],
      "guidanceId": "dark-mode",
      "status": "open"
    },
    {
      "id": "T017",
      "title": "Add same-document or cross-document View Transitions for meaningful route/state continuity, with reduced-motion fallback.",
      "priority": 17,
      "findingIds": [
        "F006"
      ],
      "guidanceId": "same-document-transitions",
      "status": "open"
    },
    {
      "id": "T018",
      "title": "Emit intrinsic width/height or aspect-ratio for every image while retaining responsive srcset.",
      "priority": 18,
      "findingIds": [
        "F015"
      ],
      "guidanceId": "html",
      "status": "open"
    },
    {
      "id": "T019",
      "title": "After restoring account routes, offer passkeys and request credentials only from explicit sign-in/register actions.",
      "priority": 19,
      "findingIds": [
        "F020"
      ],
      "guidanceId": "passkeys",
      "status": "open"
    },
    {
      "id": "T020",
      "title": "Negotiate AVIF/WebP for photographic/decorative assets and preserve responsive source selection.",
      "priority": 20,
      "findingIds": [
        "F021"
      ],
      "guidanceId": "deliver-optimized-decorative-images",
      "status": "open"
    }
  ],
  "budget": {
    "pathCount": 6,
    "auditPasses": 1
  },
  "agent": "pi",
  "runId": "2026-07-17T23-15-40-708Z"
}
