{
  "url": "https://xosodaiphat.com",
  "auditedAt": "2026-07-20T18:58:00.000Z",
  "mode": "report",
  "status": "completed",
  "statusDetail": "Representative audit of five page archetypes/journeys. Excluded: authenticated/account states, every date/province variant sharing audited templates, and destructive/commercial flows not exposed publicly.",
  "page": {
    "appType": "mpa",
    "framework": "server-rendered MPA (framework not detected)",
    "notes": "Vietnamese lottery results/content site with long, dense server-rendered tables, statistics articles, manifest, advertising and analytics integrations."
  },
  "evidenceUsed": [
    "screenshot",
    "dom",
    "layout-metrics",
    "evaluate-probe",
    "trace",
    "har",
    "discoverability",
    "headers",
    "cookies",
    "trackers",
    "secrets",
    "images",
    "heap-summary",
    "lighthouse"
  ],
  "guidanceConsulted": [
    "dark-mode",
    "component-specific-light-dark-theme",
    "adapt-scrollbar-to-contrast-preferences",
    "accessibility",
    "css",
    "search-hidden-content",
    "passkeys",
    "privacy",
    "passkey-reauthentication",
    "passkey-authentication",
    "passkey-management",
    "performance",
    "flicker-free-client-side-ab-testing",
    "deprioritize-background-fetches",
    "summarizer",
    "sequence-distributed-events",
    "coordinate-global-events",
    "capture-location-agnostic-data",
    "support-global-calendar-systems",
    "calculate-event-differentials",
    "autofill-payment-form",
    "autofill-address-form",
    "autofill-sign-up-form",
    "autofill-highlight-inputs",
    "validate-input-after-interaction",
    "agentic-javascript-tools",
    "agentic-forms",
    "webmcp",
    "language-model",
    "translator",
    "defer-work-until-scroll-ends",
    "persistent-top-layer-ui",
    "move-dom-element-without-losing-state",
    "break-up-long-tasks",
    "full-session-analytics",
    "directional-navigation-transitions",
    "scroll-entry-exit-effects",
    "carousel-slide-effects",
    "stack-drill-down",
    "pull-to-reveal",
    "navigation-drawer",
    "position-aware-tooltips",
    "scroll-target-on-load",
    "declarative-dialog-popover-control",
    "html",
    "light-dismiss-a-dialog",
    "persistent-app-tours",
    "scroll-position-aware-elements",
    "scrollability-affordance-hints",
    "schedule-tasks-by-priority",
    "optimize-preload-priority",
    "accessible-error-announcement",
    "forms",
    "language-detection",
    "passkey-registration"
  ],
  "artifacts": [
    {
      "type": "other",
      "path": "evidence/controls-probe.json",
      "caption": "controls probe",
      "findingIds": []
    },
    {
      "type": "other",
      "path": "evidence/cookies.json",
      "caption": "cookies",
      "findingIds": [
        "F-012"
      ]
    },
    {
      "type": "discoverability",
      "path": "evidence/evidence-discoverability",
      "caption": "evidence discoverability",
      "findingIds": []
    },
    {
      "type": "screenshot",
      "path": "evidence/evidence-discoverability-crawler.png",
      "caption": "evidence discoverability crawler",
      "findingIds": []
    },
    {
      "type": "screenshot",
      "path": "evidence/evidence-discoverability-rendered.png",
      "caption": "evidence discoverability rendered",
      "findingIds": []
    },
    {
      "type": "other",
      "path": "evidence/focus-target-probe.json",
      "caption": "focus target probe",
      "findingIds": [
        "F-004",
        "F-008"
      ]
    },
    {
      "type": "screenshot",
      "path": "evidence/form-error.png",
      "caption": "form error",
      "findingIds": []
    },
    {
      "type": "other",
      "path": "evidence/forms-probe.json",
      "caption": "forms probe",
      "findingIds": [
        "F-007"
      ]
    },
    {
      "type": "other",
      "path": "evidence/headers.json",
      "caption": "headers",
      "findingIds": [
        "F-012",
        "F-015"
      ]
    },
    {
      "type": "heap",
      "path": "evidence/heap-baseline.json",
      "caption": "heap baseline",
      "findingIds": []
    },
    {
      "type": "heap",
      "path": "evidence/heap-post.json",
      "caption": "heap post",
      "findingIds": []
    },
    {
      "type": "screenshot",
      "path": "evidence/home-dark.png",
      "caption": "home dark",
      "condition": "prefers-color-scheme: dark",
      "findingIds": [
        "F-001"
      ]
    },
    {
      "type": "screenshot",
      "path": "evidence/home-desktop.png",
      "caption": "home desktop",
      "findingIds": []
    },
    {
      "type": "dom",
      "path": "evidence/home-dom.json",
      "caption": "home dom",
      "findingIds": [
        "F-001"
      ]
    },
    {
      "type": "layout",
      "path": "evidence/home-layout-mobile.json",
      "caption": "home layout mobile",
      "condition": "viewport: 360x800",
      "findingIds": [
        "F-003",
        "F-008"
      ]
    },
    {
      "type": "screenshot",
      "path": "evidence/home-mobile.png",
      "caption": "home mobile",
      "condition": "viewport: 360x800",
      "findingIds": [
        "F-003",
        "F-004"
      ]
    },
    {
      "type": "har-summary",
      "path": "evidence/home-summary.json",
      "caption": "home summary",
      "findingIds": [
        "F-005",
        "F-006",
        "F-013",
        "F-018",
        "F-019"
      ]
    },
    {
      "type": "trace-summary",
      "path": "evidence/home-trace-summary.json",
      "caption": "home trace summary",
      "findingIds": []
    },
    {
      "type": "trace",
      "path": "evidence/home-trace.json",
      "caption": "home trace",
      "findingIds": []
    },
    {
      "type": "har",
      "path": "evidence/home.har",
      "caption": "home",
      "findingIds": [
        "F-005",
        "F-013",
        "F-018"
      ]
    },
    {
      "type": "other",
      "path": "evidence/images.json",
      "caption": "images",
      "findingIds": [
        "F-010",
        "F-017"
      ]
    },
    {
      "type": "lighthouse",
      "path": "evidence/lighthouse-details.json",
      "caption": "lighthouse details",
      "findingIds": [
        "F-005",
        "F-007",
        "F-009",
        "F-011",
        "F-014",
        "F-018"
      ]
    },
    {
      "type": "lighthouse",
      "path": "evidence/lighthouse-summary.json",
      "caption": "lighthouse summary",
      "findingIds": [
        "F-005",
        "F-006"
      ]
    },
    {
      "type": "lighthouse",
      "path": "evidence/lighthouse.json",
      "caption": "lighthouse",
      "findingIds": [
        "F-006"
      ]
    },
    {
      "type": "screenshot",
      "path": "evidence/login-open.png",
      "caption": "login open",
      "findingIds": []
    },
    {
      "type": "other",
      "path": "evidence/menu-probe.json",
      "caption": "menu probe",
      "findingIds": []
    },
    {
      "type": "screenshot",
      "path": "evidence/not-found-mobile.png",
      "caption": "not found mobile",
      "condition": "viewport: 360x800",
      "findingIds": []
    },
    {
      "type": "other",
      "path": "evidence/not-found-probe.json",
      "caption": "not found probe",
      "findingIds": []
    },
    {
      "type": "other",
      "path": "evidence/platform-probe.json",
      "caption": "platform probe",
      "findingIds": [
        "F-002"
      ]
    },
    {
      "type": "screenshot",
      "path": "evidence/privacy-mobile.png",
      "caption": "privacy mobile",
      "condition": "viewport: 360x800",
      "findingIds": []
    },
    {
      "type": "other",
      "path": "evidence/reduced-motion.json",
      "caption": "reduced motion",
      "findingIds": []
    },
    {
      "type": "other",
      "path": "evidence/secrets.json",
      "caption": "secrets",
      "findingIds": []
    },
    {
      "type": "other",
      "path": "evidence/service-worker.json",
      "caption": "service worker",
      "findingIds": [
        "F-016"
      ]
    },
    {
      "type": "other",
      "path": "evidence/site-files.json",
      "caption": "site files",
      "findingIds": [
        "F-016"
      ]
    },
    {
      "type": "dom",
      "path": "evidence/stats-dom.json",
      "caption": "stats dom",
      "findingIds": []
    },
    {
      "type": "screenshot",
      "path": "evidence/stats-mobile.png",
      "caption": "stats mobile",
      "condition": "viewport: 360x800",
      "findingIds": [
        "F-002"
      ]
    },
    {
      "type": "other",
      "path": "evidence/trackers.json",
      "caption": "trackers",
      "findingIds": [
        "F-013",
        "F-019"
      ]
    },
    {
      "type": "dom",
      "path": "evidence/vietlott-dom.json",
      "caption": "vietlott dom",
      "findingIds": []
    },
    {
      "type": "screenshot",
      "path": "evidence/vietlott-mobile.png",
      "caption": "vietlott mobile",
      "condition": "viewport: 360x800",
      "findingIds": [
        "F-007"
      ]
    }
  ],
  "config": {
    "loaded": false
  },
  "coverage": {
    "catalogVersion": "modern-web-guidance@0.0.172",
    "catalogChecksum": "sha256:78ccfdb2d483f4c57d9dafed80fd86c6265585a56457c8dcfddc254b80fb44d7",
    "expected": 58,
    "recorded": 58,
    "judged": 58,
    "blocked": 0,
    "notRun": 0,
    "missing": 0,
    "unknown": 0,
    "duplicates": 0,
    "complete": true
  },
  "checkOutcomes": [
    {
      "principleId": "respect-user-preferences",
      "checkId": "respects-color-scheme",
      "status": "issues",
      "confidence": "high",
      "method": "Direct CDP/Lighthouse evidence matched to this atomic check.",
      "evidence": "The dark-mode screenshot is pixel-identical in palette and file size to the light capture; computed body background remains rgb(255,255,255), html color-scheme is normal, and no dark scheme is declared.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/home-dark.png",
        "evidence/home-dom.json"
      ],
      "findingIds": [
        "F-001"
      ]
    },
    {
      "principleId": "respect-user-preferences",
      "checkId": "respects-reduced-motion",
      "status": "pass",
      "confidence": "high",
      "method": "Direct visual, DOM, CDP primitive or Lighthouse evidence for this check.",
      "evidence": "Reduced-motion emulation matched and the page reported zero active animations; no authored reduced-motion rule was needed for the observed static UI.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/reduced-motion.json"
      ]
    },
    {
      "principleId": "respect-user-preferences",
      "checkId": "respects-contrast",
      "status": "pass",
      "confidence": "medium",
      "method": "Direct visual, DOM, CDP primitive or Lighthouse evidence for this check.",
      "evidence": "Lighthouse accessibility scored 1.0 and native keyboard focus remained visible; no contrast failure was reported.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/lighthouse-summary.json",
        "evidence/focus-target-probe.json"
      ]
    },
    {
      "principleId": "implement-natural-interactions",
      "checkId": "view-transitions",
      "status": "issues",
      "confidence": "high",
      "method": "Direct CDP/Lighthouse evidence matched to this atomic check.",
      "evidence": "The platform probe found zero view-transition rules, while the site exposes hundreds of same-origin route links across long result and statistics templates.",
      "pathIds": [
        "statistics"
      ],
      "artifacts": [
        "evidence/platform-probe.json",
        "evidence/stats-mobile.png"
      ],
      "findingIds": [
        "F-002"
      ]
    },
    {
      "principleId": "implement-natural-interactions",
      "checkId": "scroll-driven-animations",
      "status": "not-applicable",
      "confidence": "high",
      "method": "Applicability judgement from representative-path recon.",
      "evidence": "No scroll-linked animation was observed on the representative templates, so there is no implementation to evaluate.",
      "reason": "No scroll-linked animation was observed on the representative templates, so there is no implementation to evaluate."
    },
    {
      "principleId": "implement-natural-interactions",
      "checkId": "physical-gestures",
      "status": "not-applicable",
      "confidence": "high",
      "method": "Applicability judgement from representative-path recon.",
      "evidence": "No gesture-driven control is part of the representative public journeys.",
      "reason": "No gesture-driven control is part of the representative public journeys."
    },
    {
      "principleId": "provide-guided-navigation",
      "checkId": "scroll-state-aware-chrome",
      "status": "issues",
      "confidence": "high",
      "method": "Direct CDP/Lighthouse evidence matched to this atomic check.",
      "evidence": "The homepage is 11,148 CSS px tall on mobile, but CSS inspection found no scroll-state query/timeline behavior and the visible header does not provide progress or sticky orientation feedback.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/home-layout-mobile.json",
        "evidence/home-mobile.png"
      ],
      "findingIds": [
        "F-003"
      ]
    },
    {
      "principleId": "provide-guided-navigation",
      "checkId": "anchored-positioning",
      "status": "not-applicable",
      "confidence": "high",
      "method": "Applicability judgement from representative-path recon.",
      "evidence": "No tooltip, popover or viewport-edge menu overlay was present in the representative paths.",
      "reason": "No tooltip, popover or viewport-edge menu overlay was present in the representative paths."
    },
    {
      "principleId": "provide-guided-navigation",
      "checkId": "directs-attention",
      "status": "pass",
      "confidence": "high",
      "method": "Direct visual, DOM, CDP primitive or Lighthouse evidence for this check.",
      "evidence": "Direct evidence on representative paths supports this outcome.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/home-dom.json"
      ]
    },
    {
      "principleId": "maximize-content-reduce-noise",
      "checkId": "no-intrusive-interruptions",
      "status": "pass",
      "confidence": "high",
      "method": "Direct visual, DOM, CDP primitive or Lighthouse evidence for this check.",
      "evidence": "Direct evidence on representative paths supports this outcome.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/home-mobile.png"
      ]
    },
    {
      "principleId": "maximize-content-reduce-noise",
      "checkId": "semantic-dismissible-primitives",
      "status": "not-applicable",
      "confidence": "high",
      "method": "Applicability judgement from representative-path recon.",
      "evidence": "No transient overlay or modal flow appeared in the audited public paths.",
      "reason": "No transient overlay or modal flow appeared in the audited public paths."
    },
    {
      "principleId": "maximize-content-reduce-noise",
      "checkId": "reduced-chrome",
      "status": "pass",
      "confidence": "high",
      "method": "Direct visual, DOM, CDP primitive or Lighthouse evidence for this check.",
      "evidence": "Direct evidence on representative paths supports this outcome.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/home-mobile.png",
        "evidence/privacy-mobile.png"
      ]
    },
    {
      "principleId": "adapt-to-the-form-factor",
      "checkId": "responsive-no-horizontal-scroll",
      "status": "pass",
      "confidence": "high",
      "method": "Direct visual, DOM, CDP primitive or Lighthouse evidence for this check.",
      "evidence": "Direct evidence on representative paths supports this outcome.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/home-layout-mobile.json",
        "evidence/stats-mobile.png",
        "evidence/vietlott-mobile.png"
      ]
    },
    {
      "principleId": "adapt-to-the-form-factor",
      "checkId": "component-level-responsiveness",
      "status": "pass",
      "confidence": "high",
      "method": "Direct visual, DOM, CDP primitive or Lighthouse evidence for this check.",
      "evidence": "Representative dense content/listing components reflowed successfully at 360px without overflow; no same component was observed in conflicting container contexts.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/stats-mobile.png",
        "evidence/vietlott-mobile.png"
      ]
    },
    {
      "principleId": "adapt-to-the-form-factor",
      "checkId": "input-modality-aware",
      "status": "issues",
      "confidence": "high",
      "method": "Direct CDP/Lighthouse evidence matched to this atomic check.",
      "evidence": "The 360px focus/target probe measured many meaningful links at only 14–22px high, including province and date links; the recommended target is substantially larger. Keyboard outlines were visible, so the failure is specifically touch sizing.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/focus-target-probe.json",
        "evidence/home-mobile.png"
      ],
      "findingIds": [
        "F-004"
      ]
    },
    {
      "principleId": "support-core-task-success",
      "checkId": "clear-purpose-and-primary-action",
      "status": "pass",
      "confidence": "high",
      "method": "Direct visual, DOM, CDP primitive or Lighthouse evidence for this check.",
      "evidence": "Direct evidence on representative paths supports this outcome.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/home-mobile.png"
      ]
    },
    {
      "principleId": "support-core-task-success",
      "checkId": "primary-flow-completion",
      "status": "pass",
      "confidence": "high",
      "method": "Direct visual, DOM, CDP primitive or Lighthouse evidence for this check.",
      "evidence": "Direct evidence on representative paths supports this outcome.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/home-mobile.png",
        "evidence/vietlott-mobile.png"
      ]
    },
    {
      "principleId": "support-core-task-success",
      "checkId": "clear-system-state-and-recovery",
      "status": "pass",
      "confidence": "high",
      "method": "Direct visual, DOM, CDP primitive or Lighthouse evidence for this check.",
      "evidence": "Direct evidence on representative paths supports this outcome.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/not-found-mobile.png",
        "evidence/not-found-probe.json"
      ]
    },
    {
      "principleId": "be-fast-and-stable",
      "checkId": "good-core-web-vitals",
      "status": "pass",
      "confidence": "high",
      "method": "Direct visual, DOM, CDP primitive or Lighthouse evidence for this check.",
      "evidence": "Direct evidence on representative paths supports this outcome.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/home-trace-summary.json",
        "evidence/lighthouse-summary.json"
      ]
    },
    {
      "principleId": "be-fast-and-stable",
      "checkId": "visual-stability",
      "status": "pass",
      "confidence": "high",
      "method": "Direct visual, DOM, CDP primitive or Lighthouse evidence for this check.",
      "evidence": "Direct evidence on representative paths supports this outcome.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/home-layout-mobile.json",
        "evidence/lighthouse-summary.json"
      ]
    },
    {
      "principleId": "be-fast-and-stable",
      "checkId": "efficient-main-thread",
      "status": "pass",
      "confidence": "high",
      "method": "Direct visual, DOM, CDP primitive or Lighthouse evidence for this check.",
      "evidence": "Direct evidence on representative paths supports this outcome.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/home-trace-summary.json"
      ]
    },
    {
      "principleId": "be-fast-and-stable",
      "checkId": "efficient-resource-delivery",
      "status": "issues",
      "confidence": "high",
      "method": "Direct CDP/Lighthouse evidence matched to this atomic check.",
      "evidence": "Lighthouse reports TTI 9.6s and 214KiB potential cache savings; the HAR identifies parser-inserted player/DMCA scripts and a 1.6s GTM request.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/home-summary.json",
        "evidence/lighthouse-summary.json",
        "evidence/lighthouse-details.json",
        "evidence/home.har"
      ],
      "findingIds": [
        "F-005"
      ]
    },
    {
      "principleId": "be-fast-and-stable",
      "checkId": "trim-unused-and-duplicate-code",
      "status": "issues",
      "confidence": "high",
      "method": "Direct CDP/Lighthouse evidence matched to this atomic check.",
      "evidence": "Lighthouse estimates 499KiB unused JavaScript, 29KiB legacy JavaScript and 14KiB unminified JavaScript; HAR records 731KiB of script transfer out of 804KiB total.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/lighthouse-summary.json",
        "evidence/lighthouse.json",
        "evidence/home-summary.json"
      ],
      "findingIds": [
        "F-006"
      ]
    },
    {
      "principleId": "be-inclusive",
      "checkId": "names-roles-labels",
      "status": "issues",
      "confidence": "high",
      "method": "Direct CDP/Lighthouse evidence matched to this atomic check.",
      "evidence": "Lighthouse identifies the Keno table’s fake caption and data cells without headers. The form probe also shows #inputNumberDo has no associated label, relying on placeholder/title.",
      "pathIds": [
        "vietlott"
      ],
      "artifacts": [
        "evidence/lighthouse-details.json",
        "evidence/forms-probe.json",
        "evidence/vietlott-mobile.png"
      ],
      "findingIds": [
        "F-007"
      ]
    },
    {
      "principleId": "be-inclusive",
      "checkId": "sufficient-contrast",
      "status": "pass",
      "confidence": "high",
      "method": "Direct visual, DOM, CDP primitive or Lighthouse evidence for this check.",
      "evidence": "Direct evidence on representative paths supports this outcome.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/lighthouse-summary.json"
      ]
    },
    {
      "principleId": "be-inclusive",
      "checkId": "structure-and-focus",
      "status": "pass",
      "confidence": "high",
      "method": "Direct visual, DOM, CDP primitive or Lighthouse evidence for this check.",
      "evidence": "Direct evidence on representative paths supports this outcome.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/focus-target-probe.json",
        "evidence/lighthouse-summary.json"
      ]
    },
    {
      "principleId": "be-inclusive",
      "checkId": "legible-text",
      "status": "pass",
      "confidence": "high",
      "method": "Direct visual, DOM, CDP primitive or Lighthouse evidence for this check.",
      "evidence": "Direct evidence on representative paths supports this outcome.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/privacy-mobile.png",
        "evidence/stats-mobile.png"
      ]
    },
    {
      "principleId": "be-inclusive",
      "checkId": "zoom-reflow-targets-and-media",
      "status": "issues",
      "confidence": "high",
      "method": "Direct CDP/Lighthouse evidence matched to this atomic check.",
      "evidence": "At 360px, the target probe records dozens of interactive links only 14–22px high, even though the page otherwise reflows without horizontal overflow.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/focus-target-probe.json",
        "evidence/home-layout-mobile.json"
      ],
      "findingIds": [
        "F-008"
      ]
    },
    {
      "principleId": "follow-best-practices",
      "checkId": "no-console-errors",
      "status": "issues",
      "confidence": "high",
      "method": "Direct CDP/Lighthouse evidence matched to this atomic check.",
      "evidence": "Lighthouse captured a console.error from notification.services.js: notification permission was blocked (messaging/permission-blocked).",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/lighthouse-details.json"
      ],
      "findingIds": [
        "F-009"
      ]
    },
    {
      "principleId": "follow-best-practices",
      "checkId": "sound-document-and-assets",
      "status": "issues",
      "confidence": "high",
      "method": "Direct CDP/Lighthouse evidence matched to this atomic check.",
      "evidence": "The image primitive found 3 images without width/height and 2 below-fold images without loading=lazy; one loading asset remains GIF.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/images.json"
      ],
      "findingIds": [
        "F-010"
      ]
    },
    {
      "principleId": "follow-best-practices",
      "checkId": "browser-platform-hygiene",
      "status": "issues",
      "confidence": "high",
      "method": "Direct CDP/Lighthouse evidence matched to this atomic check.",
      "evidence": "Lighthouse’s notification-on-start audit points to notification.services.js line 92; the resulting denial also causes the console error.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/lighthouse-details.json"
      ],
      "findingIds": [
        "F-011"
      ]
    },
    {
      "principleId": "be-discoverable",
      "checkId": "title-and-description",
      "status": "pass",
      "confidence": "high",
      "method": "Direct visual, DOM, CDP primitive or Lighthouse evidence for this check.",
      "evidence": "Direct evidence on representative paths supports this outcome.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/platform-probe.json",
        "evidence/lighthouse-summary.json"
      ]
    },
    {
      "principleId": "be-discoverable",
      "checkId": "crawlable-and-mobile-friendly",
      "status": "pass",
      "confidence": "high",
      "method": "Direct visual, DOM, CDP primitive or Lighthouse evidence for this check.",
      "evidence": "Direct evidence on representative paths supports this outcome.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/platform-probe.json",
        "evidence/site-files.json"
      ]
    },
    {
      "principleId": "be-discoverable",
      "checkId": "canonical-and-indexing-signals",
      "status": "pass",
      "confidence": "high",
      "method": "Direct visual, DOM, CDP primitive or Lighthouse evidence for this check.",
      "evidence": "Direct evidence on representative paths supports this outcome.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/platform-probe.json",
        "evidence/site-files.json"
      ]
    },
    {
      "principleId": "be-discoverable",
      "checkId": "structured-and-shareable-metadata",
      "status": "pass",
      "confidence": "high",
      "method": "Direct visual, DOM, CDP primitive or Lighthouse evidence for this check.",
      "evidence": "Direct evidence on representative paths supports this outcome.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/platform-probe.json"
      ]
    },
    {
      "principleId": "be-private-and-secure",
      "checkId": "secure-transport-and-headers",
      "status": "issues",
      "confidence": "high",
      "method": "Direct CDP/Lighthouse evidence matched to this atomic check.",
      "evidence": "The headers primitive reports missing CSP, HSTS and nosniff. All four analytics cookies lack Secure and use SameSite=None; three persist for 400 days.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/headers.json",
        "evidence/cookies.json"
      ],
      "findingIds": [
        "F-012"
      ]
    },
    {
      "principleId": "be-private-and-secure",
      "checkId": "data-minimisation-and-third-parties",
      "status": "issues",
      "confidence": "high",
      "method": "Direct CDP/Lighthouse evidence matched to this atomic check.",
      "evidence": "Tracker evidence found 15 third-party origins and five known tracker domains. HAR attributes 42 of 45 requests and 772,761 of 804,382 transferred bytes to third parties.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/trackers.json",
        "evidence/home-summary.json",
        "evidence/home.har"
      ],
      "findingIds": [
        "F-013"
      ]
    },
    {
      "principleId": "be-private-and-secure",
      "checkId": "in-context-permissions-and-modern-auth",
      "status": "issues",
      "confidence": "high",
      "method": "Direct CDP/Lighthouse evidence matched to this atomic check.",
      "evidence": "Lighthouse directly reports notification-on-start and the permission denial error. Authentication was not a covered public flow, so this finding is limited to permission timing.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/lighthouse-details.json"
      ],
      "findingIds": [
        "F-014"
      ]
    },
    {
      "principleId": "be-private-and-secure",
      "checkId": "defensive-browser-policies",
      "status": "issues",
      "confidence": "high",
      "method": "Direct CDP/Lighthouse evidence matched to this atomic check.",
      "evidence": "The response has no clickjacking protection, Referrer-Policy or Permissions-Policy, in addition to missing CSP/HSTS/nosniff.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/headers.json"
      ],
      "findingIds": [
        "F-015"
      ]
    },
    {
      "principleId": "be-resilient",
      "checkId": "progressive-enhancement",
      "status": "pass",
      "confidence": "high",
      "method": "Direct visual, DOM, CDP primitive or Lighthouse evidence for this check.",
      "evidence": "Direct evidence on representative paths supports this outcome.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/evidence-discoverability",
        "evidence/evidence-discoverability-crawler.png"
      ]
    },
    {
      "principleId": "be-resilient",
      "checkId": "resilient-runtime-behaviour",
      "status": "pass",
      "confidence": "high",
      "method": "Direct visual, DOM, CDP primitive or Lighthouse evidence for this check.",
      "evidence": "Direct evidence on representative paths supports this outcome.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/home-mobile.png",
        "evidence/not-found-mobile.png"
      ]
    },
    {
      "principleId": "be-resilient",
      "checkId": "offline-and-installable",
      "status": "issues",
      "confidence": "high",
      "method": "Direct CDP/Lighthouse evidence matched to this atomic check.",
      "evidence": "manifest.json has display: standalone, start_url and icons, yet navigator.serviceWorker.getRegistrations() returned an empty array and the page was not controlled.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/site-files.json",
        "evidence/service-worker.json"
      ],
      "findingIds": [
        "F-016"
      ]
    },
    {
      "principleId": "be-resilient",
      "checkId": "network-and-http-failure-states",
      "status": "pass",
      "confidence": "high",
      "method": "Direct visual, DOM, CDP primitive or Lighthouse evidence for this check.",
      "evidence": "Direct evidence on representative paths supports this outcome.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/not-found-probe.json",
        "evidence/not-found-mobile.png"
      ]
    },
    {
      "principleId": "be-internationalised",
      "checkId": "lang-dir-and-logical-properties",
      "status": "not-applicable",
      "confidence": "high",
      "method": "Applicability judgement from representative-path recon.",
      "evidence": "The service is deliberately Vietnamese and region-specific; broader multi-locale support was judged outside current scope.",
      "reason": "The service is deliberately Vietnamese and region-specific; broader multi-locale support was judged outside current scope."
    },
    {
      "principleId": "be-internationalised",
      "checkId": "locale-aware-data",
      "status": "not-applicable",
      "confidence": "high",
      "method": "Applicability judgement from representative-path recon.",
      "evidence": "The service is deliberately Vietnamese and region-specific; broader multi-locale support was judged outside current scope.",
      "reason": "The service is deliberately Vietnamese and region-specific; broader multi-locale support was judged outside current scope."
    },
    {
      "principleId": "be-internationalised",
      "checkId": "time-zone-correctness",
      "status": "not-applicable",
      "confidence": "high",
      "method": "Applicability judgement from representative-path recon.",
      "evidence": "The service is deliberately Vietnamese and region-specific; broader multi-locale support was judged outside current scope.",
      "reason": "The service is deliberately Vietnamese and region-specific; broader multi-locale support was judged outside current scope."
    },
    {
      "principleId": "be-trustworthy",
      "checkId": "no-dark-patterns",
      "status": "pass",
      "confidence": "high",
      "method": "Direct visual, DOM, CDP primitive or Lighthouse evidence for this check.",
      "evidence": "Direct evidence on representative paths supports this outcome.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/home-mobile.png",
        "evidence/privacy-mobile.png"
      ]
    },
    {
      "principleId": "be-trustworthy",
      "checkId": "humane-error-handling",
      "status": "pass",
      "confidence": "high",
      "method": "Direct visual, DOM, CDP primitive or Lighthouse evidence for this check.",
      "evidence": "Required fields use native required constraints and the page preserves browser validation behavior; no custom premature/blaming error UI was found.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/forms-probe.json"
      ]
    },
    {
      "principleId": "be-trustworthy",
      "checkId": "trustworthy-input-assistance",
      "status": "pass",
      "confidence": "high",
      "method": "Direct visual, DOM, CDP primitive or Lighthouse evidence for this check.",
      "evidence": "Direct evidence on representative paths supports this outcome.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/forms-probe.json"
      ]
    },
    {
      "principleId": "be-trustworthy",
      "checkId": "safe-commercial-and-account-flows",
      "status": "not-applicable",
      "confidence": "high",
      "method": "Applicability judgement from representative-path recon.",
      "evidence": "No checkout, subscription or account-management journey was exposed in the representative public paths.",
      "reason": "No checkout, subscription or account-management journey was exposed in the representative public paths."
    },
    {
      "principleId": "be-sustainable",
      "checkId": "optimised-assets",
      "status": "issues",
      "confidence": "high",
      "method": "Direct CDP/Lighthouse evidence matched to this atomic check.",
      "evidence": "The image audit found 3 missing intrinsic dimensions, 2 below-fold images not lazy-loaded, 2 images without responsive sources and one legacy GIF.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/images.json"
      ],
      "findingIds": [
        "F-017"
      ]
    },
    {
      "principleId": "be-sustainable",
      "checkId": "no-wasteful-work",
      "status": "issues",
      "confidence": "high",
      "method": "Direct CDP/Lighthouse evidence matched to this atomic check.",
      "evidence": "The HAR records repeated Glia pixel requests plus Google analytics/ad collection; 42 of 45 requests are third party, while Lighthouse finds 499KiB unused JS.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/home-summary.json",
        "evidence/lighthouse-details.json",
        "evidence/home.har"
      ],
      "findingIds": [
        "F-018"
      ]
    },
    {
      "principleId": "be-sustainable",
      "checkId": "third-party-and-media-budget",
      "status": "issues",
      "confidence": "high",
      "method": "Direct CDP/Lighthouse evidence matched to this atomic check.",
      "evidence": "Third parties transfer 772,761 bytes of 804,382 total; GTM, AdSense and the Glia player are the largest offenders, while the primary content is server-rendered text/tables.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/home-summary.json",
        "evidence/trackers.json"
      ],
      "findingIds": [
        "F-019"
      ]
    },
    {
      "principleId": "be-agent-ready",
      "checkId": "structured-agent-capabilities",
      "status": "not-applicable",
      "confidence": "high",
      "method": "Applicability judgement from representative-path recon.",
      "evidence": "No declared agent-facing intent was found; this emerging capability is optional for this public results site.",
      "reason": "No declared agent-facing intent was found; this emerging capability is optional for this public results site."
    },
    {
      "principleId": "be-agent-ready",
      "checkId": "on-device-inference",
      "status": "not-applicable",
      "confidence": "high",
      "method": "Applicability judgement from representative-path recon.",
      "evidence": "No declared need for on-device inference was found; this emerging capability is optional for this results site.",
      "reason": "No declared need for on-device inference was found; this emerging capability is optional for this results site."
    },
    {
      "principleId": "be-memory-efficient",
      "checkId": "no-leak-under-repeated-interaction",
      "status": "not-applicable",
      "confidence": "high",
      "method": "Applicability judgement from representative-path recon.",
      "evidence": "The audited experience is a server-rendered MPA whose core interactions navigate/reload; no representative long-lived in-page interaction exists to repeat meaningfully.",
      "reason": "The audited experience is a server-rendered MPA whose core interactions navigate/reload; no representative long-lived in-page interaction exists to repeat meaningfully."
    },
    {
      "principleId": "be-memory-efficient",
      "checkId": "bounded-footprint",
      "status": "pass",
      "confidence": "high",
      "method": "Direct visual, DOM, CDP primitive or Lighthouse evidence for this check.",
      "evidence": "Baseline heap was 13.18MB self size for the fully rendered long page; no disproportionate constructor population or detached DOM signal was present.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/heap-baseline.json"
      ]
    },
    {
      "principleId": "be-memory-efficient",
      "checkId": "no-detached-dom-or-unbounded-listeners",
      "status": "pass",
      "confidence": "high",
      "method": "Direct visual, DOM, CDP primitive or Lighthouse evidence for this check.",
      "evidence": "Heap summary exposed no Detached* constructor among retained top constructors; no long-lived SPA interaction was present to accumulate listeners.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/heap-baseline.json"
      ]
    }
  ],
  "principleOutcomes": [
    {
      "principleId": "respect-user-preferences",
      "expectation": "default",
      "status": "issues",
      "findingIds": [
        "F-001"
      ]
    },
    {
      "principleId": "implement-natural-interactions",
      "expectation": "default",
      "status": "issues",
      "findingIds": [
        "F-002"
      ]
    },
    {
      "principleId": "provide-guided-navigation",
      "expectation": "default",
      "status": "issues",
      "findingIds": [
        "F-003"
      ]
    },
    {
      "principleId": "maximize-content-reduce-noise",
      "expectation": "default",
      "status": "pass"
    },
    {
      "principleId": "adapt-to-the-form-factor",
      "expectation": "default",
      "status": "issues",
      "findingIds": [
        "F-004"
      ]
    },
    {
      "principleId": "support-core-task-success",
      "expectation": "default",
      "status": "pass"
    },
    {
      "principleId": "be-fast-and-stable",
      "expectation": "default",
      "status": "issues",
      "findingIds": [
        "F-005",
        "F-006"
      ]
    },
    {
      "principleId": "be-inclusive",
      "expectation": "default",
      "status": "issues",
      "findingIds": [
        "F-007",
        "F-008"
      ]
    },
    {
      "principleId": "follow-best-practices",
      "expectation": "default",
      "status": "issues",
      "findingIds": [
        "F-009",
        "F-010",
        "F-011"
      ]
    },
    {
      "principleId": "be-discoverable",
      "expectation": "default",
      "status": "pass"
    },
    {
      "principleId": "be-private-and-secure",
      "expectation": "default",
      "status": "issues",
      "findingIds": [
        "F-012",
        "F-013",
        "F-014",
        "F-015"
      ]
    },
    {
      "principleId": "be-resilient",
      "expectation": "contextual",
      "status": "issues",
      "findingIds": [
        "F-016"
      ]
    },
    {
      "principleId": "be-internationalised",
      "expectation": "contextual",
      "status": "not-applicable",
      "reason": "The service is deliberately Vietnamese and region-specific; broader multi-locale support was judged outside current scope."
    },
    {
      "principleId": "be-trustworthy",
      "expectation": "default",
      "status": "pass"
    },
    {
      "principleId": "be-sustainable",
      "expectation": "contextual",
      "status": "issues",
      "findingIds": [
        "F-017",
        "F-018",
        "F-019"
      ]
    },
    {
      "principleId": "be-agent-ready",
      "expectation": "contextual",
      "status": "not-applicable",
      "reason": "No declared agent-facing intent was found; this emerging capability is optional for this public results site."
    },
    {
      "principleId": "be-memory-efficient",
      "expectation": "default",
      "status": "pass"
    }
  ],
  "paths": [
    {
      "id": "home",
      "description": "Homepage and results template: primary lottery-results task, global navigation, metadata, network, performance, preferences, accessibility and memory.",
      "url": "https://xosodaiphat.com/",
      "conditions": [
        "desktop 800x600",
        "mobile 360x800",
        "prefers-color-scheme: dark",
        "prefers-reduced-motion: reduce",
        "keyboard focus",
        "raw HTML/no JavaScript"
      ],
      "result": "issues"
    },
    {
      "id": "statistics",
      "description": "Statistics/article index archetype: content listing and mobile navigation.",
      "url": "https://xosodaiphat.com/thong-ke-xo-so.html",
      "conditions": [
        "mobile 360x800"
      ],
      "result": "issues"
    },
    {
      "id": "vietlott",
      "description": "Alternate results/detail archetype with dense Keno and jackpot tables.",
      "url": "https://xosodaiphat.com/xo-so-vietlott.html",
      "conditions": [
        "mobile 360x800"
      ],
      "result": "issues"
    },
    {
      "id": "privacy",
      "description": "Long-form policy/content archetype used to assess legibility, trust disclosure and narrow-screen reflow.",
      "url": "https://xosodaiphat.com/chinh-sach-bao-mat.html",
      "conditions": [
        "mobile 360x800"
      ],
      "result": "pass"
    },
    {
      "id": "not-found",
      "description": "Failure/recovery journey for an unknown URL.",
      "url": "https://xosodaiphat.com/definitely-not-found-audit.html",
      "conditions": [
        "mobile 360x800"
      ],
      "result": "pass"
    }
  ],
  "findings": [
    {
      "id": "F-001",
      "severity": "medium",
      "confidence": "high",
      "principleId": "respect-user-preferences",
      "principleCheckId": "respects-color-scheme",
      "guidanceId": "dark-mode",
      "guidanceCategory": "user-experience",
      "summary": "The site does not adapt to the user’s dark colour preference.",
      "evidence": "The dark-mode screenshot is pixel-identical in palette and file size to the light capture; computed body background remains rgb(255,255,255), html color-scheme is normal, and no dark scheme is declared.",
      "suggestedFix": "Declare color-scheme: light dark and use prefers-color-scheme or light-dark() tokens for surfaces, text, borders and browser chrome.",
      "artifacts": [
        "evidence/home-dark.png",
        "evidence/home-dom.json"
      ],
      "effort": "small",
      "pathId": "home",
      "url": "https://xosodaiphat.com/"
    },
    {
      "id": "F-002",
      "severity": "low",
      "confidence": "high",
      "principleId": "implement-natural-interactions",
      "principleCheckId": "view-transitions",
      "guidanceId": "directional-navigation-transitions",
      "guidanceCategory": "user-experience",
      "summary": "Full-page route changes have no authored transition continuity.",
      "evidence": "The platform probe found zero view-transition rules, while the site exposes hundreds of same-origin route links across long result and statistics templates.",
      "suggestedFix": "Use cross-document View Transitions for same-origin navigation, with a reduced-motion fallback.",
      "artifacts": [
        "evidence/platform-probe.json",
        "evidence/stats-mobile.png"
      ],
      "effort": "medium",
      "pathId": "statistics",
      "url": "https://xosodaiphat.com/thong-ke-xo-so.html"
    },
    {
      "id": "F-003",
      "severity": "low",
      "confidence": "high",
      "principleId": "provide-guided-navigation",
      "principleCheckId": "scroll-state-aware-chrome",
      "guidanceId": "scroll-position-aware-elements",
      "guidanceCategory": "user-experience",
      "summary": "Long pages provide no scroll-state-aware orientation aid.",
      "evidence": "The homepage is 11,148 CSS px tall on mobile, but CSS inspection found no scroll-state query/timeline behavior and the visible header does not provide progress or sticky orientation feedback.",
      "suggestedFix": "Keep compact primary navigation available on long pages and add a lightweight scroll-state/progress affordance without obscuring content.",
      "artifacts": [
        "evidence/home-layout-mobile.json",
        "evidence/home-mobile.png"
      ],
      "effort": "medium",
      "pathId": "home",
      "url": "https://xosodaiphat.com/"
    },
    {
      "id": "F-004",
      "severity": "medium",
      "confidence": "high",
      "principleId": "adapt-to-the-form-factor",
      "principleCheckId": "input-modality-aware",
      "guidanceId": "accessibility",
      "guidanceCategory": "accessibility",
      "summary": "Many mobile links have undersized touch targets.",
      "evidence": "The 360px focus/target probe measured many meaningful links at only 14–22px high, including province and date links; the recommended target is substantially larger. Keyboard outlines were visible, so the failure is specifically touch sizing.",
      "suggestedFix": "Increase interactive hit areas to at least 24×24 CSS px, preferably 44×44 for primary navigation, using padding and spacing rather than tiny text-only boxes.",
      "artifacts": [
        "evidence/focus-target-probe.json",
        "evidence/home-mobile.png"
      ],
      "effort": "medium",
      "pathId": "home",
      "url": "https://xosodaiphat.com/"
    },
    {
      "id": "F-005",
      "severity": "medium",
      "confidence": "high",
      "principleId": "be-fast-and-stable",
      "principleCheckId": "efficient-resource-delivery",
      "guidanceId": "optimize-preload-priority",
      "guidanceCategory": "user-experience",
      "summary": "Third-party delivery and caching waste delay readiness despite good paint metrics.",
      "evidence": "Lighthouse reports TTI 9.6s and 214KiB potential cache savings; the HAR identifies parser-inserted player/DMCA scripts and a 1.6s GTM request.",
      "suggestedFix": "Defer non-critical third-party scripts, confirm async/defer placement, remove unnecessary dependency chains, and set effective cache lifetimes for stable assets.",
      "artifacts": [
        "evidence/home-summary.json",
        "evidence/lighthouse-summary.json",
        "evidence/lighthouse-details.json",
        "evidence/home.har"
      ],
      "effort": "medium",
      "pathId": "home",
      "url": "https://xosodaiphat.com/"
    },
    {
      "id": "F-006",
      "severity": "high",
      "confidence": "high",
      "principleId": "be-fast-and-stable",
      "principleCheckId": "trim-unused-and-duplicate-code",
      "guidanceId": "performance",
      "guidanceCategory": "performance",
      "summary": "The page ships a large amount of unused and legacy JavaScript.",
      "evidence": "Lighthouse estimates 499KiB unused JavaScript, 29KiB legacy JavaScript and 14KiB unminified JavaScript; HAR records 731KiB of script transfer out of 804KiB total.",
      "suggestedFix": "Load advertising, video, analytics and notification modules only when needed; remove duplicate tags and modernize/minify the remaining first-party bundle.",
      "artifacts": [
        "evidence/lighthouse-summary.json",
        "evidence/lighthouse.json",
        "evidence/home-summary.json"
      ],
      "effort": "large",
      "pathId": "home",
      "url": "https://xosodaiphat.com/"
    },
    {
      "id": "F-007",
      "severity": "medium",
      "confidence": "high",
      "principleId": "be-inclusive",
      "principleCheckId": "names-roles-labels",
      "guidanceId": "accessibility",
      "guidanceCategory": "accessibility",
      "summary": "Data tables and one lookup input lack complete accessible semantics.",
      "evidence": "Lighthouse identifies the Keno table’s fake caption and data cells without headers. The form probe also shows #inputNumberDo has no associated label, relying on placeholder/title.",
      "suggestedFix": "Use a real <caption>, th/scope headers for result tables, and an explicit visible label associated with #inputNumberDo.",
      "artifacts": [
        "evidence/lighthouse-details.json",
        "evidence/forms-probe.json",
        "evidence/vietlott-mobile.png"
      ],
      "effort": "medium",
      "pathId": "vietlott",
      "url": "https://xosodaiphat.com/xo-so-vietlott.html"
    },
    {
      "id": "F-008",
      "severity": "medium",
      "confidence": "high",
      "principleId": "be-inclusive",
      "principleCheckId": "zoom-reflow-targets-and-media",
      "guidanceId": "accessibility",
      "guidanceCategory": "accessibility",
      "summary": "Small targets reduce usability under touch and zoomed/reflowed conditions.",
      "evidence": "At 360px, the target probe records dozens of interactive links only 14–22px high, even though the page otherwise reflows without horizontal overflow.",
      "suggestedFix": "Increase target dimensions and spacing while preserving the successful narrow-screen reflow and user-scalable viewport.",
      "artifacts": [
        "evidence/focus-target-probe.json",
        "evidence/home-layout-mobile.json"
      ],
      "effort": "medium",
      "pathId": "home",
      "url": "https://xosodaiphat.com/"
    },
    {
      "id": "F-009",
      "severity": "low",
      "confidence": "high",
      "principleId": "follow-best-practices",
      "principleCheckId": "no-console-errors",
      "guidanceId": "html",
      "guidanceCategory": "user-experience",
      "summary": "The page logs an avoidable Firebase messaging error.",
      "evidence": "Lighthouse captured a console.error from notification.services.js: notification permission was blocked (messaging/permission-blocked).",
      "suggestedFix": "Do not initialise messaging until the user opts in; treat denied/default permission as an expected state without console errors.",
      "artifacts": [
        "evidence/lighthouse-details.json"
      ],
      "effort": "small",
      "pathId": "home",
      "url": "https://xosodaiphat.com/"
    },
    {
      "id": "F-010",
      "severity": "low",
      "confidence": "high",
      "principleId": "follow-best-practices",
      "principleCheckId": "sound-document-and-assets",
      "guidanceId": "html",
      "guidanceCategory": "user-experience",
      "summary": "Several images omit intrinsic dimensions and below-fold loading hints.",
      "evidence": "The image primitive found 3 images without width/height and 2 below-fold images without loading=lazy; one loading asset remains GIF.",
      "suggestedFix": "Add intrinsic dimensions, lazy-load non-critical below-fold imagery, and replace the animated GIF with a lighter modern or CSS alternative where appropriate.",
      "artifacts": [
        "evidence/images.json"
      ],
      "effort": "small",
      "pathId": "home",
      "url": "https://xosodaiphat.com/"
    },
    {
      "id": "F-011",
      "severity": "high",
      "confidence": "high",
      "principleId": "follow-best-practices",
      "principleCheckId": "browser-platform-hygiene",
      "guidanceId": "privacy",
      "guidanceCategory": "privacy",
      "summary": "Notification permission is requested on page load.",
      "evidence": "Lighthouse’s notification-on-start audit points to notification.services.js line 92; the resulting denial also causes the console error.",
      "suggestedFix": "Ask for notification permission only after a clear user gesture explaining the benefit, and keep the site fully usable when declined.",
      "artifacts": [
        "evidence/lighthouse-details.json"
      ],
      "effort": "small",
      "pathId": "home",
      "url": "https://xosodaiphat.com/"
    },
    {
      "id": "F-012",
      "severity": "high",
      "confidence": "high",
      "principleId": "be-private-and-secure",
      "principleCheckId": "secure-transport-and-headers",
      "guidanceId": "privacy",
      "guidanceCategory": "privacy",
      "summary": "HTTPS is used, but baseline security headers and cookie protections are absent.",
      "evidence": "The headers primitive reports missing CSP, HSTS and nosniff. All four analytics cookies lack Secure and use SameSite=None; three persist for 400 days.",
      "suggestedFix": "Add CSP, HSTS and nosniff; set Secure and an appropriate SameSite mode on cookies, and shorten analytics retention to what is necessary.",
      "artifacts": [
        "evidence/headers.json",
        "evidence/cookies.json"
      ],
      "effort": "medium",
      "pathId": "home",
      "url": "https://xosodaiphat.com/"
    },
    {
      "id": "F-013",
      "severity": "high",
      "confidence": "high",
      "principleId": "be-private-and-secure",
      "principleCheckId": "data-minimisation-and-third-parties",
      "guidanceId": "privacy",
      "guidanceCategory": "privacy",
      "summary": "The page has a disproportionate tracking and third-party footprint.",
      "evidence": "Tracker evidence found 15 third-party origins and five known tracker domains. HAR attributes 42 of 45 requests and 772,761 of 804,382 transferred bytes to third parties.",
      "suggestedFix": "Audit each third party, remove duplicate/unnecessary analytics and ad calls, gate non-essential tracking on informed consent, and batch/minimise events.",
      "artifacts": [
        "evidence/trackers.json",
        "evidence/home-summary.json",
        "evidence/home.har"
      ],
      "effort": "large",
      "pathId": "home",
      "url": "https://xosodaiphat.com/"
    },
    {
      "id": "F-014",
      "severity": "high",
      "confidence": "high",
      "principleId": "be-private-and-secure",
      "principleCheckId": "in-context-permissions-and-modern-auth",
      "guidanceId": "privacy",
      "guidanceCategory": "privacy",
      "summary": "Notification permission is requested without in-context intent.",
      "evidence": "Lighthouse directly reports notification-on-start and the permission denial error. Authentication was not a covered public flow, so this finding is limited to permission timing.",
      "suggestedFix": "Move notification permission behind an explicit, contextual opt-in control and explain frequency and revocation before invoking the browser prompt.",
      "artifacts": [
        "evidence/lighthouse-details.json"
      ],
      "effort": "small",
      "pathId": "home",
      "url": "https://xosodaiphat.com/"
    },
    {
      "id": "F-015",
      "severity": "high",
      "confidence": "high",
      "principleId": "be-private-and-secure",
      "principleCheckId": "defensive-browser-policies",
      "guidanceId": "privacy",
      "guidanceCategory": "privacy",
      "summary": "Browser-enforced defensive policies are not configured.",
      "evidence": "The response has no clickjacking protection, Referrer-Policy or Permissions-Policy, in addition to missing CSP/HSTS/nosniff.",
      "suggestedFix": "Set CSP frame-ancestors, Referrer-Policy and a restrictive Permissions-Policy; add X-Frame-Options as a legacy fallback where suitable.",
      "artifacts": [
        "evidence/headers.json"
      ],
      "effort": "medium",
      "pathId": "home",
      "url": "https://xosodaiphat.com/"
    },
    {
      "id": "F-016",
      "severity": "medium",
      "confidence": "high",
      "principleId": "be-resilient",
      "principleCheckId": "offline-and-installable",
      "guidanceId": "flicker-free-client-side-ab-testing",
      "guidanceCategory": "user-experience",
      "summary": "The manifest declares an app-like standalone experience, but no service worker or offline fallback is registered.",
      "evidence": "manifest.json has display: standalone, start_url and icons, yet navigator.serviceWorker.getRegistrations() returned an empty array and the page was not controlled.",
      "suggestedFix": "If standalone installability is intentional, register a service worker and provide a clear offline fallback for cached results/policy pages; otherwise remove misleading app-install signals.",
      "artifacts": [
        "evidence/site-files.json",
        "evidence/service-worker.json"
      ],
      "effort": "medium",
      "pathId": "home",
      "url": "https://xosodaiphat.com/"
    },
    {
      "id": "F-017",
      "severity": "low",
      "confidence": "high",
      "principleId": "be-sustainable",
      "principleCheckId": "optimised-assets",
      "guidanceId": "performance",
      "guidanceCategory": "performance",
      "summary": "A small set of image-delivery inefficiencies remains.",
      "evidence": "The image audit found 3 missing intrinsic dimensions, 2 below-fold images not lazy-loaded, 2 images without responsive sources and one legacy GIF.",
      "suggestedFix": "Reserve image space, lazy-load below-fold assets, provide responsive sources where raster content varies, and replace legacy animation formats.",
      "artifacts": [
        "evidence/images.json"
      ],
      "effort": "small",
      "pathId": "home",
      "url": "https://xosodaiphat.com/"
    },
    {
      "id": "F-018",
      "severity": "high",
      "confidence": "high",
      "principleId": "be-sustainable",
      "principleCheckId": "no-wasteful-work",
      "guidanceId": "deprioritize-background-fetches",
      "guidanceCategory": "user-experience",
      "summary": "Background analytics and advertising work is chatty and mostly unrelated to the core result task.",
      "evidence": "The HAR records repeated Glia pixel requests plus Google analytics/ad collection; 42 of 45 requests are third party, while Lighthouse finds 499KiB unused JS.",
      "suggestedFix": "Remove low-value beacons, batch analytics, defer background fetches, and initialise heavy ad/player code only near a visible placement or user action.",
      "artifacts": [
        "evidence/home-summary.json",
        "evidence/lighthouse-details.json",
        "evidence/home.har"
      ],
      "effort": "large",
      "pathId": "home",
      "url": "https://xosodaiphat.com/"
    },
    {
      "id": "F-019",
      "severity": "high",
      "confidence": "high",
      "principleId": "be-sustainable",
      "principleCheckId": "third-party-and-media-budget",
      "guidanceId": "deprioritize-background-fetches",
      "guidanceCategory": "user-experience",
      "summary": "Third-party scripts dominate the page’s transfer budget.",
      "evidence": "Third parties transfer 772,761 bytes of 804,382 total; GTM, AdSense and the Glia player are the largest offenders, while the primary content is server-rendered text/tables.",
      "suggestedFix": "Set a third-party byte/request budget, remove duplicate tags, defer media/player code, and load advertising only when it creates visible user value.",
      "artifacts": [
        "evidence/home-summary.json",
        "evidence/trackers.json"
      ],
      "effort": "large",
      "pathId": "home",
      "url": "https://xosodaiphat.com/"
    }
  ],
  "taskList": [
    {
      "id": "T-001",
      "title": "Remove unsolicited permission prompts and harden browser security",
      "priority": 1,
      "findingIds": [
        "F-011",
        "F-012",
        "F-014",
        "F-015"
      ],
      "guidanceId": "privacy",
      "status": "open"
    },
    {
      "id": "T-002",
      "title": "Cut third-party, unused and background JavaScript",
      "priority": 2,
      "findingIds": [
        "F-005",
        "F-006",
        "F-013",
        "F-018",
        "F-019"
      ],
      "guidanceId": "deprioritize-background-fetches",
      "status": "open"
    },
    {
      "id": "T-003",
      "title": "Repair table, input and touch-target accessibility",
      "priority": 3,
      "findingIds": [
        "F-004",
        "F-007",
        "F-008"
      ],
      "guidanceId": "accessibility",
      "status": "open"
    },
    {
      "id": "T-004",
      "title": "Add preference-aware theming",
      "priority": 4,
      "findingIds": [
        "F-001"
      ],
      "guidanceId": "dark-mode",
      "status": "open"
    },
    {
      "id": "T-005",
      "title": "Finish resilient installability or remove standalone app signals",
      "priority": 5,
      "findingIds": [
        "F-016"
      ],
      "guidanceId": "flicker-free-client-side-ab-testing",
      "status": "open"
    },
    {
      "id": "T-006",
      "title": "Tighten image and asset delivery",
      "priority": 6,
      "findingIds": [
        "F-010",
        "F-017"
      ],
      "guidanceId": "performance",
      "status": "open"
    },
    {
      "id": "T-007",
      "title": "Add lightweight navigation continuity on long pages",
      "priority": 7,
      "findingIds": [
        "F-002",
        "F-003"
      ],
      "guidanceId": "scroll-position-aware-elements",
      "status": "open"
    }
  ],
  "budget": {
    "pathCount": 5,
    "auditPasses": 1
  },
  "agent": "pi",
  "runId": "2026-07-20T18-51-28-143Z"
}
