{
  "url": "https://lichess.org",
  "auditedAt": "2026-07-20T07:45:00.000Z",
  "mode": "report",
  "status": "completed",
  "statusDetail": "Coverage-complete representative audit of seven public archetypes. Authenticated play/account management, live multiplayer completion, checkout/donation completion, and destructive account actions were not exercised because they require credentials, another player, payment, or side effects.",
  "page": {
    "appType": "hybrid",
    "framework": "Server-rendered Lichess UI with progressively enhanced ES modules",
    "notes": "Public, multilingual, app-like chess service. Homepage and article preserve 95–97% of rendered words without JavaScript."
  },
  "evidenceUsed": [
    "screenshot",
    "mobile-layout-metrics",
    "dom+computed-styles",
    "evaluate-probes",
    "discoverability/no-JS",
    "HAR",
    "DevTools trace",
    "Lighthouse",
    "security headers",
    "cookies",
    "trackers",
    "secrets scan",
    "image audit",
    "heap summaries"
  ],
  "guidanceConsulted": [
    "dark-mode",
    "accessibility",
    "faster-spa-view-transitions",
    "css-layout",
    "size-aware-styling",
    "optimize-image-priority",
    "security",
    "privacy",
    "passkeys",
    "html",
    "improve-text-layout-and-legibility",
    "identify-inp-causes"
  ],
  "artifacts": [
    {
      "type": "screenshot",
      "path": "evidence/home-desktop.png",
      "caption": "Homepage desktop first viewport",
      "findingIds": []
    },
    {
      "type": "screenshot",
      "path": "evidence/home-mobile.png",
      "caption": "Homepage at 360x800",
      "condition": "viewport: 360x800",
      "findingIds": [
        "F04",
        "F07"
      ]
    },
    {
      "type": "screenshot",
      "path": "evidence/home-light.png",
      "caption": "Homepage under light preference",
      "condition": "prefers-color-scheme: light",
      "findingIds": [
        "F01"
      ]
    },
    {
      "type": "screenshot",
      "path": "evidence/home-dark.png",
      "caption": "Homepage under dark preference",
      "condition": "prefers-color-scheme: dark",
      "findingIds": [
        "F01"
      ]
    },
    {
      "type": "layout",
      "path": "evidence/home-mobile-layout.json",
      "caption": "Homepage mobile overflow/CLS metrics",
      "findingIds": []
    },
    {
      "type": "dom",
      "path": "evidence/home-dom.json",
      "caption": "Homepage DOM, metadata, CSS and computed styles",
      "findingIds": [
        "F05",
        "F16"
      ]
    },
    {
      "type": "other",
      "path": "evidence/home-recon.json",
      "caption": "Homepage links and metadata recon probe",
      "findingIds": [
        "F11",
        "F14"
      ]
    },
    {
      "type": "other",
      "path": "evidence/preferences-probe.json",
      "caption": "Reduced-motion, contrast, animation and focus probe",
      "findingIds": [
        "F02"
      ]
    },
    {
      "type": "other",
      "path": "evidence/platform-probe.json",
      "caption": "Robots, manifest, service worker and CSS feature probe",
      "findingIds": [
        "F03",
        "F05",
        "F07",
        "F14"
      ]
    },
    {
      "type": "har",
      "path": "evidence/home.har",
      "caption": "Homepage load network archive",
      "findingIds": []
    },
    {
      "type": "har-summary",
      "path": "evidence/home-summary.json",
      "caption": "Compact homepage network signals",
      "findingIds": []
    },
    {
      "type": "trace",
      "path": "evidence/home-trace.json",
      "caption": "Homepage DevTools performance trace",
      "findingIds": []
    },
    {
      "type": "trace-summary",
      "path": "evidence/home-trace-summary.json",
      "caption": "Compact trace timings and long tasks",
      "findingIds": [
        "F08"
      ]
    },
    {
      "type": "other",
      "path": "evidence/headers.json",
      "caption": "Main response security headers",
      "findingIds": [
        "F16"
      ]
    },
    {
      "type": "other",
      "path": "evidence/cookies.json",
      "caption": "Cookie security audit",
      "findingIds": []
    },
    {
      "type": "other",
      "path": "evidence/trackers.json",
      "caption": "Third-party/tracker audit",
      "findingIds": []
    },
    {
      "type": "other",
      "path": "evidence/secrets.json",
      "caption": "Client-side secret scan",
      "findingIds": []
    },
    {
      "type": "other",
      "path": "evidence/images.json",
      "caption": "Image markup/delivery audit",
      "findingIds": [
        "F12",
        "F18"
      ]
    },
    {
      "type": "lighthouse",
      "path": "evidence/lighthouse-home.json",
      "caption": "Lighthouse report",
      "findingIds": []
    },
    {
      "type": "other",
      "path": "evidence/lighthouse-home-summary.json",
      "caption": "Compact Lighthouse scores and failures",
      "findingIds": [
        "F08",
        "F18"
      ]
    },
    {
      "type": "other",
      "path": "evidence/lighthouse-details.json",
      "caption": "Affected Lighthouse accessibility/SEO nodes",
      "findingIds": [
        "F02",
        "F09",
        "F10",
        "F13"
      ]
    },
    {
      "type": "discoverability",
      "path": "evidence/home-discoverability.json",
      "caption": "Homepage raw-vs-rendered crawler comparison",
      "findingIds": []
    },
    {
      "type": "screenshot",
      "path": "evidence/home-discoverability-crawler.png",
      "caption": "Homepage with JavaScript disabled",
      "findingIds": []
    },
    {
      "type": "screenshot",
      "path": "evidence/training.png",
      "caption": "Anonymous puzzle state",
      "findingIds": []
    },
    {
      "type": "other",
      "path": "evidence/training-probe.json",
      "caption": "Puzzle control/structure probe",
      "findingIds": [
        "F09",
        "F11"
      ]
    },
    {
      "type": "screenshot",
      "path": "evidence/analysis.png",
      "caption": "Analysis board state",
      "findingIds": []
    },
    {
      "type": "other",
      "path": "evidence/analysis-probe.json",
      "caption": "Analysis control/structure probe",
      "findingIds": [
        "F09",
        "F11"
      ]
    },
    {
      "type": "screenshot",
      "path": "evidence/tournament.png",
      "caption": "Tournament listing",
      "findingIds": [
        "F06"
      ]
    },
    {
      "type": "layout",
      "path": "evidence/tournament-mobile-layout.json",
      "caption": "Tournament mobile overflow/CLS metrics",
      "findingIds": [
        "F04"
      ]
    },
    {
      "type": "screenshot",
      "path": "evidence/blog.png",
      "caption": "Sample article",
      "findingIds": [
        "F06"
      ]
    },
    {
      "type": "other",
      "path": "evidence/blog-probe.json",
      "caption": "Article title, description, Open Graph and structured-data probe",
      "findingIds": [
        "F14",
        "F15"
      ]
    },
    {
      "type": "discoverability",
      "path": "evidence/blog-discoverability.json",
      "caption": "Article raw-vs-rendered crawler comparison",
      "findingIds": []
    },
    {
      "type": "screenshot",
      "path": "evidence/blog-discoverability-crawler.png",
      "caption": "Article with JavaScript disabled",
      "findingIds": []
    },
    {
      "type": "screenshot",
      "path": "evidence/login.png",
      "caption": "Sign-in form with focused field",
      "findingIds": [
        "F11",
        "F17"
      ]
    },
    {
      "type": "other",
      "path": "evidence/login-probe.json",
      "caption": "Sign-in labels/autocomplete probe",
      "findingIds": [
        "F17"
      ]
    },
    {
      "type": "screenshot",
      "path": "evidence/not-found.png",
      "caption": "404 recovery state",
      "findingIds": []
    },
    {
      "type": "other",
      "path": "evidence/not-found-probe.json",
      "caption": "404 text and recovery link probe",
      "findingIds": []
    },
    {
      "type": "heap",
      "path": "evidence/heap-baseline.heapsnapshot",
      "caption": "Readable baseline heap summary",
      "findingIds": []
    },
    {
      "type": "heap",
      "path": "evidence/heap-post-valid.heapsnapshot",
      "caption": "Heap summary after 10 menu cycles",
      "findingIds": []
    },
    {
      "type": "heap",
      "path": "evidence/heap-post-50.heapsnapshot",
      "caption": "Heap summary after 50 menu cycles",
      "findingIds": []
    },
    {
      "type": "other",
      "path": "evidence/memory-metrics.json",
      "caption": "In-page heap/DOM counts around 10 menu cycles",
      "findingIds": []
    }
  ],
  "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": "screenshot comparison under emulated light and dark preferences",
      "evidence": "The light and dark captures are byte-identical and both retain the dark palette; the DOM reports html class=\"dark\" rather than a system-driven theme.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/home-light.png",
        "evidence/home-dark.png"
      ],
      "findingIds": [
        "F01"
      ]
    },
    {
      "principleId": "respect-user-preferences",
      "checkId": "respects-reduced-motion",
      "status": "pass",
      "confidence": "high",
      "method": "computed animation and stylesheet probe under prefers-reduced-motion: reduce",
      "evidence": "The preference matched, no active animations were returned, and the fetched site stylesheet contains four prefers-reduced-motion rules.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/preferences-probe.json",
        "evidence/platform-probe.json"
      ]
    },
    {
      "principleId": "respect-user-preferences",
      "checkId": "respects-contrast",
      "status": "issues",
      "confidence": "high",
      "method": "Lighthouse contrast audit plus prefers-contrast stylesheet probe",
      "evidence": "Lighthouse found 11 low-contrast text/control cases, while the fetched stylesheets contain no prefers-contrast or forced-colors adaptation.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/lighthouse-details.json",
        "evidence/preferences-probe.json"
      ],
      "findingIds": [
        "F02"
      ]
    },
    {
      "principleId": "implement-natural-interactions",
      "checkId": "view-transitions",
      "status": "issues",
      "confidence": "high",
      "method": "rendered route/state review and fetched CSS feature probe",
      "evidence": "Home, training, analysis and article surfaces use abrupt document/state changes; fetched CSS contains no @view-transition or view-transition-name usage.",
      "pathIds": [
        "home",
        "training",
        "analysis",
        "blog"
      ],
      "artifacts": [
        "evidence/platform-probe.json"
      ],
      "findingIds": [
        "F03"
      ]
    },
    {
      "principleId": "implement-natural-interactions",
      "checkId": "scroll-driven-animations",
      "status": "pass",
      "confidence": "high",
      "method": "visual review and fetched CSS probe",
      "evidence": "No parallax, scrollytelling or scroll-linked animation is present on the representative pages, so there is no main-thread scroll-animation anti-pattern to replace.",
      "pathIds": [
        "home",
        "tournaments",
        "blog"
      ],
      "artifacts": [
        "evidence/home-desktop.png",
        "evidence/tournament.png",
        "evidence/blog.png"
      ]
    },
    {
      "principleId": "implement-natural-interactions",
      "checkId": "physical-gestures",
      "status": "pass",
      "confidence": "high",
      "method": "CSS and interaction-surface review",
      "evidence": "The site stylesheet uses overscroll-behavior and the chess/puzzle surfaces use direct board interaction without a competing scroll or pointer-driven page effect.",
      "pathIds": [
        "training",
        "analysis"
      ],
      "artifacts": [
        "evidence/platform-probe.json",
        "evidence/training.png",
        "evidence/analysis.png"
      ]
    },
    {
      "principleId": "provide-guided-navigation",
      "checkId": "scroll-state-aware-chrome",
      "status": "issues",
      "confidence": "high",
      "method": "long-page screenshots and fetched CSS probe",
      "evidence": "The 2,957 px mobile lobby and 7,501 px mobile tournament listing retain static chrome with no scroll progress/state response; no scroll-state query was found.",
      "pathIds": [
        "home",
        "tournaments"
      ],
      "artifacts": [
        "evidence/home-mobile.png",
        "evidence/tournament-mobile-layout.json"
      ],
      "findingIds": [
        "F04"
      ]
    },
    {
      "principleId": "provide-guided-navigation",
      "checkId": "anchored-positioning",
      "status": "issues",
      "confidence": "high",
      "method": "DOM/CSS inspection of menus and dropdown surfaces",
      "evidence": "Navigation/preferences use fixed/custom dropdown containers; fetched CSS contains no anchor-name, position-anchor or position-try fallback positioning.",
      "pathIds": [
        "home",
        "analysis"
      ],
      "artifacts": [
        "evidence/home-dom.json",
        "evidence/platform-probe.json"
      ],
      "findingIds": [
        "F05"
      ]
    },
    {
      "principleId": "provide-guided-navigation",
      "checkId": "directs-attention",
      "status": "issues",
      "confidence": "medium",
      "method": "cross-route and long-page visual review",
      "evidence": "Representative navigation uses abrupt page replacement and long listings expose no progress marker, transition cue or destination highlight beyond the current tab underline.",
      "pathIds": [
        "home",
        "tournaments",
        "blog"
      ],
      "artifacts": [
        "evidence/home-desktop.png",
        "evidence/tournament.png",
        "evidence/blog.png"
      ],
      "findingIds": [
        "F06"
      ]
    },
    {
      "principleId": "maximize-content-reduce-noise",
      "checkId": "no-intrusive-interruptions",
      "status": "pass",
      "confidence": "high",
      "method": "load screenshots across representative paths",
      "evidence": "No consent wall, ad interstitial or load-time modal obscured the lobby, puzzle, analysis board, article or login form.",
      "pathIds": [
        "home",
        "training",
        "analysis",
        "blog",
        "login"
      ],
      "artifacts": [
        "evidence/home-desktop.png",
        "evidence/training.png",
        "evidence/analysis.png",
        "evidence/blog.png",
        "evidence/login.png"
      ]
    },
    {
      "principleId": "maximize-content-reduce-noise",
      "checkId": "semantic-dismissible-primitives",
      "status": "pass",
      "confidence": "high",
      "method": "DOM inspection and overlay inventory",
      "evidence": "No modal overlay was present on load; the visible disclosure/navigation controls are native buttons, inputs and links and did not block content.",
      "pathIds": [
        "home",
        "training",
        "analysis"
      ],
      "artifacts": [
        "evidence/home-dom.json",
        "evidence/training-probe.json",
        "evidence/analysis-probe.json"
      ]
    },
    {
      "principleId": "maximize-content-reduce-noise",
      "checkId": "reduced-chrome",
      "status": "pass",
      "confidence": "high",
      "method": "visual review of all archetypes",
      "evidence": "The board and article content dominate their viewports; there are no ads and only compact global chrome.",
      "pathIds": [
        "home",
        "training",
        "analysis",
        "blog"
      ],
      "artifacts": [
        "evidence/training.png",
        "evidence/analysis.png",
        "evidence/blog.png"
      ]
    },
    {
      "principleId": "adapt-to-the-form-factor",
      "checkId": "responsive-no-horizontal-scroll",
      "status": "pass",
      "confidence": "high",
      "method": "mobile layout metrics at 360x800",
      "evidence": "Lobby and tournament pages both report scrollWidth 360, clientWidth 360 and zero horizontal overflow with a viewport meta tag.",
      "pathIds": [
        "home",
        "tournaments"
      ],
      "artifacts": [
        "evidence/home-mobile-layout.json",
        "evidence/tournament-mobile-layout.json"
      ]
    },
    {
      "principleId": "adapt-to-the-form-factor",
      "checkId": "component-level-responsiveness",
      "status": "issues",
      "confidence": "medium",
      "method": "fetched CSS feature probe across reused components",
      "evidence": "No @container or container-type rules were found in the three page stylesheets; complex lobby cards, carousels and board sidebars adapt only at page/viewport level.",
      "pathIds": [
        "home",
        "analysis"
      ],
      "artifacts": [
        "evidence/platform-probe.json",
        "evidence/home-mobile.png",
        "evidence/analysis.png"
      ],
      "findingIds": [
        "F07"
      ]
    },
    {
      "principleId": "adapt-to-the-form-factor",
      "checkId": "input-modality-aware",
      "status": "pass",
      "confidence": "high",
      "method": "keyboard-focus and mobile visual review",
      "evidence": "The login username receives a strong blue focus ring, controls remain operable as buttons/links, and primary mobile actions have generous target sizes.",
      "pathIds": [
        "login",
        "home"
      ],
      "artifacts": [
        "evidence/login.png",
        "evidence/home-mobile.png"
      ]
    },
    {
      "principleId": "support-core-task-success",
      "checkId": "clear-purpose-and-primary-action",
      "status": "pass",
      "confidence": "high",
      "method": "first-viewport review of representative paths",
      "evidence": "Quick pairing, puzzle instruction, analysis board, tournament heading, article title and sign-in form each make their purpose and next action apparent.",
      "pathIds": [
        "home",
        "training",
        "analysis",
        "tournaments",
        "blog",
        "login"
      ],
      "artifacts": [
        "evidence/home-desktop.png",
        "evidence/training.png",
        "evidence/analysis.png",
        "evidence/login.png"
      ]
    },
    {
      "principleId": "support-core-task-success",
      "checkId": "primary-flow-completion",
      "status": "pass",
      "confidence": "high",
      "method": "anonymous task walkthrough",
      "evidence": "An anonymous user can select a pairing, solve a loaded puzzle and open the analysis board without registration; sign-in is confined to account-specific activity.",
      "pathIds": [
        "home",
        "training",
        "analysis"
      ],
      "artifacts": [
        "evidence/home-desktop.png",
        "evidence/training.png",
        "evidence/analysis.png"
      ]
    },
    {
      "principleId": "support-core-task-success",
      "checkId": "clear-system-state-and-recovery",
      "status": "pass",
      "confidence": "high",
      "method": "state and failure-route inspection",
      "evidence": "Puzzle state says “Your turn” and identifies the side to move; the 404 clearly says Page not found and links back to the homepage.",
      "pathIds": [
        "training",
        "not-found"
      ],
      "artifacts": [
        "evidence/training.png",
        "evidence/not-found.png",
        "evidence/not-found-probe.json"
      ]
    },
    {
      "principleId": "be-fast-and-stable",
      "checkId": "good-core-web-vitals",
      "status": "issues",
      "confidence": "high",
      "method": "Lighthouse and DevTools trace",
      "evidence": "Lighthouse measured LCP 3.7 s (outside the good <=2.5 s range), although CLS was 0 and TBT 0 ms; a warm trace measured LCP 1.06 s.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/lighthouse-home-summary.json",
        "evidence/home-trace-summary.json"
      ],
      "findingIds": [
        "F08"
      ]
    },
    {
      "principleId": "be-fast-and-stable",
      "checkId": "visual-stability",
      "status": "pass",
      "confidence": "high",
      "method": "layout observers and Lighthouse",
      "evidence": "Mobile lobby and tournament observers both report CLS 0 with no shifts; Lighthouse also reports CLS 0.",
      "pathIds": [
        "home",
        "tournaments"
      ],
      "artifacts": [
        "evidence/home-mobile-layout.json",
        "evidence/tournament-mobile-layout.json",
        "evidence/lighthouse-home-summary.json"
      ]
    },
    {
      "principleId": "be-fast-and-stable",
      "checkId": "efficient-main-thread",
      "status": "pass",
      "confidence": "high",
      "method": "trace and layout long-task observers",
      "evidence": "The trace reports zero long tasks and 0 ms total blocking time; both mobile layout captures also observed no long tasks.",
      "pathIds": [
        "home",
        "tournaments"
      ],
      "artifacts": [
        "evidence/home-trace-summary.json",
        "evidence/home-mobile-layout.json",
        "evidence/tournament-mobile-layout.json"
      ]
    },
    {
      "principleId": "be-fast-and-stable",
      "checkId": "efficient-resource-delivery",
      "status": "pass",
      "confidence": "high",
      "method": "HAR, DOM and Lighthouse delivery audits",
      "evidence": "The load transfers about 440 KB with no errors or redirects; scripts are modules/deferred in DOM. Lighthouse estimates only 130 ms render-blocking savings.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/home-summary.json",
        "evidence/home-dom.json",
        "evidence/lighthouse-home-summary.json"
      ]
    },
    {
      "principleId": "be-fast-and-stable",
      "checkId": "trim-unused-and-duplicate-code",
      "status": "pass",
      "confidence": "high",
      "method": "HAR and Lighthouse diagnostics",
      "evidence": "The 440 KB load has no tracker bundles and Lighthouse did not report unused or duplicated JavaScript/CSS audits as failures.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/home-summary.json",
        "evidence/lighthouse-home-summary.json"
      ]
    },
    {
      "principleId": "be-inclusive",
      "checkId": "names-roles-labels",
      "status": "issues",
      "confidence": "high",
      "method": "Lighthouse accessibility audit and DOM control inventory",
      "evidence": "Lighthouse found two unnamed carousel buttons and nine content/flair images without alt; training and analysis probes also enumerate icon-only buttons without accessible names.",
      "pathIds": [
        "home",
        "training",
        "analysis"
      ],
      "artifacts": [
        "evidence/lighthouse-details.json",
        "evidence/training-probe.json",
        "evidence/analysis-probe.json"
      ],
      "findingIds": [
        "F09"
      ]
    },
    {
      "principleId": "be-inclusive",
      "checkId": "sufficient-contrast",
      "status": "issues",
      "confidence": "high",
      "method": "Lighthouse color-contrast audit",
      "evidence": "Lighthouse reports insufficient contrast for Register, feed timestamps/links and tournament text (11 affected nodes).",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/lighthouse-details.json"
      ],
      "findingIds": [
        "F10"
      ]
    },
    {
      "principleId": "be-inclusive",
      "checkId": "structure-and-focus",
      "status": "issues",
      "confidence": "high",
      "method": "heading/control probes and focused screenshot",
      "evidence": "The homepage, puzzle, analysis and login rendered with no h1; complex board tools expose many icon-only controls. The login field itself has a clear visible focus ring.",
      "pathIds": [
        "home",
        "training",
        "analysis",
        "login"
      ],
      "artifacts": [
        "evidence/home-recon.json",
        "evidence/training-probe.json",
        "evidence/analysis-probe.json",
        "evidence/login.png"
      ],
      "findingIds": [
        "F11"
      ]
    },
    {
      "principleId": "be-inclusive",
      "checkId": "legible-text",
      "status": "pass",
      "confidence": "high",
      "method": "visual review at desktop and mobile",
      "evidence": "Body copy, board coordinates, form labels and article text are readable without clipping; mobile layout remains single-column and stable.",
      "pathIds": [
        "home",
        "training",
        "blog",
        "login"
      ],
      "artifacts": [
        "evidence/home-mobile.png",
        "evidence/training.png",
        "evidence/blog.png",
        "evidence/login.png"
      ]
    },
    {
      "principleId": "be-inclusive",
      "checkId": "zoom-reflow-targets-and-media",
      "status": "pass",
      "confidence": "high",
      "method": "viewport and mobile reflow inspection",
      "evidence": "The viewport allows user scaling (no maximum-scale/user-scalable=no), and tested mobile pages reflow with zero horizontal overflow. No essential timed media appears on tested paths.",
      "pathIds": [
        "home",
        "tournaments"
      ],
      "artifacts": [
        "evidence/home-dom.json",
        "evidence/home-mobile-layout.json",
        "evidence/tournament-mobile-layout.json"
      ]
    },
    {
      "principleId": "follow-best-practices",
      "checkId": "no-console-errors",
      "status": "pass",
      "confidence": "high",
      "method": "Lighthouse best-practices run",
      "evidence": "Lighthouse scored Best Practices 1.00 and did not report console errors or uncaught exceptions.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/lighthouse-home.json"
      ]
    },
    {
      "principleId": "follow-best-practices",
      "checkId": "sound-document-and-assets",
      "status": "issues",
      "confidence": "high",
      "method": "DOM, image primitive and Lighthouse",
      "evidence": "Doctype and UTF-8 are valid, but 9 images lack intrinsic dimensions and 3 are over 2x display size; the load happened to record CLS 0.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/platform-probe.json",
        "evidence/images.json"
      ],
      "findingIds": [
        "F12"
      ]
    },
    {
      "principleId": "follow-best-practices",
      "checkId": "browser-platform-hygiene",
      "status": "pass",
      "confidence": "high",
      "method": "Lighthouse best-practices and form inspection",
      "evidence": "Best Practices scored 1.00; BFCache exclusions are WebSocket/no-store constraints, and no permission prompt or paste prevention appeared.",
      "pathIds": [
        "home",
        "login"
      ],
      "artifacts": [
        "evidence/lighthouse-home-summary.json",
        "evidence/lighthouse-details.json",
        "evidence/login-probe.json"
      ]
    },
    {
      "principleId": "be-discoverable",
      "checkId": "title-and-description",
      "status": "pass",
      "confidence": "high",
      "method": "DOM and crawler metadata inspection",
      "evidence": "Homepage and article have descriptive unique titles and meta descriptions, all present in raw HTML.",
      "pathIds": [
        "home",
        "blog"
      ],
      "artifacts": [
        "evidence/home-recon.json",
        "evidence/blog-probe.json",
        "evidence/home-discoverability.json",
        "evidence/blog-discoverability.json"
      ]
    },
    {
      "principleId": "be-discoverable",
      "checkId": "crawlable-and-mobile-friendly",
      "status": "issues",
      "confidence": "high",
      "method": "Lighthouse SEO and DOM inspection",
      "evidence": "Robots allows crawling and no-JS coverage is 95%, but Lighthouse flags the search trigger implemented as an <a> with no href as non-crawlable.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/lighthouse-details.json",
        "evidence/platform-probe.json",
        "evidence/home-discoverability.json"
      ],
      "findingIds": [
        "F13"
      ]
    },
    {
      "principleId": "be-discoverable",
      "checkId": "canonical-and-indexing-signals",
      "status": "issues",
      "confidence": "high",
      "method": "DOM, robots and alternate-link inspection",
      "evidence": "Both homepage and sampled article return 200 and robots allows them, with extensive hreflang on home, but neither exposes rel=canonical and robots.txt declares no Sitemap URL.",
      "pathIds": [
        "home",
        "blog"
      ],
      "artifacts": [
        "evidence/home-recon.json",
        "evidence/blog-probe.json",
        "evidence/platform-probe.json"
      ],
      "findingIds": [
        "F14"
      ]
    },
    {
      "principleId": "be-discoverable",
      "checkId": "structured-and-shareable-metadata",
      "status": "issues",
      "confidence": "high",
      "method": "article metadata probe",
      "evidence": "The article has accurate Open Graph title, description, URL, type and image, but has no JSON-LD or microdata for its Article entity.",
      "pathIds": [
        "blog"
      ],
      "artifacts": [
        "evidence/blog-probe.json"
      ],
      "findingIds": [
        "F15"
      ]
    },
    {
      "principleId": "be-private-and-secure",
      "checkId": "secure-transport-and-headers",
      "status": "pass",
      "confidence": "high",
      "method": "headers, cookies, secrets and DOM inspection",
      "evidence": "HTTPS, HSTS, X-Frame-Options DENY, secure HttpOnly SameSite=Lax cookie and a nonce-based meta CSP are present; secret scan found none.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/headers.json",
        "evidence/cookies.json",
        "evidence/secrets.json",
        "evidence/home-dom.json"
      ]
    },
    {
      "principleId": "be-private-and-secure",
      "checkId": "data-minimisation-and-third-parties",
      "status": "pass",
      "confidence": "high",
      "method": "tracker and HAR inspection",
      "evidence": "No known trackers were found; external traffic is confined to Lichess-owned asset/image/socket origins and no third-party cookies were set.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/trackers.json",
        "evidence/home-summary.json",
        "evidence/cookies.json"
      ]
    },
    {
      "principleId": "be-private-and-secure",
      "checkId": "in-context-permissions-and-modern-auth",
      "status": "issues",
      "confidence": "high",
      "method": "login-form and runtime inspection",
      "evidence": "No permission prompt occurred on load, but the public sign-in UI exposes password plus one-time code only and no passkey/WebAuthn option.",
      "pathIds": [
        "login"
      ],
      "artifacts": [
        "evidence/login.png",
        "evidence/login-probe.json"
      ],
      "findingIds": [
        "F17"
      ]
    },
    {
      "principleId": "be-private-and-secure",
      "checkId": "defensive-browser-policies",
      "status": "issues",
      "confidence": "high",
      "method": "main-response header inspection",
      "evidence": "HSTS, X-Frame-Options and Permissions-Policy are present, but response CSP, X-Content-Type-Options and Referrer-Policy are absent; the meta CSP cannot provide all header-only protections.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/headers.json",
        "evidence/home-dom.json"
      ],
      "findingIds": [
        "F16"
      ]
    },
    {
      "principleId": "be-resilient",
      "checkId": "progressive-enhancement",
      "status": "pass",
      "confidence": "high",
      "method": "no-JS crawler comparison",
      "evidence": "Raw HTML preserves 95% of homepage and 97% of article content; neither page is a JS shell.",
      "pathIds": [
        "home",
        "blog"
      ],
      "artifacts": [
        "evidence/home-discoverability.json",
        "evidence/blog-discoverability.json",
        "evidence/home-discoverability-crawler.png",
        "evidence/blog-discoverability-crawler.png"
      ]
    },
    {
      "principleId": "be-resilient",
      "checkId": "resilient-runtime-behaviour",
      "status": "pass",
      "confidence": "high",
      "method": "representative runtime state review",
      "evidence": "Lobby, puzzle, analysis and listing loaded into stable, usable states without cut-off overlays or fragile blank shells.",
      "pathIds": [
        "home",
        "training",
        "analysis",
        "tournaments"
      ],
      "artifacts": [
        "evidence/home-desktop.png",
        "evidence/training.png",
        "evidence/analysis.png",
        "evidence/tournament.png"
      ]
    },
    {
      "principleId": "be-resilient",
      "checkId": "offline-and-installable",
      "status": "pass",
      "confidence": "high",
      "method": "manifest/service-worker probe",
      "evidence": "A complete standalone web app manifest with 32–1024 px icons is linked and a service worker registration controls the lichess.org scope.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/platform-probe.json"
      ]
    },
    {
      "principleId": "be-resilient",
      "checkId": "network-and-http-failure-states",
      "status": "pass",
      "confidence": "high",
      "method": "404 recovery inspection",
      "evidence": "An invalid route renders a clear 404/Page not found state and a direct homepage recovery link rather than a blank shell.",
      "pathIds": [
        "not-found"
      ],
      "artifacts": [
        "evidence/not-found.png",
        "evidence/not-found-probe.json"
      ]
    },
    {
      "principleId": "be-internationalised",
      "checkId": "lang-dir-and-logical-properties",
      "status": "pass",
      "confidence": "high",
      "method": "DOM language and alternate-link inspection",
      "evidence": "The document declares en-US and exposes hreflang variants including Arabic and Persian; language-specific routes are server-rendered.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/home-dom.json",
        "evidence/home-recon.json"
      ]
    },
    {
      "principleId": "be-internationalised",
      "checkId": "locale-aware-data",
      "status": "pass",
      "confidence": "high",
      "method": "rendered time markup inspection",
      "evidence": "Live dates and times use semantic <time datetime=UTC> values with localized display strings (for example “in 12 hours” and localized titles).",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/home-dom.json"
      ]
    },
    {
      "principleId": "be-internationalised",
      "checkId": "time-zone-correctness",
      "status": "pass",
      "confidence": "high",
      "method": "rendered time data inspection",
      "evidence": "Event timestamps are stored as unambiguous Z/UTC datetime values and localized for display with explicit UTC context.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/home-dom.json"
      ]
    },
    {
      "principleId": "be-trustworthy",
      "checkId": "no-dark-patterns",
      "status": "pass",
      "confidence": "high",
      "method": "visual and network review",
      "evidence": "The service is ad-free, exposes Donate rather than disguised sponsorship, and presents sign-in/register choices without consent nags or forced continuity.",
      "pathIds": [
        "home",
        "login"
      ],
      "artifacts": [
        "evidence/home-desktop.png",
        "evidence/login.png",
        "evidence/trackers.json"
      ]
    },
    {
      "principleId": "be-trustworthy",
      "checkId": "humane-error-handling",
      "status": "pass",
      "confidence": "high",
      "method": "form semantics and recovery-state inspection",
      "evidence": "Sign-in fields use labels and required constraints, password reset is visible, and the failure route provides a clear recovery action.",
      "pathIds": [
        "login",
        "not-found"
      ],
      "artifacts": [
        "evidence/login-probe.json",
        "evidence/login.png",
        "evidence/not-found.png"
      ]
    },
    {
      "principleId": "be-trustworthy",
      "checkId": "trustworthy-input-assistance",
      "status": "pass",
      "confidence": "high",
      "method": "form autocomplete inspection",
      "evidence": "Username, current password and authentication code use autocomplete=username, current-password and one-time-code respectively.",
      "pathIds": [
        "login"
      ],
      "artifacts": [
        "evidence/login-probe.json"
      ]
    },
    {
      "principleId": "be-trustworthy",
      "checkId": "safe-commercial-and-account-flows",
      "status": "pass",
      "confidence": "high",
      "method": "account-flow visual review",
      "evidence": "The sampled sign-in screen clearly separates Sign in/Register, offers password reset and does not obscure pricing or introduce a subscription commitment.",
      "pathIds": [
        "login"
      ],
      "artifacts": [
        "evidence/login.png",
        "evidence/login-probe.json"
      ]
    },
    {
      "principleId": "be-sustainable",
      "checkId": "optimised-assets",
      "status": "issues",
      "confidence": "high",
      "method": "image primitive and Lighthouse image-delivery audit",
      "evidence": "All sampled raster content uses WebP, but 18 below-fold images omit lazy loading, 9 omit srcset, 3 are oversized and Lighthouse estimates 18 KiB savings.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/images.json",
        "evidence/lighthouse-home-summary.json"
      ],
      "findingIds": [
        "F18"
      ]
    },
    {
      "principleId": "be-sustainable",
      "checkId": "no-wasteful-work",
      "status": "pass",
      "confidence": "high",
      "method": "trace and network inspection",
      "evidence": "The trace records no long tasks/TBT, the 440 KB load has no repeated errors or redirects, and no tracker-driven background work was detected.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/home-trace-summary.json",
        "evidence/home-summary.json",
        "evidence/trackers.json"
      ]
    },
    {
      "principleId": "be-sustainable",
      "checkId": "third-party-and-media-budget",
      "status": "pass",
      "confidence": "high",
      "method": "HAR and tracker inspection",
      "evidence": "The initial page transfers about 440 KB, has no autoplay media and no known trackers; asset traffic is hosted on Lichess-owned domains.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/home-summary.json",
        "evidence/trackers.json",
        "evidence/home-desktop.png"
      ]
    },
    {
      "principleId": "be-agent-ready",
      "checkId": "structured-agent-capabilities",
      "status": "not-applicable",
      "confidence": "high",
      "method": "Applicability judgement from representative-path recon",
      "evidence": "Agent-facing WebMCP tools and on-device inference are emerging and not required for this public chess experience; crawler-readable content is evaluated separately under discoverability.",
      "reason": "Agent-facing WebMCP tools and on-device inference are emerging and not required for this public chess experience; crawler-readable content is evaluated separately under discoverability."
    },
    {
      "principleId": "be-agent-ready",
      "checkId": "on-device-inference",
      "status": "not-applicable",
      "confidence": "high",
      "method": "Applicability judgement from representative-path recon",
      "evidence": "Agent-facing WebMCP tools and on-device inference are emerging and not required for this public chess experience; crawler-readable content is evaluated separately under discoverability.",
      "reason": "Agent-facing WebMCP tools and on-device inference are emerging and not required for this public chess experience; crawler-readable content is evaluated separately under discoverability."
    },
    {
      "principleId": "be-memory-efficient",
      "checkId": "no-leak-under-repeated-interaction",
      "status": "pass",
      "confidence": "high",
      "method": "heap snapshots and in-page metrics across 10 and 50 preference-menu cycles",
      "evidence": "A one-time preferences load raised snapshot size from 6.43 MB to 6.69 MB; 50 cycles remained bounded at 6.57 MB. The 10-cycle in-page probe grew only 640 bytes and 22 DOM nodes.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/heap-baseline.heapsnapshot",
        "evidence/heap-post-valid.heapsnapshot",
        "evidence/heap-post-50.heapsnapshot",
        "evidence/memory-metrics.json"
      ]
    },
    {
      "principleId": "be-memory-efficient",
      "checkId": "bounded-footprint",
      "status": "pass",
      "confidence": "high",
      "method": "heap summary comparison",
      "evidence": "The interactive lobby snapshot remains about 6.4–6.7 MB self size with roughly 104k–111k heap nodes, proportionate to a live chess lobby.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/heap-baseline.heapsnapshot",
        "evidence/heap-post-50.heapsnapshot"
      ]
    },
    {
      "principleId": "be-memory-efficient",
      "checkId": "no-detached-dom-or-unbounded-listeners",
      "status": "pass",
      "confidence": "high",
      "method": "repeated interaction heap/DOM comparison",
      "evidence": "Growth plateaus between 10 and 50 repeated menu cycles rather than scaling with cycle count; the menu closes and DOM count remains near baseline.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/heap-post-valid.heapsnapshot",
        "evidence/heap-post-50.heapsnapshot",
        "evidence/memory-metrics.json"
      ]
    }
  ],
  "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": "issues",
      "findingIds": [
        "F04",
        "F05",
        "F06"
      ]
    },
    {
      "principleId": "maximize-content-reduce-noise",
      "expectation": "default",
      "status": "pass"
    },
    {
      "principleId": "adapt-to-the-form-factor",
      "expectation": "default",
      "status": "issues",
      "findingIds": [
        "F07"
      ]
    },
    {
      "principleId": "support-core-task-success",
      "expectation": "default",
      "status": "pass"
    },
    {
      "principleId": "be-fast-and-stable",
      "expectation": "default",
      "status": "issues",
      "findingIds": [
        "F08"
      ]
    },
    {
      "principleId": "be-inclusive",
      "expectation": "default",
      "status": "issues",
      "findingIds": [
        "F09",
        "F10",
        "F11"
      ]
    },
    {
      "principleId": "follow-best-practices",
      "expectation": "default",
      "status": "issues",
      "findingIds": [
        "F12"
      ]
    },
    {
      "principleId": "be-discoverable",
      "expectation": "default",
      "status": "issues",
      "findingIds": [
        "F13",
        "F14",
        "F15"
      ]
    },
    {
      "principleId": "be-private-and-secure",
      "expectation": "default",
      "status": "issues",
      "findingIds": [
        "F17",
        "F16"
      ]
    },
    {
      "principleId": "be-resilient",
      "expectation": "contextual",
      "status": "pass"
    },
    {
      "principleId": "be-internationalised",
      "expectation": "contextual",
      "status": "pass"
    },
    {
      "principleId": "be-trustworthy",
      "expectation": "default",
      "status": "pass"
    },
    {
      "principleId": "be-sustainable",
      "expectation": "contextual",
      "status": "issues",
      "findingIds": [
        "F18"
      ]
    },
    {
      "principleId": "be-agent-ready",
      "expectation": "contextual",
      "status": "not-applicable",
      "reason": "Agent-facing WebMCP tools and on-device inference are emerging and not required for this public chess experience; crawler-readable content is evaluated separately under discoverability."
    },
    {
      "principleId": "be-memory-efficient",
      "expectation": "default",
      "status": "pass"
    }
  ],
  "paths": [
    {
      "id": "home",
      "description": "Public lobby and primary play entry point; covers global navigation, pairing controls, live content, theme, responsive layout and load behavior.",
      "url": "https://lichess.org/",
      "conditions": [
        "desktop 780x493",
        "mobile 360x800",
        "prefers-color-scheme: light and dark",
        "prefers-reduced-motion: reduce",
        "prefers-contrast: more",
        "crawler without JavaScript"
      ],
      "result": "issues"
    },
    {
      "id": "training",
      "description": "Anonymous puzzle journey; represents the primary interactive learning/game task.",
      "url": "https://lichess.org/training",
      "conditions": [
        "desktop",
        "anonymous session"
      ],
      "result": "issues"
    },
    {
      "id": "analysis",
      "description": "Long-lived analysis-board application; represents a complex interactive tool and memory-sensitive session.",
      "url": "https://lichess.org/analysis",
      "conditions": [
        "desktop",
        "anonymous session"
      ],
      "result": "issues"
    },
    {
      "id": "tournaments",
      "description": "Dense listing/index archetype; covers navigation, responsive reflow and live data presentation.",
      "url": "https://lichess.org/tournament",
      "conditions": [
        "desktop",
        "mobile 360x800"
      ],
      "result": "pass"
    },
    {
      "id": "blog",
      "description": "Long-form article archetype; covers content legibility, crawler rendering and rich/share metadata.",
      "url": "https://lichess.org/@/Lichess/blog/announcing-the-chessmood-2020-grand-prix-2026/Y7sU143E",
      "conditions": [
        "desktop",
        "crawler without JavaScript"
      ],
      "result": "issues"
    },
    {
      "id": "login",
      "description": "Authentication form; covers labels, autofill, focus and account-flow posture.",
      "url": "https://lichess.org/login",
      "conditions": [
        "desktop",
        "keyboard focus"
      ],
      "result": "issues"
    },
    {
      "id": "not-found",
      "description": "Representative HTTP failure/recovery state.",
      "url": "https://lichess.org/this-route-does-not-exist-atomic-audit",
      "conditions": [
        "desktop"
      ],
      "result": "pass"
    }
  ],
  "findings": [
    {
      "id": "F01",
      "pathId": "home",
      "url": "https://lichess.org/",
      "principleId": "respect-user-preferences",
      "principleCheckId": "respects-color-scheme",
      "guidanceId": "dark-mode",
      "guidanceCategory": "modern-web-guidance",
      "severity": "medium",
      "confidence": "high",
      "summary": "System light preference is ignored",
      "evidence": "Emulated light and dark screenshots are byte-identical and both show the dark theme; html is hard-coded class=\"dark\" for a fresh profile.",
      "artifacts": [
        "evidence/home-light.png",
        "evidence/home-dark.png"
      ],
      "suggestedFix": "Use color-scheme: light dark and initialize the default theme from prefers-color-scheme, while preserving an explicit saved user override.",
      "effort": "small"
    },
    {
      "id": "F02",
      "pathId": "home",
      "url": "https://lichess.org/",
      "principleId": "respect-user-preferences",
      "principleCheckId": "respects-contrast",
      "guidanceId": "accessibility",
      "guidanceCategory": "modern-web-guidance",
      "severity": "medium",
      "confidence": "high",
      "summary": "High-contrast preferences have no dedicated adaptation",
      "evidence": "No prefers-contrast/forced-colors rule was found and Lighthouse identified 11 existing contrast failures.",
      "artifacts": [
        "evidence/preferences-probe.json",
        "evidence/lighthouse-details.json"
      ],
      "suggestedFix": "Add forced-colors and prefers-contrast styles for essential text/controls, avoid suppressing system colors, and test the affected registration/feed/tournament states.",
      "effort": "medium"
    },
    {
      "id": "F03",
      "pathId": "home",
      "url": "https://lichess.org/",
      "principleId": "implement-natural-interactions",
      "principleCheckId": "view-transitions",
      "guidanceId": "faster-spa-view-transitions",
      "guidanceCategory": "modern-web-guidance",
      "severity": "low",
      "confidence": "high",
      "summary": "Route and state changes are abrupt",
      "evidence": "Fetched CSS has no View Transition declarations across representative lobby, board and article navigation.",
      "artifacts": [
        "evidence/platform-probe.json"
      ],
      "suggestedFix": "Progressively enhance same-document board/panel changes and eligible cross-document navigation with View Transitions, respecting reduced motion.",
      "effort": "medium"
    },
    {
      "id": "F04",
      "pathId": "home",
      "url": "https://lichess.org/",
      "principleId": "provide-guided-navigation",
      "principleCheckId": "scroll-state-aware-chrome",
      "guidanceId": "improve-text-layout-and-legibility",
      "guidanceCategory": "modern-web-guidance",
      "severity": "low",
      "confidence": "high",
      "summary": "Long pages provide no scroll-state guidance",
      "evidence": "The mobile lobby is 2,957 px and tournament listing 7,501 px tall, while chrome stays static and no scroll-state query/progress affordance is present.",
      "artifacts": [
        "evidence/home-mobile.png",
        "evidence/tournament-mobile-layout.json"
      ],
      "suggestedFix": "Add a lightweight scroll progress or scroll-state-responsive header on long listing/content templates, with a no-motion presentation under reduced motion.",
      "effort": "small"
    },
    {
      "id": "F05",
      "pathId": "home",
      "url": "https://lichess.org/",
      "principleId": "provide-guided-navigation",
      "principleCheckId": "anchored-positioning",
      "guidanceId": "css-layout",
      "guidanceCategory": "modern-web-guidance",
      "severity": "low",
      "confidence": "high",
      "summary": "Custom dropdown positioning does not use anchors",
      "evidence": "Navigation/preferences dropdowns are custom/fixed and the fetched CSS has no anchor-name, position-anchor or position-try.",
      "artifacts": [
        "evidence/home-dom.json",
        "evidence/platform-probe.json"
      ],
      "suggestedFix": "Use CSS anchor positioning with position-try fallbacks for eligible menus/tooltips, retaining a conventional positioned fallback for older browsers.",
      "effort": "medium"
    },
    {
      "id": "F06",
      "pathId": "home",
      "url": "https://lichess.org/",
      "principleId": "provide-guided-navigation",
      "principleCheckId": "directs-attention",
      "guidanceId": "faster-spa-view-transitions",
      "guidanceCategory": "modern-web-guidance",
      "severity": "low",
      "confidence": "high",
      "summary": "Navigation gives limited destination cues",
      "evidence": "Across abrupt route changes and very long listings there is no transition, destination highlight or progress cue beyond a current-tab underline.",
      "artifacts": [
        "evidence/tournament.png",
        "evidence/blog.png"
      ],
      "suggestedFix": "Add focused destination highlighting or directional transitions to high-value route and in-page changes without adding decorative motion.",
      "effort": "medium"
    },
    {
      "id": "F07",
      "pathId": "home",
      "url": "https://lichess.org/",
      "principleId": "adapt-to-the-form-factor",
      "principleCheckId": "component-level-responsiveness",
      "guidanceId": "css-layout",
      "guidanceCategory": "modern-web-guidance",
      "severity": "low",
      "confidence": "high",
      "summary": "Complex reused components rely only on viewport layout",
      "evidence": "No @container/container-type rules occur in the fetched page CSS despite cards, carousels and side panels appearing at materially different widths.",
      "artifacts": [
        "evidence/platform-probe.json",
        "evidence/home-mobile.png"
      ],
      "suggestedFix": "Adopt container queries for reused lobby cards, board sidebars and article/list modules where their available container, not the viewport, determines layout.",
      "effort": "medium"
    },
    {
      "id": "F08",
      "pathId": "home",
      "url": "https://lichess.org/",
      "principleId": "be-fast-and-stable",
      "principleCheckId": "good-core-web-vitals",
      "guidanceId": "optimize-image-priority",
      "guidanceCategory": "modern-web-guidance",
      "severity": "medium",
      "confidence": "high",
      "summary": "Cold-load LCP misses the good threshold",
      "evidence": "Lighthouse measured LCP at 3.7 s, while the direct trace measured 1.06 s; the variance still establishes at least one tested cold-load condition outside the <=2.5 s good range.",
      "artifacts": [
        "evidence/lighthouse-home-summary.json",
        "evidence/home-trace-summary.json"
      ],
      "suggestedFix": "Profile the Lighthouse LCP candidate, preserve early discoverability/fetch priority, and reduce the short render-blocking chain; validate under throttled repeat runs.",
      "effort": "medium"
    },
    {
      "id": "F09",
      "pathId": "home",
      "url": "https://lichess.org/",
      "principleId": "be-inclusive",
      "principleCheckId": "names-roles-labels",
      "guidanceId": "accessibility",
      "guidanceCategory": "modern-web-guidance",
      "severity": "high",
      "confidence": "high",
      "summary": "Primary interactive surfaces contain unnamed controls",
      "evidence": "Lighthouse found unnamed carousel buttons and nine images without alt; puzzle and analysis probes enumerate multiple icon-only buttons with no accessible name.",
      "artifacts": [
        "evidence/lighthouse-details.json",
        "evidence/training-probe.json",
        "evidence/analysis-probe.json"
      ],
      "suggestedFix": "Give every icon-only control an aria-label or visible name; use empty alt for decorative images and meaningful alt where images convey content. Verify the board accessibility tree and blind mode.",
      "effort": "medium"
    },
    {
      "id": "F10",
      "pathId": "home",
      "url": "https://lichess.org/",
      "principleId": "be-inclusive",
      "principleCheckId": "sufficient-contrast",
      "guidanceId": "accessibility",
      "guidanceCategory": "modern-web-guidance",
      "severity": "medium",
      "confidence": "high",
      "summary": "Several text and control colors fail WCAG contrast",
      "evidence": "Lighthouse identifies Register, feed timestamps/links and tournament text among 11 low-contrast nodes.",
      "artifacts": [
        "evidence/lighthouse-details.json"
      ],
      "suggestedFix": "Adjust theme tokens so normal text reaches 4.5:1 and large/UI text reaches the applicable minimum in every theme and contrast mode.",
      "effort": "small"
    },
    {
      "id": "F11",
      "pathId": "home",
      "url": "https://lichess.org/",
      "principleId": "be-inclusive",
      "principleCheckId": "structure-and-focus",
      "guidanceId": "accessibility",
      "guidanceCategory": "modern-web-guidance",
      "severity": "medium",
      "confidence": "high",
      "summary": "Key app pages lack a clear top-level heading and expose weak control structure",
      "evidence": "Home, puzzle, analysis and login render no h1, and complex board probes include many unnamed icon controls; this weakens orientation even though visible field focus is strong.",
      "artifacts": [
        "evidence/home-recon.json",
        "evidence/training-probe.json",
        "evidence/analysis-probe.json",
        "evidence/login.png"
      ],
      "suggestedFix": "Provide a programmatic h1/page name (visually hidden where necessary), preserve logical landmarks, and complete names/focus semantics for board controls.",
      "effort": "medium"
    },
    {
      "id": "F12",
      "pathId": "home",
      "url": "https://lichess.org/",
      "principleId": "follow-best-practices",
      "principleCheckId": "sound-document-and-assets",
      "guidanceId": "optimize-image-priority",
      "guidanceCategory": "modern-web-guidance",
      "severity": "low",
      "confidence": "high",
      "summary": "Image markup omits sizing and responsive-delivery hints",
      "evidence": "The image primitive reports 9 images without dimensions, 9 without srcset and 3 over twice their display width.",
      "artifacts": [
        "evidence/images.json"
      ],
      "suggestedFix": "Add intrinsic width/height or aspect-ratio and responsive srcset/sizes; keep decorative flair dimensions explicit to prevent future shifts.",
      "effort": "small"
    },
    {
      "id": "F13",
      "pathId": "home",
      "url": "https://lichess.org/",
      "principleId": "be-discoverable",
      "principleCheckId": "crawlable-and-mobile-friendly",
      "guidanceId": "html",
      "guidanceCategory": "modern-web-guidance",
      "severity": "low",
      "confidence": "high",
      "summary": "The search affordance is an href-less anchor",
      "evidence": "Lighthouse flags header #clinput a.link because it is an <a> without href, making it non-crawlable and semantically misleading.",
      "artifacts": [
        "evidence/lighthouse-details.json"
      ],
      "suggestedFix": "Use a button for opening search, or provide a real href to a search page if it is navigation.",
      "effort": "trivial"
    },
    {
      "id": "F14",
      "pathId": "home",
      "url": "https://lichess.org/",
      "principleId": "be-discoverable",
      "principleCheckId": "canonical-and-indexing-signals",
      "guidanceId": "html",
      "guidanceCategory": "modern-web-guidance",
      "severity": "medium",
      "confidence": "high",
      "summary": "Canonical and sitemap signals are incomplete",
      "evidence": "Neither the homepage nor sampled article exposes rel=canonical, and robots.txt contains no Sitemap declaration despite public localized content.",
      "artifacts": [
        "evidence/home-recon.json",
        "evidence/blog-probe.json",
        "evidence/platform-probe.json"
      ],
      "suggestedFix": "Emit a self-referencing canonical on indexable templates and declare the canonical sitemap URL in robots.txt; keep hreflang/canonical clusters consistent.",
      "effort": "small"
    },
    {
      "id": "F15",
      "pathId": "blog",
      "url": "https://lichess.org/@/Lichess/blog/announcing-the-chessmood-2020-grand-prix-2026/Y7sU143E",
      "principleId": "be-discoverable",
      "principleCheckId": "structured-and-shareable-metadata",
      "guidanceId": "html",
      "guidanceCategory": "modern-web-guidance",
      "severity": "low",
      "confidence": "high",
      "summary": "Article metadata lacks structured data",
      "evidence": "The sampled article has accurate Open Graph fields but no JSON-LD or microdata describing the Article entity.",
      "artifacts": [
        "evidence/blog-probe.json"
      ],
      "suggestedFix": "Add schema.org BlogPosting/Article JSON-LD matching the visible headline, author, dates, canonical URL and image.",
      "effort": "small"
    },
    {
      "id": "F16",
      "pathId": "home",
      "url": "https://lichess.org/",
      "principleId": "be-private-and-secure",
      "principleCheckId": "defensive-browser-policies",
      "guidanceId": "security",
      "guidanceCategory": "modern-web-guidance",
      "severity": "medium",
      "confidence": "high",
      "summary": "Several response-level browser defenses are missing",
      "evidence": "The main response lacks CSP, X-Content-Type-Options and Referrer-Policy headers. A nonce-based CSP exists only as meta; HSTS, X-Frame-Options and Permissions-Policy are present.",
      "artifacts": [
        "evidence/headers.json",
        "evidence/home-dom.json"
      ],
      "suggestedFix": "Move/duplicate CSP into the HTTP response (including frame-ancestors), add X-Content-Type-Options: nosniff and an explicit strict-origin-when-cross-origin or stricter Referrer-Policy.",
      "effort": "small"
    },
    {
      "id": "F17",
      "pathId": "login",
      "url": "https://lichess.org/login",
      "principleId": "be-private-and-secure",
      "principleCheckId": "in-context-permissions-and-modern-auth",
      "guidanceId": "passkeys",
      "guidanceCategory": "modern-web-guidance",
      "severity": "medium",
      "confidence": "high",
      "summary": "Public authentication offers passwords but no passkey path",
      "evidence": "The login form exposes username, current-password and one-time-code fields, with no visible or probed WebAuthn/passkey option.",
      "artifacts": [
        "evidence/login.png",
        "evidence/login-probe.json"
      ],
      "suggestedFix": "Add passkey registration and authentication as a phishing-resistant option, retaining password recovery during migration and requesting credentials only in user-initiated context.",
      "effort": "large"
    },
    {
      "id": "F18",
      "pathId": "home",
      "url": "https://lichess.org/",
      "principleId": "be-sustainable",
      "principleCheckId": "optimised-assets",
      "guidanceId": "optimize-image-priority",
      "guidanceCategory": "modern-web-guidance",
      "severity": "low",
      "confidence": "high",
      "summary": "Below-fold images are not deferred or responsively selected",
      "evidence": "All 18 sampled images are below fold without lazy loading, 9 lack srcset, 3 are oversized, and Lighthouse estimates 18 KiB potential savings.",
      "artifacts": [
        "evidence/images.json",
        "evidence/lighthouse-home-summary.json"
      ],
      "suggestedFix": "Lazy-load below-fold editorial/feed imagery and provide srcset/sizes; retain eager/high priority only for the true LCP asset.",
      "effort": "small"
    }
  ],
  "taskList": [
    {
      "id": "T1",
      "title": "Complete accessible names, structure and contrast",
      "priority": 1,
      "findingIds": [
        "F02",
        "F09",
        "F10",
        "F11"
      ],
      "guidanceId": "accessibility",
      "status": "open"
    },
    {
      "id": "T2",
      "title": "Strengthen response security headers",
      "priority": 2,
      "findingIds": [
        "F16"
      ],
      "guidanceId": "security",
      "status": "open"
    },
    {
      "id": "T3",
      "title": "Bring cold-load LCP into the good range",
      "priority": 3,
      "findingIds": [
        "F08",
        "F12",
        "F18"
      ],
      "guidanceId": "optimize-image-priority",
      "status": "open"
    },
    {
      "id": "T4",
      "title": "Respect system theme preferences",
      "priority": 4,
      "findingIds": [
        "F01"
      ],
      "guidanceId": "dark-mode",
      "status": "open"
    },
    {
      "id": "T5",
      "title": "Add canonical, sitemap and Article metadata",
      "priority": 5,
      "findingIds": [
        "F13",
        "F14",
        "F15"
      ],
      "guidanceId": "html",
      "status": "open"
    },
    {
      "id": "T6",
      "title": "Offer passkey authentication",
      "priority": 6,
      "findingIds": [
        "F17"
      ],
      "guidanceId": "passkeys",
      "status": "open"
    },
    {
      "id": "T7",
      "title": "Modernise responsive and navigation behavior",
      "priority": 7,
      "findingIds": [
        "F03",
        "F04",
        "F05",
        "F06",
        "F07"
      ],
      "guidanceId": "css-layout",
      "status": "open"
    }
  ],
  "budget": {
    "wallClockSeconds": 900,
    "pathCount": 7,
    "auditPasses": 1
  },
  "agent": "pi",
  "runId": "2026-07-20T07-38-16-173Z"
}
