{
  "url": "https://www.ixl.com",
  "auditedAt": "2026-07-23T14:45:34.209Z",
  "mode": "report",
  "status": "completed",
  "statusDetail": "The requested URL redirected by geography to https://uk.ixl.com/; five representative templates and an error state were audited.",
  "page": {
    "appType": "mpa",
    "framework": "mixed server-rendered legacy/custom JavaScript",
    "notes": "Public educational subscription service. Home, curriculum, family pricing, sign-in, diagnostic and 404 recovery were sampled. Authenticated practice, checkout completion, school administration and account cancellation were not covered because they require credentials, payment or an existing account."
  },
  "evidenceUsed": [
    "screenshot",
    "dom",
    "layout-metrics",
    "evaluate-probe",
    "trace",
    "har",
    "headers",
    "cookies",
    "trackers",
    "secrets",
    "images",
    "discoverability",
    "lighthouse",
    "heap-summary",
    "robots.txt",
    "sitemap.xml",
    "Modern Web Guidance"
  ],
  "guidanceConsulted": [
    "dark-mode",
    "accessibility",
    "performance",
    "forms",
    "security",
    "privacy",
    "improve-text-layout-and-legibility",
    "manage-recurring-intervals",
    "accessible-error-announcement",
    "optimize-image-priority",
    "visually-stable-font-fallbacks",
    "webmcp",
    "autofill-sign-in-form",
    "light-dismiss-a-dialog",
    "same-document-transitions",
    "efficient-background-processing"
  ],
  "artifacts": [
    {
      "type": "screenshot",
      "path": "evidence/diagnostic-desktop.png",
      "caption": "diagnostic desktop",
      "findingIds": []
    },
    {
      "type": "dom",
      "path": "evidence/diagnostic-dom.json",
      "caption": "diagnostic dom",
      "findingIds": []
    },
    {
      "type": "layout",
      "path": "evidence/diagnostic-mobile-layout.json",
      "caption": "diagnostic mobile layout",
      "findingIds": []
    },
    {
      "type": "screenshot",
      "path": "evidence/diagnostic-mobile.png",
      "caption": "diagnostic mobile",
      "findingIds": []
    },
    {
      "type": "other",
      "path": "evidence/diagnostic-probe.json",
      "caption": "diagnostic probe",
      "findingIds": []
    },
    {
      "type": "other",
      "path": "evidence/guidance-accessibility.md",
      "caption": "guidance accessibility",
      "findingIds": []
    },
    {
      "type": "other",
      "path": "evidence/guidance-autofill-signin.md",
      "caption": "guidance autofill signin",
      "findingIds": []
    },
    {
      "type": "other",
      "path": "evidence/guidance-background.md",
      "caption": "guidance background",
      "findingIds": []
    },
    {
      "type": "other",
      "path": "evidence/guidance-catalog.json",
      "caption": "guidance catalog",
      "findingIds": []
    },
    {
      "type": "other",
      "path": "evidence/guidance-dark-mode.md",
      "caption": "guidance dark mode",
      "findingIds": []
    },
    {
      "type": "other",
      "path": "evidence/guidance-dialog.md",
      "caption": "guidance dialog",
      "findingIds": []
    },
    {
      "type": "other",
      "path": "evidence/guidance-errors.md",
      "caption": "guidance errors",
      "findingIds": []
    },
    {
      "type": "other",
      "path": "evidence/guidance-forms.md",
      "caption": "guidance forms",
      "findingIds": []
    },
    {
      "type": "other",
      "path": "evidence/guidance-images.md",
      "caption": "guidance images",
      "findingIds": []
    },
    {
      "type": "other",
      "path": "evidence/guidance-intervals.md",
      "caption": "guidance intervals",
      "findingIds": []
    },
    {
      "type": "other",
      "path": "evidence/guidance-legibility.md",
      "caption": "guidance legibility",
      "findingIds": []
    },
    {
      "type": "other",
      "path": "evidence/guidance-performance.md",
      "caption": "guidance performance",
      "findingIds": []
    },
    {
      "type": "other",
      "path": "evidence/guidance-privacy.md",
      "caption": "guidance privacy",
      "findingIds": []
    },
    {
      "type": "other",
      "path": "evidence/guidance-search-autocomplete.json",
      "caption": "guidance search autocomplete",
      "findingIds": []
    },
    {
      "type": "other",
      "path": "evidence/guidance-search-popup.json",
      "caption": "guidance search popup",
      "findingIds": []
    },
    {
      "type": "other",
      "path": "evidence/guidance-search-seo.json",
      "caption": "guidance search seo",
      "findingIds": []
    },
    {
      "type": "other",
      "path": "evidence/guidance-security.md",
      "caption": "guidance security",
      "findingIds": []
    },
    {
      "type": "other",
      "path": "evidence/guidance-stability.md",
      "caption": "guidance stability",
      "findingIds": []
    },
    {
      "type": "other",
      "path": "evidence/guidance-view-transitions.md",
      "caption": "guidance view transitions",
      "findingIds": []
    },
    {
      "type": "other",
      "path": "evidence/guidance-webmcp.md",
      "caption": "guidance webmcp",
      "findingIds": []
    },
    {
      "type": "other",
      "path": "evidence/home-cookies.json",
      "caption": "home cookies",
      "findingIds": [
        "IXL-016"
      ]
    },
    {
      "type": "other",
      "path": "evidence/home-css-controls-probe.json",
      "caption": "home css controls probe",
      "findingIds": [
        "IXL-002",
        "IXL-009"
      ]
    },
    {
      "type": "screenshot",
      "path": "evidence/home-dark.png",
      "caption": "home dark",
      "findingIds": [
        "IXL-001",
        "IXL-004"
      ]
    },
    {
      "type": "screenshot",
      "path": "evidence/home-desktop.png",
      "caption": "home desktop",
      "findingIds": []
    },
    {
      "type": "screenshot",
      "path": "evidence/home-discoverability-crawler.png",
      "caption": "home discoverability crawler",
      "findingIds": []
    },
    {
      "type": "screenshot",
      "path": "evidence/home-discoverability-rendered.png",
      "caption": "home discoverability rendered",
      "findingIds": []
    },
    {
      "type": "discoverability",
      "path": "evidence/home-discoverability.json",
      "caption": "home discoverability",
      "findingIds": []
    },
    {
      "type": "dom",
      "path": "evidence/home-dom.json",
      "caption": "home dom",
      "findingIds": []
    },
    {
      "type": "screenshot",
      "path": "evidence/home-forced-colors.png",
      "caption": "home forced colors",
      "findingIds": [
        "IXL-010"
      ]
    },
    {
      "type": "other",
      "path": "evidence/home-headers.json",
      "caption": "home headers",
      "findingIds": [
        "IXL-016"
      ]
    },
    {
      "type": "heap",
      "path": "evidence/home-heap-baseline.heapsnapshot",
      "caption": "home heap baseline",
      "findingIds": []
    },
    {
      "type": "heap",
      "path": "evidence/home-heap-post.heapsnapshot",
      "caption": "home heap post",
      "findingIds": []
    },
    {
      "type": "other",
      "path": "evidence/home-images.json",
      "caption": "home images",
      "findingIds": [
        "IXL-012",
        "IXL-022"
      ]
    },
    {
      "type": "layout",
      "path": "evidence/home-mobile-layout.json",
      "caption": "home mobile layout",
      "findingIds": []
    },
    {
      "type": "screenshot",
      "path": "evidence/home-mobile.png",
      "caption": "home mobile",
      "findingIds": [
        "IXL-004"
      ]
    },
    {
      "type": "other",
      "path": "evidence/home-motion.json",
      "caption": "home motion",
      "findingIds": [
        "IXL-002"
      ]
    },
    {
      "type": "other",
      "path": "evidence/home-preferences-focus.json",
      "caption": "home preferences focus",
      "findingIds": [
        "IXL-001"
      ]
    },
    {
      "type": "other",
      "path": "evidence/home-probe.json",
      "caption": "home probe",
      "findingIds": [
        "IXL-003",
        "IXL-011",
        "IXL-014",
        "IXL-015"
      ]
    },
    {
      "type": "other",
      "path": "evidence/home-resilience-probe.json",
      "caption": "home resilience probe",
      "findingIds": [
        "IXL-020"
      ]
    },
    {
      "type": "other",
      "path": "evidence/home-runtime-errors.json",
      "caption": "home runtime errors",
      "findingIds": []
    },
    {
      "type": "other",
      "path": "evidence/home-secrets.json",
      "caption": "home secrets",
      "findingIds": []
    },
    {
      "type": "har-summary",
      "path": "evidence/home-summary.json",
      "caption": "home summary",
      "findingIds": [
        "IXL-008",
        "IXL-017"
      ]
    },
    {
      "type": "trace-summary",
      "path": "evidence/home-trace-summary.json",
      "caption": "home trace summary",
      "findingIds": [
        "IXL-006"
      ]
    },
    {
      "type": "trace",
      "path": "evidence/home-trace.json",
      "caption": "home trace",
      "findingIds": [
        "IXL-006"
      ]
    },
    {
      "type": "other",
      "path": "evidence/home-trackers.json",
      "caption": "home trackers",
      "findingIds": [
        "IXL-017"
      ]
    },
    {
      "type": "har",
      "path": "evidence/home.har",
      "caption": "home",
      "findingIds": [
        "IXL-008"
      ]
    },
    {
      "type": "lighthouse",
      "path": "evidence/lighthouse-home.json",
      "caption": "lighthouse home",
      "findingIds": [
        "IXL-006",
        "IXL-008",
        "IXL-009",
        "IXL-010",
        "IXL-011",
        "IXL-012"
      ]
    },
    {
      "type": "screenshot",
      "path": "evidence/maths-year3-desktop.png",
      "caption": "maths year3 desktop",
      "findingIds": []
    },
    {
      "type": "screenshot",
      "path": "evidence/maths-year3-discoverability-crawler.png",
      "caption": "maths year3 discoverability crawler",
      "findingIds": []
    },
    {
      "type": "screenshot",
      "path": "evidence/maths-year3-discoverability-rendered.png",
      "caption": "maths year3 discoverability rendered",
      "findingIds": []
    },
    {
      "type": "discoverability",
      "path": "evidence/maths-year3-discoverability.json",
      "caption": "maths year3 discoverability",
      "findingIds": []
    },
    {
      "type": "dom",
      "path": "evidence/maths-year3-dom.json",
      "caption": "maths year3 dom",
      "findingIds": []
    },
    {
      "type": "layout",
      "path": "evidence/maths-year3-mobile-layout.json",
      "caption": "maths year3 mobile layout",
      "findingIds": []
    },
    {
      "type": "screenshot",
      "path": "evidence/maths-year3-mobile.png",
      "caption": "maths year3 mobile",
      "findingIds": [
        "IXL-004",
        "IXL-005"
      ]
    },
    {
      "type": "other",
      "path": "evidence/maths-year3-probe.json",
      "caption": "maths year3 probe",
      "findingIds": [
        "IXL-005"
      ]
    },
    {
      "type": "screenshot",
      "path": "evidence/membership-desktop.png",
      "caption": "membership desktop",
      "findingIds": []
    },
    {
      "type": "screenshot",
      "path": "evidence/membership-discoverability-crawler.png",
      "caption": "membership discoverability crawler",
      "findingIds": [
        "IXL-013",
        "IXL-019"
      ]
    },
    {
      "type": "screenshot",
      "path": "evidence/membership-discoverability-rendered.png",
      "caption": "membership discoverability rendered",
      "findingIds": [
        "IXL-013"
      ]
    },
    {
      "type": "discoverability",
      "path": "evidence/membership-discoverability.json",
      "caption": "membership discoverability",
      "findingIds": [
        "IXL-013",
        "IXL-019"
      ]
    },
    {
      "type": "dom",
      "path": "evidence/membership-dom.json",
      "caption": "membership dom",
      "findingIds": []
    },
    {
      "type": "layout",
      "path": "evidence/membership-mobile-layout.json",
      "caption": "membership mobile layout",
      "findingIds": [
        "IXL-007"
      ]
    },
    {
      "type": "screenshot",
      "path": "evidence/membership-mobile.png",
      "caption": "membership mobile",
      "findingIds": [
        "IXL-007"
      ]
    },
    {
      "type": "other",
      "path": "evidence/membership-probe.json",
      "caption": "membership probe",
      "findingIds": [
        "IXL-003",
        "IXL-014",
        "IXL-015"
      ]
    },
    {
      "type": "screenshot",
      "path": "evidence/not-found-mobile.png",
      "caption": "not found mobile",
      "findingIds": []
    },
    {
      "type": "other",
      "path": "evidence/not-found-probe.json",
      "caption": "not found probe",
      "findingIds": []
    },
    {
      "type": "other",
      "path": "evidence/robots-headers.txt",
      "caption": "robots headers",
      "findingIds": []
    },
    {
      "type": "other",
      "path": "evidence/robots.txt",
      "caption": "robots",
      "findingIds": [
        "IXL-014"
      ]
    },
    {
      "type": "screenshot",
      "path": "evidence/signin-desktop.png",
      "caption": "signin desktop",
      "findingIds": []
    },
    {
      "type": "screenshot",
      "path": "evidence/signin-discoverability-crawler.png",
      "caption": "signin discoverability crawler",
      "findingIds": []
    },
    {
      "type": "screenshot",
      "path": "evidence/signin-discoverability-rendered.png",
      "caption": "signin discoverability rendered",
      "findingIds": []
    },
    {
      "type": "discoverability",
      "path": "evidence/signin-discoverability.json",
      "caption": "signin discoverability",
      "findingIds": []
    },
    {
      "type": "dom",
      "path": "evidence/signin-dom.json",
      "caption": "signin dom",
      "findingIds": []
    },
    {
      "type": "other",
      "path": "evidence/signin-invalid-probe.json",
      "caption": "signin invalid probe",
      "findingIds": []
    },
    {
      "type": "screenshot",
      "path": "evidence/signin-invalid.png",
      "caption": "signin invalid",
      "findingIds": []
    },
    {
      "type": "layout",
      "path": "evidence/signin-mobile-layout.json",
      "caption": "signin mobile layout",
      "findingIds": []
    },
    {
      "type": "screenshot",
      "path": "evidence/signin-mobile.png",
      "caption": "signin mobile",
      "findingIds": [
        "IXL-018"
      ]
    },
    {
      "type": "other",
      "path": "evidence/signin-probe.json",
      "caption": "signin probe",
      "findingIds": [
        "IXL-018",
        "IXL-021"
      ]
    },
    {
      "type": "other",
      "path": "evidence/sitemap-headers.txt",
      "caption": "sitemap headers",
      "findingIds": []
    },
    {
      "type": "other",
      "path": "evidence/sitemap.xml",
      "caption": "sitemap",
      "findingIds": [
        "IXL-014"
      ]
    }
  ],
  "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": "HINT (not mandatory): a screenshot or computed background under an emulated prefers-color-scheme: dark condition will reveal whether surfaces re-tint; the page CSS / a color-scheme declaration is corroborating evidence. The model chooses the method.",
      "evidence": "The dark-mode screenshot remains a bright green/white page, and the computed probe reports color-scheme: normal with no prefers-color-scheme rule.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/home-dark.png",
        "evidence/home-preferences-focus.json"
      ],
      "findingIds": [
        "IXL-001"
      ]
    },
    {
      "principleId": "respect-user-preferences",
      "checkId": "respects-reduced-motion",
      "status": "issues",
      "confidence": "high",
      "method": "HINT: a transition video, or an in-page probe of getAnimations()/computed animation under an emulated prefers-reduced-motion: reduce condition, can show whether motion stops. The model chooses.",
      "evidence": "CSS inspection found scroll-timeline rules but no prefers-reduced-motion rule; the reduced-motion probe confirmed the emulated preference was active.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/home-motion.json",
        "evidence/home-css-controls-probe.json"
      ],
      "findingIds": [
        "IXL-002"
      ]
    },
    {
      "principleId": "respect-user-preferences",
      "checkId": "respects-contrast",
      "status": "pass",
      "confidence": "high",
      "method": "HINT: a screenshot under emulated prefers-contrast: more / forced-colors, or an axe/contrast probe, can show whether controls and text survive. The model chooses.",
      "evidence": "Forced-colours screenshot shows visible text, controls, borders and focus treatment.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/home-forced-colors.png"
      ]
    },
    {
      "principleId": "implement-natural-interactions",
      "checkId": "view-transitions",
      "status": "issues",
      "confidence": "medium",
      "method": "HINT: a transition video of a route/state change shows whether it animates; the page source / ::view-transition usage corroborates. The model chooses.",
      "evidence": "The cross-template DOM/CSS probe found no view-transition-name or View Transition declarations on any representative page.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/home-probe.json",
        "evidence/membership-probe.json"
      ],
      "findingIds": [
        "IXL-003"
      ]
    },
    {
      "principleId": "implement-natural-interactions",
      "checkId": "scroll-driven-animations",
      "status": "pass",
      "confidence": "high",
      "method": "HINT: source/CSS inspection for animation-timeline: scroll()/view(); a long-task / scroll-handler probe can flag the main-thread anti-pattern. The model chooses.",
      "evidence": "CSS probe found three scroll-timeline rule groups, while the load trace showed only one 55 ms long task.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/home-css-controls-probe.json"
      ]
    },
    {
      "principleId": "implement-natural-interactions",
      "checkId": "physical-gestures",
      "status": "pass",
      "confidence": "medium",
      "method": "HINT: CSS inspection for scroll-snap / overscroll-behavior / physics-based easing vs custom pointermove listeners. The model chooses.",
      "evidence": "CSS probe found scroll-snap and overscroll-behavior declarations; mobile layouts scroll naturally without overflow.",
      "pathIds": [
        "home",
        "diagnostic"
      ],
      "artifacts": [
        "evidence/home-css-controls-probe.json"
      ]
    },
    {
      "principleId": "provide-guided-navigation",
      "checkId": "scroll-state-aware-chrome",
      "status": "pass",
      "confidence": "medium",
      "method": "HINT: a transition video of scrolling, or CSS inspection for scroll-state container queries. The model chooses.",
      "evidence": "Scroll-timeline CSS and persistent responsive navigation provide position-aware chrome on long pages.",
      "pathIds": [
        "home",
        "curriculum"
      ],
      "artifacts": [
        "evidence/home-css-controls-probe.json"
      ]
    },
    {
      "principleId": "provide-guided-navigation",
      "checkId": "anchored-positioning",
      "status": "pass",
      "confidence": "high",
      "method": "HINT: CSS inspection for anchor-name / position-anchor / position-try on overlays; a screenshot of an open overlay near a viewport edge can show drift. The model chooses.",
      "evidence": "CSS inspection found nine anchor-positioning declarations, indicating overlays can use platform anchoring.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/home-css-controls-probe.json"
      ]
    },
    {
      "principleId": "provide-guided-navigation",
      "checkId": "directs-attention",
      "status": "pass",
      "confidence": "medium",
      "method": "HINT: CSS inspection for ::highlight / scroll-marker; a transition video can show whether attention is cued after navigation. The model chooses.",
      "evidence": "Screenshots show clear headings, persistent navigation, visually distinct CTAs and directional cards across entry and diagnostic pages.",
      "pathIds": [
        "home",
        "diagnostic"
      ],
      "artifacts": [
        "evidence/diagnostic-mobile.png"
      ]
    },
    {
      "principleId": "maximize-content-reduce-noise",
      "checkId": "no-intrusive-interruptions",
      "status": "issues",
      "confidence": "high",
      "method": "HINT: a screenshot on load, or a DOM probe for full-viewport overlays present before interaction. The model chooses.",
      "evidence": "Desktop and mobile screenshots show “First time here?” covering the hero or curriculum before any user action; the same interruption appears on the Year 3 listing.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/home-mobile.png",
        "evidence/home-dark.png",
        "evidence/maths-year3-mobile.png"
      ],
      "findingIds": [
        "IXL-004"
      ]
    },
    {
      "principleId": "maximize-content-reduce-noise",
      "checkId": "semantic-dismissible-primitives",
      "status": "issues",
      "confidence": "high",
      "method": "HINT: DOM/source inspection for popover / <dialog> / <details> vs custom overlay divs with manual dismiss handling. The model chooses.",
      "evidence": "The Year 3 DOM probe found no native dialog or popover but did find a DIV role=dialog, while the screenshot shows a modal overlay.",
      "pathIds": [
        "curriculum"
      ],
      "artifacts": [
        "evidence/maths-year3-probe.json",
        "evidence/maths-year3-mobile.png"
      ],
      "findingIds": [
        "IXL-005"
      ]
    },
    {
      "principleId": "maximize-content-reduce-noise",
      "checkId": "reduced-chrome",
      "status": "pass",
      "confidence": "medium",
      "method": "HINT: a screenshot plus layout metrics can show the proportion of the viewport given to chrome vs content. The model chooses.",
      "evidence": "After the interruption, mobile screenshots devote the viewport to curriculum, pricing or diagnostic content with compact navigation.",
      "pathIds": [
        "curriculum",
        "membership",
        "diagnostic"
      ],
      "artifacts": [
        "evidence/membership-mobile.png"
      ]
    },
    {
      "principleId": "adapt-to-the-form-factor",
      "checkId": "responsive-no-horizontal-scroll",
      "status": "pass",
      "confidence": "high",
      "method": "HINT: layout metrics (scrollWidth vs innerWidth) and a screenshot at an emulated narrow mobile viewport reveal overflow. The model chooses.",
      "evidence": "All five 360x800 layout captures report horizontalOverflowPx 0 and a viewport meta tag.",
      "pathIds": [
        "home",
        "curriculum",
        "membership",
        "signin",
        "diagnostic"
      ],
      "artifacts": [
        "evidence/home-mobile-layout.json"
      ]
    },
    {
      "principleId": "adapt-to-the-form-factor",
      "checkId": "component-level-responsiveness",
      "status": "pass",
      "confidence": "medium",
      "method": "HINT: CSS inspection for @container / container-type; a computed-style probe of the same component in a wide vs narrow container shows whether it adapts. The model chooses.",
      "evidence": "The same header, cards and content sections visibly recompose at 360 px across five templates; no reused component was observed failing in a narrow container.",
      "pathIds": [
        "home",
        "membership"
      ],
      "artifacts": [
        "evidence/home-mobile.png"
      ]
    },
    {
      "principleId": "adapt-to-the-form-factor",
      "checkId": "input-modality-aware",
      "status": "pass",
      "confidence": "medium",
      "method": "HINT: a focus probe (focus an element, read the computed outline) or an axe target-size check; a screenshot of a focused control corroborates. The model chooses.",
      "evidence": "Programmatic focus produced a visible dotted outline and mobile screenshots show comfortably sized primary controls.",
      "pathIds": [
        "home",
        "signin"
      ],
      "artifacts": [
        "evidence/home-preferences-focus.json"
      ]
    },
    {
      "principleId": "support-core-task-success",
      "checkId": "clear-purpose-and-primary-action",
      "status": "pass",
      "confidence": "high",
      "method": "HINT: screenshot the first viewport and key scrolled states; inspect heading structure, nav labels, button text, and visual hierarchy; a task walkthrough can show whether the next action is obvious. The model chooses.",
      "evidence": "First viewports clearly name personalised learning, pricing, sign-in and diagnostic purposes with prominent next actions.",
      "pathIds": [
        "home",
        "membership",
        "signin",
        "diagnostic"
      ],
      "artifacts": [
        "evidence/membership-mobile.png"
      ]
    },
    {
      "principleId": "support-core-task-success",
      "checkId": "primary-flow-completion",
      "status": "pass",
      "confidence": "medium",
      "method": "HINT: run the flow manually with screenshots/DOM snapshots at each step; compare expected vs actual path length; inspect form requirements, navigation continuity, and blockers. The model chooses.",
      "evidence": "Pricing exposes direct package subscription links and sign-in accepts submission; the audit stopped before purchase or use of credentials.",
      "pathIds": [
        "membership",
        "signin"
      ],
      "artifacts": [
        "evidence/membership-probe.json"
      ]
    },
    {
      "principleId": "support-core-task-success",
      "checkId": "clear-system-state-and-recovery",
      "status": "pass",
      "confidence": "high",
      "method": "HINT: exercise network delay/failure, invalid input, empty data and success states; screenshot the state messaging and recovery controls; inspect whether browser history and focus remain sensible. The model chooses.",
      "evidence": "Empty sign-in submission announces “Please enter a username and password” and moves focus to username; the 404 explains failure and links home.",
      "pathIds": [
        "signin",
        "not-found"
      ],
      "artifacts": [
        "evidence/signin-invalid-probe.json"
      ]
    },
    {
      "principleId": "be-fast-and-stable",
      "checkId": "good-core-web-vitals",
      "status": "issues",
      "confidence": "high",
      "method": "HINT: Lighthouse reports LCP/CLS/TBT directly and the model may run it; layout metrics + a layout-shift observer + a long-task observer (the evidence primitives) give the same signal first-party. The model chooses.",
      "evidence": "Lighthouse scored performance 0.56 with FCP 4.5 s, LCP 13.3 s and TBT 260 ms; the local trace measured LCP 1.0 s, showing network/device sensitivity.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/lighthouse-home.json",
        "evidence/home-trace-summary.json",
        "evidence/home-trace.json"
      ],
      "findingIds": [
        "IXL-006"
      ]
    },
    {
      "principleId": "be-fast-and-stable",
      "checkId": "visual-stability",
      "status": "issues",
      "confidence": "high",
      "method": "HINT: the layout primitive's CLS observer captures shifts; a transition video of the first seconds shows content jumping. The model chooses.",
      "evidence": "The mobile layout observer recorded CLS 0.2145 at about 1.02 s, above the 0.1 good threshold.",
      "pathIds": [
        "membership"
      ],
      "artifacts": [
        "evidence/membership-mobile-layout.json",
        "evidence/membership-mobile.png"
      ],
      "findingIds": [
        "IXL-007"
      ]
    },
    {
      "principleId": "be-fast-and-stable",
      "checkId": "efficient-main-thread",
      "status": "pass",
      "confidence": "high",
      "method": "HINT: the layout primitive records long tasks; a heap summary shows the object population; Lighthouse reports TBT. The model chooses.",
      "evidence": "Unthrottled trace recorded one 55.55 ms task and only 5.55 ms total blocking time.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/home-trace-summary.json"
      ]
    },
    {
      "principleId": "be-fast-and-stable",
      "checkId": "efficient-resource-delivery",
      "status": "issues",
      "confidence": "high",
      "method": "HINT: a HAR summary can reveal cache headers, redirects, render-blocking candidates, weight offenders and dependency shape; a trace/Lighthouse insight report can corroborate LCP discovery, render-blocking, font-display and document latency. The model chooses.",
      "evidence": "HAR and Lighthouse show a large dependency tree and slow throttled LCP despite useful successful delivery.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/home-summary.json"
      ],
      "findingIds": [
        "IXL-006",
        "IXL-008"
      ]
    },
    {
      "principleId": "be-fast-and-stable",
      "checkId": "trim-unused-and-duplicate-code",
      "status": "issues",
      "confidence": "high",
      "method": "HINT: Lighthouse/trace/code-coverage style evidence can flag unused JS/CSS, duplicated JavaScript and legacy code; a HAR summary shows third-party byte cost and request count. The model chooses.",
      "evidence": "The HAR recorded 110 requests and 2.12 MB transferred, including 65 scripts (1.41 MB), 14 stylesheets and five fonts; Lighthouse also reported forced reflow and dependency-tree issues.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/home-summary.json",
        "evidence/home.har",
        "evidence/lighthouse-home.json"
      ],
      "findingIds": [
        "IXL-008"
      ]
    },
    {
      "principleId": "be-inclusive",
      "checkId": "names-roles-labels",
      "status": "issues",
      "confidence": "high",
      "method": "HINT: axe-core (injectable via the evaluate primitive) or Lighthouse's a11y audits enumerate these; a DOM probe of the accessibility-relevant attributes is a first-party alternative. The model chooses.",
      "evidence": "Lighthouse failed button-name and label-content-name-mismatch; the visible-controls probe also found an unnamed cookie-dismiss button.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/lighthouse-home.json",
        "evidence/home-css-controls-probe.json"
      ],
      "findingIds": [
        "IXL-009"
      ]
    },
    {
      "principleId": "be-inclusive",
      "checkId": "sufficient-contrast",
      "status": "issues",
      "confidence": "high",
      "method": "HINT: axe contrast rules, a Lighthouse contrast audit, or an in-page probe computing contrast ratios from computed colours. The model chooses.",
      "evidence": "Lighthouse failed its color-contrast audit on the homepage; forced-colours remained readable, so the defect is in authored colours rather than complete high-contrast failure.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/lighthouse-home.json",
        "evidence/home-forced-colors.png"
      ],
      "findingIds": [
        "IXL-010"
      ]
    },
    {
      "principleId": "be-inclusive",
      "checkId": "structure-and-focus",
      "status": "issues",
      "confidence": "high",
      "method": "HINT: axe/Lighthouse structural audits; a focus-walk probe (tab through, read activeElement + computed outline) is a first-party alternative. The model chooses.",
      "evidence": "Lighthouse failed heading-order; the DOM probe lists several H2 navigation headings before “IXL is personalised learning”.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/lighthouse-home.json",
        "evidence/home-probe.json"
      ],
      "findingIds": [
        "IXL-011"
      ]
    },
    {
      "principleId": "be-inclusive",
      "checkId": "legible-text",
      "status": "pass",
      "confidence": "high",
      "method": "HINT: a screenshot of body and heading text, plus CSS inspection for text-wrap / text alignment / font fallback handling. The model chooses.",
      "evidence": "Desktop/mobile screenshots show readable line lengths, unclipped text and stable wrapping on all representative templates.",
      "pathIds": [
        "home",
        "membership",
        "signin",
        "diagnostic"
      ],
      "artifacts": [
        "evidence/signin-mobile.png"
      ]
    },
    {
      "principleId": "be-inclusive",
      "checkId": "zoom-reflow-targets-and-media",
      "status": "pass",
      "confidence": "medium",
      "method": "HINT: Lighthouse/axe target-size, meta-viewport and media-caption audits are useful signals; screenshots at narrow and zoomed conditions plus DOM/media inspection can corroborate. The model chooses.",
      "evidence": "All tested templates reflow at 360 px without overflow; viewport scaling is not disabled and primary targets are adequately sized.",
      "pathIds": [
        "home",
        "curriculum",
        "membership",
        "signin",
        "diagnostic"
      ],
      "artifacts": [
        "evidence/home-mobile-layout.json"
      ]
    },
    {
      "principleId": "follow-best-practices",
      "checkId": "no-console-errors",
      "status": "pass",
      "confidence": "high",
      "method": "HINT: capture Runtime/Log CDP events, or a probe that reads collected errors; Lighthouse reports this too. The model chooses.",
      "evidence": "Runtime probe observed no errors or unhandled rejections during a three-second post-load window.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/home-runtime-errors.json"
      ]
    },
    {
      "principleId": "follow-best-practices",
      "checkId": "sound-document-and-assets",
      "status": "issues",
      "confidence": "high",
      "method": "HINT: a DOM/source probe for doctype/charset/img dimensions; CSS inspection for repetition; Lighthouse best-practices audits cover the rest. The model chooses.",
      "evidence": "The image audit reported all 82 images without width/height attributes, eight below-fold images not lazy-loaded, and Lighthouse failed image-aspect-ratio.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/home-images.json",
        "evidence/lighthouse-home.json"
      ],
      "findingIds": [
        "IXL-012"
      ]
    },
    {
      "principleId": "follow-best-practices",
      "checkId": "browser-platform-hygiene",
      "status": "pass",
      "confidence": "medium",
      "method": "HINT: Lighthouse best-practices audits and DevTools inspector/deprecation signals can surface these; DOM/source probes can verify paste handlers and prompt timing. The model chooses.",
      "evidence": "Lighthouse best-practices score was 0.96; no notification/geolocation prompt or runtime exception appeared on load.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/lighthouse-home.json"
      ]
    },
    {
      "principleId": "be-discoverable",
      "checkId": "title-and-description",
      "status": "pass",
      "confidence": "high",
      "method": "HINT: a DOM probe reads <title> and meta[name=description]; Lighthouse SEO audits cover the same ground. The model chooses.",
      "evidence": "All five representative pages have specific titles and non-empty meta descriptions.",
      "pathIds": [
        "home",
        "curriculum",
        "membership",
        "signin",
        "diagnostic"
      ],
      "artifacts": [
        "evidence/home-probe.json"
      ]
    },
    {
      "principleId": "be-discoverable",
      "checkId": "crawlable-and-mobile-friendly",
      "status": "issues",
      "confidence": "high",
      "method": "HINT: a DOM probe for anchor hrefs, viewport meta, and robots; Lighthouse SEO audits corroborate. The model chooses.",
      "evidence": "Discoverability measured only 18% rendered-word coverage in raw HTML and no raw H1; the crawler screenshot omits most plan and sales content.",
      "pathIds": [
        "membership"
      ],
      "artifacts": [
        "evidence/membership-discoverability.json",
        "evidence/membership-discoverability-rendered.png",
        "evidence/membership-discoverability-crawler.png"
      ],
      "findingIds": [
        "IXL-013"
      ]
    },
    {
      "principleId": "be-discoverable",
      "checkId": "canonical-and-indexing-signals",
      "status": "issues",
      "confidence": "high",
      "method": "HINT: inspect response status and headers, <link rel=canonical>, hreflang links, robots meta, robots.txt and sitemap.xml; Lighthouse SEO audits cover several of these. The model chooses.",
      "evidence": "DOM probes found no canonical URL and no hreflang links on the UK homepage, curriculum, pricing, sign-in, or diagnostic pages; robots.txt and sitemap.xml were present.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/home-probe.json",
        "evidence/membership-probe.json",
        "evidence/robots.txt",
        "evidence/sitemap.xml"
      ],
      "findingIds": [
        "IXL-014"
      ]
    },
    {
      "principleId": "be-discoverable",
      "checkId": "structured-and-shareable-metadata",
      "status": "issues",
      "confidence": "high",
      "method": "HINT: inspect JSON-LD/microdata and social preview tags against visible content; Lighthouse has a manual structured-data audit, and ad-hoc probes can parse schema.org blocks. The model chooses.",
      "evidence": "The homepage probe found Open Graph tags but zero JSON-LD blocks; the pricing page alone contained one JSON-LD block.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/home-probe.json",
        "evidence/membership-probe.json"
      ],
      "findingIds": [
        "IXL-015"
      ]
    },
    {
      "principleId": "be-private-and-secure",
      "checkId": "secure-transport-and-headers",
      "status": "issues",
      "confidence": "high",
      "method": "HINT: inspect response headers / page protocol via an evaluate probe or the network layer; Lighthouse best-practices flags HTTPS and CSP issues. The model chooses.",
      "evidence": "Two Google Analytics cookies were set without Secure, all 12 cookies used SameSite=None, and CSP permits unsafe-inline and unsafe-eval. HTTPS, HSTS and nosniff were present.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/home-cookies.json",
        "evidence/home-headers.json"
      ],
      "findingIds": [
        "IXL-016"
      ]
    },
    {
      "principleId": "be-private-and-secure",
      "checkId": "data-minimisation-and-third-parties",
      "status": "issues",
      "confidence": "high",
      "method": "HINT: inspect network requests and third-party origins; a probe of analytics/beacon calls. The model chooses.",
      "evidence": "Tracker evidence found six third-party origins and Google Analytics, Google Tag Manager, and region1 Google Analytics before user interaction.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/home-trackers.json",
        "evidence/home-summary.json"
      ],
      "findingIds": [
        "IXL-017"
      ]
    },
    {
      "principleId": "be-private-and-secure",
      "checkId": "in-context-permissions-and-modern-auth",
      "status": "issues",
      "confidence": "high",
      "method": "HINT: a probe for permission requests fired on load; source inspection for passkey / WebAuthn / navigator.credentials usage in auth flows. The model chooses.",
      "evidence": "The sign-in DOM contains username and password fields with no WebAuthn/passkey affordance; no permission prompt fired on load.",
      "pathIds": [
        "signin"
      ],
      "artifacts": [
        "evidence/signin-probe.json",
        "evidence/signin-mobile.png"
      ],
      "findingIds": [
        "IXL-018"
      ]
    },
    {
      "principleId": "be-private-and-secure",
      "checkId": "defensive-browser-policies",
      "status": "issues",
      "confidence": "high",
      "method": "HINT: inspect response headers and browser security state; Lighthouse/DevTools security audits can corroborate HSTS, clickjacking, Trusted Types, origin isolation and third-party cookie findings. The model chooses.",
      "evidence": "HSTS, nosniff and frame protection are present, but Referrer-Policy and Permissions-Policy are absent and CSP allows unsafe-inline/eval.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/home-headers.json"
      ],
      "findingIds": [
        "IXL-016"
      ]
    },
    {
      "principleId": "be-resilient",
      "checkId": "progressive-enhancement",
      "status": "issues",
      "confidence": "high",
      "method": "HINT: load with scripting disabled or compare a no-JS fetch of the HTML against the rendered page; check for Baseline-aware fallbacks in source. The model chooses.",
      "evidence": "Raw HTML preserved only 18% of rendered pricing-page words and omitted the H1, while homepage and curriculum raw coverage were 85%.",
      "pathIds": [
        "membership"
      ],
      "artifacts": [
        "evidence/membership-discoverability.json",
        "evidence/membership-discoverability-crawler.png"
      ],
      "findingIds": [
        "IXL-019"
      ]
    },
    {
      "principleId": "be-resilient",
      "checkId": "resilient-runtime-behaviour",
      "status": "pass",
      "confidence": "medium",
      "method": "HINT: exercise menus near viewport edges with a screenshot; a probe of async/visibility behaviour. The model chooses.",
      "evidence": "Responsive menu/dialog surfaces remained within the viewport and no runtime errors were observed across representative loads.",
      "pathIds": [
        "home",
        "curriculum",
        "diagnostic"
      ],
      "artifacts": [
        "evidence/home-mobile.png"
      ]
    },
    {
      "principleId": "be-resilient",
      "checkId": "offline-and-installable",
      "status": "issues",
      "confidence": "high",
      "method": "HINT: a probe for a service worker registration and a web app manifest; test behaviour offline. The model chooses.",
      "evidence": "The resilience probe found no manifest, no service-worker registrations and no Cache Storage entries.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/home-resilience-probe.json"
      ],
      "findingIds": [
        "IXL-020"
      ]
    },
    {
      "principleId": "be-resilient",
      "checkId": "network-and-http-failure-states",
      "status": "pass",
      "confidence": "high",
      "method": "HINT: simulate failed fetches/offline mode or inspect representative 404/500 routes; screenshots and DOM snapshots of error/loading/empty states show whether recovery is possible. The model chooses.",
      "evidence": "A deliberately invalid route renders a clear “Sorry, page not found” recovery page with a home link.",
      "pathIds": [
        "not-found"
      ],
      "artifacts": [
        "evidence/not-found-probe.json"
      ]
    },
    {
      "principleId": "be-internationalised",
      "checkId": "lang-dir-and-logical-properties",
      "status": "pass",
      "confidence": "high",
      "method": "HINT: a DOM probe for <html lang>/dir and CSS inspection for logical vs physical properties. The model chooses.",
      "evidence": "The redirected UK edition declares lang=en-GB; CSS includes logical properties and the international edition chooser is present.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/home-probe.json"
      ]
    },
    {
      "principleId": "be-internationalised",
      "checkId": "locale-aware-data",
      "status": "pass",
      "confidence": "medium",
      "method": "HINT: source inspection for Intl.* usage vs hand-rolled formatting; a probe of rendered dates/numbers under a different locale. The model chooses.",
      "evidence": "The UK pricing page uses pounds and UK-localized copy consistently; no conflicting hand-formatted locale data was observed.",
      "pathIds": [
        "membership"
      ],
      "artifacts": [
        "evidence/membership-mobile.png"
      ]
    },
    {
      "principleId": "be-internationalised",
      "checkId": "time-zone-correctness",
      "status": "not-applicable",
      "confidence": "high",
      "method": "Applicability judgement from representative-page recon.",
      "evidence": "No dates, events, schedules or time-zone-sensitive data appear on the representative public pages.",
      "reason": "No dates, events, schedules or time-zone-sensitive data appear on the representative public pages."
    },
    {
      "principleId": "be-trustworthy",
      "checkId": "no-dark-patterns",
      "status": "pass",
      "confidence": "medium",
      "method": "HINT: a screenshot of consent/upsell/cancel flows; source inspection for declarative button actions vs misleading controls. The model chooses.",
      "evidence": "Pricing and package choices are visible, and the promotional modal offers neutral “Keep exploring” dismissal without confirmshaming.",
      "pathIds": [
        "home",
        "membership"
      ],
      "artifacts": [
        "evidence/home-mobile.png"
      ]
    },
    {
      "principleId": "be-trustworthy",
      "checkId": "humane-error-handling",
      "status": "pass",
      "confidence": "high",
      "method": "HINT: exercise a form, submit invalid input, and observe timing and clarity of errors via a screenshot or a :user-invalid / aria-invalid probe. The model chooses.",
      "evidence": "Empty sign-in submission yields a concise alert and focuses the first field rather than blaming the user.",
      "pathIds": [
        "signin"
      ],
      "artifacts": [
        "evidence/signin-invalid-probe.json"
      ]
    },
    {
      "principleId": "be-trustworthy",
      "checkId": "trustworthy-input-assistance",
      "status": "issues",
      "confidence": "high",
      "method": "HINT: source/DOM inspection for autocomplete attributes on form fields; a probe of autofill affordances. The model chooses.",
      "evidence": "Both username and password inputs have autocomplete=off rather than username and current-password.",
      "pathIds": [
        "signin"
      ],
      "artifacts": [
        "evidence/signin-probe.json"
      ],
      "findingIds": [
        "IXL-021"
      ]
    },
    {
      "principleId": "be-trustworthy",
      "checkId": "safe-commercial-and-account-flows",
      "status": "pass",
      "confidence": "medium",
      "method": "HINT: walkthrough checkout/subscription/auth/account flows when present; screenshot pricing, confirmation, cancellation and reauthentication states; inspect passkey/autocomplete support for sign-in and payment. The model chooses.",
      "evidence": "Pricing clearly states the £7.99/month starting price and links each package directly to its subscription route; no disguised commitment was observed before checkout.",
      "pathIds": [
        "membership"
      ],
      "artifacts": [
        "evidence/membership-mobile.png"
      ]
    },
    {
      "principleId": "be-sustainable",
      "checkId": "optimised-assets",
      "status": "issues",
      "confidence": "high",
      "method": "HINT: inspect transferred image bytes vs displayed size; source inspection for modern formats and resolution handling. The model chooses.",
      "evidence": "The image audit found eight images without srcset, eight below-fold images not lazy-loaded, five legacy-format assets, and 82 without intrinsic dimensions.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/home-images.json"
      ],
      "findingIds": [
        "IXL-022"
      ]
    },
    {
      "principleId": "be-sustainable",
      "checkId": "no-wasteful-work",
      "status": "issues",
      "confidence": "high",
      "method": "HINT: a long-task / network probe for background fetches and processing while idle or backgrounded. The model chooses.",
      "evidence": "The 110-request, 2.12 MB load includes 65 scripts and active analytics before interaction.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/home-summary.json"
      ],
      "findingIds": [
        "IXL-008",
        "IXL-017"
      ]
    },
    {
      "principleId": "be-sustainable",
      "checkId": "third-party-and-media-budget",
      "status": "issues",
      "confidence": "high",
      "method": "HINT: a HAR summary shows third-party bytes, font/media weight and caching; screenshots/video reveal autoplay and decorative media; trace/layout evidence shows whether media/animation keeps work running. The model chooses.",
      "evidence": "Six third-party origins and three known trackers load on the anonymous homepage.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/home-trackers.json"
      ],
      "findingIds": [
        "IXL-017"
      ]
    },
    {
      "principleId": "be-agent-ready",
      "checkId": "structured-agent-capabilities",
      "status": "not-applicable",
      "confidence": "high",
      "method": "Applicability judgement from representative-page recon.",
      "evidence": "Agent-facing capabilities are emerging and no declared intent to expose WebMCP tools was found; absence is treated as an opportunity, not a failure.",
      "reason": "Agent-facing capabilities are emerging and no declared intent to expose WebMCP tools was found; absence is treated as an opportunity, not a failure."
    },
    {
      "principleId": "be-agent-ready",
      "checkId": "on-device-inference",
      "status": "not-applicable",
      "confidence": "high",
      "method": "Applicability judgement from representative-page recon.",
      "evidence": "No public summarisation or language-model task was identified where on-device inference is required; this emerging check is not applicable.",
      "reason": "No public summarisation or language-model task was identified where on-device inference is required; this emerging check is not applicable."
    },
    {
      "principleId": "be-memory-efficient",
      "checkId": "no-leak-under-repeated-interaction",
      "status": "pass",
      "confidence": "medium",
      "method": "HINT (not mandatory): compare heap snapshots for retained growth - a baseline, then one taken after repeating the interaction with `--interact` about 10x (the memory-tracer methodology: baseline -> repeat -> post -> compare). Performance.getMetrics (JSHeapUsedSize, Nodes) across the same before/after window is corroboration. If Chrome DevTools MCP is available, follow its memory-leak-debugging skill: capture baseline, target, and final snapshots, then use memlab or the provided comparison workflow rather than reading raw .heapsnapshot files directly. The package-native `heap` primitive remains the default path. This check is only meaningful where the page has a real interaction to repeat; for a static page with none, mark it not-applicable with a rationale rather than fabricating one. The model chooses.",
      "evidence": "After ten attempted menu open/close cycles, heap self-size rose 2.1% (25.64 MB to 26.19 MB), not evidence of unbounded retained growth.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/home-heap-post.heapsnapshot"
      ]
    },
    {
      "principleId": "be-memory-efficient",
      "checkId": "bounded-footprint",
      "status": "pass",
      "confidence": "medium",
      "method": "HINT: a single `heap` summary's totals (nodeCount, totalSelfSizeBytes, constructor population) plus Performance.getMetrics (Nodes, JSHeapUsedSize) give the current footprint to judge against the page's purpose. Chrome DevTools MCP heap snapshots and memlab snapshot analysis can provide the same memory distribution when available. Read summaries or derived analysis, never raw snapshots unless a dedicated heap-analysis tool is doing the analysis. The model chooses.",
      "evidence": "Baseline heap summary reports 25.64 MB self size for a visually rich, script-heavy page; proportionate though not minimal.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/home-heap-baseline.heapsnapshot"
      ]
    },
    {
      "principleId": "be-memory-efficient",
      "checkId": "no-detached-dom-or-unbounded-listeners",
      "status": "pass",
      "confidence": "low",
      "method": "HINT: the `heap` summary by constructor (Detached* nodes) compared across a before/after pair shows a growing detached-DOM population; an `evaluate` probe can sample listener/timer counts (e.g. getEventListeners-style counting, or instrumenting addEventListener/setInterval) before and after the repeated interaction to spot growth. Chrome DevTools MCP heap snapshots plus the memory-leak-debugging skill's common-leak guidance can corroborate detached DOM, listeners, closures, globals, and unbounded caches. Caveat from the memory-tracer and Chrome DevTools MCP guidance: detached nodes can be intentional caches, so judge confidence rather than asserting a bug. The model chooses.",
      "evidence": "Before/after summaries show closures nearly flat (25,804 to 25,848) and no Detached constructor among top retained constructors; no accumulating listener signal was observed.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/home-heap-post.heapsnapshot"
      ]
    }
  ],
  "principleOutcomes": [
    {
      "principleId": "respect-user-preferences",
      "expectation": "default",
      "status": "issues",
      "findingIds": [
        "IXL-001",
        "IXL-002"
      ]
    },
    {
      "principleId": "implement-natural-interactions",
      "expectation": "default",
      "status": "issues",
      "findingIds": [
        "IXL-003"
      ]
    },
    {
      "principleId": "provide-guided-navigation",
      "expectation": "default",
      "status": "pass"
    },
    {
      "principleId": "maximize-content-reduce-noise",
      "expectation": "default",
      "status": "issues",
      "findingIds": [
        "IXL-004",
        "IXL-005"
      ]
    },
    {
      "principleId": "adapt-to-the-form-factor",
      "expectation": "default",
      "status": "pass"
    },
    {
      "principleId": "support-core-task-success",
      "expectation": "default",
      "status": "pass"
    },
    {
      "principleId": "be-fast-and-stable",
      "expectation": "default",
      "status": "issues",
      "findingIds": [
        "IXL-006",
        "IXL-007",
        "IXL-008"
      ]
    },
    {
      "principleId": "be-inclusive",
      "expectation": "default",
      "status": "issues",
      "findingIds": [
        "IXL-009",
        "IXL-010",
        "IXL-011"
      ]
    },
    {
      "principleId": "follow-best-practices",
      "expectation": "default",
      "status": "issues",
      "findingIds": [
        "IXL-012"
      ]
    },
    {
      "principleId": "be-discoverable",
      "expectation": "default",
      "status": "issues",
      "findingIds": [
        "IXL-013",
        "IXL-014",
        "IXL-015"
      ]
    },
    {
      "principleId": "be-private-and-secure",
      "expectation": "default",
      "status": "issues",
      "findingIds": [
        "IXL-016",
        "IXL-017",
        "IXL-018"
      ]
    },
    {
      "principleId": "be-resilient",
      "expectation": "contextual",
      "status": "issues",
      "findingIds": [
        "IXL-019",
        "IXL-020"
      ]
    },
    {
      "principleId": "be-internationalised",
      "expectation": "contextual",
      "status": "pass"
    },
    {
      "principleId": "be-trustworthy",
      "expectation": "default",
      "status": "issues",
      "findingIds": [
        "IXL-021"
      ]
    },
    {
      "principleId": "be-sustainable",
      "expectation": "contextual",
      "status": "issues",
      "findingIds": [
        "IXL-022",
        "IXL-008",
        "IXL-017"
      ]
    },
    {
      "principleId": "be-agent-ready",
      "expectation": "contextual",
      "status": "not-applicable",
      "reason": "Agent-facing capabilities are emerging and no declared intent to expose WebMCP tools was found; absence is treated as an opportunity, not a failure. No public summarisation or language-model task was identified where on-device inference is required; this emerging check is not applicable."
    },
    {
      "principleId": "be-memory-efficient",
      "expectation": "default",
      "status": "pass"
    }
  ],
  "paths": [
    {
      "id": "home",
      "description": "Geolocated UK homepage: entry proposition, navigation, first-visit interruption, preferences, performance, security and network.",
      "url": "https://uk.ixl.com/",
      "conditions": [
        "desktop",
        "viewport: 360x800",
        "prefers-color-scheme: dark",
        "prefers-reduced-motion: reduce",
        "forced-colors: active",
        "keyboard focus"
      ],
      "result": "issues"
    },
    {
      "id": "curriculum",
      "description": "Year 3 maths listing representing long curriculum indexes and selection navigation.",
      "url": "https://uk.ixl.com/maths/year-3",
      "conditions": [
        "desktop",
        "viewport: 360x800",
        "crawler without JavaScript"
      ],
      "result": "issues"
    },
    {
      "id": "membership",
      "description": "Family pricing representing commercial content, plan selection and public conversion flow.",
      "url": "https://uk.ixl.com/membership/family/pricing",
      "conditions": [
        "desktop",
        "viewport: 360x800",
        "crawler without JavaScript"
      ],
      "result": "issues"
    },
    {
      "id": "signin",
      "description": "Sign-in form representing account access, input assistance and invalid submission recovery.",
      "url": "https://uk.ixl.com/signin",
      "conditions": [
        "desktop",
        "viewport: 360x800",
        "empty submission",
        "crawler without JavaScript"
      ],
      "result": "issues"
    },
    {
      "id": "diagnostic",
      "description": "Diagnostic product detail representing rich promotional content and slider/media UI.",
      "url": "https://uk.ixl.com/diagnostic",
      "conditions": [
        "desktop",
        "viewport: 360x800"
      ],
      "result": "issues"
    },
    {
      "id": "not-found",
      "description": "Invalid route representing HTTP/navigation failure recovery.",
      "url": "https://uk.ixl.com/this-route-does-not-exist-web-uplift",
      "conditions": [
        "viewport: 360x800"
      ],
      "result": "pass"
    }
  ],
  "findings": [
    {
      "id": "IXL-001",
      "severity": "medium",
      "confidence": "high",
      "pathId": "home",
      "url": "https://uk.ixl.com/",
      "principleId": "respect-user-preferences",
      "principleCheckId": "respects-color-scheme",
      "guidanceId": "dark-mode",
      "guidanceCategory": "user-experience",
      "summary": "The public experience stays light when the user requests dark mode.",
      "evidence": "The dark-mode screenshot remains a bright green/white page, and the computed probe reports color-scheme: normal with no prefers-color-scheme rule.",
      "artifacts": [
        "evidence/home-dark.png",
        "evidence/home-preferences-focus.json"
      ],
      "suggestedFix": "Declare color-scheme: light dark and retint surfaces, text, controls, and imagery using prefers-color-scheme or light-dark().",
      "effort": "medium"
    },
    {
      "id": "IXL-002",
      "severity": "medium",
      "confidence": "high",
      "pathId": "home",
      "url": "https://uk.ixl.com/",
      "principleId": "respect-user-preferences",
      "principleCheckId": "respects-reduced-motion",
      "guidanceId": "accessibility",
      "guidanceCategory": "accessibility",
      "summary": "Scroll-linked motion has no reduced-motion override.",
      "evidence": "CSS inspection found scroll-timeline rules but no prefers-reduced-motion rule; the reduced-motion probe confirmed the emulated preference was active.",
      "artifacts": [
        "evidence/home-motion.json",
        "evidence/home-css-controls-probe.json"
      ],
      "suggestedFix": "Under prefers-reduced-motion: reduce, remove non-essential scroll timelines and transitions or replace them with instant state changes.",
      "effort": "small"
    },
    {
      "id": "IXL-003",
      "severity": "low",
      "confidence": "medium",
      "pathId": "home",
      "url": "https://uk.ixl.com/",
      "principleId": "implement-natural-interactions",
      "principleCheckId": "view-transitions",
      "guidanceId": "same-document-transitions",
      "guidanceCategory": "user-experience",
      "summary": "State and page changes do not use View Transitions.",
      "evidence": "The cross-template DOM/CSS probe found no view-transition-name or View Transition declarations on any representative page.",
      "artifacts": [
        "evidence/home-probe.json",
        "evidence/membership-probe.json"
      ],
      "suggestedFix": "Use same-document transitions for modal/state swaps and opt eligible navigations into cross-document View Transitions, with reduced-motion handling.",
      "effort": "medium"
    },
    {
      "id": "IXL-004",
      "severity": "high",
      "confidence": "high",
      "pathId": "home",
      "url": "https://uk.ixl.com/",
      "principleId": "maximize-content-reduce-noise",
      "principleCheckId": "no-intrusive-interruptions",
      "guidanceId": "light-dismiss-a-dialog",
      "guidanceCategory": "user-experience",
      "summary": "A first-visit signup modal obscures the primary content immediately on load.",
      "evidence": "Desktop and mobile screenshots show “First time here?” covering the hero or curriculum before any user action; the same interruption appears on the Year 3 listing.",
      "artifacts": [
        "evidence/home-mobile.png",
        "evidence/home-dark.png",
        "evidence/maths-year3-mobile.png"
      ],
      "suggestedFix": "Delay the promotion until intent is shown, use a non-modal inline placement where possible, and preserve a clear light-dismiss path.",
      "effort": "small"
    },
    {
      "id": "IXL-005",
      "severity": "medium",
      "confidence": "high",
      "pathId": "curriculum",
      "url": "https://uk.ixl.com/maths/year-3",
      "principleId": "maximize-content-reduce-noise",
      "principleCheckId": "semantic-dismissible-primitives",
      "guidanceId": "light-dismiss-a-dialog",
      "guidanceCategory": "user-experience",
      "summary": "The repeated promotional modal is implemented as a custom role=dialog on curriculum pages.",
      "evidence": "The Year 3 DOM probe found no native dialog or popover but did find a DIV role=dialog, while the screenshot shows a modal overlay.",
      "artifacts": [
        "evidence/maths-year3-probe.json",
        "evidence/maths-year3-mobile.png"
      ],
      "suggestedFix": "Use <dialog> with showModal(), native focus handling, Escape support, and a clearly named close button.",
      "effort": "small"
    },
    {
      "id": "IXL-006",
      "severity": "high",
      "confidence": "high",
      "pathId": "home",
      "url": "https://uk.ixl.com/",
      "principleId": "be-fast-and-stable",
      "principleCheckId": "good-core-web-vitals",
      "guidanceId": "performance",
      "guidanceCategory": "performance",
      "summary": "The throttled load is slow despite a fast unthrottled local trace.",
      "evidence": "Lighthouse scored performance 0.56 with FCP 4.5 s, LCP 13.3 s and TBT 260 ms; the local trace measured LCP 1.0 s, showing network/device sensitivity.",
      "artifacts": [
        "evidence/lighthouse-home.json",
        "evidence/home-trace-summary.json",
        "evidence/home-trace.json"
      ],
      "suggestedFix": "Profile the Lighthouse LCP element and dependency chain, prioritise its request, defer non-critical scripts/styles, and retest under mobile throttling.",
      "effort": "large"
    },
    {
      "id": "IXL-007",
      "severity": "high",
      "confidence": "high",
      "pathId": "membership",
      "url": "https://uk.ixl.com/membership/family/pricing",
      "principleId": "be-fast-and-stable",
      "principleCheckId": "visual-stability",
      "guidanceId": "visually-stable-font-fallbacks",
      "guidanceCategory": "performance",
      "summary": "The family pricing page has a large mobile layout shift.",
      "evidence": "The mobile layout observer recorded CLS 0.2145 at about 1.02 s, above the 0.1 good threshold.",
      "artifacts": [
        "evidence/membership-mobile-layout.json",
        "evidence/membership-mobile.png"
      ],
      "suggestedFix": "Identify the shifting hero/card, reserve its final geometry, add intrinsic image dimensions, and use metric-compatible font fallbacks.",
      "effort": "medium"
    },
    {
      "id": "IXL-008",
      "severity": "medium",
      "confidence": "high",
      "pathId": "home",
      "url": "https://uk.ixl.com/",
      "principleId": "be-fast-and-stable",
      "principleCheckId": "trim-unused-and-duplicate-code",
      "guidanceId": "performance",
      "guidanceCategory": "performance",
      "summary": "The homepage ships a large, script-heavy request set.",
      "evidence": "The HAR recorded 110 requests and 2.12 MB transferred, including 65 scripts (1.41 MB), 14 stylesheets and five fonts; Lighthouse also reported forced reflow and dependency-tree issues.",
      "artifacts": [
        "evidence/home-summary.json",
        "evidence/home.har",
        "evidence/lighthouse-home.json"
      ],
      "suggestedFix": "Use coverage and bundle analysis to remove unused/duplicate code, conditionally load route features, and delay third-party scripts until needed.",
      "effort": "large"
    },
    {
      "id": "IXL-009",
      "severity": "high",
      "confidence": "high",
      "pathId": "home",
      "url": "https://uk.ixl.com/",
      "principleId": "be-inclusive",
      "principleCheckId": "names-roles-labels",
      "guidanceId": "accessibility",
      "guidanceCategory": "accessibility",
      "summary": "Some interactive controls lack usable accessible names.",
      "evidence": "Lighthouse failed button-name and label-content-name-mismatch; the visible-controls probe also found an unnamed cookie-dismiss button.",
      "artifacts": [
        "evidence/lighthouse-home.json",
        "evidence/home-css-controls-probe.json"
      ],
      "suggestedFix": "Give every icon-only button an accessible name matching its visible purpose and align visible labels with computed accessible names.",
      "effort": "small"
    },
    {
      "id": "IXL-010",
      "severity": "medium",
      "confidence": "high",
      "pathId": "home",
      "url": "https://uk.ixl.com/",
      "principleId": "be-inclusive",
      "principleCheckId": "sufficient-contrast",
      "guidanceId": "accessibility",
      "guidanceCategory": "accessibility",
      "summary": "Some text and controls fail minimum colour contrast.",
      "evidence": "Lighthouse failed its color-contrast audit on the homepage; forced-colours remained readable, so the defect is in authored colours rather than complete high-contrast failure.",
      "artifacts": [
        "evidence/lighthouse-home.json",
        "evidence/home-forced-colors.png"
      ],
      "suggestedFix": "Adjust failing foreground/background token pairs to meet WCAG AA in normal display while retaining forced-colour compatibility.",
      "effort": "small"
    },
    {
      "id": "IXL-011",
      "severity": "medium",
      "confidence": "high",
      "pathId": "home",
      "url": "https://uk.ixl.com/",
      "principleId": "be-inclusive",
      "principleCheckId": "structure-and-focus",
      "guidanceId": "accessibility",
      "guidanceCategory": "accessibility",
      "summary": "Heading structure is not sequential and includes navigation headings before the page H1.",
      "evidence": "Lighthouse failed heading-order; the DOM probe lists several H2 navigation headings before “IXL is personalised learning”.",
      "artifacts": [
        "evidence/lighthouse-home.json",
        "evidence/home-probe.json"
      ],
      "suggestedFix": "Keep navigation labels out of the document heading hierarchy and use one page H1 followed by sequential section headings.",
      "effort": "small"
    },
    {
      "id": "IXL-012",
      "severity": "medium",
      "confidence": "high",
      "pathId": "home",
      "url": "https://uk.ixl.com/",
      "principleId": "follow-best-practices",
      "principleCheckId": "sound-document-and-assets",
      "guidanceId": "optimize-image-priority",
      "guidanceCategory": "performance",
      "summary": "Image markup lacks intrinsic dimensions and includes aspect-ratio defects.",
      "evidence": "The image audit reported all 82 images without width/height attributes, eight below-fold images not lazy-loaded, and Lighthouse failed image-aspect-ratio.",
      "artifacts": [
        "evidence/home-images.json",
        "evidence/lighthouse-home.json"
      ],
      "suggestedFix": "Add correct width/height or aspect-ratio, correct distorted image sizing, and lazy-load non-critical below-fold images.",
      "effort": "medium"
    },
    {
      "id": "IXL-013",
      "severity": "high",
      "confidence": "high",
      "pathId": "membership",
      "url": "https://uk.ixl.com/membership/family/pricing",
      "principleId": "be-discoverable",
      "principleCheckId": "crawlable-and-mobile-friendly",
      "summary": "Most public pricing-page content is absent for non-JavaScript crawlers.",
      "evidence": "Discoverability measured only 18% rendered-word coverage in raw HTML and no raw H1; the crawler screenshot omits most plan and sales content.",
      "artifacts": [
        "evidence/membership-discoverability.json",
        "evidence/membership-discoverability-rendered.png",
        "evidence/membership-discoverability-crawler.png"
      ],
      "suggestedFix": "Server-render the visible pricing, package details, headings, and primary subscription links so crawlers receive the core page without JavaScript.",
      "effort": "large"
    },
    {
      "id": "IXL-014",
      "severity": "medium",
      "confidence": "high",
      "pathId": "home",
      "url": "https://uk.ixl.com/",
      "principleId": "be-discoverable",
      "principleCheckId": "canonical-and-indexing-signals",
      "summary": "Representative pages omit canonical and hreflang signals despite many localized editions.",
      "evidence": "DOM probes found no canonical URL and no hreflang links on the UK homepage, curriculum, pricing, sign-in, or diagnostic pages; robots.txt and sitemap.xml were present.",
      "artifacts": [
        "evidence/home-probe.json",
        "evidence/membership-probe.json",
        "evidence/robots.txt",
        "evidence/sitemap.xml"
      ],
      "suggestedFix": "Add self-referencing canonicals and reciprocal hreflang clusters for equivalent localized pages, including x-default where appropriate.",
      "effort": "medium"
    },
    {
      "id": "IXL-015",
      "severity": "low",
      "confidence": "high",
      "pathId": "home",
      "url": "https://uk.ixl.com/",
      "principleId": "be-discoverable",
      "principleCheckId": "structured-and-shareable-metadata",
      "summary": "The organization homepage has social tags but no structured entity data.",
      "evidence": "The homepage probe found Open Graph tags but zero JSON-LD blocks; the pricing page alone contained one JSON-LD block.",
      "artifacts": [
        "evidence/home-probe.json",
        "evidence/membership-probe.json"
      ],
      "suggestedFix": "Add accurate Organization/WebSite JSON-LD and validate that it matches the visible brand and localized URL.",
      "effort": "small"
    },
    {
      "id": "IXL-016",
      "severity": "high",
      "confidence": "high",
      "pathId": "home",
      "url": "https://uk.ixl.com/",
      "principleId": "be-private-and-secure",
      "principleCheckId": "secure-transport-and-headers",
      "guidanceId": "security",
      "guidanceCategory": "security",
      "summary": "Cookie and CSP policy leave avoidable security weaknesses.",
      "evidence": "Two Google Analytics cookies were set without Secure, all 12 cookies used SameSite=None, and CSP permits unsafe-inline and unsafe-eval. HTTPS, HSTS and nosniff were present.",
      "artifacts": [
        "evidence/home-cookies.json",
        "evidence/home-headers.json"
      ],
      "suggestedFix": "Set Secure on every cookie, use Lax/Strict unless cross-site use is required, and migrate scripts/styles to nonces or hashes so unsafe-inline/eval can be removed.",
      "effort": "large"
    },
    {
      "id": "IXL-017",
      "severity": "medium",
      "confidence": "high",
      "pathId": "home",
      "url": "https://uk.ixl.com/",
      "principleId": "be-private-and-secure",
      "principleCheckId": "data-minimisation-and-third-parties",
      "guidanceId": "privacy",
      "guidanceCategory": "privacy",
      "summary": "Anonymous first load activates several analytics and tracking services.",
      "evidence": "Tracker evidence found six third-party origins and Google Analytics, Google Tag Manager, and region1 Google Analytics before user interaction.",
      "artifacts": [
        "evidence/home-trackers.json",
        "evidence/home-summary.json"
      ],
      "suggestedFix": "Audit necessity, load non-essential analytics only after valid consent, minimise event collection, and batch remaining telemetry.",
      "effort": "medium"
    },
    {
      "id": "IXL-018",
      "severity": "medium",
      "confidence": "high",
      "pathId": "signin",
      "url": "https://uk.ixl.com/signin",
      "principleId": "be-private-and-secure",
      "principleCheckId": "in-context-permissions-and-modern-auth",
      "guidanceId": "security",
      "guidanceCategory": "security",
      "summary": "The sign-in surface exposes password-only authentication.",
      "evidence": "The sign-in DOM contains username and password fields with no WebAuthn/passkey affordance; no permission prompt fired on load.",
      "artifacts": [
        "evidence/signin-probe.json",
        "evidence/signin-mobile.png"
      ],
      "suggestedFix": "Offer passkey/WebAuthn sign-in and recovery alongside passwords, then progressively promote phishing-resistant authentication.",
      "effort": "large"
    },
    {
      "id": "IXL-019",
      "severity": "medium",
      "confidence": "high",
      "pathId": "membership",
      "url": "https://uk.ixl.com/membership/family/pricing",
      "principleId": "be-resilient",
      "principleCheckId": "progressive-enhancement",
      "summary": "The core public pricing proposition depends heavily on JavaScript.",
      "evidence": "Raw HTML preserved only 18% of rendered pricing-page words and omitted the H1, while homepage and curriculum raw coverage were 85%.",
      "artifacts": [
        "evidence/membership-discoverability.json",
        "evidence/membership-discoverability-crawler.png"
      ],
      "suggestedFix": "Render the pricing proposition and links in server HTML, then enhance package selection and checkout interactivity with JavaScript.",
      "effort": "large"
    },
    {
      "id": "IXL-020",
      "severity": "medium",
      "confidence": "high",
      "pathId": "home",
      "url": "https://uk.ixl.com/",
      "principleId": "be-resilient",
      "principleCheckId": "offline-and-installable",
      "summary": "The app-like learning service has no manifest, service worker, cache, or offline fallback.",
      "evidence": "The resilience probe found no manifest, no service-worker registrations and no Cache Storage entries.",
      "artifacts": [
        "evidence/home-resilience-probe.json"
      ],
      "suggestedFix": "Add a manifest and narrowly scoped service worker that provides an offline shell/fallback and caches safe, static learning assets.",
      "effort": "large"
    },
    {
      "id": "IXL-021",
      "severity": "medium",
      "confidence": "high",
      "pathId": "signin",
      "url": "https://uk.ixl.com/signin",
      "principleId": "be-trustworthy",
      "principleCheckId": "trustworthy-input-assistance",
      "guidanceId": "autofill-sign-in-form",
      "guidanceCategory": "forms",
      "summary": "The sign-in form disables autofill and omits standard autocomplete tokens.",
      "evidence": "Both username and password inputs have autocomplete=off rather than username and current-password.",
      "artifacts": [
        "evidence/signin-probe.json"
      ],
      "suggestedFix": "Use autocomplete=username and autocomplete=current-password, allowing password managers and browser autofill to assist users.",
      "effort": "trivial"
    },
    {
      "id": "IXL-022",
      "severity": "medium",
      "confidence": "high",
      "pathId": "home",
      "url": "https://uk.ixl.com/",
      "principleId": "be-sustainable",
      "principleCheckId": "optimised-assets",
      "guidanceId": "optimize-image-priority",
      "guidanceCategory": "performance",
      "summary": "Responsive and below-fold image delivery leaves avoidable waste.",
      "evidence": "The image audit found eight images without srcset, eight below-fold images not lazy-loaded, five legacy-format assets, and 82 without intrinsic dimensions.",
      "artifacts": [
        "evidence/home-images.json"
      ],
      "suggestedFix": "Provide responsive srcset/sizes, modern formats where beneficial, intrinsic dimensions, and lazy loading for non-critical images.",
      "effort": "medium"
    }
  ],
  "taskList": [
    {
      "id": "TASK-01",
      "title": "Remove or defer the first-visit modal and use native dialog semantics",
      "priority": 1,
      "findingIds": [
        "IXL-004",
        "IXL-005"
      ],
      "guidanceId": "light-dismiss-a-dialog",
      "status": "open"
    },
    {
      "id": "TASK-02",
      "title": "Reduce throttled LCP, script volume and dependency depth",
      "priority": 2,
      "findingIds": [
        "IXL-006",
        "IXL-008"
      ],
      "guidanceId": "performance",
      "status": "open"
    },
    {
      "id": "TASK-03",
      "title": "Server-render the complete public pricing page",
      "priority": 3,
      "findingIds": [
        "IXL-013",
        "IXL-019"
      ],
      "status": "open"
    },
    {
      "id": "TASK-04",
      "title": "Fix accessible names, contrast and heading hierarchy",
      "priority": 4,
      "findingIds": [
        "IXL-009",
        "IXL-010",
        "IXL-011"
      ],
      "guidanceId": "accessibility",
      "status": "open"
    },
    {
      "id": "TASK-05",
      "title": "Eliminate the pricing-page layout shift",
      "priority": 5,
      "findingIds": [
        "IXL-007"
      ],
      "guidanceId": "visually-stable-font-fallbacks",
      "status": "open"
    },
    {
      "id": "TASK-06",
      "title": "Harden cookies, CSP and browser policies",
      "priority": 6,
      "findingIds": [
        "IXL-016"
      ],
      "guidanceId": "security",
      "status": "open"
    },
    {
      "id": "TASK-07",
      "title": "Minimise and consent-gate third-party analytics",
      "priority": 7,
      "findingIds": [
        "IXL-017"
      ],
      "guidanceId": "privacy",
      "status": "open"
    },
    {
      "id": "TASK-08",
      "title": "Add intrinsic and responsive image metadata",
      "priority": 8,
      "findingIds": [
        "IXL-012",
        "IXL-022"
      ],
      "guidanceId": "optimize-image-priority",
      "status": "open"
    },
    {
      "id": "TASK-09",
      "title": "Support dark and reduced-motion preferences",
      "priority": 9,
      "findingIds": [
        "IXL-001",
        "IXL-002"
      ],
      "guidanceId": "dark-mode",
      "status": "open"
    },
    {
      "id": "TASK-10",
      "title": "Improve localized indexing metadata",
      "priority": 10,
      "findingIds": [
        "IXL-014",
        "IXL-015"
      ],
      "status": "open"
    },
    {
      "id": "TASK-11",
      "title": "Modernise sign-in with autofill and passkeys",
      "priority": 11,
      "findingIds": [
        "IXL-018",
        "IXL-021"
      ],
      "guidanceId": "autofill-sign-in-form",
      "status": "open"
    },
    {
      "id": "TASK-12",
      "title": "Add a bounded offline fallback for the learning app",
      "priority": 12,
      "findingIds": [
        "IXL-020"
      ],
      "status": "open"
    },
    {
      "id": "TASK-13",
      "title": "Adopt View Transitions for eligible state changes",
      "priority": 13,
      "findingIds": [
        "IXL-003"
      ],
      "guidanceId": "same-document-transitions",
      "status": "open"
    }
  ],
  "budget": {
    "pathCount": 6,
    "auditPasses": 1
  },
  "agent": "pi",
  "runId": "2026-07-23T14-45-34-209Z"
}
