{
  "url": "https://ads.google.com",
  "auditedAt": "2026-07-23T14:39:00.000Z",
  "mode": "report",
  "status": "completed",
  "statusDetail": "Complete atomic audit of 58 checks across five representative public templates plus signup handoff and failure recovery. Authenticated account, campaign creation, billing, and cancellation were excluded because credentials were not provided.",
  "page": {
    "appType": "mpa",
    "framework": "server-rendered Google marketing CMS with client widgets",
    "notes": "ads.google.com redirects GB visitors through consent and then to business.google.com/uk/google-ads/. The direct destination is server-rendered; authenticated Google Ads application surfaces were not entered."
  },
  "evidenceUsed": [
    "screenshot",
    "video",
    "layout-metrics",
    "dom",
    "evaluate-probe",
    "trace",
    "har",
    "discoverability",
    "headers",
    "cookies",
    "trackers",
    "images",
    "secrets",
    "heap-summary",
    "lighthouse",
    "robots/sitemap HTTP"
  ],
  "guidanceConsulted": [
    "dark-mode",
    "accessibility",
    "adapt-scrollbar-to-contrast-preferences",
    "same-document-transitions",
    "scrollytelling",
    "physics-based-easing",
    "shrinking-header-on-scroll",
    "anchor-positioning-tab-underline",
    "directional-navigation-transitions",
    "light-dismiss-a-dialog",
    "declarative-dialog-popover-control",
    "complex-shapes",
    "fluid-scaling",
    "size-aware-styling",
    "improve-text-layout-and-legibility",
    "forms",
    "accessible-error-announcement",
    "identify-inp-causes",
    "visually-stable-font-fallbacks",
    "break-up-long-tasks",
    "optimize-image-priority",
    "identify-heavy-scripts",
    "move-dom-element-without-losing-state",
    "css",
    "html",
    "security",
    "privacy",
    "passkeys",
    "flicker-free-client-side-ab-testing",
    "resilient-context-menus-and-nested-dropdowns",
    "persistent-toast-notifications",
    "translator",
    "support-global-calendar-systems",
    "coordinate-global-events",
    "search-hidden-content",
    "autofill-address-form",
    "autofill-payment-form",
    "deliver-optimized-decorative-images",
    "deprioritize-background-fetches",
    "webmcp",
    "language-model",
    "manage-recurring-intervals"
  ],
  "artifacts": [
    {
      "type": "layout",
      "path": "evidence/budget-mobile-layout.json",
      "caption": "budget mobile layout json",
      "condition": "viewport: 360x800",
      "findingIds": []
    },
    {
      "type": "screenshot",
      "path": "evidence/budget-mobile.png",
      "caption": "budget mobile png",
      "condition": "viewport: 360x800",
      "findingIds": []
    },
    {
      "type": "other",
      "path": "evidence/budget-probe.json",
      "caption": "budget probe json",
      "findingIds": []
    },
    {
      "type": "other",
      "path": "evidence/consent-controls.json",
      "caption": "consent controls json",
      "findingIds": [
        "F011"
      ]
    },
    {
      "type": "other",
      "path": "evidence/crawl-http.txt",
      "caption": "crawl http txt",
      "findingIds": []
    },
    {
      "type": "layout",
      "path": "evidence/goals-mobile-layout.json",
      "caption": "goals mobile layout json",
      "condition": "viewport: 360x800",
      "findingIds": []
    },
    {
      "type": "screenshot",
      "path": "evidence/goals-mobile.png",
      "caption": "goals mobile png",
      "condition": "viewport: 360x800",
      "findingIds": []
    },
    {
      "type": "other",
      "path": "evidence/goals-probe.json",
      "caption": "goals probe json",
      "findingIds": []
    },
    {
      "type": "screenshot",
      "path": "evidence/home-after-reject.png",
      "caption": "home after reject png",
      "findingIds": []
    },
    {
      "type": "screenshot",
      "path": "evidence/home-desktop.png",
      "caption": "home desktop png",
      "findingIds": [
        "F011"
      ]
    },
    {
      "type": "screenshot",
      "path": "evidence/home-discoverability-crawler.png",
      "caption": "home discoverability crawler png",
      "findingIds": []
    },
    {
      "type": "screenshot",
      "path": "evidence/home-discoverability-rendered.png",
      "caption": "home discoverability rendered png",
      "findingIds": []
    },
    {
      "type": "discoverability",
      "path": "evidence/home-discoverability.json",
      "caption": "home discoverability json",
      "findingIds": []
    },
    {
      "type": "other",
      "path": "evidence/home-dom.json",
      "caption": "home dom json",
      "findingIds": []
    },
    {
      "type": "layout",
      "path": "evidence/home-mobile-layout.json",
      "caption": "home mobile layout json",
      "condition": "viewport: 360x800",
      "findingIds": []
    },
    {
      "type": "screenshot",
      "path": "evidence/home-mobile.png",
      "caption": "home mobile png",
      "condition": "viewport: 360x800",
      "findingIds": [
        "F011"
      ]
    },
    {
      "type": "layout",
      "path": "evidence/how-it-works-mobile-layout.json",
      "caption": "how it works mobile layout json",
      "condition": "viewport: 360x800",
      "findingIds": []
    },
    {
      "type": "screenshot",
      "path": "evidence/how-it-works-mobile.png",
      "caption": "how it works mobile png",
      "condition": "viewport: 360x800",
      "findingIds": []
    },
    {
      "type": "other",
      "path": "evidence/how-it-works-probe.json",
      "caption": "how it works probe json",
      "findingIds": []
    },
    {
      "type": "other",
      "path": "evidence/landing-cookies.json",
      "caption": "landing cookies json",
      "findingIds": [
        "F006"
      ]
    },
    {
      "type": "screenshot",
      "path": "evidence/landing-dark.png",
      "caption": "landing dark png",
      "condition": "prefers-color-scheme: dark",
      "findingIds": [
        "F001"
      ]
    },
    {
      "type": "screenshot",
      "path": "evidence/landing-desktop.png",
      "caption": "landing desktop png",
      "findingIds": []
    },
    {
      "type": "screenshot",
      "path": "evidence/landing-discoverability-crawler.png",
      "caption": "landing discoverability crawler png",
      "findingIds": []
    },
    {
      "type": "screenshot",
      "path": "evidence/landing-discoverability-rendered.png",
      "caption": "landing discoverability rendered png",
      "findingIds": []
    },
    {
      "type": "discoverability",
      "path": "evidence/landing-discoverability.json",
      "caption": "landing discoverability json",
      "findingIds": []
    },
    {
      "type": "other",
      "path": "evidence/landing-focus-cta.json",
      "caption": "landing focus cta json",
      "findingIds": []
    },
    {
      "type": "other",
      "path": "evidence/landing-focus-permissions.json",
      "caption": "landing focus permissions json",
      "findingIds": []
    },
    {
      "type": "other",
      "path": "evidence/landing-footprint.json",
      "caption": "landing footprint json",
      "findingIds": [
        "F014"
      ]
    },
    {
      "type": "screenshot",
      "path": "evidence/landing-forced-colors.png",
      "caption": "landing forced colors png",
      "condition": "forced-colors: active",
      "findingIds": []
    },
    {
      "type": "other",
      "path": "evidence/landing-headers.json",
      "caption": "landing headers json",
      "findingIds": [
        "F006"
      ]
    },
    {
      "type": "heap",
      "path": "evidence/landing-heap-baseline.heapsnapshot",
      "caption": "landing heap baseline heapsnapshot",
      "findingIds": [
        "F014"
      ]
    },
    {
      "type": "heap",
      "path": "evidence/landing-heap-comparison.json",
      "caption": "landing heap comparison json",
      "findingIds": []
    },
    {
      "type": "heap",
      "path": "evidence/landing-heap-post.heapsnapshot",
      "caption": "landing heap post heapsnapshot",
      "findingIds": []
    },
    {
      "type": "other",
      "path": "evidence/landing-images.json",
      "caption": "landing images json",
      "findingIds": [
        "F004",
        "F008"
      ]
    },
    {
      "type": "lighthouse",
      "path": "evidence/landing-lighthouse-summary.json",
      "caption": "landing lighthouse summary json",
      "findingIds": [
        "F003"
      ]
    },
    {
      "type": "lighthouse",
      "path": "evidence/landing-lighthouse.json",
      "caption": "landing lighthouse json",
      "findingIds": [
        "F003",
        "F004",
        "F007",
        "F009",
        "F010",
        "F015"
      ]
    },
    {
      "type": "other",
      "path": "evidence/landing-mobile-buttons.json",
      "caption": "landing mobile buttons json",
      "condition": "viewport: 360x800",
      "findingIds": []
    },
    {
      "type": "layout",
      "path": "evidence/landing-mobile-layout.json",
      "caption": "landing mobile layout json",
      "condition": "viewport: 360x800",
      "findingIds": []
    },
    {
      "type": "screenshot",
      "path": "evidence/landing-mobile-menu.png",
      "caption": "landing mobile menu png",
      "condition": "viewport: 360x800",
      "findingIds": []
    },
    {
      "type": "screenshot",
      "path": "evidence/landing-mobile.png",
      "caption": "landing mobile png",
      "condition": "viewport: 360x800",
      "findingIds": []
    },
    {
      "type": "other",
      "path": "evidence/landing-probe.json",
      "caption": "landing probe json",
      "findingIds": [
        "F001",
        "F002",
        "F012",
        "F013"
      ]
    },
    {
      "type": "other",
      "path": "evidence/landing-recon.json",
      "caption": "landing recon json",
      "findingIds": []
    },
    {
      "type": "other",
      "path": "evidence/landing-reduced-motion.json",
      "caption": "landing reduced motion json",
      "condition": "prefers-reduced-motion: reduce",
      "findingIds": []
    },
    {
      "type": "other",
      "path": "evidence/landing-scroll-state.json",
      "caption": "landing scroll state json",
      "findingIds": []
    },
    {
      "type": "video",
      "path": "evidence/landing-scroll.mp4",
      "caption": "landing scroll mp4",
      "findingIds": [
        "F002"
      ]
    },
    {
      "type": "other",
      "path": "evidence/landing-secrets.json",
      "caption": "landing secrets json",
      "findingIds": []
    },
    {
      "type": "har-summary",
      "path": "evidence/landing-summary.json",
      "caption": "landing summary json",
      "findingIds": [
        "F004",
        "F005",
        "F009"
      ]
    },
    {
      "type": "trace-summary",
      "path": "evidence/landing-trace-summary.json",
      "caption": "landing trace summary json",
      "findingIds": [
        "F003"
      ]
    },
    {
      "type": "trace",
      "path": "evidence/landing-trace.json",
      "caption": "landing trace json",
      "findingIds": [
        "F003"
      ]
    },
    {
      "type": "other",
      "path": "evidence/landing-trackers.json",
      "caption": "landing trackers json",
      "findingIds": [
        "F005"
      ]
    },
    {
      "type": "har",
      "path": "evidence/landing.har",
      "caption": "landing har",
      "findingIds": [
        "F004",
        "F005"
      ]
    },
    {
      "type": "other",
      "path": "evidence/not-found-probe.json",
      "caption": "not found probe json",
      "findingIds": []
    },
    {
      "type": "screenshot",
      "path": "evidence/not-found.png",
      "caption": "not found png",
      "findingIds": []
    },
    {
      "type": "other",
      "path": "evidence/robots.txt",
      "caption": "robots txt",
      "findingIds": []
    },
    {
      "type": "screenshot",
      "path": "evidence/signup-empty-error.png",
      "caption": "signup empty error png",
      "findingIds": []
    },
    {
      "type": "other",
      "path": "evidence/signup-form-probe.json",
      "caption": "signup form probe json",
      "findingIds": []
    },
    {
      "type": "screenshot",
      "path": "evidence/signup-handoff.png",
      "caption": "signup handoff png",
      "findingIds": []
    },
    {
      "type": "other",
      "path": "evidence/sitemap-status.txt",
      "caption": "sitemap status txt",
      "findingIds": []
    },
    {
      "type": "other",
      "path": "evidence/sitemap.xml",
      "caption": "sitemap xml",
      "findingIds": []
    },
    {
      "type": "layout",
      "path": "evidence/support-mobile-layout.json",
      "caption": "support mobile layout json",
      "condition": "viewport: 360x800",
      "findingIds": []
    },
    {
      "type": "screenshot",
      "path": "evidence/support-mobile.png",
      "caption": "support mobile png",
      "condition": "viewport: 360x800",
      "findingIds": []
    },
    {
      "type": "other",
      "path": "evidence/support-probe.json",
      "caption": "support probe json",
      "findingIds": []
    }
  ],
  "config": {
    "loaded": false
  },
  "coverage": {
    "catalogVersion": "modern-web-guidance@0.0.172",
    "catalogChecksum": "sha256:78ccfdb2d483f4c57d9dafed80fd86c6265585a56457c8dcfddc254b80fb44d7",
    "expected": 58,
    "recorded": 58,
    "judged": 58,
    "blocked": 0,
    "notRun": 0,
    "missing": 0,
    "unknown": 0,
    "duplicates": 0,
    "complete": true
  },
  "checkOutcomes": [
    {
      "principleId": "respect-user-preferences",
      "checkId": "respects-color-scheme",
      "status": "issues",
      "confidence": "high",
      "method": "a screenshot or computed background under an emulated prefers-color-scheme: dark condition will reveal whether surfaces re-tint; the page CSS / a color-scheme declaration is corroborating evidence. The model chooses the method.",
      "evidence": "The dark-mode screenshot is visually identical to the light capture, and the computed root color-scheme is normal with no prefers-color-scheme rule detected.",
      "pathIds": [
        "landing"
      ],
      "artifacts": [
        "evidence/landing-dark.png",
        "evidence/landing-probe.json"
      ],
      "findingIds": [
        "F001"
      ]
    },
    {
      "principleId": "respect-user-preferences",
      "checkId": "respects-reduced-motion",
      "status": "pass",
      "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, getAnimations() returned none and all seven autoplay videos were paused at time 0.",
      "pathIds": [
        "landing",
        "goals",
        "how-it-works",
        "budget",
        "support"
      ],
      "artifacts": [
        "evidence/landing-reduced-motion.json"
      ]
    },
    {
      "principleId": "respect-user-preferences",
      "checkId": "respects-contrast",
      "status": "pass",
      "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 forced-colors screenshot preserves visible text, borders, focusable actions, and hierarchy.",
      "pathIds": [
        "landing",
        "goals",
        "how-it-works",
        "budget",
        "support"
      ],
      "artifacts": [
        "evidence/landing-forced-colors.png"
      ]
    },
    {
      "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 CSS/DOM probe found no view-transition rules or API-backed transition styling, while the site exposes several route and carousel state changes.",
      "pathIds": [
        "landing"
      ],
      "artifacts": [
        "evidence/landing-probe.json",
        "evidence/landing-scroll.mp4"
      ],
      "findingIds": [
        "F002"
      ]
    },
    {
      "principleId": "implement-natural-interactions",
      "checkId": "scroll-driven-animations",
      "status": "pass",
      "confidence": "medium",
      "method": "source/CSS inspection for animation-timeline: scroll()/view(); a long-task / scroll-handler probe can flag the main-thread anti-pattern. The model chooses.",
      "evidence": "The page uses ordinary document scrolling; the trace showed only two short long tasks and no scroll-linked jank during the captured path.",
      "pathIds": [
        "landing",
        "goals",
        "how-it-works",
        "budget",
        "support"
      ],
      "artifacts": [
        "evidence/landing-scroll.mp4",
        "evidence/landing-trace-summary.json"
      ]
    },
    {
      "principleId": "implement-natural-interactions",
      "checkId": "physical-gestures",
      "status": "pass",
      "confidence": "medium",
      "method": "CSS inspection for scroll-snap / overscroll-behavior / physics-based easing vs custom pointermove listeners. The model chooses.",
      "evidence": "The mobile goals carousel exposes previous/next controls with accessible labels and a touch-sized visual treatment.",
      "pathIds": [
        "landing",
        "goals",
        "how-it-works",
        "budget",
        "support"
      ],
      "artifacts": [
        "evidence/goals-mobile.png",
        "evidence/landing-mobile-buttons.json"
      ]
    },
    {
      "principleId": "provide-guided-navigation",
      "checkId": "scroll-state-aware-chrome",
      "status": "pass",
      "confidence": "high",
      "method": "a transition video of scrolling, or CSS inspection for scroll-state container queries. The model chooses.",
      "evidence": "Mobile captures show a persistent bottom Start now action while scrolled content remains unobstructed; desktop header leaves the viewport rather than consuming space.",
      "pathIds": [
        "landing",
        "goals",
        "how-it-works",
        "budget",
        "support"
      ],
      "artifacts": [
        "evidence/landing-mobile.png",
        "evidence/landing-scroll-state.json"
      ]
    },
    {
      "principleId": "provide-guided-navigation",
      "checkId": "anchored-positioning",
      "status": "pass",
      "confidence": "medium",
      "method": "CSS inspection for anchor-name / position-anchor / position-try on overlays; a screenshot of an open overlay near a viewport edge can show drift. The model chooses.",
      "evidence": "The mobile header/menu control and floating chat affordance remain within viewport edges in the narrow capture.",
      "pathIds": [
        "landing",
        "goals",
        "how-it-works",
        "budget",
        "support"
      ],
      "artifacts": [
        "evidence/landing-mobile-menu.png"
      ]
    },
    {
      "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": "Across landing, goals, and support, one large H1 and a visually dominant next action establish an obvious reading and action sequence.",
      "pathIds": [
        "landing",
        "goals",
        "how-it-works",
        "budget",
        "support"
      ],
      "artifacts": [
        "evidence/landing-mobile.png",
        "evidence/goals-mobile.png"
      ]
    },
    {
      "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": "Desktop and mobile screenshots show “Before you continue” instead of Google Ads content; on mobile the decision controls are below a long explanation and outside the first 800 px viewport.",
      "pathIds": [
        "landing"
      ],
      "artifacts": [
        "evidence/home-desktop.png",
        "evidence/home-mobile.png",
        "evidence/consent-controls.json"
      ],
      "findingIds": [
        "F011"
      ]
    },
    {
      "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 DOM probe found nine DIV role=dialog surfaces and no native dialog or popover element on the landing page.",
      "pathIds": [
        "landing"
      ],
      "artifacts": [
        "evidence/landing-probe.json"
      ],
      "findingIds": [
        "F013"
      ]
    },
    {
      "principleId": "maximize-content-reduce-noise",
      "checkId": "reduced-chrome",
      "status": "pass",
      "confidence": "high",
      "method": "a screenshot plus layout metrics can show the proportion of the viewport given to chrome vs content. The model chooses.",
      "evidence": "The first view is dominated by page purpose and CTA; navigation is compact on mobile and restrained on desktop.",
      "pathIds": [
        "landing",
        "goals",
        "how-it-works",
        "budget",
        "support"
      ],
      "artifacts": [
        "evidence/landing-desktop.png",
        "evidence/landing-mobile.png"
      ]
    },
    {
      "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": "All five 360 px layout captures reported 0 px horizontal overflow.",
      "pathIds": [
        "landing",
        "goals",
        "how-it-works",
        "budget",
        "support"
      ],
      "artifacts": [
        "evidence/landing-mobile-layout.json",
        "evidence/goals-mobile-layout.json",
        "evidence/how-it-works-mobile-layout.json",
        "evidence/budget-mobile-layout.json",
        "evidence/support-mobile-layout.json"
      ]
    },
    {
      "principleId": "adapt-to-the-form-factor",
      "checkId": "component-level-responsiveness",
      "status": "pass",
      "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": "The same hero, goal card, navigation, and CTA surfaces recompose cleanly between 780 px and 360 px captures without clipping.",
      "pathIds": [
        "landing",
        "goals",
        "how-it-works",
        "budget",
        "support"
      ],
      "artifacts": [
        "evidence/landing-mobile.png",
        "evidence/landing-desktop.png",
        "evidence/goals-mobile.png"
      ]
    },
    {
      "principleId": "adapt-to-the-form-factor",
      "checkId": "input-modality-aware",
      "status": "pass",
      "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 Start now CTA matched :focus-visible and rendered a 2 px contrasting focus box-shadow; mobile actions are approximately 50 px tall.",
      "pathIds": [
        "landing",
        "goals",
        "how-it-works",
        "budget",
        "support"
      ],
      "artifacts": [
        "evidence/landing-focus-cta.json",
        "evidence/landing-mobile.png"
      ]
    },
    {
      "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": "Representative screenshots expose clear page-specific H1 copy and direct actions such as Start now, contact options, and goal navigation.",
      "pathIds": [
        "landing",
        "goals",
        "how-it-works",
        "budget",
        "support"
      ],
      "artifacts": [
        "evidence/landing-mobile.png",
        "evidence/goals-mobile.png",
        "evidence/support-mobile.png"
      ]
    },
    {
      "principleId": "support-core-task-success",
      "checkId": "primary-flow-completion",
      "status": "pass",
      "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": "Start now reaches a clearly branded Google Account sign-in page with an email/phone field; public support exposes call and contact-option actions.",
      "pathIds": [
        "landing",
        "goals",
        "how-it-works",
        "budget",
        "support"
      ],
      "artifacts": [
        "evidence/signup-handoff.png",
        "evidence/signup-form-probe.json",
        "evidence/support-mobile.png"
      ]
    },
    {
      "principleId": "support-core-task-success",
      "checkId": "clear-system-state-and-recovery",
      "status": "pass",
      "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": "The invalid-route test presents a specific 404 explanation plus Home, Expert Support, How It Works, Performance Max, and Search Ads recovery links.",
      "pathIds": [
        "not-found"
      ],
      "artifacts": [
        "evidence/not-found.png",
        "evidence/not-found-probe.json"
      ]
    },
    {
      "principleId": "be-fast-and-stable",
      "checkId": "good-core-web-vitals",
      "status": "issues",
      "confidence": "high",
      "method": "Lighthouse reports LCP/CLS/TBT directly and the model may run it; layout metrics + a layout-shift observer + a long-task observer (the evidence primitives) give the same signal first-party. The model chooses.",
      "evidence": "Lighthouse measured LCP 5.87 s, FCP 4.70 s, TBT 485.5 ms, CLS 0.074, and a performance score of 47. The separate trace was faster but still recorded two long tasks.",
      "pathIds": [
        "landing"
      ],
      "artifacts": [
        "evidence/landing-lighthouse-summary.json",
        "evidence/landing-lighthouse.json",
        "evidence/landing-trace-summary.json",
        "evidence/landing-trace.json"
      ],
      "findingIds": [
        "F003"
      ]
    },
    {
      "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": "Mobile CLS was 0.027 in the layout observer and 0.074 in Lighthouse, both below the 0.1 good threshold.",
      "pathIds": [
        "landing",
        "goals",
        "how-it-works",
        "budget",
        "support"
      ],
      "artifacts": [
        "evidence/landing-mobile-layout.json",
        "evidence/landing-lighthouse-summary.json"
      ]
    },
    {
      "principleId": "be-fast-and-stable",
      "checkId": "efficient-main-thread",
      "status": "issues",
      "confidence": "high",
      "method": "the layout primitive records long tasks; a heap summary shows the object population; Lighthouse reports TBT. The model chooses.",
      "evidence": "Lighthouse measured LCP 5.87 s, FCP 4.70 s, TBT 485.5 ms, CLS 0.074, and a performance score of 47. The separate trace was faster but still recorded two long tasks.",
      "pathIds": [
        "landing"
      ],
      "artifacts": [
        "evidence/landing-lighthouse-summary.json",
        "evidence/landing-lighthouse.json",
        "evidence/landing-trace-summary.json",
        "evidence/landing-trace.json"
      ],
      "findingIds": [
        "F003"
      ]
    },
    {
      "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": "The HAR captured 126 requests and 5.95 MB in its load window, including 2.27 MB fonts, 2.55 MB scripts, and 778 KB media. Lighthouse reported 50.7 MiB total payload, about 1.4 MiB unused JS and 193 KiB unused CSS.",
      "pathIds": [
        "landing"
      ],
      "artifacts": [
        "evidence/landing.har",
        "evidence/landing-summary.json",
        "evidence/landing-lighthouse.json",
        "evidence/landing-images.json"
      ],
      "findingIds": [
        "F004"
      ]
    },
    {
      "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": "The HAR captured 126 requests and 5.95 MB in its load window, including 2.27 MB fonts, 2.55 MB scripts, and 778 KB media. Lighthouse reported 50.7 MiB total payload, about 1.4 MiB unused JS and 193 KiB unused CSS.",
      "pathIds": [
        "landing"
      ],
      "artifacts": [
        "evidence/landing.har",
        "evidence/landing-summary.json",
        "evidence/landing-lighthouse.json",
        "evidence/landing-images.json"
      ],
      "findingIds": [
        "F004"
      ]
    },
    {
      "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 identified four label-content-name mismatches, including visible “Generate more leads” and “Get started” links whose aria-label is “Sign up for Google Ads”, and the Expand all control. The image probe found 18 of 27 images without alt, including visible marketing imagery as well as product-logo assets. Decorative images should use alt=\"\"; informative images need meaningful alternatives.",
      "pathIds": [
        "landing"
      ],
      "artifacts": [
        "evidence/landing-lighthouse.json",
        "evidence/landing-images.json"
      ],
      "findingIds": [
        "F007",
        "F008"
      ]
    },
    {
      "principleId": "be-inclusive",
      "checkId": "sufficient-contrast",
      "status": "pass",
      "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 accessibility scored 100 and the forced-colors capture retains readable controls and content.",
      "pathIds": [
        "landing",
        "goals",
        "how-it-works",
        "budget",
        "support"
      ],
      "artifacts": [
        "evidence/landing-forced-colors.png",
        "evidence/landing-lighthouse-summary.json"
      ]
    },
    {
      "principleId": "be-inclusive",
      "checkId": "structure-and-focus",
      "status": "pass",
      "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": "The page provides header/nav/main/footer landmarks, a skip link, one visible H1, and a visible focus treatment on the primary CTA.",
      "pathIds": [
        "landing",
        "goals",
        "how-it-works",
        "budget",
        "support"
      ],
      "artifacts": [
        "evidence/landing-focus-cta.json",
        "evidence/landing-lighthouse-summary.json"
      ]
    },
    {
      "principleId": "be-inclusive",
      "checkId": "legible-text",
      "status": "pass",
      "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": "Mobile captures use large headings, comfortable line length, and 16 px-class body copy without truncation.",
      "pathIds": [
        "landing",
        "goals",
        "how-it-works",
        "budget",
        "support"
      ],
      "artifacts": [
        "evidence/landing-mobile.png",
        "evidence/support-mobile.png"
      ]
    },
    {
      "principleId": "be-inclusive",
      "checkId": "zoom-reflow-targets-and-media",
      "status": "pass",
      "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 viewport allows maximum-scale=5, all mobile layouts reflow without overflow, primary targets are 50 px tall, and reduced-motion pauses autoplay media.",
      "pathIds": [
        "landing",
        "goals",
        "how-it-works",
        "budget",
        "support"
      ],
      "artifacts": [
        "evidence/landing-mobile-layout.json",
        "evidence/landing-mobile.png"
      ]
    },
    {
      "principleId": "follow-best-practices",
      "checkId": "no-console-errors",
      "status": "issues",
      "confidence": "high",
      "method": "capture Runtime/Log CDP events, or a probe that reads collected errors; Lighthouse reports this too. The model chooses.",
      "evidence": "Lighthouse captured a 401 console/network error from MeasurementService/ListAccounts during the ordinary signed-out landing load.",
      "pathIds": [
        "landing"
      ],
      "artifacts": [
        "evidence/landing-lighthouse.json",
        "evidence/landing-summary.json"
      ],
      "findingIds": [
        "F009"
      ]
    },
    {
      "principleId": "follow-best-practices",
      "checkId": "sound-document-and-assets",
      "status": "pass",
      "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 rendered document has viewport metadata, dimensions on 26 of 27 images, responsive srcsets on visible marketing imagery, and low measured CLS.",
      "pathIds": [
        "landing",
        "goals",
        "how-it-works",
        "budget",
        "support"
      ],
      "artifacts": [
        "evidence/landing-probe.json",
        "evidence/landing-images.json"
      ]
    },
    {
      "principleId": "follow-best-practices",
      "checkId": "browser-platform-hygiene",
      "status": "issues",
      "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 reported three bfcache failure reasons led by cache-control:no-store on the main resource and no-store resources requested by JavaScript.",
      "pathIds": [
        "landing"
      ],
      "artifacts": [
        "evidence/landing-lighthouse.json"
      ],
      "findingIds": [
        "F015"
      ]
    },
    {
      "principleId": "be-discoverable",
      "checkId": "title-and-description",
      "status": "pass",
      "confidence": "high",
      "method": "a DOM probe reads <title> and meta[name=description]; Lighthouse SEO audits cover the same ground. The model chooses.",
      "evidence": "All representative probes returned distinct, descriptive titles and descriptions aligned with their page purpose.",
      "pathIds": [
        "landing",
        "goals",
        "how-it-works",
        "budget",
        "support"
      ],
      "artifacts": [
        "evidence/landing-probe.json",
        "evidence/goals-probe.json"
      ]
    },
    {
      "principleId": "be-discoverable",
      "checkId": "crawlable-and-mobile-friendly",
      "status": "issues",
      "confidence": "high",
      "method": "a DOM probe for anchor hrefs, viewport meta, and robots; Lighthouse SEO audits corroborate. The model chooses.",
      "evidence": "Lighthouse SEO reported the Google Ads Help link with text “Learn more”, which is ambiguous out of context for crawlers and assistive navigation.",
      "pathIds": [
        "landing"
      ],
      "artifacts": [
        "evidence/landing-lighthouse.json"
      ],
      "findingIds": [
        "F010"
      ]
    },
    {
      "principleId": "be-discoverable",
      "checkId": "canonical-and-indexing-signals",
      "status": "pass",
      "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 landing page has a UK canonical URL, HTTP 200, permissive /uk/ robots rule, and working sitemap URLs listed by robots.txt.",
      "pathIds": [
        "signup"
      ],
      "artifacts": [
        "evidence/landing-probe.json",
        "evidence/robots.txt",
        "evidence/sitemap-status.txt"
      ]
    },
    {
      "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 UK page probe found JSON-LD WebPage @id/url and breadcrumb items under /us/, with a US title/description, while canonical and Open Graph URLs correctly identify /uk/.",
      "pathIds": [
        "landing"
      ],
      "artifacts": [
        "evidence/landing-probe.json"
      ],
      "findingIds": [
        "F012"
      ]
    },
    {
      "principleId": "be-private-and-secure",
      "checkId": "secure-transport-and-headers",
      "status": "pass",
      "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": "The page is HTTPS with HSTS, nosniff, SAMEORIGIN, Permissions-Policy and an enforced nonce/strict-dynamic CSP; the secrets scan found only expected public Google API/config keys.",
      "pathIds": [
        "landing",
        "goals",
        "how-it-works",
        "budget",
        "support"
      ],
      "artifacts": [
        "evidence/landing-headers.json",
        "evidence/landing-secrets.json"
      ]
    },
    {
      "principleId": "be-private-and-secure",
      "checkId": "data-minimisation-and-third-parties",
      "status": "issues",
      "confidence": "high",
      "method": "inspect network requests and third-party origins; a probe of analytics/beacon calls. The model chooses.",
      "evidence": "The HAR attributed 107 of 126 requests and 5.89 MB to non-business.google.com origins; the tracker probe found 15 third-party origins and four known tracker domains, including Google Analytics and googlesyndication.",
      "pathIds": [
        "landing"
      ],
      "artifacts": [
        "evidence/landing-summary.json",
        "evidence/landing-trackers.json",
        "evidence/landing.har"
      ],
      "findingIds": [
        "F005"
      ]
    },
    {
      "principleId": "be-private-and-secure",
      "checkId": "in-context-permissions-and-modern-auth",
      "status": "pass",
      "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": "Geolocation and notification remained in prompt state with no load-time prompt; signup hands off to Google Account authentication and the platform exposes credential/passkey capability.",
      "pathIds": [
        "landing",
        "goals",
        "how-it-works",
        "budget",
        "support"
      ],
      "artifacts": [
        "evidence/landing-focus-permissions.json",
        "evidence/signup-handoff.png"
      ]
    },
    {
      "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": "The cookie probe reported NID and three analytics cookies without Secure and with SameSite=None; the analytics cookies last 400 days. No authentication cookie lacked HttpOnly.",
      "pathIds": [
        "landing"
      ],
      "artifacts": [
        "evidence/landing-cookies.json",
        "evidence/landing-headers.json"
      ],
      "findingIds": [
        "F006"
      ]
    },
    {
      "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": "Direct-page discoverability measured 99% raw-HTML content coverage with title, H1, and description present and no empty JS shell.",
      "pathIds": [
        "landing",
        "goals",
        "how-it-works",
        "budget",
        "support"
      ],
      "artifacts": [
        "evidence/landing-discoverability.json",
        "evidence/landing-discoverability-crawler.png"
      ]
    },
    {
      "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": "Public content remained usable despite the signed-out account request failure; navigation, accordions, and the dedicated recovery page rendered.",
      "pathIds": [
        "landing",
        "goals",
        "how-it-works",
        "budget",
        "support"
      ],
      "artifacts": [
        "evidence/not-found.png",
        "evidence/landing-mobile-buttons.json"
      ]
    },
    {
      "principleId": "be-resilient",
      "checkId": "offline-and-installable",
      "status": "not-applicable",
      "confidence": "high",
      "method": "Manifest/service-worker DOM probe and site-purpose judgement.",
      "evidence": "No manifest is linked; serviceWorker is browser-supported but this public acquisition site is not an installed application.",
      "reason": "Offline installation is not a reasonable requirement for this public marketing and support surface; progressive enhancement and failure recovery were judged separately."
    },
    {
      "principleId": "be-resilient",
      "checkId": "network-and-http-failure-states",
      "status": "pass",
      "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": "A deliberately invalid route produced a clear 404 state with multiple relevant recovery destinations.",
      "pathIds": [
        "not-found"
      ],
      "artifacts": [
        "evidence/not-found.png",
        "evidence/not-found-probe.json"
      ]
    },
    {
      "principleId": "be-internationalised",
      "checkId": "lang-dir-and-logical-properties",
      "status": "pass",
      "confidence": "high",
      "method": "a DOM probe for <html lang>/dir and CSS inspection for logical vs physical properties. The model chooses.",
      "evidence": "Representative pages declare lang=en, compute LTR direction, use locale-specific /uk/ routing, and expose a language/region selector.",
      "pathIds": [
        "landing",
        "goals",
        "how-it-works",
        "budget",
        "support"
      ],
      "artifacts": [
        "evidence/landing-probe.json",
        "evidence/support-probe.json"
      ]
    },
    {
      "principleId": "be-internationalised",
      "checkId": "locale-aware-data",
      "status": "pass",
      "confidence": "high",
      "method": "source inspection for Intl.* usage vs hand-rolled formatting; a probe of rendered dates/numbers under a different locale. The model chooses.",
      "evidence": "The UK locale uses UK wording, local telephone presentation, and localized commercial content; no ambiguous numeric date UI was found.",
      "pathIds": [
        "landing",
        "goals",
        "how-it-works",
        "budget",
        "support"
      ],
      "artifacts": [
        "evidence/landing-probe.json",
        "evidence/support-mobile.png"
      ]
    },
    {
      "principleId": "be-internationalised",
      "checkId": "time-zone-correctness",
      "status": "pass",
      "confidence": "high",
      "method": "source inspection for time-zone-aware date handling vs naive local Date math. The model chooses.",
      "evidence": "Support hours explicitly identify BST, avoiding an unqualified local-time claim; no event scheduling/date arithmetic surface exists.",
      "pathIds": [
        "landing",
        "goals",
        "how-it-works",
        "budget",
        "support"
      ],
      "artifacts": [
        "evidence/support-mobile.png",
        "evidence/support-probe.json"
      ]
    },
    {
      "principleId": "be-trustworthy",
      "checkId": "no-dark-patterns",
      "status": "pass",
      "confidence": "high",
      "method": "a screenshot of consent/upsell/cancel flows; source inspection for declarative button actions vs misleading controls. The model chooses.",
      "evidence": "The consent surface states purposes and provides explicit Reject all and Accept all controls with symmetric labels; commercial CTAs state their destination.",
      "pathIds": [
        "landing",
        "goals",
        "how-it-works",
        "budget",
        "support"
      ],
      "artifacts": [
        "evidence/home-mobile.png",
        "evidence/consent-controls.json"
      ]
    },
    {
      "principleId": "be-trustworthy",
      "checkId": "humane-error-handling",
      "status": "pass",
      "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": "The credential handoff asks for one clearly labeled Email or phone value before progression and does not show errors before interaction.",
      "pathIds": [
        "signup"
      ],
      "artifacts": [
        "evidence/signup-handoff.png",
        "evidence/signup-form-probe.json"
      ]
    },
    {
      "principleId": "be-trustworthy",
      "checkId": "trustworthy-input-assistance",
      "status": "pass",
      "confidence": "high",
      "method": "source/DOM inspection for autocomplete attributes on form fields; a probe of autofill affordances. The model chooses.",
      "evidence": "The sign-in identifier field has a visible label and autocomplete=username.",
      "pathIds": [
        "signup"
      ],
      "artifacts": [
        "evidence/signup-form-probe.json"
      ]
    },
    {
      "principleId": "be-trustworthy",
      "checkId": "safe-commercial-and-account-flows",
      "status": "pass",
      "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": "Budget information is available before signup, and Start now moves to a clearly branded authentication boundary without silently creating an account.",
      "pathIds": [
        "signup"
      ],
      "artifacts": [
        "evidence/budget-mobile.png",
        "evidence/signup-handoff.png"
      ]
    },
    {
      "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 HAR captured 126 requests and 5.95 MB in its load window, including 2.27 MB fonts, 2.55 MB scripts, and 778 KB media. Lighthouse reported 50.7 MiB total payload, about 1.4 MiB unused JS and 193 KiB unused CSS.",
      "pathIds": [
        "landing"
      ],
      "artifacts": [
        "evidence/landing.har",
        "evidence/landing-summary.json",
        "evidence/landing-lighthouse.json",
        "evidence/landing-images.json"
      ],
      "findingIds": [
        "F004"
      ]
    },
    {
      "principleId": "be-sustainable",
      "checkId": "no-wasteful-work",
      "status": "issues",
      "confidence": "high",
      "method": "a long-task / network probe for background fetches and processing while idle or backgrounded. The model chooses.",
      "evidence": "The HAR captured 126 requests and 5.95 MB in its load window, including 2.27 MB fonts, 2.55 MB scripts, and 778 KB media. Lighthouse reported 50.7 MiB total payload, about 1.4 MiB unused JS and 193 KiB unused CSS.",
      "pathIds": [
        "landing"
      ],
      "artifacts": [
        "evidence/landing.har",
        "evidence/landing-summary.json",
        "evidence/landing-lighthouse.json",
        "evidence/landing-images.json"
      ],
      "findingIds": [
        "F004"
      ]
    },
    {
      "principleId": "be-sustainable",
      "checkId": "third-party-and-media-budget",
      "status": "issues",
      "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": "The HAR captured 126 requests and 5.95 MB in its load window, including 2.27 MB fonts, 2.55 MB scripts, and 778 KB media. Lighthouse reported 50.7 MiB total payload, about 1.4 MiB unused JS and 193 KiB unused CSS. The HAR attributed 107 of 126 requests and 5.89 MB to non-business.google.com origins; the tracker probe found 15 third-party origins and four known tracker domains, including Google Analytics and googlesyndication.",
      "pathIds": [
        "landing"
      ],
      "artifacts": [
        "evidence/landing.har",
        "evidence/landing-summary.json",
        "evidence/landing-lighthouse.json",
        "evidence/landing-images.json",
        "evidence/landing-trackers.json"
      ],
      "findingIds": [
        "F004",
        "F005"
      ]
    },
    {
      "principleId": "be-agent-ready",
      "checkId": "structured-agent-capabilities",
      "status": "not-applicable",
      "confidence": "high",
      "method": "Recon of public page purpose, DOM metadata, structured data, and exposed browser APIs.",
      "evidence": "The audited surface is a public marketing and support site; campaign mutation is gated behind authentication and no safe agent-facing action is in scope.",
      "reason": "Agent-executable campaign creation is a sensitive authenticated workflow; the public marketing pages do not need WebMCP tools."
    },
    {
      "principleId": "be-agent-ready",
      "checkId": "on-device-inference",
      "status": "not-applicable",
      "confidence": "high",
      "method": "Recon of public page purpose, DOM metadata, structured data, and exposed browser APIs.",
      "evidence": "The audited surface is a public marketing and support site; campaign mutation is gated behind authentication and no safe agent-facing action is in scope.",
      "reason": "The site offers no local summarization or generation task whose core experience requires on-device inference."
    },
    {
      "principleId": "be-memory-efficient",
      "checkId": "no-leak-under-repeated-interaction",
      "status": "pass",
      "confidence": "high",
      "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 corroborat",
      "evidence": "After 20 repeated disclosure toggles, total self-size decreased by 101,846 bytes; node count changed only +2,290 (~0.2%) and no Detached constructor entered the top set.",
      "pathIds": [
        "landing",
        "goals",
        "how-it-works",
        "budget",
        "support"
      ],
      "artifacts": [
        "evidence/landing-heap-comparison.json",
        "evidence/landing-heap-post.heapsnapshot"
      ]
    },
    {
      "principleId": "be-memory-efficient",
      "checkId": "bounded-footprint",
      "status": "issues",
      "confidence": "high",
      "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 dis",
      "evidence": "The page had 2,102 DOM elements, 82.6 MB used JS heap, and 95 loaded resources. The heap summary contained about 1.03 million nodes and 58.2 MB self-size before interaction.",
      "pathIds": [
        "landing"
      ],
      "artifacts": [
        "evidence/landing-footprint.json",
        "evidence/landing-heap-baseline.heapsnapshot"
      ],
      "findingIds": [
        "F014"
      ]
    },
    {
      "principleId": "be-memory-efficient",
      "checkId": "no-detached-dom-or-unbounded-listeners",
      "status": "pass",
      "confidence": "high",
      "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 i",
      "evidence": "Neither baseline nor post-interaction heap summary exposed a growing Detached constructor; edge count decreased by 2,912 after repetition.",
      "pathIds": [
        "landing",
        "goals",
        "how-it-works",
        "budget",
        "support"
      ],
      "artifacts": [
        "evidence/landing-heap-comparison.json"
      ]
    }
  ],
  "principleOutcomes": [
    {
      "principleId": "respect-user-preferences",
      "expectation": "default",
      "status": "issues",
      "findingIds": [
        "F001"
      ]
    },
    {
      "principleId": "implement-natural-interactions",
      "expectation": "default",
      "status": "issues",
      "findingIds": [
        "F002"
      ]
    },
    {
      "principleId": "provide-guided-navigation",
      "expectation": "default",
      "status": "pass"
    },
    {
      "principleId": "maximize-content-reduce-noise",
      "expectation": "default",
      "status": "issues",
      "findingIds": [
        "F011",
        "F013"
      ]
    },
    {
      "principleId": "adapt-to-the-form-factor",
      "expectation": "default",
      "status": "pass"
    },
    {
      "principleId": "support-core-task-success",
      "expectation": "default",
      "status": "pass"
    },
    {
      "principleId": "be-fast-and-stable",
      "expectation": "default",
      "status": "issues",
      "findingIds": [
        "F003",
        "F004"
      ]
    },
    {
      "principleId": "be-inclusive",
      "expectation": "default",
      "status": "issues",
      "findingIds": [
        "F007",
        "F008"
      ]
    },
    {
      "principleId": "follow-best-practices",
      "expectation": "default",
      "status": "issues",
      "findingIds": [
        "F009",
        "F015"
      ]
    },
    {
      "principleId": "be-discoverable",
      "expectation": "default",
      "status": "issues",
      "findingIds": [
        "F010",
        "F012"
      ]
    },
    {
      "principleId": "be-private-and-secure",
      "expectation": "default",
      "status": "issues",
      "findingIds": [
        "F005",
        "F006"
      ]
    },
    {
      "principleId": "be-resilient",
      "expectation": "contextual",
      "status": "pass"
    },
    {
      "principleId": "be-internationalised",
      "expectation": "contextual",
      "status": "pass"
    },
    {
      "principleId": "be-trustworthy",
      "expectation": "default",
      "status": "pass"
    },
    {
      "principleId": "be-sustainable",
      "expectation": "contextual",
      "status": "issues",
      "findingIds": [
        "F004",
        "F005"
      ]
    },
    {
      "principleId": "be-agent-ready",
      "expectation": "contextual",
      "status": "not-applicable",
      "reason": "Agent-executable campaign creation is a sensitive authenticated workflow; the public marketing pages do not need WebMCP tools. The site offers no local summarization or generation task whose core experience requires on-device inference."
    },
    {
      "principleId": "be-memory-efficient",
      "expectation": "default",
      "status": "issues",
      "findingIds": [
        "F014"
      ]
    }
  ],
  "paths": [
    {
      "id": "landing",
      "description": "Public Google Ads landing page and primary conversion CTA.",
      "url": "https://business.google.com/uk/google-ads/?ucbcb=1",
      "conditions": [
        "desktop",
        "viewport: 360x800",
        "prefers-color-scheme: dark",
        "prefers-reduced-motion: reduce",
        "forced-colors: active",
        "keyboard focus"
      ],
      "result": "issues"
    },
    {
      "id": "goals",
      "description": "Campaign-goals listing/carousel archetype.",
      "url": "https://business.google.com/uk/google-ads/campaign-goals/?ucbcb=1",
      "conditions": [
        "viewport: 360x800"
      ],
      "result": "issues"
    },
    {
      "id": "how-it-works",
      "description": "Guided explanatory journey for campaign setup.",
      "url": "https://business.google.com/uk/google-ads/how-ads-work/?ucbcb=1",
      "conditions": [
        "viewport: 360x800"
      ],
      "result": "issues"
    },
    {
      "id": "budget",
      "description": "Commercial cost and FAQ archetype.",
      "url": "https://business.google.com/uk/google-ads/campaign-budget/?ucbcb=1",
      "conditions": [
        "viewport: 360x800"
      ],
      "result": "issues"
    },
    {
      "id": "support",
      "description": "Expert-support/contact-options journey.",
      "url": "https://business.google.com/uk/support/ads-expert/?ucbcb=1",
      "conditions": [
        "viewport: 360x800"
      ],
      "result": "issues"
    },
    {
      "id": "signup",
      "description": "Primary Start now CTA handoff to Google Account authentication; stopped before credentials.",
      "url": "https://ads.google.com/signup",
      "conditions": [
        "signed out"
      ],
      "result": "pass"
    },
    {
      "id": "not-found",
      "description": "Invalid public route to inspect HTTP/navigation recovery.",
      "url": "https://business.google.com/uk/google-ads/definitely-not-a-page/?ucbcb=1",
      "conditions": [
        "desktop"
      ],
      "result": "pass"
    }
  ],
  "findings": [
    {
      "id": "F001",
      "pathId": "landing",
      "url": "https://business.google.com/uk/google-ads/?ucbcb=1",
      "principleId": "respect-user-preferences",
      "principleCheckId": "respects-color-scheme",
      "guidanceId": "dark-mode",
      "guidanceCategory": "user-experience",
      "severity": "medium",
      "confidence": "high",
      "summary": "The public site does not adapt its palette to a dark colour-scheme preference.",
      "evidence": "The dark-mode screenshot is visually identical to the light capture, and the computed root color-scheme is normal with no prefers-color-scheme rule detected.",
      "artifacts": [
        "evidence/landing-dark.png",
        "evidence/landing-probe.json"
      ],
      "suggestedFix": "Declare color-scheme and provide preference-driven dark surface, text, control, and media treatments using the dark-mode guidance.",
      "effort": "medium"
    },
    {
      "id": "F002",
      "pathId": "landing",
      "url": "https://business.google.com/uk/google-ads/?ucbcb=1",
      "principleId": "implement-natural-interactions",
      "principleCheckId": "view-transitions",
      "guidanceId": "same-document-transitions",
      "guidanceCategory": "user-experience",
      "severity": "low",
      "confidence": "medium",
      "summary": "Major state and route changes do not use View Transitions.",
      "evidence": "The CSS/DOM probe found no view-transition rules or API-backed transition styling, while the site exposes several route and carousel state changes.",
      "artifacts": [
        "evidence/landing-probe.json",
        "evidence/landing-scroll.mp4"
      ],
      "suggestedFix": "Use same-document transitions for carousel and disclosure state changes and cross-document transitions for same-origin marketing routes, with reduced-motion handling.",
      "effort": "medium"
    },
    {
      "id": "F003",
      "pathId": "landing",
      "url": "https://business.google.com/uk/google-ads/?ucbcb=1",
      "principleId": "be-fast-and-stable",
      "principleCheckId": "good-core-web-vitals",
      "guidanceId": "identify-inp-causes",
      "guidanceCategory": "performance",
      "severity": "high",
      "confidence": "high",
      "summary": "Mobile lab performance misses the good Core Web Vitals loading and responsiveness bar.",
      "evidence": "Lighthouse measured LCP 5.87 s, FCP 4.70 s, TBT 485.5 ms, CLS 0.074, and a performance score of 47. The separate trace was faster but still recorded two long tasks.",
      "artifacts": [
        "evidence/landing-lighthouse-summary.json",
        "evidence/landing-lighthouse.json",
        "evidence/landing-trace-summary.json",
        "evidence/landing-trace.json"
      ],
      "suggestedFix": "Profile the LCP dependency chain and interaction tasks; prioritize the hero, delay noncritical chat/account/tracking code, and break long tasks.",
      "effort": "large"
    },
    {
      "id": "F004",
      "pathId": "landing",
      "url": "https://business.google.com/uk/google-ads/?ucbcb=1",
      "principleId": "be-fast-and-stable",
      "principleCheckId": "efficient-resource-delivery",
      "guidanceId": "identify-heavy-scripts",
      "guidanceCategory": "performance",
      "severity": "high",
      "confidence": "high",
      "summary": "The landing page ships an excessive script, font, media, and unused-code payload.",
      "evidence": "The HAR captured 126 requests and 5.95 MB in its load window, including 2.27 MB fonts, 2.55 MB scripts, and 778 KB media. Lighthouse reported 50.7 MiB total payload, about 1.4 MiB unused JS and 193 KiB unused CSS.",
      "artifacts": [
        "evidence/landing.har",
        "evidence/landing-summary.json",
        "evidence/landing-lighthouse.json",
        "evidence/landing-images.json"
      ],
      "suggestedFix": "Subset fonts, load one icon system, defer chat/account/recaptcha and analytics until needed or consented, avoid eager media downloads, and split route/component code.",
      "effort": "large"
    },
    {
      "id": "F005",
      "pathId": "landing",
      "url": "https://business.google.com/uk/google-ads/?ucbcb=1",
      "principleId": "be-private-and-secure",
      "principleCheckId": "data-minimisation-and-third-parties",
      "guidanceId": "privacy",
      "guidanceCategory": "privacy",
      "severity": "medium",
      "confidence": "high",
      "summary": "The initial public page has a broad analytics and third-party network footprint.",
      "evidence": "The HAR attributed 107 of 126 requests and 5.89 MB to non-business.google.com origins; the tracker probe found 15 third-party origins and four known tracker domains, including Google Analytics and googlesyndication.",
      "artifacts": [
        "evidence/landing-summary.json",
        "evidence/landing-trackers.json",
        "evidence/landing.har"
      ],
      "suggestedFix": "Minimize pre-interaction measurement, consolidate tags, gate optional analytics and chat resources on consent or intent, and document each retained third party.",
      "effort": "large"
    },
    {
      "id": "F006",
      "pathId": "landing",
      "url": "https://business.google.com/uk/google-ads/?ucbcb=1",
      "principleId": "be-private-and-secure",
      "principleCheckId": "defensive-browser-policies",
      "guidanceId": "security",
      "guidanceCategory": "security",
      "severity": "medium",
      "confidence": "high",
      "summary": "Several page cookies lack defensive attributes or remain unusually long lived.",
      "evidence": "The cookie probe reported NID and three analytics cookies without Secure and with SameSite=None; the analytics cookies last 400 days. No authentication cookie lacked HttpOnly.",
      "artifacts": [
        "evidence/landing-cookies.json",
        "evidence/landing-headers.json"
      ],
      "suggestedFix": "Set Secure on every HTTPS cookie, use Lax/Strict unless cross-site use is essential, and shorten analytics retention to the minimum justified duration.",
      "effort": "small"
    },
    {
      "id": "F007",
      "pathId": "landing",
      "url": "https://business.google.com/uk/google-ads/?ucbcb=1",
      "principleId": "be-inclusive",
      "principleCheckId": "names-roles-labels",
      "guidanceId": "accessibility",
      "guidanceCategory": "accessibility",
      "severity": "medium",
      "confidence": "high",
      "summary": "Some visible control labels do not match their accessible names.",
      "evidence": "Lighthouse identified four label-content-name mismatches, including visible “Generate more leads” and “Get started” links whose aria-label is “Sign up for Google Ads”, and the Expand all control.",
      "artifacts": [
        "evidence/landing-lighthouse.json"
      ],
      "suggestedFix": "Include the visible label text in each accessible name; add supplementary context after, rather than replacing, the visible wording.",
      "effort": "small"
    },
    {
      "id": "F008",
      "pathId": "landing",
      "url": "https://business.google.com/uk/google-ads/?ucbcb=1",
      "principleId": "be-inclusive",
      "principleCheckId": "names-roles-labels",
      "guidanceId": "accessibility",
      "guidanceCategory": "accessibility",
      "severity": "medium",
      "confidence": "medium",
      "summary": "Many images omit an alt attribute rather than declaring purpose.",
      "evidence": "The image probe found 18 of 27 images without alt, including visible marketing imagery as well as product-logo assets. Decorative images should use alt=\"\"; informative images need meaningful alternatives.",
      "artifacts": [
        "evidence/landing-images.json"
      ],
      "suggestedFix": "Classify every image: provide concise contextual alt text for informative imagery and explicit empty alt for decorative imagery; keep linked product logos named.",
      "effort": "small"
    },
    {
      "id": "F009",
      "pathId": "landing",
      "url": "https://business.google.com/uk/google-ads/?ucbcb=1",
      "principleId": "follow-best-practices",
      "principleCheckId": "no-console-errors",
      "guidanceId": "html",
      "guidanceCategory": "html",
      "severity": "low",
      "confidence": "high",
      "summary": "A signed-out page load logs a failed internal account request.",
      "evidence": "Lighthouse captured a 401 console/network error from MeasurementService/ListAccounts during the ordinary signed-out landing load.",
      "artifacts": [
        "evidence/landing-lighthouse.json",
        "evidence/landing-summary.json"
      ],
      "suggestedFix": "Do not call the account-list endpoint for signed-out visitors, or handle the expected unauthenticated state without a failed request or console error.",
      "effort": "small"
    },
    {
      "id": "F010",
      "pathId": "landing",
      "url": "https://business.google.com/uk/google-ads/?ucbcb=1",
      "principleId": "be-discoverable",
      "principleCheckId": "crawlable-and-mobile-friendly",
      "guidanceId": "accessibility",
      "guidanceCategory": "accessibility",
      "severity": "low",
      "confidence": "high",
      "summary": "One public content link uses non-descriptive “Learn more” text.",
      "evidence": "Lighthouse SEO reported the Google Ads Help link with text “Learn more”, which is ambiguous out of context for crawlers and assistive navigation.",
      "artifacts": [
        "evidence/landing-lighthouse.json"
      ],
      "suggestedFix": "Name the destination in the link text, for example “Learn about Data Strength best practices”.",
      "effort": "trivial"
    },
    {
      "id": "F011",
      "pathId": "landing",
      "url": "https://ads.google.com",
      "principleId": "maximize-content-reduce-noise",
      "principleCheckId": "no-intrusive-interruptions",
      "guidanceId": "light-dismiss-a-dialog",
      "guidanceCategory": "user-experience",
      "severity": "medium",
      "confidence": "high",
      "summary": "The requested ads.google.com entry point replaces the site with a full-page consent interruption.",
      "evidence": "Desktop and mobile screenshots show “Before you continue” instead of Google Ads content; on mobile the decision controls are below a long explanation and outside the first 800 px viewport.",
      "artifacts": [
        "evidence/home-desktop.png",
        "evidence/home-mobile.png",
        "evidence/consent-controls.json"
      ],
      "suggestedFix": "Keep consent choices concise and immediately visible, preserve equal Accept/Reject prominence, and avoid replacing the entire destination when regional policy permits an inline banner.",
      "effort": "medium"
    },
    {
      "id": "F012",
      "pathId": "landing",
      "url": "https://business.google.com/uk/google-ads/?ucbcb=1",
      "principleId": "be-discoverable",
      "principleCheckId": "structured-and-shareable-metadata",
      "guidanceId": "html",
      "guidanceCategory": "html",
      "severity": "medium",
      "confidence": "high",
      "summary": "The UK page emits structured data for US URLs and US copy.",
      "evidence": "The UK page probe found JSON-LD WebPage @id/url and breadcrumb items under /us/, with a US title/description, while canonical and Open Graph URLs correctly identify /uk/.",
      "artifacts": [
        "evidence/landing-probe.json"
      ],
      "suggestedFix": "Generate locale-specific JSON-LD from the same canonical locale data used by the page and Open Graph metadata; validate all @id, url, breadcrumb, and action targets.",
      "effort": "small"
    },
    {
      "id": "F013",
      "pathId": "landing",
      "url": "https://business.google.com/uk/google-ads/?ucbcb=1",
      "principleId": "maximize-content-reduce-noise",
      "principleCheckId": "semantic-dismissible-primitives",
      "guidanceId": "declarative-dialog-popover-control",
      "guidanceCategory": "user-experience",
      "severity": "low",
      "confidence": "medium",
      "summary": "Overlay surfaces are implemented as custom div dialogs rather than native dialog/popover primitives.",
      "evidence": "The DOM probe found nine DIV role=dialog surfaces and no native dialog or popover element on the landing page.",
      "artifacts": [
        "evidence/landing-probe.json"
      ],
      "suggestedFix": "Use dialog for modal workflows and popover for non-modal anchored surfaces so focus, top-layer behavior, Escape, and light-dismiss semantics are platform managed.",
      "effort": "medium"
    },
    {
      "id": "F014",
      "pathId": "landing",
      "url": "https://business.google.com/uk/google-ads/?ucbcb=1",
      "principleId": "be-memory-efficient",
      "principleCheckId": "bounded-footprint",
      "guidanceId": "defer-rendering-heavy-content",
      "guidanceCategory": "performance",
      "severity": "medium",
      "confidence": "high",
      "summary": "The idle marketing page has a disproportionate memory and DOM footprint.",
      "evidence": "The page had 2,102 DOM elements, 82.6 MB used JS heap, and 95 loaded resources. The heap summary contained about 1.03 million nodes and 58.2 MB self-size before interaction.",
      "artifacts": [
        "evidence/landing-footprint.json",
        "evidence/landing-heap-baseline.heapsnapshot"
      ],
      "suggestedFix": "Defer chat and account widgets, virtualize or remove hidden duplicate surfaces, lazy-initialize below-fold modules, and release component state when out of view.",
      "effort": "large"
    },
    {
      "id": "F015",
      "pathId": "landing",
      "url": "https://business.google.com/uk/google-ads/?ucbcb=1",
      "principleId": "follow-best-practices",
      "principleCheckId": "browser-platform-hygiene",
      "guidanceId": "html",
      "guidanceCategory": "html",
      "severity": "low",
      "confidence": "high",
      "summary": "The page is ineligible for the back/forward cache.",
      "evidence": "Lighthouse reported three bfcache failure reasons led by cache-control:no-store on the main resource and no-store resources requested by JavaScript.",
      "artifacts": [
        "evidence/landing-lighthouse.json"
      ],
      "suggestedFix": "Remove no-store from the public marketing document and non-sensitive fetches where possible; use private/revalidation directives only where account state requires them.",
      "effort": "medium"
    }
  ],
  "taskList": [
    {
      "id": "T001",
      "title": "Cut the critical-path payload and defer optional widgets/media",
      "priority": 1,
      "findingIds": [
        "F003",
        "F004",
        "F005",
        "F014"
      ],
      "guidanceId": "identify-heavy-scripts",
      "status": "open"
    },
    {
      "id": "T002",
      "title": "Correct control names and image alternatives",
      "priority": 2,
      "findingIds": [
        "F007",
        "F008",
        "F010"
      ],
      "guidanceId": "accessibility",
      "status": "open"
    },
    {
      "id": "T003",
      "title": "Harden and minimize cookies and measurement",
      "priority": 3,
      "findingIds": [
        "F005",
        "F006"
      ],
      "guidanceId": "privacy",
      "status": "open"
    },
    {
      "id": "T004",
      "title": "Add a preference-driven dark theme",
      "priority": 4,
      "findingIds": [
        "F001"
      ],
      "guidanceId": "dark-mode",
      "status": "open"
    },
    {
      "id": "T005",
      "title": "Fix locale-specific JSON-LD",
      "priority": 5,
      "findingIds": [
        "F012"
      ],
      "guidanceId": "html",
      "status": "open"
    },
    {
      "id": "T006",
      "title": "Replace custom overlays with dialog/popover where appropriate",
      "priority": 6,
      "findingIds": [
        "F013"
      ],
      "guidanceId": "declarative-dialog-popover-control",
      "status": "open"
    },
    {
      "id": "T007",
      "title": "Make consent decisions immediately visible and less interruptive",
      "priority": 7,
      "findingIds": [
        "F011"
      ],
      "guidanceId": "light-dismiss-a-dialog",
      "status": "open"
    },
    {
      "id": "T008",
      "title": "Restore bfcache eligibility and remove expected signed-out errors",
      "priority": 8,
      "findingIds": [
        "F009",
        "F015"
      ],
      "guidanceId": "html",
      "status": "open"
    },
    {
      "id": "T009",
      "title": "Add restrained route/state View Transitions",
      "priority": 9,
      "findingIds": [
        "F002"
      ],
      "guidanceId": "same-document-transitions",
      "status": "open"
    }
  ],
  "budget": {
    "wallClockSeconds": 4200,
    "pathCount": 7,
    "auditPasses": 1
  },
  "agent": "pi",
  "runId": "2026-07-23T14-26-11-758Z"
}
