{
  "url": "https://www.thscore99.com",
  "auditedAt": "2026-07-21T01:33:19.144Z",
  "mode": "report",
  "status": "completed",
  "statusDetail": "Coverage-complete audit of six representative paths. Not covered: authenticated account state, destructive account actions, live notification permission prompts, checkout, and sports/templates that duplicate the audited score-list archetypes.",
  "page": {
    "appType": "hybrid",
    "framework": "Server-rendered ASP.NET pages with extensive client-side JavaScript live updates",
    "notes": "Thai live sports score service. Core shell is server-rendered, while the score payload depends on JavaScript."
  },
  "evidenceUsed": [
    "screenshot",
    "dom",
    "layout-metrics",
    "evaluate-probe",
    "trace",
    "har",
    "discoverability",
    "headers",
    "cookies",
    "trackers",
    "images",
    "secrets",
    "heap-summary",
    "lighthouse",
    "curl robots/sitemap",
    "Modern Web Guidance 0.0.172"
  ],
  "guidanceConsulted": [
    "dark-mode",
    "accessibility",
    "same-document-transitions",
    "light-dismiss-a-dialog",
    "fluid-scaling",
    "size-aware-styling",
    "improve-text-layout-and-legibility",
    "break-up-long-tasks",
    "identify-heavy-scripts",
    "performance",
    "optimize-preload-priority",
    "security",
    "privacy",
    "optimize-image-priority",
    "deliver-optimized-decorative-images",
    "html",
    "search-hidden-content",
    "forms",
    "translator",
    "efficient-background-processing",
    "manage-recurring-intervals",
    "stabilize-reactive-state",
    "passkeys"
  ],
  "artifacts": [
    {
      "type": "screenshot",
      "path": "evidence/404-mobile.png",
      "caption": "404 mobile",
      "condition": "viewport: 360x800"
    },
    {
      "type": "screenshot",
      "path": "evidence/ad-mobile.png",
      "caption": "ad mobile",
      "findingIds": [
        "F23"
      ],
      "condition": "viewport: 360x800"
    },
    {
      "type": "other",
      "path": "evidence/cookies.json",
      "caption": "cookies",
      "findingIds": [
        "F18"
      ]
    },
    {
      "type": "screenshot",
      "path": "evidence/discoverability-crawler.png",
      "caption": "discoverability crawler",
      "findingIds": [
        "F21"
      ]
    },
    {
      "type": "screenshot",
      "path": "evidence/discoverability-rendered.png",
      "caption": "discoverability rendered",
      "findingIds": [
        "F21"
      ]
    },
    {
      "type": "discoverability",
      "path": "evidence/discoverability.json",
      "caption": "discoverability",
      "findingIds": [
        "F21"
      ]
    },
    {
      "type": "other",
      "path": "evidence/headers.json",
      "caption": "headers",
      "findingIds": [
        "F18"
      ]
    },
    {
      "type": "heap",
      "path": "evidence/heap-baseline.heapsnapshot",
      "caption": "heap baseline",
      "findingIds": [
        "F28"
      ]
    },
    {
      "type": "heap",
      "path": "evidence/heap-post.heapsnapshot",
      "caption": "heap post",
      "findingIds": [
        "F28"
      ]
    },
    {
      "type": "screenshot",
      "path": "evidence/home-contrast.png",
      "caption": "home contrast",
      "condition": "forced-colors: active, prefers-contrast: more"
    },
    {
      "type": "screenshot",
      "path": "evidence/home-dark.png",
      "caption": "home dark",
      "findingIds": [
        "F01"
      ],
      "condition": "prefers-color-scheme: dark"
    },
    {
      "type": "screenshot",
      "path": "evidence/home-desktop.png",
      "caption": "home desktop",
      "findingIds": [
        "F01",
        "F05"
      ]
    },
    {
      "type": "dom",
      "path": "evidence/home-dom.json",
      "caption": "home dom",
      "findingIds": [
        "F03",
        "F11",
        "F17",
        "F22",
        "F23"
      ]
    },
    {
      "type": "layout",
      "path": "evidence/home-layout-mobile.json",
      "caption": "home layout mobile",
      "condition": "viewport: 360x800"
    },
    {
      "type": "screenshot",
      "path": "evidence/home-mobile.png",
      "caption": "home mobile",
      "findingIds": [
        "F04",
        "F05",
        "F06",
        "F12",
        "F13",
        "F23"
      ],
      "condition": "viewport: 360x800"
    },
    {
      "type": "har-summary",
      "path": "evidence/home-summary.json",
      "caption": "home summary",
      "findingIds": [
        "F08",
        "F19",
        "F26",
        "F27"
      ]
    },
    {
      "type": "trace-summary",
      "path": "evidence/home-trace-summary.json",
      "caption": "home trace summary",
      "findingIds": [
        "F07",
        "F27"
      ]
    },
    {
      "type": "trace",
      "path": "evidence/home-trace.json",
      "caption": "home trace",
      "findingIds": [
        "F07"
      ]
    },
    {
      "type": "har",
      "path": "evidence/home.har",
      "caption": "home",
      "findingIds": [
        "F08",
        "F19"
      ]
    },
    {
      "type": "other",
      "path": "evidence/images.json",
      "caption": "images",
      "findingIds": [
        "F09",
        "F14",
        "F26"
      ]
    },
    {
      "type": "dom",
      "path": "evidence/league-dom.json",
      "caption": "league dom"
    },
    {
      "type": "screenshot",
      "path": "evidence/league-mobile.png",
      "caption": "league mobile",
      "condition": "viewport: 360x800"
    },
    {
      "type": "lighthouse",
      "path": "evidence/lighthouse.json",
      "caption": "lighthouse",
      "findingIds": [
        "F06",
        "F07",
        "F08",
        "F09",
        "F10",
        "F11",
        "F12",
        "F14",
        "F15",
        "F16",
        "F17"
      ]
    },
    {
      "type": "dom",
      "path": "evidence/login-dom.json",
      "caption": "login dom",
      "findingIds": [
        "F20",
        "F25"
      ]
    },
    {
      "type": "screenshot",
      "path": "evidence/login-invalid-mobile.png",
      "caption": "login invalid mobile",
      "findingIds": [
        "F24"
      ],
      "condition": "viewport: 360x800"
    },
    {
      "type": "screenshot",
      "path": "evidence/login-mobile.png",
      "caption": "login mobile",
      "findingIds": [
        "F20",
        "F24"
      ],
      "condition": "viewport: 360x800"
    },
    {
      "type": "other",
      "path": "evidence/motion-css.json",
      "caption": "motion css",
      "findingIds": [
        "F02"
      ]
    },
    {
      "type": "other",
      "path": "evidence/platform-probe.json",
      "caption": "platform probe",
      "findingIds": [
        "F03",
        "F05",
        "F06",
        "F10",
        "F16",
        "F22"
      ]
    },
    {
      "type": "other",
      "path": "evidence/recon.json",
      "caption": "recon"
    },
    {
      "type": "dom",
      "path": "evidence/results-dom.json",
      "caption": "results dom"
    },
    {
      "type": "screenshot",
      "path": "evidence/results-mobile.png",
      "caption": "results mobile",
      "findingIds": [
        "F04",
        "F13"
      ],
      "condition": "viewport: 360x800"
    },
    {
      "type": "other",
      "path": "evidence/robots-sitemap.txt",
      "caption": "robots sitemap",
      "findingIds": [
        "F16",
        "F17"
      ]
    },
    {
      "type": "other",
      "path": "evidence/secrets.json",
      "caption": "secrets"
    },
    {
      "type": "other",
      "path": "evidence/trackers.json",
      "caption": "trackers",
      "findingIds": [
        "F19"
      ]
    }
  ],
  "config": {
    "loaded": false
  },
  "coverage": {
    "catalogVersion": "modern-web-guidance@0.0.172",
    "catalogChecksum": "sha256:78ccfdb2d483f4c57d9dafed80fd86c6265585a56457c8dcfddc254b80fb44d7",
    "expected": 58,
    "recorded": 58,
    "judged": 58,
    "blocked": 0,
    "notRun": 0,
    "missing": 0,
    "unknown": 0,
    "duplicates": 0,
    "complete": true
  },
  "checkOutcomes": [
    {
      "principleId": "respect-user-preferences",
      "checkId": "respects-color-scheme",
      "confidence": "high",
      "method": "Direct multi-modal inspection across representative paths",
      "evidence": "The dark-emulated screenshot is pixel-identical to the light screenshot; white score rows and pale chrome remain unchanged.",
      "pathIds": [
        "home"
      ],
      "status": "issues",
      "findingIds": [
        "F01"
      ],
      "artifacts": [
        "evidence/home-dark.png",
        "evidence/home-desktop.png"
      ]
    },
    {
      "principleId": "respect-user-preferences",
      "checkId": "respects-reduced-motion",
      "confidence": "high",
      "method": "Direct multi-modal inspection across representative paths",
      "evidence": "The reduced-motion probe reports matchMedia reduce=true while the timeMin animation remains running with an infinite iteration count; no reduced-motion CSS was found.",
      "pathIds": [
        "home"
      ],
      "status": "issues",
      "findingIds": [
        "F02"
      ],
      "artifacts": [
        "evidence/motion-css.json"
      ]
    },
    {
      "principleId": "respect-user-preferences",
      "checkId": "respects-contrast",
      "confidence": "high",
      "method": "Direct multi-modal inspection across representative paths",
      "evidence": "Forced-colors/high-contrast screenshot retains visible text, controls, borders and selected states against the black canvas.",
      "pathIds": [
        "home"
      ],
      "status": "pass"
    },
    {
      "principleId": "implement-natural-interactions",
      "checkId": "view-transitions",
      "confidence": "high",
      "method": "Direct multi-modal inspection across representative paths",
      "evidence": "The platform probe found 53 javascript: links and zero View Transition CSS; homepage navigation and score tabs are custom onclick state changes.",
      "pathIds": [
        "home"
      ],
      "status": "issues",
      "findingIds": [
        "F03"
      ],
      "artifacts": [
        "evidence/platform-probe.json",
        "evidence/home-dom.json"
      ]
    },
    {
      "principleId": "implement-natural-interactions",
      "checkId": "scroll-driven-animations",
      "confidence": "high",
      "method": "Direct multi-modal inspection across representative paths",
      "evidence": "DOM/CSS probe found no animation-timeline and screenshots show a static scrolling score list.",
      "status": "not-applicable",
      "reason": "No scroll-linked animation or scrollytelling surface was present on the representative pages."
    },
    {
      "principleId": "implement-natural-interactions",
      "checkId": "physical-gestures",
      "confidence": "high",
      "method": "Direct multi-modal inspection across representative paths",
      "evidence": "DOM/CSS and interaction recon found no representative physical gesture to judge.",
      "status": "not-applicable",
      "reason": "No gesture-driven carousel, swipe, pull, or snap interaction was present in the audited paths."
    },
    {
      "principleId": "provide-guided-navigation",
      "checkId": "scroll-state-aware-chrome",
      "confidence": "high",
      "method": "Direct multi-modal inspection across representative paths",
      "evidence": "Long mobile score pages retain compact primary navigation and a floating filter affordance while content scrolls.",
      "pathIds": [
        "home"
      ],
      "status": "pass"
    },
    {
      "principleId": "provide-guided-navigation",
      "checkId": "anchored-positioning",
      "confidence": "high",
      "method": "Direct multi-modal inspection across representative paths",
      "evidence": "DOM probe found no popover/dialog/details and recon found no anchored overlay target.",
      "status": "not-applicable",
      "reason": "No tooltip, popover, or edge-positioned menu was present in the audited paths."
    },
    {
      "principleId": "provide-guided-navigation",
      "checkId": "directs-attention",
      "confidence": "high",
      "method": "Direct multi-modal inspection across representative paths",
      "evidence": "Selected score/result tabs and league sub-tabs use persistent contrasting state, and the league detail page clearly changes context.",
      "pathIds": [
        "home"
      ],
      "status": "pass"
    },
    {
      "principleId": "maximize-content-reduce-noise",
      "checkId": "no-intrusive-interruptions",
      "confidence": "high",
      "method": "Direct multi-modal inspection across representative paths",
      "evidence": "The 360px homepage and results screenshots show full-width gambling banners inserted between small score rows, plus a dismissible domain banner above the primary UI. Prominent in-feed banners have empty accessible text; following /ad/1729.html redirects to a LINE add-friend QR page, while banners visibly promote betting/casino products.",
      "pathIds": [
        "home",
        "ad"
      ],
      "status": "issues",
      "findingIds": [
        "F04",
        "F23"
      ],
      "artifacts": [
        "evidence/home-mobile.png",
        "evidence/results-mobile.png",
        "evidence/ad-mobile.png",
        "evidence/home-dom.json"
      ]
    },
    {
      "principleId": "maximize-content-reduce-noise",
      "checkId": "semantic-dismissible-primitives",
      "confidence": "high",
      "method": "Direct multi-modal inspection across representative paths",
      "evidence": "DOM probe found zero dialog, popover, and details elements, and no applicable overlay flow.",
      "status": "not-applicable",
      "reason": "No modal, disclosure, or transient overlay flow was encountered; the load banner is inline chrome."
    },
    {
      "principleId": "maximize-content-reduce-noise",
      "checkId": "reduced-chrome",
      "confidence": "high",
      "method": "Direct multi-modal inspection across representative paths",
      "evidence": "The 360px homepage and results screenshots show full-width gambling banners inserted between small score rows, plus a dismissible domain banner above the primary UI.",
      "pathIds": [
        "home"
      ],
      "status": "issues",
      "findingIds": [
        "F04"
      ],
      "artifacts": [
        "evidence/home-mobile.png",
        "evidence/results-mobile.png"
      ]
    },
    {
      "principleId": "adapt-to-the-form-factor",
      "checkId": "responsive-no-horizontal-scroll",
      "confidence": "high",
      "method": "Direct multi-modal inspection across representative paths",
      "evidence": "Mobile layout metrics report scrollWidth=clientWidth=360 with 0 horizontal overflow; home, results and league screenshots reflow to 360px.",
      "pathIds": [
        "home"
      ],
      "status": "pass"
    },
    {
      "principleId": "adapt-to-the-form-factor",
      "checkId": "component-level-responsiveness",
      "confidence": "high",
      "method": "Direct multi-modal inspection across representative paths",
      "evidence": "The CSS probe found 0 container-query rules and 479 physical left/right declarations; reused score rows and navigation are presented at materially different widths.",
      "pathIds": [
        "home"
      ],
      "status": "issues",
      "findingIds": [
        "F05"
      ],
      "artifacts": [
        "evidence/platform-probe.json",
        "evidence/home-mobile.png",
        "evidence/home-desktop.png"
      ]
    },
    {
      "principleId": "adapt-to-the-form-factor",
      "checkId": "input-modality-aware",
      "confidence": "high",
      "method": "Direct multi-modal inspection across representative paths",
      "evidence": "The focus probe reports outline none on active score filters, while Lighthouse fails target-size and the mobile screenshot shows densely packed controls.",
      "pathIds": [
        "home"
      ],
      "status": "issues",
      "findingIds": [
        "F06"
      ],
      "artifacts": [
        "evidence/platform-probe.json",
        "evidence/lighthouse.json",
        "evidence/home-mobile.png"
      ]
    },
    {
      "principleId": "support-core-task-success",
      "checkId": "clear-purpose-and-primary-action",
      "confidence": "high",
      "method": "Direct multi-modal inspection across representative paths",
      "evidence": "First viewport immediately presents live scores, sport switching and score status; title and highlighted tab identify the purpose.",
      "pathIds": [
        "home"
      ],
      "status": "pass"
    },
    {
      "principleId": "support-core-task-success",
      "checkId": "primary-flow-completion",
      "confidence": "high",
      "method": "Direct multi-modal inspection across representative paths",
      "evidence": "Home, completed-results and league schedule paths all loaded usable score content without account gating or dead ends.",
      "pathIds": [
        "home"
      ],
      "status": "pass"
    },
    {
      "principleId": "support-core-task-success",
      "checkId": "clear-system-state-and-recovery",
      "confidence": "high",
      "method": "Direct multi-modal inspection across representative paths",
      "evidence": "Crawler view exposes a loading state and the unknown route provides a clear Thai error with a prominent return-home action.",
      "pathIds": [
        "home"
      ],
      "status": "pass"
    },
    {
      "principleId": "be-fast-and-stable",
      "checkId": "good-core-web-vitals",
      "confidence": "high",
      "method": "Direct multi-modal inspection across representative paths",
      "evidence": "Lighthouse measured LCP 13.0s and TBT 3,890ms (performance 0.30); the CDP trace corroborates LCP 5.39s and 1,968ms total blocking time.",
      "pathIds": [
        "home"
      ],
      "status": "issues",
      "findingIds": [
        "F07"
      ],
      "artifacts": [
        "evidence/lighthouse.json",
        "evidence/home-trace-summary.json",
        "evidence/home-trace.json"
      ]
    },
    {
      "principleId": "be-fast-and-stable",
      "checkId": "visual-stability",
      "confidence": "high",
      "method": "Direct multi-modal inspection across representative paths",
      "evidence": "Mobile layout observer measured CLS 0.093, within the good <=0.1 threshold, with reserved banner slots visible in screenshots.",
      "pathIds": [
        "home"
      ],
      "status": "pass"
    },
    {
      "principleId": "be-fast-and-stable",
      "checkId": "efficient-main-thread",
      "confidence": "high",
      "method": "Direct multi-modal inspection across representative paths",
      "evidence": "Lighthouse measured LCP 13.0s and TBT 3,890ms (performance 0.30); the CDP trace corroborates LCP 5.39s and 1,968ms total blocking time. HAR shows 10 separate Google tag/gtag payloads among 25 scripts; the trace records six long tasks and 1,968ms blocking time.",
      "pathIds": [
        "home"
      ],
      "status": "issues",
      "findingIds": [
        "F07",
        "F27"
      ],
      "artifacts": [
        "evidence/lighthouse.json",
        "evidence/home-trace-summary.json",
        "evidence/home-trace.json",
        "evidence/home-summary.json"
      ]
    },
    {
      "principleId": "be-fast-and-stable",
      "checkId": "efficient-resource-delivery",
      "confidence": "high",
      "method": "Direct multi-modal inspection across representative paths",
      "evidence": "The HAR records 99 requests/2.63MB, 25 scripts/1.80MB, 10 grounded render-blocking candidates and 51 third-party requests; Lighthouse estimates 712KiB unused JS and 70KiB unused CSS.",
      "pathIds": [
        "home"
      ],
      "status": "issues",
      "findingIds": [
        "F08"
      ],
      "artifacts": [
        "evidence/home-summary.json",
        "evidence/home.har",
        "evidence/lighthouse.json"
      ]
    },
    {
      "principleId": "be-fast-and-stable",
      "checkId": "trim-unused-and-duplicate-code",
      "confidence": "high",
      "method": "Direct multi-modal inspection across representative paths",
      "evidence": "The HAR records 99 requests/2.63MB, 25 scripts/1.80MB, 10 grounded render-blocking candidates and 51 third-party requests; Lighthouse estimates 712KiB unused JS and 70KiB unused CSS. HAR shows 10 separate Google tag/gtag payloads among 25 scripts; the trace records six long tasks and 1,968ms blocking time.",
      "pathIds": [
        "home"
      ],
      "status": "issues",
      "findingIds": [
        "F08",
        "F27"
      ],
      "artifacts": [
        "evidence/home-summary.json",
        "evidence/home.har",
        "evidence/lighthouse.json",
        "evidence/home-trace-summary.json"
      ]
    },
    {
      "principleId": "be-inclusive",
      "checkId": "names-roles-labels",
      "confidence": "high",
      "method": "Direct multi-modal inspection across representative paths",
      "evidence": "Lighthouse reports 43 images without alt and 42 links without discernible names; the images primitive independently reports 44 missing alt attributes.",
      "pathIds": [
        "home"
      ],
      "status": "issues",
      "findingIds": [
        "F09"
      ],
      "artifacts": [
        "evidence/lighthouse.json",
        "evidence/images.json"
      ]
    },
    {
      "principleId": "be-inclusive",
      "checkId": "sufficient-contrast",
      "confidence": "high",
      "method": "Direct multi-modal inspection across representative paths",
      "evidence": "Lighthouse reports two foreground/background contrast failures; dense pale metadata is visible in the mobile score screenshots.",
      "pathIds": [
        "home"
      ],
      "status": "issues",
      "findingIds": [
        "F12"
      ],
      "artifacts": [
        "evidence/lighthouse.json",
        "evidence/home-mobile.png"
      ]
    },
    {
      "principleId": "be-inclusive",
      "checkId": "structure-and-focus",
      "confidence": "high",
      "method": "Direct multi-modal inspection across representative paths",
      "evidence": "The platform probe found zero headings and zero main/nav/header/footer landmarks; Lighthouse fails main-landmark and the focus probe shows outline:none on multiple controls.",
      "pathIds": [
        "home"
      ],
      "status": "issues",
      "findingIds": [
        "F10"
      ],
      "artifacts": [
        "evidence/platform-probe.json",
        "evidence/lighthouse.json"
      ]
    },
    {
      "principleId": "be-inclusive",
      "checkId": "legible-text",
      "confidence": "high",
      "method": "Direct multi-modal inspection across representative paths",
      "evidence": "The 360px screenshots pack multiple teams, times and odds into narrow 28–40px rows with very small pale metadata and interleaved banners.",
      "pathIds": [
        "home"
      ],
      "status": "issues",
      "findingIds": [
        "F13"
      ],
      "artifacts": [
        "evidence/home-mobile.png",
        "evidence/results-mobile.png"
      ]
    },
    {
      "principleId": "be-inclusive",
      "checkId": "zoom-reflow-targets-and-media",
      "confidence": "high",
      "method": "Direct multi-modal inspection across representative paths",
      "evidence": "DOM evidence contains maximum-scale=1.0,user-scalable=0; Lighthouse fails meta-viewport and target-size.",
      "pathIds": [
        "home"
      ],
      "status": "issues",
      "findingIds": [
        "F11"
      ],
      "artifacts": [
        "evidence/home-dom.json",
        "evidence/lighthouse.json"
      ]
    },
    {
      "principleId": "follow-best-practices",
      "checkId": "no-console-errors",
      "confidence": "high",
      "method": "Direct multi-modal inspection across representative paths",
      "evidence": "Lighthouse console-errors audit passed; no uncaught exception finding was emitted during the audited load.",
      "pathIds": [
        "home"
      ],
      "status": "pass"
    },
    {
      "principleId": "follow-best-practices",
      "checkId": "sound-document-and-assets",
      "confidence": "high",
      "method": "Direct multi-modal inspection across representative paths",
      "evidence": "The images primitive reports 58 images without dimensions, 56 oversized and 77 legacy-format images; Lighthouse corroborates 52 unsized images.",
      "pathIds": [
        "home"
      ],
      "status": "issues",
      "findingIds": [
        "F14"
      ],
      "artifacts": [
        "evidence/images.json",
        "evidence/lighthouse.json"
      ]
    },
    {
      "principleId": "follow-best-practices",
      "checkId": "browser-platform-hygiene",
      "confidence": "high",
      "method": "Direct multi-modal inspection across representative paths",
      "evidence": "Lighthouse reports two deprecated-API warnings, one BFCache failure reason and one DevTools inspector issue.",
      "pathIds": [
        "home"
      ],
      "status": "issues",
      "findingIds": [
        "F15"
      ],
      "artifacts": [
        "evidence/lighthouse.json"
      ]
    },
    {
      "principleId": "be-discoverable",
      "checkId": "title-and-description",
      "confidence": "high",
      "method": "Direct multi-modal inspection across representative paths",
      "evidence": "DOM has a descriptive Thai title and a detailed meta description on the public homepage.",
      "pathIds": [
        "home"
      ],
      "status": "pass"
    },
    {
      "principleId": "be-discoverable",
      "checkId": "crawlable-and-mobile-friendly",
      "confidence": "high",
      "method": "Direct multi-modal inspection across representative paths",
      "evidence": "The platform probe found 53 javascript: links; Lighthouse fails crawlable-anchors with 10 representative failures and flags robots.txt validity.",
      "pathIds": [
        "home"
      ],
      "status": "issues",
      "findingIds": [
        "F16"
      ],
      "artifacts": [
        "evidence/platform-probe.json",
        "evidence/lighthouse.json",
        "evidence/robots-sitemap.txt"
      ]
    },
    {
      "principleId": "be-discoverable",
      "checkId": "canonical-and-indexing-signals",
      "confidence": "high",
      "method": "Direct multi-modal inspection across representative paths",
      "evidence": "Manual fetch returned a sitemap index and canonical URL, but Lighthouse marks robots.txt invalid; robots.txt contains the nonstandard pattern Disallow: *-{$mid}.",
      "pathIds": [
        "home"
      ],
      "status": "issues",
      "findingIds": [
        "F17"
      ],
      "artifacts": [
        "evidence/robots-sitemap.txt",
        "evidence/lighthouse.json",
        "evidence/home-dom.json"
      ]
    },
    {
      "principleId": "be-discoverable",
      "checkId": "structured-and-shareable-metadata",
      "confidence": "high",
      "method": "Direct multi-modal inspection across representative paths",
      "evidence": "DOM contains two JSON-LD blocks plus Open Graph and Twitter title, description, image and URL metadata aligned to the score site.",
      "pathIds": [
        "home"
      ],
      "status": "pass"
    },
    {
      "principleId": "be-private-and-secure",
      "checkId": "secure-transport-and-headers",
      "confidence": "high",
      "method": "Direct multi-modal inspection across representative paths",
      "evidence": "The headers primitive found no CSP, HSTS, nosniff, frame protection, Referrer-Policy or Permissions-Policy; all 14 observed cookies lack Secure and use SameSite=None.",
      "pathIds": [
        "home"
      ],
      "status": "issues",
      "findingIds": [
        "F18"
      ],
      "artifacts": [
        "evidence/headers.json",
        "evidence/cookies.json"
      ]
    },
    {
      "principleId": "be-private-and-secure",
      "checkId": "data-minimisation-and-third-parties",
      "confidence": "high",
      "method": "Direct multi-modal inspection across representative paths",
      "evidence": "Trackers found 11 third-party origins and four known trackers; HAR attributes 51 requests and 2.25MB to third parties, including about 1.60MB from Google Tag Manager.",
      "pathIds": [
        "home"
      ],
      "status": "issues",
      "findingIds": [
        "F19"
      ],
      "artifacts": [
        "evidence/trackers.json",
        "evidence/home-summary.json",
        "evidence/home.har"
      ]
    },
    {
      "principleId": "be-private-and-secure",
      "checkId": "in-context-permissions-and-modern-auth",
      "confidence": "high",
      "method": "Direct multi-modal inspection across representative paths",
      "evidence": "The login screenshot and DOM show email/password plus Google/Facebook login; no WebAuthn/passkey affordance is present.",
      "pathIds": [
        "login"
      ],
      "status": "issues",
      "findingIds": [
        "F20"
      ],
      "artifacts": [
        "evidence/login-mobile.png",
        "evidence/login-dom.json"
      ]
    },
    {
      "principleId": "be-private-and-secure",
      "checkId": "defensive-browser-policies",
      "confidence": "high",
      "method": "Direct multi-modal inspection across representative paths",
      "evidence": "The headers primitive found no CSP, HSTS, nosniff, frame protection, Referrer-Policy or Permissions-Policy; all 14 observed cookies lack Secure and use SameSite=None.",
      "pathIds": [
        "home"
      ],
      "status": "issues",
      "findingIds": [
        "F18"
      ],
      "artifacts": [
        "evidence/headers.json",
        "evidence/cookies.json"
      ]
    },
    {
      "principleId": "be-resilient",
      "checkId": "progressive-enhancement",
      "confidence": "high",
      "method": "Direct multi-modal inspection across representative paths",
      "evidence": "Discoverability measured only 52% raw/rendered word overlap; the crawler screenshot shows a permanent “loading data” card while the rendered screenshot contains scores.",
      "pathIds": [
        "home"
      ],
      "status": "issues",
      "findingIds": [
        "F21"
      ],
      "artifacts": [
        "evidence/discoverability.json",
        "evidence/discoverability-crawler.png",
        "evidence/discoverability-rendered.png"
      ]
    },
    {
      "principleId": "be-resilient",
      "checkId": "resilient-runtime-behaviour",
      "confidence": "high",
      "method": "Direct multi-modal inspection across representative paths",
      "evidence": "Home, result and league templates loaded without clipped page-level overlays; the 360px layouts remain within the viewport.",
      "pathIds": [
        "home"
      ],
      "status": "pass"
    },
    {
      "principleId": "be-resilient",
      "checkId": "offline-and-installable",
      "confidence": "high",
      "method": "Direct multi-modal inspection across representative paths",
      "evidence": "Platform probe found no manifest or active service worker; judged contextual rather than a failure for live data.",
      "status": "not-applicable",
      "reason": "This is an intrinsically live score service; stale offline scores would be misleading, so an install/offline product requirement is not assumed."
    },
    {
      "principleId": "be-resilient",
      "checkId": "network-and-http-failure-states",
      "confidence": "high",
      "method": "Direct multi-modal inspection across representative paths",
      "evidence": "Unknown-route testing produced a dedicated, branded error page with a direct return-home control rather than a blank shell.",
      "pathIds": [
        "home"
      ],
      "status": "pass"
    },
    {
      "principleId": "be-internationalised",
      "checkId": "lang-dir-and-logical-properties",
      "confidence": "high",
      "method": "Direct multi-modal inspection across representative paths",
      "evidence": "The document correctly declares lang=th, but the CSS probe found 0 logical-property uses and 479 physical left/right declarations.",
      "pathIds": [
        "home"
      ],
      "status": "issues",
      "findingIds": [
        "F22"
      ],
      "artifacts": [
        "evidence/platform-probe.json",
        "evidence/home-dom.json"
      ]
    },
    {
      "principleId": "be-internationalised",
      "checkId": "locale-aware-data",
      "confidence": "high",
      "method": "Direct multi-modal inspection across representative paths",
      "evidence": "The Thai document renders Thai-localised competition labels, dates/times and score state consistently across home, results and league paths.",
      "pathIds": [
        "home"
      ],
      "status": "pass"
    },
    {
      "principleId": "be-internationalised",
      "checkId": "time-zone-correctness",
      "confidence": "high",
      "method": "Direct multi-modal inspection across representative paths",
      "evidence": "The live site sets a zone-offset preference and renders explicit event times consistently across score and league schedule views.",
      "pathIds": [
        "home"
      ],
      "status": "pass"
    },
    {
      "principleId": "be-trustworthy",
      "checkId": "no-dark-patterns",
      "confidence": "high",
      "method": "Direct multi-modal inspection across representative paths",
      "evidence": "Prominent in-feed banners have empty accessible text; following /ad/1729.html redirects to a LINE add-friend QR page, while banners visibly promote betting/casino products.",
      "pathIds": [
        "ad"
      ],
      "status": "issues",
      "findingIds": [
        "F23"
      ],
      "artifacts": [
        "evidence/home-mobile.png",
        "evidence/ad-mobile.png",
        "evidence/home-dom.json"
      ]
    },
    {
      "principleId": "be-trustworthy",
      "checkId": "humane-error-handling",
      "confidence": "high",
      "method": "Direct multi-modal inspection across representative paths",
      "evidence": "The before and post-submit login screenshots are identical; no required-field guidance or actionable error appears.",
      "pathIds": [
        "login"
      ],
      "status": "issues",
      "findingIds": [
        "F24"
      ],
      "artifacts": [
        "evidence/login-mobile.png",
        "evidence/login-invalid-mobile.png"
      ]
    },
    {
      "principleId": "be-trustworthy",
      "checkId": "trustworthy-input-assistance",
      "confidence": "high",
      "method": "Direct multi-modal inspection across representative paths",
      "evidence": "Login DOM uses autocomplete=\"account\" and autocomplete=\"pwd\" instead of username and current-password.",
      "pathIds": [
        "login"
      ],
      "status": "issues",
      "findingIds": [
        "F25"
      ],
      "artifacts": [
        "evidence/login-dom.json"
      ]
    },
    {
      "principleId": "be-trustworthy",
      "checkId": "safe-commercial-and-account-flows",
      "confidence": "high",
      "method": "Direct multi-modal inspection across representative paths",
      "evidence": "Login presents reset and registration alongside sign-in, with clearly separated Google/Facebook alternatives and no forced continuation observed.",
      "pathIds": [
        "home"
      ],
      "status": "pass"
    },
    {
      "principleId": "be-sustainable",
      "checkId": "optimised-assets",
      "confidence": "high",
      "method": "Direct multi-modal inspection across representative paths",
      "evidence": "Images evidence reports 56 oversized, 55 below-fold images without lazy loading, 77 legacy-format images and 58 without dimensions.",
      "pathIds": [
        "home"
      ],
      "status": "issues",
      "findingIds": [
        "F26"
      ],
      "artifacts": [
        "evidence/images.json",
        "evidence/home-summary.json"
      ]
    },
    {
      "principleId": "be-sustainable",
      "checkId": "no-wasteful-work",
      "confidence": "high",
      "method": "Direct multi-modal inspection across representative paths",
      "evidence": "HAR shows 10 separate Google tag/gtag payloads among 25 scripts; the trace records six long tasks and 1,968ms blocking time.",
      "pathIds": [
        "home"
      ],
      "status": "issues",
      "findingIds": [
        "F27"
      ],
      "artifacts": [
        "evidence/home-summary.json",
        "evidence/home-trace-summary.json"
      ]
    },
    {
      "principleId": "be-sustainable",
      "checkId": "third-party-and-media-budget",
      "confidence": "high",
      "method": "Direct multi-modal inspection across representative paths",
      "evidence": "Trackers found 11 third-party origins and four known trackers; HAR attributes 51 requests and 2.25MB to third parties, including about 1.60MB from Google Tag Manager. Images evidence reports 56 oversized, 55 below-fold images without lazy loading, 77 legacy-format images and 58 without dimensions. HAR shows 10 separate Google tag/gtag payloads among 25 scripts; the trace records six long tasks and 1,968ms blocking time.",
      "pathIds": [
        "home"
      ],
      "status": "issues",
      "findingIds": [
        "F19",
        "F26",
        "F27"
      ],
      "artifacts": [
        "evidence/trackers.json",
        "evidence/home-summary.json",
        "evidence/home.har",
        "evidence/images.json",
        "evidence/home-trace-summary.json"
      ]
    },
    {
      "principleId": "be-agent-ready",
      "checkId": "structured-agent-capabilities",
      "confidence": "high",
      "method": "Direct multi-modal inspection across representative paths",
      "evidence": "Recon found no agent tool surface; absence is not penalised under this contextual principle.",
      "status": "not-applicable",
      "reason": "No declared agent-facing intent exists and WebMCP remains an emerging opportunity for this public score viewer."
    },
    {
      "principleId": "be-agent-ready",
      "checkId": "on-device-inference",
      "confidence": "high",
      "method": "Direct multi-modal inspection across representative paths",
      "evidence": "Recon found no summarisation or generative interaction whose absence harms the core score task.",
      "status": "not-applicable",
      "reason": "No user task on the audited score, league, login, or recovery paths requires on-device inference."
    },
    {
      "principleId": "be-memory-efficient",
      "checkId": "no-leak-under-repeated-interaction",
      "confidence": "high",
      "method": "Direct multi-modal inspection across representative paths",
      "evidence": "After 10 alternating sport-tab interactions, heap self-size was 44.3MB versus 43.3MB baseline (+2.3%); key LiveMatch count stayed exactly 229 and native self-size decreased.",
      "pathIds": [
        "home"
      ],
      "status": "pass"
    },
    {
      "principleId": "be-memory-efficient",
      "checkId": "bounded-footprint",
      "confidence": "high",
      "method": "Direct multi-modal inspection across representative paths",
      "evidence": "Baseline heap summary contains 706,318 nodes and 43.3MB self size; after repeated tab switching it contains 750,269 nodes and 44.3MB.",
      "pathIds": [
        "home"
      ],
      "status": "issues",
      "findingIds": [
        "F28"
      ],
      "artifacts": [
        "evidence/heap-baseline.heapsnapshot",
        "evidence/heap-post.heapsnapshot"
      ]
    },
    {
      "principleId": "be-memory-efficient",
      "checkId": "no-detached-dom-or-unbounded-listeners",
      "confidence": "high",
      "method": "Direct multi-modal inspection across representative paths",
      "evidence": "Neither heap summary exposes a Detached* constructor among retained leaders; native node count fell from 340,061 to 329,217 after repeated interaction.",
      "pathIds": [
        "home"
      ],
      "status": "pass"
    }
  ],
  "principleOutcomes": [
    {
      "principleId": "respect-user-preferences",
      "expectation": "default",
      "status": "issues",
      "findingIds": [
        "F01",
        "F02"
      ]
    },
    {
      "principleId": "implement-natural-interactions",
      "expectation": "default",
      "status": "issues",
      "findingIds": [
        "F03"
      ]
    },
    {
      "principleId": "provide-guided-navigation",
      "expectation": "default",
      "status": "pass"
    },
    {
      "principleId": "maximize-content-reduce-noise",
      "expectation": "default",
      "status": "issues",
      "findingIds": [
        "F04",
        "F23"
      ]
    },
    {
      "principleId": "adapt-to-the-form-factor",
      "expectation": "default",
      "status": "issues",
      "findingIds": [
        "F05",
        "F06"
      ]
    },
    {
      "principleId": "support-core-task-success",
      "expectation": "default",
      "status": "pass"
    },
    {
      "principleId": "be-fast-and-stable",
      "expectation": "default",
      "status": "issues",
      "findingIds": [
        "F07",
        "F27",
        "F08"
      ]
    },
    {
      "principleId": "be-inclusive",
      "expectation": "default",
      "status": "issues",
      "findingIds": [
        "F09",
        "F12",
        "F10",
        "F13",
        "F11"
      ]
    },
    {
      "principleId": "follow-best-practices",
      "expectation": "default",
      "status": "issues",
      "findingIds": [
        "F14",
        "F15"
      ]
    },
    {
      "principleId": "be-discoverable",
      "expectation": "default",
      "status": "issues",
      "findingIds": [
        "F16",
        "F17"
      ]
    },
    {
      "principleId": "be-private-and-secure",
      "expectation": "default",
      "status": "issues",
      "findingIds": [
        "F18",
        "F19",
        "F20"
      ]
    },
    {
      "principleId": "be-resilient",
      "expectation": "contextual",
      "status": "issues",
      "findingIds": [
        "F21"
      ]
    },
    {
      "principleId": "be-internationalised",
      "expectation": "contextual",
      "status": "issues",
      "findingIds": [
        "F22"
      ]
    },
    {
      "principleId": "be-trustworthy",
      "expectation": "default",
      "status": "issues",
      "findingIds": [
        "F23",
        "F24",
        "F25"
      ]
    },
    {
      "principleId": "be-sustainable",
      "expectation": "contextual",
      "status": "issues",
      "findingIds": [
        "F26",
        "F27",
        "F19"
      ]
    },
    {
      "principleId": "be-agent-ready",
      "expectation": "contextual",
      "status": "not-applicable",
      "reason": "No declared agent-facing intent exists and WebMCP remains an emerging opportunity for this public score viewer. No user task on the audited score, league, login, or recovery paths requires on-device inference."
    },
    {
      "principleId": "be-memory-efficient",
      "expectation": "default",
      "status": "issues",
      "findingIds": [
        "F28"
      ]
    }
  ],
  "paths": [
    {
      "id": "home",
      "description": "Live-score homepage, the primary real-time score task and shared site chrome.",
      "url": "https://www.thscore99.com/",
      "conditions": [
        "desktop",
        "viewport: 360x800",
        "prefers-color-scheme: dark",
        "forced-colors: active",
        "prefers-reduced-motion: reduce",
        "keyboard focus"
      ],
      "result": "issues"
    },
    {
      "id": "results",
      "description": "Completed-results listing, representing score-list variants.",
      "url": "https://www.thscore99.com/football/results",
      "conditions": [
        "viewport: 360x800"
      ],
      "result": "issues"
    },
    {
      "id": "league",
      "description": "Champions League detail/schedule, representing league database pages.",
      "url": "https://www.thscore99.com/football/database/league-103",
      "conditions": [
        "viewport: 360x800"
      ],
      "result": "issues"
    },
    {
      "id": "login",
      "description": "Account login, representing the authentication and form journey.",
      "url": "https://user.thscore99.com/account/login",
      "conditions": [
        "viewport: 360x800",
        "empty submission"
      ],
      "result": "issues"
    },
    {
      "id": "ad",
      "description": "Prominent advertising destination, tested to verify where score-page banners lead.",
      "url": "https://www.thscore99.com/ad/1729.html",
      "conditions": [
        "viewport: 360x800"
      ],
      "result": "issues"
    },
    {
      "id": "not-found",
      "description": "Unknown-route recovery state.",
      "url": "https://www.thscore99.com/this-route-does-not-exist",
      "conditions": [
        "viewport: 360x800"
      ],
      "result": "pass"
    }
  ],
  "findings": [
    {
      "id": "F01",
      "severity": "medium",
      "confidence": "high",
      "principleId": "respect-user-preferences",
      "principleCheckId": "respects-color-scheme",
      "guidanceId": "dark-mode",
      "guidanceCategory": "user-experience",
      "summary": "The site ignores the user’s dark color-scheme preference.",
      "evidence": "The dark-emulated screenshot is pixel-identical to the light screenshot; white score rows and pale chrome remain unchanged.",
      "artifacts": [
        "evidence/home-dark.png",
        "evidence/home-desktop.png"
      ],
      "suggestedFix": "Declare color-scheme and provide preference-driven dark surface, text, border, and image treatments.",
      "effort": "medium",
      "pathId": "home",
      "url": "https://www.thscore99.com/"
    },
    {
      "id": "F02",
      "severity": "medium",
      "confidence": "high",
      "principleId": "respect-user-preferences",
      "principleCheckId": "respects-reduced-motion",
      "guidanceId": "accessibility",
      "guidanceCategory": "accessibility",
      "summary": "The loading animation continues under reduced-motion.",
      "evidence": "The reduced-motion probe reports matchMedia reduce=true while the timeMin animation remains running with an infinite iteration count; no reduced-motion CSS was found.",
      "artifacts": [
        "evidence/motion-css.json"
      ],
      "suggestedFix": "Disable non-essential looping motion in a prefers-reduced-motion: reduce query.",
      "effort": "small",
      "pathId": "home",
      "url": "https://www.thscore99.com/"
    },
    {
      "id": "F03",
      "severity": "medium",
      "confidence": "high",
      "principleId": "implement-natural-interactions",
      "principleCheckId": "view-transitions",
      "guidanceId": "same-document-transitions",
      "guidanceCategory": "user-experience",
      "summary": "Navigation is wired as abrupt JavaScript state changes rather than resilient, transition-aware navigation.",
      "evidence": "The platform probe found 53 javascript: links and zero View Transition CSS; homepage navigation and score tabs are custom onclick state changes.",
      "artifacts": [
        "evidence/platform-probe.json",
        "evidence/home-dom.json"
      ],
      "suggestedFix": "Use real links/buttons and progressively enhance meaningful state or route changes with View Transitions while respecting reduced motion.",
      "effort": "large",
      "pathId": "home",
      "url": "https://www.thscore99.com/"
    },
    {
      "id": "F04",
      "severity": "high",
      "confidence": "high",
      "principleId": "maximize-content-reduce-noise",
      "principleCheckId": "no-intrusive-interruptions",
      "guidanceId": "light-dismiss-a-dialog",
      "guidanceCategory": "user-experience",
      "summary": "Advertising repeatedly interrupts the score list and dominates the content hierarchy.",
      "evidence": "The 360px homepage and results screenshots show full-width gambling banners inserted between small score rows, plus a dismissible domain banner above the primary UI.",
      "artifacts": [
        "evidence/home-mobile.png",
        "evidence/results-mobile.png"
      ],
      "suggestedFix": "Remove in-feed interruption ads from the primary score journey or confine clearly labelled advertising to non-obscuring, dismissible placements.",
      "effort": "medium",
      "pathId": "home",
      "url": "https://www.thscore99.com/"
    },
    {
      "id": "F05",
      "severity": "medium",
      "confidence": "high",
      "principleId": "adapt-to-the-form-factor",
      "principleCheckId": "component-level-responsiveness",
      "guidanceId": "size-aware-styling",
      "guidanceCategory": "css",
      "summary": "The complex score UI uses viewport-era physical CSS rather than component responsiveness.",
      "evidence": "The CSS probe found 0 container-query rules and 479 physical left/right declarations; reused score rows and navigation are presented at materially different widths.",
      "artifacts": [
        "evidence/platform-probe.json",
        "evidence/home-mobile.png",
        "evidence/home-desktop.png"
      ],
      "suggestedFix": "Make reused score and navigation components size-aware with container queries and intrinsic/logical sizing.",
      "effort": "large",
      "pathId": "home",
      "url": "https://www.thscore99.com/"
    },
    {
      "id": "F06",
      "severity": "high",
      "confidence": "high",
      "principleId": "adapt-to-the-form-factor",
      "principleCheckId": "input-modality-aware",
      "guidanceId": "accessibility",
      "guidanceCategory": "accessibility",
      "summary": "Several primary controls lack visible focus and adequate target treatment.",
      "evidence": "The focus probe reports outline none on active score filters, while Lighthouse fails target-size and the mobile screenshot shows densely packed controls.",
      "artifacts": [
        "evidence/platform-probe.json",
        "evidence/lighthouse.json",
        "evidence/home-mobile.png"
      ],
      "suggestedFix": "Use semantic controls, preserve a strong :focus-visible indicator, and provide at least 24px spaced targets, preferably 44px for primary touch actions.",
      "effort": "medium",
      "pathId": "home",
      "url": "https://www.thscore99.com/"
    },
    {
      "id": "F07",
      "severity": "critical",
      "confidence": "high",
      "principleId": "be-fast-and-stable",
      "principleCheckId": "good-core-web-vitals",
      "guidanceId": "performance",
      "guidanceCategory": "performance",
      "summary": "The primary score page is very slow and blocks interaction.",
      "evidence": "Lighthouse measured LCP 13.0s and TBT 3,890ms (performance 0.30); the CDP trace corroborates LCP 5.39s and 1,968ms total blocking time.",
      "artifacts": [
        "evidence/lighthouse.json",
        "evidence/home-trace-summary.json",
        "evidence/home-trace.json"
      ],
      "suggestedFix": "Prioritise the score-page LCP, defer non-critical work, and split long tasks until LCP and interaction responsiveness reach good thresholds.",
      "effort": "large",
      "pathId": "home",
      "url": "https://www.thscore99.com/"
    },
    {
      "id": "F08",
      "severity": "high",
      "confidence": "high",
      "principleId": "be-fast-and-stable",
      "principleCheckId": "efficient-resource-delivery",
      "guidanceId": "optimize-preload-priority",
      "guidanceCategory": "performance",
      "summary": "The load ships render-blocking resources and duplicated heavy analytics code.",
      "evidence": "The HAR records 99 requests/2.63MB, 25 scripts/1.80MB, 10 grounded render-blocking candidates and 51 third-party requests; Lighthouse estimates 712KiB unused JS and 70KiB unused CSS.",
      "artifacts": [
        "evidence/home-summary.json",
        "evidence/home.har",
        "evidence/lighthouse.json"
      ],
      "suggestedFix": "Remove duplicate tags, defer non-critical scripts, shorten blocking chains, cache static assets, and ship only route-critical code.",
      "effort": "large",
      "pathId": "home",
      "url": "https://www.thscore99.com/"
    },
    {
      "id": "F09",
      "severity": "high",
      "confidence": "high",
      "principleId": "be-inclusive",
      "principleCheckId": "names-roles-labels",
      "guidanceId": "accessibility",
      "guidanceCategory": "accessibility",
      "summary": "The page lacks accessible names and alternatives at scale.",
      "evidence": "Lighthouse reports 43 images without alt and 42 links without discernible names; the images primitive independently reports 44 missing alt attributes.",
      "artifacts": [
        "evidence/lighthouse.json",
        "evidence/images.json"
      ],
      "suggestedFix": "Give meaningful images alternatives, mark decoration empty-alt, and replace empty/custom links with named semantic buttons or links.",
      "effort": "medium",
      "pathId": "home",
      "url": "https://www.thscore99.com/"
    },
    {
      "id": "F10",
      "severity": "high",
      "confidence": "high",
      "principleId": "be-inclusive",
      "principleCheckId": "structure-and-focus",
      "guidanceId": "accessibility",
      "guidanceCategory": "accessibility",
      "summary": "The document has no heading or landmark structure and focus is inconsistently suppressed.",
      "evidence": "The platform probe found zero headings and zero main/nav/header/footer landmarks; Lighthouse fails main-landmark and the focus probe shows outline:none on multiple controls.",
      "artifacts": [
        "evidence/platform-probe.json",
        "evidence/lighthouse.json"
      ],
      "suggestedFix": "Add a logical heading hierarchy and semantic landmarks, then make DOM/tab order and visible focus follow reading order.",
      "effort": "medium",
      "pathId": "home",
      "url": "https://www.thscore99.com/"
    },
    {
      "id": "F11",
      "severity": "high",
      "confidence": "high",
      "principleId": "be-inclusive",
      "principleCheckId": "zoom-reflow-targets-and-media",
      "guidanceId": "accessibility",
      "guidanceCategory": "accessibility",
      "summary": "The viewport explicitly prevents user zoom and some targets are too small.",
      "evidence": "DOM evidence contains maximum-scale=1.0,user-scalable=0; Lighthouse fails meta-viewport and target-size.",
      "artifacts": [
        "evidence/home-dom.json",
        "evidence/lighthouse.json"
      ],
      "suggestedFix": "Remove maximum-scale/user-scalable restrictions and enlarge or space touch targets.",
      "effort": "small",
      "pathId": "home",
      "url": "https://www.thscore99.com/"
    },
    {
      "id": "F12",
      "severity": "medium",
      "confidence": "high",
      "principleId": "be-inclusive",
      "principleCheckId": "sufficient-contrast",
      "guidanceId": "accessibility",
      "guidanceCategory": "accessibility",
      "summary": "Some text and controls fail minimum contrast.",
      "evidence": "Lighthouse reports two foreground/background contrast failures; dense pale metadata is visible in the mobile score screenshots.",
      "artifacts": [
        "evidence/lighthouse.json",
        "evidence/home-mobile.png"
      ],
      "suggestedFix": "Adjust text and essential-control tokens to meet WCAG contrast ratios in all states.",
      "effort": "small",
      "pathId": "home",
      "url": "https://www.thscore99.com/"
    },
    {
      "id": "F13",
      "severity": "medium",
      "confidence": "high",
      "principleId": "be-inclusive",
      "principleCheckId": "legible-text",
      "guidanceId": "improve-text-layout-and-legibility",
      "guidanceCategory": "css",
      "summary": "Dense score rows compromise reading comfort.",
      "evidence": "The 360px screenshots pack multiple teams, times and odds into narrow 28–40px rows with very small pale metadata and interleaved banners.",
      "artifacts": [
        "evidence/home-mobile.png",
        "evidence/results-mobile.png"
      ],
      "suggestedFix": "Increase text size/line height and grouping, and reduce competing information so teams, state, and odds scan clearly.",
      "effort": "medium",
      "pathId": "home",
      "url": "https://www.thscore99.com/"
    },
    {
      "id": "F14",
      "severity": "medium",
      "confidence": "high",
      "principleId": "follow-best-practices",
      "principleCheckId": "sound-document-and-assets",
      "guidanceId": "html",
      "guidanceCategory": "html",
      "summary": "Image and document asset hygiene is weak.",
      "evidence": "The images primitive reports 58 images without dimensions, 56 oversized and 77 legacy-format images; Lighthouse corroborates 52 unsized images.",
      "artifacts": [
        "evidence/images.json",
        "evidence/lighthouse.json"
      ],
      "suggestedFix": "Add intrinsic dimensions and responsive sources, preserve aspect ratio, and convert eligible assets to efficient formats.",
      "effort": "medium",
      "pathId": "home",
      "url": "https://www.thscore99.com/"
    },
    {
      "id": "F15",
      "severity": "medium",
      "confidence": "high",
      "principleId": "follow-best-practices",
      "principleCheckId": "browser-platform-hygiene",
      "guidanceId": "html",
      "guidanceCategory": "html",
      "summary": "The page triggers deprecated API, BFCache and inspector issues.",
      "evidence": "Lighthouse reports two deprecated-API warnings, one BFCache failure reason and one DevTools inspector issue.",
      "artifacts": [
        "evidence/lighthouse.json"
      ],
      "suggestedFix": "Remove deprecated APIs and the recorded BFCache/inspector blockers, then verify in current DevTools.",
      "effort": "medium",
      "pathId": "home",
      "url": "https://www.thscore99.com/"
    },
    {
      "id": "F16",
      "severity": "high",
      "confidence": "high",
      "principleId": "be-discoverable",
      "principleCheckId": "crawlable-and-mobile-friendly",
      "guidanceId": "html",
      "guidanceCategory": "html",
      "summary": "Primary navigation and score actions are not crawlable.",
      "evidence": "The platform probe found 53 javascript: links; Lighthouse fails crawlable-anchors with 10 representative failures and flags robots.txt validity.",
      "artifacts": [
        "evidence/platform-probe.json",
        "evidence/lighthouse.json",
        "evidence/robots-sitemap.txt"
      ],
      "suggestedFix": "Use descriptive real href URLs for routes and valid buttons for in-page actions; correct unsupported robots patterns.",
      "effort": "large",
      "pathId": "home",
      "url": "https://www.thscore99.com/"
    },
    {
      "id": "F17",
      "severity": "medium",
      "confidence": "high",
      "principleId": "be-discoverable",
      "principleCheckId": "canonical-and-indexing-signals",
      "guidanceId": "html",
      "guidanceCategory": "html",
      "summary": "The robots policy contains an invalid pattern despite otherwise useful sitemap/canonical signals.",
      "evidence": "Manual fetch returned a sitemap index and canonical URL, but Lighthouse marks robots.txt invalid; robots.txt contains the nonstandard pattern Disallow: *-{$mid}.",
      "artifacts": [
        "evidence/robots-sitemap.txt",
        "evidence/lighthouse.json",
        "evidence/home-dom.json"
      ],
      "suggestedFix": "Replace nonstandard robots directives with valid crawler syntax and verify each sitemap child remains reachable.",
      "effort": "small",
      "pathId": "home",
      "url": "https://www.thscore99.com/"
    },
    {
      "id": "F18",
      "severity": "critical",
      "confidence": "high",
      "principleId": "be-private-and-secure",
      "principleCheckId": "secure-transport-and-headers",
      "guidanceId": "security",
      "guidanceCategory": "security",
      "summary": "Essential security headers and cookie protections are absent.",
      "evidence": "The headers primitive found no CSP, HSTS, nosniff, frame protection, Referrer-Policy or Permissions-Policy; all 14 observed cookies lack Secure and use SameSite=None.",
      "artifacts": [
        "evidence/headers.json",
        "evidence/cookies.json"
      ],
      "suggestedFix": "Deploy CSP and HSTS, add nosniff/frame/referrer/permissions policies, and set cookies Secure with an appropriate SameSite mode.",
      "effort": "medium",
      "pathId": "home",
      "url": "https://www.thscore99.com/"
    },
    {
      "id": "F19",
      "severity": "high",
      "confidence": "high",
      "principleId": "be-private-and-secure",
      "principleCheckId": "data-minimisation-and-third-parties",
      "guidanceId": "privacy",
      "guidanceCategory": "privacy",
      "summary": "The page loads an excessive tracking and third-party footprint.",
      "evidence": "Trackers found 11 third-party origins and four known trackers; HAR attributes 51 requests and 2.25MB to third parties, including about 1.60MB from Google Tag Manager.",
      "artifacts": [
        "evidence/trackers.json",
        "evidence/home-summary.json",
        "evidence/home.har"
      ],
      "suggestedFix": "Consolidate analytics to one justified, consent-aware setup; remove duplicate trackers and defer/minimise remaining collection.",
      "effort": "medium",
      "pathId": "home",
      "url": "https://www.thscore99.com/"
    },
    {
      "id": "F20",
      "severity": "medium",
      "confidence": "high",
      "principleId": "be-private-and-secure",
      "principleCheckId": "in-context-permissions-and-modern-auth",
      "guidanceId": "passkeys",
      "guidanceCategory": "authentication",
      "summary": "Authentication is password/social-provider only, with no phishing-resistant option.",
      "evidence": "The login screenshot and DOM show email/password plus Google/Facebook login; no WebAuthn/passkey affordance is present.",
      "artifacts": [
        "evidence/login-mobile.png",
        "evidence/login-dom.json"
      ],
      "suggestedFix": "Offer passkey registration and authentication alongside recovery-capable fallback methods.",
      "effort": "large",
      "pathId": "login",
      "url": "https://user.thscore99.com/account/login"
    },
    {
      "id": "F21",
      "severity": "high",
      "confidence": "high",
      "principleId": "be-resilient",
      "principleCheckId": "progressive-enhancement",
      "guidanceId": "stabilize-reactive-state",
      "guidanceCategory": "performance",
      "summary": "Live-score content is not available without JavaScript.",
      "evidence": "Discoverability measured only 52% raw/rendered word overlap; the crawler screenshot shows a permanent “loading data” card while the rendered screenshot contains scores.",
      "artifacts": [
        "evidence/discoverability.json",
        "evidence/discoverability-crawler.png",
        "evidence/discoverability-rendered.png"
      ],
      "suggestedFix": "Server-render the primary score list and real navigation, then hydrate live updates as a progressive enhancement.",
      "effort": "large",
      "pathId": "home",
      "url": "https://www.thscore99.com/"
    },
    {
      "id": "F22",
      "severity": "low",
      "confidence": "high",
      "principleId": "be-internationalised",
      "principleCheckId": "lang-dir-and-logical-properties",
      "guidanceId": "translator",
      "guidanceCategory": "internationalisation",
      "summary": "The stylesheet is not prepared for alternate writing directions.",
      "evidence": "The document correctly declares lang=th, but the CSS probe found 0 logical-property uses and 479 physical left/right declarations.",
      "artifacts": [
        "evidence/platform-probe.json",
        "evidence/home-dom.json"
      ],
      "suggestedFix": "Retain the correct language declaration and migrate directional layout to logical properties, with dir-aware testing.",
      "effort": "large",
      "pathId": "home",
      "url": "https://www.thscore99.com/"
    },
    {
      "id": "F23",
      "severity": "critical",
      "confidence": "high",
      "principleId": "be-trustworthy",
      "principleCheckId": "no-dark-patterns",
      "guidanceId": "html",
      "guidanceCategory": "html",
      "summary": "Unlabelled score-page ads lead to gambling promotion and unrelated QR acquisition.",
      "evidence": "Prominent in-feed banners have empty accessible text; following /ad/1729.html redirects to a LINE add-friend QR page, while banners visibly promote betting/casino products.",
      "artifacts": [
        "evidence/home-mobile.png",
        "evidence/ad-mobile.png",
        "evidence/home-dom.json"
      ],
      "suggestedFix": "Clearly label sponsorship and destinations, remove disguised gambling/QR redirects from the core score flow, and expose honest destination text.",
      "effort": "medium",
      "pathId": "ad",
      "url": "https://www.thscore99.com/ad/1729.html"
    },
    {
      "id": "F24",
      "severity": "high",
      "confidence": "high",
      "principleId": "be-trustworthy",
      "principleCheckId": "humane-error-handling",
      "guidanceId": "forms",
      "guidanceCategory": "forms",
      "summary": "The login form gives no visible feedback after an empty submission.",
      "evidence": "The before and post-submit login screenshots are identical; no required-field guidance or actionable error appears.",
      "artifacts": [
        "evidence/login-mobile.png",
        "evidence/login-invalid-mobile.png"
      ],
      "suggestedFix": "Validate after submit/interaction, mark fields invalid, announce a concise error, and move focus to an error summary or first invalid field.",
      "effort": "small",
      "pathId": "login",
      "url": "https://user.thscore99.com/account/login"
    },
    {
      "id": "F25",
      "severity": "medium",
      "confidence": "high",
      "principleId": "be-trustworthy",
      "principleCheckId": "trustworthy-input-assistance",
      "guidanceId": "forms",
      "guidanceCategory": "forms",
      "summary": "Login fields use invalid autocomplete tokens.",
      "evidence": "Login DOM uses autocomplete=\"account\" and autocomplete=\"pwd\" instead of username and current-password.",
      "artifacts": [
        "evidence/login-dom.json"
      ],
      "suggestedFix": "Use autocomplete=\"username\" and autocomplete=\"current-password\" so password managers and autofill work reliably.",
      "effort": "trivial",
      "pathId": "login",
      "url": "https://user.thscore99.com/account/login"
    },
    {
      "id": "F26",
      "severity": "high",
      "confidence": "high",
      "principleId": "be-sustainable",
      "principleCheckId": "optimised-assets",
      "guidanceId": "deliver-optimized-decorative-images",
      "guidanceCategory": "performance",
      "summary": "The page transfers many unoptimised and eagerly loaded images.",
      "evidence": "Images evidence reports 56 oversized, 55 below-fold images without lazy loading, 77 legacy-format images and 58 without dimensions.",
      "artifacts": [
        "evidence/images.json",
        "evidence/home-summary.json"
      ],
      "suggestedFix": "Right-size responsive images, prefer AVIF/WebP, lazy-load below-fold media, and reserve intrinsic space.",
      "effort": "medium",
      "pathId": "home",
      "url": "https://www.thscore99.com/"
    },
    {
      "id": "F27",
      "severity": "high",
      "confidence": "high",
      "principleId": "be-sustainable",
      "principleCheckId": "no-wasteful-work",
      "guidanceId": "efficient-background-processing",
      "guidanceCategory": "performance",
      "summary": "Duplicated background analytics performs disproportionate work.",
      "evidence": "HAR shows 10 separate Google tag/gtag payloads among 25 scripts; the trace records six long tasks and 1,968ms blocking time.",
      "artifacts": [
        "evidence/home-summary.json",
        "evidence/home-trace-summary.json"
      ],
      "suggestedFix": "Remove duplicate analytics containers, batch justified telemetry, and defer background work until it cannot contend with the score task.",
      "effort": "medium",
      "pathId": "home",
      "url": "https://www.thscore99.com/"
    },
    {
      "id": "F28",
      "severity": "medium",
      "confidence": "high",
      "principleId": "be-memory-efficient",
      "principleCheckId": "bounded-footprint",
      "guidanceId": "performance",
      "guidanceCategory": "performance",
      "summary": "The initial memory footprint is high for a score listing.",
      "evidence": "Baseline heap summary contains 706,318 nodes and 43.3MB self size; after repeated tab switching it contains 750,269 nodes and 44.3MB.",
      "artifacts": [
        "evidence/heap-baseline.heapsnapshot",
        "evidence/heap-post.heapsnapshot"
      ],
      "suggestedFix": "Profile dominant native/code/array allocations, virtualise long score lists where appropriate, and remove duplicated script state.",
      "effort": "large",
      "pathId": "home",
      "url": "https://www.thscore99.com/"
    }
  ],
  "taskList": [
    {
      "id": "T01",
      "title": "Make the live-score path fast and progressively rendered",
      "priority": 1,
      "findingIds": [
        "F07",
        "F08",
        "F21",
        "F27"
      ],
      "guidanceId": "performance",
      "status": "open"
    },
    {
      "id": "T02",
      "title": "Remove disguised gambling/QR advertising from the core journey",
      "priority": 2,
      "findingIds": [
        "F04",
        "F23"
      ],
      "guidanceId": "html",
      "status": "open"
    },
    {
      "id": "T03",
      "title": "Deploy security headers, safe cookie attributes, and privacy-minimised analytics",
      "priority": 3,
      "findingIds": [
        "F18",
        "F19"
      ],
      "guidanceId": "security",
      "status": "open"
    },
    {
      "id": "T04",
      "title": "Rebuild navigation and score controls with semantic, crawlable, accessible elements",
      "priority": 4,
      "findingIds": [
        "F03",
        "F06",
        "F09",
        "F10",
        "F16"
      ],
      "guidanceId": "accessibility",
      "status": "open"
    },
    {
      "id": "T05",
      "title": "Restore zoom, contrast, legibility, and touch target quality",
      "priority": 5,
      "findingIds": [
        "F11",
        "F12",
        "F13"
      ],
      "guidanceId": "accessibility",
      "status": "open"
    },
    {
      "id": "T06",
      "title": "Optimise and right-size image delivery",
      "priority": 6,
      "findingIds": [
        "F14",
        "F26"
      ],
      "guidanceId": "deliver-optimized-decorative-images",
      "status": "open"
    },
    {
      "id": "T07",
      "title": "Add preference-driven dark and reduced-motion modes",
      "priority": 7,
      "findingIds": [
        "F01",
        "F02"
      ],
      "guidanceId": "dark-mode",
      "status": "open"
    },
    {
      "id": "T08",
      "title": "Modernise responsive and internationalised CSS",
      "priority": 8,
      "findingIds": [
        "F05",
        "F22"
      ],
      "guidanceId": "size-aware-styling",
      "status": "open"
    },
    {
      "id": "T09",
      "title": "Improve login validation, autofill, and passkey support",
      "priority": 9,
      "findingIds": [
        "F20",
        "F24",
        "F25"
      ],
      "guidanceId": "forms",
      "status": "open"
    },
    {
      "id": "T10",
      "title": "Fix robots and browser-platform hygiene",
      "priority": 10,
      "findingIds": [
        "F15",
        "F17"
      ],
      "guidanceId": "html",
      "status": "open"
    },
    {
      "id": "T11",
      "title": "Profile and reduce the large initial heap footprint",
      "priority": 11,
      "findingIds": [
        "F28"
      ],
      "guidanceId": "performance",
      "status": "open"
    }
  ],
  "budget": {
    "pathCount": 6,
    "auditPasses": 1
  },
  "agent": "pi",
  "runId": "2026-07-21T01-33-19-144Z"
}
