{
  "url": "https://es.eporner.com",
  "auditedAt": "2026-07-21T08:29:52.681Z",
  "mode": "report",
  "status": "completed",
  "statusDetail": "Coverage-complete audit of the public age gate and representative support/legal templates. Explicit media content and authenticated account management were not entered; the legal age gate was respected.",
  "page": {
    "appType": "mpa",
    "framework": "Server-rendered HTML with jQuery and custom account/modal scripts",
    "notes": "The root is an age-verification wall in the observed jurisdiction. Representative public templates were audited without bypassing the gate."
  },
  "evidenceUsed": [
    "screenshot",
    "transition-video",
    "dom",
    "evaluate-probe",
    "layout-metrics",
    "trace",
    "har",
    "discoverability",
    "headers",
    "cookies",
    "trackers",
    "secrets",
    "images",
    "heap-summary",
    "lighthouse",
    "Modern Web Guidance 0.0.172"
  ],
  "guidanceConsulted": [
    "dark-mode",
    "component-specific-light-dark-theme",
    "accessibility",
    "adapt-scrollbar-to-contrast-preferences",
    "same-document-transitions",
    "cross-document-transitions",
    "group-element-transitions",
    "faster-spa-view-transitions",
    "scrollytelling",
    "parallax-scroll-effects",
    "scroll-entry-exit-effects",
    "carousel-slide-effects",
    "physics-based-easing",
    "individual-transform-properties",
    "animate-element-entry-exit",
    "animate-to-from-top-layer",
    "animate-to-intrinsic-sizes",
    "dynamic-sibling-animations",
    "interactive-content-reveal",
    "pull-to-reveal",
    "swipe-to-remove",
    "shrinking-header-on-scroll",
    "scroll-progress-indicator",
    "scroll-position-aware-elements",
    "scroll-snap-realtime-feedback",
    "scroll-snap-state-sync",
    "scroll-target-on-load",
    "soft-edge-content-fade",
    "scrollability-affordance-hints",
    "anchor-positioning-tab-underline",
    "position-aware-tooltips",
    "interest-triggered-tooltips",
    "interest-triggered-action-previews",
    "directional-navigation-transitions",
    "carousel-snap-highlights",
    "navigation-drawer",
    "stack-drill-down",
    "persistent-app-tours",
    "persistent-toast-notifications",
    "light-dismiss-a-dialog",
    "platform-controls-dismiss-dialog",
    "declarative-dialog-popover-control",
    "animated-select-picker",
    "branded-select-styling",
    "brand-consistent-forms",
    "custom-select-picker-layouts",
    "rich-media-picker",
    "complex-shapes",
    "shaped-cutouts",
    "overflow-clipping-control",
    "visually-texture-content",
    "apply-webgl-shaders",
    "interactive-content-in-3d-scenes",
    "highlight-text-ranges",
    "prevent-text-wrapping",
    "customize-scrollbar-color-and-thickness",
    "export-html-media-from-canvas",
    "fluid-scaling",
    "calculate-with-intrinsic-sizes",
    "css-layout",
    "size-aware-styling",
    "content-based-styling",
    "child-state-based-styling",
    "design-token-reactivity",
    "dynamic-sibling-styling",
    "form-fields-automatically-fit-contents",
    "improve-text-layout-and-legibility",
    "forms",
    "accessible-error-announcement",
    "required-field-feedback",
    "validate-input-after-interaction",
    "identify-inp-causes",
    "schedule-tasks-by-priority",
    "optimize-preload-priority",
    "improve-next-page-load-performance",
    "interactions-in-complex-layouts",
    "performance",
    "visually-stable-font-fallbacks",
    "break-up-long-tasks",
    "identify-heavy-scripts",
    "optimize-script-priority",
    "defer-rendering-heavy-content",
    "defer-work-until-scroll-ends",
    "optimize-image-priority",
    "conditional-async-dependencies",
    "expose-canvas-content-to-browser-features",
    "move-dom-element-without-losing-state",
    "precise-text-alignment",
    "visually-stable-mixed-fonts",
    "css",
    "html",
    "reduce-style-repetition",
    "security",
    "privacy",
    "batch-analytics-events",
    "full-session-analytics",
    "calculate-total-foreground-time",
    "passkeys",
    "passkey-registration",
    "passkey-authentication",
    "passkey-reauthentication",
    "passkey-conditional-create",
    "passkey-management",
    "flicker-free-client-side-ab-testing",
    "consistent-cross-document-transitions",
    "stabilize-reactive-state",
    "resilient-context-menus-and-nested-dropdowns",
    "persistent-top-layer-ui",
    "detect-initial-visibility-state",
    "sequence-distributed-events",
    "translator",
    "language-detection",
    "support-global-calendar-systems",
    "capture-location-agnostic-data",
    "format-human-readable-durations",
    "manage-recurring-intervals",
    "calculate-event-differentials",
    "coordinate-global-events",
    "model-partial-time-concepts",
    "search-hidden-content",
    "select-menu-interaction",
    "style-parent-with-has",
    "autofill-address-form",
    "autofill-payment-form",
    "autofill-sign-in-form",
    "autofill-sign-up-form",
    "autofill-highlight-inputs",
    "deliver-optimized-decorative-images",
    "resolution-optimized-pseudo-elements",
    "deprioritize-background-fetches",
    "efficient-background-processing",
    "webmcp",
    "agentic-forms",
    "agentic-javascript-tools",
    "language-model",
    "summarizer"
  ],
  "artifacts": [
    {
      "type": "screenshot",
      "path": "evidence/home-desktop.png",
      "caption": "Age-verification wall at desktop width.",
      "condition": "viewport: 1440x1000",
      "findingIds": [
        "F06"
      ]
    },
    {
      "type": "screenshot",
      "path": "evidence/home-mobile.png",
      "caption": "Age-verification wall at a narrow mobile width.",
      "condition": "viewport: 360x800",
      "findingIds": [
        "F08",
        "F10"
      ]
    },
    {
      "type": "screenshot",
      "path": "evidence/home-dark.png",
      "caption": "Age wall under dark preference; visually identical to the hard-coded default.",
      "condition": "prefers-color-scheme: dark",
      "findingIds": [
        "F01"
      ]
    },
    {
      "type": "screenshot",
      "path": "evidence/home-high-contrast.png",
      "caption": "Age wall under increased-contrast preference; styling remains unchanged.",
      "condition": "prefers-contrast: more",
      "findingIds": [
        "F03"
      ]
    },
    {
      "type": "other",
      "path": "evidence/reduced-motion-probe.json",
      "caption": "Probe showing an indefinite SVG animation remains active with reduced motion requested.",
      "condition": "prefers-reduced-motion: reduce",
      "findingIds": [
        "F02"
      ]
    },
    {
      "type": "video",
      "path": "evidence/verify-interaction.mp4",
      "caption": "Activation of the age-verification CTA and abrupt custom registration overlay.",
      "condition": "CTA activation",
      "findingIds": [
        "F04",
        "F07",
        "F11",
        "F29"
      ]
    },
    {
      "type": "screenshot",
      "path": "evidence/verify-modal-frame.png",
      "caption": "Frame from the CTA flow showing the undisclosed mandatory registration modal.",
      "condition": "4 seconds after CTA activation",
      "findingIds": [
        "F07",
        "F11",
        "F29",
        "F32"
      ]
    },
    {
      "type": "other",
      "path": "evidence/verify-visible-state.json",
      "caption": "Visible overlay state, focus target, loaded controls and memory metrics after CTA activation.",
      "condition": "registration modal open",
      "findingIds": [
        "F07",
        "F11"
      ]
    },
    {
      "type": "other",
      "path": "evidence/register-form-probe.json",
      "caption": "Visible registration form semantics, labels and autocomplete inspection.",
      "condition": "registration modal open",
      "findingIds": [
        "F15",
        "F31"
      ]
    },
    {
      "type": "other",
      "path": "evidence/register-empty-submit.json",
      "caption": "Empty-submit result: one non-live error with no aria-invalid field association.",
      "condition": "empty registration submit",
      "findingIds": [
        "F12",
        "F30"
      ]
    },
    {
      "type": "screenshot",
      "path": "evidence/terms-mobile.png",
      "caption": "Dense long-form English terms on the Spanish host with cookie banner covering content.",
      "condition": "viewport: 360x800",
      "findingIds": [
        "F06",
        "F08",
        "F18",
        "F28"
      ]
    },
    {
      "type": "screenshot",
      "path": "evidence/privacy-mobile.png",
      "caption": "English 2257/privacy copy on the Spanish host and persistent cookie banner.",
      "condition": "viewport: 360x800",
      "findingIds": [
        "F06",
        "F28"
      ]
    },
    {
      "type": "screenshot",
      "path": "evidence/faq-mobile.png",
      "caption": "FAQ mobile template with advertising above the task and cookie banner overlay.",
      "condition": "viewport: 360x800",
      "findingIds": [
        "F06",
        "F08"
      ]
    },
    {
      "type": "layout",
      "path": "evidence/home-mobile-layout.json",
      "caption": "Mobile layout: no horizontal overflow, CLS 0 and no long tasks.",
      "condition": "viewport: 360x800",
      "findingIds": []
    },
    {
      "type": "layout",
      "path": "evidence/terms-mobile-layout.json",
      "caption": "Long-form page remains within the 360px viewport with CLS 0.",
      "condition": "viewport: 360x800",
      "findingIds": []
    },
    {
      "type": "trace",
      "path": "evidence/home-trace.json",
      "caption": "DevTools load trace for the entry page.",
      "condition": "cold load",
      "findingIds": []
    },
    {
      "type": "trace-summary",
      "path": "evidence/home-trace-summary.json",
      "caption": "Trace summary: LCP 1.41s, no long tasks and TBT 0.",
      "condition": "cold load",
      "findingIds": []
    },
    {
      "type": "har",
      "path": "evidence/home.har",
      "caption": "Network capture for entry-page load.",
      "condition": "cold load",
      "findingIds": [
        "F13",
        "F14"
      ]
    },
    {
      "type": "har-summary",
      "path": "evidence/home-summary.json",
      "caption": "HAR summary: 8 requests and 277,872 transferred bytes.",
      "condition": "cold load",
      "findingIds": [
        "F13",
        "F14",
        "F33"
      ]
    },
    {
      "type": "lighthouse",
      "path": "evidence/home-lighthouse.json",
      "caption": "Lighthouse report: performance 96, accessibility 57, best practices 100, SEO 83.",
      "condition": "mobile navigation",
      "findingIds": [
        "F13",
        "F14",
        "F15",
        "F16",
        "F17",
        "F19",
        "F20",
        "F21"
      ]
    },
    {
      "type": "other",
      "path": "evidence/home-lighthouse-summary.json",
      "caption": "Readable Lighthouse failure and metric summary.",
      "condition": "mobile navigation",
      "findingIds": [
        "F13",
        "F14",
        "F15",
        "F16",
        "F17",
        "F19",
        "F20",
        "F21"
      ]
    },
    {
      "type": "dom",
      "path": "evidence/home-dom.json",
      "caption": "Rendered HTML/CSS of the age wall.",
      "condition": "default",
      "findingIds": [
        "F01",
        "F17",
        "F21",
        "F22",
        "F23"
      ]
    },
    {
      "type": "other",
      "path": "evidence/home-platform-probe.json",
      "caption": "Document, metadata, platform-feature, focus and target-size probe.",
      "condition": "default",
      "findingIds": [
        "F01",
        "F03",
        "F04",
        "F05",
        "F09",
        "F10",
        "F17",
        "F21",
        "F22",
        "F23"
      ]
    },
    {
      "type": "discoverability",
      "path": "evidence/home-discoverability.json",
      "caption": "Raw-vs-rendered discoverability result: 100% content coverage, not a JS shell.",
      "condition": "JavaScript on/off",
      "findingIds": []
    },
    {
      "type": "discoverability",
      "path": "evidence/terms-discoverability.json",
      "caption": "Terms raw-vs-rendered result: 100% content coverage.",
      "condition": "JavaScript on/off",
      "findingIds": []
    },
    {
      "type": "other",
      "path": "evidence/routes-probe.json",
      "caption": "robots, sitemap, and unknown-route status probe; unknown URL incorrectly returns 200.",
      "condition": "same-origin fetch",
      "findingIds": [
        "F22",
        "F27"
      ]
    },
    {
      "type": "other",
      "path": "evidence/home-headers.json",
      "caption": "Security response-header inspection.",
      "condition": "main document",
      "findingIds": [
        "F24",
        "F26"
      ]
    },
    {
      "type": "other",
      "path": "evidence/home-cookies.json",
      "caption": "Cookie attributes: epcolor is not Secure; EPRNS and epcolor use SameSite=None.",
      "condition": "main document",
      "findingIds": [
        "F24",
        "F26"
      ]
    },
    {
      "type": "other",
      "path": "evidence/home-trackers.json",
      "caption": "Third-party origin scan found no known tracker domains.",
      "condition": "cold load",
      "findingIds": []
    },
    {
      "type": "other",
      "path": "evidence/home-secrets.json",
      "caption": "Client resource scan found no exposed credential patterns.",
      "condition": "cold load",
      "findingIds": []
    },
    {
      "type": "other",
      "path": "evidence/home-images.json",
      "caption": "Entry-page image dimensions, formats, responsive-source and alt inspection.",
      "condition": "default",
      "findingIds": [
        "F15",
        "F20",
        "F33"
      ]
    },
    {
      "type": "other",
      "path": "evidence/faq-images.json",
      "caption": "FAQ template image audit: 23 unsized, 7 legacy-format and 6 missing-alt images.",
      "condition": "default",
      "findingIds": [
        "F20",
        "F33"
      ]
    },
    {
      "type": "heap",
      "path": "evidence/heap-baseline.json",
      "caption": "Baseline heap summary before opening the registration modal.",
      "condition": "initial state",
      "findingIds": []
    },
    {
      "type": "heap",
      "path": "evidence/heap-after-one-modal.json",
      "caption": "Heap after one open/close interaction; includes one-time registration/model resources.",
      "condition": "one interaction",
      "findingIds": []
    },
    {
      "type": "heap",
      "path": "evidence/heap-post-modal.json",
      "caption": "Heap after ten open/close attempts; only 0.7% larger than after one interaction.",
      "condition": "ten interactions",
      "findingIds": []
    },
    {
      "type": "other",
      "path": "evidence/terms-probe.json",
      "caption": "Terms metadata, localized links, headings and content probe.",
      "condition": "default",
      "findingIds": [
        "F28"
      ]
    }
  ],
  "config": {
    "loaded": false
  },
  "paths": [
    {
      "id": "home-age-wall",
      "description": "Entry age-verification wall, the public gate and primary call to action; tested at desktop/mobile and preference conditions.",
      "url": "https://es.eporner.com/",
      "conditions": [
        "1440x1000",
        "360x800",
        "prefers-color-scheme: dark",
        "prefers-contrast: more",
        "prefers-reduced-motion: reduce",
        "keyboard focus"
      ],
      "result": "issues"
    },
    {
      "id": "age-registration-flow",
      "description": "Primary age-verification CTA through the resulting account-registration modal, including empty submission.",
      "url": "https://es.eporner.com/",
      "conditions": [
        "CTA activation",
        "desktop modal",
        "empty form submission",
        "10 repeated open/close interactions"
      ],
      "result": "issues"
    },
    {
      "id": "terms",
      "description": "Long-form policy template representing content-heavy legal pages and long scrolling.",
      "url": "https://es.eporner.com/terms/",
      "conditions": [
        "1440x1000",
        "360x800",
        "no-JavaScript crawler"
      ],
      "result": "issues"
    },
    {
      "id": "privacy",
      "description": "Privacy/2257 policy template, checked for disclosure, localization, mobile layout and consent chrome.",
      "url": "https://es.eporner.com/privacy-2257/",
      "conditions": [
        "360x800"
      ],
      "result": "issues"
    },
    {
      "id": "faq",
      "description": "FAQ/listing template representing expandable help content, advertisements and media thumbnails.",
      "url": "https://es.eporner.com/faq/",
      "conditions": [
        "360x800"
      ],
      "result": "issues"
    },
    {
      "id": "failure-route",
      "description": "Unknown-route recovery probe using an intentionally nonexistent URL.",
      "url": "https://es.eporner.com/this-route-should-not-exist-web-uplift",
      "conditions": [
        "HTTP status and body fetch"
      ],
      "result": "issues"
    }
  ],
  "findings": [
    {
      "id": "F01",
      "severity": "medium",
      "confidence": "high",
      "principleId": "respect-user-preferences",
      "principleCheckId": "respects-color-scheme",
      "guidanceId": "dark-mode",
      "guidanceCategory": "user-experience",
      "summary": "Theme is hard-coded rather than driven by the user’s color-scheme preference.",
      "evidence": "DOM/CSS probe found no color-scheme declaration or prefers-color-scheme rule; dark-emulation output is byte-identical in size to the default capture.",
      "suggestedFix": "Declare color-scheme and express surface/text colors with prefers-color-scheme or light-dark(), preserving a usable light and dark palette.",
      "effort": "small",
      "pathId": "home-age-wall",
      "url": "https://es.eporner.com/",
      "artifacts": [
        "evidence/home-dark.png",
        "evidence/home-platform-probe.json"
      ]
    },
    {
      "id": "F02",
      "severity": "medium",
      "confidence": "high",
      "principleId": "respect-user-preferences",
      "principleCheckId": "respects-reduced-motion",
      "guidanceId": "accessibility",
      "guidanceCategory": "accessibility",
      "summary": "The age-estimation indicator ignores reduced-motion.",
      "evidence": "Under prefers-reduced-motion: reduce, the SVG still contains an indefinite 3-second animate element and no reduced-motion CSS is present.",
      "suggestedFix": "Disable or replace the non-essential looping SVG animation inside a prefers-reduced-motion: reduce query.",
      "effort": "trivial",
      "pathId": "home-age-wall",
      "url": "https://es.eporner.com/",
      "artifacts": [
        "evidence/reduced-motion-probe.json"
      ]
    },
    {
      "id": "F03",
      "severity": "medium",
      "confidence": "high",
      "principleId": "respect-user-preferences",
      "principleCheckId": "respects-contrast",
      "guidanceId": "adapt-scrollbar-to-contrast-preferences",
      "guidanceCategory": "user-experience",
      "summary": "The page has no high-contrast or forced-colors adaptation.",
      "evidence": "The platform probe found no prefers-contrast/forced-colors rules; the increased-contrast screenshot is visually unchanged, while Lighthouse also identifies a 3.83:1 text contrast failure.",
      "suggestedFix": "Add forced-colors and prefers-contrast handling, retain system colors/outlines, and increase low-contrast text colors.",
      "effort": "small",
      "pathId": "home-age-wall",
      "url": "https://es.eporner.com/",
      "artifacts": [
        "evidence/home-high-contrast.png",
        "evidence/home-platform-probe.json"
      ]
    },
    {
      "id": "F04",
      "severity": "low",
      "confidence": "high",
      "principleId": "implement-natural-interactions",
      "principleCheckId": "view-transitions",
      "guidanceId": "same-document-transitions",
      "guidanceCategory": "user-experience",
      "summary": "The primary state change is an abrupt custom-overlay swap.",
      "evidence": "The interaction video shows the registration surface appearing without a directional or same-document transition; CSS inspection found no view-transition usage.",
      "suggestedFix": "Use a progressively enhanced same-document View Transition for opening/closing the account step, and disable it under reduced motion.",
      "effort": "small",
      "pathId": "age-registration-flow",
      "url": "https://es.eporner.com/",
      "artifacts": [
        "evidence/verify-interaction.mp4",
        "evidence/home-platform-probe.json"
      ]
    },
    {
      "id": "F05",
      "severity": "low",
      "confidence": "high",
      "principleId": "provide-guided-navigation",
      "principleCheckId": "scroll-state-aware-chrome",
      "guidanceId": "shrinking-header-on-scroll",
      "guidanceCategory": "user-experience",
      "summary": "Long policy pages provide no scroll progress or scroll-state-aware chrome.",
      "evidence": "The 10,158px-high terms template has static header/chrome; CSS inspection found no scroll-state query, progress indicator, or scroll-driven state.",
      "suggestedFix": "Add a lightweight progress cue or compact the sticky header based on scroll state, with a non-supporting-browser fallback.",
      "effort": "small",
      "pathId": "terms",
      "url": "https://es.eporner.com/terms/",
      "artifacts": [
        "evidence/terms-mobile-layout.json",
        "evidence/home-platform-probe.json"
      ]
    },
    {
      "id": "F06",
      "severity": "medium",
      "confidence": "high",
      "principleId": "maximize-content-reduce-noise",
      "principleCheckId": "no-intrusive-interruptions",
      "guidanceId": "light-dismiss-a-dialog",
      "guidanceCategory": "user-experience",
      "summary": "The cookie notice persistently obscures mobile content and offers only dismissal/implied consent.",
      "evidence": "Terms, privacy, and FAQ screenshots show a fixed banner covering the bottom lines of content; it says continued use accepts cookies and exposes only “[ X ]”.",
      "suggestedFix": "Use a compact, accessible consent surface with clear accept/reject choices, reserve or avoid overlaying reading content, and persist the decision.",
      "effort": "medium",
      "pathId": "terms",
      "url": "https://es.eporner.com/terms/",
      "artifacts": [
        "evidence/terms-mobile.png",
        "evidence/privacy-mobile.png",
        "evidence/faq-mobile.png"
      ]
    },
    {
      "id": "F07",
      "severity": "high",
      "confidence": "high",
      "principleId": "maximize-content-reduce-noise",
      "principleCheckId": "semantic-dismissible-primitives",
      "guidanceId": "declarative-dialog-popover-control",
      "guidanceCategory": "user-experience",
      "summary": "The mandatory registration overlay is an ad-hoc modal without dialog semantics.",
      "evidence": "The interaction frame shows a modal overlay, but the visible-state probe finds no dialog element or role=dialog; it is built with SimpleModal-style divs.",
      "suggestedFix": "Replace the custom container with dialog/showModal(), label it, manage initial/return focus, and use native close/cancel behavior.",
      "effort": "medium",
      "pathId": "age-registration-flow",
      "url": "https://es.eporner.com/",
      "artifacts": [
        "evidence/verify-modal-frame.png",
        "evidence/verify-interaction.mp4"
      ]
    },
    {
      "id": "F08",
      "severity": "medium",
      "confidence": "high",
      "principleId": "maximize-content-reduce-noise",
      "principleCheckId": "reduced-chrome",
      "guidanceId": "scrollability-affordance-hints",
      "guidanceCategory": "user-experience",
      "summary": "Mobile support pages devote too much of the viewport to chrome, ads and overlays.",
      "evidence": "FAQ begins with header plus a two-tile ad and ends under a cookie overlay; policy screenshots show content hidden behind persistent chrome.",
      "suggestedFix": "Defer ads below the help task, reduce fixed chrome, and keep legal/help content unobscured.",
      "effort": "medium",
      "pathId": "faq",
      "url": "https://es.eporner.com/faq/",
      "artifacts": [
        "evidence/faq-mobile.png",
        "evidence/terms-mobile.png"
      ]
    },
    {
      "id": "F09",
      "severity": "low",
      "confidence": "high",
      "principleId": "adapt-to-the-form-factor",
      "principleCheckId": "component-level-responsiveness",
      "guidanceId": "size-aware-styling",
      "guidanceCategory": "user-experience",
      "summary": "Responsive behavior is only viewport-wide and lacks component-level adaptation.",
      "evidence": "CSS inspection found no @container/container-type usage across the reused age-card and content templates.",
      "suggestedFix": "Introduce container queries where cards/forms are reused at different widths, retaining existing media queries as fallback where needed.",
      "effort": "medium",
      "pathId": "home-age-wall",
      "url": "https://es.eporner.com/",
      "artifacts": [
        "evidence/home-platform-probe.json"
      ]
    },
    {
      "id": "F10",
      "severity": "medium",
      "confidence": "high",
      "principleId": "adapt-to-the-form-factor",
      "principleCheckId": "input-modality-aware",
      "guidanceId": "accessibility",
      "guidanceCategory": "accessibility",
      "summary": "Footer controls are too small for reliable touch input.",
      "evidence": "The focus/geometry probe measured every footer link at 14px high; Lighthouse target-size reports less than the required 24px size/spacing.",
      "suggestedFix": "Increase clickable padding/spacing to at least 24x24 CSS px, preferably 44x44 for primary mobile targets, while retaining visible focus.",
      "effort": "small",
      "pathId": "home-age-wall",
      "url": "https://es.eporner.com/",
      "artifacts": [
        "evidence/home-mobile.png",
        "evidence/home-platform-probe.json"
      ]
    },
    {
      "id": "F11",
      "severity": "high",
      "confidence": "high",
      "principleId": "support-core-task-success",
      "principleCheckId": "primary-flow-completion",
      "guidanceId": "forms",
      "guidanceCategory": "forms",
      "summary": "The “Get You Verified” action unexpectedly dead-ends at mandatory account registration.",
      "evidence": "The age wall promises age verification and “no ID required,” but its CTA opens a “Register for free” account form before any age check, an undisclosed detour in the core journey.",
      "suggestedFix": "Explain account requirements before activation or, preferably, let users complete age estimation directly and offer account creation separately.",
      "effort": "large",
      "pathId": "age-registration-flow",
      "url": "https://es.eporner.com/",
      "artifacts": [
        "evidence/verify-modal-frame.png",
        "evidence/verify-interaction.mp4"
      ]
    },
    {
      "id": "F12",
      "severity": "medium",
      "confidence": "high",
      "principleId": "support-core-task-success",
      "principleCheckId": "clear-system-state-and-recovery",
      "guidanceId": "accessible-error-announcement",
      "guidanceCategory": "accessibility",
      "summary": "Registration recovery state is incomplete and weakly associated.",
      "evidence": "Submitting the empty visible registration form reports only a password-length error, leaves all fields valid with no aria-invalid, and exposes no role=alert/live announcement.",
      "suggestedFix": "Validate after interaction, summarize all actionable errors, associate each message with its field, set aria-invalid, and move/announce focus predictably.",
      "effort": "medium",
      "pathId": "age-registration-flow",
      "url": "https://es.eporner.com/",
      "artifacts": [
        "evidence/register-empty-submit.json"
      ]
    },
    {
      "id": "F13",
      "severity": "medium",
      "confidence": "high",
      "principleId": "be-fast-and-stable",
      "principleCheckId": "efficient-resource-delivery",
      "guidanceId": "optimize-script-priority",
      "guidanceCategory": "performance",
      "summary": "Parser-blocking scripts and CSS delay the small age wall.",
      "evidence": "Lighthouse identifies two synchronous scripts plus the stylesheet as render-blocking with up to 1,280ms estimated savings; the longest critical chain is 913ms.",
      "suggestedFix": "Defer non-critical scripts, avoid loading site-wide behavior before it is needed, and inline or split only the minimal age-wall critical CSS.",
      "effort": "medium",
      "pathId": "home-age-wall",
      "url": "https://es.eporner.com/",
      "artifacts": [
        "evidence/home-lighthouse-summary.json",
        "evidence/home.har"
      ]
    },
    {
      "id": "F14",
      "severity": "medium",
      "confidence": "high",
      "principleId": "be-fast-and-stable",
      "principleCheckId": "trim-unused-and-duplicate-code",
      "guidanceId": "identify-heavy-scripts",
      "guidanceCategory": "performance",
      "summary": "The age wall ships mostly unused site-wide CSS and JavaScript.",
      "evidence": "Lighthouse estimates 31KiB unused CSS (99.8%) and 35KiB unused JavaScript (84.9%) on this small gate.",
      "suggestedFix": "Create an age-wall bundle, conditionally load account/verification code after intent, and remove the old global dependencies from the critical path.",
      "effort": "medium",
      "pathId": "home-age-wall",
      "url": "https://es.eporner.com/",
      "artifacts": [
        "evidence/home-lighthouse-summary.json",
        "evidence/home.har"
      ]
    },
    {
      "id": "F15",
      "severity": "high",
      "confidence": "high",
      "principleId": "be-inclusive",
      "principleCheckId": "names-roles-labels",
      "guidanceId": "accessibility",
      "guidanceCategory": "accessibility",
      "summary": "Key images, modal structure and registration fields lack accessible names/relationships.",
      "evidence": "Lighthouse flags the logo without alt; the registration form uses placeholder-only inputs with no labels, and the visible modal has no dialog role.",
      "suggestedFix": "Add appropriate alt text (or empty alt if decorative), explicit labels, dialog name/description, and native semantic controls.",
      "effort": "medium",
      "pathId": "age-registration-flow",
      "url": "https://es.eporner.com/",
      "artifacts": [
        "evidence/home-lighthouse-summary.json",
        "evidence/register-form-probe.json",
        "evidence/home-images.json"
      ]
    },
    {
      "id": "F16",
      "severity": "medium",
      "confidence": "high",
      "principleId": "be-inclusive",
      "principleCheckId": "sufficient-contrast",
      "guidanceId": "accessibility",
      "guidanceCategory": "accessibility",
      "summary": "The green age-estimation text fails minimum contrast.",
      "evidence": "Lighthouse measures #0a910a on #222 at 3.83:1, below the required 4.5:1 for the rendered 19.5px normal-weight text.",
      "suggestedFix": "Choose a lighter green or darker background that reaches at least 4.5:1 in every theme and contrast mode.",
      "effort": "trivial",
      "pathId": "home-age-wall",
      "url": "https://es.eporner.com/",
      "artifacts": [
        "evidence/home-lighthouse-summary.json"
      ]
    },
    {
      "id": "F17",
      "severity": "medium",
      "confidence": "high",
      "principleId": "be-inclusive",
      "principleCheckId": "structure-and-focus",
      "guidanceId": "accessibility",
      "guidanceCategory": "accessibility",
      "summary": "The age wall lacks a main landmark and H1, and its footer list is malformed.",
      "evidence": "Lighthouse reports no main landmark and a UL containing a direct BR child; the DOM has only an H2 and no landmarks.",
      "suggestedFix": "Use main, make the page purpose an H1, keep only LI children in UL, and verify modal focus trapping and return.",
      "effort": "small",
      "pathId": "home-age-wall",
      "url": "https://es.eporner.com/",
      "artifacts": [
        "evidence/home-lighthouse-summary.json",
        "evidence/home-platform-probe.json"
      ]
    },
    {
      "id": "F18",
      "severity": "medium",
      "confidence": "high",
      "principleId": "be-inclusive",
      "principleCheckId": "legible-text",
      "guidanceId": "improve-text-layout-and-legibility",
      "guidanceCategory": "user-experience",
      "summary": "Long legal text is cramped and partially obscured on mobile.",
      "evidence": "The terms screenshot shows dense 12.5px copy in a narrow column while the fixed cookie bar covers the current lines.",
      "suggestedFix": "Increase body size/line-height, constrain readable measure, add section spacing, and ensure overlays do not cover text.",
      "effort": "small",
      "pathId": "terms",
      "url": "https://es.eporner.com/terms/",
      "artifacts": [
        "evidence/terms-mobile.png"
      ]
    },
    {
      "id": "F19",
      "severity": "medium",
      "confidence": "high",
      "principleId": "be-inclusive",
      "principleCheckId": "zoom-reflow-targets-and-media",
      "guidanceId": "fluid-scaling",
      "guidanceCategory": "user-experience",
      "summary": "Touch-target accessibility fails despite successful viewport reflow.",
      "evidence": "The 360px layouts do not overflow, but Lighthouse identifies multiple 14px-high footer targets with insufficient spacing.",
      "suggestedFix": "Preserve the good reflow while increasing interactive target dimensions and spacing across zoomed/narrow layouts.",
      "effort": "small",
      "pathId": "home-age-wall",
      "url": "https://es.eporner.com/",
      "artifacts": [
        "evidence/home-lighthouse-summary.json",
        "evidence/home-mobile-layout.json"
      ]
    },
    {
      "id": "F20",
      "severity": "low",
      "confidence": "high",
      "principleId": "follow-best-practices",
      "principleCheckId": "sound-document-and-assets",
      "guidanceId": "html",
      "guidanceCategory": "html",
      "summary": "Images lack intrinsic dimensions and some content images lack alternatives.",
      "evidence": "The entry image audit finds both images unsized; the FAQ audit finds all 23 images unsized and six missing alt values.",
      "suggestedFix": "Add width/height or aspect-ratio and meaningful/empty alt values as appropriate; keep dimensions consistent with responsive CSS.",
      "effort": "small",
      "pathId": "faq",
      "url": "https://es.eporner.com/faq/",
      "artifacts": [
        "evidence/home-images.json",
        "evidence/faq-images.json"
      ]
    },
    {
      "id": "F21",
      "severity": "medium",
      "confidence": "high",
      "principleId": "be-discoverable",
      "principleCheckId": "title-and-description",
      "guidanceId": "html",
      "guidanceCategory": "html",
      "summary": "The public age-verification entry has no meta description.",
      "evidence": "DOM and Lighthouse show a title but no meta[name=description], producing an SEO audit failure.",
      "suggestedFix": "Add a concise, localized description that accurately explains the legal age-verification gate.",
      "effort": "trivial",
      "pathId": "home-age-wall",
      "url": "https://es.eporner.com/",
      "artifacts": [
        "evidence/home-dom.json",
        "evidence/home-lighthouse-summary.json"
      ]
    },
    {
      "id": "F22",
      "severity": "medium",
      "confidence": "high",
      "principleId": "be-discoverable",
      "principleCheckId": "canonical-and-indexing-signals",
      "guidanceId": "html",
      "guidanceCategory": "html",
      "summary": "The entry lacks canonical/localization signals and unknown URLs return false-success pages.",
      "evidence": "The home probe finds no canonical or hreflang; an intentionally nonexistent URL returns HTTP 200 with the age wall.",
      "suggestedFix": "Return real 404 status/content for unknown routes and add canonical plus localized hreflang links to public entry pages.",
      "effort": "medium",
      "pathId": "failure-route",
      "url": "https://es.eporner.com/this-route-should-not-exist-web-uplift",
      "artifacts": [
        "evidence/routes-probe.json",
        "evidence/home-platform-probe.json"
      ]
    },
    {
      "id": "F23",
      "severity": "low",
      "confidence": "high",
      "principleId": "be-discoverable",
      "principleCheckId": "structured-and-shareable-metadata",
      "guidanceId": "html",
      "guidanceCategory": "html",
      "summary": "The public entry exposes no share-preview or structured metadata.",
      "evidence": "The metadata probe found no Open Graph title/description/image and no JSON-LD.",
      "suggestedFix": "Add accurate localized Open Graph metadata and Organization/WebSite JSON-LD where it reflects visible content.",
      "effort": "small",
      "pathId": "home-age-wall",
      "url": "https://es.eporner.com/",
      "artifacts": [
        "evidence/home-platform-probe.json"
      ]
    },
    {
      "id": "F24",
      "severity": "high",
      "confidence": "high",
      "principleId": "be-private-and-secure",
      "principleCheckId": "secure-transport-and-headers",
      "guidanceId": "security",
      "guidanceCategory": "security",
      "summary": "Transport is HTTPS, but CSP and cookie protections are insufficient.",
      "evidence": "CSP only upgrades insecure requests; epcolor lacks Secure and uses SameSite=None, while EPRNS also uses SameSite=None.",
      "suggestedFix": "Deploy a restrictive nonce/hash-based CSP and set Secure plus Lax/Strict SameSite on cookies unless cross-site use is demonstrably required.",
      "effort": "medium",
      "pathId": "home-age-wall",
      "url": "https://es.eporner.com/",
      "artifacts": [
        "evidence/home-headers.json",
        "evidence/home-cookies.json"
      ]
    },
    {
      "id": "F25",
      "severity": "medium",
      "confidence": "high",
      "principleId": "be-private-and-secure",
      "principleCheckId": "in-context-permissions-and-modern-auth",
      "guidanceId": "passkeys",
      "guidanceCategory": "passkeys",
      "summary": "Account authentication offers federated/password paths but no phishing-resistant passkey path.",
      "evidence": "The registration modal exposes social/password account options; source/probes show no WebAuthn/passkey affordance. Camera permission is at least deferred to an explicit button.",
      "suggestedFix": "Add passkey registration and authentication alongside existing options, with conditional UI where supported.",
      "effort": "large",
      "pathId": "age-registration-flow",
      "url": "https://es.eporner.com/",
      "artifacts": [
        "evidence/verify-modal-frame.png",
        "evidence/register-form-probe.json"
      ]
    },
    {
      "id": "F26",
      "severity": "medium",
      "confidence": "high",
      "principleId": "be-private-and-secure",
      "principleCheckId": "defensive-browser-policies",
      "guidanceId": "security",
      "guidanceCategory": "security",
      "summary": "Defensive response policies are incomplete.",
      "evidence": "Header inspection finds no X-Content-Type-Options or Referrer-Policy; Permissions-Policy grants broad client-hint access and CSP lacks frame-ancestors/Trusted Types restrictions.",
      "suggestedFix": "Add nosniff, a strict Referrer-Policy, least-privilege Permissions-Policy and CSP frame-ancestors; evaluate Trusted Types for the script-heavy account UI.",
      "effort": "medium",
      "pathId": "home-age-wall",
      "url": "https://es.eporner.com/",
      "artifacts": [
        "evidence/home-headers.json",
        "evidence/home-cookies.json"
      ]
    },
    {
      "id": "F27",
      "severity": "medium",
      "confidence": "high",
      "principleId": "be-resilient",
      "principleCheckId": "network-and-http-failure-states",
      "guidanceId": "conditional-async-dependencies",
      "guidanceCategory": "performance",
      "summary": "Unknown routes fail silently as a successful age-wall response.",
      "evidence": "The intentional nonexistent route returned HTTP 200 and the normal age-verification HTML instead of a 404/recovery page.",
      "suggestedFix": "Return correct error status codes and a localized recovery page with useful navigation; apply equivalent intentional states to fetch/network failures.",
      "effort": "medium",
      "pathId": "failure-route",
      "url": "https://es.eporner.com/this-route-should-not-exist-web-uplift",
      "artifacts": [
        "evidence/routes-probe.json"
      ]
    },
    {
      "id": "F28",
      "severity": "high",
      "confidence": "high",
      "principleId": "be-internationalised",
      "principleCheckId": "lang-dir-and-logical-properties",
      "guidanceId": "translator",
      "guidanceCategory": "built-in-ai",
      "summary": "Critical content is English on the Spanish host, and the entry has no language declaration.",
      "evidence": "The age wall and legal documents are English at es.eporner.com; the entry html lang is empty, while terms declares es despite English headings/body.",
      "suggestedFix": "Translate the complete gate and policy templates, set accurate per-page lang, and use logical properties so localized layouts remain robust.",
      "effort": "large",
      "pathId": "home-age-wall",
      "url": "https://es.eporner.com/",
      "artifacts": [
        "evidence/terms-mobile.png",
        "evidence/privacy-mobile.png",
        "evidence/home-platform-probe.json",
        "evidence/terms-probe.json"
      ]
    },
    {
      "id": "F29",
      "severity": "high",
      "confidence": "high",
      "principleId": "be-trustworthy",
      "principleCheckId": "no-dark-patterns",
      "guidanceId": "custom-button-actions",
      "guidanceCategory": "user-experience",
      "summary": "The age CTA conceals an account-creation requirement, and cookie consent is implied.",
      "evidence": "“Let’s Get You Verified” unexpectedly opens registration; support pages say continued use accepts cookies and offer only an X, with no reject choice.",
      "suggestedFix": "Separate age verification from account acquisition, disclose every prerequisite before the CTA, and provide symmetric consent choices without implied acceptance.",
      "effort": "large",
      "pathId": "age-registration-flow",
      "url": "https://es.eporner.com/",
      "artifacts": [
        "evidence/verify-modal-frame.png",
        "evidence/terms-mobile.png"
      ]
    },
    {
      "id": "F30",
      "severity": "high",
      "confidence": "high",
      "principleId": "be-trustworthy",
      "principleCheckId": "humane-error-handling",
      "guidanceId": "accessible-error-announcement",
      "guidanceCategory": "accessibility",
      "summary": "Registration validation is neither field-complete nor accessibly announced.",
      "evidence": "Empty submit reports only a password-length message, uses no required attributes/aria-invalid, and does not expose the error as a live alert.",
      "suggestedFix": "Use required/type=email constraints plus post-interaction validation, field-specific messages, error summary, aria-describedby and live announcement.",
      "effort": "medium",
      "pathId": "age-registration-flow",
      "url": "https://es.eporner.com/",
      "artifacts": [
        "evidence/register-empty-submit.json"
      ]
    },
    {
      "id": "F31",
      "severity": "medium",
      "confidence": "high",
      "principleId": "be-trustworthy",
      "principleCheckId": "trustworthy-input-assistance",
      "guidanceId": "autofill-sign-up-form",
      "guidanceCategory": "forms",
      "summary": "The signup form actively disables useful autofill.",
      "evidence": "Login, password, confirmation and email fields all use autocomplete=off; none provide username, new-password or email tokens.",
      "suggestedFix": "Use username, new-password and email autocomplete tokens and appropriate input types so password managers and browser autofill can assist.",
      "effort": "small",
      "pathId": "age-registration-flow",
      "url": "https://es.eporner.com/",
      "artifacts": [
        "evidence/register-form-probe.json"
      ]
    },
    {
      "id": "F32",
      "severity": "medium",
      "confidence": "high",
      "principleId": "be-trustworthy",
      "principleCheckId": "safe-commercial-and-account-flows",
      "guidanceId": "passkey-management",
      "guidanceCategory": "passkeys",
      "summary": "The account flow is disproportionate to the requested age check and lacks a modern, clearly reversible path.",
      "evidence": "The gate forces registration before verification; the visible modal offers password/social registration but no passkey and no clearly labelled cancel action in the captured surface.",
      "suggestedFix": "Make account creation optional, add an explicit cancel/back action with focus return, and support passkeys for users who choose an account.",
      "effort": "large",
      "pathId": "age-registration-flow",
      "url": "https://es.eporner.com/",
      "artifacts": [
        "evidence/verify-modal-frame.png"
      ]
    },
    {
      "id": "F33",
      "severity": "low",
      "confidence": "high",
      "principleId": "be-sustainable",
      "principleCheckId": "optimised-assets",
      "guidanceId": "optimize-image-priority",
      "guidanceCategory": "performance",
      "summary": "Image delivery misses basic dimension and format efficiencies.",
      "evidence": "The FAQ image audit finds 23 unsized images, seven legacy-format assets and no responsive source data for content thumbnails; the entry uses an unsized GIF.",
      "suggestedFix": "Serve responsive AVIF/WebP sources where appropriate, include intrinsic dimensions, and avoid legacy GIF/JPEG when a lighter format preserves the content.",
      "effort": "medium",
      "pathId": "faq",
      "url": "https://es.eporner.com/faq/",
      "artifacts": [
        "evidence/faq-images.json",
        "evidence/home-images.json",
        "evidence/home-summary.json"
      ]
    }
  ],
  "taskList": [
    {
      "id": "T01",
      "title": "Make age verification direct, transparent and optional-account",
      "priority": 1,
      "findingIds": [
        "F11",
        "F12",
        "F29",
        "F32"
      ],
      "guidanceId": "forms",
      "status": "open"
    },
    {
      "id": "T02",
      "title": "Rebuild modal and registration semantics, validation and autofill",
      "priority": 2,
      "findingIds": [
        "F07",
        "F15",
        "F17",
        "F30",
        "F31"
      ],
      "guidanceId": "declarative-dialog-popover-control",
      "status": "open"
    },
    {
      "id": "T03",
      "title": "Fully localize the Spanish gate and policy templates",
      "priority": 3,
      "findingIds": [
        "F28"
      ],
      "guidanceId": "translator",
      "status": "open"
    },
    {
      "id": "T04",
      "title": "Fix visual accessibility, target sizes and reading comfort",
      "priority": 4,
      "findingIds": [
        "F03",
        "F10",
        "F16",
        "F18",
        "F19"
      ],
      "guidanceId": "accessibility",
      "status": "open"
    },
    {
      "id": "T05",
      "title": "Harden CSP, browser policies and cookie attributes",
      "priority": 5,
      "findingIds": [
        "F24",
        "F26"
      ],
      "guidanceId": "security",
      "status": "open"
    },
    {
      "id": "T06",
      "title": "Honor color, motion and contrast preferences",
      "priority": 6,
      "findingIds": [
        "F01",
        "F02"
      ],
      "guidanceId": "dark-mode",
      "status": "open"
    },
    {
      "id": "T07",
      "title": "Split and defer the age-wall CSS/JavaScript payload",
      "priority": 7,
      "findingIds": [
        "F13",
        "F14"
      ],
      "guidanceId": "optimize-script-priority",
      "status": "open"
    },
    {
      "id": "T08",
      "title": "Correct entry metadata, canonicalization and 404 behavior",
      "priority": 8,
      "findingIds": [
        "F21",
        "F22",
        "F23",
        "F27"
      ],
      "guidanceId": "html",
      "status": "open"
    },
    {
      "id": "T09",
      "title": "Remove obstructive chrome and implement honest cookie consent",
      "priority": 9,
      "findingIds": [
        "F06",
        "F08"
      ],
      "guidanceId": "light-dismiss-a-dialog",
      "status": "open"
    },
    {
      "id": "T10",
      "title": "Add intrinsic dimensions and modern responsive image delivery",
      "priority": 10,
      "findingIds": [
        "F20",
        "F33"
      ],
      "guidanceId": "optimize-image-priority",
      "status": "open"
    },
    {
      "id": "T11",
      "title": "Add proportionate modern responsive and transition cues",
      "priority": 11,
      "findingIds": [
        "F04",
        "F05",
        "F09"
      ],
      "guidanceId": "same-document-transitions",
      "status": "open"
    },
    {
      "id": "T12",
      "title": "Offer passkey authentication for users choosing an account",
      "priority": 12,
      "findingIds": [
        "F25"
      ],
      "guidanceId": "passkeys",
      "status": "open"
    }
  ],
  "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": "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": "DOM/CSS probe found no color-scheme declaration or prefers-color-scheme rule; dark-emulation output is byte-identical in size to the default capture.",
      "pathIds": [
        "home-age-wall"
      ],
      "artifacts": [
        "evidence/home-dark.png",
        "evidence/home-platform-probe.json"
      ],
      "findingIds": [
        "F01"
      ]
    },
    {
      "principleId": "respect-user-preferences",
      "checkId": "respects-reduced-motion",
      "status": "issues",
      "confidence": "high",
      "method": "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": "Under prefers-reduced-motion: reduce, the SVG still contains an indefinite 3-second animate element and no reduced-motion CSS is present.",
      "pathIds": [
        "home-age-wall"
      ],
      "artifacts": [
        "evidence/reduced-motion-probe.json"
      ],
      "findingIds": [
        "F02"
      ]
    },
    {
      "principleId": "respect-user-preferences",
      "checkId": "respects-contrast",
      "status": "issues",
      "confidence": "high",
      "method": "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": "The platform probe found no prefers-contrast/forced-colors rules; the increased-contrast screenshot is visually unchanged, while Lighthouse also identifies a 3.83:1 text contrast failure.",
      "pathIds": [
        "home-age-wall"
      ],
      "artifacts": [
        "evidence/home-high-contrast.png",
        "evidence/home-platform-probe.json"
      ],
      "findingIds": [
        "F03"
      ]
    },
    {
      "principleId": "implement-natural-interactions",
      "checkId": "view-transitions",
      "status": "issues",
      "confidence": "high",
      "method": "a transition video of a route/state change shows whether it animates; the page source / ::view-transition usage corroborates. The model chooses.",
      "evidence": "The interaction video shows the registration surface appearing without a directional or same-document transition; CSS inspection found no view-transition usage.",
      "pathIds": [
        "age-registration-flow"
      ],
      "artifacts": [
        "evidence/verify-interaction.mp4",
        "evidence/home-platform-probe.json"
      ],
      "findingIds": [
        "F04"
      ]
    },
    {
      "principleId": "implement-natural-interactions",
      "checkId": "scroll-driven-animations",
      "status": "not-applicable",
      "confidence": "high",
      "method": "Recon and DOM/interaction inspection for a matching feature or user task.",
      "evidence": "No applicable feature or task was present.",
      "reason": "No parallax, scrollytelling, reveal, carousel, or other scroll-linked animation exists on the representative pages."
    },
    {
      "principleId": "implement-natural-interactions",
      "checkId": "physical-gestures",
      "status": "not-applicable",
      "confidence": "high",
      "method": "Recon and DOM/interaction inspection for a matching feature or user task.",
      "evidence": "No applicable feature or task was present.",
      "reason": "No custom swipe, pull, drag, snap-carousel, or gesture-driven control exists in the exercised public journey."
    },
    {
      "principleId": "provide-guided-navigation",
      "checkId": "scroll-state-aware-chrome",
      "status": "issues",
      "confidence": "high",
      "method": "a transition video of scrolling, or CSS inspection for scroll-state container queries. The model chooses.",
      "evidence": "The 10,158px-high terms template has static header/chrome; CSS inspection found no scroll-state query, progress indicator, or scroll-driven state.",
      "pathIds": [
        "terms"
      ],
      "artifacts": [
        "evidence/terms-mobile-layout.json",
        "evidence/home-platform-probe.json"
      ],
      "findingIds": [
        "F05"
      ]
    },
    {
      "principleId": "provide-guided-navigation",
      "checkId": "anchored-positioning",
      "status": "not-applicable",
      "confidence": "high",
      "method": "Recon and DOM/interaction inspection for a matching feature or user task.",
      "evidence": "No applicable feature or task was present.",
      "reason": "No tooltip, trigger-attached popover, or edge-positioned menu requiring anchor positioning appears in the representative journey; the centered modal is judged separately."
    },
    {
      "principleId": "provide-guided-navigation",
      "checkId": "directs-attention",
      "status": "pass",
      "confidence": "high",
      "method": "CSS inspection for ::highlight / scroll-marker; a transition video can show whether attention is cued after navigation. The model chooses.",
      "evidence": "The CTA overlay visibly dims the background and focus moves to the first registration input, making the change of attention apparent.",
      "pathIds": [
        "terms",
        "age-registration-flow"
      ],
      "artifacts": [
        "evidence/verify-interaction.mp4",
        "evidence/verify-visible-state.json"
      ]
    },
    {
      "principleId": "maximize-content-reduce-noise",
      "checkId": "no-intrusive-interruptions",
      "status": "issues",
      "confidence": "high",
      "method": "a screenshot on load, or a DOM probe for full-viewport overlays present before interaction. The model chooses.",
      "evidence": "Terms, privacy, and FAQ screenshots show a fixed banner covering the bottom lines of content; it says continued use accepts cookies and exposes only “[ X ]”.",
      "pathIds": [
        "terms"
      ],
      "artifacts": [
        "evidence/terms-mobile.png",
        "evidence/privacy-mobile.png",
        "evidence/faq-mobile.png"
      ],
      "findingIds": [
        "F06"
      ]
    },
    {
      "principleId": "maximize-content-reduce-noise",
      "checkId": "semantic-dismissible-primitives",
      "status": "issues",
      "confidence": "high",
      "method": "DOM/source inspection for popover / <dialog> / <details> vs custom overlay divs with manual dismiss handling. The model chooses.",
      "evidence": "The interaction frame shows a modal overlay, but the visible-state probe finds no dialog element or role=dialog; it is built with SimpleModal-style divs.",
      "pathIds": [
        "age-registration-flow"
      ],
      "artifacts": [
        "evidence/verify-modal-frame.png",
        "evidence/verify-interaction.mp4"
      ],
      "findingIds": [
        "F07"
      ]
    },
    {
      "principleId": "maximize-content-reduce-noise",
      "checkId": "reduced-chrome",
      "status": "issues",
      "confidence": "high",
      "method": "a screenshot plus layout metrics can show the proportion of the viewport given to chrome vs content. The model chooses.",
      "evidence": "FAQ begins with header plus a two-tile ad and ends under a cookie overlay; policy screenshots show content hidden behind persistent chrome.",
      "pathIds": [
        "faq"
      ],
      "artifacts": [
        "evidence/faq-mobile.png",
        "evidence/terms-mobile.png"
      ],
      "findingIds": [
        "F08"
      ]
    },
    {
      "principleId": "adapt-to-the-form-factor",
      "checkId": "responsive-no-horizontal-scroll",
      "status": "pass",
      "confidence": "high",
      "method": "layout metrics (scrollWidth vs innerWidth) and a screenshot at an emulated narrow mobile viewport reveal overflow. The model chooses.",
      "evidence": "Layout primitives report 0px horizontal overflow at 360x800 on both the entry and 10,158px terms page; viewport meta is present.",
      "pathIds": [
        "home-age-wall",
        "terms"
      ],
      "artifacts": [
        "evidence/home-mobile-layout.json",
        "evidence/terms-mobile-layout.json"
      ]
    },
    {
      "principleId": "adapt-to-the-form-factor",
      "checkId": "component-level-responsiveness",
      "status": "issues",
      "confidence": "high",
      "method": "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": "CSS inspection found no @container/container-type usage across the reused age-card and content templates.",
      "pathIds": [
        "home-age-wall"
      ],
      "artifacts": [
        "evidence/home-platform-probe.json"
      ],
      "findingIds": [
        "F09"
      ]
    },
    {
      "principleId": "adapt-to-the-form-factor",
      "checkId": "input-modality-aware",
      "status": "issues",
      "confidence": "high",
      "method": "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": "The focus/geometry probe measured every footer link at 14px high; Lighthouse target-size reports less than the required 24px size/spacing.",
      "pathIds": [
        "home-age-wall"
      ],
      "artifacts": [
        "evidence/home-mobile.png",
        "evidence/home-platform-probe.json"
      ],
      "findingIds": [
        "F10"
      ]
    },
    {
      "principleId": "support-core-task-success",
      "checkId": "clear-purpose-and-primary-action",
      "status": "pass",
      "confidence": "high",
      "method": "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": "The first viewport plainly states the legal age gate and presents one visually dominant verification CTA plus a separate login action.",
      "pathIds": [
        "home-age-wall"
      ],
      "artifacts": [
        "evidence/home-desktop.png"
      ]
    },
    {
      "principleId": "support-core-task-success",
      "checkId": "primary-flow-completion",
      "status": "issues",
      "confidence": "high",
      "method": "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": "The age wall promises age verification and “no ID required,” but its CTA opens a “Register for free” account form before any age check, an undisclosed detour in the core journey.",
      "pathIds": [
        "age-registration-flow"
      ],
      "artifacts": [
        "evidence/verify-modal-frame.png",
        "evidence/verify-interaction.mp4"
      ],
      "findingIds": [
        "F11"
      ]
    },
    {
      "principleId": "support-core-task-success",
      "checkId": "clear-system-state-and-recovery",
      "status": "issues",
      "confidence": "high",
      "method": "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": "Submitting the empty visible registration form reports only a password-length error, leaves all fields valid with no aria-invalid, and exposes no role=alert/live announcement.",
      "pathIds": [
        "age-registration-flow"
      ],
      "artifacts": [
        "evidence/register-empty-submit.json"
      ],
      "findingIds": [
        "F12"
      ]
    },
    {
      "principleId": "be-fast-and-stable",
      "checkId": "good-core-web-vitals",
      "status": "pass",
      "confidence": "high",
      "method": "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": "Trace reports LCP 1.41s, no long tasks and TBT 0; Lighthouse lab LCP is 2.2s with CLS 0 and performance score 96.",
      "pathIds": [
        "home-age-wall"
      ],
      "artifacts": [
        "evidence/home-trace-summary.json",
        "evidence/home-lighthouse-summary.json"
      ]
    },
    {
      "principleId": "be-fast-and-stable",
      "checkId": "visual-stability",
      "status": "pass",
      "confidence": "high",
      "method": "the layout primitive's CLS observer captures shifts; a transition video of the first seconds shows content jumping. The model chooses.",
      "evidence": "Both layout observers and Lighthouse report CLS 0; narrow screenshots show reserved, stable primary layout.",
      "pathIds": [
        "home-age-wall"
      ],
      "artifacts": [
        "evidence/home-mobile-layout.json",
        "evidence/home-lighthouse-summary.json"
      ]
    },
    {
      "principleId": "be-fast-and-stable",
      "checkId": "efficient-main-thread",
      "status": "pass",
      "confidence": "high",
      "method": "the layout primitive records long tasks; a heap summary shows the object population; Lighthouse reports TBT. The model chooses.",
      "evidence": "Trace and layout observers recorded no long tasks and total blocking time 0 during load.",
      "pathIds": [
        "home-age-wall"
      ],
      "artifacts": [
        "evidence/home-trace-summary.json",
        "evidence/home-mobile-layout.json"
      ]
    },
    {
      "principleId": "be-fast-and-stable",
      "checkId": "efficient-resource-delivery",
      "status": "issues",
      "confidence": "high",
      "method": "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": "Lighthouse identifies two synchronous scripts plus the stylesheet as render-blocking with up to 1,280ms estimated savings; the longest critical chain is 913ms.",
      "pathIds": [
        "home-age-wall"
      ],
      "artifacts": [
        "evidence/home-lighthouse-summary.json",
        "evidence/home.har"
      ],
      "findingIds": [
        "F13"
      ]
    },
    {
      "principleId": "be-fast-and-stable",
      "checkId": "trim-unused-and-duplicate-code",
      "status": "issues",
      "confidence": "high",
      "method": "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": "Lighthouse estimates 31KiB unused CSS (99.8%) and 35KiB unused JavaScript (84.9%) on this small gate.",
      "pathIds": [
        "home-age-wall"
      ],
      "artifacts": [
        "evidence/home-lighthouse-summary.json",
        "evidence/home.har"
      ],
      "findingIds": [
        "F14"
      ]
    },
    {
      "principleId": "be-inclusive",
      "checkId": "names-roles-labels",
      "status": "issues",
      "confidence": "high",
      "method": "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 flags the logo without alt; the registration form uses placeholder-only inputs with no labels, and the visible modal has no dialog role.",
      "pathIds": [
        "age-registration-flow"
      ],
      "artifacts": [
        "evidence/home-lighthouse-summary.json",
        "evidence/register-form-probe.json",
        "evidence/home-images.json"
      ],
      "findingIds": [
        "F15"
      ]
    },
    {
      "principleId": "be-inclusive",
      "checkId": "sufficient-contrast",
      "status": "issues",
      "confidence": "high",
      "method": "axe contrast rules, a Lighthouse contrast audit, or an in-page probe computing contrast ratios from computed colours. The model chooses.",
      "evidence": "Lighthouse measures #0a910a on #222 at 3.83:1, below the required 4.5:1 for the rendered 19.5px normal-weight text.",
      "pathIds": [
        "home-age-wall"
      ],
      "artifacts": [
        "evidence/home-lighthouse-summary.json"
      ],
      "findingIds": [
        "F16"
      ]
    },
    {
      "principleId": "be-inclusive",
      "checkId": "structure-and-focus",
      "status": "issues",
      "confidence": "high",
      "method": "axe/Lighthouse structural audits; a focus-walk probe (tab through, read activeElement + computed outline) is a first-party alternative. The model chooses.",
      "evidence": "Lighthouse reports no main landmark and a UL containing a direct BR child; the DOM has only an H2 and no landmarks.",
      "pathIds": [
        "home-age-wall"
      ],
      "artifacts": [
        "evidence/home-lighthouse-summary.json",
        "evidence/home-platform-probe.json"
      ],
      "findingIds": [
        "F17"
      ]
    },
    {
      "principleId": "be-inclusive",
      "checkId": "legible-text",
      "status": "issues",
      "confidence": "high",
      "method": "a screenshot of body and heading text, plus CSS inspection for text-wrap / text alignment / font fallback handling. The model chooses.",
      "evidence": "The terms screenshot shows dense 12.5px copy in a narrow column while the fixed cookie bar covers the current lines.",
      "pathIds": [
        "terms"
      ],
      "artifacts": [
        "evidence/terms-mobile.png"
      ],
      "findingIds": [
        "F18"
      ]
    },
    {
      "principleId": "be-inclusive",
      "checkId": "zoom-reflow-targets-and-media",
      "status": "issues",
      "confidence": "high",
      "method": "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": "The 360px layouts do not overflow, but Lighthouse identifies multiple 14px-high footer targets with insufficient spacing.",
      "pathIds": [
        "home-age-wall"
      ],
      "artifacts": [
        "evidence/home-lighthouse-summary.json",
        "evidence/home-mobile-layout.json"
      ],
      "findingIds": [
        "F19"
      ]
    },
    {
      "principleId": "follow-best-practices",
      "checkId": "no-console-errors",
      "status": "pass",
      "confidence": "high",
      "method": "capture Runtime/Log CDP events, or a probe that reads collected errors; Lighthouse reports this too. The model chooses.",
      "evidence": "Lighthouse best-practices scored 100 and reported no console-error or uncaught-exception audit failure.",
      "pathIds": [
        "home-age-wall"
      ],
      "artifacts": [
        "evidence/home-lighthouse.json"
      ]
    },
    {
      "principleId": "follow-best-practices",
      "checkId": "sound-document-and-assets",
      "status": "issues",
      "confidence": "high",
      "method": "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 entry image audit finds both images unsized; the FAQ audit finds all 23 images unsized and six missing alt values.",
      "pathIds": [
        "faq"
      ],
      "artifacts": [
        "evidence/home-images.json",
        "evidence/faq-images.json"
      ],
      "findingIds": [
        "F20"
      ]
    },
    {
      "principleId": "follow-best-practices",
      "checkId": "browser-platform-hygiene",
      "status": "pass",
      "confidence": "high",
      "method": "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 scored 100; camera is not requested on load and remains behind an explicit Start camera action.",
      "pathIds": [
        "home-age-wall"
      ],
      "artifacts": [
        "evidence/home-lighthouse.json",
        "evidence/verify-visible-state.json"
      ]
    },
    {
      "principleId": "be-discoverable",
      "checkId": "title-and-description",
      "status": "issues",
      "confidence": "high",
      "method": "a DOM probe reads <title> and meta[name=description]; Lighthouse SEO audits cover the same ground. The model chooses.",
      "evidence": "DOM and Lighthouse show a title but no meta[name=description], producing an SEO audit failure.",
      "pathIds": [
        "home-age-wall"
      ],
      "artifacts": [
        "evidence/home-dom.json",
        "evidence/home-lighthouse-summary.json"
      ],
      "findingIds": [
        "F21"
      ]
    },
    {
      "principleId": "be-discoverable",
      "checkId": "crawlable-and-mobile-friendly",
      "status": "pass",
      "confidence": "high",
      "method": "a DOM probe for anchor hrefs, viewport meta, and robots; Lighthouse SEO audits corroborate. The model chooses.",
      "evidence": "Real href links, viewport metadata, permissive root robots rules and a valid sitemap were directly observed.",
      "pathIds": [
        "home-age-wall",
        "terms"
      ],
      "artifacts": [
        "evidence/home-platform-probe.json",
        "evidence/routes-probe.json"
      ]
    },
    {
      "principleId": "be-discoverable",
      "checkId": "canonical-and-indexing-signals",
      "status": "issues",
      "confidence": "high",
      "method": "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": "The home probe finds no canonical or hreflang; an intentionally nonexistent URL returns HTTP 200 with the age wall.",
      "pathIds": [
        "failure-route"
      ],
      "artifacts": [
        "evidence/routes-probe.json",
        "evidence/home-platform-probe.json"
      ],
      "findingIds": [
        "F22"
      ]
    },
    {
      "principleId": "be-discoverable",
      "checkId": "structured-and-shareable-metadata",
      "status": "issues",
      "confidence": "high",
      "method": "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 metadata probe found no Open Graph title/description/image and no JSON-LD.",
      "pathIds": [
        "home-age-wall"
      ],
      "artifacts": [
        "evidence/home-platform-probe.json"
      ],
      "findingIds": [
        "F23"
      ]
    },
    {
      "principleId": "be-private-and-secure",
      "checkId": "secure-transport-and-headers",
      "status": "issues",
      "confidence": "high",
      "method": "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": "CSP only upgrades insecure requests; epcolor lacks Secure and uses SameSite=None, while EPRNS also uses SameSite=None.",
      "pathIds": [
        "home-age-wall"
      ],
      "artifacts": [
        "evidence/home-headers.json",
        "evidence/home-cookies.json"
      ],
      "findingIds": [
        "F24"
      ]
    },
    {
      "principleId": "be-private-and-secure",
      "checkId": "data-minimisation-and-third-parties",
      "status": "pass",
      "confidence": "high",
      "method": "inspect network requests and third-party origins; a probe of analytics/beacon calls. The model chooses.",
      "evidence": "Tracker scan found no known tracker domains, secrets scan found no credentials, and the cold-load HAR is only 8 requests; the verification copy states image processing occurs on device.",
      "pathIds": [
        "home-age-wall"
      ],
      "artifacts": [
        "evidence/home-trackers.json",
        "evidence/home-secrets.json",
        "evidence/home.har"
      ]
    },
    {
      "principleId": "be-private-and-secure",
      "checkId": "in-context-permissions-and-modern-auth",
      "status": "issues",
      "confidence": "high",
      "method": "a probe for permission requests fired on load; source inspection for passkey / WebAuthn / navigator.credentials usage in auth flows. The model chooses.",
      "evidence": "The registration modal exposes social/password account options; source/probes show no WebAuthn/passkey affordance. Camera permission is at least deferred to an explicit button.",
      "pathIds": [
        "age-registration-flow"
      ],
      "artifacts": [
        "evidence/verify-modal-frame.png",
        "evidence/register-form-probe.json"
      ],
      "findingIds": [
        "F25"
      ]
    },
    {
      "principleId": "be-private-and-secure",
      "checkId": "defensive-browser-policies",
      "status": "issues",
      "confidence": "high",
      "method": "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": "Header inspection finds no X-Content-Type-Options or Referrer-Policy; Permissions-Policy grants broad client-hint access and CSP lacks frame-ancestors/Trusted Types restrictions.",
      "pathIds": [
        "home-age-wall"
      ],
      "artifacts": [
        "evidence/home-headers.json",
        "evidence/home-cookies.json"
      ],
      "findingIds": [
        "F26"
      ]
    },
    {
      "principleId": "be-resilient",
      "checkId": "progressive-enhancement",
      "status": "pass",
      "confidence": "high",
      "method": "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": "Discoverability probes show 100% raw-HTML content coverage for the entry and terms page, with no JS shell.",
      "pathIds": [
        "home-age-wall",
        "age-registration-flow"
      ],
      "artifacts": [
        "evidence/home-discoverability.json",
        "evidence/terms-discoverability.json"
      ]
    },
    {
      "principleId": "be-resilient",
      "checkId": "resilient-runtime-behaviour",
      "status": "pass",
      "confidence": "high",
      "method": "exercise menus near viewport edges with a screenshot; a probe of async/visibility behaviour. The model chooses.",
      "evidence": "The exercised registration overlay remained centered and stable, and focus moved into the first form control after asynchronous loading.",
      "pathIds": [
        "home-age-wall",
        "age-registration-flow"
      ],
      "artifacts": [
        "evidence/verify-interaction.mp4",
        "evidence/verify-visible-state.json"
      ]
    },
    {
      "principleId": "be-resilient",
      "checkId": "offline-and-installable",
      "status": "not-applicable",
      "confidence": "high",
      "method": "Recon and DOM/interaction inspection for a matching feature or user task.",
      "evidence": "No applicable feature or task was present.",
      "reason": "Streaming adult media and live age/account services are intrinsically online; installability/offline app behavior is not a declared or necessary public task."
    },
    {
      "principleId": "be-resilient",
      "checkId": "network-and-http-failure-states",
      "status": "issues",
      "confidence": "high",
      "method": "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": "The intentional nonexistent route returned HTTP 200 and the normal age-verification HTML instead of a 404/recovery page.",
      "pathIds": [
        "failure-route"
      ],
      "artifacts": [
        "evidence/routes-probe.json"
      ],
      "findingIds": [
        "F27"
      ]
    },
    {
      "principleId": "be-internationalised",
      "checkId": "lang-dir-and-logical-properties",
      "status": "issues",
      "confidence": "high",
      "method": "a DOM probe for <html lang>/dir and CSS inspection for logical vs physical properties. The model chooses.",
      "evidence": "The age wall and legal documents are English at es.eporner.com; the entry html lang is empty, while terms declares es despite English headings/body.",
      "pathIds": [
        "home-age-wall"
      ],
      "artifacts": [
        "evidence/terms-mobile.png",
        "evidence/privacy-mobile.png",
        "evidence/home-platform-probe.json",
        "evidence/terms-probe.json"
      ],
      "findingIds": [
        "F28"
      ]
    },
    {
      "principleId": "be-internationalised",
      "checkId": "locale-aware-data",
      "status": "not-applicable",
      "confidence": "high",
      "method": "Recon and DOM/interaction inspection for a matching feature or user task.",
      "evidence": "No applicable feature or task was present.",
      "reason": "Representative pages expose no user-facing dates, currencies, localized numbers, durations or calendars to format."
    },
    {
      "principleId": "be-internationalised",
      "checkId": "time-zone-correctness",
      "status": "not-applicable",
      "confidence": "high",
      "method": "Recon and DOM/interaction inspection for a matching feature or user task.",
      "evidence": "No applicable feature or task was present.",
      "reason": "Representative public pages expose no event scheduling or time-zone-sensitive values."
    },
    {
      "principleId": "be-trustworthy",
      "checkId": "no-dark-patterns",
      "status": "issues",
      "confidence": "high",
      "method": "a screenshot of consent/upsell/cancel flows; source inspection for declarative button actions vs misleading controls. The model chooses.",
      "evidence": "“Let’s Get You Verified” unexpectedly opens registration; support pages say continued use accepts cookies and offer only an X, with no reject choice.",
      "pathIds": [
        "age-registration-flow"
      ],
      "artifacts": [
        "evidence/verify-modal-frame.png",
        "evidence/terms-mobile.png"
      ],
      "findingIds": [
        "F29"
      ]
    },
    {
      "principleId": "be-trustworthy",
      "checkId": "humane-error-handling",
      "status": "issues",
      "confidence": "high",
      "method": "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 submit reports only a password-length message, uses no required attributes/aria-invalid, and does not expose the error as a live alert.",
      "pathIds": [
        "age-registration-flow"
      ],
      "artifacts": [
        "evidence/register-empty-submit.json"
      ],
      "findingIds": [
        "F30"
      ]
    },
    {
      "principleId": "be-trustworthy",
      "checkId": "trustworthy-input-assistance",
      "status": "issues",
      "confidence": "high",
      "method": "source/DOM inspection for autocomplete attributes on form fields; a probe of autofill affordances. The model chooses.",
      "evidence": "Login, password, confirmation and email fields all use autocomplete=off; none provide username, new-password or email tokens.",
      "pathIds": [
        "age-registration-flow"
      ],
      "artifacts": [
        "evidence/register-form-probe.json"
      ],
      "findingIds": [
        "F31"
      ]
    },
    {
      "principleId": "be-trustworthy",
      "checkId": "safe-commercial-and-account-flows",
      "status": "issues",
      "confidence": "high",
      "method": "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": "The gate forces registration before verification; the visible modal offers password/social registration but no passkey and no clearly labelled cancel action in the captured surface.",
      "pathIds": [
        "age-registration-flow"
      ],
      "artifacts": [
        "evidence/verify-modal-frame.png"
      ],
      "findingIds": [
        "F32"
      ]
    },
    {
      "principleId": "be-sustainable",
      "checkId": "optimised-assets",
      "status": "issues",
      "confidence": "high",
      "method": "inspect transferred image bytes vs displayed size; source inspection for modern formats and resolution handling. The model chooses.",
      "evidence": "The FAQ image audit finds 23 unsized images, seven legacy-format assets and no responsive source data for content thumbnails; the entry uses an unsized GIF.",
      "pathIds": [
        "faq"
      ],
      "artifacts": [
        "evidence/faq-images.json",
        "evidence/home-images.json",
        "evidence/home-summary.json"
      ],
      "findingIds": [
        "F33"
      ]
    },
    {
      "principleId": "be-sustainable",
      "checkId": "no-wasteful-work",
      "status": "pass",
      "confidence": "high",
      "method": "a long-task / network probe for background fetches and processing while idle or backgrounded. The model chooses.",
      "evidence": "The entry makes 8 requests/277,872 bytes and trace/layout evidence recorded no long tasks or continuing main-thread load work.",
      "pathIds": [
        "home-age-wall"
      ],
      "artifacts": [
        "evidence/home-summary.json",
        "evidence/home-trace-summary.json"
      ]
    },
    {
      "principleId": "be-sustainable",
      "checkId": "third-party-and-media-budget",
      "status": "pass",
      "confidence": "high",
      "method": "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": "No autoplay media or known trackers load on the gate; third-party-looking hosts are eporner.com subdomains and the total cold-load transfer is 278KB.",
      "pathIds": [
        "home-age-wall"
      ],
      "artifacts": [
        "evidence/home-trackers.json",
        "evidence/home-summary.json"
      ]
    },
    {
      "principleId": "be-agent-ready",
      "checkId": "structured-agent-capabilities",
      "status": "not-applicable",
      "confidence": "high",
      "method": "Recon and DOM/interaction inspection for a matching feature or user task.",
      "evidence": "No applicable feature or task was present.",
      "reason": "No evidence indicates this public media site intends to expose transactional or productivity capabilities to AI agents; absence is an emerging opportunity, not a failure."
    },
    {
      "principleId": "be-agent-ready",
      "checkId": "on-device-inference",
      "status": "not-applicable",
      "confidence": "high",
      "method": "Recon and DOM/interaction inspection for a matching feature or user task.",
      "evidence": "No applicable feature or task was present.",
      "reason": "No user task in the audited public surfaces calls for language-model or summarizer inference; the age-estimation model is a different, purpose-specific local model."
    },
    {
      "principleId": "be-memory-efficient",
      "checkId": "no-leak-under-repeated-interaction",
      "status": "pass",
      "confidence": "medium",
      "method": "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",
      "evidence": "After one modal interaction the heap was 33,552,152 bytes/141,325 nodes; after ten attempts it was 33,798,066 bytes/143,707 nodes, only 0.7%/1.7% higher rather than repeated one-time growth.",
      "pathIds": [
        "age-registration-flow"
      ],
      "artifacts": [
        "evidence/heap-after-one-modal.json",
        "evidence/heap-post-modal.json"
      ]
    },
    {
      "principleId": "be-memory-efficient",
      "checkId": "bounded-footprint",
      "status": "pass",
      "confidence": "medium",
      "method": "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 is 4.2MB; after loading the account and on-device age-model UI once, the retained heap plateaus near 33.8MB, proportionate to that feature.",
      "pathIds": [
        "age-registration-flow"
      ],
      "artifacts": [
        "evidence/heap-baseline.json",
        "evidence/heap-post-modal.json"
      ]
    },
    {
      "principleId": "be-memory-efficient",
      "checkId": "no-detached-dom-or-unbounded-listeners",
      "status": "pass",
      "confidence": "medium",
      "method": "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 cach",
      "evidence": "Heap summaries show no Detached* constructor among top retained constructors and only small growth from one to ten repeated interactions.",
      "pathIds": [
        "age-registration-flow"
      ],
      "artifacts": [
        "evidence/heap-after-one-modal.json",
        "evidence/heap-post-modal.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",
        "F08"
      ]
    },
    {
      "principleId": "adapt-to-the-form-factor",
      "expectation": "default",
      "status": "issues",
      "findingIds": [
        "F09",
        "F10"
      ]
    },
    {
      "principleId": "support-core-task-success",
      "expectation": "default",
      "status": "issues",
      "findingIds": [
        "F11",
        "F12"
      ]
    },
    {
      "principleId": "be-fast-and-stable",
      "expectation": "default",
      "status": "issues",
      "findingIds": [
        "F13",
        "F14"
      ]
    },
    {
      "principleId": "be-inclusive",
      "expectation": "default",
      "status": "issues",
      "findingIds": [
        "F15",
        "F16",
        "F17",
        "F18",
        "F19"
      ]
    },
    {
      "principleId": "follow-best-practices",
      "expectation": "default",
      "status": "issues",
      "findingIds": [
        "F20"
      ]
    },
    {
      "principleId": "be-discoverable",
      "expectation": "default",
      "status": "issues",
      "findingIds": [
        "F21",
        "F22",
        "F23"
      ]
    },
    {
      "principleId": "be-private-and-secure",
      "expectation": "default",
      "status": "issues",
      "findingIds": [
        "F24",
        "F25",
        "F26"
      ]
    },
    {
      "principleId": "be-resilient",
      "expectation": "contextual",
      "status": "issues",
      "findingIds": [
        "F27"
      ]
    },
    {
      "principleId": "be-internationalised",
      "expectation": "contextual",
      "status": "issues",
      "findingIds": [
        "F28"
      ]
    },
    {
      "principleId": "be-trustworthy",
      "expectation": "default",
      "status": "issues",
      "findingIds": [
        "F29",
        "F30",
        "F31",
        "F32"
      ]
    },
    {
      "principleId": "be-sustainable",
      "expectation": "contextual",
      "status": "issues",
      "findingIds": [
        "F33"
      ]
    },
    {
      "principleId": "be-agent-ready",
      "expectation": "contextual",
      "status": "not-applicable",
      "reason": "No evidence indicates this public media site intends to expose transactional or productivity capabilities to AI agents; absence is an emerging opportunity, not a failure. No user task in the audited public surfaces calls for language-model or summarizer inference; the age-estimation model is a different, purpose-specific local model."
    },
    {
      "principleId": "be-memory-efficient",
      "expectation": "default",
      "status": "pass"
    }
  ],
  "budget": {
    "wallClockSeconds": 2100,
    "pathCount": 6,
    "auditPasses": 1
  },
  "agent": "pi",
  "runId": "2026-07-21T08-29-52-681Z"
}
