{
  "url": "https://www.footmercato.net",
  "auditedAt": "2026-07-23T03:03:11.643Z",
  "mode": "report",
  "status": "completed",
  "statusDetail": "Coverage-complete remote audit across seven representative paths. Not covered: comment submission, ad-click conversion, and authenticated account/payment flows because none were required for the public editorial core journey.",
  "page": {
    "appType": "mpa",
    "framework": "server-rendered custom application",
    "notes": "French football news MPA with server-rendered content, client-side filters/modals, advertising integrations, manifest and service worker."
  },
  "evidenceUsed": [
    "screenshot",
    "dom",
    "evaluate-probe",
    "layout-metrics",
    "trace",
    "har",
    "discoverability",
    "headers",
    "cookies",
    "trackers",
    "secrets",
    "images",
    "heap-summary",
    "lighthouse",
    "raw HTTP fetch"
  ],
  "guidanceConsulted": [
    "dark-mode",
    "component-specific-light-dark-theme",
    "carousel-slide-effects",
    "css",
    "scroll-position-aware-elements",
    "scroll-target-on-load",
    "light-dismiss-a-dialog",
    "html",
    "size-aware-styling",
    "flicker-free-client-side-ab-testing",
    "performance",
    "accessibility",
    "security",
    "search-hidden-content",
    "privacy",
    "coordinate-global-events",
    "capture-location-agnostic-data",
    "deliver-optimized-decorative-images",
    "forms",
    "agentic-forms",
    "agentic-javascript-tools",
    "move-dom-element-without-losing-state",
    "same-document-transitions"
  ],
  "artifacts": [
    {
      "type": "screenshot",
      "path": "evidence/404-mobile.png",
      "caption": "404 mobile",
      "condition": "viewport: 360x800"
    },
    {
      "type": "screenshot",
      "path": "evidence/article-desktop.png",
      "caption": "article desktop"
    },
    {
      "type": "screenshot",
      "path": "evidence/article-discoverability-crawler.png",
      "caption": "article discoverability crawler"
    },
    {
      "type": "screenshot",
      "path": "evidence/article-discoverability-rendered.png",
      "caption": "article discoverability rendered"
    },
    {
      "type": "discoverability",
      "path": "evidence/article-discoverability.json",
      "caption": "article discoverability"
    },
    {
      "type": "other",
      "path": "evidence/article-metadata.json",
      "caption": "article metadata"
    },
    {
      "type": "screenshot",
      "path": "evidence/article-mobile.png",
      "caption": "article mobile",
      "condition": "viewport: 360x800",
      "findingIds": [
        "F05"
      ]
    },
    {
      "type": "other",
      "path": "evidence/css-feature-probe.json",
      "caption": "css feature probe",
      "findingIds": [
        "F01",
        "F02",
        "F03",
        "F04",
        "F05",
        "F06",
        "F09"
      ]
    },
    {
      "type": "other",
      "path": "evidence/home-buttons.json",
      "caption": "home buttons"
    },
    {
      "type": "other",
      "path": "evidence/home-cookies.json",
      "caption": "home cookies",
      "findingIds": [
        "F17"
      ]
    },
    {
      "type": "screenshot",
      "path": "evidence/home-dark.png",
      "caption": "home dark",
      "condition": "prefers-color-scheme: dark",
      "findingIds": [
        "F01"
      ]
    },
    {
      "type": "screenshot",
      "path": "evidence/home-desktop.png",
      "caption": "home desktop",
      "findingIds": [
        "F05",
        "F07"
      ]
    },
    {
      "type": "screenshot",
      "path": "evidence/home-discoverability-crawler.png",
      "caption": "home discoverability crawler"
    },
    {
      "type": "screenshot",
      "path": "evidence/home-discoverability-rendered.png",
      "caption": "home discoverability rendered"
    },
    {
      "type": "discoverability",
      "path": "evidence/home-discoverability.json",
      "caption": "home discoverability"
    },
    {
      "type": "dom",
      "path": "evidence/home-dom.json",
      "caption": "home dom"
    },
    {
      "type": "other",
      "path": "evidence/home-focus-probe.json",
      "caption": "home focus probe"
    },
    {
      "type": "other",
      "path": "evidence/home-headers.json",
      "caption": "home headers",
      "findingIds": [
        "F17",
        "F19"
      ]
    },
    {
      "type": "heap",
      "path": "evidence/home-heap-baseline.json",
      "caption": "home heap baseline"
    },
    {
      "type": "heap",
      "path": "evidence/home-heap-post-tabs.json",
      "caption": "home heap post tabs"
    },
    {
      "type": "other",
      "path": "evidence/home-images.json",
      "caption": "home images",
      "findingIds": [
        "F21"
      ]
    },
    {
      "type": "layout",
      "path": "evidence/home-layout-mobile.json",
      "caption": "home layout mobile",
      "condition": "viewport: 360x800",
      "findingIds": [
        "F08"
      ]
    },
    {
      "type": "lighthouse",
      "path": "evidence/home-lighthouse.json",
      "caption": "home lighthouse",
      "findingIds": [
        "F03",
        "F11",
        "F12",
        "F13",
        "F16"
      ]
    },
    {
      "type": "other",
      "path": "evidence/home-memory-post-probe.json",
      "caption": "home memory post probe"
    },
    {
      "type": "screenshot",
      "path": "evidence/home-mobile.png",
      "caption": "home mobile",
      "condition": "viewport: 360x800"
    },
    {
      "type": "other",
      "path": "evidence/home-platform-probe.json",
      "caption": "home platform probe",
      "findingIds": [
        "F02",
        "F15"
      ]
    },
    {
      "type": "other",
      "path": "evidence/home-recon.json",
      "caption": "home recon",
      "findingIds": [
        "F12"
      ]
    },
    {
      "type": "other",
      "path": "evidence/home-secrets.json",
      "caption": "home secrets"
    },
    {
      "type": "har-summary",
      "path": "evidence/home-summary.json",
      "caption": "home summary",
      "findingIds": [
        "F14",
        "F15",
        "F18",
        "F22"
      ]
    },
    {
      "type": "trace-summary",
      "path": "evidence/home-trace-summary.json",
      "caption": "home trace summary",
      "findingIds": [
        "F13"
      ]
    },
    {
      "type": "trace",
      "path": "evidence/home-trace.json",
      "caption": "home trace"
    },
    {
      "type": "other",
      "path": "evidence/home-trackers.json",
      "caption": "home trackers",
      "findingIds": [
        "F18",
        "F22"
      ]
    },
    {
      "type": "har",
      "path": "evidence/home.har",
      "caption": "home",
      "findingIds": [
        "F14"
      ]
    },
    {
      "type": "lighthouse",
      "path": "evidence/lighthouse-key-audits.json",
      "caption": "lighthouse key audits",
      "findingIds": [
        "F14"
      ]
    },
    {
      "type": "layout",
      "path": "evidence/live-layout-mobile.json",
      "caption": "live layout mobile",
      "condition": "viewport: 360x800",
      "findingIds": [
        "F08"
      ]
    },
    {
      "type": "screenshot",
      "path": "evidence/live-mobile.png",
      "caption": "live mobile",
      "condition": "viewport: 360x800"
    },
    {
      "type": "screenshot",
      "path": "evidence/monfm-mobile.png",
      "caption": "monfm mobile",
      "condition": "viewport: 360x800"
    },
    {
      "type": "other",
      "path": "evidence/monfm-probe.json",
      "caption": "monfm probe"
    },
    {
      "type": "other",
      "path": "evidence/player-filter-control.json",
      "caption": "player filter control",
      "findingIds": [
        "F06",
        "F10"
      ]
    },
    {
      "type": "screenshot",
      "path": "evidence/players-mobile.png",
      "caption": "players mobile",
      "condition": "viewport: 360x800",
      "findingIds": [
        "F09"
      ]
    },
    {
      "type": "other",
      "path": "evidence/players-probe.json",
      "caption": "players probe"
    },
    {
      "type": "other",
      "path": "evidence/robots-sitemap-manifest.txt",
      "caption": "robots sitemap manifest",
      "findingIds": [
        "F20"
      ]
    },
    {
      "type": "other",
      "path": "evidence/service-worker.json",
      "caption": "service worker",
      "findingIds": [
        "F20"
      ]
    },
    {
      "type": "other",
      "path": "evidence/sw.js",
      "caption": "sw",
      "findingIds": [
        "F20"
      ]
    },
    {
      "type": "screenshot",
      "path": "evidence/tv-mobile.png",
      "caption": "tv mobile",
      "condition": "viewport: 360x800"
    }
  ],
  "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": "Dark screenshot and computed-style/CSS preference probe.",
      "evidence": "The dark-condition screenshot is pixel-identical to the light desktop screenshot; the computed root color-scheme is normal and the CSS feature probe found no prefers-color-scheme, color-scheme or light-dark() usage.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/home-dark.png",
        "evidence/css-feature-probe.json"
      ],
      "findingIds": [
        "F01"
      ]
    },
    {
      "principleId": "respect-user-preferences",
      "checkId": "respects-reduced-motion",
      "status": "issues",
      "confidence": "high",
      "method": "Reduced-motion animation/CSS probe.",
      "evidence": "Under prefers-reduced-motion: reduce, getAnimations() still returned four running animations with 3500 ms durations; the CSS feature probe found no reduced-motion media rule.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/home-platform-probe.json",
        "evidence/css-feature-probe.json"
      ],
      "findingIds": [
        "F02"
      ]
    },
    {
      "principleId": "respect-user-preferences",
      "checkId": "respects-contrast",
      "status": "issues",
      "confidence": "high",
      "method": "Contrast preference probe plus Lighthouse contrast audit.",
      "evidence": "The stylesheet probe found no prefers-contrast or forced-colors handling; Lighthouse also identified near-invisible betting-odds text at 1.08:1.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/css-feature-probe.json",
        "evidence/home-lighthouse.json"
      ],
      "findingIds": [
        "F03"
      ]
    },
    {
      "principleId": "implement-natural-interactions",
      "checkId": "view-transitions",
      "status": "issues",
      "confidence": "high",
      "method": "Full CSS/DOM feature probe across route and tab UI.",
      "evidence": "The complete live CSS/HTML feature probe found no view-transition rules or startViewTransition use even though the site has route and tab state changes.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/css-feature-probe.json"
      ],
      "findingIds": [
        "F04"
      ]
    },
    {
      "principleId": "implement-natural-interactions",
      "checkId": "scroll-driven-animations",
      "status": "not-applicable",
      "confidence": "high",
      "method": "Applicability judgement from representative-route recon and DOM/control inventory.",
      "evidence": "No parallax, scrollytelling, reveal or other scroll-linked animation was present on the representative templates; native scrolling is not a scroll-animation use case.",
      "reason": "No parallax, scrollytelling, reveal or other scroll-linked animation was present on the representative templates; native scrolling is not a scroll-animation use case.",
      "pathIds": [
        "home",
        "article",
        "live",
        "players",
        "tv",
        "monfm"
      ]
    },
    {
      "principleId": "implement-natural-interactions",
      "checkId": "physical-gestures",
      "status": "pass",
      "confidence": "high",
      "method": "Targeted route/probe evidence review.",
      "evidence": "CSS feature probe confirmed native scroll-snap use; mobile match carousels and lists remained directly touch-scrollable.",
      "pathIds": [
        "home"
      ]
    },
    {
      "principleId": "provide-guided-navigation",
      "checkId": "scroll-state-aware-chrome",
      "status": "issues",
      "confidence": "high",
      "method": "Desktop/mobile screenshots and full stylesheet feature probe.",
      "evidence": "Desktop/mobile screenshots show persistent fixed chrome, while the CSS feature probe found no scroll-state container query, scroll timeline or progress treatment.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/home-desktop.png",
        "evidence/article-mobile.png",
        "evidence/css-feature-probe.json"
      ],
      "findingIds": [
        "F05"
      ]
    },
    {
      "principleId": "provide-guided-navigation",
      "checkId": "anchored-positioning",
      "status": "not-applicable",
      "confidence": "high",
      "method": "Applicability judgement from representative-route recon and DOM/control inventory.",
      "evidence": "No tooltip or edge-positioned popover was present in the exercised public content, listing or favourites surfaces.",
      "reason": "No tooltip or edge-positioned popover was present in the exercised public content, listing or favourites surfaces.",
      "pathIds": [
        "home",
        "article",
        "live",
        "players",
        "tv",
        "monfm"
      ]
    },
    {
      "principleId": "provide-guided-navigation",
      "checkId": "directs-attention",
      "status": "pass",
      "confidence": "high",
      "method": "Targeted route/probe evidence review.",
      "evidence": "Mobile screenshots show persistent blue current-section indicators and date/tab selection markers across home, live, players and TV.",
      "pathIds": [
        "home"
      ]
    },
    {
      "principleId": "maximize-content-reduce-noise",
      "checkId": "no-intrusive-interruptions",
      "status": "pass",
      "confidence": "high",
      "method": "Targeted route/probe evidence review.",
      "evidence": "All initial-load screenshots exposed page content without a modal consent wall, interstitial or obscuring popup.",
      "pathIds": [
        "home"
      ]
    },
    {
      "principleId": "maximize-content-reduce-noise",
      "checkId": "semantic-dismissible-primitives",
      "status": "issues",
      "confidence": "high",
      "method": "DOM semantic control and custom-modal probes.",
      "evidence": "The live DOM contains multiple div.modal elements with no dialog role and player filtering is an <a role=\"button\"> without href; no dialog elements were present.",
      "pathIds": [
        "players"
      ],
      "artifacts": [
        "evidence/css-feature-probe.json",
        "evidence/player-filter-control.json"
      ],
      "findingIds": [
        "F06"
      ]
    },
    {
      "principleId": "maximize-content-reduce-noise",
      "checkId": "reduced-chrome",
      "status": "issues",
      "confidence": "high",
      "method": "Desktop first-viewport screenshot.",
      "evidence": "The 1440x1000 homepage screenshot devotes roughly 290 vertical pixels of the first viewport to an empty grey ad slot; the lead story begins around y=520.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/home-desktop.png"
      ],
      "findingIds": [
        "F07"
      ]
    },
    {
      "principleId": "adapt-to-the-form-factor",
      "checkId": "responsive-no-horizontal-scroll",
      "status": "issues",
      "confidence": "high",
      "method": "360 px layout metrics on home and live.",
      "evidence": "Layout captures on both home and live report scrollWidth 364 against clientWidth 360.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/home-layout-mobile.json",
        "evidence/live-layout-mobile.json"
      ],
      "findingIds": [
        "F08"
      ]
    },
    {
      "principleId": "adapt-to-the-form-factor",
      "checkId": "component-level-responsiveness",
      "status": "issues",
      "confidence": "high",
      "method": "Full stylesheet container-query probe and reused player cards.",
      "evidence": "The full stylesheet probe found zero @container rules; the same dense cards and tables appear in multiple widths.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/css-feature-probe.json",
        "evidence/players-mobile.png"
      ],
      "findingIds": [
        "F09"
      ]
    },
    {
      "principleId": "adapt-to-the-form-factor",
      "checkId": "input-modality-aware",
      "status": "issues",
      "confidence": "high",
      "method": "Player filter control markup and mobile touch/focus evidence.",
      "evidence": "On /joueur/, “Filtrer” is an <a role=\"button\" data-modal> with no href and no tabindex; custom modal containers also lack dialog semantics.",
      "pathIds": [
        "players"
      ],
      "artifacts": [
        "evidence/player-filter-control.json"
      ],
      "findingIds": [
        "F10"
      ]
    },
    {
      "principleId": "support-core-task-success",
      "checkId": "clear-purpose-and-primary-action",
      "status": "pass",
      "confidence": "high",
      "method": "Targeted route/probe evidence review.",
      "evidence": "Home, article, match, player and TV screenshots each present a descriptive heading or lead content and an obvious next action.",
      "pathIds": [
        "home"
      ]
    },
    {
      "principleId": "support-core-task-success",
      "checkId": "primary-flow-completion",
      "status": "pass",
      "confidence": "high",
      "method": "Targeted route/probe evidence review.",
      "evidence": "The home-to-article reading journey loaded a complete article body at a stable 200 URL on desktop, mobile and crawler views.",
      "pathIds": [
        "home"
      ]
    },
    {
      "principleId": "support-core-task-success",
      "checkId": "clear-system-state-and-recovery",
      "status": "pass",
      "confidence": "high",
      "method": "Targeted route/probe evidence review.",
      "evidence": "Live cards show status/time, Mon FM explains its empty state, and the deliberate invalid URL presents a clear 404 with a home recovery link.",
      "pathIds": [
        "home"
      ]
    },
    {
      "principleId": "be-fast-and-stable",
      "checkId": "good-core-web-vitals",
      "status": "issues",
      "confidence": "high",
      "method": "Mobile Lighthouse and DevTools trace summary.",
      "evidence": "Lighthouse measured LCP at 7.6 s (performance 0.73), far outside the 2.5 s good threshold, despite low CLS and 80 ms TBT.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/home-lighthouse.json",
        "evidence/home-trace-summary.json"
      ],
      "findingIds": [
        "F13"
      ]
    },
    {
      "principleId": "be-fast-and-stable",
      "checkId": "visual-stability",
      "status": "pass",
      "confidence": "high",
      "method": "Targeted route/probe evidence review.",
      "evidence": "Home mobile layout recorded CLS 0 with no shifts; Lighthouse CLS was 0.007 and all 100 audited images had dimensions.",
      "pathIds": [
        "home"
      ]
    },
    {
      "principleId": "be-fast-and-stable",
      "checkId": "efficient-main-thread",
      "status": "issues",
      "confidence": "high",
      "method": "Lighthouse unused-code evidence and HAR script population.",
      "evidence": "HAR recorded 45 scripts and 803 KB script transfer; Lighthouse estimates 358 KiB unused JS, including 75% of GPT, 81% of Prebid and 61% of Amazon publisher.js.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/home-summary.json",
        "evidence/lighthouse-key-audits.json",
        "evidence/home.har"
      ],
      "findingIds": [
        "F14"
      ]
    },
    {
      "principleId": "be-fast-and-stable",
      "checkId": "efficient-resource-delivery",
      "status": "issues",
      "confidence": "high",
      "method": "HAR summary confirmed against live script async/defer attributes.",
      "evidence": "HAR marked optiyield pfc as parser-inserted, High priority; DOM confirmation shows the resulting pfc script lacks defer/async, while many other candidates are correctly deferred.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/home-summary.json",
        "evidence/home-platform-probe.json"
      ],
      "findingIds": [
        "F15"
      ]
    },
    {
      "principleId": "be-fast-and-stable",
      "checkId": "trim-unused-and-duplicate-code",
      "status": "issues",
      "confidence": "high",
      "method": "Lighthouse code coverage diagnostics and HAR bytes.",
      "evidence": "HAR recorded 45 scripts and 803 KB script transfer; Lighthouse estimates 358 KiB unused JS, including 75% of GPT, 81% of Prebid and 61% of Amazon publisher.js.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/home-summary.json",
        "evidence/lighthouse-key-audits.json",
        "evidence/home.har"
      ],
      "findingIds": [
        "F14"
      ]
    },
    {
      "principleId": "be-inclusive",
      "checkId": "names-roles-labels",
      "status": "issues",
      "confidence": "high",
      "method": "Cross-modal evidence review.",
      "evidence": "On /joueur/, “Filtrer” is an <a role=\"button\" data-modal> with no href and no tabindex; custom modal containers also lack dialog semantics.",
      "pathIds": [
        "players"
      ],
      "artifacts": [
        "evidence/player-filter-control.json"
      ],
      "findingIds": [
        "F10"
      ]
    },
    {
      "principleId": "be-inclusive",
      "checkId": "sufficient-contrast",
      "status": "issues",
      "confidence": "high",
      "method": "Lighthouse element-level contrast ratios.",
      "evidence": "Lighthouse measured two odds values at 1.08:1 and the red bonus CTA at 4.33:1, below the required 4.5:1 for this text size.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/home-lighthouse.json"
      ],
      "findingIds": [
        "F11"
      ]
    },
    {
      "principleId": "be-inclusive",
      "checkId": "structure-and-focus",
      "status": "pass",
      "confidence": "high",
      "method": "Targeted route/probe evidence review.",
      "evidence": "Lighthouse passed heading order and one-main-landmark; the focus probe showed native visible outlines on sampled links.",
      "pathIds": [
        "home"
      ]
    },
    {
      "principleId": "be-inclusive",
      "checkId": "legible-text",
      "status": "pass",
      "confidence": "high",
      "method": "Targeted route/probe evidence review.",
      "evidence": "Article and listing screenshots show readable line lengths, clear spacing and unclipped text at 360 px, aside from the separately reported contrast issue.",
      "pathIds": [
        "home"
      ]
    },
    {
      "principleId": "be-inclusive",
      "checkId": "zoom-reflow-targets-and-media",
      "status": "issues",
      "confidence": "high",
      "method": "Meta viewport DOM and Lighthouse audit.",
      "evidence": "The rendered meta viewport is width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no; Lighthouse failed its meta-viewport accessibility audit.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/home-recon.json",
        "evidence/home-lighthouse.json"
      ],
      "findingIds": [
        "F12"
      ]
    },
    {
      "principleId": "follow-best-practices",
      "checkId": "no-console-errors",
      "status": "pass",
      "confidence": "high",
      "method": "Targeted route/probe evidence review.",
      "evidence": "Lighthouse errors-in-console audit passed with no captured console errors.",
      "pathIds": [
        "home"
      ]
    },
    {
      "principleId": "follow-best-practices",
      "checkId": "sound-document-and-assets",
      "status": "pass",
      "confidence": "high",
      "method": "Targeted route/probe evidence review.",
      "evidence": "Lighthouse passed doctype, charset and image aspect ratio; the image primitive found dimensions on all 100 images.",
      "pathIds": [
        "home"
      ]
    },
    {
      "principleId": "follow-best-practices",
      "checkId": "browser-platform-hygiene",
      "status": "pass",
      "confidence": "high",
      "method": "Targeted route/probe evidence review.",
      "evidence": "Lighthouse passed BFCache, deprecations, source maps, notification-on-start and geolocation-on-start audits.",
      "pathIds": [
        "home"
      ]
    },
    {
      "principleId": "be-discoverable",
      "checkId": "title-and-description",
      "status": "pass",
      "confidence": "high",
      "method": "Targeted route/probe evidence review.",
      "evidence": "Homepage and article probes found unique descriptive titles and meta descriptions.",
      "pathIds": [
        "home",
        "article"
      ]
    },
    {
      "principleId": "be-discoverable",
      "checkId": "crawlable-and-mobile-friendly",
      "status": "issues",
      "confidence": "high",
      "method": "Lighthouse crawlable-anchor audit, viewport and robots evidence.",
      "evidence": "Lighthouse SEO found an <a class=\"button\" data-modal> with no href for “Partage ta réponse”.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/home-lighthouse.json"
      ],
      "findingIds": [
        "F16"
      ]
    },
    {
      "principleId": "be-discoverable",
      "checkId": "canonical-and-indexing-signals",
      "status": "pass",
      "confidence": "high",
      "method": "Targeted route/probe evidence review.",
      "evidence": "Both home and article return 200 with canonical URLs; robots allows crawling and points to two valid sitemap locations.",
      "pathIds": [
        "home",
        "article"
      ]
    },
    {
      "principleId": "be-discoverable",
      "checkId": "structured-and-shareable-metadata",
      "status": "pass",
      "confidence": "high",
      "method": "Targeted route/probe evidence review.",
      "evidence": "The article exposes matching Open Graph metadata plus NewsArticle, BreadcrumbList and Speakable JSON-LD with author, dates and images.",
      "pathIds": [
        "home",
        "article"
      ]
    },
    {
      "principleId": "be-private-and-secure",
      "checkId": "secure-transport-and-headers",
      "status": "issues",
      "confidence": "high",
      "method": "Headers and cookie primitives.",
      "evidence": "HTTPS, HSTS and X-Frame-Options are present, but CSP and X-Content-Type-Options are missing; didomi_token and inter-cap were set without Secure.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/home-headers.json",
        "evidence/home-cookies.json"
      ],
      "findingIds": [
        "F17"
      ]
    },
    {
      "principleId": "be-private-and-secure",
      "checkId": "data-minimisation-and-third-parties",
      "status": "issues",
      "confidence": "high",
      "method": "HAR and tracker-origin inventory.",
      "evidence": "The tracker probe found 18 third-party origins and four known trackers; HAR attributes 37 requests and 649 KB, 65% of transfer, to third parties.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/home-trackers.json",
        "evidence/home-summary.json"
      ],
      "findingIds": [
        "F18"
      ]
    },
    {
      "principleId": "be-private-and-secure",
      "checkId": "in-context-permissions-and-modern-auth",
      "status": "not-applicable",
      "confidence": "high",
      "method": "Applicability judgement from representative-route recon and DOM/control inventory.",
      "evidence": "No permission request or authentication flow exists on the exercised surfaces; Mon FM stores favourites without an account form.",
      "reason": "No permission request or authentication flow exists on the exercised surfaces; Mon FM stores favourites without an account form.",
      "pathIds": [
        "home",
        "article",
        "live",
        "players",
        "tv",
        "monfm"
      ]
    },
    {
      "principleId": "be-private-and-secure",
      "checkId": "defensive-browser-policies",
      "status": "issues",
      "confidence": "high",
      "method": "Main-document security header inventory.",
      "evidence": "The headers primitive found no Referrer-Policy or Permissions-Policy; CSP is also absent, while HSTS and DENY framing are correctly configured.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/home-headers.json"
      ],
      "findingIds": [
        "F19"
      ]
    },
    {
      "principleId": "be-resilient",
      "checkId": "progressive-enhancement",
      "status": "pass",
      "confidence": "high",
      "method": "Targeted route/probe evidence review.",
      "evidence": "Discoverability captures report 99% homepage and 100% article content coverage without JavaScript; neither page is a JS shell.",
      "pathIds": [
        "home",
        "article"
      ]
    },
    {
      "principleId": "be-resilient",
      "checkId": "resilient-runtime-behaviour",
      "status": "pass",
      "confidence": "high",
      "method": "Targeted route/probe evidence review.",
      "evidence": "Representative mobile listings, sticky navigation, filter surfaces and article content rendered without clipping or broken async state.",
      "pathIds": [
        "home"
      ]
    },
    {
      "principleId": "be-resilient",
      "checkId": "offline-and-installable",
      "status": "issues",
      "confidence": "high",
      "method": "Manifest, service-worker registration and fetched sw.js logic.",
      "evidence": "A valid manifest and active service worker exist, but sw.js only caches /build/ static assets and its fetch handler has no navigation fallback.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/service-worker.json",
        "evidence/sw.js",
        "evidence/robots-sitemap-manifest.txt"
      ],
      "findingIds": [
        "F20"
      ]
    },
    {
      "principleId": "be-resilient",
      "checkId": "network-and-http-failure-states",
      "status": "pass",
      "confidence": "high",
      "method": "Targeted route/probe evidence review.",
      "evidence": "The invalid route returns a purpose-built 404 screen with plain-language context and a visible home recovery action.",
      "pathIds": [
        "home"
      ]
    },
    {
      "principleId": "be-internationalised",
      "checkId": "lang-dir-and-logical-properties",
      "status": "pass",
      "confidence": "high",
      "method": "Targeted route/probe evidence review.",
      "evidence": "The document declares lang=fr and all representative content preserves French reading order and text rendering.",
      "pathIds": [
        "home"
      ]
    },
    {
      "principleId": "be-internationalised",
      "checkId": "locale-aware-data",
      "status": "pass",
      "confidence": "high",
      "method": "Targeted route/probe evidence review.",
      "evidence": "Dates, match times and season labels are presented consistently in French locale conventions across article, live and TV templates.",
      "pathIds": [
        "home"
      ]
    },
    {
      "principleId": "be-internationalised",
      "checkId": "time-zone-correctness",
      "status": "pass",
      "confidence": "medium",
      "method": "Targeted route/probe evidence review.",
      "evidence": "Article metadata uses explicit ISO-8601 offsets for published and modified timestamps, avoiding ambiguous stored instants.",
      "pathIds": [
        "home"
      ]
    },
    {
      "principleId": "be-trustworthy",
      "checkId": "no-dark-patterns",
      "status": "pass",
      "confidence": "high",
      "method": "Targeted route/probe evidence review.",
      "evidence": "Initial, article, listing and favourites screenshots show no nagging consent wall, confirmshaming, forced continuity or hidden cancellation.",
      "pathIds": [
        "home"
      ]
    },
    {
      "principleId": "be-trustworthy",
      "checkId": "humane-error-handling",
      "status": "not-applicable",
      "confidence": "high",
      "method": "Applicability judgement from representative-route recon and DOM/control inventory.",
      "evidence": "No user-input form was present on the representative public, filter, article or favourites states.",
      "reason": "No user-input form was present on the representative public, filter, article or favourites states.",
      "pathIds": [
        "home",
        "article",
        "live",
        "players",
        "tv",
        "monfm"
      ]
    },
    {
      "principleId": "be-trustworthy",
      "checkId": "trustworthy-input-assistance",
      "status": "not-applicable",
      "confidence": "high",
      "method": "Applicability judgement from representative-route recon and DOM/control inventory.",
      "evidence": "No address, payment, sign-in, sign-up or other text-entry form was present on the representative surfaces.",
      "reason": "No address, payment, sign-in, sign-up or other text-entry form was present on the representative surfaces.",
      "pathIds": [
        "home",
        "article",
        "live",
        "players",
        "tv",
        "monfm"
      ]
    },
    {
      "principleId": "be-trustworthy",
      "checkId": "safe-commercial-and-account-flows",
      "status": "not-applicable",
      "confidence": "high",
      "method": "Applicability judgement from representative-route recon and DOM/control inventory.",
      "evidence": "The site exposes editorial content and external betting links but no owned checkout, subscription, authentication or account-management journey on the exercised surfaces.",
      "reason": "The site exposes editorial content and external betting links but no owned checkout, subscription, authentication or account-management journey on the exercised surfaces.",
      "pathIds": [
        "home",
        "article",
        "live",
        "players",
        "tv",
        "monfm"
      ]
    },
    {
      "principleId": "be-sustainable",
      "checkId": "optimised-assets",
      "status": "issues",
      "confidence": "high",
      "method": "100-element image audit.",
      "evidence": "The image audit found 24 oversized images, 9 without srcset, 11 legacy-format images and no modern-format image among 100 images.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/home-images.json"
      ],
      "findingIds": [
        "F21"
      ]
    },
    {
      "principleId": "be-sustainable",
      "checkId": "no-wasteful-work",
      "status": "issues",
      "confidence": "high",
      "method": "HAR and Lighthouse unused third-party scripting diagnostics.",
      "evidence": "HAR recorded 45 scripts and 803 KB script transfer; Lighthouse estimates 358 KiB unused JS, including 75% of GPT, 81% of Prebid and 61% of Amazon publisher.js.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/home-summary.json",
        "evidence/lighthouse-key-audits.json",
        "evidence/home.har"
      ],
      "findingIds": [
        "F14"
      ]
    },
    {
      "principleId": "be-sustainable",
      "checkId": "third-party-and-media-budget",
      "status": "issues",
      "confidence": "high",
      "method": "HAR third-party byte attribution and tracker inventory.",
      "evidence": "HAR measured 649 KB third-party transfer out of 1.01 MB total; DoubleClick alone transferred 262 KB and consent/ads occupy the largest script offenders.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/home-summary.json",
        "evidence/home-trackers.json"
      ],
      "findingIds": [
        "F22"
      ]
    },
    {
      "principleId": "be-agent-ready",
      "checkId": "structured-agent-capabilities",
      "status": "not-applicable",
      "confidence": "high",
      "method": "Applicability judgement from representative-route recon and DOM/control inventory.",
      "evidence": "This editorial news site exposes machine-readable articles but no transactional capability that needs WebMCP or agentic form/tool registration.",
      "reason": "This editorial news site exposes machine-readable articles but no transactional capability that needs WebMCP or agentic form/tool registration.",
      "pathIds": [
        "home",
        "article",
        "live",
        "players",
        "tv",
        "monfm"
      ]
    },
    {
      "principleId": "be-agent-ready",
      "checkId": "on-device-inference",
      "status": "not-applicable",
      "confidence": "high",
      "method": "Applicability judgement from representative-route recon and DOM/control inventory.",
      "evidence": "No summarisation or generative user task was offered; built-in on-device inference is an optional emerging enhancement rather than a requirement for reading news.",
      "reason": "No summarisation or generative user task was offered; built-in on-device inference is an optional emerging enhancement rather than a requirement for reading news.",
      "pathIds": [
        "home",
        "article",
        "live",
        "players",
        "tv",
        "monfm"
      ]
    },
    {
      "principleId": "be-memory-efficient",
      "checkId": "no-leak-under-repeated-interaction",
      "status": "pass",
      "confidence": "high",
      "method": "Targeted route/probe evidence review.",
      "evidence": "After ten Most Read/Flash tab cycles, heap self-size decreased from 21,239,298 to 21,185,063 bytes rather than growing without bound.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/home-heap-baseline.json",
        "evidence/home-heap-post-tabs.json"
      ]
    },
    {
      "principleId": "be-memory-efficient",
      "checkId": "bounded-footprint",
      "status": "pass",
      "confidence": "high",
      "method": "Targeted route/probe evidence review.",
      "evidence": "Heap summaries remained near 21.2 MB self-size for this content-heavy page and the post interaction DOM contained 1,947 elements.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/home-heap-baseline.json",
        "evidence/home-heap-post-tabs.json"
      ]
    },
    {
      "principleId": "be-memory-efficient",
      "checkId": "no-detached-dom-or-unbounded-listeners",
      "status": "pass",
      "confidence": "high",
      "method": "Targeted route/probe evidence review.",
      "evidence": "Before/after heap constructor summaries showed no Detached* population among retained top constructors and closures changed only 21,657 to 21,730 after ten cycles.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/home-heap-baseline.json",
        "evidence/home-heap-post-tabs.json"
      ]
    }
  ],
  "principleOutcomes": [
    {
      "principleId": "respect-user-preferences",
      "expectation": "default",
      "status": "issues",
      "findingIds": [
        "F01",
        "F02",
        "F03"
      ]
    },
    {
      "principleId": "implement-natural-interactions",
      "expectation": "default",
      "status": "issues",
      "findingIds": [
        "F04"
      ]
    },
    {
      "principleId": "provide-guided-navigation",
      "expectation": "default",
      "status": "issues",
      "findingIds": [
        "F05"
      ]
    },
    {
      "principleId": "maximize-content-reduce-noise",
      "expectation": "default",
      "status": "issues",
      "findingIds": [
        "F06",
        "F07"
      ]
    },
    {
      "principleId": "adapt-to-the-form-factor",
      "expectation": "default",
      "status": "issues",
      "findingIds": [
        "F08",
        "F09",
        "F10"
      ]
    },
    {
      "principleId": "support-core-task-success",
      "expectation": "default",
      "status": "pass"
    },
    {
      "principleId": "be-fast-and-stable",
      "expectation": "default",
      "status": "issues",
      "findingIds": [
        "F13",
        "F14",
        "F15"
      ]
    },
    {
      "principleId": "be-inclusive",
      "expectation": "default",
      "status": "issues",
      "findingIds": [
        "F10",
        "F11",
        "F12"
      ]
    },
    {
      "principleId": "follow-best-practices",
      "expectation": "default",
      "status": "pass"
    },
    {
      "principleId": "be-discoverable",
      "expectation": "default",
      "status": "issues",
      "findingIds": [
        "F16"
      ]
    },
    {
      "principleId": "be-private-and-secure",
      "expectation": "default",
      "status": "issues",
      "findingIds": [
        "F17",
        "F18",
        "F19"
      ]
    },
    {
      "principleId": "be-resilient",
      "expectation": "contextual",
      "status": "issues",
      "findingIds": [
        "F20"
      ]
    },
    {
      "principleId": "be-internationalised",
      "expectation": "contextual",
      "status": "pass"
    },
    {
      "principleId": "be-trustworthy",
      "expectation": "default",
      "status": "pass"
    },
    {
      "principleId": "be-sustainable",
      "expectation": "contextual",
      "status": "issues",
      "findingIds": [
        "F21",
        "F14",
        "F22"
      ]
    },
    {
      "principleId": "be-agent-ready",
      "expectation": "contextual",
      "status": "not-applicable",
      "reason": "This editorial news site exposes machine-readable articles but no transactional capability that needs WebMCP or agentic form/tool registration. No summarisation or generative user task was offered; built-in on-device inference is an optional emerging enhancement rather than a requirement for reading news."
    },
    {
      "principleId": "be-memory-efficient",
      "expectation": "default",
      "status": "pass"
    }
  ],
  "paths": [
    {
      "id": "home",
      "description": "Homepage and news feed, the primary discovery surface; exercised desktop, mobile, dark, reduced-motion, crawler and performance conditions.",
      "url": "https://www.footmercato.net/",
      "conditions": [
        "desktop 1440x1000",
        "mobile 360x800",
        "prefers-color-scheme: dark",
        "prefers-reduced-motion: reduce",
        "crawler without JavaScript",
        "keyboard focus"
      ],
      "result": "issues"
    },
    {
      "id": "article",
      "description": "Representative article/detail template and primary read-content journey; exercised desktop, mobile, crawler and metadata states.",
      "url": "https://www.footmercato.net/a4448603993927757646-retournement-de-situation-pour-les-girondins-de-bordeaux",
      "conditions": [
        "desktop 1440x1000",
        "mobile 360x800",
        "crawler without JavaScript"
      ],
      "result": "pass"
    },
    {
      "id": "live",
      "description": "Match listing and live-data archetype, selected for dense cards, filters and frequently refreshed content.",
      "url": "https://www.footmercato.net/live/",
      "conditions": [
        "mobile 360x800"
      ],
      "result": "issues"
    },
    {
      "id": "players",
      "description": "Player ranking/listing archetype, selected to inspect filter controls, dense tabular content and touch interaction.",
      "url": "https://www.footmercato.net/joueur/",
      "conditions": [
        "mobile 360x800",
        "control semantics"
      ],
      "result": "issues"
    },
    {
      "id": "tv",
      "description": "Programme listing archetype, representing date navigation and compact match cards.",
      "url": "https://www.footmercato.net/programme-tv/",
      "conditions": [
        "mobile 360x800"
      ],
      "result": "pass"
    },
    {
      "id": "monfm",
      "description": "Personalised favourites surface, inspected to establish whether account/authentication and empty-state flows apply.",
      "url": "https://www.footmercato.net/mon-fm/",
      "conditions": [
        "mobile 360x800",
        "empty state"
      ],
      "result": "pass"
    },
    {
      "id": "not-found",
      "description": "Deliberate invalid route used to verify HTTP/navigation recovery and a useful 404 state.",
      "url": "https://www.footmercato.net/this-route-does-not-exist-web-uplift",
      "conditions": [
        "mobile 360x800"
      ],
      "result": "pass"
    }
  ],
  "findings": [
    {
      "id": "F01",
      "severity": "medium",
      "confidence": "high",
      "summary": "The site does not follow the system dark-colour preference.",
      "evidence": "The dark-condition screenshot is pixel-identical to the light desktop screenshot; the computed root color-scheme is normal and the CSS feature probe found no prefers-color-scheme, color-scheme or light-dark() usage.",
      "suggestedFix": "Declare color-scheme and provide system-driven dark surface, text, icon and browser-chrome colours.",
      "effort": "medium",
      "pathId": "home",
      "url": "https://www.footmercato.net/",
      "principleId": "respect-user-preferences",
      "principleCheckId": "respects-color-scheme",
      "guidanceId": "dark-mode",
      "guidanceCategory": "user-experience",
      "artifacts": [
        "evidence/home-dark.png",
        "evidence/css-feature-probe.json"
      ]
    },
    {
      "id": "F02",
      "severity": "medium",
      "confidence": "high",
      "summary": "Long-running animations continue when reduced motion is requested.",
      "evidence": "Under prefers-reduced-motion: reduce, getAnimations() still returned four running animations with 3500 ms durations; the CSS feature probe found no reduced-motion media rule.",
      "suggestedFix": "Add a prefers-reduced-motion: reduce override that removes non-essential animation and auto-advance while preserving state cues.",
      "effort": "medium",
      "pathId": "home",
      "url": "https://www.footmercato.net/",
      "principleId": "respect-user-preferences",
      "principleCheckId": "respects-reduced-motion",
      "guidanceId": "accessibility",
      "guidanceCategory": "accessibility",
      "artifacts": [
        "evidence/home-platform-probe.json",
        "evidence/css-feature-probe.json"
      ]
    },
    {
      "id": "F03",
      "severity": "medium",
      "confidence": "high",
      "summary": "There is no explicit high-contrast or forced-colours adaptation.",
      "evidence": "The stylesheet probe found no prefers-contrast or forced-colors handling; Lighthouse also identified near-invisible betting-odds text at 1.08:1.",
      "suggestedFix": "Preserve system colours in forced-colours mode and add prefers-contrast adjustments for low-contrast labels and controls.",
      "effort": "medium",
      "pathId": "home",
      "url": "https://www.footmercato.net/",
      "principleId": "respect-user-preferences",
      "principleCheckId": "respects-contrast",
      "guidanceId": "accessibility",
      "guidanceCategory": "accessibility",
      "artifacts": [
        "evidence/css-feature-probe.json",
        "evidence/home-lighthouse.json"
      ]
    },
    {
      "id": "F04",
      "severity": "low",
      "confidence": "high",
      "summary": "Route and state changes do not use View Transitions.",
      "evidence": "The complete live CSS/HTML feature probe found no view-transition rules or startViewTransition use even though the site has route and tab state changes.",
      "suggestedFix": "Use same-document View Transitions for tabs and cross-document transitions for compatible article/list navigation, with reduced-motion handling.",
      "effort": "medium",
      "pathId": "home",
      "url": "https://www.footmercato.net/",
      "principleId": "implement-natural-interactions",
      "principleCheckId": "view-transitions",
      "guidanceId": "same-document-transitions",
      "guidanceCategory": "user-experience",
      "artifacts": [
        "evidence/css-feature-probe.json"
      ]
    },
    {
      "id": "F05",
      "severity": "low",
      "confidence": "high",
      "summary": "Sticky navigation does not adapt to scroll state.",
      "evidence": "Desktop/mobile screenshots show persistent fixed chrome, while the CSS feature probe found no scroll-state container query, scroll timeline or progress treatment.",
      "suggestedFix": "Use scroll-state queries or a lightweight declarative progress/shrinking treatment so long feeds and articles communicate position.",
      "effort": "medium",
      "pathId": "home",
      "url": "https://www.footmercato.net/",
      "principleId": "provide-guided-navigation",
      "principleCheckId": "scroll-state-aware-chrome",
      "guidanceId": "scroll-position-aware-elements",
      "guidanceCategory": "user-experience",
      "artifacts": [
        "evidence/home-desktop.png",
        "evidence/article-mobile.png",
        "evidence/css-feature-probe.json"
      ]
    },
    {
      "id": "F06",
      "severity": "medium",
      "confidence": "high",
      "summary": "Modal and filter controls are built from generic elements rather than native dismissible primitives.",
      "evidence": "The live DOM contains multiple div.modal elements with no dialog role and player filtering is an <a role=\"button\"> without href; no dialog elements were present.",
      "suggestedFix": "Replace modal divs with <dialog> and transient UI with popover; use real <button> controls and preserve focus/light-dismiss behaviour.",
      "effort": "medium",
      "pathId": "players",
      "url": "https://www.footmercato.net/joueur/",
      "principleId": "maximize-content-reduce-noise",
      "principleCheckId": "semantic-dismissible-primitives",
      "guidanceId": "light-dismiss-a-dialog",
      "guidanceCategory": "user-experience",
      "artifacts": [
        "evidence/css-feature-probe.json",
        "evidence/player-filter-control.json"
      ]
    },
    {
      "id": "F07",
      "severity": "high",
      "confidence": "high",
      "summary": "A large reserved advertising region pushes primary content below the desktop fold.",
      "evidence": "The 1440x1000 homepage screenshot devotes roughly 290 vertical pixels of the first viewport to an empty grey ad slot; the lead story begins around y=520.",
      "suggestedFix": "Collapse empty ad slots and reserve only the minimum proven creative size; prioritise the lead story in the initial viewport.",
      "effort": "medium",
      "pathId": "home",
      "url": "https://www.footmercato.net/",
      "principleId": "maximize-content-reduce-noise",
      "principleCheckId": "reduced-chrome",
      "guidanceId": "performance",
      "guidanceCategory": "performance",
      "artifacts": [
        "evidence/home-desktop.png"
      ]
    },
    {
      "id": "F08",
      "severity": "low",
      "confidence": "high",
      "summary": "Mobile templates overflow the viewport by 4 px.",
      "evidence": "Layout captures on both home and live report scrollWidth 364 against clientWidth 360.",
      "suggestedFix": "Remove the overflowing width/gutter and use intrinsic sizing so scrollWidth never exceeds the visual viewport.",
      "effort": "medium",
      "pathId": "home",
      "url": "https://www.footmercato.net/",
      "principleId": "adapt-to-the-form-factor",
      "principleCheckId": "responsive-no-horizontal-scroll",
      "guidanceId": "css",
      "guidanceCategory": "user-experience",
      "artifacts": [
        "evidence/home-layout-mobile.json",
        "evidence/live-layout-mobile.json"
      ]
    },
    {
      "id": "F09",
      "severity": "medium",
      "confidence": "high",
      "summary": "Reusable components rely on viewport styling rather than container queries.",
      "evidence": "The full stylesheet probe found zero @container rules; the same dense cards and tables appear in multiple widths.",
      "suggestedFix": "Give reusable cards, match rows and tables containment and adapt them with size-aware container queries.",
      "effort": "medium",
      "pathId": "home",
      "url": "https://www.footmercato.net/",
      "principleId": "adapt-to-the-form-factor",
      "principleCheckId": "component-level-responsiveness",
      "guidanceId": "size-aware-styling",
      "guidanceCategory": "user-experience",
      "artifacts": [
        "evidence/css-feature-probe.json",
        "evidence/players-mobile.png"
      ]
    },
    {
      "id": "F10",
      "severity": "high",
      "confidence": "high",
      "summary": "The player filter is not a natively keyboard-operable control.",
      "evidence": "On /joueur/, “Filtrer” is an <a role=\"button\" data-modal> with no href and no tabindex; custom modal containers also lack dialog semantics.",
      "suggestedFix": "Use a real <button> with an accessible name and declarative dialog/popover association; manage initial and return focus.",
      "effort": "small",
      "pathId": "players",
      "url": "https://www.footmercato.net/joueur/",
      "principleId": "be-inclusive",
      "principleCheckId": "names-roles-labels",
      "guidanceId": "accessibility",
      "guidanceCategory": "accessibility",
      "artifacts": [
        "evidence/player-filter-control.json"
      ]
    },
    {
      "id": "F11",
      "severity": "medium",
      "confidence": "high",
      "summary": "Betting-odds content fails minimum colour contrast.",
      "evidence": "Lighthouse measured two odds values at 1.08:1 and the red bonus CTA at 4.33:1, below the required 4.5:1 for this text size.",
      "suggestedFix": "Darken muted odds text/background combinations and adjust the CTA red until all text meets WCAG AA contrast.",
      "effort": "medium",
      "pathId": "home",
      "url": "https://www.footmercato.net/",
      "principleId": "be-inclusive",
      "principleCheckId": "sufficient-contrast",
      "guidanceId": "accessibility",
      "guidanceCategory": "accessibility",
      "artifacts": [
        "evidence/home-lighthouse.json"
      ]
    },
    {
      "id": "F12",
      "severity": "high",
      "confidence": "high",
      "summary": "The viewport explicitly prevents user zoom.",
      "evidence": "The rendered meta viewport is width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no; Lighthouse failed its meta-viewport accessibility audit.",
      "suggestedFix": "Remove user-scalable=no and maximum-scale=1; allow at least 5x zoom and verify reflow at 200–400%.",
      "effort": "medium",
      "pathId": "home",
      "url": "https://www.footmercato.net/",
      "principleId": "be-inclusive",
      "principleCheckId": "zoom-reflow-targets-and-media",
      "guidanceId": "accessibility",
      "guidanceCategory": "accessibility",
      "artifacts": [
        "evidence/home-recon.json",
        "evidence/home-lighthouse.json"
      ]
    },
    {
      "id": "F13",
      "severity": "high",
      "confidence": "high",
      "summary": "Mobile Largest Contentful Paint is slow.",
      "evidence": "Lighthouse measured LCP at 7.6 s (performance 0.73), far outside the 2.5 s good threshold, despite low CLS and 80 ms TBT.",
      "suggestedFix": "Profile the LCP element, prioritize its request, reduce ad/consent competition, and defer non-critical third-party scripts.",
      "effort": "medium",
      "pathId": "home",
      "url": "https://www.footmercato.net/",
      "principleId": "be-fast-and-stable",
      "principleCheckId": "good-core-web-vitals",
      "guidanceId": "performance",
      "guidanceCategory": "performance",
      "artifacts": [
        "evidence/home-lighthouse.json",
        "evidence/home-trace-summary.json"
      ]
    },
    {
      "id": "F14",
      "severity": "high",
      "confidence": "high",
      "summary": "Advertising and consent JavaScript dominates the load and is mostly unused at startup.",
      "evidence": "HAR recorded 45 scripts and 803 KB script transfer; Lighthouse estimates 358 KiB unused JS, including 75% of GPT, 81% of Prebid and 61% of Amazon publisher.js.",
      "suggestedFix": "Load advertising/consent integrations conditionally after consent or proximity, trim bidder integrations, and split page-specific first-party managers.",
      "effort": "medium",
      "pathId": "home",
      "url": "https://www.footmercato.net/",
      "principleId": "be-fast-and-stable",
      "principleCheckId": "trim-unused-and-duplicate-code",
      "guidanceId": "performance",
      "guidanceCategory": "performance",
      "artifacts": [
        "evidence/home-summary.json",
        "evidence/lighthouse-key-audits.json",
        "evidence/home.har"
      ]
    },
    {
      "id": "F15",
      "severity": "medium",
      "confidence": "high",
      "summary": "A parser-inserted advertising bootstrap remains render-blocking.",
      "evidence": "HAR marked optiyield pfc as parser-inserted, High priority; DOM confirmation shows the resulting pfc script lacks defer/async, while many other candidates are correctly deferred.",
      "suggestedFix": "Make the advertising bootstrap asynchronous or defer it until after critical content and consent state are ready.",
      "effort": "medium",
      "pathId": "home",
      "url": "https://www.footmercato.net/",
      "principleId": "be-fast-and-stable",
      "principleCheckId": "efficient-resource-delivery",
      "guidanceId": "performance",
      "guidanceCategory": "performance",
      "artifacts": [
        "evidence/home-summary.json",
        "evidence/home-platform-probe.json"
      ]
    },
    {
      "id": "F16",
      "severity": "medium",
      "confidence": "high",
      "summary": "A share action is exposed as a non-crawlable anchor.",
      "evidence": "Lighthouse SEO found an <a class=\"button\" data-modal> with no href for “Partage ta réponse”.",
      "suggestedFix": "Use <button> for actions, or provide a real canonical share URL when navigation is intended.",
      "effort": "medium",
      "pathId": "home",
      "url": "https://www.footmercato.net/",
      "principleId": "be-discoverable",
      "principleCheckId": "crawlable-and-mobile-friendly",
      "guidanceId": "search-hidden-content",
      "guidanceCategory": "user-experience",
      "artifacts": [
        "evidence/home-lighthouse.json"
      ]
    },
    {
      "id": "F17",
      "severity": "high",
      "confidence": "high",
      "summary": "Security headers and cookie flags are incomplete.",
      "evidence": "HTTPS, HSTS and X-Frame-Options are present, but CSP and X-Content-Type-Options are missing; didomi_token and inter-cap were set without Secure.",
      "suggestedFix": "Deploy a restrictive CSP, add nosniff, and mark all HTTPS cookies Secure with the narrowest appropriate SameSite/HttpOnly settings.",
      "effort": "medium",
      "pathId": "home",
      "url": "https://www.footmercato.net/",
      "principleId": "be-private-and-secure",
      "principleCheckId": "secure-transport-and-headers",
      "guidanceId": "security",
      "guidanceCategory": "security",
      "artifacts": [
        "evidence/home-headers.json",
        "evidence/home-cookies.json"
      ]
    },
    {
      "id": "F18",
      "severity": "high",
      "confidence": "high",
      "summary": "The default page load has a large tracking and advertising footprint.",
      "evidence": "The tracker probe found 18 third-party origins and four known trackers; HAR attributes 37 requests and 649 KB, 65% of transfer, to third parties.",
      "suggestedFix": "Minimise vendors, gate non-essential analytics/ads on consent, batch analytics, and enforce a documented third-party byte/request budget.",
      "effort": "medium",
      "pathId": "home",
      "url": "https://www.footmercato.net/",
      "principleId": "be-private-and-secure",
      "principleCheckId": "data-minimisation-and-third-parties",
      "guidanceId": "privacy",
      "guidanceCategory": "privacy",
      "artifacts": [
        "evidence/home-trackers.json",
        "evidence/home-summary.json"
      ]
    },
    {
      "id": "F19",
      "severity": "medium",
      "confidence": "high",
      "summary": "Referrer-Policy and Permissions-Policy are absent.",
      "evidence": "The headers primitive found no Referrer-Policy or Permissions-Policy; CSP is also absent, while HSTS and DENY framing are correctly configured.",
      "suggestedFix": "Add strict-origin-when-cross-origin (or stricter) Referrer-Policy, a least-privilege Permissions-Policy, and frame-ancestors in CSP.",
      "effort": "medium",
      "pathId": "home",
      "url": "https://www.footmercato.net/",
      "principleId": "be-private-and-secure",
      "principleCheckId": "defensive-browser-policies",
      "guidanceId": "security",
      "guidanceCategory": "security",
      "artifacts": [
        "evidence/home-headers.json"
      ]
    },
    {
      "id": "F20",
      "severity": "medium",
      "confidence": "high",
      "summary": "The installable experience has no document-level offline fallback.",
      "evidence": "A valid manifest and active service worker exist, but sw.js only caches /build/ static assets and its fetch handler has no navigation fallback.",
      "suggestedFix": "Precache a small offline document and handle navigation failures with a useful retry/offline state while retaining network-first freshness for news.",
      "effort": "medium",
      "pathId": "home",
      "url": "https://www.footmercato.net/",
      "principleId": "be-resilient",
      "principleCheckId": "offline-and-installable",
      "guidanceId": "performance",
      "guidanceCategory": "performance",
      "artifacts": [
        "evidence/service-worker.json",
        "evidence/sw.js",
        "evidence/robots-sitemap-manifest.txt"
      ]
    },
    {
      "id": "F21",
      "severity": "medium",
      "confidence": "high",
      "summary": "News imagery is not consistently responsive or modern-format.",
      "evidence": "The image audit found 24 oversized images, 9 without srcset, 11 legacy-format images and no modern-format image among 100 images.",
      "suggestedFix": "Generate AVIF/WebP variants, add width-based srcset/sizes, and request assets close to rendered dimensions.",
      "effort": "medium",
      "pathId": "home",
      "url": "https://www.footmercato.net/",
      "principleId": "be-sustainable",
      "principleCheckId": "optimised-assets",
      "guidanceId": "deliver-optimized-decorative-images",
      "guidanceCategory": "user-experience",
      "artifacts": [
        "evidence/home-images.json"
      ]
    },
    {
      "id": "F22",
      "severity": "high",
      "confidence": "high",
      "summary": "Third-party advertising consumes most transferred bytes before user interaction.",
      "evidence": "HAR measured 649 KB third-party transfer out of 1.01 MB total; DoubleClick alone transferred 262 KB and consent/ads occupy the largest script offenders.",
      "suggestedFix": "Set and enforce a third-party budget, delay auctions until needed, and remove low-value bidders and duplicate measurement.",
      "effort": "medium",
      "pathId": "home",
      "url": "https://www.footmercato.net/",
      "principleId": "be-sustainable",
      "principleCheckId": "third-party-and-media-budget",
      "guidanceId": "performance",
      "guidanceCategory": "performance",
      "artifacts": [
        "evidence/home-summary.json",
        "evidence/home-trackers.json"
      ]
    }
  ],
  "taskList": [
    {
      "id": "T01",
      "title": "Cut LCP and third-party startup cost",
      "priority": 1,
      "findingIds": [
        "F13",
        "F14",
        "F15",
        "F18",
        "F22"
      ],
      "guidanceId": "performance",
      "status": "open"
    },
    {
      "id": "T02",
      "title": "Restore zoom and fix player filter semantics",
      "priority": 2,
      "findingIds": [
        "F10",
        "F12"
      ],
      "guidanceId": "accessibility",
      "status": "open"
    },
    {
      "id": "T03",
      "title": "Deploy CSP, cookie flags and defensive policies",
      "priority": 3,
      "findingIds": [
        "F17",
        "F19"
      ],
      "guidanceId": "security",
      "status": "open"
    },
    {
      "id": "T04",
      "title": "Implement system dark, reduced-motion and contrast modes",
      "priority": 4,
      "findingIds": [
        "F01",
        "F02",
        "F03"
      ],
      "guidanceId": "dark-mode",
      "status": "open"
    },
    {
      "id": "T05",
      "title": "Collapse empty ad space and keep content above the fold",
      "priority": 5,
      "findingIds": [
        "F07"
      ],
      "guidanceId": "performance",
      "status": "open"
    },
    {
      "id": "T06",
      "title": "Serve responsive modern-format images",
      "priority": 6,
      "findingIds": [
        "F21"
      ],
      "guidanceId": "deliver-optimized-decorative-images",
      "status": "open"
    },
    {
      "id": "T07",
      "title": "Fix WCAG text contrast",
      "priority": 7,
      "findingIds": [
        "F11"
      ],
      "guidanceId": "accessibility",
      "status": "open"
    },
    {
      "id": "T08",
      "title": "Replace custom modal/action elements with platform primitives",
      "priority": 8,
      "findingIds": [
        "F06"
      ],
      "guidanceId": "light-dismiss-a-dialog",
      "status": "open"
    },
    {
      "id": "T09",
      "title": "Add a document offline fallback",
      "priority": 9,
      "findingIds": [
        "F20"
      ],
      "guidanceId": "performance",
      "status": "open"
    },
    {
      "id": "T10",
      "title": "Remove mobile overflow and adopt container queries",
      "priority": 10,
      "findingIds": [
        "F08",
        "F09"
      ],
      "guidanceId": "size-aware-styling",
      "status": "open"
    },
    {
      "id": "T11",
      "title": "Make action/navigation anchors semantically correct",
      "priority": 11,
      "findingIds": [
        "F16"
      ],
      "guidanceId": "search-hidden-content",
      "status": "open"
    },
    {
      "id": "T12",
      "title": "Add declarative route/tab and scroll-state transitions",
      "priority": 12,
      "findingIds": [
        "F04",
        "F05"
      ],
      "guidanceId": "same-document-transitions",
      "status": "open"
    }
  ],
  "budget": {
    "pathCount": 7,
    "auditPasses": 1
  },
  "agent": "pi",
  "runId": "2026-07-23T02-52-43-551Z"
}
