{
  "published": "2026-10-13",
  "scoringVersion": "2026-10-06.2",
  "evaluationTime": "2026-10-13T12:00:00.000Z",
  "methodology": "Four constructed HTML snapshots scored by the production scoring functions in static mode, with the evaluation clock fixed to October 13, 2026 at 12:00 UTC. The baseline, noindex and unlabelled variants differ only in the stated HTML edits. The script-only variant moves the article into a client script. Page identity, response time (200 ms), compression, robots access and auxiliary context are fixed experiment inputs, not measurements of a live host. No browser, DNS, sitemap or real-user performance tests were run. No customer data or citation measurements are included. example.org is a reserved example domain, not the site tested.",
  "runs": [
    {
      "id": "baseline",
      "source": "/research/2026-10-13/baseline.html.txt",
      "url": "https://example.org/audit-guide",
      "normalizedUrl": "https://example.org/audit-guide",
      "finalUrl": "https://example.org/audit-guide",
      "title": "How to audit a public web page | Example guide",
      "description": "A practical guide to inspecting the HTML of one public page, checking actual evidence and verifying a focused fix with a repeat audit.",
      "faviconUrl": "https://example.org/favicon.ico",
      "fetchedAt": "2026-10-13T12:00:00.000Z",
      "overallScore": 84,
      "grade": "B",
      "dimensions": [
        {
          "key": "seo",
          "label": "SEO",
          "weight": 1.4,
          "score": 72,
          "grade": "C",
          "scoreAvailable": true,
          "coverage": {
            "scored": 37,
            "observed": 28,
            "heuristic": 9,
            "notTested": 0,
            "notApplicable": 4
          },
          "checks": [
            {
              "id": "titleLength",
              "label": "Title length",
              "weight": 2.2,
              "status": "pass",
              "score": 1,
              "detail": "Title is 46 characters (~373px): \"How to audit a public web page | Example guide\".",
              "evidence": {
                "title": "How to audit a public web page | Example guide",
                "length": 46,
                "pixelWidth": 373
              },
              "assessment": "observed"
            },
            {
              "id": "titlePixels",
              "label": "Title not truncated in SERPs",
              "weight": 0.8,
              "status": "pass",
              "score": 1,
              "detail": "Estimated SERP width ~373px (Google truncates around 580px).",
              "assessment": "observed"
            },
            {
              "id": "titleKeywordFront",
              "label": "Keyword near start of title",
              "weight": 1.2,
              "status": "warn",
              "score": 0.5,
              "detail": "Primary term \"page\" appears at position 26 in the title.",
              "assessment": "heuristic"
            },
            {
              "id": "titleBrand",
              "label": "Brand in title",
              "weight": 0.5,
              "status": "pass",
              "score": 1,
              "detail": "Title uses a separator, suggesting a brand suffix.",
              "assessment": "observed"
            },
            {
              "id": "metaDescLength",
              "label": "Meta description length",
              "weight": 1.6,
              "status": "pass",
              "score": 1,
              "detail": "Meta description is 134 characters.",
              "evidence": {
                "length": 134
              },
              "assessment": "observed"
            },
            {
              "id": "metaDescCta",
              "label": "Meta description has a call to action",
              "weight": 0.6,
              "status": "warn",
              "score": 0.5,
              "detail": "The description lacks a call to action.",
              "recommendation": "Add an action word (e.g. 'Discover…', 'Get…') to improve click-through.",
              "assessment": "heuristic"
            },
            {
              "id": "metaDescKeyword",
              "label": "Keyword in meta description",
              "weight": 0.6,
              "status": "pass",
              "score": 1,
              "detail": "Primary term \"page\" appears in the description.",
              "assessment": "heuristic"
            },
            {
              "id": "h1Single",
              "label": "Exactly one H1",
              "weight": 2,
              "status": "pass",
              "score": 1,
              "detail": "One <h1>: \"How do you audit a public web page?\".",
              "evidence": {
                "h1Count": 1
              },
              "assessment": "observed"
            },
            {
              "id": "h1Keyword",
              "label": "Keyword in H1",
              "weight": 1,
              "status": "pass",
              "score": 1,
              "detail": "Primary term \"page\" is in the H1.",
              "assessment": "heuristic"
            },
            {
              "id": "headingOrder",
              "label": "Logical heading hierarchy",
              "weight": 1.2,
              "status": "pass",
              "score": 1,
              "detail": "3 headings form a clean outline.",
              "evidence": {
                "headings": 3,
                "h2Count": 2
              },
              "assessment": "observed"
            },
            {
              "id": "h2Coverage",
              "label": "Sub-headings structure content",
              "weight": 0.8,
              "status": "pass",
              "score": 1,
              "detail": "2 <h2> sub-heading(s).",
              "assessment": "observed"
            },
            {
              "id": "keywordTargeting",
              "label": "Keyword targeting (title/H1/intro)",
              "weight": 2.2,
              "status": "pass",
              "score": 1,
              "detail": "Primary term \"page\" → title:✓ H1:✓ intro:✓.",
              "evidence": {
                "topKeywords": [
                  {
                    "term": "page",
                    "count": 5,
                    "density": 4.672897196261682
                  },
                  {
                    "term": "check",
                    "count": 4,
                    "density": 3.7383177570093453
                  },
                  {
                    "term": "audit",
                    "count": 3,
                    "density": 2.803738317757009
                  },
                  {
                    "term": "html",
                    "count": 3,
                    "density": 2.803738317757009
                  },
                  {
                    "term": "evidence",
                    "count": 3,
                    "density": 2.803738317757009
                  },
                  {
                    "term": "labels",
                    "count": 3,
                    "density": 2.803738317757009
                  }
                ]
              },
              "assessment": "heuristic"
            },
            {
              "id": "keywordDensity",
              "label": "Keyword density not stuffed",
              "weight": 1,
              "status": "fail",
              "score": 0,
              "detail": "Top term \"page\" is 4.7% of 107 content words.",
              "recommendation": "Reduce repetition — over-using the keyword reads as spam to Google.",
              "assessment": "heuristic"
            },
            {
              "id": "semanticDepth",
              "label": "Semantic / topical depth (phrases)",
              "weight": 1,
              "status": "warn",
              "score": 0.3333333333333333,
              "detail": "Recurring topical phrases: \"form labels\".",
              "recommendation": "Cover the topic with related sub-topics and entities (LSI) so the page demonstrates depth.",
              "evidence": {
                "phrases": [
                  {
                    "term": "form labels",
                    "count": 2,
                    "density": 1.8691588785046727
                  }
                ]
              },
              "assessment": "observed"
            },
            {
              "id": "contentDepth",
              "label": "Content depth",
              "weight": 1.4,
              "status": "fail",
              "score": 0.1,
              "detail": "Roughly 170 words of body text.",
              "recommendation": "Thin content struggles to rank — expand to comprehensively cover the topic (600+ words for key pages).",
              "evidence": {
                "words": 170
              },
              "assessment": "observed"
            },
            {
              "id": "textRatio",
              "label": "Text-to-HTML ratio",
              "weight": 0.7,
              "status": "pass",
              "score": 1,
              "detail": "Visible text is ~35.6% of the HTML payload.",
              "assessment": "observed"
            },
            {
              "id": "urlStructure",
              "label": "Clean, readable URL",
              "weight": 1,
              "status": "pass",
              "score": 1,
              "detail": "Clean URL path: \"/audit-guide\".",
              "assessment": "observed"
            },
            {
              "id": "indexable",
              "label": "Page is indexable",
              "weight": 2.4,
              "status": "pass",
              "score": 1,
              "detail": "The page is indexable (no noindex in meta or X-Robots-Tag).",
              "evidence": {
                "robotsMeta": "index,follow",
                "xRobots": ""
              },
              "assessment": "observed"
            },
            {
              "id": "followable",
              "label": "Links are followable",
              "weight": 0.6,
              "status": "pass",
              "score": 1,
              "detail": "No page-level nofollow.",
              "assessment": "observed"
            },
            {
              "id": "robotsTxt",
              "label": "Googlebot access to this URL",
              "weight": 1.2,
              "status": "pass",
              "score": 1,
              "detail": "No matching robots restriction for Googlebot on this URL.",
              "evidence": {
                "agent": "Googlebot",
                "allowed": true,
                "path": "/audit-guide"
              },
              "assessment": "observed"
            },
            {
              "id": "sitemap",
              "label": "XML sitemap available",
              "weight": 1,
              "status": "pass",
              "score": 1,
              "detail": "Sitemap reachable at undefined.",
              "assessment": "observed"
            },
            {
              "id": "canonical",
              "label": "Canonical URL",
              "weight": 1.2,
              "status": "pass",
              "score": 1,
              "detail": "Canonical → https://example.org/audit-guide (self-referencing).",
              "assessment": "observed"
            },
            {
              "id": "hreflang",
              "label": "hreflang for internationalization",
              "weight": 0.4,
              "status": "info",
              "score": 1,
              "detail": "No hreflang tags (only needed for multi-language sites).",
              "recommendation": "If you serve multiple languages/regions, add hreflang alternates.",
              "assessment": "not-applicable"
            },
            {
              "id": "openGraph",
              "label": "Open Graph tags",
              "weight": 0.9,
              "status": "fail",
              "score": 0,
              "detail": "0/5 core Open Graph tags present.",
              "recommendation": "Add og:title, og:description, og:image, og:url and og:type for rich social/chat previews.",
              "evidence": {
                "present": []
              },
              "assessment": "observed"
            },
            {
              "id": "twitterCard",
              "label": "Twitter/X card tags",
              "weight": 0.5,
              "status": "info",
              "score": 1,
              "detail": "0/3 Twitter card tags present.",
              "recommendation": "Add twitter:card, twitter:title and twitter:image for better X/Twitter previews.",
              "assessment": "not-applicable"
            },
            {
              "id": "structuredData",
              "label": "Structured data (Schema.org)",
              "weight": 1.3,
              "status": "warn",
              "score": 0.3,
              "detail": "No JSON-LD structured data found.",
              "recommendation": "Add valid JSON-LD (Organization, BreadcrumbList, Article/Product as relevant) to qualify for rich results.",
              "evidence": {
                "blocks": 0,
                "valid": 0,
                "types": []
              },
              "assessment": "observed"
            },
            {
              "id": "breadcrumbs",
              "label": "Breadcrumb structured data",
              "weight": 0.4,
              "status": "info",
              "score": 1,
              "detail": "No breadcrumb structured data.",
              "recommendation": "Add BreadcrumbList schema so search shows breadcrumb trails in results.",
              "assessment": "not-applicable"
            },
            {
              "id": "imageAlt",
              "label": "Descriptive image alt text",
              "weight": 0.9,
              "status": "pass",
              "score": 1,
              "detail": "1/1 images have alt text.",
              "assessment": "observed"
            },
            {
              "id": "internalLinks",
              "label": "Internal linking",
              "weight": 1,
              "status": "pass",
              "score": 1,
              "detail": "6 internal and 1 external links (0 nofollow).",
              "evidence": {
                "internal": 6,
                "external": 1,
                "nofollow": 0
              },
              "assessment": "observed"
            },
            {
              "id": "anchorQuality",
              "label": "Descriptive anchor text",
              "weight": 0.6,
              "status": "pass",
              "score": 1,
              "detail": "0 generic anchor(s) like \"click here\" out of 8 links.",
              "assessment": "observed"
            },
            {
              "id": "mobileViewport",
              "label": "Mobile-friendly viewport",
              "weight": 1.2,
              "status": "pass",
              "score": 1,
              "detail": "viewport: \"width=device-width, initial-scale=1\".",
              "assessment": "observed"
            },
            {
              "id": "htmlLang",
              "label": "Language declared",
              "weight": 0.6,
              "status": "pass",
              "score": 1,
              "detail": "lang=\"en\".",
              "assessment": "observed"
            },
            {
              "id": "keywordDistribution",
              "label": "Keyword across title/H1/intro/URL/alt",
              "weight": 1.4,
              "status": "warn",
              "score": 0.6,
              "detail": "Primary term \"page\" appears in 3/5 key locations (title/H1/intro/URL/alt).",
              "recommendation": "Distribute your primary keyword across the title, H1, opening text, URL slug and an image alt for unambiguous topical relevance.",
              "assessment": "heuristic"
            },
            {
              "id": "h2KeywordCoverage",
              "label": "Sub-headings cover the topic",
              "weight": 0.8,
              "status": "pass",
              "score": 1,
              "detail": "1/2 sub-headings include a top topical term.",
              "assessment": "heuristic"
            },
            {
              "id": "ogImageQuality",
              "label": "Social image is share-ready",
              "weight": 0.6,
              "status": "fail",
              "score": 0,
              "detail": "No og:image.",
              "recommendation": "Use an absolute og:image URL (1200×630) and declare og:image:width/height for reliable rich previews.",
              "assessment": "observed"
            },
            {
              "id": "cleanUrlParams",
              "label": "URL free of tracking params",
              "weight": 0.5,
              "status": "pass",
              "score": 1,
              "detail": "No tracking/session parameters in the canonical URL.",
              "assessment": "observed"
            },
            {
              "id": "anchorDiversity",
              "label": "Diverse internal anchor text",
              "weight": 0.5,
              "status": "pass",
              "score": 1,
              "detail": "8 unique anchors out of 8 links (100% diverse).",
              "assessment": "observed"
            },
            {
              "id": "indexSitemapConsistency",
              "label": "No conflicting index signals",
              "weight": 0.7,
              "status": "pass",
              "score": 1,
              "detail": "Index signals are consistent.",
              "assessment": "heuristic"
            },
            {
              "id": "titleCtr",
              "label": "Title optimised for click-through",
              "weight": 0.5,
              "status": "pass",
              "score": 1,
              "detail": "Title uses numbers/power words that lift CTR.",
              "assessment": "observed"
            },
            {
              "id": "descUnique",
              "label": "Meta description is purpose-written",
              "weight": 0.4,
              "status": "pass",
              "score": 1,
              "detail": "Meta description is distinct from body copy.",
              "assessment": "observed"
            },
            {
              "id": "feedDiscovery",
              "label": "Feed advertised (RSS/Atom)",
              "weight": 0.3,
              "status": "info",
              "score": 1,
              "detail": "No RSS/Atom/JSON feed announced in <head> (only relevant if the site publishes a feed).",
              "recommendation": "If you publish a feed, announce it with <link rel=\"alternate\" type=\"application/rss+xml\"> so readers and agents can find it.",
              "assessment": "not-applicable"
            }
          ],
          "summary": "Scored 72/100 across 37 on-page SEO checks (28 pass, 5 warn, 4 fail) — including keyword distribution, schema completeness, anchor diversity and index-signal consistency."
        },
        {
          "key": "geo",
          "label": "GEO (AI Answer Engines)",
          "weight": 1.15,
          "score": 65,
          "grade": "D",
          "scoreAvailable": true,
          "coverage": {
            "scored": 13,
            "observed": 13,
            "heuristic": 5,
            "notTested": 1,
            "notApplicable": 14
          },
          "checks": [
            {
              "id": "structuredAnswers",
              "label": "Machine-extractable structured data",
              "weight": 2.4,
              "status": "fail",
              "score": 0,
              "detail": "No JSON-LD — AI engines must guess the page's facts and entities.",
              "recommendation": "Add Article and Organization/Person JSON-LD (plus HowTo where relevant) so engines can lift facts verbatim and attribute you.",
              "assessment": "observed"
            },
            {
              "id": "questionHeadings",
              "label": "Question-based headings",
              "weight": 1.4,
              "status": "pass",
              "score": 1,
              "detail": "3 heading(s) phrased as questions.",
              "evidence": {
                "examples": [
                  "How do you audit a public web page?",
                  "What should you check first?",
                  "How do you confirm an improvement?"
                ]
              },
              "assessment": "observed"
            },
            {
              "id": "liftableContent",
              "label": "Concise, liftable answers",
              "weight": 1.4,
              "status": "pass",
              "score": 1,
              "detail": "100% of paragraphs are answer-sized; 1 list(s), 0 table(s).",
              "assessment": "heuristic"
            },
            {
              "id": "dataTables",
              "label": "Structured data tables",
              "weight": 0.5,
              "status": "info",
              "score": 1,
              "detail": "No data tables.",
              "recommendation": "Where you compare options or list specs, use <table> — engines extract tabular facts cleanly.",
              "assessment": "not-applicable"
            },
            {
              "id": "authority",
              "label": "Author & attribution (E-E-A-T)",
              "weight": 1.2,
              "status": "pass",
              "score": 1,
              "detail": "Authorship/attribution signals present.",
              "assessment": "observed"
            },
            {
              "id": "aboutPage",
              "label": "Discoverable About/Org page",
              "weight": 0.5,
              "status": "pass",
              "score": 1,
              "detail": "An About/Team/Company link is present.",
              "assessment": "observed"
            },
            {
              "id": "freshness",
              "label": "Machine-readable dates",
              "weight": 0.9,
              "status": "pass",
              "score": 1,
              "detail": "Published/modified dates are exposed.",
              "assessment": "observed"
            },
            {
              "id": "citations",
              "label": "Outbound citations",
              "weight": 0.9,
              "status": "warn",
              "score": 0.5,
              "detail": "1 outbound citation(s) to other domains.",
              "recommendation": "Cite primary sources — well-sourced pages are more likely to be trusted and cited.",
              "assessment": "observed"
            },
            {
              "id": "aiCrawlerAccess",
              "label": "AI search crawler access to this URL",
              "weight": 1.6,
              "status": "pass",
              "score": 1,
              "detail": "No matching robots restriction for OpenAI Search, Perplexity or Claude Search. This is access eligibility, not proof of indexing or citations.",
              "evidence": {
                "blockedSearch": [],
                "decisions": []
              },
              "assessment": "observed"
            },
            {
              "id": "googleAiEligibility",
              "label": "Google Search AI eligibility",
              "weight": 0,
              "status": "info",
              "score": 1,
              "detail": "Public markup cannot confirm indexing, snippet eligibility or the owner's Search Console AI inclusion setting. Google-Extended controls Gemini training and grounding; it does not control Google Search inclusion.",
              "assessment": "not-tested"
            },
            {
              "id": "aiPolicyChoices",
              "label": "Training and user-triggered access policy",
              "weight": 0,
              "status": "info",
              "score": 1,
              "detail": "Policy restrictions: none detected. Training, Gemini grounding and user-triggered agents have separate purposes. ChatGPT-User does not determine ChatGPT Search inclusion.",
              "assessment": "observed"
            },
            {
              "id": "llmsTxt",
              "label": "llms.txt published",
              "weight": 0.4,
              "status": "info",
              "score": 1,
              "detail": "No /llms.txt found (optional — Google ignores it, but some AI agents read it).",
              "recommendation": "Consider publishing /llms.txt — a curated markdown map of your key content some AI agents read. Note it has no effect on Google Search or AI Overviews.",
              "assessment": "not-applicable"
            },
            {
              "id": "linkHeaderDiscovery",
              "label": "Link header advertises resources",
              "weight": 0.3,
              "status": "info",
              "score": 1,
              "detail": "No discovery hints in the HTTP Link header (optional: lets agents find sitemap/llms.txt without parsing HTML).",
              "recommendation": "Consider advertising sitemap/llms.txt/feeds via the HTTP Link header for agents that never read your HTML.",
              "assessment": "not-applicable"
            },
            {
              "id": "contentSignal",
              "label": "AI usage declared (Content-Signal)",
              "weight": 0.2,
              "status": "info",
              "score": 1,
              "detail": "No Content-Signal directives in robots.txt (emerging, optional standard for declaring AI search/train permissions).",
              "recommendation": "Optionally add Content-Signal directives to robots.txt to state explicitly whether AI may search, ingest or train on your content.",
              "assessment": "not-applicable"
            },
            {
              "id": "semanticStructure",
              "label": "Semantic HTML landmarks",
              "weight": 1,
              "status": "pass",
              "score": 1,
              "detail": "Uses 6 semantic landmark(s): main, article, section, nav, header, footer.",
              "assessment": "observed"
            },
            {
              "id": "directAnswer",
              "label": "Direct answer up top",
              "weight": 0,
              "status": "info",
              "score": 1,
              "detail": "Opens with a definitional, quotable statement.",
              "assessment": "heuristic"
            },
            {
              "id": "serverRendered",
              "label": "Text present in the initial HTML",
              "weight": 1,
              "status": "pass",
              "score": 1,
              "detail": "170 words in the initial HTML. Short pages can be complete; text length does not establish content quality or citations.",
              "assessment": "observed"
            },
            {
              "id": "statDensity",
              "label": "Quotable statistics",
              "weight": 0,
              "status": "info",
              "score": 1,
              "detail": "0 statistic-like figures (0.0 per 500 words).",
              "recommendation": "Use relevant, verifiable figures when they help readers. Statistics density is not a measured citation signal.",
              "assessment": "heuristic"
            },
            {
              "id": "comparisonContent",
              "label": "Comparison-style content",
              "weight": 0.6,
              "status": "info",
              "score": 1,
              "detail": "No comparison or tabular content detected.",
              "recommendation": "Where relevant, add comparison tables or 'X vs Y' sections — engines surface these for decision queries.",
              "assessment": "not-applicable"
            },
            {
              "id": "selfContained",
              "label": "Self-contained opening",
              "weight": 0,
              "status": "info",
              "score": 1,
              "detail": "Opening is a self-contained, quotable definition.",
              "assessment": "heuristic"
            },
            {
              "id": "chunking",
              "label": "Content split into extractable chunks",
              "weight": 0,
              "status": "info",
              "score": 1,
              "detail": "~57 words per section across 2 sub-headings.",
              "assessment": "heuristic"
            },
            {
              "id": "tableOfContents",
              "label": "In-page anchor navigation",
              "weight": 0.4,
              "status": "info",
              "score": 1,
              "detail": "No table-of-contents anchors.",
              "recommendation": "For long content, add a table of contents with in-page anchors — it maps your sections for AI navigation.",
              "assessment": "not-applicable"
            },
            {
              "id": "entityConsistency",
              "label": "Schema entity matches page",
              "weight": 0.5,
              "status": "info",
              "score": 1,
              "detail": "No named entities in schema.",
              "assessment": "not-applicable"
            },
            {
              "id": "faqRichness",
              "label": "FAQ-style coverage",
              "weight": 0.5,
              "status": "warn",
              "score": 0.5,
              "detail": "2 question headings.",
              "recommendation": "Add a visible FAQ section answering 3+ real user questions — Q&A content is a top source of AI-answer citations. (FAQPage markup is optional; Google dropped FAQ rich results in May 2026.)",
              "assessment": "observed"
            },
            {
              "id": "absoluteRecency",
              "label": "Content is recent",
              "weight": 0.6,
              "status": "pass",
              "score": 1,
              "detail": "Content dated ~0 month(s) ago.",
              "assessment": "observed"
            },
            {
              "id": "entityRichness",
              "label": "Named-entity richness",
              "weight": 0.4,
              "status": "info",
              "score": 1,
              "detail": "19 distinct proper-noun phrases (entities engines can link).",
              "assessment": "not-applicable"
            },
            {
              "id": "answerNotHidden",
              "label": "Key content not hidden behind UI",
              "weight": 0.4,
              "status": "pass",
              "score": 1,
              "detail": "Content isn't buried in tabs/accordions.",
              "assessment": "observed"
            },
            {
              "id": "agentCard",
              "label": "A2A agent card published",
              "weight": 0.3,
              "status": "info",
              "score": 1,
              "detail": "No A2A agent card (emerging spec; only relevant if the site exposes services for AI agents to call).",
              "recommendation": "If you offer agent-callable services, consider publishing an A2A agent card at /.well-known/agent-card.json.",
              "assessment": "not-applicable"
            },
            {
              "id": "trafficAdvice",
              "label": "Traffic advice for prefetch proxies",
              "weight": 0.2,
              "status": "info",
              "score": 1,
              "detail": "No /.well-known/traffic-advice (optional: declares how prefetch proxies like Chrome's private prefetch may load your pages).",
              "recommendation": "Optionally publish /.well-known/traffic-advice to control how prefetch proxies pre-load your pages.",
              "assessment": "not-applicable"
            },
            {
              "id": "mcpServer",
              "label": "MCP server discoverable",
              "weight": 0.4,
              "status": "info",
              "score": 1,
              "detail": "No MCP server found (agents probe https://mcp.<your-domain>/ and /.well-known/mcp).",
              "recommendation": "If you offer tools or services AI agents could call, serve an MCP endpoint (Streamable HTTP) at mcp.<your-domain> or /.well-known/mcp — the two locations agents probe for it.",
              "evidence": {
                "location": null
              },
              "assessment": "not-applicable"
            },
            {
              "id": "openApiSpec",
              "label": "OpenAPI spec / API catalog published",
              "weight": 0.3,
              "status": "info",
              "score": 1,
              "detail": "No /openapi.json or /.well-known/api-catalog found (only relevant if you expose an API).",
              "recommendation": "If you expose an API, publish its OpenAPI spec at /openapi.json (or an RFC 9727 catalog at /.well-known/api-catalog) so agents can discover and call it unaided.",
              "evidence": {
                "source": null
              },
              "assessment": "not-applicable"
            },
            {
              "id": "agentsMd",
              "label": "agents.md published",
              "weight": 0.3,
              "status": "info",
              "score": 1,
              "detail": "No /agents.md found (emerging convention: a markdown briefing for AI agents at the site root).",
              "recommendation": "Consider publishing /agents.md — a short markdown briefing (what the site does, key URLs, machine-readable surfaces) that agents can read in one fetch.",
              "assessment": "not-applicable"
            },
            {
              "id": "nlweb",
              "label": "NLWeb surfaces (schemamap + /ask)",
              "weight": 0.3,
              "status": "info",
              "score": 1,
              "detail": "No NLWeb surfaces (optional: schemamap in robots.txt plus an /ask endpoint let agents query your site in natural language).",
              "recommendation": "Optionally adopt NLWeb: point agents at your structured data with schemamap: lines in robots.txt and answer natural-language questions at /ask.",
              "evidence": {
                "schemamap": false,
                "askEndpoint": null
              },
              "assessment": "not-applicable"
            }
          ],
          "summary": "Scored 65/100 across 13 applicable access and content checks. Optional editorial observations are listed separately; this score does not measure AI citations."
        },
        {
          "key": "performance",
          "label": "Performance",
          "weight": 1.3,
          "score": 93,
          "grade": "A",
          "scoreAvailable": true,
          "coverage": {
            "scored": 26,
            "observed": 25,
            "heuristic": 1,
            "notTested": 0,
            "notApplicable": 13
          },
          "checks": [
            {
              "id": "responseTime",
              "label": "Server response time",
              "weight": 2,
              "status": "pass",
              "score": 1,
              "detail": "Document response observed in 200 ms from this server; not real-user field data.",
              "evidence": {
                "ttfb": 200,
                "loadMs": 200
              },
              "assessment": "observed"
            },
            {
              "id": "redirects",
              "label": "Minimal redirects",
              "weight": 0.6,
              "status": "pass",
              "score": 1,
              "detail": "No redirect on the entry URL.",
              "assessment": "observed"
            },
            {
              "id": "htmlSize",
              "label": "HTML document size",
              "weight": 1,
              "status": "pass",
              "score": 1,
              "detail": "HTML is 3 KB uncompressed (0 KB on the wire).",
              "evidence": {
                "htmlKb": 3,
                "transferKb": 0
              },
              "assessment": "observed"
            },
            {
              "id": "compression",
              "label": "Text compression",
              "weight": 1.2,
              "status": "pass",
              "score": 1,
              "detail": "Response compressed (br).",
              "assessment": "observed"
            },
            {
              "id": "brotli",
              "label": "Brotli compression",
              "weight": 0.4,
              "status": "pass",
              "score": 1,
              "detail": "Using Brotli (best ratio).",
              "assessment": "observed"
            },
            {
              "id": "renderBlocking",
              "label": "Render-blocking resources",
              "weight": 1.6,
              "status": "pass",
              "score": 1,
              "detail": "0 render-blocking script(s) and 0 stylesheet(s) in <head>.",
              "evidence": {
                "blockingScripts": 0,
                "headStyles": 0
              },
              "assessment": "observed"
            },
            {
              "id": "scriptLoading",
              "label": "Scripts load async/deferred",
              "weight": 1,
              "status": "info",
              "score": 1,
              "detail": "No external scripts.",
              "recommendation": "Add async or defer to non-critical scripts so they don't block parsing.",
              "assessment": "not-applicable"
            },
            {
              "id": "requestCount",
              "label": "Resource request count",
              "weight": 1,
              "status": "pass",
              "score": 1,
              "detail": "~1 referenced resources (0 scripts, 0 styles, 1 images, 0 iframes).",
              "evidence": {
                "totalScripts": 0,
                "styles": 0,
                "imgs": 1,
                "iframes": 0
              },
              "assessment": "heuristic"
            },
            {
              "id": "thirdParty",
              "label": "Third-party request domains",
              "weight": 1,
              "status": "pass",
              "score": 1,
              "detail": "0 distinct third-party domain(s) referenced.",
              "evidence": {
                "domains": []
              },
              "assessment": "observed"
            },
            {
              "id": "resourceHints",
              "label": "Resource hints (preconnect/preload)",
              "weight": 0.8,
              "status": "info",
              "score": 1,
              "detail": "0 preconnect, 0 dns-prefetch, 0 preload hint(s).",
              "recommendation": "Add <link rel=preconnect> for critical third-party origins and preload key fonts/hero assets.",
              "assessment": "not-applicable"
            },
            {
              "id": "imageOptim",
              "label": "Image optimization",
              "weight": 1.4,
              "status": "info",
              "score": 1,
              "detail": "No raster images to optimise (vectors are resolution-independent).",
              "evidence": {
                "rasterImgs": 0,
                "lazy": 0,
                "rasterDimensioned": 0,
                "modern": 0,
                "responsive": 0
              },
              "assessment": "not-applicable"
            },
            {
              "id": "cls",
              "label": "Layout-shift prevention",
              "weight": 1,
              "status": "pass",
              "score": 1,
              "detail": "1/1 images declare width & height.",
              "assessment": "observed"
            },
            {
              "id": "fontDisplay",
              "label": "Web-font loading strategy",
              "weight": 0.6,
              "status": "info",
              "score": 1,
              "detail": "No external web fonts detected.",
              "assessment": "not-applicable"
            },
            {
              "id": "inlineWeight",
              "label": "Inline CSS/JS weight",
              "weight": 0.7,
              "status": "pass",
              "score": 1,
              "detail": "0 KB inline CSS, 0 KB inline JS.",
              "assessment": "observed"
            },
            {
              "id": "minification",
              "label": "HTML minification",
              "weight": 0.5,
              "status": "pass",
              "score": 1,
              "detail": "HTML appears minified.",
              "assessment": "observed"
            },
            {
              "id": "caching",
              "label": "Caching headers",
              "weight": 0.8,
              "status": "warn",
              "score": 0.5,
              "detail": "No effective Cache-Control on the document.",
              "recommendation": "Set Cache-Control on static assets (long max-age + immutable) and a sensible value on HTML.",
              "assessment": "observed"
            },
            {
              "id": "validators",
              "label": "Conditional requests (ETag/Last-Modified)",
              "weight": 0.5,
              "status": "warn",
              "score": 0.5,
              "detail": "No ETag or Last-Modified on the document — every revisit re-downloads the full body.",
              "recommendation": "Send an ETag or Last-Modified header so browsers can revalidate with If-None-Match and get a cheap 304.",
              "assessment": "observed"
            },
            {
              "id": "cdn",
              "label": "CDN / edge delivery",
              "weight": 0.6,
              "status": "pass",
              "score": 1,
              "detail": "Modern HTTP advertised.",
              "recommendation": "Serve assets from a CDN to cut latency for distant users.",
              "assessment": "observed"
            },
            {
              "id": "http2",
              "label": "Modern HTTP (h2/h3)",
              "weight": 0.5,
              "status": "pass",
              "score": 1,
              "detail": "Server advertises HTTP/2 or HTTP/3 (alt-svc).",
              "assessment": "observed"
            },
            {
              "id": "domSize",
              "label": "DOM size",
              "weight": 0.8,
              "status": "pass",
              "score": 1,
              "detail": "43 DOM nodes.",
              "assessment": "observed"
            },
            {
              "id": "cssImport",
              "label": "No CSS @import chains",
              "weight": 0.6,
              "status": "pass",
              "score": 1,
              "detail": "No @import in inline CSS.",
              "assessment": "observed"
            },
            {
              "id": "dataUriBloat",
              "label": "No heavy inline data-URIs",
              "weight": 0.7,
              "status": "pass",
              "score": 1,
              "detail": "0 base64 data-URI(s), ~0 KB inlined into the HTML.",
              "assessment": "observed"
            },
            {
              "id": "duplicateScripts",
              "label": "No duplicate scripts",
              "weight": 0.5,
              "status": "pass",
              "score": 1,
              "detail": "No duplicate script URLs.",
              "assessment": "observed"
            },
            {
              "id": "lcpImage",
              "label": "Hero image not lazy-loaded",
              "weight": 0.8,
              "status": "pass",
              "score": 1,
              "detail": "The first image loads eagerly.",
              "assessment": "observed"
            },
            {
              "id": "fetchPriority",
              "label": "LCP fetchpriority hint",
              "weight": 0.4,
              "status": "warn",
              "score": 0.5,
              "detail": "No fetchpriority hint for the LCP image.",
              "recommendation": "Add fetchpriority=\"high\" to your hero/LCP image so the browser fetches it first.",
              "assessment": "observed"
            },
            {
              "id": "preconnectCoverage",
              "label": "Critical origins preconnected",
              "weight": 0.6,
              "status": "info",
              "score": 1,
              "detail": "0/0 third-party origins are preconnected.",
              "assessment": "not-applicable"
            },
            {
              "id": "embedFacade",
              "label": "No heavy un-faceted embeds",
              "weight": 0.5,
              "status": "pass",
              "score": 1,
              "detail": "No heavy third-party embeds.",
              "assessment": "observed"
            },
            {
              "id": "inlineScript",
              "label": "No oversized inline scripts",
              "weight": 0.5,
              "status": "pass",
              "score": 1,
              "detail": "Largest inline <script> is 0.0 KB.",
              "assessment": "observed"
            },
            {
              "id": "mediaScopedCss",
              "label": "Non-critical CSS deferred/scoped",
              "weight": 0.5,
              "status": "pass",
              "score": 1,
              "detail": "0 stylesheet(s) load render-blocking (no media scope / print).",
              "assessment": "observed"
            },
            {
              "id": "legacyHeadLibs",
              "label": "No legacy libs blocking <head>",
              "weight": 0.4,
              "status": "pass",
              "score": 1,
              "detail": "No legacy libraries blocking in <head>.",
              "assessment": "observed"
            },
            {
              "id": "bfcache",
              "label": "Back/forward cache not blocked",
              "weight": 0.5,
              "status": "pass",
              "score": 1,
              "detail": "No BFCache blockers detected — back/forward navigations can restore instantly from memory.",
              "assessment": "observed"
            },
            {
              "id": "speculationRules",
              "label": "Speculation Rules (prefetch/prerender)",
              "weight": 0.3,
              "status": "info",
              "score": 1,
              "detail": "No Speculation Rules (optional: makes next-page navigations feel instant).",
              "recommendation": "Consider a <script type=\"speculationrules\"> block to prerender likely next pages on hover.",
              "assessment": "not-applicable"
            },
            {
              "id": "cssContainment",
              "label": "CSS containment",
              "weight": 0.2,
              "status": "info",
              "score": 1,
              "detail": "CSS containment not assessed — stylesheets are external and deep render is off.",
              "recommendation": "Consider contain: content (or layout/paint) on self-contained widgets to limit style/layout recalculation scope.",
              "assessment": "not-applicable"
            },
            {
              "id": "scrollbarGutter",
              "label": "scrollbar-gutter reserved",
              "weight": 0.2,
              "status": "info",
              "score": 1,
              "detail": "scrollbar-gutter not assessed — stylesheets are external and deep render is off.",
              "recommendation": "Set scrollbar-gutter: stable on the root/scroll containers so the scrollbar appearing doesn't shift content sideways.",
              "assessment": "not-applicable"
            },
            {
              "id": "viewTransitions",
              "label": "View Transitions API",
              "weight": 0.3,
              "status": "info",
              "score": 1,
              "detail": "No View Transitions usage detected (optional: native cross-fade/morph between pages and states).",
              "recommendation": "Consider the View Transitions API (@view-transition / startViewTransition) for smooth page and state transitions without JS animation libraries.",
              "assessment": "not-applicable"
            },
            {
              "id": "scrollDrivenAnimations",
              "label": "Scroll-driven animations (CSS)",
              "weight": 0.2,
              "status": "info",
              "score": 1,
              "detail": "No scroll-driven animation usage detected (optional: animation-timeline: scroll()/view()).",
              "recommendation": "Consider CSS scroll-driven animations (animation-timeline) for scroll effects — they run off the main thread with zero JS.",
              "assessment": "not-applicable"
            },
            {
              "id": "serverTiming",
              "label": "Server-Timing header",
              "weight": 0.2,
              "status": "info",
              "score": 1,
              "detail": "No Server-Timing header on the document.",
              "recommendation": "Emit a Server-Timing header (e.g. db;dur=42, cache;desc=hit) to surface backend timings in DevTools and RUM analytics.",
              "assessment": "not-applicable"
            },
            {
              "id": "compressionDictionary",
              "label": "Compression Dictionary Transport",
              "weight": 0.2,
              "status": "info",
              "score": 1,
              "detail": "No compression-dictionary headers (cutting-edge: Use-As-Dictionary lets returning visitors download only the diff of updated assets).",
              "recommendation": "Consider Compression Dictionary Transport (Use-As-Dictionary on key assets) so returning visitors fetch deltas instead of full files.",
              "assessment": "not-applicable"
            },
            {
              "id": "earlyHintsReady",
              "label": "Early Hints (103) readiness",
              "weight": 0.3,
              "status": "info",
              "score": 1,
              "detail": "No Link response header with preload/preconnect on the document.",
              "recommendation": "Send 103 Early Hints with Link headers (rel=preload/preconnect) on the main document so browsers start fetching critical assets before the HTML is ready.",
              "assessment": "not-applicable"
            }
          ],
          "summary": "Scored 93/100 across 26 performance signals (0 failing) — including LCP-image handling, CSS @import chains, revalidators, BFCache eligibility, preconnect coverage and embed facades."
        },
        {
          "key": "accessibility",
          "label": "Accessibility",
          "weight": 1.2,
          "score": 100,
          "grade": "A+",
          "scoreAvailable": true,
          "coverage": {
            "scored": 22,
            "observed": 22,
            "heuristic": 0,
            "notTested": 1,
            "notApplicable": 4
          },
          "checks": [
            {
              "id": "lang",
              "label": "Document language declared",
              "weight": 1.4,
              "status": "pass",
              "score": 1,
              "detail": "lang=\"en\".",
              "assessment": "observed"
            },
            {
              "id": "imgAlt",
              "label": "Images have alt attributes",
              "weight": 1.8,
              "status": "pass",
              "score": 1,
              "detail": "0/1 images missing an alt attribute.",
              "evidence": {
                "total": 1,
                "missingAlt": 0
              },
              "assessment": "observed"
            },
            {
              "id": "altQuality",
              "label": "Alt text is meaningful",
              "weight": 0.6,
              "status": "pass",
              "score": 1,
              "detail": "No generic alt text detected.",
              "assessment": "observed"
            },
            {
              "id": "formLabels",
              "label": "Form inputs are labelled",
              "weight": 1.8,
              "status": "pass",
              "score": 1,
              "detail": "0/1 fields have no associated label.",
              "evidence": {
                "total": 1,
                "unlabeled": 0
              },
              "assessment": "observed"
            },
            {
              "id": "linkText",
              "label": "Descriptive link text",
              "weight": 0.9,
              "status": "pass",
              "score": 1,
              "detail": "0 vague and 0 empty link(s) of 8.",
              "assessment": "observed"
            },
            {
              "id": "buttonNames",
              "label": "Buttons have accessible names",
              "weight": 0.9,
              "status": "pass",
              "score": 1,
              "detail": "0 button(s) without an accessible name.",
              "assessment": "observed"
            },
            {
              "id": "zoom",
              "label": "Pinch-zoom not disabled",
              "weight": 1,
              "status": "pass",
              "score": 1,
              "detail": "Users can zoom.",
              "assessment": "observed"
            },
            {
              "id": "landmarks",
              "label": "Landmark regions",
              "weight": 1,
              "status": "pass",
              "score": 1,
              "detail": "Landmarks present: main:true nav:true header:true footer:true.",
              "assessment": "observed"
            },
            {
              "id": "skipLink",
              "label": "Skip-to-content link",
              "weight": 0.5,
              "status": "pass",
              "score": 1,
              "detail": "A skip link is present.",
              "assessment": "observed"
            },
            {
              "id": "headingStructure",
              "label": "Headings form an outline",
              "weight": 0.8,
              "status": "pass",
              "score": 1,
              "detail": "3 headings in order.",
              "assessment": "observed"
            },
            {
              "id": "ariaHidden",
              "label": "No focusable content in aria-hidden",
              "weight": 0.6,
              "status": "pass",
              "score": 1,
              "detail": "No focusable elements hidden from assistive tech.",
              "assessment": "observed"
            },
            {
              "id": "tabindex",
              "label": "No positive tabindex",
              "weight": 0.5,
              "status": "pass",
              "score": 1,
              "detail": "Natural focus order preserved.",
              "assessment": "observed"
            },
            {
              "id": "autoplay",
              "label": "No autoplaying media",
              "weight": 0.4,
              "status": "pass",
              "score": 1,
              "detail": "No autoplaying audio/video.",
              "assessment": "observed"
            },
            {
              "id": "contrast",
              "label": "Text colour contrast (WCAG AA)",
              "weight": 1.4,
              "status": "info",
              "score": 1,
              "detail": "No colour pairs to evaluate (colours likely set via external CSS — enable deep render to assess).",
              "evidence": {
                "checked": 0,
                "failures": 0,
                "worst": null
              },
              "assessment": "not-tested"
            },
            {
              "id": "accessibleNames",
              "label": "Interactive elements are named",
              "weight": 1.3,
              "status": "pass",
              "score": 1,
              "detail": "10/10 interactive elements expose an accessible name.",
              "evidence": {
                "total": 10,
                "named": 10
              },
              "assessment": "observed"
            },
            {
              "id": "semanticInteractive",
              "label": "Interactive elements are semantic",
              "weight": 1,
              "status": "pass",
              "score": 1,
              "detail": "All interactive elements use <a>/<button>.",
              "assessment": "observed"
            },
            {
              "id": "validNesting",
              "label": "No invalid interactive nesting",
              "weight": 0.7,
              "status": "pass",
              "score": 1,
              "detail": "No invalid nesting detected.",
              "assessment": "observed"
            },
            {
              "id": "reducedMotion",
              "label": "Respects prefers-reduced-motion",
              "weight": 0.6,
              "status": "info",
              "score": 1,
              "detail": "No inline animations detected.",
              "assessment": "not-applicable"
            },
            {
              "id": "landmarkUniqueness",
              "label": "Unique top-level landmarks",
              "weight": 0.6,
              "status": "pass",
              "score": 1,
              "detail": "Exactly one main landmark.",
              "assessment": "observed"
            },
            {
              "id": "ariaRefs",
              "label": "ARIA references resolve",
              "weight": 0.6,
              "status": "pass",
              "score": 1,
              "detail": "All aria-labelledby/describedby/controls point to existing IDs.",
              "assessment": "observed"
            },
            {
              "id": "emptyHeadings",
              "label": "No empty headings",
              "weight": 0.5,
              "status": "pass",
              "score": 1,
              "detail": "No empty headings.",
              "assessment": "observed"
            },
            {
              "id": "touchTargets",
              "label": "Adequate touch-target size",
              "weight": 0.5,
              "status": "info",
              "score": 1,
              "detail": "No inline-sized interactive elements to assess.",
              "assessment": "not-applicable"
            },
            {
              "id": "langFormat",
              "label": "Valid lang value",
              "weight": 0.4,
              "status": "pass",
              "score": 1,
              "detail": "lang=\"en\" is well-formed.",
              "assessment": "observed"
            },
            {
              "id": "a11yOverlay",
              "label": "No accessibility overlay widget",
              "weight": 0.8,
              "status": "pass",
              "score": 1,
              "detail": "No accessibility overlay detected.",
              "assessment": "observed"
            },
            {
              "id": "focusRing",
              "label": "Keyboard focus ring preserved",
              "weight": 0.7,
              "status": "pass",
              "score": 1,
              "detail": "No focus-outline removal detected.",
              "assessment": "observed"
            },
            {
              "id": "inlineLang",
              "label": "Language of parts (lang on foreign content)",
              "weight": 0.3,
              "status": "info",
              "score": 1,
              "detail": "No inline lang attributes found — untagged foreign-language passages can't be detected statically.",
              "recommendation": "If the page quotes or embeds text in another language, wrap it with lang=\"xx\" (WCAG 3.1.2) so screen readers pronounce it correctly.",
              "assessment": "not-applicable"
            },
            {
              "id": "translateAttr",
              "label": "Machine-translation hints (translate=no)",
              "weight": 0.2,
              "status": "info",
              "score": 1,
              "detail": "No translate=\"no\"/notranslate markers found.",
              "recommendation": "Mark brand names, code snippets and proper nouns with translate=\"no\" so browser auto-translation doesn't mangle them.",
              "assessment": "not-applicable"
            }
          ],
          "summary": "Scored 100/100 against 22 WCAG checks (0 failing, 0 risky) — including computed colour-contrast, accessible-name coverage, semantic interactivity and ARIA-reference integrity."
        },
        {
          "key": "codeQuality",
          "label": "Code Quality",
          "weight": 0.9,
          "score": 98,
          "grade": "A+",
          "scoreAvailable": true,
          "coverage": {
            "scored": 25,
            "observed": 25,
            "heuristic": 0,
            "notTested": 0,
            "notApplicable": 2
          },
          "checks": [
            {
              "id": "doctype",
              "label": "HTML5 doctype",
              "weight": 1,
              "status": "pass",
              "score": 1,
              "detail": "Standards-mode <!doctype html>.",
              "assessment": "observed"
            },
            {
              "id": "charset",
              "label": "Character encoding declared early",
              "weight": 1,
              "status": "pass",
              "score": 1,
              "detail": "Charset declared within the first 1KB.",
              "assessment": "observed"
            },
            {
              "id": "lang",
              "label": "Language attribute",
              "weight": 0.6,
              "status": "pass",
              "score": 1,
              "detail": "html lang set.",
              "assessment": "observed"
            },
            {
              "id": "deprecatedTags",
              "label": "No deprecated tags",
              "weight": 1,
              "status": "pass",
              "score": 1,
              "detail": "No deprecated HTML tags.",
              "assessment": "observed"
            },
            {
              "id": "deprecatedAttrs",
              "label": "No presentational attributes",
              "weight": 0.6,
              "status": "pass",
              "score": 1,
              "detail": "No deprecated presentational attributes.",
              "assessment": "observed"
            },
            {
              "id": "inlineStyles",
              "label": "Limited inline styles",
              "weight": 0.9,
              "status": "pass",
              "score": 1,
              "detail": "0 elements (0.0%) use inline style attributes.",
              "assessment": "observed"
            },
            {
              "id": "inlineHandlers",
              "label": "No inline event handlers",
              "weight": 0.7,
              "status": "pass",
              "score": 1,
              "detail": "No inline on* event handlers.",
              "assessment": "observed"
            },
            {
              "id": "dupeIds",
              "label": "Unique element IDs",
              "weight": 0.9,
              "status": "pass",
              "score": 1,
              "detail": "All element IDs are unique.",
              "assessment": "observed"
            },
            {
              "id": "emptyElements",
              "label": "No empty interactive elements",
              "weight": 0.5,
              "status": "pass",
              "score": 1,
              "detail": "No empty links.",
              "assessment": "observed"
            },
            {
              "id": "semanticRatio",
              "label": "Semantic elements over div soup",
              "weight": 0.8,
              "status": "pass",
              "score": 1,
              "detail": "0 <div>s vs 7 semantic element(s) (0% divs).",
              "assessment": "observed"
            },
            {
              "id": "mixedContent",
              "label": "No mixed content",
              "weight": 1.1,
              "status": "pass",
              "score": 1,
              "detail": "No insecure http resources on an https page.",
              "evidence": {
                "mixed": 0
              },
              "assessment": "observed"
            },
            {
              "id": "leftovers",
              "label": "No debug leftovers",
              "weight": 0.5,
              "status": "pass",
              "score": 1,
              "detail": "No TODO/console leftovers in output.",
              "assessment": "observed"
            },
            {
              "id": "comments",
              "label": "Few HTML comments in production",
              "weight": 0.3,
              "status": "pass",
              "score": 1,
              "detail": "0 HTML comment(s) in the output.",
              "assessment": "observed"
            },
            {
              "id": "favicon",
              "label": "Favicon declared",
              "weight": 0.4,
              "status": "warn",
              "score": 0.5,
              "detail": "No favicon declared.",
              "recommendation": "Add a favicon and apple-touch-icon.",
              "assessment": "observed"
            },
            {
              "id": "domSize",
              "label": "Reasonable DOM size",
              "weight": 0.8,
              "status": "pass",
              "score": 1,
              "detail": "43 DOM elements.",
              "assessment": "observed"
            },
            {
              "id": "domDepth",
              "label": "DOM not too deeply nested",
              "weight": 0.5,
              "status": "pass",
              "score": 1,
              "detail": "Maximum nesting depth ~7.",
              "assessment": "observed"
            },
            {
              "id": "outdatedLibs",
              "label": "No outdated/known-risk libraries",
              "weight": 1,
              "status": "info",
              "score": 1,
              "detail": "No fingerprinted libraries.",
              "evidence": {
                "libs": []
              },
              "assessment": "not-applicable"
            },
            {
              "id": "jsUrls",
              "label": "No javascript: URLs",
              "weight": 0.6,
              "status": "pass",
              "score": 1,
              "detail": "No javascript: URLs.",
              "assessment": "observed"
            },
            {
              "id": "metaRefresh",
              "label": "No meta-refresh redirects",
              "weight": 0.5,
              "status": "pass",
              "score": 1,
              "detail": "No meta refresh.",
              "assessment": "observed"
            },
            {
              "id": "singletons",
              "label": "Valid document structure",
              "weight": 0.7,
              "status": "pass",
              "score": 1,
              "detail": "Exactly one html/head/body/title.",
              "assessment": "observed"
            },
            {
              "id": "brokenAnchors",
              "label": "In-page anchors resolve",
              "weight": 0.5,
              "status": "pass",
              "score": 1,
              "detail": "All in-page anchor links resolve.",
              "assessment": "observed"
            },
            {
              "id": "formValidity",
              "label": "Forms are well-formed",
              "weight": 0.6,
              "status": "pass",
              "score": 1,
              "detail": "0/1 form(s) missing a submit target or have unnamed fields.",
              "assessment": "observed"
            },
            {
              "id": "noSecrets",
              "label": "No secrets/internal data exposed",
              "weight": 0.7,
              "status": "pass",
              "score": 1,
              "detail": "No obvious secrets or internal data in the markup.",
              "assessment": "observed"
            },
            {
              "id": "importantAbuse",
              "label": "No !important abuse",
              "weight": 0.5,
              "status": "pass",
              "score": 1,
              "detail": "0 !important declaration(s).",
              "assessment": "observed"
            },
            {
              "id": "semanticInteractive",
              "label": "Interactive elements are real controls",
              "weight": 0.6,
              "status": "pass",
              "score": 1,
              "detail": "Interactivity uses <a>/<button>.",
              "assessment": "observed"
            },
            {
              "id": "dupMeta",
              "label": "No duplicate meta tags",
              "weight": 0.4,
              "status": "pass",
              "score": 1,
              "detail": "No duplicate description/viewport tags.",
              "assessment": "observed"
            },
            {
              "id": "modernCssAdoption",
              "label": "Modern-CSS adoption",
              "weight": 0,
              "status": "info",
              "score": 1,
              "detail": "Modern-CSS adoption not assessed (external stylesheets not fetched) — container queries, anchor positioning and text-wrap balance can't be detected from the served HTML alone.",
              "assessment": "not-applicable"
            }
          ],
          "summary": "Scored 98/100 on 25 front-end hygiene checks (24 clean) — including outdated-library detection, document validity, broken anchors, exposed secrets and !important abuse."
        },
        {
          "key": "uiux",
          "label": "UI / UX",
          "weight": 1.05,
          "score": 96,
          "grade": "A+",
          "scoreAvailable": true,
          "coverage": {
            "scored": 16,
            "observed": 4,
            "heuristic": 12,
            "notTested": 2,
            "notApplicable": 11
          },
          "checks": [
            {
              "id": "responsive",
              "label": "Mobile-responsive viewport",
              "weight": 1.8,
              "status": "pass",
              "score": 1,
              "detail": "Responsive viewport configured.",
              "assessment": "observed"
            },
            {
              "id": "mediaQueries",
              "label": "Responsive CSS present",
              "weight": 0.6,
              "status": "info",
              "score": 1,
              "detail": "No inline media queries (may be in external CSS).",
              "assessment": "not-tested"
            },
            {
              "id": "cta",
              "label": "Clear call-to-action",
              "weight": 1.5,
              "status": "pass",
              "score": 1,
              "detail": "3 action-oriented control(s) detected using the page language. Prominence is not assessed from HTML.",
              "evidence": {
                "ctas": 3,
                "purpose": "article",
                "pageLang": "en"
              },
              "assessment": "heuristic"
            },
            {
              "id": "navigation",
              "label": "Discoverable navigation",
              "weight": 1.2,
              "status": "pass",
              "score": 1,
              "detail": "3 navigation link(s) inside <nav>.",
              "assessment": "heuristic"
            },
            {
              "id": "search",
              "label": "Site search",
              "weight": 0.4,
              "status": "info",
              "score": 1,
              "detail": "No site search detected.",
              "recommendation": "For content-heavy sites, add search to help users find things fast.",
              "assessment": "not-applicable"
            },
            {
              "id": "breadcrumbs",
              "label": "Breadcrumbs / wayfinding",
              "weight": 0.3,
              "status": "info",
              "score": 1,
              "detail": "No breadcrumbs detected.",
              "assessment": "not-applicable"
            },
            {
              "id": "contact",
              "label": "Contact information",
              "weight": 0.8,
              "status": "pass",
              "score": 1,
              "detail": "Contact details/links present.",
              "assessment": "heuristic"
            },
            {
              "id": "social",
              "label": "Social proof / links",
              "weight": 0.4,
              "status": "info",
              "score": 1,
              "detail": "No social links detected.",
              "assessment": "not-applicable"
            },
            {
              "id": "footer",
              "label": "Footer present",
              "weight": 0.4,
              "status": "pass",
              "score": 1,
              "detail": "Footer region present.",
              "assessment": "observed"
            },
            {
              "id": "readability",
              "label": "Readable prose (Flesch)",
              "weight": 1,
              "status": "pass",
              "score": 1,
              "detail": "Flesch Reading Ease 54.4 — fairly difficult (10th–12th grade); avg 9 words/sentence.",
              "evidence": {
                "flesch": 54.4,
                "grade": 7.9
              },
              "assessment": "heuristic"
            },
            {
              "id": "scannability",
              "label": "Scannable content blocks",
              "weight": 0.7,
              "status": "pass",
              "score": 1,
              "detail": "0/4 paragraphs are very long (120+ words).",
              "assessment": "heuristic"
            },
            {
              "id": "legibility",
              "label": "Legible base font size",
              "weight": 0.7,
              "status": "info",
              "score": 1,
              "detail": "Font size was not measured; computed styles and external CSS are not evaluated in this check.",
              "assessment": "not-tested"
            },
            {
              "id": "formUx",
              "label": "Form input ergonomics",
              "weight": 0.9,
              "status": "pass",
              "score": 0.8,
              "detail": "1 field(s): 1 with a specific type (email/tel/url/number/…), 1 autocomplete, 0 placeholder.",
              "assessment": "observed"
            },
            {
              "id": "valueProp",
              "label": "Clear headline / value prop",
              "weight": 0.9,
              "status": "pass",
              "score": 1,
              "detail": "H1: \"How do you audit a public web page?\".",
              "assessment": "heuristic"
            },
            {
              "id": "hierarchy",
              "label": "Visual hierarchy",
              "weight": 0.8,
              "status": "pass",
              "score": 1,
              "detail": "3 section heading(s) and 1 image(s) establish rhythm.",
              "assessment": "heuristic"
            },
            {
              "id": "polish",
              "label": "Tab/brand polish",
              "weight": 0.3,
              "status": "warn",
              "score": 0.5,
              "detail": "Favicon + descriptive title give a polished browser-tab presence.",
              "recommendation": "Add a favicon for a polished, trustworthy tab presence.",
              "assessment": "heuristic"
            },
            {
              "id": "clicksToContact",
              "label": "Contact reachable in ≤1 click",
              "weight": 1.6,
              "status": "pass",
              "score": 1,
              "detail": "Estimated 0 click(s) to contact — contact form on this page.",
              "evidence": {
                "clicks": 0
              },
              "assessment": "heuristic"
            },
            {
              "id": "colorConsistency",
              "label": "Disciplined colour palette",
              "weight": 1.1,
              "status": "pass",
              "score": 1,
              "detail": "3 distinct colours used in inline/embedded styles.",
              "evidence": {
                "colors": 3
              },
              "assessment": "heuristic"
            },
            {
              "id": "typeScale",
              "label": "Consistent type scale",
              "weight": 1,
              "status": "info",
              "score": 1,
              "detail": "No inline font sizes to assess.",
              "evidence": {
                "fontSizes": 0,
                "fontFamilies": 0
              },
              "assessment": "not-applicable"
            },
            {
              "id": "fontDiscipline",
              "label": "Limited font families",
              "weight": 0.7,
              "status": "info",
              "score": 1,
              "detail": "0 distinct font families.",
              "assessment": "not-applicable"
            },
            {
              "id": "buttonConsistency",
              "label": "Consistent button styling",
              "weight": 1,
              "status": "info",
              "score": 1,
              "detail": "1 visually-distinct button/CTA styles detected.",
              "assessment": "not-applicable"
            },
            {
              "id": "spacingScale",
              "label": "Consistent spacing scale",
              "weight": 0.7,
              "status": "pass",
              "score": 1,
              "detail": "1 distinct margin/padding/gap values.",
              "assessment": "heuristic"
            },
            {
              "id": "importantAbuse",
              "label": "No !important abuse",
              "weight": 0.5,
              "status": "pass",
              "score": 1,
              "detail": "0 !important declaration(s).",
              "assessment": "observed"
            },
            {
              "id": "aboveFold",
              "label": "Opening content signals (HTML estimate)",
              "weight": 1.2,
              "status": "pass",
              "score": 1,
              "detail": "Hero has headline:✓ supporting text:✓ CTA:✓.",
              "assessment": "heuristic"
            },
            {
              "id": "trustSignals",
              "label": "Conversion trust signals",
              "weight": 0.9,
              "status": "info",
              "score": 0,
              "detail": "No testimonials, logos, ratings or guarantees detected. This conversion check is not required for the inferred page purpose.",
              "assessment": "not-applicable"
            },
            {
              "id": "classSprawl",
              "label": "Maintainable class system",
              "weight": 0.6,
              "status": "info",
              "score": 1,
              "detail": "0 distinct class names across 43 elements (ratio 0.00).",
              "assessment": "not-applicable"
            },
            {
              "id": "themeColor",
              "label": "Browser chrome themed (theme-color/color-scheme)",
              "weight": 0.3,
              "status": "info",
              "score": 1,
              "detail": "theme-color ✗, color-scheme ✗.",
              "recommendation": "Add <meta name=\"theme-color\"> to tint browser chrome to your brand, and <meta name=\"color-scheme\"> so dark-mode users don't get a white flash before CSS loads.",
              "assessment": "not-applicable"
            },
            {
              "id": "manifest",
              "label": "Web app manifest",
              "weight": 0.3,
              "status": "info",
              "score": 1,
              "detail": "No web app manifest (optional: controls name/icon/colours when users install or pin the site).",
              "recommendation": "Add a manifest.json with name, icons and theme colours, linked via <link rel=\"manifest\">.",
              "assessment": "not-applicable"
            },
            {
              "id": "serviceWorker",
              "label": "Service worker (offline/cache layer)",
              "weight": 0.4,
              "status": "info",
              "score": 1,
              "detail": "No service worker detected (optional: only worth adding for app-like sites that benefit from offline/installable behaviour).",
              "assessment": "not-applicable"
            }
          ],
          "summary": "Scored 96/100 across 17 UI/UX & conversion checks — including click-depth to contact, design-token consistency, above-the-fold pitch and trust signals that most graders ignore."
        },
        {
          "key": "dataTracking",
          "label": "Data & Tracking",
          "weight": 0.8,
          "score": 100,
          "grade": "A+",
          "scoreAvailable": true,
          "coverage": {
            "scored": 6,
            "observed": 6,
            "heuristic": 0,
            "notTested": 2,
            "notApplicable": 5
          },
          "checks": [
            {
              "id": "hasAnalytics",
              "label": "Web analytics installed",
              "weight": 2.4,
              "status": "info",
              "score": 0,
              "detail": "No recognized client-side analytics detected. The page may intentionally omit analytics or measure activity server-side; no score penalty.",
              "recommendation": "If measurement is needed, verify your server-side or client-side setup against your goals; analytics is optional for this score.",
              "evidence": {
                "analytics": [],
                "tagManager": false
              },
              "assessment": "not-tested"
            },
            {
              "id": "conversionTracking",
              "label": "Conversion / marketing tracking",
              "weight": 1.2,
              "status": "info",
              "score": 1,
              "detail": "No advertising/marketing pixels — fine for a privacy-first site (only needed if you run paid acquisition).",
              "recommendation": "If you run paid acquisition, add the relevant pixels (Meta, Google Ads, LinkedIn) to measure ROI.",
              "assessment": "not-applicable"
            },
            {
              "id": "tagManager",
              "label": "Tag governance",
              "weight": 0.8,
              "status": "info",
              "score": 1,
              "detail": "Few tags; a manager is optional at this scale.",
              "assessment": "not-applicable"
            },
            {
              "id": "consent",
              "label": "Tracking and consent markup",
              "weight": 2,
              "status": "info",
              "score": 1,
              "detail": "No recognized profiling trackers; consent requirements were not assessed.",
              "evidence": {
                "consent": []
              },
              "assessment": "not-tested"
            },
            {
              "id": "privacyPolicy",
              "label": "Privacy policy link",
              "weight": 0.8,
              "status": "pass",
              "score": 1,
              "detail": "A privacy/cookie policy link is present.",
              "assessment": "observed"
            },
            {
              "id": "trackerCount",
              "label": "Reasonable tracker count",
              "weight": 0.9,
              "status": "pass",
              "score": 1,
              "detail": "0 distinct tracking tool(s) detected.",
              "evidence": {
                "vendors": []
              },
              "assessment": "observed"
            },
            {
              "id": "duplicateAnalytics",
              "label": "No duplicate analytics",
              "weight": 0.6,
              "status": "pass",
              "score": 1,
              "detail": "0 GA4 property.",
              "assessment": "observed"
            },
            {
              "id": "piiLeak",
              "label": "No PII in tracking/URLs",
              "weight": 1,
              "status": "pass",
              "score": 1,
              "detail": "No obvious PII in tracking calls or URLs.",
              "assessment": "observed"
            },
            {
              "id": "gpcDnt",
              "label": "Honours GPC / Do-Not-Track",
              "weight": 0.4,
              "status": "info",
              "score": 1,
              "detail": "No consent-requiring tracking to gate — GPC/DNT not applicable.",
              "assessment": "not-applicable"
            },
            {
              "id": "firstPartyTagging",
              "label": "First-party / server-side tagging",
              "weight": 0.4,
              "status": "info",
              "score": 1,
              "detail": "Tagging appears fully client-side/third-party.",
              "assessment": "not-applicable"
            },
            {
              "id": "fingerprinting",
              "label": "No covert fingerprinting",
              "weight": 0.6,
              "status": "pass",
              "score": 1,
              "detail": "No device-fingerprinting libraries detected.",
              "assessment": "observed"
            },
            {
              "id": "cookiePolicy",
              "label": "Cookie policy / settings link",
              "weight": 0.4,
              "status": "info",
              "score": 1,
              "detail": "No dedicated cookie policy/settings link.",
              "assessment": "not-applicable"
            },
            {
              "id": "trackerPlacement",
              "label": "Trackers load non-blocking",
              "weight": 0.4,
              "status": "pass",
              "score": 1,
              "detail": "Tracking tags load async/deferred.",
              "assessment": "observed"
            }
          ],
          "summary": "Scored 100/100. Detected 0 tool(s) across 6 checks — including consent ordering, PII leakage, fingerprinting and duplicate-property detection."
        },
        {
          "key": "security",
          "label": "Security",
          "weight": 1.05,
          "score": 52,
          "grade": "E",
          "scoreAvailable": true,
          "coverage": {
            "scored": 13,
            "observed": 13,
            "heuristic": 0,
            "notTested": 1,
            "notApplicable": 6
          },
          "checks": [
            {
              "id": "https",
              "label": "Served over HTTPS",
              "weight": 3,
              "status": "pass",
              "score": 1,
              "detail": "The final URL is served over HTTPS.",
              "assessment": "observed"
            },
            {
              "id": "hsts",
              "label": "HSTS header",
              "weight": 1.4,
              "status": "warn",
              "score": 0,
              "detail": "No HSTS header.",
              "recommendation": "Set Strict-Transport-Security: max-age=31536000; includeSubDomains; preload.",
              "assessment": "observed"
            },
            {
              "id": "csp",
              "label": "Content Security Policy",
              "weight": 1.5,
              "status": "warn",
              "score": 0.2,
              "detail": "No Content-Security-Policy.",
              "recommendation": "Add a Content-Security-Policy (start in report-only mode) to mitigate XSS.",
              "assessment": "observed"
            },
            {
              "id": "xcto",
              "label": "X-Content-Type-Options: nosniff",
              "weight": 0.8,
              "status": "warn",
              "score": 0.5,
              "detail": "Missing X-Content-Type-Options: nosniff.",
              "recommendation": "Add X-Content-Type-Options: nosniff to stop MIME sniffing.",
              "assessment": "observed"
            },
            {
              "id": "clickjacking",
              "label": "Clickjacking protection",
              "weight": 1,
              "status": "warn",
              "score": 0.5,
              "detail": "No clickjacking protection.",
              "recommendation": "Set X-Frame-Options: SAMEORIGIN or a CSP frame-ancestors directive.",
              "assessment": "observed"
            },
            {
              "id": "referrerPolicy",
              "label": "Referrer-Policy",
              "weight": 0.6,
              "status": "warn",
              "score": 0.5,
              "detail": "No Referrer-Policy.",
              "recommendation": "Set Referrer-Policy: strict-origin-when-cross-origin to avoid leaking URLs.",
              "assessment": "observed"
            },
            {
              "id": "permissionsPolicy",
              "label": "Permissions-Policy",
              "weight": 0.5,
              "status": "info",
              "score": 1,
              "detail": "No Permissions-Policy (recommended).",
              "recommendation": "Add a Permissions-Policy to disable unused features (camera, geolocation…).",
              "assessment": "not-applicable"
            },
            {
              "id": "crossOrigin",
              "label": "Cross-origin policies (COOP/CORP)",
              "weight": 0.5,
              "status": "info",
              "score": 1,
              "detail": "COOP: —, CORP: —.",
              "recommendation": "Consider Cross-Origin-Opener-Policy and Cross-Origin-Resource-Policy to harden isolation.",
              "assessment": "not-applicable"
            },
            {
              "id": "disclosure",
              "label": "No stack/version disclosure",
              "weight": 0.6,
              "status": "pass",
              "score": 1,
              "detail": "No obvious version disclosure.",
              "assessment": "observed"
            },
            {
              "id": "mixedContent",
              "label": "No mixed content",
              "weight": 1,
              "status": "pass",
              "score": 1,
              "detail": "No insecure http resources on an https page.",
              "assessment": "observed"
            },
            {
              "id": "formAction",
              "label": "Forms submit over HTTPS",
              "weight": 0.6,
              "status": "pass",
              "score": 1,
              "detail": "No forms post to an insecure http endpoint.",
              "assessment": "observed"
            },
            {
              "id": "dangerousJs",
              "label": "No obvious dangerous JS sinks",
              "weight": 0.4,
              "status": "pass",
              "score": 1,
              "detail": "No eval/document.write in the served HTML.",
              "assessment": "observed"
            },
            {
              "id": "securityTxt",
              "label": "security.txt published",
              "weight": 0.4,
              "status": "warn",
              "score": 0.5,
              "detail": "No security.txt found.",
              "recommendation": "Publish /.well-known/security.txt with a disclosure contact so researchers can report issues responsibly.",
              "assessment": "observed"
            },
            {
              "id": "corsWildcard",
              "label": "No reflexive/wildcard CORS",
              "weight": 0.5,
              "status": "pass",
              "score": 1,
              "detail": "No permissive CORS header on the document.",
              "assessment": "observed"
            },
            {
              "id": "vulnerableDeps",
              "label": "No known-vulnerable libraries",
              "weight": 0.8,
              "status": "pass",
              "score": 1,
              "detail": "No outdated/known-risk client libraries detected.",
              "assessment": "observed"
            },
            {
              "id": "crossOriginIsolation",
              "label": "Cross-origin isolation headers",
              "weight": 0.3,
              "status": "info",
              "score": 1,
              "detail": "No Cross-Origin-Embedder-Policy (needed for full isolation / SharedArrayBuffer).",
              "recommendation": "If you need cross-origin isolation, pair COOP with Cross-Origin-Embedder-Policy.",
              "assessment": "not-applicable"
            },
            {
              "id": "reportingEndpoints",
              "label": "Violation reporting configured",
              "weight": 0.3,
              "status": "info",
              "score": 1,
              "detail": "No Reporting-Endpoints header or CSP report-to — policy violations in the field go unseen.",
              "recommendation": "Add a Reporting-Endpoints header (plus report-to in your CSP) so real-world policy breakage reaches you.",
              "assessment": "not-applicable"
            },
            {
              "id": "trustedTypes",
              "label": "Trusted Types (DOM-XSS defence)",
              "weight": 0.3,
              "status": "info",
              "score": 1,
              "detail": "No require-trusted-types-for CSP directive (optional hardening against DOM-based XSS).",
              "recommendation": "Consider CSP `require-trusted-types-for 'script'` to neutralise DOM-based XSS at innerHTML-style sinks.",
              "assessment": "not-applicable"
            },
            {
              "id": "caaRecords",
              "label": "CAA records restrict cert issuance",
              "weight": 0.5,
              "status": "info",
              "score": 0,
              "detail": "DNS lookup unavailable — couldn't verify CAA records.",
              "assessment": "not-tested"
            },
            {
              "id": "digestFields",
              "label": "Digest Fields (RFC 9530)",
              "weight": 0.2,
              "status": "info",
              "score": 0,
              "detail": "No Repr-Digest/Content-Digest header (RFC 9530 Digest Fields let clients verify response integrity — cutting-edge, mostly for APIs).",
              "assessment": "not-applicable"
            }
          ],
          "summary": "Scored 52/100 across 13 security checks (0 failing) — including CSP hardening, HSTS, security.txt, cookie prefixes, CORS, violation reporting and known-vulnerable-library detection."
        }
      ],
      "topIssues": [
        {
          "dimension": "geo",
          "title": "Machine-extractable structured data",
          "detail": "No JSON-LD — AI engines must guess the page's facts and entities."
        },
        {
          "dimension": "security",
          "title": "HSTS header",
          "detail": "No HSTS header."
        },
        {
          "dimension": "security",
          "title": "Content Security Policy",
          "detail": "No Content-Security-Policy."
        },
        {
          "dimension": "seo",
          "title": "Content depth",
          "detail": "Roughly 170 words of body text."
        },
        {
          "dimension": "security",
          "title": "Clickjacking protection",
          "detail": "No clickjacking protection."
        },
        {
          "dimension": "geo",
          "title": "Outbound citations",
          "detail": "1 outbound citation(s) to other domains."
        }
      ],
      "meta": {
        "scoringVersion": "2026-10-06.2",
        "measurementMode": "static",
        "coverage": {
          "scored": 158,
          "observed": 136,
          "heuristic": 27,
          "notTested": 7,
          "notApplicable": 59
        },
        "statusCode": 200,
        "htmlBytes": 2606,
        "transferBytes": 500,
        "loadMs": 200,
        "redirected": false,
        "aiEnabled": false,
        "checksRun": 229
      }
    },
    {
      "id": "noindex",
      "source": "/research/2026-10-13/noindex.html.txt",
      "url": "https://example.org/audit-guide",
      "normalizedUrl": "https://example.org/audit-guide",
      "finalUrl": "https://example.org/audit-guide",
      "title": "How to audit a public web page | Example guide",
      "description": "A practical guide to inspecting the HTML of one public page, checking actual evidence and verifying a focused fix with a repeat audit.",
      "faviconUrl": "https://example.org/favicon.ico",
      "fetchedAt": "2026-10-13T12:00:00.000Z",
      "overallScore": 81,
      "grade": "B",
      "dimensions": [
        {
          "key": "seo",
          "label": "SEO",
          "weight": 1.4,
          "score": 55,
          "grade": "E",
          "scoreAvailable": true,
          "coverage": {
            "scored": 37,
            "observed": 28,
            "heuristic": 9,
            "notTested": 0,
            "notApplicable": 4
          },
          "checks": [
            {
              "id": "titleLength",
              "label": "Title length",
              "weight": 2.2,
              "status": "pass",
              "score": 1,
              "detail": "Title is 46 characters (~373px): \"How to audit a public web page | Example guide\".",
              "evidence": {
                "title": "How to audit a public web page | Example guide",
                "length": 46,
                "pixelWidth": 373
              },
              "assessment": "observed"
            },
            {
              "id": "titlePixels",
              "label": "Title not truncated in SERPs",
              "weight": 0.8,
              "status": "pass",
              "score": 1,
              "detail": "Estimated SERP width ~373px (Google truncates around 580px).",
              "assessment": "observed"
            },
            {
              "id": "titleKeywordFront",
              "label": "Keyword near start of title",
              "weight": 1.2,
              "status": "warn",
              "score": 0.5,
              "detail": "Primary term \"page\" appears at position 26 in the title.",
              "assessment": "heuristic"
            },
            {
              "id": "titleBrand",
              "label": "Brand in title",
              "weight": 0.5,
              "status": "pass",
              "score": 1,
              "detail": "Title uses a separator, suggesting a brand suffix.",
              "assessment": "observed"
            },
            {
              "id": "metaDescLength",
              "label": "Meta description length",
              "weight": 1.6,
              "status": "pass",
              "score": 1,
              "detail": "Meta description is 134 characters.",
              "evidence": {
                "length": 134
              },
              "assessment": "observed"
            },
            {
              "id": "metaDescCta",
              "label": "Meta description has a call to action",
              "weight": 0.6,
              "status": "warn",
              "score": 0.5,
              "detail": "The description lacks a call to action.",
              "recommendation": "Add an action word (e.g. 'Discover…', 'Get…') to improve click-through.",
              "assessment": "heuristic"
            },
            {
              "id": "metaDescKeyword",
              "label": "Keyword in meta description",
              "weight": 0.6,
              "status": "pass",
              "score": 1,
              "detail": "Primary term \"page\" appears in the description.",
              "assessment": "heuristic"
            },
            {
              "id": "h1Single",
              "label": "Exactly one H1",
              "weight": 2,
              "status": "pass",
              "score": 1,
              "detail": "One <h1>: \"How do you audit a public web page?\".",
              "evidence": {
                "h1Count": 1
              },
              "assessment": "observed"
            },
            {
              "id": "h1Keyword",
              "label": "Keyword in H1",
              "weight": 1,
              "status": "pass",
              "score": 1,
              "detail": "Primary term \"page\" is in the H1.",
              "assessment": "heuristic"
            },
            {
              "id": "headingOrder",
              "label": "Logical heading hierarchy",
              "weight": 1.2,
              "status": "pass",
              "score": 1,
              "detail": "3 headings form a clean outline.",
              "evidence": {
                "headings": 3,
                "h2Count": 2
              },
              "assessment": "observed"
            },
            {
              "id": "h2Coverage",
              "label": "Sub-headings structure content",
              "weight": 0.8,
              "status": "pass",
              "score": 1,
              "detail": "2 <h2> sub-heading(s).",
              "assessment": "observed"
            },
            {
              "id": "keywordTargeting",
              "label": "Keyword targeting (title/H1/intro)",
              "weight": 2.2,
              "status": "pass",
              "score": 1,
              "detail": "Primary term \"page\" → title:✓ H1:✓ intro:✓.",
              "evidence": {
                "topKeywords": [
                  {
                    "term": "page",
                    "count": 5,
                    "density": 4.672897196261682
                  },
                  {
                    "term": "check",
                    "count": 4,
                    "density": 3.7383177570093453
                  },
                  {
                    "term": "audit",
                    "count": 3,
                    "density": 2.803738317757009
                  },
                  {
                    "term": "html",
                    "count": 3,
                    "density": 2.803738317757009
                  },
                  {
                    "term": "evidence",
                    "count": 3,
                    "density": 2.803738317757009
                  },
                  {
                    "term": "labels",
                    "count": 3,
                    "density": 2.803738317757009
                  }
                ]
              },
              "assessment": "heuristic"
            },
            {
              "id": "keywordDensity",
              "label": "Keyword density not stuffed",
              "weight": 1,
              "status": "fail",
              "score": 0,
              "detail": "Top term \"page\" is 4.7% of 107 content words.",
              "recommendation": "Reduce repetition — over-using the keyword reads as spam to Google.",
              "assessment": "heuristic"
            },
            {
              "id": "semanticDepth",
              "label": "Semantic / topical depth (phrases)",
              "weight": 1,
              "status": "warn",
              "score": 0.3333333333333333,
              "detail": "Recurring topical phrases: \"form labels\".",
              "recommendation": "Cover the topic with related sub-topics and entities (LSI) so the page demonstrates depth.",
              "evidence": {
                "phrases": [
                  {
                    "term": "form labels",
                    "count": 2,
                    "density": 1.8691588785046727
                  }
                ]
              },
              "assessment": "observed"
            },
            {
              "id": "contentDepth",
              "label": "Content depth",
              "weight": 1.4,
              "status": "fail",
              "score": 0.1,
              "detail": "Roughly 170 words of body text.",
              "recommendation": "Thin content struggles to rank — expand to comprehensively cover the topic (600+ words for key pages).",
              "evidence": {
                "words": 170
              },
              "assessment": "observed"
            },
            {
              "id": "textRatio",
              "label": "Text-to-HTML ratio",
              "weight": 0.7,
              "status": "pass",
              "score": 1,
              "detail": "Visible text is ~35.5% of the HTML payload.",
              "assessment": "observed"
            },
            {
              "id": "urlStructure",
              "label": "Clean, readable URL",
              "weight": 1,
              "status": "pass",
              "score": 1,
              "detail": "Clean URL path: \"/audit-guide\".",
              "assessment": "observed"
            },
            {
              "id": "indexable",
              "label": "Page is indexable",
              "weight": 2.4,
              "status": "fail",
              "score": 0,
              "detail": "The page is set to noindex and will be excluded from search.",
              "recommendation": "Remove the noindex directive if you want this page to rank.",
              "evidence": {
                "robotsMeta": "noindex,follow",
                "xRobots": ""
              },
              "assessment": "observed"
            },
            {
              "id": "followable",
              "label": "Links are followable",
              "weight": 0.6,
              "status": "pass",
              "score": 1,
              "detail": "No page-level nofollow.",
              "assessment": "observed"
            },
            {
              "id": "robotsTxt",
              "label": "Googlebot access to this URL",
              "weight": 1.2,
              "status": "pass",
              "score": 1,
              "detail": "No matching robots restriction for Googlebot on this URL.",
              "evidence": {
                "agent": "Googlebot",
                "allowed": true,
                "path": "/audit-guide"
              },
              "assessment": "observed"
            },
            {
              "id": "sitemap",
              "label": "XML sitemap available",
              "weight": 1,
              "status": "pass",
              "score": 1,
              "detail": "Sitemap reachable at undefined.",
              "assessment": "observed"
            },
            {
              "id": "canonical",
              "label": "Canonical URL",
              "weight": 1.2,
              "status": "pass",
              "score": 1,
              "detail": "Canonical → https://example.org/audit-guide (self-referencing).",
              "assessment": "observed"
            },
            {
              "id": "hreflang",
              "label": "hreflang for internationalization",
              "weight": 0.4,
              "status": "info",
              "score": 1,
              "detail": "No hreflang tags (only needed for multi-language sites).",
              "recommendation": "If you serve multiple languages/regions, add hreflang alternates.",
              "assessment": "not-applicable"
            },
            {
              "id": "openGraph",
              "label": "Open Graph tags",
              "weight": 0.9,
              "status": "fail",
              "score": 0,
              "detail": "0/5 core Open Graph tags present.",
              "recommendation": "Add og:title, og:description, og:image, og:url and og:type for rich social/chat previews.",
              "evidence": {
                "present": []
              },
              "assessment": "observed"
            },
            {
              "id": "twitterCard",
              "label": "Twitter/X card tags",
              "weight": 0.5,
              "status": "info",
              "score": 1,
              "detail": "0/3 Twitter card tags present.",
              "recommendation": "Add twitter:card, twitter:title and twitter:image for better X/Twitter previews.",
              "assessment": "not-applicable"
            },
            {
              "id": "structuredData",
              "label": "Structured data (Schema.org)",
              "weight": 1.3,
              "status": "warn",
              "score": 0.3,
              "detail": "No JSON-LD structured data found.",
              "recommendation": "Add valid JSON-LD (Organization, BreadcrumbList, Article/Product as relevant) to qualify for rich results.",
              "evidence": {
                "blocks": 0,
                "valid": 0,
                "types": []
              },
              "assessment": "observed"
            },
            {
              "id": "breadcrumbs",
              "label": "Breadcrumb structured data",
              "weight": 0.4,
              "status": "info",
              "score": 1,
              "detail": "No breadcrumb structured data.",
              "recommendation": "Add BreadcrumbList schema so search shows breadcrumb trails in results.",
              "assessment": "not-applicable"
            },
            {
              "id": "imageAlt",
              "label": "Descriptive image alt text",
              "weight": 0.9,
              "status": "pass",
              "score": 1,
              "detail": "1/1 images have alt text.",
              "assessment": "observed"
            },
            {
              "id": "internalLinks",
              "label": "Internal linking",
              "weight": 1,
              "status": "pass",
              "score": 1,
              "detail": "6 internal and 1 external links (0 nofollow).",
              "evidence": {
                "internal": 6,
                "external": 1,
                "nofollow": 0
              },
              "assessment": "observed"
            },
            {
              "id": "anchorQuality",
              "label": "Descriptive anchor text",
              "weight": 0.6,
              "status": "pass",
              "score": 1,
              "detail": "0 generic anchor(s) like \"click here\" out of 8 links.",
              "assessment": "observed"
            },
            {
              "id": "mobileViewport",
              "label": "Mobile-friendly viewport",
              "weight": 1.2,
              "status": "pass",
              "score": 1,
              "detail": "viewport: \"width=device-width, initial-scale=1\".",
              "assessment": "observed"
            },
            {
              "id": "htmlLang",
              "label": "Language declared",
              "weight": 0.6,
              "status": "pass",
              "score": 1,
              "detail": "lang=\"en\".",
              "assessment": "observed"
            },
            {
              "id": "keywordDistribution",
              "label": "Keyword across title/H1/intro/URL/alt",
              "weight": 1.4,
              "status": "warn",
              "score": 0.6,
              "detail": "Primary term \"page\" appears in 3/5 key locations (title/H1/intro/URL/alt).",
              "recommendation": "Distribute your primary keyword across the title, H1, opening text, URL slug and an image alt for unambiguous topical relevance.",
              "assessment": "heuristic"
            },
            {
              "id": "h2KeywordCoverage",
              "label": "Sub-headings cover the topic",
              "weight": 0.8,
              "status": "pass",
              "score": 1,
              "detail": "1/2 sub-headings include a top topical term.",
              "assessment": "heuristic"
            },
            {
              "id": "ogImageQuality",
              "label": "Social image is share-ready",
              "weight": 0.6,
              "status": "fail",
              "score": 0,
              "detail": "No og:image.",
              "recommendation": "Use an absolute og:image URL (1200×630) and declare og:image:width/height for reliable rich previews.",
              "assessment": "observed"
            },
            {
              "id": "cleanUrlParams",
              "label": "URL free of tracking params",
              "weight": 0.5,
              "status": "pass",
              "score": 1,
              "detail": "No tracking/session parameters in the canonical URL.",
              "assessment": "observed"
            },
            {
              "id": "anchorDiversity",
              "label": "Diverse internal anchor text",
              "weight": 0.5,
              "status": "pass",
              "score": 1,
              "detail": "8 unique anchors out of 8 links (100% diverse).",
              "assessment": "observed"
            },
            {
              "id": "indexSitemapConsistency",
              "label": "No conflicting index signals",
              "weight": 0.7,
              "status": "fail",
              "score": 0,
              "detail": "Page is noindex yet appears in the sitemap — conflicting signals.",
              "recommendation": "Remove noindex pages from the sitemap (or make them indexable) to avoid sending crawlers mixed signals.",
              "assessment": "heuristic"
            },
            {
              "id": "titleCtr",
              "label": "Title optimised for click-through",
              "weight": 0.5,
              "status": "pass",
              "score": 1,
              "detail": "Title uses numbers/power words that lift CTR.",
              "assessment": "observed"
            },
            {
              "id": "descUnique",
              "label": "Meta description is purpose-written",
              "weight": 0.4,
              "status": "pass",
              "score": 1,
              "detail": "Meta description is distinct from body copy.",
              "assessment": "observed"
            },
            {
              "id": "feedDiscovery",
              "label": "Feed advertised (RSS/Atom)",
              "weight": 0.3,
              "status": "info",
              "score": 1,
              "detail": "No RSS/Atom/JSON feed announced in <head> (only relevant if the site publishes a feed).",
              "recommendation": "If you publish a feed, announce it with <link rel=\"alternate\" type=\"application/rss+xml\"> so readers and agents can find it.",
              "assessment": "not-applicable"
            }
          ],
          "summary": "Scored 55/100 across 37 on-page SEO checks (26 pass, 5 warn, 6 fail) — including keyword distribution, schema completeness, anchor diversity and index-signal consistency."
        },
        {
          "key": "geo",
          "label": "GEO (AI Answer Engines)",
          "weight": 1.15,
          "score": 65,
          "grade": "D",
          "scoreAvailable": true,
          "coverage": {
            "scored": 13,
            "observed": 13,
            "heuristic": 5,
            "notTested": 1,
            "notApplicable": 14
          },
          "checks": [
            {
              "id": "structuredAnswers",
              "label": "Machine-extractable structured data",
              "weight": 2.4,
              "status": "fail",
              "score": 0,
              "detail": "No JSON-LD — AI engines must guess the page's facts and entities.",
              "recommendation": "Add Article and Organization/Person JSON-LD (plus HowTo where relevant) so engines can lift facts verbatim and attribute you.",
              "assessment": "observed"
            },
            {
              "id": "questionHeadings",
              "label": "Question-based headings",
              "weight": 1.4,
              "status": "pass",
              "score": 1,
              "detail": "3 heading(s) phrased as questions.",
              "evidence": {
                "examples": [
                  "How do you audit a public web page?",
                  "What should you check first?",
                  "How do you confirm an improvement?"
                ]
              },
              "assessment": "observed"
            },
            {
              "id": "liftableContent",
              "label": "Concise, liftable answers",
              "weight": 1.4,
              "status": "pass",
              "score": 1,
              "detail": "100% of paragraphs are answer-sized; 1 list(s), 0 table(s).",
              "assessment": "heuristic"
            },
            {
              "id": "dataTables",
              "label": "Structured data tables",
              "weight": 0.5,
              "status": "info",
              "score": 1,
              "detail": "No data tables.",
              "recommendation": "Where you compare options or list specs, use <table> — engines extract tabular facts cleanly.",
              "assessment": "not-applicable"
            },
            {
              "id": "authority",
              "label": "Author & attribution (E-E-A-T)",
              "weight": 1.2,
              "status": "pass",
              "score": 1,
              "detail": "Authorship/attribution signals present.",
              "assessment": "observed"
            },
            {
              "id": "aboutPage",
              "label": "Discoverable About/Org page",
              "weight": 0.5,
              "status": "pass",
              "score": 1,
              "detail": "An About/Team/Company link is present.",
              "assessment": "observed"
            },
            {
              "id": "freshness",
              "label": "Machine-readable dates",
              "weight": 0.9,
              "status": "pass",
              "score": 1,
              "detail": "Published/modified dates are exposed.",
              "assessment": "observed"
            },
            {
              "id": "citations",
              "label": "Outbound citations",
              "weight": 0.9,
              "status": "warn",
              "score": 0.5,
              "detail": "1 outbound citation(s) to other domains.",
              "recommendation": "Cite primary sources — well-sourced pages are more likely to be trusted and cited.",
              "assessment": "observed"
            },
            {
              "id": "aiCrawlerAccess",
              "label": "AI search crawler access to this URL",
              "weight": 1.6,
              "status": "pass",
              "score": 1,
              "detail": "No matching robots restriction for OpenAI Search, Perplexity or Claude Search. This is access eligibility, not proof of indexing or citations.",
              "evidence": {
                "blockedSearch": [],
                "decisions": []
              },
              "assessment": "observed"
            },
            {
              "id": "googleAiEligibility",
              "label": "Google Search AI eligibility",
              "weight": 0,
              "status": "info",
              "score": 1,
              "detail": "Public markup cannot confirm indexing, snippet eligibility or the owner's Search Console AI inclusion setting. Google-Extended controls Gemini training and grounding; it does not control Google Search inclusion.",
              "assessment": "not-tested"
            },
            {
              "id": "aiPolicyChoices",
              "label": "Training and user-triggered access policy",
              "weight": 0,
              "status": "info",
              "score": 1,
              "detail": "Policy restrictions: none detected. Training, Gemini grounding and user-triggered agents have separate purposes. ChatGPT-User does not determine ChatGPT Search inclusion.",
              "assessment": "observed"
            },
            {
              "id": "llmsTxt",
              "label": "llms.txt published",
              "weight": 0.4,
              "status": "info",
              "score": 1,
              "detail": "No /llms.txt found (optional — Google ignores it, but some AI agents read it).",
              "recommendation": "Consider publishing /llms.txt — a curated markdown map of your key content some AI agents read. Note it has no effect on Google Search or AI Overviews.",
              "assessment": "not-applicable"
            },
            {
              "id": "linkHeaderDiscovery",
              "label": "Link header advertises resources",
              "weight": 0.3,
              "status": "info",
              "score": 1,
              "detail": "No discovery hints in the HTTP Link header (optional: lets agents find sitemap/llms.txt without parsing HTML).",
              "recommendation": "Consider advertising sitemap/llms.txt/feeds via the HTTP Link header for agents that never read your HTML.",
              "assessment": "not-applicable"
            },
            {
              "id": "contentSignal",
              "label": "AI usage declared (Content-Signal)",
              "weight": 0.2,
              "status": "info",
              "score": 1,
              "detail": "No Content-Signal directives in robots.txt (emerging, optional standard for declaring AI search/train permissions).",
              "recommendation": "Optionally add Content-Signal directives to robots.txt to state explicitly whether AI may search, ingest or train on your content.",
              "assessment": "not-applicable"
            },
            {
              "id": "semanticStructure",
              "label": "Semantic HTML landmarks",
              "weight": 1,
              "status": "pass",
              "score": 1,
              "detail": "Uses 6 semantic landmark(s): main, article, section, nav, header, footer.",
              "assessment": "observed"
            },
            {
              "id": "directAnswer",
              "label": "Direct answer up top",
              "weight": 0,
              "status": "info",
              "score": 1,
              "detail": "Opens with a definitional, quotable statement.",
              "assessment": "heuristic"
            },
            {
              "id": "serverRendered",
              "label": "Text present in the initial HTML",
              "weight": 1,
              "status": "pass",
              "score": 1,
              "detail": "170 words in the initial HTML. Short pages can be complete; text length does not establish content quality or citations.",
              "assessment": "observed"
            },
            {
              "id": "statDensity",
              "label": "Quotable statistics",
              "weight": 0,
              "status": "info",
              "score": 1,
              "detail": "0 statistic-like figures (0.0 per 500 words).",
              "recommendation": "Use relevant, verifiable figures when they help readers. Statistics density is not a measured citation signal.",
              "assessment": "heuristic"
            },
            {
              "id": "comparisonContent",
              "label": "Comparison-style content",
              "weight": 0.6,
              "status": "info",
              "score": 1,
              "detail": "No comparison or tabular content detected.",
              "recommendation": "Where relevant, add comparison tables or 'X vs Y' sections — engines surface these for decision queries.",
              "assessment": "not-applicable"
            },
            {
              "id": "selfContained",
              "label": "Self-contained opening",
              "weight": 0,
              "status": "info",
              "score": 1,
              "detail": "Opening is a self-contained, quotable definition.",
              "assessment": "heuristic"
            },
            {
              "id": "chunking",
              "label": "Content split into extractable chunks",
              "weight": 0,
              "status": "info",
              "score": 1,
              "detail": "~57 words per section across 2 sub-headings.",
              "assessment": "heuristic"
            },
            {
              "id": "tableOfContents",
              "label": "In-page anchor navigation",
              "weight": 0.4,
              "status": "info",
              "score": 1,
              "detail": "No table-of-contents anchors.",
              "recommendation": "For long content, add a table of contents with in-page anchors — it maps your sections for AI navigation.",
              "assessment": "not-applicable"
            },
            {
              "id": "entityConsistency",
              "label": "Schema entity matches page",
              "weight": 0.5,
              "status": "info",
              "score": 1,
              "detail": "No named entities in schema.",
              "assessment": "not-applicable"
            },
            {
              "id": "faqRichness",
              "label": "FAQ-style coverage",
              "weight": 0.5,
              "status": "warn",
              "score": 0.5,
              "detail": "2 question headings.",
              "recommendation": "Add a visible FAQ section answering 3+ real user questions — Q&A content is a top source of AI-answer citations. (FAQPage markup is optional; Google dropped FAQ rich results in May 2026.)",
              "assessment": "observed"
            },
            {
              "id": "absoluteRecency",
              "label": "Content is recent",
              "weight": 0.6,
              "status": "pass",
              "score": 1,
              "detail": "Content dated ~0 month(s) ago.",
              "assessment": "observed"
            },
            {
              "id": "entityRichness",
              "label": "Named-entity richness",
              "weight": 0.4,
              "status": "info",
              "score": 1,
              "detail": "19 distinct proper-noun phrases (entities engines can link).",
              "assessment": "not-applicable"
            },
            {
              "id": "answerNotHidden",
              "label": "Key content not hidden behind UI",
              "weight": 0.4,
              "status": "pass",
              "score": 1,
              "detail": "Content isn't buried in tabs/accordions.",
              "assessment": "observed"
            },
            {
              "id": "agentCard",
              "label": "A2A agent card published",
              "weight": 0.3,
              "status": "info",
              "score": 1,
              "detail": "No A2A agent card (emerging spec; only relevant if the site exposes services for AI agents to call).",
              "recommendation": "If you offer agent-callable services, consider publishing an A2A agent card at /.well-known/agent-card.json.",
              "assessment": "not-applicable"
            },
            {
              "id": "trafficAdvice",
              "label": "Traffic advice for prefetch proxies",
              "weight": 0.2,
              "status": "info",
              "score": 1,
              "detail": "No /.well-known/traffic-advice (optional: declares how prefetch proxies like Chrome's private prefetch may load your pages).",
              "recommendation": "Optionally publish /.well-known/traffic-advice to control how prefetch proxies pre-load your pages.",
              "assessment": "not-applicable"
            },
            {
              "id": "mcpServer",
              "label": "MCP server discoverable",
              "weight": 0.4,
              "status": "info",
              "score": 1,
              "detail": "No MCP server found (agents probe https://mcp.<your-domain>/ and /.well-known/mcp).",
              "recommendation": "If you offer tools or services AI agents could call, serve an MCP endpoint (Streamable HTTP) at mcp.<your-domain> or /.well-known/mcp — the two locations agents probe for it.",
              "evidence": {
                "location": null
              },
              "assessment": "not-applicable"
            },
            {
              "id": "openApiSpec",
              "label": "OpenAPI spec / API catalog published",
              "weight": 0.3,
              "status": "info",
              "score": 1,
              "detail": "No /openapi.json or /.well-known/api-catalog found (only relevant if you expose an API).",
              "recommendation": "If you expose an API, publish its OpenAPI spec at /openapi.json (or an RFC 9727 catalog at /.well-known/api-catalog) so agents can discover and call it unaided.",
              "evidence": {
                "source": null
              },
              "assessment": "not-applicable"
            },
            {
              "id": "agentsMd",
              "label": "agents.md published",
              "weight": 0.3,
              "status": "info",
              "score": 1,
              "detail": "No /agents.md found (emerging convention: a markdown briefing for AI agents at the site root).",
              "recommendation": "Consider publishing /agents.md — a short markdown briefing (what the site does, key URLs, machine-readable surfaces) that agents can read in one fetch.",
              "assessment": "not-applicable"
            },
            {
              "id": "nlweb",
              "label": "NLWeb surfaces (schemamap + /ask)",
              "weight": 0.3,
              "status": "info",
              "score": 1,
              "detail": "No NLWeb surfaces (optional: schemamap in robots.txt plus an /ask endpoint let agents query your site in natural language).",
              "recommendation": "Optionally adopt NLWeb: point agents at your structured data with schemamap: lines in robots.txt and answer natural-language questions at /ask.",
              "evidence": {
                "schemamap": false,
                "askEndpoint": null
              },
              "assessment": "not-applicable"
            }
          ],
          "summary": "Scored 65/100 across 13 applicable access and content checks. Optional editorial observations are listed separately; this score does not measure AI citations."
        },
        {
          "key": "performance",
          "label": "Performance",
          "weight": 1.3,
          "score": 93,
          "grade": "A",
          "scoreAvailable": true,
          "coverage": {
            "scored": 26,
            "observed": 25,
            "heuristic": 1,
            "notTested": 0,
            "notApplicable": 13
          },
          "checks": [
            {
              "id": "responseTime",
              "label": "Server response time",
              "weight": 2,
              "status": "pass",
              "score": 1,
              "detail": "Document response observed in 200 ms from this server; not real-user field data.",
              "evidence": {
                "ttfb": 200,
                "loadMs": 200
              },
              "assessment": "observed"
            },
            {
              "id": "redirects",
              "label": "Minimal redirects",
              "weight": 0.6,
              "status": "pass",
              "score": 1,
              "detail": "No redirect on the entry URL.",
              "assessment": "observed"
            },
            {
              "id": "htmlSize",
              "label": "HTML document size",
              "weight": 1,
              "status": "pass",
              "score": 1,
              "detail": "HTML is 3 KB uncompressed (0 KB on the wire).",
              "evidence": {
                "htmlKb": 3,
                "transferKb": 0
              },
              "assessment": "observed"
            },
            {
              "id": "compression",
              "label": "Text compression",
              "weight": 1.2,
              "status": "pass",
              "score": 1,
              "detail": "Response compressed (br).",
              "assessment": "observed"
            },
            {
              "id": "brotli",
              "label": "Brotli compression",
              "weight": 0.4,
              "status": "pass",
              "score": 1,
              "detail": "Using Brotli (best ratio).",
              "assessment": "observed"
            },
            {
              "id": "renderBlocking",
              "label": "Render-blocking resources",
              "weight": 1.6,
              "status": "pass",
              "score": 1,
              "detail": "0 render-blocking script(s) and 0 stylesheet(s) in <head>.",
              "evidence": {
                "blockingScripts": 0,
                "headStyles": 0
              },
              "assessment": "observed"
            },
            {
              "id": "scriptLoading",
              "label": "Scripts load async/deferred",
              "weight": 1,
              "status": "info",
              "score": 1,
              "detail": "No external scripts.",
              "recommendation": "Add async or defer to non-critical scripts so they don't block parsing.",
              "assessment": "not-applicable"
            },
            {
              "id": "requestCount",
              "label": "Resource request count",
              "weight": 1,
              "status": "pass",
              "score": 1,
              "detail": "~1 referenced resources (0 scripts, 0 styles, 1 images, 0 iframes).",
              "evidence": {
                "totalScripts": 0,
                "styles": 0,
                "imgs": 1,
                "iframes": 0
              },
              "assessment": "heuristic"
            },
            {
              "id": "thirdParty",
              "label": "Third-party request domains",
              "weight": 1,
              "status": "pass",
              "score": 1,
              "detail": "0 distinct third-party domain(s) referenced.",
              "evidence": {
                "domains": []
              },
              "assessment": "observed"
            },
            {
              "id": "resourceHints",
              "label": "Resource hints (preconnect/preload)",
              "weight": 0.8,
              "status": "info",
              "score": 1,
              "detail": "0 preconnect, 0 dns-prefetch, 0 preload hint(s).",
              "recommendation": "Add <link rel=preconnect> for critical third-party origins and preload key fonts/hero assets.",
              "assessment": "not-applicable"
            },
            {
              "id": "imageOptim",
              "label": "Image optimization",
              "weight": 1.4,
              "status": "info",
              "score": 1,
              "detail": "No raster images to optimise (vectors are resolution-independent).",
              "evidence": {
                "rasterImgs": 0,
                "lazy": 0,
                "rasterDimensioned": 0,
                "modern": 0,
                "responsive": 0
              },
              "assessment": "not-applicable"
            },
            {
              "id": "cls",
              "label": "Layout-shift prevention",
              "weight": 1,
              "status": "pass",
              "score": 1,
              "detail": "1/1 images declare width & height.",
              "assessment": "observed"
            },
            {
              "id": "fontDisplay",
              "label": "Web-font loading strategy",
              "weight": 0.6,
              "status": "info",
              "score": 1,
              "detail": "No external web fonts detected.",
              "assessment": "not-applicable"
            },
            {
              "id": "inlineWeight",
              "label": "Inline CSS/JS weight",
              "weight": 0.7,
              "status": "pass",
              "score": 1,
              "detail": "0 KB inline CSS, 0 KB inline JS.",
              "assessment": "observed"
            },
            {
              "id": "minification",
              "label": "HTML minification",
              "weight": 0.5,
              "status": "pass",
              "score": 1,
              "detail": "HTML appears minified.",
              "assessment": "observed"
            },
            {
              "id": "caching",
              "label": "Caching headers",
              "weight": 0.8,
              "status": "warn",
              "score": 0.5,
              "detail": "No effective Cache-Control on the document.",
              "recommendation": "Set Cache-Control on static assets (long max-age + immutable) and a sensible value on HTML.",
              "assessment": "observed"
            },
            {
              "id": "validators",
              "label": "Conditional requests (ETag/Last-Modified)",
              "weight": 0.5,
              "status": "warn",
              "score": 0.5,
              "detail": "No ETag or Last-Modified on the document — every revisit re-downloads the full body.",
              "recommendation": "Send an ETag or Last-Modified header so browsers can revalidate with If-None-Match and get a cheap 304.",
              "assessment": "observed"
            },
            {
              "id": "cdn",
              "label": "CDN / edge delivery",
              "weight": 0.6,
              "status": "pass",
              "score": 1,
              "detail": "Modern HTTP advertised.",
              "recommendation": "Serve assets from a CDN to cut latency for distant users.",
              "assessment": "observed"
            },
            {
              "id": "http2",
              "label": "Modern HTTP (h2/h3)",
              "weight": 0.5,
              "status": "pass",
              "score": 1,
              "detail": "Server advertises HTTP/2 or HTTP/3 (alt-svc).",
              "assessment": "observed"
            },
            {
              "id": "domSize",
              "label": "DOM size",
              "weight": 0.8,
              "status": "pass",
              "score": 1,
              "detail": "43 DOM nodes.",
              "assessment": "observed"
            },
            {
              "id": "cssImport",
              "label": "No CSS @import chains",
              "weight": 0.6,
              "status": "pass",
              "score": 1,
              "detail": "No @import in inline CSS.",
              "assessment": "observed"
            },
            {
              "id": "dataUriBloat",
              "label": "No heavy inline data-URIs",
              "weight": 0.7,
              "status": "pass",
              "score": 1,
              "detail": "0 base64 data-URI(s), ~0 KB inlined into the HTML.",
              "assessment": "observed"
            },
            {
              "id": "duplicateScripts",
              "label": "No duplicate scripts",
              "weight": 0.5,
              "status": "pass",
              "score": 1,
              "detail": "No duplicate script URLs.",
              "assessment": "observed"
            },
            {
              "id": "lcpImage",
              "label": "Hero image not lazy-loaded",
              "weight": 0.8,
              "status": "pass",
              "score": 1,
              "detail": "The first image loads eagerly.",
              "assessment": "observed"
            },
            {
              "id": "fetchPriority",
              "label": "LCP fetchpriority hint",
              "weight": 0.4,
              "status": "warn",
              "score": 0.5,
              "detail": "No fetchpriority hint for the LCP image.",
              "recommendation": "Add fetchpriority=\"high\" to your hero/LCP image so the browser fetches it first.",
              "assessment": "observed"
            },
            {
              "id": "preconnectCoverage",
              "label": "Critical origins preconnected",
              "weight": 0.6,
              "status": "info",
              "score": 1,
              "detail": "0/0 third-party origins are preconnected.",
              "assessment": "not-applicable"
            },
            {
              "id": "embedFacade",
              "label": "No heavy un-faceted embeds",
              "weight": 0.5,
              "status": "pass",
              "score": 1,
              "detail": "No heavy third-party embeds.",
              "assessment": "observed"
            },
            {
              "id": "inlineScript",
              "label": "No oversized inline scripts",
              "weight": 0.5,
              "status": "pass",
              "score": 1,
              "detail": "Largest inline <script> is 0.0 KB.",
              "assessment": "observed"
            },
            {
              "id": "mediaScopedCss",
              "label": "Non-critical CSS deferred/scoped",
              "weight": 0.5,
              "status": "pass",
              "score": 1,
              "detail": "0 stylesheet(s) load render-blocking (no media scope / print).",
              "assessment": "observed"
            },
            {
              "id": "legacyHeadLibs",
              "label": "No legacy libs blocking <head>",
              "weight": 0.4,
              "status": "pass",
              "score": 1,
              "detail": "No legacy libraries blocking in <head>.",
              "assessment": "observed"
            },
            {
              "id": "bfcache",
              "label": "Back/forward cache not blocked",
              "weight": 0.5,
              "status": "pass",
              "score": 1,
              "detail": "No BFCache blockers detected — back/forward navigations can restore instantly from memory.",
              "assessment": "observed"
            },
            {
              "id": "speculationRules",
              "label": "Speculation Rules (prefetch/prerender)",
              "weight": 0.3,
              "status": "info",
              "score": 1,
              "detail": "No Speculation Rules (optional: makes next-page navigations feel instant).",
              "recommendation": "Consider a <script type=\"speculationrules\"> block to prerender likely next pages on hover.",
              "assessment": "not-applicable"
            },
            {
              "id": "cssContainment",
              "label": "CSS containment",
              "weight": 0.2,
              "status": "info",
              "score": 1,
              "detail": "CSS containment not assessed — stylesheets are external and deep render is off.",
              "recommendation": "Consider contain: content (or layout/paint) on self-contained widgets to limit style/layout recalculation scope.",
              "assessment": "not-applicable"
            },
            {
              "id": "scrollbarGutter",
              "label": "scrollbar-gutter reserved",
              "weight": 0.2,
              "status": "info",
              "score": 1,
              "detail": "scrollbar-gutter not assessed — stylesheets are external and deep render is off.",
              "recommendation": "Set scrollbar-gutter: stable on the root/scroll containers so the scrollbar appearing doesn't shift content sideways.",
              "assessment": "not-applicable"
            },
            {
              "id": "viewTransitions",
              "label": "View Transitions API",
              "weight": 0.3,
              "status": "info",
              "score": 1,
              "detail": "No View Transitions usage detected (optional: native cross-fade/morph between pages and states).",
              "recommendation": "Consider the View Transitions API (@view-transition / startViewTransition) for smooth page and state transitions without JS animation libraries.",
              "assessment": "not-applicable"
            },
            {
              "id": "scrollDrivenAnimations",
              "label": "Scroll-driven animations (CSS)",
              "weight": 0.2,
              "status": "info",
              "score": 1,
              "detail": "No scroll-driven animation usage detected (optional: animation-timeline: scroll()/view()).",
              "recommendation": "Consider CSS scroll-driven animations (animation-timeline) for scroll effects — they run off the main thread with zero JS.",
              "assessment": "not-applicable"
            },
            {
              "id": "serverTiming",
              "label": "Server-Timing header",
              "weight": 0.2,
              "status": "info",
              "score": 1,
              "detail": "No Server-Timing header on the document.",
              "recommendation": "Emit a Server-Timing header (e.g. db;dur=42, cache;desc=hit) to surface backend timings in DevTools and RUM analytics.",
              "assessment": "not-applicable"
            },
            {
              "id": "compressionDictionary",
              "label": "Compression Dictionary Transport",
              "weight": 0.2,
              "status": "info",
              "score": 1,
              "detail": "No compression-dictionary headers (cutting-edge: Use-As-Dictionary lets returning visitors download only the diff of updated assets).",
              "recommendation": "Consider Compression Dictionary Transport (Use-As-Dictionary on key assets) so returning visitors fetch deltas instead of full files.",
              "assessment": "not-applicable"
            },
            {
              "id": "earlyHintsReady",
              "label": "Early Hints (103) readiness",
              "weight": 0.3,
              "status": "info",
              "score": 1,
              "detail": "No Link response header with preload/preconnect on the document.",
              "recommendation": "Send 103 Early Hints with Link headers (rel=preload/preconnect) on the main document so browsers start fetching critical assets before the HTML is ready.",
              "assessment": "not-applicable"
            }
          ],
          "summary": "Scored 93/100 across 26 performance signals (0 failing) — including LCP-image handling, CSS @import chains, revalidators, BFCache eligibility, preconnect coverage and embed facades."
        },
        {
          "key": "accessibility",
          "label": "Accessibility",
          "weight": 1.2,
          "score": 100,
          "grade": "A+",
          "scoreAvailable": true,
          "coverage": {
            "scored": 22,
            "observed": 22,
            "heuristic": 0,
            "notTested": 1,
            "notApplicable": 4
          },
          "checks": [
            {
              "id": "lang",
              "label": "Document language declared",
              "weight": 1.4,
              "status": "pass",
              "score": 1,
              "detail": "lang=\"en\".",
              "assessment": "observed"
            },
            {
              "id": "imgAlt",
              "label": "Images have alt attributes",
              "weight": 1.8,
              "status": "pass",
              "score": 1,
              "detail": "0/1 images missing an alt attribute.",
              "evidence": {
                "total": 1,
                "missingAlt": 0
              },
              "assessment": "observed"
            },
            {
              "id": "altQuality",
              "label": "Alt text is meaningful",
              "weight": 0.6,
              "status": "pass",
              "score": 1,
              "detail": "No generic alt text detected.",
              "assessment": "observed"
            },
            {
              "id": "formLabels",
              "label": "Form inputs are labelled",
              "weight": 1.8,
              "status": "pass",
              "score": 1,
              "detail": "0/1 fields have no associated label.",
              "evidence": {
                "total": 1,
                "unlabeled": 0
              },
              "assessment": "observed"
            },
            {
              "id": "linkText",
              "label": "Descriptive link text",
              "weight": 0.9,
              "status": "pass",
              "score": 1,
              "detail": "0 vague and 0 empty link(s) of 8.",
              "assessment": "observed"
            },
            {
              "id": "buttonNames",
              "label": "Buttons have accessible names",
              "weight": 0.9,
              "status": "pass",
              "score": 1,
              "detail": "0 button(s) without an accessible name.",
              "assessment": "observed"
            },
            {
              "id": "zoom",
              "label": "Pinch-zoom not disabled",
              "weight": 1,
              "status": "pass",
              "score": 1,
              "detail": "Users can zoom.",
              "assessment": "observed"
            },
            {
              "id": "landmarks",
              "label": "Landmark regions",
              "weight": 1,
              "status": "pass",
              "score": 1,
              "detail": "Landmarks present: main:true nav:true header:true footer:true.",
              "assessment": "observed"
            },
            {
              "id": "skipLink",
              "label": "Skip-to-content link",
              "weight": 0.5,
              "status": "pass",
              "score": 1,
              "detail": "A skip link is present.",
              "assessment": "observed"
            },
            {
              "id": "headingStructure",
              "label": "Headings form an outline",
              "weight": 0.8,
              "status": "pass",
              "score": 1,
              "detail": "3 headings in order.",
              "assessment": "observed"
            },
            {
              "id": "ariaHidden",
              "label": "No focusable content in aria-hidden",
              "weight": 0.6,
              "status": "pass",
              "score": 1,
              "detail": "No focusable elements hidden from assistive tech.",
              "assessment": "observed"
            },
            {
              "id": "tabindex",
              "label": "No positive tabindex",
              "weight": 0.5,
              "status": "pass",
              "score": 1,
              "detail": "Natural focus order preserved.",
              "assessment": "observed"
            },
            {
              "id": "autoplay",
              "label": "No autoplaying media",
              "weight": 0.4,
              "status": "pass",
              "score": 1,
              "detail": "No autoplaying audio/video.",
              "assessment": "observed"
            },
            {
              "id": "contrast",
              "label": "Text colour contrast (WCAG AA)",
              "weight": 1.4,
              "status": "info",
              "score": 1,
              "detail": "No colour pairs to evaluate (colours likely set via external CSS — enable deep render to assess).",
              "evidence": {
                "checked": 0,
                "failures": 0,
                "worst": null
              },
              "assessment": "not-tested"
            },
            {
              "id": "accessibleNames",
              "label": "Interactive elements are named",
              "weight": 1.3,
              "status": "pass",
              "score": 1,
              "detail": "10/10 interactive elements expose an accessible name.",
              "evidence": {
                "total": 10,
                "named": 10
              },
              "assessment": "observed"
            },
            {
              "id": "semanticInteractive",
              "label": "Interactive elements are semantic",
              "weight": 1,
              "status": "pass",
              "score": 1,
              "detail": "All interactive elements use <a>/<button>.",
              "assessment": "observed"
            },
            {
              "id": "validNesting",
              "label": "No invalid interactive nesting",
              "weight": 0.7,
              "status": "pass",
              "score": 1,
              "detail": "No invalid nesting detected.",
              "assessment": "observed"
            },
            {
              "id": "reducedMotion",
              "label": "Respects prefers-reduced-motion",
              "weight": 0.6,
              "status": "info",
              "score": 1,
              "detail": "No inline animations detected.",
              "assessment": "not-applicable"
            },
            {
              "id": "landmarkUniqueness",
              "label": "Unique top-level landmarks",
              "weight": 0.6,
              "status": "pass",
              "score": 1,
              "detail": "Exactly one main landmark.",
              "assessment": "observed"
            },
            {
              "id": "ariaRefs",
              "label": "ARIA references resolve",
              "weight": 0.6,
              "status": "pass",
              "score": 1,
              "detail": "All aria-labelledby/describedby/controls point to existing IDs.",
              "assessment": "observed"
            },
            {
              "id": "emptyHeadings",
              "label": "No empty headings",
              "weight": 0.5,
              "status": "pass",
              "score": 1,
              "detail": "No empty headings.",
              "assessment": "observed"
            },
            {
              "id": "touchTargets",
              "label": "Adequate touch-target size",
              "weight": 0.5,
              "status": "info",
              "score": 1,
              "detail": "No inline-sized interactive elements to assess.",
              "assessment": "not-applicable"
            },
            {
              "id": "langFormat",
              "label": "Valid lang value",
              "weight": 0.4,
              "status": "pass",
              "score": 1,
              "detail": "lang=\"en\" is well-formed.",
              "assessment": "observed"
            },
            {
              "id": "a11yOverlay",
              "label": "No accessibility overlay widget",
              "weight": 0.8,
              "status": "pass",
              "score": 1,
              "detail": "No accessibility overlay detected.",
              "assessment": "observed"
            },
            {
              "id": "focusRing",
              "label": "Keyboard focus ring preserved",
              "weight": 0.7,
              "status": "pass",
              "score": 1,
              "detail": "No focus-outline removal detected.",
              "assessment": "observed"
            },
            {
              "id": "inlineLang",
              "label": "Language of parts (lang on foreign content)",
              "weight": 0.3,
              "status": "info",
              "score": 1,
              "detail": "No inline lang attributes found — untagged foreign-language passages can't be detected statically.",
              "recommendation": "If the page quotes or embeds text in another language, wrap it with lang=\"xx\" (WCAG 3.1.2) so screen readers pronounce it correctly.",
              "assessment": "not-applicable"
            },
            {
              "id": "translateAttr",
              "label": "Machine-translation hints (translate=no)",
              "weight": 0.2,
              "status": "info",
              "score": 1,
              "detail": "No translate=\"no\"/notranslate markers found.",
              "recommendation": "Mark brand names, code snippets and proper nouns with translate=\"no\" so browser auto-translation doesn't mangle them.",
              "assessment": "not-applicable"
            }
          ],
          "summary": "Scored 100/100 against 22 WCAG checks (0 failing, 0 risky) — including computed colour-contrast, accessible-name coverage, semantic interactivity and ARIA-reference integrity."
        },
        {
          "key": "codeQuality",
          "label": "Code Quality",
          "weight": 0.9,
          "score": 98,
          "grade": "A+",
          "scoreAvailable": true,
          "coverage": {
            "scored": 25,
            "observed": 25,
            "heuristic": 0,
            "notTested": 0,
            "notApplicable": 2
          },
          "checks": [
            {
              "id": "doctype",
              "label": "HTML5 doctype",
              "weight": 1,
              "status": "pass",
              "score": 1,
              "detail": "Standards-mode <!doctype html>.",
              "assessment": "observed"
            },
            {
              "id": "charset",
              "label": "Character encoding declared early",
              "weight": 1,
              "status": "pass",
              "score": 1,
              "detail": "Charset declared within the first 1KB.",
              "assessment": "observed"
            },
            {
              "id": "lang",
              "label": "Language attribute",
              "weight": 0.6,
              "status": "pass",
              "score": 1,
              "detail": "html lang set.",
              "assessment": "observed"
            },
            {
              "id": "deprecatedTags",
              "label": "No deprecated tags",
              "weight": 1,
              "status": "pass",
              "score": 1,
              "detail": "No deprecated HTML tags.",
              "assessment": "observed"
            },
            {
              "id": "deprecatedAttrs",
              "label": "No presentational attributes",
              "weight": 0.6,
              "status": "pass",
              "score": 1,
              "detail": "No deprecated presentational attributes.",
              "assessment": "observed"
            },
            {
              "id": "inlineStyles",
              "label": "Limited inline styles",
              "weight": 0.9,
              "status": "pass",
              "score": 1,
              "detail": "0 elements (0.0%) use inline style attributes.",
              "assessment": "observed"
            },
            {
              "id": "inlineHandlers",
              "label": "No inline event handlers",
              "weight": 0.7,
              "status": "pass",
              "score": 1,
              "detail": "No inline on* event handlers.",
              "assessment": "observed"
            },
            {
              "id": "dupeIds",
              "label": "Unique element IDs",
              "weight": 0.9,
              "status": "pass",
              "score": 1,
              "detail": "All element IDs are unique.",
              "assessment": "observed"
            },
            {
              "id": "emptyElements",
              "label": "No empty interactive elements",
              "weight": 0.5,
              "status": "pass",
              "score": 1,
              "detail": "No empty links.",
              "assessment": "observed"
            },
            {
              "id": "semanticRatio",
              "label": "Semantic elements over div soup",
              "weight": 0.8,
              "status": "pass",
              "score": 1,
              "detail": "0 <div>s vs 7 semantic element(s) (0% divs).",
              "assessment": "observed"
            },
            {
              "id": "mixedContent",
              "label": "No mixed content",
              "weight": 1.1,
              "status": "pass",
              "score": 1,
              "detail": "No insecure http resources on an https page.",
              "evidence": {
                "mixed": 0
              },
              "assessment": "observed"
            },
            {
              "id": "leftovers",
              "label": "No debug leftovers",
              "weight": 0.5,
              "status": "pass",
              "score": 1,
              "detail": "No TODO/console leftovers in output.",
              "assessment": "observed"
            },
            {
              "id": "comments",
              "label": "Few HTML comments in production",
              "weight": 0.3,
              "status": "pass",
              "score": 1,
              "detail": "0 HTML comment(s) in the output.",
              "assessment": "observed"
            },
            {
              "id": "favicon",
              "label": "Favicon declared",
              "weight": 0.4,
              "status": "warn",
              "score": 0.5,
              "detail": "No favicon declared.",
              "recommendation": "Add a favicon and apple-touch-icon.",
              "assessment": "observed"
            },
            {
              "id": "domSize",
              "label": "Reasonable DOM size",
              "weight": 0.8,
              "status": "pass",
              "score": 1,
              "detail": "43 DOM elements.",
              "assessment": "observed"
            },
            {
              "id": "domDepth",
              "label": "DOM not too deeply nested",
              "weight": 0.5,
              "status": "pass",
              "score": 1,
              "detail": "Maximum nesting depth ~7.",
              "assessment": "observed"
            },
            {
              "id": "outdatedLibs",
              "label": "No outdated/known-risk libraries",
              "weight": 1,
              "status": "info",
              "score": 1,
              "detail": "No fingerprinted libraries.",
              "evidence": {
                "libs": []
              },
              "assessment": "not-applicable"
            },
            {
              "id": "jsUrls",
              "label": "No javascript: URLs",
              "weight": 0.6,
              "status": "pass",
              "score": 1,
              "detail": "No javascript: URLs.",
              "assessment": "observed"
            },
            {
              "id": "metaRefresh",
              "label": "No meta-refresh redirects",
              "weight": 0.5,
              "status": "pass",
              "score": 1,
              "detail": "No meta refresh.",
              "assessment": "observed"
            },
            {
              "id": "singletons",
              "label": "Valid document structure",
              "weight": 0.7,
              "status": "pass",
              "score": 1,
              "detail": "Exactly one html/head/body/title.",
              "assessment": "observed"
            },
            {
              "id": "brokenAnchors",
              "label": "In-page anchors resolve",
              "weight": 0.5,
              "status": "pass",
              "score": 1,
              "detail": "All in-page anchor links resolve.",
              "assessment": "observed"
            },
            {
              "id": "formValidity",
              "label": "Forms are well-formed",
              "weight": 0.6,
              "status": "pass",
              "score": 1,
              "detail": "0/1 form(s) missing a submit target or have unnamed fields.",
              "assessment": "observed"
            },
            {
              "id": "noSecrets",
              "label": "No secrets/internal data exposed",
              "weight": 0.7,
              "status": "pass",
              "score": 1,
              "detail": "No obvious secrets or internal data in the markup.",
              "assessment": "observed"
            },
            {
              "id": "importantAbuse",
              "label": "No !important abuse",
              "weight": 0.5,
              "status": "pass",
              "score": 1,
              "detail": "0 !important declaration(s).",
              "assessment": "observed"
            },
            {
              "id": "semanticInteractive",
              "label": "Interactive elements are real controls",
              "weight": 0.6,
              "status": "pass",
              "score": 1,
              "detail": "Interactivity uses <a>/<button>.",
              "assessment": "observed"
            },
            {
              "id": "dupMeta",
              "label": "No duplicate meta tags",
              "weight": 0.4,
              "status": "pass",
              "score": 1,
              "detail": "No duplicate description/viewport tags.",
              "assessment": "observed"
            },
            {
              "id": "modernCssAdoption",
              "label": "Modern-CSS adoption",
              "weight": 0,
              "status": "info",
              "score": 1,
              "detail": "Modern-CSS adoption not assessed (external stylesheets not fetched) — container queries, anchor positioning and text-wrap balance can't be detected from the served HTML alone.",
              "assessment": "not-applicable"
            }
          ],
          "summary": "Scored 98/100 on 25 front-end hygiene checks (24 clean) — including outdated-library detection, document validity, broken anchors, exposed secrets and !important abuse."
        },
        {
          "key": "uiux",
          "label": "UI / UX",
          "weight": 1.05,
          "score": 96,
          "grade": "A+",
          "scoreAvailable": true,
          "coverage": {
            "scored": 16,
            "observed": 4,
            "heuristic": 12,
            "notTested": 2,
            "notApplicable": 11
          },
          "checks": [
            {
              "id": "responsive",
              "label": "Mobile-responsive viewport",
              "weight": 1.8,
              "status": "pass",
              "score": 1,
              "detail": "Responsive viewport configured.",
              "assessment": "observed"
            },
            {
              "id": "mediaQueries",
              "label": "Responsive CSS present",
              "weight": 0.6,
              "status": "info",
              "score": 1,
              "detail": "No inline media queries (may be in external CSS).",
              "assessment": "not-tested"
            },
            {
              "id": "cta",
              "label": "Clear call-to-action",
              "weight": 1.5,
              "status": "pass",
              "score": 1,
              "detail": "3 action-oriented control(s) detected using the page language. Prominence is not assessed from HTML.",
              "evidence": {
                "ctas": 3,
                "purpose": "article",
                "pageLang": "en"
              },
              "assessment": "heuristic"
            },
            {
              "id": "navigation",
              "label": "Discoverable navigation",
              "weight": 1.2,
              "status": "pass",
              "score": 1,
              "detail": "3 navigation link(s) inside <nav>.",
              "assessment": "heuristic"
            },
            {
              "id": "search",
              "label": "Site search",
              "weight": 0.4,
              "status": "info",
              "score": 1,
              "detail": "No site search detected.",
              "recommendation": "For content-heavy sites, add search to help users find things fast.",
              "assessment": "not-applicable"
            },
            {
              "id": "breadcrumbs",
              "label": "Breadcrumbs / wayfinding",
              "weight": 0.3,
              "status": "info",
              "score": 1,
              "detail": "No breadcrumbs detected.",
              "assessment": "not-applicable"
            },
            {
              "id": "contact",
              "label": "Contact information",
              "weight": 0.8,
              "status": "pass",
              "score": 1,
              "detail": "Contact details/links present.",
              "assessment": "heuristic"
            },
            {
              "id": "social",
              "label": "Social proof / links",
              "weight": 0.4,
              "status": "info",
              "score": 1,
              "detail": "No social links detected.",
              "assessment": "not-applicable"
            },
            {
              "id": "footer",
              "label": "Footer present",
              "weight": 0.4,
              "status": "pass",
              "score": 1,
              "detail": "Footer region present.",
              "assessment": "observed"
            },
            {
              "id": "readability",
              "label": "Readable prose (Flesch)",
              "weight": 1,
              "status": "pass",
              "score": 1,
              "detail": "Flesch Reading Ease 54.4 — fairly difficult (10th–12th grade); avg 9 words/sentence.",
              "evidence": {
                "flesch": 54.4,
                "grade": 7.9
              },
              "assessment": "heuristic"
            },
            {
              "id": "scannability",
              "label": "Scannable content blocks",
              "weight": 0.7,
              "status": "pass",
              "score": 1,
              "detail": "0/4 paragraphs are very long (120+ words).",
              "assessment": "heuristic"
            },
            {
              "id": "legibility",
              "label": "Legible base font size",
              "weight": 0.7,
              "status": "info",
              "score": 1,
              "detail": "Font size was not measured; computed styles and external CSS are not evaluated in this check.",
              "assessment": "not-tested"
            },
            {
              "id": "formUx",
              "label": "Form input ergonomics",
              "weight": 0.9,
              "status": "pass",
              "score": 0.8,
              "detail": "1 field(s): 1 with a specific type (email/tel/url/number/…), 1 autocomplete, 0 placeholder.",
              "assessment": "observed"
            },
            {
              "id": "valueProp",
              "label": "Clear headline / value prop",
              "weight": 0.9,
              "status": "pass",
              "score": 1,
              "detail": "H1: \"How do you audit a public web page?\".",
              "assessment": "heuristic"
            },
            {
              "id": "hierarchy",
              "label": "Visual hierarchy",
              "weight": 0.8,
              "status": "pass",
              "score": 1,
              "detail": "3 section heading(s) and 1 image(s) establish rhythm.",
              "assessment": "heuristic"
            },
            {
              "id": "polish",
              "label": "Tab/brand polish",
              "weight": 0.3,
              "status": "warn",
              "score": 0.5,
              "detail": "Favicon + descriptive title give a polished browser-tab presence.",
              "recommendation": "Add a favicon for a polished, trustworthy tab presence.",
              "assessment": "heuristic"
            },
            {
              "id": "clicksToContact",
              "label": "Contact reachable in ≤1 click",
              "weight": 1.6,
              "status": "pass",
              "score": 1,
              "detail": "Estimated 0 click(s) to contact — contact form on this page.",
              "evidence": {
                "clicks": 0
              },
              "assessment": "heuristic"
            },
            {
              "id": "colorConsistency",
              "label": "Disciplined colour palette",
              "weight": 1.1,
              "status": "pass",
              "score": 1,
              "detail": "3 distinct colours used in inline/embedded styles.",
              "evidence": {
                "colors": 3
              },
              "assessment": "heuristic"
            },
            {
              "id": "typeScale",
              "label": "Consistent type scale",
              "weight": 1,
              "status": "info",
              "score": 1,
              "detail": "No inline font sizes to assess.",
              "evidence": {
                "fontSizes": 0,
                "fontFamilies": 0
              },
              "assessment": "not-applicable"
            },
            {
              "id": "fontDiscipline",
              "label": "Limited font families",
              "weight": 0.7,
              "status": "info",
              "score": 1,
              "detail": "0 distinct font families.",
              "assessment": "not-applicable"
            },
            {
              "id": "buttonConsistency",
              "label": "Consistent button styling",
              "weight": 1,
              "status": "info",
              "score": 1,
              "detail": "1 visually-distinct button/CTA styles detected.",
              "assessment": "not-applicable"
            },
            {
              "id": "spacingScale",
              "label": "Consistent spacing scale",
              "weight": 0.7,
              "status": "pass",
              "score": 1,
              "detail": "1 distinct margin/padding/gap values.",
              "assessment": "heuristic"
            },
            {
              "id": "importantAbuse",
              "label": "No !important abuse",
              "weight": 0.5,
              "status": "pass",
              "score": 1,
              "detail": "0 !important declaration(s).",
              "assessment": "observed"
            },
            {
              "id": "aboveFold",
              "label": "Opening content signals (HTML estimate)",
              "weight": 1.2,
              "status": "pass",
              "score": 1,
              "detail": "Hero has headline:✓ supporting text:✓ CTA:✓.",
              "assessment": "heuristic"
            },
            {
              "id": "trustSignals",
              "label": "Conversion trust signals",
              "weight": 0.9,
              "status": "info",
              "score": 0,
              "detail": "No testimonials, logos, ratings or guarantees detected. This conversion check is not required for the inferred page purpose.",
              "assessment": "not-applicable"
            },
            {
              "id": "classSprawl",
              "label": "Maintainable class system",
              "weight": 0.6,
              "status": "info",
              "score": 1,
              "detail": "0 distinct class names across 43 elements (ratio 0.00).",
              "assessment": "not-applicable"
            },
            {
              "id": "themeColor",
              "label": "Browser chrome themed (theme-color/color-scheme)",
              "weight": 0.3,
              "status": "info",
              "score": 1,
              "detail": "theme-color ✗, color-scheme ✗.",
              "recommendation": "Add <meta name=\"theme-color\"> to tint browser chrome to your brand, and <meta name=\"color-scheme\"> so dark-mode users don't get a white flash before CSS loads.",
              "assessment": "not-applicable"
            },
            {
              "id": "manifest",
              "label": "Web app manifest",
              "weight": 0.3,
              "status": "info",
              "score": 1,
              "detail": "No web app manifest (optional: controls name/icon/colours when users install or pin the site).",
              "recommendation": "Add a manifest.json with name, icons and theme colours, linked via <link rel=\"manifest\">.",
              "assessment": "not-applicable"
            },
            {
              "id": "serviceWorker",
              "label": "Service worker (offline/cache layer)",
              "weight": 0.4,
              "status": "info",
              "score": 1,
              "detail": "No service worker detected (optional: only worth adding for app-like sites that benefit from offline/installable behaviour).",
              "assessment": "not-applicable"
            }
          ],
          "summary": "Scored 96/100 across 17 UI/UX & conversion checks — including click-depth to contact, design-token consistency, above-the-fold pitch and trust signals that most graders ignore."
        },
        {
          "key": "dataTracking",
          "label": "Data & Tracking",
          "weight": 0.8,
          "score": 100,
          "grade": "A+",
          "scoreAvailable": true,
          "coverage": {
            "scored": 6,
            "observed": 6,
            "heuristic": 0,
            "notTested": 2,
            "notApplicable": 5
          },
          "checks": [
            {
              "id": "hasAnalytics",
              "label": "Web analytics installed",
              "weight": 2.4,
              "status": "info",
              "score": 0,
              "detail": "No recognized client-side analytics detected. The page may intentionally omit analytics or measure activity server-side; no score penalty.",
              "recommendation": "If measurement is needed, verify your server-side or client-side setup against your goals; analytics is optional for this score.",
              "evidence": {
                "analytics": [],
                "tagManager": false
              },
              "assessment": "not-tested"
            },
            {
              "id": "conversionTracking",
              "label": "Conversion / marketing tracking",
              "weight": 1.2,
              "status": "info",
              "score": 1,
              "detail": "No advertising/marketing pixels — fine for a privacy-first site (only needed if you run paid acquisition).",
              "recommendation": "If you run paid acquisition, add the relevant pixels (Meta, Google Ads, LinkedIn) to measure ROI.",
              "assessment": "not-applicable"
            },
            {
              "id": "tagManager",
              "label": "Tag governance",
              "weight": 0.8,
              "status": "info",
              "score": 1,
              "detail": "Few tags; a manager is optional at this scale.",
              "assessment": "not-applicable"
            },
            {
              "id": "consent",
              "label": "Tracking and consent markup",
              "weight": 2,
              "status": "info",
              "score": 1,
              "detail": "No recognized profiling trackers; consent requirements were not assessed.",
              "evidence": {
                "consent": []
              },
              "assessment": "not-tested"
            },
            {
              "id": "privacyPolicy",
              "label": "Privacy policy link",
              "weight": 0.8,
              "status": "pass",
              "score": 1,
              "detail": "A privacy/cookie policy link is present.",
              "assessment": "observed"
            },
            {
              "id": "trackerCount",
              "label": "Reasonable tracker count",
              "weight": 0.9,
              "status": "pass",
              "score": 1,
              "detail": "0 distinct tracking tool(s) detected.",
              "evidence": {
                "vendors": []
              },
              "assessment": "observed"
            },
            {
              "id": "duplicateAnalytics",
              "label": "No duplicate analytics",
              "weight": 0.6,
              "status": "pass",
              "score": 1,
              "detail": "0 GA4 property.",
              "assessment": "observed"
            },
            {
              "id": "piiLeak",
              "label": "No PII in tracking/URLs",
              "weight": 1,
              "status": "pass",
              "score": 1,
              "detail": "No obvious PII in tracking calls or URLs.",
              "assessment": "observed"
            },
            {
              "id": "gpcDnt",
              "label": "Honours GPC / Do-Not-Track",
              "weight": 0.4,
              "status": "info",
              "score": 1,
              "detail": "No consent-requiring tracking to gate — GPC/DNT not applicable.",
              "assessment": "not-applicable"
            },
            {
              "id": "firstPartyTagging",
              "label": "First-party / server-side tagging",
              "weight": 0.4,
              "status": "info",
              "score": 1,
              "detail": "Tagging appears fully client-side/third-party.",
              "assessment": "not-applicable"
            },
            {
              "id": "fingerprinting",
              "label": "No covert fingerprinting",
              "weight": 0.6,
              "status": "pass",
              "score": 1,
              "detail": "No device-fingerprinting libraries detected.",
              "assessment": "observed"
            },
            {
              "id": "cookiePolicy",
              "label": "Cookie policy / settings link",
              "weight": 0.4,
              "status": "info",
              "score": 1,
              "detail": "No dedicated cookie policy/settings link.",
              "assessment": "not-applicable"
            },
            {
              "id": "trackerPlacement",
              "label": "Trackers load non-blocking",
              "weight": 0.4,
              "status": "pass",
              "score": 1,
              "detail": "Tracking tags load async/deferred.",
              "assessment": "observed"
            }
          ],
          "summary": "Scored 100/100. Detected 0 tool(s) across 6 checks — including consent ordering, PII leakage, fingerprinting and duplicate-property detection."
        },
        {
          "key": "security",
          "label": "Security",
          "weight": 1.05,
          "score": 52,
          "grade": "E",
          "scoreAvailable": true,
          "coverage": {
            "scored": 13,
            "observed": 13,
            "heuristic": 0,
            "notTested": 1,
            "notApplicable": 6
          },
          "checks": [
            {
              "id": "https",
              "label": "Served over HTTPS",
              "weight": 3,
              "status": "pass",
              "score": 1,
              "detail": "The final URL is served over HTTPS.",
              "assessment": "observed"
            },
            {
              "id": "hsts",
              "label": "HSTS header",
              "weight": 1.4,
              "status": "warn",
              "score": 0,
              "detail": "No HSTS header.",
              "recommendation": "Set Strict-Transport-Security: max-age=31536000; includeSubDomains; preload.",
              "assessment": "observed"
            },
            {
              "id": "csp",
              "label": "Content Security Policy",
              "weight": 1.5,
              "status": "warn",
              "score": 0.2,
              "detail": "No Content-Security-Policy.",
              "recommendation": "Add a Content-Security-Policy (start in report-only mode) to mitigate XSS.",
              "assessment": "observed"
            },
            {
              "id": "xcto",
              "label": "X-Content-Type-Options: nosniff",
              "weight": 0.8,
              "status": "warn",
              "score": 0.5,
              "detail": "Missing X-Content-Type-Options: nosniff.",
              "recommendation": "Add X-Content-Type-Options: nosniff to stop MIME sniffing.",
              "assessment": "observed"
            },
            {
              "id": "clickjacking",
              "label": "Clickjacking protection",
              "weight": 1,
              "status": "warn",
              "score": 0.5,
              "detail": "No clickjacking protection.",
              "recommendation": "Set X-Frame-Options: SAMEORIGIN or a CSP frame-ancestors directive.",
              "assessment": "observed"
            },
            {
              "id": "referrerPolicy",
              "label": "Referrer-Policy",
              "weight": 0.6,
              "status": "warn",
              "score": 0.5,
              "detail": "No Referrer-Policy.",
              "recommendation": "Set Referrer-Policy: strict-origin-when-cross-origin to avoid leaking URLs.",
              "assessment": "observed"
            },
            {
              "id": "permissionsPolicy",
              "label": "Permissions-Policy",
              "weight": 0.5,
              "status": "info",
              "score": 1,
              "detail": "No Permissions-Policy (recommended).",
              "recommendation": "Add a Permissions-Policy to disable unused features (camera, geolocation…).",
              "assessment": "not-applicable"
            },
            {
              "id": "crossOrigin",
              "label": "Cross-origin policies (COOP/CORP)",
              "weight": 0.5,
              "status": "info",
              "score": 1,
              "detail": "COOP: —, CORP: —.",
              "recommendation": "Consider Cross-Origin-Opener-Policy and Cross-Origin-Resource-Policy to harden isolation.",
              "assessment": "not-applicable"
            },
            {
              "id": "disclosure",
              "label": "No stack/version disclosure",
              "weight": 0.6,
              "status": "pass",
              "score": 1,
              "detail": "No obvious version disclosure.",
              "assessment": "observed"
            },
            {
              "id": "mixedContent",
              "label": "No mixed content",
              "weight": 1,
              "status": "pass",
              "score": 1,
              "detail": "No insecure http resources on an https page.",
              "assessment": "observed"
            },
            {
              "id": "formAction",
              "label": "Forms submit over HTTPS",
              "weight": 0.6,
              "status": "pass",
              "score": 1,
              "detail": "No forms post to an insecure http endpoint.",
              "assessment": "observed"
            },
            {
              "id": "dangerousJs",
              "label": "No obvious dangerous JS sinks",
              "weight": 0.4,
              "status": "pass",
              "score": 1,
              "detail": "No eval/document.write in the served HTML.",
              "assessment": "observed"
            },
            {
              "id": "securityTxt",
              "label": "security.txt published",
              "weight": 0.4,
              "status": "warn",
              "score": 0.5,
              "detail": "No security.txt found.",
              "recommendation": "Publish /.well-known/security.txt with a disclosure contact so researchers can report issues responsibly.",
              "assessment": "observed"
            },
            {
              "id": "corsWildcard",
              "label": "No reflexive/wildcard CORS",
              "weight": 0.5,
              "status": "pass",
              "score": 1,
              "detail": "No permissive CORS header on the document.",
              "assessment": "observed"
            },
            {
              "id": "vulnerableDeps",
              "label": "No known-vulnerable libraries",
              "weight": 0.8,
              "status": "pass",
              "score": 1,
              "detail": "No outdated/known-risk client libraries detected.",
              "assessment": "observed"
            },
            {
              "id": "crossOriginIsolation",
              "label": "Cross-origin isolation headers",
              "weight": 0.3,
              "status": "info",
              "score": 1,
              "detail": "No Cross-Origin-Embedder-Policy (needed for full isolation / SharedArrayBuffer).",
              "recommendation": "If you need cross-origin isolation, pair COOP with Cross-Origin-Embedder-Policy.",
              "assessment": "not-applicable"
            },
            {
              "id": "reportingEndpoints",
              "label": "Violation reporting configured",
              "weight": 0.3,
              "status": "info",
              "score": 1,
              "detail": "No Reporting-Endpoints header or CSP report-to — policy violations in the field go unseen.",
              "recommendation": "Add a Reporting-Endpoints header (plus report-to in your CSP) so real-world policy breakage reaches you.",
              "assessment": "not-applicable"
            },
            {
              "id": "trustedTypes",
              "label": "Trusted Types (DOM-XSS defence)",
              "weight": 0.3,
              "status": "info",
              "score": 1,
              "detail": "No require-trusted-types-for CSP directive (optional hardening against DOM-based XSS).",
              "recommendation": "Consider CSP `require-trusted-types-for 'script'` to neutralise DOM-based XSS at innerHTML-style sinks.",
              "assessment": "not-applicable"
            },
            {
              "id": "caaRecords",
              "label": "CAA records restrict cert issuance",
              "weight": 0.5,
              "status": "info",
              "score": 0,
              "detail": "DNS lookup unavailable — couldn't verify CAA records.",
              "assessment": "not-tested"
            },
            {
              "id": "digestFields",
              "label": "Digest Fields (RFC 9530)",
              "weight": 0.2,
              "status": "info",
              "score": 0,
              "detail": "No Repr-Digest/Content-Digest header (RFC 9530 Digest Fields let clients verify response integrity — cutting-edge, mostly for APIs).",
              "assessment": "not-applicable"
            }
          ],
          "summary": "Scored 52/100 across 13 security checks (0 failing) — including CSP hardening, HSTS, security.txt, cookie prefixes, CORS, violation reporting and known-vulnerable-library detection."
        }
      ],
      "topIssues": [
        {
          "dimension": "seo",
          "title": "Page is indexable",
          "detail": "The page is set to noindex and will be excluded from search."
        },
        {
          "dimension": "geo",
          "title": "Machine-extractable structured data",
          "detail": "No JSON-LD — AI engines must guess the page's facts and entities."
        },
        {
          "dimension": "security",
          "title": "HSTS header",
          "detail": "No HSTS header."
        },
        {
          "dimension": "security",
          "title": "Content Security Policy",
          "detail": "No Content-Security-Policy."
        },
        {
          "dimension": "security",
          "title": "Clickjacking protection",
          "detail": "No clickjacking protection."
        },
        {
          "dimension": "geo",
          "title": "Outbound citations",
          "detail": "1 outbound citation(s) to other domains."
        }
      ],
      "meta": {
        "scoringVersion": "2026-10-06.2",
        "measurementMode": "static",
        "coverage": {
          "scored": 158,
          "observed": 136,
          "heuristic": 27,
          "notTested": 7,
          "notApplicable": 59
        },
        "statusCode": 200,
        "htmlBytes": 2608,
        "transferBytes": 500,
        "loadMs": 200,
        "redirected": false,
        "aiEnabled": false,
        "checksRun": 229
      }
    },
    {
      "id": "unlabelled",
      "source": "/research/2026-10-13/unlabelled.html.txt",
      "url": "https://example.org/audit-guide",
      "normalizedUrl": "https://example.org/audit-guide",
      "finalUrl": "https://example.org/audit-guide",
      "title": "How to audit a public web page | Example guide",
      "description": "A practical guide to inspecting the HTML of one public page, checking actual evidence and verifying a focused fix with a repeat audit.",
      "faviconUrl": "https://example.org/favicon.ico",
      "fetchedAt": "2026-10-13T12:00:00.000Z",
      "overallScore": 77,
      "grade": "C",
      "dimensions": [
        {
          "key": "seo",
          "label": "SEO",
          "weight": 1.4,
          "score": 68,
          "grade": "D",
          "scoreAvailable": true,
          "coverage": {
            "scored": 37,
            "observed": 28,
            "heuristic": 9,
            "notTested": 0,
            "notApplicable": 4
          },
          "checks": [
            {
              "id": "titleLength",
              "label": "Title length",
              "weight": 2.2,
              "status": "pass",
              "score": 1,
              "detail": "Title is 46 characters (~373px): \"How to audit a public web page | Example guide\".",
              "evidence": {
                "title": "How to audit a public web page | Example guide",
                "length": 46,
                "pixelWidth": 373
              },
              "assessment": "observed"
            },
            {
              "id": "titlePixels",
              "label": "Title not truncated in SERPs",
              "weight": 0.8,
              "status": "pass",
              "score": 1,
              "detail": "Estimated SERP width ~373px (Google truncates around 580px).",
              "assessment": "observed"
            },
            {
              "id": "titleKeywordFront",
              "label": "Keyword near start of title",
              "weight": 1.2,
              "status": "warn",
              "score": 0.5,
              "detail": "Primary term \"page\" appears at position 26 in the title.",
              "assessment": "heuristic"
            },
            {
              "id": "titleBrand",
              "label": "Brand in title",
              "weight": 0.5,
              "status": "pass",
              "score": 1,
              "detail": "Title uses a separator, suggesting a brand suffix.",
              "assessment": "observed"
            },
            {
              "id": "metaDescLength",
              "label": "Meta description length",
              "weight": 1.6,
              "status": "pass",
              "score": 1,
              "detail": "Meta description is 134 characters.",
              "evidence": {
                "length": 134
              },
              "assessment": "observed"
            },
            {
              "id": "metaDescCta",
              "label": "Meta description has a call to action",
              "weight": 0.6,
              "status": "warn",
              "score": 0.5,
              "detail": "The description lacks a call to action.",
              "recommendation": "Add an action word (e.g. 'Discover…', 'Get…') to improve click-through.",
              "assessment": "heuristic"
            },
            {
              "id": "metaDescKeyword",
              "label": "Keyword in meta description",
              "weight": 0.6,
              "status": "pass",
              "score": 1,
              "detail": "Primary term \"page\" appears in the description.",
              "assessment": "heuristic"
            },
            {
              "id": "h1Single",
              "label": "Exactly one H1",
              "weight": 2,
              "status": "pass",
              "score": 1,
              "detail": "One <h1>: \"How do you audit a public web page?\".",
              "evidence": {
                "h1Count": 1
              },
              "assessment": "observed"
            },
            {
              "id": "h1Keyword",
              "label": "Keyword in H1",
              "weight": 1,
              "status": "pass",
              "score": 1,
              "detail": "Primary term \"page\" is in the H1.",
              "assessment": "heuristic"
            },
            {
              "id": "headingOrder",
              "label": "Logical heading hierarchy",
              "weight": 1.2,
              "status": "pass",
              "score": 1,
              "detail": "3 headings form a clean outline.",
              "evidence": {
                "headings": 3,
                "h2Count": 2
              },
              "assessment": "observed"
            },
            {
              "id": "h2Coverage",
              "label": "Sub-headings structure content",
              "weight": 0.8,
              "status": "pass",
              "score": 1,
              "detail": "2 <h2> sub-heading(s).",
              "assessment": "observed"
            },
            {
              "id": "keywordTargeting",
              "label": "Keyword targeting (title/H1/intro)",
              "weight": 2.2,
              "status": "pass",
              "score": 1,
              "detail": "Primary term \"page\" → title:✓ H1:✓ intro:✓.",
              "evidence": {
                "topKeywords": [
                  {
                    "term": "page",
                    "count": 5,
                    "density": 4.716981132075472
                  },
                  {
                    "term": "check",
                    "count": 5,
                    "density": 4.716981132075472
                  },
                  {
                    "term": "audit",
                    "count": 3,
                    "density": 2.8301886792452833
                  },
                  {
                    "term": "html",
                    "count": 3,
                    "density": 2.8301886792452833
                  },
                  {
                    "term": "evidence",
                    "count": 3,
                    "density": 2.8301886792452833
                  },
                  {
                    "term": "labels",
                    "count": 3,
                    "density": 2.8301886792452833
                  }
                ]
              },
              "assessment": "heuristic"
            },
            {
              "id": "keywordDensity",
              "label": "Keyword density not stuffed",
              "weight": 1,
              "status": "fail",
              "score": 0,
              "detail": "Top term \"page\" is 4.7% of 106 content words.",
              "recommendation": "Reduce repetition — over-using the keyword reads as spam to Google.",
              "assessment": "heuristic"
            },
            {
              "id": "semanticDepth",
              "label": "Semantic / topical depth (phrases)",
              "weight": 1,
              "status": "warn",
              "score": 0.3333333333333333,
              "detail": "Recurring topical phrases: \"form labels\".",
              "recommendation": "Cover the topic with related sub-topics and entities (LSI) so the page demonstrates depth.",
              "evidence": {
                "phrases": [
                  {
                    "term": "form labels",
                    "count": 2,
                    "density": 1.8867924528301887
                  }
                ]
              },
              "assessment": "observed"
            },
            {
              "id": "contentDepth",
              "label": "Content depth",
              "weight": 1.4,
              "status": "fail",
              "score": 0.1,
              "detail": "Roughly 169 words of body text.",
              "recommendation": "Thin content struggles to rank — expand to comprehensively cover the topic (600+ words for key pages).",
              "evidence": {
                "words": 169
              },
              "assessment": "observed"
            },
            {
              "id": "textRatio",
              "label": "Text-to-HTML ratio",
              "weight": 0.7,
              "status": "pass",
              "score": 1,
              "detail": "Visible text is ~36.8% of the HTML payload.",
              "assessment": "observed"
            },
            {
              "id": "urlStructure",
              "label": "Clean, readable URL",
              "weight": 1,
              "status": "pass",
              "score": 1,
              "detail": "Clean URL path: \"/audit-guide\".",
              "assessment": "observed"
            },
            {
              "id": "indexable",
              "label": "Page is indexable",
              "weight": 2.4,
              "status": "pass",
              "score": 1,
              "detail": "The page is indexable (no noindex in meta or X-Robots-Tag).",
              "evidence": {
                "robotsMeta": "index,follow",
                "xRobots": ""
              },
              "assessment": "observed"
            },
            {
              "id": "followable",
              "label": "Links are followable",
              "weight": 0.6,
              "status": "pass",
              "score": 1,
              "detail": "No page-level nofollow.",
              "assessment": "observed"
            },
            {
              "id": "robotsTxt",
              "label": "Googlebot access to this URL",
              "weight": 1.2,
              "status": "pass",
              "score": 1,
              "detail": "No matching robots restriction for Googlebot on this URL.",
              "evidence": {
                "agent": "Googlebot",
                "allowed": true,
                "path": "/audit-guide"
              },
              "assessment": "observed"
            },
            {
              "id": "sitemap",
              "label": "XML sitemap available",
              "weight": 1,
              "status": "pass",
              "score": 1,
              "detail": "Sitemap reachable at undefined.",
              "assessment": "observed"
            },
            {
              "id": "canonical",
              "label": "Canonical URL",
              "weight": 1.2,
              "status": "pass",
              "score": 1,
              "detail": "Canonical → https://example.org/audit-guide (self-referencing).",
              "assessment": "observed"
            },
            {
              "id": "hreflang",
              "label": "hreflang for internationalization",
              "weight": 0.4,
              "status": "info",
              "score": 1,
              "detail": "No hreflang tags (only needed for multi-language sites).",
              "recommendation": "If you serve multiple languages/regions, add hreflang alternates.",
              "assessment": "not-applicable"
            },
            {
              "id": "openGraph",
              "label": "Open Graph tags",
              "weight": 0.9,
              "status": "fail",
              "score": 0,
              "detail": "0/5 core Open Graph tags present.",
              "recommendation": "Add og:title, og:description, og:image, og:url and og:type for rich social/chat previews.",
              "evidence": {
                "present": []
              },
              "assessment": "observed"
            },
            {
              "id": "twitterCard",
              "label": "Twitter/X card tags",
              "weight": 0.5,
              "status": "info",
              "score": 1,
              "detail": "0/3 Twitter card tags present.",
              "recommendation": "Add twitter:card, twitter:title and twitter:image for better X/Twitter previews.",
              "assessment": "not-applicable"
            },
            {
              "id": "structuredData",
              "label": "Structured data (Schema.org)",
              "weight": 1.3,
              "status": "warn",
              "score": 0.3,
              "detail": "No JSON-LD structured data found.",
              "recommendation": "Add valid JSON-LD (Organization, BreadcrumbList, Article/Product as relevant) to qualify for rich results.",
              "evidence": {
                "blocks": 0,
                "valid": 0,
                "types": []
              },
              "assessment": "observed"
            },
            {
              "id": "breadcrumbs",
              "label": "Breadcrumb structured data",
              "weight": 0.4,
              "status": "info",
              "score": 1,
              "detail": "No breadcrumb structured data.",
              "recommendation": "Add BreadcrumbList schema so search shows breadcrumb trails in results.",
              "assessment": "not-applicable"
            },
            {
              "id": "imageAlt",
              "label": "Descriptive image alt text",
              "weight": 0.9,
              "status": "fail",
              "score": 0,
              "detail": "0/1 images have alt text.",
              "recommendation": "Add concise, descriptive alt text for image search and accessibility.",
              "assessment": "observed"
            },
            {
              "id": "internalLinks",
              "label": "Internal linking",
              "weight": 1,
              "status": "pass",
              "score": 1,
              "detail": "6 internal and 1 external links (0 nofollow).",
              "evidence": {
                "internal": 6,
                "external": 1,
                "nofollow": 0
              },
              "assessment": "observed"
            },
            {
              "id": "anchorQuality",
              "label": "Descriptive anchor text",
              "weight": 0.6,
              "status": "pass",
              "score": 1,
              "detail": "0 generic anchor(s) like \"click here\" out of 8 links.",
              "assessment": "observed"
            },
            {
              "id": "mobileViewport",
              "label": "Mobile-friendly viewport",
              "weight": 1.2,
              "status": "pass",
              "score": 1,
              "detail": "viewport: \"width=device-width, initial-scale=1\".",
              "assessment": "observed"
            },
            {
              "id": "htmlLang",
              "label": "Language declared",
              "weight": 0.6,
              "status": "pass",
              "score": 1,
              "detail": "lang=\"en\".",
              "assessment": "observed"
            },
            {
              "id": "keywordDistribution",
              "label": "Keyword across title/H1/intro/URL/alt",
              "weight": 1.4,
              "status": "warn",
              "score": 0.6,
              "detail": "Primary term \"page\" appears in 3/5 key locations (title/H1/intro/URL/alt).",
              "recommendation": "Distribute your primary keyword across the title, H1, opening text, URL slug and an image alt for unambiguous topical relevance.",
              "assessment": "heuristic"
            },
            {
              "id": "h2KeywordCoverage",
              "label": "Sub-headings cover the topic",
              "weight": 0.8,
              "status": "pass",
              "score": 1,
              "detail": "1/2 sub-headings include a top topical term.",
              "assessment": "heuristic"
            },
            {
              "id": "ogImageQuality",
              "label": "Social image is share-ready",
              "weight": 0.6,
              "status": "fail",
              "score": 0,
              "detail": "No og:image.",
              "recommendation": "Use an absolute og:image URL (1200×630) and declare og:image:width/height for reliable rich previews.",
              "assessment": "observed"
            },
            {
              "id": "cleanUrlParams",
              "label": "URL free of tracking params",
              "weight": 0.5,
              "status": "pass",
              "score": 1,
              "detail": "No tracking/session parameters in the canonical URL.",
              "assessment": "observed"
            },
            {
              "id": "anchorDiversity",
              "label": "Diverse internal anchor text",
              "weight": 0.5,
              "status": "pass",
              "score": 1,
              "detail": "8 unique anchors out of 8 links (100% diverse).",
              "assessment": "observed"
            },
            {
              "id": "indexSitemapConsistency",
              "label": "No conflicting index signals",
              "weight": 0.7,
              "status": "pass",
              "score": 1,
              "detail": "Index signals are consistent.",
              "assessment": "heuristic"
            },
            {
              "id": "titleCtr",
              "label": "Title optimised for click-through",
              "weight": 0.5,
              "status": "pass",
              "score": 1,
              "detail": "Title uses numbers/power words that lift CTR.",
              "assessment": "observed"
            },
            {
              "id": "descUnique",
              "label": "Meta description is purpose-written",
              "weight": 0.4,
              "status": "pass",
              "score": 1,
              "detail": "Meta description is distinct from body copy.",
              "assessment": "observed"
            },
            {
              "id": "feedDiscovery",
              "label": "Feed advertised (RSS/Atom)",
              "weight": 0.3,
              "status": "info",
              "score": 1,
              "detail": "No RSS/Atom/JSON feed announced in <head> (only relevant if the site publishes a feed).",
              "recommendation": "If you publish a feed, announce it with <link rel=\"alternate\" type=\"application/rss+xml\"> so readers and agents can find it.",
              "assessment": "not-applicable"
            }
          ],
          "summary": "Scored 68/100 across 37 on-page SEO checks (27 pass, 5 warn, 5 fail) — including keyword distribution, schema completeness, anchor diversity and index-signal consistency."
        },
        {
          "key": "geo",
          "label": "GEO (AI Answer Engines)",
          "weight": 1.15,
          "score": 65,
          "grade": "D",
          "scoreAvailable": true,
          "coverage": {
            "scored": 13,
            "observed": 13,
            "heuristic": 5,
            "notTested": 1,
            "notApplicable": 14
          },
          "checks": [
            {
              "id": "structuredAnswers",
              "label": "Machine-extractable structured data",
              "weight": 2.4,
              "status": "fail",
              "score": 0,
              "detail": "No JSON-LD — AI engines must guess the page's facts and entities.",
              "recommendation": "Add Article and Organization/Person JSON-LD (plus HowTo where relevant) so engines can lift facts verbatim and attribute you.",
              "assessment": "observed"
            },
            {
              "id": "questionHeadings",
              "label": "Question-based headings",
              "weight": 1.4,
              "status": "pass",
              "score": 1,
              "detail": "3 heading(s) phrased as questions.",
              "evidence": {
                "examples": [
                  "How do you audit a public web page?",
                  "What should you check first?",
                  "How do you confirm an improvement?"
                ]
              },
              "assessment": "observed"
            },
            {
              "id": "liftableContent",
              "label": "Concise, liftable answers",
              "weight": 1.4,
              "status": "pass",
              "score": 1,
              "detail": "100% of paragraphs are answer-sized; 1 list(s), 0 table(s).",
              "assessment": "heuristic"
            },
            {
              "id": "dataTables",
              "label": "Structured data tables",
              "weight": 0.5,
              "status": "info",
              "score": 1,
              "detail": "No data tables.",
              "recommendation": "Where you compare options or list specs, use <table> — engines extract tabular facts cleanly.",
              "assessment": "not-applicable"
            },
            {
              "id": "authority",
              "label": "Author & attribution (E-E-A-T)",
              "weight": 1.2,
              "status": "pass",
              "score": 1,
              "detail": "Authorship/attribution signals present.",
              "assessment": "observed"
            },
            {
              "id": "aboutPage",
              "label": "Discoverable About/Org page",
              "weight": 0.5,
              "status": "pass",
              "score": 1,
              "detail": "An About/Team/Company link is present.",
              "assessment": "observed"
            },
            {
              "id": "freshness",
              "label": "Machine-readable dates",
              "weight": 0.9,
              "status": "pass",
              "score": 1,
              "detail": "Published/modified dates are exposed.",
              "assessment": "observed"
            },
            {
              "id": "citations",
              "label": "Outbound citations",
              "weight": 0.9,
              "status": "warn",
              "score": 0.5,
              "detail": "1 outbound citation(s) to other domains.",
              "recommendation": "Cite primary sources — well-sourced pages are more likely to be trusted and cited.",
              "assessment": "observed"
            },
            {
              "id": "aiCrawlerAccess",
              "label": "AI search crawler access to this URL",
              "weight": 1.6,
              "status": "pass",
              "score": 1,
              "detail": "No matching robots restriction for OpenAI Search, Perplexity or Claude Search. This is access eligibility, not proof of indexing or citations.",
              "evidence": {
                "blockedSearch": [],
                "decisions": []
              },
              "assessment": "observed"
            },
            {
              "id": "googleAiEligibility",
              "label": "Google Search AI eligibility",
              "weight": 0,
              "status": "info",
              "score": 1,
              "detail": "Public markup cannot confirm indexing, snippet eligibility or the owner's Search Console AI inclusion setting. Google-Extended controls Gemini training and grounding; it does not control Google Search inclusion.",
              "assessment": "not-tested"
            },
            {
              "id": "aiPolicyChoices",
              "label": "Training and user-triggered access policy",
              "weight": 0,
              "status": "info",
              "score": 1,
              "detail": "Policy restrictions: none detected. Training, Gemini grounding and user-triggered agents have separate purposes. ChatGPT-User does not determine ChatGPT Search inclusion.",
              "assessment": "observed"
            },
            {
              "id": "llmsTxt",
              "label": "llms.txt published",
              "weight": 0.4,
              "status": "info",
              "score": 1,
              "detail": "No /llms.txt found (optional — Google ignores it, but some AI agents read it).",
              "recommendation": "Consider publishing /llms.txt — a curated markdown map of your key content some AI agents read. Note it has no effect on Google Search or AI Overviews.",
              "assessment": "not-applicable"
            },
            {
              "id": "linkHeaderDiscovery",
              "label": "Link header advertises resources",
              "weight": 0.3,
              "status": "info",
              "score": 1,
              "detail": "No discovery hints in the HTTP Link header (optional: lets agents find sitemap/llms.txt without parsing HTML).",
              "recommendation": "Consider advertising sitemap/llms.txt/feeds via the HTTP Link header for agents that never read your HTML.",
              "assessment": "not-applicable"
            },
            {
              "id": "contentSignal",
              "label": "AI usage declared (Content-Signal)",
              "weight": 0.2,
              "status": "info",
              "score": 1,
              "detail": "No Content-Signal directives in robots.txt (emerging, optional standard for declaring AI search/train permissions).",
              "recommendation": "Optionally add Content-Signal directives to robots.txt to state explicitly whether AI may search, ingest or train on your content.",
              "assessment": "not-applicable"
            },
            {
              "id": "semanticStructure",
              "label": "Semantic HTML landmarks",
              "weight": 1,
              "status": "pass",
              "score": 1,
              "detail": "Uses 6 semantic landmark(s): main, article, section, nav, header, footer.",
              "assessment": "observed"
            },
            {
              "id": "directAnswer",
              "label": "Direct answer up top",
              "weight": 0,
              "status": "info",
              "score": 1,
              "detail": "Opens with a definitional, quotable statement.",
              "assessment": "heuristic"
            },
            {
              "id": "serverRendered",
              "label": "Text present in the initial HTML",
              "weight": 1,
              "status": "pass",
              "score": 1,
              "detail": "169 words in the initial HTML. Short pages can be complete; text length does not establish content quality or citations.",
              "assessment": "observed"
            },
            {
              "id": "statDensity",
              "label": "Quotable statistics",
              "weight": 0,
              "status": "info",
              "score": 1,
              "detail": "0 statistic-like figures (0.0 per 500 words).",
              "recommendation": "Use relevant, verifiable figures when they help readers. Statistics density is not a measured citation signal.",
              "assessment": "heuristic"
            },
            {
              "id": "comparisonContent",
              "label": "Comparison-style content",
              "weight": 0.6,
              "status": "info",
              "score": 1,
              "detail": "No comparison or tabular content detected.",
              "recommendation": "Where relevant, add comparison tables or 'X vs Y' sections — engines surface these for decision queries.",
              "assessment": "not-applicable"
            },
            {
              "id": "selfContained",
              "label": "Self-contained opening",
              "weight": 0,
              "status": "info",
              "score": 1,
              "detail": "Opening is a self-contained, quotable definition.",
              "assessment": "heuristic"
            },
            {
              "id": "chunking",
              "label": "Content split into extractable chunks",
              "weight": 0,
              "status": "info",
              "score": 1,
              "detail": "~56 words per section across 2 sub-headings.",
              "assessment": "heuristic"
            },
            {
              "id": "tableOfContents",
              "label": "In-page anchor navigation",
              "weight": 0.4,
              "status": "info",
              "score": 1,
              "detail": "No table-of-contents anchors.",
              "recommendation": "For long content, add a table of contents with in-page anchors — it maps your sections for AI navigation.",
              "assessment": "not-applicable"
            },
            {
              "id": "entityConsistency",
              "label": "Schema entity matches page",
              "weight": 0.5,
              "status": "info",
              "score": 1,
              "detail": "No named entities in schema.",
              "assessment": "not-applicable"
            },
            {
              "id": "faqRichness",
              "label": "FAQ-style coverage",
              "weight": 0.5,
              "status": "warn",
              "score": 0.5,
              "detail": "2 question headings.",
              "recommendation": "Add a visible FAQ section answering 3+ real user questions — Q&A content is a top source of AI-answer citations. (FAQPage markup is optional; Google dropped FAQ rich results in May 2026.)",
              "assessment": "observed"
            },
            {
              "id": "absoluteRecency",
              "label": "Content is recent",
              "weight": 0.6,
              "status": "pass",
              "score": 1,
              "detail": "Content dated ~0 month(s) ago.",
              "assessment": "observed"
            },
            {
              "id": "entityRichness",
              "label": "Named-entity richness",
              "weight": 0.4,
              "status": "info",
              "score": 1,
              "detail": "18 distinct proper-noun phrases (entities engines can link).",
              "assessment": "not-applicable"
            },
            {
              "id": "answerNotHidden",
              "label": "Key content not hidden behind UI",
              "weight": 0.4,
              "status": "pass",
              "score": 1,
              "detail": "Content isn't buried in tabs/accordions.",
              "assessment": "observed"
            },
            {
              "id": "agentCard",
              "label": "A2A agent card published",
              "weight": 0.3,
              "status": "info",
              "score": 1,
              "detail": "No A2A agent card (emerging spec; only relevant if the site exposes services for AI agents to call).",
              "recommendation": "If you offer agent-callable services, consider publishing an A2A agent card at /.well-known/agent-card.json.",
              "assessment": "not-applicable"
            },
            {
              "id": "trafficAdvice",
              "label": "Traffic advice for prefetch proxies",
              "weight": 0.2,
              "status": "info",
              "score": 1,
              "detail": "No /.well-known/traffic-advice (optional: declares how prefetch proxies like Chrome's private prefetch may load your pages).",
              "recommendation": "Optionally publish /.well-known/traffic-advice to control how prefetch proxies pre-load your pages.",
              "assessment": "not-applicable"
            },
            {
              "id": "mcpServer",
              "label": "MCP server discoverable",
              "weight": 0.4,
              "status": "info",
              "score": 1,
              "detail": "No MCP server found (agents probe https://mcp.<your-domain>/ and /.well-known/mcp).",
              "recommendation": "If you offer tools or services AI agents could call, serve an MCP endpoint (Streamable HTTP) at mcp.<your-domain> or /.well-known/mcp — the two locations agents probe for it.",
              "evidence": {
                "location": null
              },
              "assessment": "not-applicable"
            },
            {
              "id": "openApiSpec",
              "label": "OpenAPI spec / API catalog published",
              "weight": 0.3,
              "status": "info",
              "score": 1,
              "detail": "No /openapi.json or /.well-known/api-catalog found (only relevant if you expose an API).",
              "recommendation": "If you expose an API, publish its OpenAPI spec at /openapi.json (or an RFC 9727 catalog at /.well-known/api-catalog) so agents can discover and call it unaided.",
              "evidence": {
                "source": null
              },
              "assessment": "not-applicable"
            },
            {
              "id": "agentsMd",
              "label": "agents.md published",
              "weight": 0.3,
              "status": "info",
              "score": 1,
              "detail": "No /agents.md found (emerging convention: a markdown briefing for AI agents at the site root).",
              "recommendation": "Consider publishing /agents.md — a short markdown briefing (what the site does, key URLs, machine-readable surfaces) that agents can read in one fetch.",
              "assessment": "not-applicable"
            },
            {
              "id": "nlweb",
              "label": "NLWeb surfaces (schemamap + /ask)",
              "weight": 0.3,
              "status": "info",
              "score": 1,
              "detail": "No NLWeb surfaces (optional: schemamap in robots.txt plus an /ask endpoint let agents query your site in natural language).",
              "recommendation": "Optionally adopt NLWeb: point agents at your structured data with schemamap: lines in robots.txt and answer natural-language questions at /ask.",
              "evidence": {
                "schemamap": false,
                "askEndpoint": null
              },
              "assessment": "not-applicable"
            }
          ],
          "summary": "Scored 65/100 across 13 applicable access and content checks. Optional editorial observations are listed separately; this score does not measure AI citations."
        },
        {
          "key": "performance",
          "label": "Performance",
          "weight": 1.3,
          "score": 93,
          "grade": "A",
          "scoreAvailable": true,
          "coverage": {
            "scored": 26,
            "observed": 25,
            "heuristic": 1,
            "notTested": 0,
            "notApplicable": 13
          },
          "checks": [
            {
              "id": "responseTime",
              "label": "Server response time",
              "weight": 2,
              "status": "pass",
              "score": 1,
              "detail": "Document response observed in 200 ms from this server; not real-user field data.",
              "evidence": {
                "ttfb": 200,
                "loadMs": 200
              },
              "assessment": "observed"
            },
            {
              "id": "redirects",
              "label": "Minimal redirects",
              "weight": 0.6,
              "status": "pass",
              "score": 1,
              "detail": "No redirect on the entry URL.",
              "assessment": "observed"
            },
            {
              "id": "htmlSize",
              "label": "HTML document size",
              "weight": 1,
              "status": "pass",
              "score": 1,
              "detail": "HTML is 2 KB uncompressed (0 KB on the wire).",
              "evidence": {
                "htmlKb": 2,
                "transferKb": 0
              },
              "assessment": "observed"
            },
            {
              "id": "compression",
              "label": "Text compression",
              "weight": 1.2,
              "status": "pass",
              "score": 1,
              "detail": "Response compressed (br).",
              "assessment": "observed"
            },
            {
              "id": "brotli",
              "label": "Brotli compression",
              "weight": 0.4,
              "status": "pass",
              "score": 1,
              "detail": "Using Brotli (best ratio).",
              "assessment": "observed"
            },
            {
              "id": "renderBlocking",
              "label": "Render-blocking resources",
              "weight": 1.6,
              "status": "pass",
              "score": 1,
              "detail": "0 render-blocking script(s) and 0 stylesheet(s) in <head>.",
              "evidence": {
                "blockingScripts": 0,
                "headStyles": 0
              },
              "assessment": "observed"
            },
            {
              "id": "scriptLoading",
              "label": "Scripts load async/deferred",
              "weight": 1,
              "status": "info",
              "score": 1,
              "detail": "No external scripts.",
              "recommendation": "Add async or defer to non-critical scripts so they don't block parsing.",
              "assessment": "not-applicable"
            },
            {
              "id": "requestCount",
              "label": "Resource request count",
              "weight": 1,
              "status": "pass",
              "score": 1,
              "detail": "~1 referenced resources (0 scripts, 0 styles, 1 images, 0 iframes).",
              "evidence": {
                "totalScripts": 0,
                "styles": 0,
                "imgs": 1,
                "iframes": 0
              },
              "assessment": "heuristic"
            },
            {
              "id": "thirdParty",
              "label": "Third-party request domains",
              "weight": 1,
              "status": "pass",
              "score": 1,
              "detail": "0 distinct third-party domain(s) referenced.",
              "evidence": {
                "domains": []
              },
              "assessment": "observed"
            },
            {
              "id": "resourceHints",
              "label": "Resource hints (preconnect/preload)",
              "weight": 0.8,
              "status": "info",
              "score": 1,
              "detail": "0 preconnect, 0 dns-prefetch, 0 preload hint(s).",
              "recommendation": "Add <link rel=preconnect> for critical third-party origins and preload key fonts/hero assets.",
              "assessment": "not-applicable"
            },
            {
              "id": "imageOptim",
              "label": "Image optimization",
              "weight": 1.4,
              "status": "info",
              "score": 1,
              "detail": "No raster images to optimise (vectors are resolution-independent).",
              "evidence": {
                "rasterImgs": 0,
                "lazy": 0,
                "rasterDimensioned": 0,
                "modern": 0,
                "responsive": 0
              },
              "assessment": "not-applicable"
            },
            {
              "id": "cls",
              "label": "Layout-shift prevention",
              "weight": 1,
              "status": "pass",
              "score": 1,
              "detail": "1/1 images declare width & height.",
              "assessment": "observed"
            },
            {
              "id": "fontDisplay",
              "label": "Web-font loading strategy",
              "weight": 0.6,
              "status": "info",
              "score": 1,
              "detail": "No external web fonts detected.",
              "assessment": "not-applicable"
            },
            {
              "id": "inlineWeight",
              "label": "Inline CSS/JS weight",
              "weight": 0.7,
              "status": "pass",
              "score": 1,
              "detail": "0 KB inline CSS, 0 KB inline JS.",
              "assessment": "observed"
            },
            {
              "id": "minification",
              "label": "HTML minification",
              "weight": 0.5,
              "status": "pass",
              "score": 1,
              "detail": "HTML appears minified.",
              "assessment": "observed"
            },
            {
              "id": "caching",
              "label": "Caching headers",
              "weight": 0.8,
              "status": "warn",
              "score": 0.5,
              "detail": "No effective Cache-Control on the document.",
              "recommendation": "Set Cache-Control on static assets (long max-age + immutable) and a sensible value on HTML.",
              "assessment": "observed"
            },
            {
              "id": "validators",
              "label": "Conditional requests (ETag/Last-Modified)",
              "weight": 0.5,
              "status": "warn",
              "score": 0.5,
              "detail": "No ETag or Last-Modified on the document — every revisit re-downloads the full body.",
              "recommendation": "Send an ETag or Last-Modified header so browsers can revalidate with If-None-Match and get a cheap 304.",
              "assessment": "observed"
            },
            {
              "id": "cdn",
              "label": "CDN / edge delivery",
              "weight": 0.6,
              "status": "pass",
              "score": 1,
              "detail": "Modern HTTP advertised.",
              "recommendation": "Serve assets from a CDN to cut latency for distant users.",
              "assessment": "observed"
            },
            {
              "id": "http2",
              "label": "Modern HTTP (h2/h3)",
              "weight": 0.5,
              "status": "pass",
              "score": 1,
              "detail": "Server advertises HTTP/2 or HTTP/3 (alt-svc).",
              "assessment": "observed"
            },
            {
              "id": "domSize",
              "label": "DOM size",
              "weight": 0.8,
              "status": "pass",
              "score": 1,
              "detail": "42 DOM nodes.",
              "assessment": "observed"
            },
            {
              "id": "cssImport",
              "label": "No CSS @import chains",
              "weight": 0.6,
              "status": "pass",
              "score": 1,
              "detail": "No @import in inline CSS.",
              "assessment": "observed"
            },
            {
              "id": "dataUriBloat",
              "label": "No heavy inline data-URIs",
              "weight": 0.7,
              "status": "pass",
              "score": 1,
              "detail": "0 base64 data-URI(s), ~0 KB inlined into the HTML.",
              "assessment": "observed"
            },
            {
              "id": "duplicateScripts",
              "label": "No duplicate scripts",
              "weight": 0.5,
              "status": "pass",
              "score": 1,
              "detail": "No duplicate script URLs.",
              "assessment": "observed"
            },
            {
              "id": "lcpImage",
              "label": "Hero image not lazy-loaded",
              "weight": 0.8,
              "status": "pass",
              "score": 1,
              "detail": "The first image loads eagerly.",
              "assessment": "observed"
            },
            {
              "id": "fetchPriority",
              "label": "LCP fetchpriority hint",
              "weight": 0.4,
              "status": "warn",
              "score": 0.5,
              "detail": "No fetchpriority hint for the LCP image.",
              "recommendation": "Add fetchpriority=\"high\" to your hero/LCP image so the browser fetches it first.",
              "assessment": "observed"
            },
            {
              "id": "preconnectCoverage",
              "label": "Critical origins preconnected",
              "weight": 0.6,
              "status": "info",
              "score": 1,
              "detail": "0/0 third-party origins are preconnected.",
              "assessment": "not-applicable"
            },
            {
              "id": "embedFacade",
              "label": "No heavy un-faceted embeds",
              "weight": 0.5,
              "status": "pass",
              "score": 1,
              "detail": "No heavy third-party embeds.",
              "assessment": "observed"
            },
            {
              "id": "inlineScript",
              "label": "No oversized inline scripts",
              "weight": 0.5,
              "status": "pass",
              "score": 1,
              "detail": "Largest inline <script> is 0.0 KB.",
              "assessment": "observed"
            },
            {
              "id": "mediaScopedCss",
              "label": "Non-critical CSS deferred/scoped",
              "weight": 0.5,
              "status": "pass",
              "score": 1,
              "detail": "0 stylesheet(s) load render-blocking (no media scope / print).",
              "assessment": "observed"
            },
            {
              "id": "legacyHeadLibs",
              "label": "No legacy libs blocking <head>",
              "weight": 0.4,
              "status": "pass",
              "score": 1,
              "detail": "No legacy libraries blocking in <head>.",
              "assessment": "observed"
            },
            {
              "id": "bfcache",
              "label": "Back/forward cache not blocked",
              "weight": 0.5,
              "status": "pass",
              "score": 1,
              "detail": "No BFCache blockers detected — back/forward navigations can restore instantly from memory.",
              "assessment": "observed"
            },
            {
              "id": "speculationRules",
              "label": "Speculation Rules (prefetch/prerender)",
              "weight": 0.3,
              "status": "info",
              "score": 1,
              "detail": "No Speculation Rules (optional: makes next-page navigations feel instant).",
              "recommendation": "Consider a <script type=\"speculationrules\"> block to prerender likely next pages on hover.",
              "assessment": "not-applicable"
            },
            {
              "id": "cssContainment",
              "label": "CSS containment",
              "weight": 0.2,
              "status": "info",
              "score": 1,
              "detail": "CSS containment not assessed — stylesheets are external and deep render is off.",
              "recommendation": "Consider contain: content (or layout/paint) on self-contained widgets to limit style/layout recalculation scope.",
              "assessment": "not-applicable"
            },
            {
              "id": "scrollbarGutter",
              "label": "scrollbar-gutter reserved",
              "weight": 0.2,
              "status": "info",
              "score": 1,
              "detail": "scrollbar-gutter not assessed — stylesheets are external and deep render is off.",
              "recommendation": "Set scrollbar-gutter: stable on the root/scroll containers so the scrollbar appearing doesn't shift content sideways.",
              "assessment": "not-applicable"
            },
            {
              "id": "viewTransitions",
              "label": "View Transitions API",
              "weight": 0.3,
              "status": "info",
              "score": 1,
              "detail": "No View Transitions usage detected (optional: native cross-fade/morph between pages and states).",
              "recommendation": "Consider the View Transitions API (@view-transition / startViewTransition) for smooth page and state transitions without JS animation libraries.",
              "assessment": "not-applicable"
            },
            {
              "id": "scrollDrivenAnimations",
              "label": "Scroll-driven animations (CSS)",
              "weight": 0.2,
              "status": "info",
              "score": 1,
              "detail": "No scroll-driven animation usage detected (optional: animation-timeline: scroll()/view()).",
              "recommendation": "Consider CSS scroll-driven animations (animation-timeline) for scroll effects — they run off the main thread with zero JS.",
              "assessment": "not-applicable"
            },
            {
              "id": "serverTiming",
              "label": "Server-Timing header",
              "weight": 0.2,
              "status": "info",
              "score": 1,
              "detail": "No Server-Timing header on the document.",
              "recommendation": "Emit a Server-Timing header (e.g. db;dur=42, cache;desc=hit) to surface backend timings in DevTools and RUM analytics.",
              "assessment": "not-applicable"
            },
            {
              "id": "compressionDictionary",
              "label": "Compression Dictionary Transport",
              "weight": 0.2,
              "status": "info",
              "score": 1,
              "detail": "No compression-dictionary headers (cutting-edge: Use-As-Dictionary lets returning visitors download only the diff of updated assets).",
              "recommendation": "Consider Compression Dictionary Transport (Use-As-Dictionary on key assets) so returning visitors fetch deltas instead of full files.",
              "assessment": "not-applicable"
            },
            {
              "id": "earlyHintsReady",
              "label": "Early Hints (103) readiness",
              "weight": 0.3,
              "status": "info",
              "score": 1,
              "detail": "No Link response header with preload/preconnect on the document.",
              "recommendation": "Send 103 Early Hints with Link headers (rel=preload/preconnect) on the main document so browsers start fetching critical assets before the HTML is ready.",
              "assessment": "not-applicable"
            }
          ],
          "summary": "Scored 93/100 across 26 performance signals (0 failing) — including LCP-image handling, CSS @import chains, revalidators, BFCache eligibility, preconnect coverage and embed facades."
        },
        {
          "key": "accessibility",
          "label": "Accessibility",
          "weight": 1.2,
          "score": 55,
          "grade": "E",
          "scoreAvailable": true,
          "coverage": {
            "scored": 22,
            "observed": 22,
            "heuristic": 0,
            "notTested": 1,
            "notApplicable": 4
          },
          "checks": [
            {
              "id": "lang",
              "label": "Document language declared",
              "weight": 1.4,
              "status": "pass",
              "score": 1,
              "detail": "lang=\"en\".",
              "assessment": "observed"
            },
            {
              "id": "imgAlt",
              "label": "Images have alt attributes",
              "weight": 1.8,
              "status": "warn",
              "score": 0,
              "detail": "1/1 images missing an alt attribute.",
              "recommendation": "Give every <img> an alt attribute (alt=\"\" for decorative images).",
              "evidence": {
                "total": 1,
                "missingAlt": 1
              },
              "assessment": "observed"
            },
            {
              "id": "altQuality",
              "label": "Alt text is meaningful",
              "weight": 0.6,
              "status": "pass",
              "score": 1,
              "detail": "No generic alt text detected.",
              "assessment": "observed"
            },
            {
              "id": "formLabels",
              "label": "Form inputs are labelled",
              "weight": 1.8,
              "status": "fail",
              "score": 0,
              "detail": "1/1 fields have no associated label.",
              "recommendation": "Associate every input with a <label for> or aria-label.",
              "evidence": {
                "total": 1,
                "unlabeled": 1
              },
              "assessment": "observed"
            },
            {
              "id": "linkText",
              "label": "Descriptive link text",
              "weight": 0.9,
              "status": "pass",
              "score": 1,
              "detail": "0 vague and 0 empty link(s) of 8.",
              "assessment": "observed"
            },
            {
              "id": "buttonNames",
              "label": "Buttons have accessible names",
              "weight": 0.9,
              "status": "pass",
              "score": 1,
              "detail": "0 button(s) without an accessible name.",
              "assessment": "observed"
            },
            {
              "id": "zoom",
              "label": "Pinch-zoom not disabled",
              "weight": 1,
              "status": "pass",
              "score": 1,
              "detail": "Users can zoom.",
              "assessment": "observed"
            },
            {
              "id": "landmarks",
              "label": "Landmark regions",
              "weight": 1,
              "status": "pass",
              "score": 1,
              "detail": "Landmarks present: main:true nav:true header:true footer:true.",
              "assessment": "observed"
            },
            {
              "id": "skipLink",
              "label": "Skip-to-content link",
              "weight": 0.5,
              "status": "pass",
              "score": 1,
              "detail": "A skip link is present.",
              "assessment": "observed"
            },
            {
              "id": "headingStructure",
              "label": "Headings form an outline",
              "weight": 0.8,
              "status": "pass",
              "score": 1,
              "detail": "3 headings in order.",
              "assessment": "observed"
            },
            {
              "id": "ariaHidden",
              "label": "No focusable content in aria-hidden",
              "weight": 0.6,
              "status": "pass",
              "score": 1,
              "detail": "No focusable elements hidden from assistive tech.",
              "assessment": "observed"
            },
            {
              "id": "tabindex",
              "label": "No positive tabindex",
              "weight": 0.5,
              "status": "pass",
              "score": 1,
              "detail": "Natural focus order preserved.",
              "assessment": "observed"
            },
            {
              "id": "autoplay",
              "label": "No autoplaying media",
              "weight": 0.4,
              "status": "pass",
              "score": 1,
              "detail": "No autoplaying audio/video.",
              "assessment": "observed"
            },
            {
              "id": "contrast",
              "label": "Text colour contrast (WCAG AA)",
              "weight": 1.4,
              "status": "info",
              "score": 1,
              "detail": "No colour pairs to evaluate (colours likely set via external CSS — enable deep render to assess).",
              "evidence": {
                "checked": 0,
                "failures": 0,
                "worst": null
              },
              "assessment": "not-tested"
            },
            {
              "id": "accessibleNames",
              "label": "Interactive elements are named",
              "weight": 1.3,
              "status": "warn",
              "score": 0.9,
              "detail": "9/10 interactive elements expose an accessible name.",
              "recommendation": "Every link, button and control needs a programmatic name (text, aria-label or associated label).",
              "evidence": {
                "total": 10,
                "named": 9
              },
              "assessment": "observed"
            },
            {
              "id": "semanticInteractive",
              "label": "Interactive elements are semantic",
              "weight": 1,
              "status": "pass",
              "score": 1,
              "detail": "All interactive elements use <a>/<button>.",
              "assessment": "observed"
            },
            {
              "id": "validNesting",
              "label": "No invalid interactive nesting",
              "weight": 0.7,
              "status": "pass",
              "score": 1,
              "detail": "No invalid nesting detected.",
              "assessment": "observed"
            },
            {
              "id": "reducedMotion",
              "label": "Respects prefers-reduced-motion",
              "weight": 0.6,
              "status": "info",
              "score": 1,
              "detail": "No inline animations detected.",
              "assessment": "not-applicable"
            },
            {
              "id": "landmarkUniqueness",
              "label": "Unique top-level landmarks",
              "weight": 0.6,
              "status": "pass",
              "score": 1,
              "detail": "Exactly one main landmark.",
              "assessment": "observed"
            },
            {
              "id": "ariaRefs",
              "label": "ARIA references resolve",
              "weight": 0.6,
              "status": "pass",
              "score": 1,
              "detail": "All aria-labelledby/describedby/controls point to existing IDs.",
              "assessment": "observed"
            },
            {
              "id": "emptyHeadings",
              "label": "No empty headings",
              "weight": 0.5,
              "status": "pass",
              "score": 1,
              "detail": "No empty headings.",
              "assessment": "observed"
            },
            {
              "id": "touchTargets",
              "label": "Adequate touch-target size",
              "weight": 0.5,
              "status": "info",
              "score": 1,
              "detail": "No inline-sized interactive elements to assess.",
              "assessment": "not-applicable"
            },
            {
              "id": "langFormat",
              "label": "Valid lang value",
              "weight": 0.4,
              "status": "pass",
              "score": 1,
              "detail": "lang=\"en\" is well-formed.",
              "assessment": "observed"
            },
            {
              "id": "a11yOverlay",
              "label": "No accessibility overlay widget",
              "weight": 0.8,
              "status": "pass",
              "score": 1,
              "detail": "No accessibility overlay detected.",
              "assessment": "observed"
            },
            {
              "id": "focusRing",
              "label": "Keyboard focus ring preserved",
              "weight": 0.7,
              "status": "pass",
              "score": 1,
              "detail": "No focus-outline removal detected.",
              "assessment": "observed"
            },
            {
              "id": "inlineLang",
              "label": "Language of parts (lang on foreign content)",
              "weight": 0.3,
              "status": "info",
              "score": 1,
              "detail": "No inline lang attributes found — untagged foreign-language passages can't be detected statically.",
              "recommendation": "If the page quotes or embeds text in another language, wrap it with lang=\"xx\" (WCAG 3.1.2) so screen readers pronounce it correctly.",
              "assessment": "not-applicable"
            },
            {
              "id": "translateAttr",
              "label": "Machine-translation hints (translate=no)",
              "weight": 0.2,
              "status": "info",
              "score": 1,
              "detail": "No translate=\"no\"/notranslate markers found.",
              "recommendation": "Mark brand names, code snippets and proper nouns with translate=\"no\" so browser auto-translation doesn't mangle them.",
              "assessment": "not-applicable"
            }
          ],
          "summary": "Scored 55/100 against 22 WCAG checks (1 failing, 2 risky) — including computed colour-contrast, accessible-name coverage, semantic interactivity and ARIA-reference integrity."
        },
        {
          "key": "codeQuality",
          "label": "Code Quality",
          "weight": 0.9,
          "score": 98,
          "grade": "A+",
          "scoreAvailable": true,
          "coverage": {
            "scored": 25,
            "observed": 25,
            "heuristic": 0,
            "notTested": 0,
            "notApplicable": 2
          },
          "checks": [
            {
              "id": "doctype",
              "label": "HTML5 doctype",
              "weight": 1,
              "status": "pass",
              "score": 1,
              "detail": "Standards-mode <!doctype html>.",
              "assessment": "observed"
            },
            {
              "id": "charset",
              "label": "Character encoding declared early",
              "weight": 1,
              "status": "pass",
              "score": 1,
              "detail": "Charset declared within the first 1KB.",
              "assessment": "observed"
            },
            {
              "id": "lang",
              "label": "Language attribute",
              "weight": 0.6,
              "status": "pass",
              "score": 1,
              "detail": "html lang set.",
              "assessment": "observed"
            },
            {
              "id": "deprecatedTags",
              "label": "No deprecated tags",
              "weight": 1,
              "status": "pass",
              "score": 1,
              "detail": "No deprecated HTML tags.",
              "assessment": "observed"
            },
            {
              "id": "deprecatedAttrs",
              "label": "No presentational attributes",
              "weight": 0.6,
              "status": "pass",
              "score": 1,
              "detail": "No deprecated presentational attributes.",
              "assessment": "observed"
            },
            {
              "id": "inlineStyles",
              "label": "Limited inline styles",
              "weight": 0.9,
              "status": "pass",
              "score": 1,
              "detail": "0 elements (0.0%) use inline style attributes.",
              "assessment": "observed"
            },
            {
              "id": "inlineHandlers",
              "label": "No inline event handlers",
              "weight": 0.7,
              "status": "pass",
              "score": 1,
              "detail": "No inline on* event handlers.",
              "assessment": "observed"
            },
            {
              "id": "dupeIds",
              "label": "Unique element IDs",
              "weight": 0.9,
              "status": "pass",
              "score": 1,
              "detail": "All element IDs are unique.",
              "assessment": "observed"
            },
            {
              "id": "emptyElements",
              "label": "No empty interactive elements",
              "weight": 0.5,
              "status": "pass",
              "score": 1,
              "detail": "No empty links.",
              "assessment": "observed"
            },
            {
              "id": "semanticRatio",
              "label": "Semantic elements over div soup",
              "weight": 0.8,
              "status": "pass",
              "score": 1,
              "detail": "0 <div>s vs 7 semantic element(s) (0% divs).",
              "assessment": "observed"
            },
            {
              "id": "mixedContent",
              "label": "No mixed content",
              "weight": 1.1,
              "status": "pass",
              "score": 1,
              "detail": "No insecure http resources on an https page.",
              "evidence": {
                "mixed": 0
              },
              "assessment": "observed"
            },
            {
              "id": "leftovers",
              "label": "No debug leftovers",
              "weight": 0.5,
              "status": "pass",
              "score": 1,
              "detail": "No TODO/console leftovers in output.",
              "assessment": "observed"
            },
            {
              "id": "comments",
              "label": "Few HTML comments in production",
              "weight": 0.3,
              "status": "pass",
              "score": 1,
              "detail": "0 HTML comment(s) in the output.",
              "assessment": "observed"
            },
            {
              "id": "favicon",
              "label": "Favicon declared",
              "weight": 0.4,
              "status": "warn",
              "score": 0.5,
              "detail": "No favicon declared.",
              "recommendation": "Add a favicon and apple-touch-icon.",
              "assessment": "observed"
            },
            {
              "id": "domSize",
              "label": "Reasonable DOM size",
              "weight": 0.8,
              "status": "pass",
              "score": 1,
              "detail": "42 DOM elements.",
              "assessment": "observed"
            },
            {
              "id": "domDepth",
              "label": "DOM not too deeply nested",
              "weight": 0.5,
              "status": "pass",
              "score": 1,
              "detail": "Maximum nesting depth ~7.",
              "assessment": "observed"
            },
            {
              "id": "outdatedLibs",
              "label": "No outdated/known-risk libraries",
              "weight": 1,
              "status": "info",
              "score": 1,
              "detail": "No fingerprinted libraries.",
              "evidence": {
                "libs": []
              },
              "assessment": "not-applicable"
            },
            {
              "id": "jsUrls",
              "label": "No javascript: URLs",
              "weight": 0.6,
              "status": "pass",
              "score": 1,
              "detail": "No javascript: URLs.",
              "assessment": "observed"
            },
            {
              "id": "metaRefresh",
              "label": "No meta-refresh redirects",
              "weight": 0.5,
              "status": "pass",
              "score": 1,
              "detail": "No meta refresh.",
              "assessment": "observed"
            },
            {
              "id": "singletons",
              "label": "Valid document structure",
              "weight": 0.7,
              "status": "pass",
              "score": 1,
              "detail": "Exactly one html/head/body/title.",
              "assessment": "observed"
            },
            {
              "id": "brokenAnchors",
              "label": "In-page anchors resolve",
              "weight": 0.5,
              "status": "pass",
              "score": 1,
              "detail": "All in-page anchor links resolve.",
              "assessment": "observed"
            },
            {
              "id": "formValidity",
              "label": "Forms are well-formed",
              "weight": 0.6,
              "status": "pass",
              "score": 1,
              "detail": "0/1 form(s) missing a submit target or have unnamed fields.",
              "assessment": "observed"
            },
            {
              "id": "noSecrets",
              "label": "No secrets/internal data exposed",
              "weight": 0.7,
              "status": "pass",
              "score": 1,
              "detail": "No obvious secrets or internal data in the markup.",
              "assessment": "observed"
            },
            {
              "id": "importantAbuse",
              "label": "No !important abuse",
              "weight": 0.5,
              "status": "pass",
              "score": 1,
              "detail": "0 !important declaration(s).",
              "assessment": "observed"
            },
            {
              "id": "semanticInteractive",
              "label": "Interactive elements are real controls",
              "weight": 0.6,
              "status": "pass",
              "score": 1,
              "detail": "Interactivity uses <a>/<button>.",
              "assessment": "observed"
            },
            {
              "id": "dupMeta",
              "label": "No duplicate meta tags",
              "weight": 0.4,
              "status": "pass",
              "score": 1,
              "detail": "No duplicate description/viewport tags.",
              "assessment": "observed"
            },
            {
              "id": "modernCssAdoption",
              "label": "Modern-CSS adoption",
              "weight": 0,
              "status": "info",
              "score": 1,
              "detail": "Modern-CSS adoption not assessed (external stylesheets not fetched) — container queries, anchor positioning and text-wrap balance can't be detected from the served HTML alone.",
              "assessment": "not-applicable"
            }
          ],
          "summary": "Scored 98/100 on 25 front-end hygiene checks (24 clean) — including outdated-library detection, document validity, broken anchors, exposed secrets and !important abuse."
        },
        {
          "key": "uiux",
          "label": "UI / UX",
          "weight": 1.05,
          "score": 96,
          "grade": "A+",
          "scoreAvailable": true,
          "coverage": {
            "scored": 16,
            "observed": 4,
            "heuristic": 12,
            "notTested": 2,
            "notApplicable": 11
          },
          "checks": [
            {
              "id": "responsive",
              "label": "Mobile-responsive viewport",
              "weight": 1.8,
              "status": "pass",
              "score": 1,
              "detail": "Responsive viewport configured.",
              "assessment": "observed"
            },
            {
              "id": "mediaQueries",
              "label": "Responsive CSS present",
              "weight": 0.6,
              "status": "info",
              "score": 1,
              "detail": "No inline media queries (may be in external CSS).",
              "assessment": "not-tested"
            },
            {
              "id": "cta",
              "label": "Clear call-to-action",
              "weight": 1.5,
              "status": "pass",
              "score": 1,
              "detail": "3 action-oriented control(s) detected using the page language. Prominence is not assessed from HTML.",
              "evidence": {
                "ctas": 3,
                "purpose": "article",
                "pageLang": "en"
              },
              "assessment": "heuristic"
            },
            {
              "id": "navigation",
              "label": "Discoverable navigation",
              "weight": 1.2,
              "status": "pass",
              "score": 1,
              "detail": "3 navigation link(s) inside <nav>.",
              "assessment": "heuristic"
            },
            {
              "id": "search",
              "label": "Site search",
              "weight": 0.4,
              "status": "info",
              "score": 1,
              "detail": "No site search detected.",
              "recommendation": "For content-heavy sites, add search to help users find things fast.",
              "assessment": "not-applicable"
            },
            {
              "id": "breadcrumbs",
              "label": "Breadcrumbs / wayfinding",
              "weight": 0.3,
              "status": "info",
              "score": 1,
              "detail": "No breadcrumbs detected.",
              "assessment": "not-applicable"
            },
            {
              "id": "contact",
              "label": "Contact information",
              "weight": 0.8,
              "status": "pass",
              "score": 1,
              "detail": "Contact details/links present.",
              "assessment": "heuristic"
            },
            {
              "id": "social",
              "label": "Social proof / links",
              "weight": 0.4,
              "status": "info",
              "score": 1,
              "detail": "No social links detected.",
              "assessment": "not-applicable"
            },
            {
              "id": "footer",
              "label": "Footer present",
              "weight": 0.4,
              "status": "pass",
              "score": 1,
              "detail": "Footer region present.",
              "assessment": "observed"
            },
            {
              "id": "readability",
              "label": "Readable prose (Flesch)",
              "weight": 1,
              "status": "pass",
              "score": 1,
              "detail": "Flesch Reading Ease 54.4 — fairly difficult (10th–12th grade); avg 9 words/sentence.",
              "evidence": {
                "flesch": 54.4,
                "grade": 7.9
              },
              "assessment": "heuristic"
            },
            {
              "id": "scannability",
              "label": "Scannable content blocks",
              "weight": 0.7,
              "status": "pass",
              "score": 1,
              "detail": "0/4 paragraphs are very long (120+ words).",
              "assessment": "heuristic"
            },
            {
              "id": "legibility",
              "label": "Legible base font size",
              "weight": 0.7,
              "status": "info",
              "score": 1,
              "detail": "Font size was not measured; computed styles and external CSS are not evaluated in this check.",
              "assessment": "not-tested"
            },
            {
              "id": "formUx",
              "label": "Form input ergonomics",
              "weight": 0.9,
              "status": "pass",
              "score": 0.8,
              "detail": "1 field(s): 1 with a specific type (email/tel/url/number/…), 1 autocomplete, 0 placeholder.",
              "assessment": "observed"
            },
            {
              "id": "valueProp",
              "label": "Clear headline / value prop",
              "weight": 0.9,
              "status": "pass",
              "score": 1,
              "detail": "H1: \"How do you audit a public web page?\".",
              "assessment": "heuristic"
            },
            {
              "id": "hierarchy",
              "label": "Visual hierarchy",
              "weight": 0.8,
              "status": "pass",
              "score": 1,
              "detail": "3 section heading(s) and 1 image(s) establish rhythm.",
              "assessment": "heuristic"
            },
            {
              "id": "polish",
              "label": "Tab/brand polish",
              "weight": 0.3,
              "status": "warn",
              "score": 0.5,
              "detail": "Favicon + descriptive title give a polished browser-tab presence.",
              "recommendation": "Add a favicon for a polished, trustworthy tab presence.",
              "assessment": "heuristic"
            },
            {
              "id": "clicksToContact",
              "label": "Contact reachable in ≤1 click",
              "weight": 1.6,
              "status": "pass",
              "score": 1,
              "detail": "Estimated 0 click(s) to contact — contact form on this page.",
              "evidence": {
                "clicks": 0
              },
              "assessment": "heuristic"
            },
            {
              "id": "colorConsistency",
              "label": "Disciplined colour palette",
              "weight": 1.1,
              "status": "pass",
              "score": 1,
              "detail": "3 distinct colours used in inline/embedded styles.",
              "evidence": {
                "colors": 3
              },
              "assessment": "heuristic"
            },
            {
              "id": "typeScale",
              "label": "Consistent type scale",
              "weight": 1,
              "status": "info",
              "score": 1,
              "detail": "No inline font sizes to assess.",
              "evidence": {
                "fontSizes": 0,
                "fontFamilies": 0
              },
              "assessment": "not-applicable"
            },
            {
              "id": "fontDiscipline",
              "label": "Limited font families",
              "weight": 0.7,
              "status": "info",
              "score": 1,
              "detail": "0 distinct font families.",
              "assessment": "not-applicable"
            },
            {
              "id": "buttonConsistency",
              "label": "Consistent button styling",
              "weight": 1,
              "status": "info",
              "score": 1,
              "detail": "1 visually-distinct button/CTA styles detected.",
              "assessment": "not-applicable"
            },
            {
              "id": "spacingScale",
              "label": "Consistent spacing scale",
              "weight": 0.7,
              "status": "pass",
              "score": 1,
              "detail": "1 distinct margin/padding/gap values.",
              "assessment": "heuristic"
            },
            {
              "id": "importantAbuse",
              "label": "No !important abuse",
              "weight": 0.5,
              "status": "pass",
              "score": 1,
              "detail": "0 !important declaration(s).",
              "assessment": "observed"
            },
            {
              "id": "aboveFold",
              "label": "Opening content signals (HTML estimate)",
              "weight": 1.2,
              "status": "pass",
              "score": 1,
              "detail": "Hero has headline:✓ supporting text:✓ CTA:✓.",
              "assessment": "heuristic"
            },
            {
              "id": "trustSignals",
              "label": "Conversion trust signals",
              "weight": 0.9,
              "status": "info",
              "score": 0,
              "detail": "No testimonials, logos, ratings or guarantees detected. This conversion check is not required for the inferred page purpose.",
              "assessment": "not-applicable"
            },
            {
              "id": "classSprawl",
              "label": "Maintainable class system",
              "weight": 0.6,
              "status": "info",
              "score": 1,
              "detail": "0 distinct class names across 42 elements (ratio 0.00).",
              "assessment": "not-applicable"
            },
            {
              "id": "themeColor",
              "label": "Browser chrome themed (theme-color/color-scheme)",
              "weight": 0.3,
              "status": "info",
              "score": 1,
              "detail": "theme-color ✗, color-scheme ✗.",
              "recommendation": "Add <meta name=\"theme-color\"> to tint browser chrome to your brand, and <meta name=\"color-scheme\"> so dark-mode users don't get a white flash before CSS loads.",
              "assessment": "not-applicable"
            },
            {
              "id": "manifest",
              "label": "Web app manifest",
              "weight": 0.3,
              "status": "info",
              "score": 1,
              "detail": "No web app manifest (optional: controls name/icon/colours when users install or pin the site).",
              "recommendation": "Add a manifest.json with name, icons and theme colours, linked via <link rel=\"manifest\">.",
              "assessment": "not-applicable"
            },
            {
              "id": "serviceWorker",
              "label": "Service worker (offline/cache layer)",
              "weight": 0.4,
              "status": "info",
              "score": 1,
              "detail": "No service worker detected (optional: only worth adding for app-like sites that benefit from offline/installable behaviour).",
              "assessment": "not-applicable"
            }
          ],
          "summary": "Scored 96/100 across 17 UI/UX & conversion checks — including click-depth to contact, design-token consistency, above-the-fold pitch and trust signals that most graders ignore."
        },
        {
          "key": "dataTracking",
          "label": "Data & Tracking",
          "weight": 0.8,
          "score": 100,
          "grade": "A+",
          "scoreAvailable": true,
          "coverage": {
            "scored": 6,
            "observed": 6,
            "heuristic": 0,
            "notTested": 2,
            "notApplicable": 5
          },
          "checks": [
            {
              "id": "hasAnalytics",
              "label": "Web analytics installed",
              "weight": 2.4,
              "status": "info",
              "score": 0,
              "detail": "No recognized client-side analytics detected. The page may intentionally omit analytics or measure activity server-side; no score penalty.",
              "recommendation": "If measurement is needed, verify your server-side or client-side setup against your goals; analytics is optional for this score.",
              "evidence": {
                "analytics": [],
                "tagManager": false
              },
              "assessment": "not-tested"
            },
            {
              "id": "conversionTracking",
              "label": "Conversion / marketing tracking",
              "weight": 1.2,
              "status": "info",
              "score": 1,
              "detail": "No advertising/marketing pixels — fine for a privacy-first site (only needed if you run paid acquisition).",
              "recommendation": "If you run paid acquisition, add the relevant pixels (Meta, Google Ads, LinkedIn) to measure ROI.",
              "assessment": "not-applicable"
            },
            {
              "id": "tagManager",
              "label": "Tag governance",
              "weight": 0.8,
              "status": "info",
              "score": 1,
              "detail": "Few tags; a manager is optional at this scale.",
              "assessment": "not-applicable"
            },
            {
              "id": "consent",
              "label": "Tracking and consent markup",
              "weight": 2,
              "status": "info",
              "score": 1,
              "detail": "No recognized profiling trackers; consent requirements were not assessed.",
              "evidence": {
                "consent": []
              },
              "assessment": "not-tested"
            },
            {
              "id": "privacyPolicy",
              "label": "Privacy policy link",
              "weight": 0.8,
              "status": "pass",
              "score": 1,
              "detail": "A privacy/cookie policy link is present.",
              "assessment": "observed"
            },
            {
              "id": "trackerCount",
              "label": "Reasonable tracker count",
              "weight": 0.9,
              "status": "pass",
              "score": 1,
              "detail": "0 distinct tracking tool(s) detected.",
              "evidence": {
                "vendors": []
              },
              "assessment": "observed"
            },
            {
              "id": "duplicateAnalytics",
              "label": "No duplicate analytics",
              "weight": 0.6,
              "status": "pass",
              "score": 1,
              "detail": "0 GA4 property.",
              "assessment": "observed"
            },
            {
              "id": "piiLeak",
              "label": "No PII in tracking/URLs",
              "weight": 1,
              "status": "pass",
              "score": 1,
              "detail": "No obvious PII in tracking calls or URLs.",
              "assessment": "observed"
            },
            {
              "id": "gpcDnt",
              "label": "Honours GPC / Do-Not-Track",
              "weight": 0.4,
              "status": "info",
              "score": 1,
              "detail": "No consent-requiring tracking to gate — GPC/DNT not applicable.",
              "assessment": "not-applicable"
            },
            {
              "id": "firstPartyTagging",
              "label": "First-party / server-side tagging",
              "weight": 0.4,
              "status": "info",
              "score": 1,
              "detail": "Tagging appears fully client-side/third-party.",
              "assessment": "not-applicable"
            },
            {
              "id": "fingerprinting",
              "label": "No covert fingerprinting",
              "weight": 0.6,
              "status": "pass",
              "score": 1,
              "detail": "No device-fingerprinting libraries detected.",
              "assessment": "observed"
            },
            {
              "id": "cookiePolicy",
              "label": "Cookie policy / settings link",
              "weight": 0.4,
              "status": "info",
              "score": 1,
              "detail": "No dedicated cookie policy/settings link.",
              "assessment": "not-applicable"
            },
            {
              "id": "trackerPlacement",
              "label": "Trackers load non-blocking",
              "weight": 0.4,
              "status": "pass",
              "score": 1,
              "detail": "Tracking tags load async/deferred.",
              "assessment": "observed"
            }
          ],
          "summary": "Scored 100/100. Detected 0 tool(s) across 6 checks — including consent ordering, PII leakage, fingerprinting and duplicate-property detection."
        },
        {
          "key": "security",
          "label": "Security",
          "weight": 1.05,
          "score": 52,
          "grade": "E",
          "scoreAvailable": true,
          "coverage": {
            "scored": 13,
            "observed": 13,
            "heuristic": 0,
            "notTested": 1,
            "notApplicable": 6
          },
          "checks": [
            {
              "id": "https",
              "label": "Served over HTTPS",
              "weight": 3,
              "status": "pass",
              "score": 1,
              "detail": "The final URL is served over HTTPS.",
              "assessment": "observed"
            },
            {
              "id": "hsts",
              "label": "HSTS header",
              "weight": 1.4,
              "status": "warn",
              "score": 0,
              "detail": "No HSTS header.",
              "recommendation": "Set Strict-Transport-Security: max-age=31536000; includeSubDomains; preload.",
              "assessment": "observed"
            },
            {
              "id": "csp",
              "label": "Content Security Policy",
              "weight": 1.5,
              "status": "warn",
              "score": 0.2,
              "detail": "No Content-Security-Policy.",
              "recommendation": "Add a Content-Security-Policy (start in report-only mode) to mitigate XSS.",
              "assessment": "observed"
            },
            {
              "id": "xcto",
              "label": "X-Content-Type-Options: nosniff",
              "weight": 0.8,
              "status": "warn",
              "score": 0.5,
              "detail": "Missing X-Content-Type-Options: nosniff.",
              "recommendation": "Add X-Content-Type-Options: nosniff to stop MIME sniffing.",
              "assessment": "observed"
            },
            {
              "id": "clickjacking",
              "label": "Clickjacking protection",
              "weight": 1,
              "status": "warn",
              "score": 0.5,
              "detail": "No clickjacking protection.",
              "recommendation": "Set X-Frame-Options: SAMEORIGIN or a CSP frame-ancestors directive.",
              "assessment": "observed"
            },
            {
              "id": "referrerPolicy",
              "label": "Referrer-Policy",
              "weight": 0.6,
              "status": "warn",
              "score": 0.5,
              "detail": "No Referrer-Policy.",
              "recommendation": "Set Referrer-Policy: strict-origin-when-cross-origin to avoid leaking URLs.",
              "assessment": "observed"
            },
            {
              "id": "permissionsPolicy",
              "label": "Permissions-Policy",
              "weight": 0.5,
              "status": "info",
              "score": 1,
              "detail": "No Permissions-Policy (recommended).",
              "recommendation": "Add a Permissions-Policy to disable unused features (camera, geolocation…).",
              "assessment": "not-applicable"
            },
            {
              "id": "crossOrigin",
              "label": "Cross-origin policies (COOP/CORP)",
              "weight": 0.5,
              "status": "info",
              "score": 1,
              "detail": "COOP: —, CORP: —.",
              "recommendation": "Consider Cross-Origin-Opener-Policy and Cross-Origin-Resource-Policy to harden isolation.",
              "assessment": "not-applicable"
            },
            {
              "id": "disclosure",
              "label": "No stack/version disclosure",
              "weight": 0.6,
              "status": "pass",
              "score": 1,
              "detail": "No obvious version disclosure.",
              "assessment": "observed"
            },
            {
              "id": "mixedContent",
              "label": "No mixed content",
              "weight": 1,
              "status": "pass",
              "score": 1,
              "detail": "No insecure http resources on an https page.",
              "assessment": "observed"
            },
            {
              "id": "formAction",
              "label": "Forms submit over HTTPS",
              "weight": 0.6,
              "status": "pass",
              "score": 1,
              "detail": "No forms post to an insecure http endpoint.",
              "assessment": "observed"
            },
            {
              "id": "dangerousJs",
              "label": "No obvious dangerous JS sinks",
              "weight": 0.4,
              "status": "pass",
              "score": 1,
              "detail": "No eval/document.write in the served HTML.",
              "assessment": "observed"
            },
            {
              "id": "securityTxt",
              "label": "security.txt published",
              "weight": 0.4,
              "status": "warn",
              "score": 0.5,
              "detail": "No security.txt found.",
              "recommendation": "Publish /.well-known/security.txt with a disclosure contact so researchers can report issues responsibly.",
              "assessment": "observed"
            },
            {
              "id": "corsWildcard",
              "label": "No reflexive/wildcard CORS",
              "weight": 0.5,
              "status": "pass",
              "score": 1,
              "detail": "No permissive CORS header on the document.",
              "assessment": "observed"
            },
            {
              "id": "vulnerableDeps",
              "label": "No known-vulnerable libraries",
              "weight": 0.8,
              "status": "pass",
              "score": 1,
              "detail": "No outdated/known-risk client libraries detected.",
              "assessment": "observed"
            },
            {
              "id": "crossOriginIsolation",
              "label": "Cross-origin isolation headers",
              "weight": 0.3,
              "status": "info",
              "score": 1,
              "detail": "No Cross-Origin-Embedder-Policy (needed for full isolation / SharedArrayBuffer).",
              "recommendation": "If you need cross-origin isolation, pair COOP with Cross-Origin-Embedder-Policy.",
              "assessment": "not-applicable"
            },
            {
              "id": "reportingEndpoints",
              "label": "Violation reporting configured",
              "weight": 0.3,
              "status": "info",
              "score": 1,
              "detail": "No Reporting-Endpoints header or CSP report-to — policy violations in the field go unseen.",
              "recommendation": "Add a Reporting-Endpoints header (plus report-to in your CSP) so real-world policy breakage reaches you.",
              "assessment": "not-applicable"
            },
            {
              "id": "trustedTypes",
              "label": "Trusted Types (DOM-XSS defence)",
              "weight": 0.3,
              "status": "info",
              "score": 1,
              "detail": "No require-trusted-types-for CSP directive (optional hardening against DOM-based XSS).",
              "recommendation": "Consider CSP `require-trusted-types-for 'script'` to neutralise DOM-based XSS at innerHTML-style sinks.",
              "assessment": "not-applicable"
            },
            {
              "id": "caaRecords",
              "label": "CAA records restrict cert issuance",
              "weight": 0.5,
              "status": "info",
              "score": 0,
              "detail": "DNS lookup unavailable — couldn't verify CAA records.",
              "assessment": "not-tested"
            },
            {
              "id": "digestFields",
              "label": "Digest Fields (RFC 9530)",
              "weight": 0.2,
              "status": "info",
              "score": 0,
              "detail": "No Repr-Digest/Content-Digest header (RFC 9530 Digest Fields let clients verify response integrity — cutting-edge, mostly for APIs).",
              "assessment": "not-applicable"
            }
          ],
          "summary": "Scored 52/100 across 13 security checks (0 failing) — including CSP hardening, HSTS, security.txt, cookie prefixes, CORS, violation reporting and known-vulnerable-library detection."
        }
      ],
      "topIssues": [
        {
          "dimension": "accessibility",
          "title": "Form inputs are labelled",
          "detail": "1/1 fields have no associated label."
        },
        {
          "dimension": "geo",
          "title": "Machine-extractable structured data",
          "detail": "No JSON-LD — AI engines must guess the page's facts and entities."
        },
        {
          "dimension": "security",
          "title": "HSTS header",
          "detail": "No HSTS header."
        },
        {
          "dimension": "security",
          "title": "Content Security Policy",
          "detail": "No Content-Security-Policy."
        },
        {
          "dimension": "seo",
          "title": "Content depth",
          "detail": "Roughly 169 words of body text."
        },
        {
          "dimension": "security",
          "title": "Clickjacking protection",
          "detail": "No clickjacking protection."
        }
      ],
      "meta": {
        "scoringVersion": "2026-10-06.2",
        "measurementMode": "static",
        "coverage": {
          "scored": 158,
          "observed": 136,
          "heuristic": 27,
          "notTested": 7,
          "notApplicable": 59
        },
        "statusCode": 200,
        "htmlBytes": 2494,
        "transferBytes": 500,
        "loadMs": 200,
        "redirected": false,
        "aiEnabled": false,
        "checksRun": 229
      }
    },
    {
      "id": "script-only",
      "source": "/research/2026-10-13/script-only.html.txt",
      "url": "https://example.org/audit-guide",
      "normalizedUrl": "https://example.org/audit-guide",
      "finalUrl": "https://example.org/audit-guide",
      "title": "How to audit a public web page | Example guide",
      "description": "A practical guide to inspecting the HTML of one public page, checking actual evidence and verifying a focused fix with a repeat audit.",
      "faviconUrl": "https://example.org/favicon.ico",
      "fetchedAt": "2026-10-13T12:00:00.000Z",
      "overallScore": 61,
      "grade": "D",
      "dimensions": [
        {
          "key": "seo",
          "label": "SEO",
          "weight": 1.4,
          "score": 40,
          "grade": "F",
          "scoreAvailable": true,
          "coverage": {
            "scored": 34,
            "observed": 26,
            "heuristic": 8,
            "notTested": 0,
            "notApplicable": 7
          },
          "checks": [
            {
              "id": "titleLength",
              "label": "Title length",
              "weight": 2.2,
              "status": "pass",
              "score": 1,
              "detail": "Title is 46 characters (~373px): \"How to audit a public web page | Example guide\".",
              "evidence": {
                "title": "How to audit a public web page | Example guide",
                "length": 46,
                "pixelWidth": 373
              },
              "assessment": "observed"
            },
            {
              "id": "titlePixels",
              "label": "Title not truncated in SERPs",
              "weight": 0.8,
              "status": "pass",
              "score": 1,
              "detail": "Estimated SERP width ~373px (Google truncates around 580px).",
              "assessment": "observed"
            },
            {
              "id": "titleKeywordFront",
              "label": "Keyword near start of title",
              "weight": 1.2,
              "status": "warn",
              "score": 0.5,
              "detail": "Primary term \"skip\" is missing from the title.",
              "recommendation": "Put your most important keyword within the first few words of the title.",
              "assessment": "heuristic"
            },
            {
              "id": "titleBrand",
              "label": "Brand in title",
              "weight": 0.5,
              "status": "pass",
              "score": 1,
              "detail": "Title uses a separator, suggesting a brand suffix.",
              "assessment": "observed"
            },
            {
              "id": "metaDescLength",
              "label": "Meta description length",
              "weight": 1.6,
              "status": "pass",
              "score": 1,
              "detail": "Meta description is 134 characters.",
              "evidence": {
                "length": 134
              },
              "assessment": "observed"
            },
            {
              "id": "metaDescCta",
              "label": "Meta description has a call to action",
              "weight": 0.6,
              "status": "warn",
              "score": 0.5,
              "detail": "The description lacks a call to action.",
              "recommendation": "Add an action word (e.g. 'Discover…', 'Get…') to improve click-through.",
              "assessment": "heuristic"
            },
            {
              "id": "metaDescKeyword",
              "label": "Keyword in meta description",
              "weight": 0.6,
              "status": "warn",
              "score": 0.5,
              "detail": "Primary keyword not found in the description.",
              "recommendation": "Work the primary keyword into the description — Google bolds matching query terms.",
              "assessment": "heuristic"
            },
            {
              "id": "h1Single",
              "label": "Exactly one H1",
              "weight": 2,
              "status": "fail",
              "score": 0,
              "detail": "The page has no <h1>.",
              "recommendation": "Use exactly one <h1> stating the page's primary topic.",
              "evidence": {
                "h1Count": 0
              },
              "assessment": "observed"
            },
            {
              "id": "h1Keyword",
              "label": "Keyword in H1",
              "weight": 1,
              "status": "warn",
              "score": 0.5,
              "detail": "Primary keyword not found in the H1.",
              "recommendation": "Ensure the H1 contains your primary target keyword.",
              "assessment": "heuristic"
            },
            {
              "id": "headingOrder",
              "label": "Logical heading hierarchy",
              "weight": 1.2,
              "status": "fail",
              "score": 0,
              "detail": "No headings — search engines can't parse the structure.",
              "evidence": {
                "headings": 0,
                "h2Count": 0
              },
              "assessment": "observed"
            },
            {
              "id": "h2Coverage",
              "label": "Sub-headings structure content",
              "weight": 0.8,
              "status": "info",
              "score": 1,
              "detail": "0 <h2> sub-heading(s).",
              "recommendation": "Break content into sections with descriptive <h2> sub-headings.",
              "assessment": "not-applicable"
            },
            {
              "id": "keywordTargeting",
              "label": "Keyword targeting (title/H1/intro)",
              "weight": 2.2,
              "status": "warn",
              "score": 0.3333333333333333,
              "detail": "Primary term \"skip\" → title:✗ H1:✗ intro:✓.",
              "recommendation": "Reinforce the primary keyword in the title, H1 and first paragraph so topical focus is unambiguous.",
              "evidence": {
                "topKeywords": [
                  {
                    "term": "skip",
                    "count": 1,
                    "density": 50
                  },
                  {
                    "term": "content",
                    "count": 1,
                    "density": 50
                  }
                ]
              },
              "assessment": "heuristic"
            },
            {
              "id": "keywordDensity",
              "label": "Keyword density not stuffed",
              "weight": 1,
              "status": "fail",
              "score": 0,
              "detail": "Top term \"skip\" is 50.0% of 2 content words.",
              "recommendation": "Reduce repetition — over-using the keyword reads as spam to Google.",
              "assessment": "heuristic"
            },
            {
              "id": "semanticDepth",
              "label": "Semantic / topical depth (phrases)",
              "weight": 1,
              "status": "fail",
              "score": 0,
              "detail": "No repeated multi-word phrases — content lacks topical depth.",
              "recommendation": "Cover the topic with related sub-topics and entities (LSI) so the page demonstrates depth.",
              "evidence": {
                "phrases": []
              },
              "assessment": "observed"
            },
            {
              "id": "contentDepth",
              "label": "Content depth",
              "weight": 1.4,
              "status": "fail",
              "score": 0.1,
              "detail": "Roughly 3 words of body text.",
              "recommendation": "Thin content struggles to rank — expand to comprehensively cover the topic (600+ words for key pages).",
              "evidence": {
                "words": 3
              },
              "assessment": "observed"
            },
            {
              "id": "textRatio",
              "label": "Text-to-HTML ratio",
              "weight": 0.7,
              "status": "fail",
              "score": 0,
              "detail": "Visible text is ~0.5% of the HTML payload.",
              "recommendation": "A very low text ratio suggests bloated markup or thin content relative to code.",
              "assessment": "observed"
            },
            {
              "id": "urlStructure",
              "label": "Clean, readable URL",
              "weight": 1,
              "status": "pass",
              "score": 1,
              "detail": "Clean URL path: \"/audit-guide\".",
              "assessment": "observed"
            },
            {
              "id": "indexable",
              "label": "Page is indexable",
              "weight": 2.4,
              "status": "pass",
              "score": 1,
              "detail": "The page is indexable (no noindex in meta or X-Robots-Tag).",
              "evidence": {
                "robotsMeta": "index,follow",
                "xRobots": ""
              },
              "assessment": "observed"
            },
            {
              "id": "followable",
              "label": "Links are followable",
              "weight": 0.6,
              "status": "pass",
              "score": 1,
              "detail": "No page-level nofollow.",
              "assessment": "observed"
            },
            {
              "id": "robotsTxt",
              "label": "Googlebot access to this URL",
              "weight": 1.2,
              "status": "pass",
              "score": 1,
              "detail": "No matching robots restriction for Googlebot on this URL.",
              "evidence": {
                "agent": "Googlebot",
                "allowed": true,
                "path": "/audit-guide"
              },
              "assessment": "observed"
            },
            {
              "id": "sitemap",
              "label": "XML sitemap available",
              "weight": 1,
              "status": "pass",
              "score": 1,
              "detail": "Sitemap reachable at undefined.",
              "assessment": "observed"
            },
            {
              "id": "canonical",
              "label": "Canonical URL",
              "weight": 1.2,
              "status": "pass",
              "score": 1,
              "detail": "Canonical → https://example.org/audit-guide (self-referencing).",
              "assessment": "observed"
            },
            {
              "id": "hreflang",
              "label": "hreflang for internationalization",
              "weight": 0.4,
              "status": "info",
              "score": 1,
              "detail": "No hreflang tags (only needed for multi-language sites).",
              "recommendation": "If you serve multiple languages/regions, add hreflang alternates.",
              "assessment": "not-applicable"
            },
            {
              "id": "openGraph",
              "label": "Open Graph tags",
              "weight": 0.9,
              "status": "fail",
              "score": 0,
              "detail": "0/5 core Open Graph tags present.",
              "recommendation": "Add og:title, og:description, og:image, og:url and og:type for rich social/chat previews.",
              "evidence": {
                "present": []
              },
              "assessment": "observed"
            },
            {
              "id": "twitterCard",
              "label": "Twitter/X card tags",
              "weight": 0.5,
              "status": "info",
              "score": 1,
              "detail": "0/3 Twitter card tags present.",
              "recommendation": "Add twitter:card, twitter:title and twitter:image for better X/Twitter previews.",
              "assessment": "not-applicable"
            },
            {
              "id": "structuredData",
              "label": "Structured data (Schema.org)",
              "weight": 1.3,
              "status": "warn",
              "score": 0.3,
              "detail": "No JSON-LD structured data found.",
              "recommendation": "Add valid JSON-LD (Organization, BreadcrumbList, Article/Product as relevant) to qualify for rich results.",
              "evidence": {
                "blocks": 0,
                "valid": 0,
                "types": []
              },
              "assessment": "observed"
            },
            {
              "id": "breadcrumbs",
              "label": "Breadcrumb structured data",
              "weight": 0.4,
              "status": "info",
              "score": 1,
              "detail": "No breadcrumb structured data.",
              "recommendation": "Add BreadcrumbList schema so search shows breadcrumb trails in results.",
              "assessment": "not-applicable"
            },
            {
              "id": "imageAlt",
              "label": "Descriptive image alt text",
              "weight": 0.9,
              "status": "pass",
              "score": 1,
              "detail": "No images.",
              "assessment": "observed"
            },
            {
              "id": "internalLinks",
              "label": "Internal linking",
              "weight": 1,
              "status": "fail",
              "score": 0,
              "detail": "0 internal and 0 external links (0 nofollow).",
              "recommendation": "Add contextual internal links to spread authority and aid crawl discovery.",
              "evidence": {
                "internal": 0,
                "external": 0,
                "nofollow": 0
              },
              "assessment": "observed"
            },
            {
              "id": "anchorQuality",
              "label": "Descriptive anchor text",
              "weight": 0.6,
              "status": "pass",
              "score": 1,
              "detail": "0 generic anchor(s) like \"click here\" out of 1 links.",
              "assessment": "observed"
            },
            {
              "id": "mobileViewport",
              "label": "Mobile-friendly viewport",
              "weight": 1.2,
              "status": "pass",
              "score": 1,
              "detail": "viewport: \"width=device-width, initial-scale=1\".",
              "assessment": "observed"
            },
            {
              "id": "htmlLang",
              "label": "Language declared",
              "weight": 0.6,
              "status": "pass",
              "score": 1,
              "detail": "lang=\"en\".",
              "assessment": "observed"
            },
            {
              "id": "keywordDistribution",
              "label": "Keyword across title/H1/intro/URL/alt",
              "weight": 1.4,
              "status": "fail",
              "score": 0.2,
              "detail": "Primary term \"skip\" appears in 1/5 key locations (title/H1/intro/URL/alt).",
              "recommendation": "Distribute your primary keyword across the title, H1, opening text, URL slug and an image alt for unambiguous topical relevance.",
              "assessment": "heuristic"
            },
            {
              "id": "h2KeywordCoverage",
              "label": "Sub-headings cover the topic",
              "weight": 0.8,
              "status": "info",
              "score": 1,
              "detail": "No H2s to assess.",
              "assessment": "not-applicable"
            },
            {
              "id": "ogImageQuality",
              "label": "Social image is share-ready",
              "weight": 0.6,
              "status": "fail",
              "score": 0,
              "detail": "No og:image.",
              "recommendation": "Use an absolute og:image URL (1200×630) and declare og:image:width/height for reliable rich previews.",
              "assessment": "observed"
            },
            {
              "id": "cleanUrlParams",
              "label": "URL free of tracking params",
              "weight": 0.5,
              "status": "pass",
              "score": 1,
              "detail": "No tracking/session parameters in the canonical URL.",
              "assessment": "observed"
            },
            {
              "id": "anchorDiversity",
              "label": "Diverse internal anchor text",
              "weight": 0.5,
              "status": "info",
              "score": 1,
              "detail": "1 unique anchors out of 1 links (100% diverse).",
              "assessment": "not-applicable"
            },
            {
              "id": "indexSitemapConsistency",
              "label": "No conflicting index signals",
              "weight": 0.7,
              "status": "pass",
              "score": 1,
              "detail": "Index signals are consistent.",
              "assessment": "heuristic"
            },
            {
              "id": "titleCtr",
              "label": "Title optimised for click-through",
              "weight": 0.5,
              "status": "pass",
              "score": 1,
              "detail": "Title uses numbers/power words that lift CTR.",
              "assessment": "observed"
            },
            {
              "id": "descUnique",
              "label": "Meta description is purpose-written",
              "weight": 0.4,
              "status": "pass",
              "score": 1,
              "detail": "Meta description is distinct from body copy.",
              "assessment": "observed"
            },
            {
              "id": "feedDiscovery",
              "label": "Feed advertised (RSS/Atom)",
              "weight": 0.3,
              "status": "info",
              "score": 1,
              "detail": "No RSS/Atom/JSON feed announced in <head> (only relevant if the site publishes a feed).",
              "recommendation": "If you publish a feed, announce it with <link rel=\"alternate\" type=\"application/rss+xml\"> so readers and agents can find it.",
              "assessment": "not-applicable"
            }
          ],
          "summary": "Scored 40/100 across 34 on-page SEO checks (18 pass, 6 warn, 10 fail) — including keyword distribution, schema completeness, anchor diversity and index-signal consistency."
        },
        {
          "key": "geo",
          "label": "GEO (AI Answer Engines)",
          "weight": 1.15,
          "score": 19,
          "grade": "F",
          "scoreAvailable": true,
          "coverage": {
            "scored": 10,
            "observed": 10,
            "heuristic": 5,
            "notTested": 1,
            "notApplicable": 17
          },
          "checks": [
            {
              "id": "structuredAnswers",
              "label": "Machine-extractable structured data",
              "weight": 2.4,
              "status": "fail",
              "score": 0,
              "detail": "No JSON-LD — AI engines must guess the page's facts and entities.",
              "recommendation": "Add Article and Organization/Person JSON-LD (plus HowTo where relevant) so engines can lift facts verbatim and attribute you.",
              "assessment": "observed"
            },
            {
              "id": "questionHeadings",
              "label": "Question-based headings",
              "weight": 1.4,
              "status": "fail",
              "score": 0,
              "detail": "No question-style headings (these map directly to user prompts).",
              "recommendation": "Frame key sections as the questions users ask, then answer concisely below each.",
              "evidence": {
                "examples": []
              },
              "assessment": "observed"
            },
            {
              "id": "liftableContent",
              "label": "Concise, liftable answers",
              "weight": 1.4,
              "status": "fail",
              "score": 0,
              "detail": "0% of paragraphs are answer-sized; 0 list(s), 0 table(s).",
              "recommendation": "Lead sections with a 1–3 sentence direct answer and use lists/tables — these are what generative engines quote.",
              "assessment": "heuristic"
            },
            {
              "id": "dataTables",
              "label": "Structured data tables",
              "weight": 0.5,
              "status": "info",
              "score": 1,
              "detail": "No data tables.",
              "recommendation": "Where you compare options or list specs, use <table> — engines extract tabular facts cleanly.",
              "assessment": "not-applicable"
            },
            {
              "id": "authority",
              "label": "Author & attribution (E-E-A-T)",
              "weight": 1.2,
              "status": "pass",
              "score": 1,
              "detail": "Authorship/attribution signals present.",
              "assessment": "observed"
            },
            {
              "id": "aboutPage",
              "label": "Discoverable About/Org page",
              "weight": 0.5,
              "status": "info",
              "score": 1,
              "detail": "No obvious About/Org link.",
              "recommendation": "Link to an About page — engines use it to establish entity identity and trust.",
              "assessment": "not-applicable"
            },
            {
              "id": "freshness",
              "label": "Machine-readable dates",
              "weight": 0.9,
              "status": "warn",
              "score": 0.5,
              "detail": "No machine-readable dates; engines can't judge recency.",
              "recommendation": "Expose datePublished/dateModified (JSON-LD + a <time> element) so recency is verifiable.",
              "assessment": "observed"
            },
            {
              "id": "citations",
              "label": "Outbound citations",
              "weight": 0.9,
              "status": "fail",
              "score": 0,
              "detail": "0 outbound citation(s) to other domains.",
              "recommendation": "Cite primary sources — well-sourced pages are more likely to be trusted and cited.",
              "assessment": "observed"
            },
            {
              "id": "aiCrawlerAccess",
              "label": "AI search crawler access to this URL",
              "weight": 1.6,
              "status": "pass",
              "score": 1,
              "detail": "No matching robots restriction for OpenAI Search, Perplexity or Claude Search. This is access eligibility, not proof of indexing or citations.",
              "evidence": {
                "blockedSearch": [],
                "decisions": []
              },
              "assessment": "observed"
            },
            {
              "id": "googleAiEligibility",
              "label": "Google Search AI eligibility",
              "weight": 0,
              "status": "info",
              "score": 1,
              "detail": "Public markup cannot confirm indexing, snippet eligibility or the owner's Search Console AI inclusion setting. Google-Extended controls Gemini training and grounding; it does not control Google Search inclusion.",
              "assessment": "not-tested"
            },
            {
              "id": "aiPolicyChoices",
              "label": "Training and user-triggered access policy",
              "weight": 0,
              "status": "info",
              "score": 1,
              "detail": "Policy restrictions: none detected. Training, Gemini grounding and user-triggered agents have separate purposes. ChatGPT-User does not determine ChatGPT Search inclusion.",
              "assessment": "observed"
            },
            {
              "id": "llmsTxt",
              "label": "llms.txt published",
              "weight": 0.4,
              "status": "info",
              "score": 1,
              "detail": "No /llms.txt found (optional — Google ignores it, but some AI agents read it).",
              "recommendation": "Consider publishing /llms.txt — a curated markdown map of your key content some AI agents read. Note it has no effect on Google Search or AI Overviews.",
              "assessment": "not-applicable"
            },
            {
              "id": "linkHeaderDiscovery",
              "label": "Link header advertises resources",
              "weight": 0.3,
              "status": "info",
              "score": 1,
              "detail": "No discovery hints in the HTTP Link header (optional: lets agents find sitemap/llms.txt without parsing HTML).",
              "recommendation": "Consider advertising sitemap/llms.txt/feeds via the HTTP Link header for agents that never read your HTML.",
              "assessment": "not-applicable"
            },
            {
              "id": "contentSignal",
              "label": "AI usage declared (Content-Signal)",
              "weight": 0.2,
              "status": "info",
              "score": 1,
              "detail": "No Content-Signal directives in robots.txt (emerging, optional standard for declaring AI search/train permissions).",
              "recommendation": "Optionally add Content-Signal directives to robots.txt to state explicitly whether AI may search, ingest or train on your content.",
              "assessment": "not-applicable"
            },
            {
              "id": "semanticStructure",
              "label": "Semantic HTML landmarks",
              "weight": 1,
              "status": "fail",
              "score": 0,
              "detail": "Uses 0 semantic landmark(s): none.",
              "recommendation": "Wrap content in <main>/<article>/<section> so engines isolate primary content from chrome.",
              "assessment": "observed"
            },
            {
              "id": "directAnswer",
              "label": "Direct answer up top",
              "weight": 0,
              "status": "info",
              "score": 1,
              "detail": "No clear opening paragraph.",
              "recommendation": "Open with a self-contained, definitional sentence engines can quote out of context.",
              "assessment": "heuristic"
            },
            {
              "id": "serverRendered",
              "label": "Text present in the initial HTML",
              "weight": 1,
              "status": "pass",
              "score": 1,
              "detail": "3 words in the initial HTML. Short pages can be complete; text length does not establish content quality or citations.",
              "assessment": "observed"
            },
            {
              "id": "statDensity",
              "label": "Quotable statistics",
              "weight": 0,
              "status": "info",
              "score": 1,
              "detail": "0 statistic-like figures (0.0 per 500 words).",
              "recommendation": "Use relevant, verifiable figures when they help readers. Statistics density is not a measured citation signal.",
              "assessment": "heuristic"
            },
            {
              "id": "comparisonContent",
              "label": "Comparison-style content",
              "weight": 0.6,
              "status": "info",
              "score": 1,
              "detail": "No comparison or tabular content detected.",
              "recommendation": "Where relevant, add comparison tables or 'X vs Y' sections — engines surface these for decision queries.",
              "assessment": "not-applicable"
            },
            {
              "id": "selfContained",
              "label": "Self-contained opening",
              "weight": 0,
              "status": "info",
              "score": 1,
              "detail": "No opening paragraph.",
              "recommendation": "Open with a self-contained sentence that names the subject ('X is…') so it can be quoted standalone.",
              "assessment": "heuristic"
            },
            {
              "id": "chunking",
              "label": "Content split into extractable chunks",
              "weight": 0,
              "status": "info",
              "score": 1,
              "detail": "~3 words per section across 0 sub-headings.",
              "assessment": "heuristic"
            },
            {
              "id": "tableOfContents",
              "label": "In-page anchor navigation",
              "weight": 0.4,
              "status": "info",
              "score": 1,
              "detail": "No table-of-contents anchors.",
              "recommendation": "For long content, add a table of contents with in-page anchors — it maps your sections for AI navigation.",
              "assessment": "not-applicable"
            },
            {
              "id": "entityConsistency",
              "label": "Schema entity matches page",
              "weight": 0.5,
              "status": "info",
              "score": 1,
              "detail": "No named entities in schema.",
              "assessment": "not-applicable"
            },
            {
              "id": "faqRichness",
              "label": "FAQ-style coverage",
              "weight": 0.5,
              "status": "info",
              "score": 1,
              "detail": "0 question headings.",
              "recommendation": "Add a visible FAQ section answering 3+ real user questions — Q&A content is a top source of AI-answer citations. (FAQPage markup is optional; Google dropped FAQ rich results in May 2026.)",
              "assessment": "not-applicable"
            },
            {
              "id": "absoluteRecency",
              "label": "Content is recent",
              "weight": 0.6,
              "status": "info",
              "score": 1,
              "detail": "No parseable publish/modified date.",
              "assessment": "not-applicable"
            },
            {
              "id": "entityRichness",
              "label": "Named-entity richness",
              "weight": 0.4,
              "status": "info",
              "score": 1,
              "detail": "1 distinct proper-noun phrases (entities engines can link).",
              "recommendation": "Reference concrete named entities (products, people, places, standards) — they anchor your content in knowledge graphs.",
              "assessment": "not-applicable"
            },
            {
              "id": "answerNotHidden",
              "label": "Key content not hidden behind UI",
              "weight": 0.4,
              "status": "pass",
              "score": 1,
              "detail": "Content isn't buried in tabs/accordions.",
              "assessment": "observed"
            },
            {
              "id": "agentCard",
              "label": "A2A agent card published",
              "weight": 0.3,
              "status": "info",
              "score": 1,
              "detail": "No A2A agent card (emerging spec; only relevant if the site exposes services for AI agents to call).",
              "recommendation": "If you offer agent-callable services, consider publishing an A2A agent card at /.well-known/agent-card.json.",
              "assessment": "not-applicable"
            },
            {
              "id": "trafficAdvice",
              "label": "Traffic advice for prefetch proxies",
              "weight": 0.2,
              "status": "info",
              "score": 1,
              "detail": "No /.well-known/traffic-advice (optional: declares how prefetch proxies like Chrome's private prefetch may load your pages).",
              "recommendation": "Optionally publish /.well-known/traffic-advice to control how prefetch proxies pre-load your pages.",
              "assessment": "not-applicable"
            },
            {
              "id": "mcpServer",
              "label": "MCP server discoverable",
              "weight": 0.4,
              "status": "info",
              "score": 1,
              "detail": "No MCP server found (agents probe https://mcp.<your-domain>/ and /.well-known/mcp).",
              "recommendation": "If you offer tools or services AI agents could call, serve an MCP endpoint (Streamable HTTP) at mcp.<your-domain> or /.well-known/mcp — the two locations agents probe for it.",
              "evidence": {
                "location": null
              },
              "assessment": "not-applicable"
            },
            {
              "id": "openApiSpec",
              "label": "OpenAPI spec / API catalog published",
              "weight": 0.3,
              "status": "info",
              "score": 1,
              "detail": "No /openapi.json or /.well-known/api-catalog found (only relevant if you expose an API).",
              "recommendation": "If you expose an API, publish its OpenAPI spec at /openapi.json (or an RFC 9727 catalog at /.well-known/api-catalog) so agents can discover and call it unaided.",
              "evidence": {
                "source": null
              },
              "assessment": "not-applicable"
            },
            {
              "id": "agentsMd",
              "label": "agents.md published",
              "weight": 0.3,
              "status": "info",
              "score": 1,
              "detail": "No /agents.md found (emerging convention: a markdown briefing for AI agents at the site root).",
              "recommendation": "Consider publishing /agents.md — a short markdown briefing (what the site does, key URLs, machine-readable surfaces) that agents can read in one fetch.",
              "assessment": "not-applicable"
            },
            {
              "id": "nlweb",
              "label": "NLWeb surfaces (schemamap + /ask)",
              "weight": 0.3,
              "status": "info",
              "score": 1,
              "detail": "No NLWeb surfaces (optional: schemamap in robots.txt plus an /ask endpoint let agents query your site in natural language).",
              "recommendation": "Optionally adopt NLWeb: point agents at your structured data with schemamap: lines in robots.txt and answer natural-language questions at /ask.",
              "evidence": {
                "schemamap": false,
                "askEndpoint": null
              },
              "assessment": "not-applicable"
            }
          ],
          "summary": "Scored 19/100 across 10 applicable access and content checks. Optional editorial observations are listed separately; this score does not measure AI citations."
        },
        {
          "key": "performance",
          "label": "Performance",
          "weight": 1.3,
          "score": 94,
          "grade": "A",
          "scoreAvailable": true,
          "coverage": {
            "scored": 23,
            "observed": 22,
            "heuristic": 1,
            "notTested": 0,
            "notApplicable": 16
          },
          "checks": [
            {
              "id": "responseTime",
              "label": "Server response time",
              "weight": 2,
              "status": "pass",
              "score": 1,
              "detail": "Document response observed in 200 ms from this server; not real-user field data.",
              "evidence": {
                "ttfb": 200,
                "loadMs": 200
              },
              "assessment": "observed"
            },
            {
              "id": "redirects",
              "label": "Minimal redirects",
              "weight": 0.6,
              "status": "pass",
              "score": 1,
              "detail": "No redirect on the entry URL.",
              "assessment": "observed"
            },
            {
              "id": "htmlSize",
              "label": "HTML document size",
              "weight": 1,
              "status": "pass",
              "score": 1,
              "detail": "HTML is 3 KB uncompressed (0 KB on the wire).",
              "evidence": {
                "htmlKb": 3,
                "transferKb": 0
              },
              "assessment": "observed"
            },
            {
              "id": "compression",
              "label": "Text compression",
              "weight": 1.2,
              "status": "pass",
              "score": 1,
              "detail": "Response compressed (br).",
              "assessment": "observed"
            },
            {
              "id": "brotli",
              "label": "Brotli compression",
              "weight": 0.4,
              "status": "pass",
              "score": 1,
              "detail": "Using Brotli (best ratio).",
              "assessment": "observed"
            },
            {
              "id": "renderBlocking",
              "label": "Render-blocking resources",
              "weight": 1.6,
              "status": "pass",
              "score": 1,
              "detail": "0 render-blocking script(s) and 0 stylesheet(s) in <head>.",
              "evidence": {
                "blockingScripts": 0,
                "headStyles": 0
              },
              "assessment": "observed"
            },
            {
              "id": "scriptLoading",
              "label": "Scripts load async/deferred",
              "weight": 1,
              "status": "info",
              "score": 1,
              "detail": "No external scripts.",
              "recommendation": "Add async or defer to non-critical scripts so they don't block parsing.",
              "assessment": "not-applicable"
            },
            {
              "id": "requestCount",
              "label": "Resource request count",
              "weight": 1,
              "status": "pass",
              "score": 1,
              "detail": "~0 referenced resources (0 scripts, 0 styles, 0 images, 0 iframes).",
              "evidence": {
                "totalScripts": 0,
                "styles": 0,
                "imgs": 0,
                "iframes": 0
              },
              "assessment": "heuristic"
            },
            {
              "id": "thirdParty",
              "label": "Third-party request domains",
              "weight": 1,
              "status": "pass",
              "score": 1,
              "detail": "0 distinct third-party domain(s) referenced.",
              "evidence": {
                "domains": []
              },
              "assessment": "observed"
            },
            {
              "id": "resourceHints",
              "label": "Resource hints (preconnect/preload)",
              "weight": 0.8,
              "status": "info",
              "score": 1,
              "detail": "0 preconnect, 0 dns-prefetch, 0 preload hint(s).",
              "recommendation": "Add <link rel=preconnect> for critical third-party origins and preload key fonts/hero assets.",
              "assessment": "not-applicable"
            },
            {
              "id": "imageOptim",
              "label": "Image optimization",
              "weight": 1.4,
              "status": "info",
              "score": 1,
              "detail": "No raster images to optimise (vectors are resolution-independent).",
              "evidence": {
                "rasterImgs": 0,
                "lazy": 0,
                "rasterDimensioned": 0,
                "modern": 0,
                "responsive": 0
              },
              "assessment": "not-applicable"
            },
            {
              "id": "cls",
              "label": "Layout-shift prevention",
              "weight": 1,
              "status": "info",
              "score": 1,
              "detail": "No images.",
              "recommendation": "Set explicit width/height (or aspect-ratio) on media to prevent Cumulative Layout Shift.",
              "assessment": "not-applicable"
            },
            {
              "id": "fontDisplay",
              "label": "Web-font loading strategy",
              "weight": 0.6,
              "status": "info",
              "score": 1,
              "detail": "No external web fonts detected.",
              "assessment": "not-applicable"
            },
            {
              "id": "inlineWeight",
              "label": "Inline CSS/JS weight",
              "weight": 0.7,
              "status": "pass",
              "score": 1,
              "detail": "0 KB inline CSS, 2 KB inline JS.",
              "assessment": "observed"
            },
            {
              "id": "minification",
              "label": "HTML minification",
              "weight": 0.5,
              "status": "pass",
              "score": 1,
              "detail": "HTML appears minified.",
              "assessment": "observed"
            },
            {
              "id": "caching",
              "label": "Caching headers",
              "weight": 0.8,
              "status": "warn",
              "score": 0.5,
              "detail": "No effective Cache-Control on the document.",
              "recommendation": "Set Cache-Control on static assets (long max-age + immutable) and a sensible value on HTML.",
              "assessment": "observed"
            },
            {
              "id": "validators",
              "label": "Conditional requests (ETag/Last-Modified)",
              "weight": 0.5,
              "status": "warn",
              "score": 0.5,
              "detail": "No ETag or Last-Modified on the document — every revisit re-downloads the full body.",
              "recommendation": "Send an ETag or Last-Modified header so browsers can revalidate with If-None-Match and get a cheap 304.",
              "assessment": "observed"
            },
            {
              "id": "cdn",
              "label": "CDN / edge delivery",
              "weight": 0.6,
              "status": "pass",
              "score": 1,
              "detail": "Modern HTTP advertised.",
              "recommendation": "Serve assets from a CDN to cut latency for distant users.",
              "assessment": "observed"
            },
            {
              "id": "http2",
              "label": "Modern HTTP (h2/h3)",
              "weight": 0.5,
              "status": "pass",
              "score": 1,
              "detail": "Server advertises HTTP/2 or HTTP/3 (alt-svc).",
              "assessment": "observed"
            },
            {
              "id": "domSize",
              "label": "DOM size",
              "weight": 0.8,
              "status": "pass",
              "score": 1,
              "detail": "14 DOM nodes.",
              "assessment": "observed"
            },
            {
              "id": "cssImport",
              "label": "No CSS @import chains",
              "weight": 0.6,
              "status": "pass",
              "score": 1,
              "detail": "No @import in inline CSS.",
              "assessment": "observed"
            },
            {
              "id": "dataUriBloat",
              "label": "No heavy inline data-URIs",
              "weight": 0.7,
              "status": "pass",
              "score": 1,
              "detail": "0 base64 data-URI(s), ~0 KB inlined into the HTML.",
              "assessment": "observed"
            },
            {
              "id": "duplicateScripts",
              "label": "No duplicate scripts",
              "weight": 0.5,
              "status": "pass",
              "score": 1,
              "detail": "No duplicate script URLs.",
              "assessment": "observed"
            },
            {
              "id": "lcpImage",
              "label": "Hero image not lazy-loaded",
              "weight": 0.8,
              "status": "info",
              "score": 1,
              "detail": "No images.",
              "assessment": "not-applicable"
            },
            {
              "id": "fetchPriority",
              "label": "LCP fetchpriority hint",
              "weight": 0.4,
              "status": "info",
              "score": 1,
              "detail": "No fetchpriority hint for the LCP image.",
              "recommendation": "Add fetchpriority=\"high\" to your hero/LCP image so the browser fetches it first.",
              "assessment": "not-applicable"
            },
            {
              "id": "preconnectCoverage",
              "label": "Critical origins preconnected",
              "weight": 0.6,
              "status": "info",
              "score": 1,
              "detail": "0/0 third-party origins are preconnected.",
              "assessment": "not-applicable"
            },
            {
              "id": "embedFacade",
              "label": "No heavy un-faceted embeds",
              "weight": 0.5,
              "status": "pass",
              "score": 1,
              "detail": "No heavy third-party embeds.",
              "assessment": "observed"
            },
            {
              "id": "inlineScript",
              "label": "No oversized inline scripts",
              "weight": 0.5,
              "status": "pass",
              "score": 1,
              "detail": "Largest inline <script> is 1.9 KB.",
              "assessment": "observed"
            },
            {
              "id": "mediaScopedCss",
              "label": "Non-critical CSS deferred/scoped",
              "weight": 0.5,
              "status": "pass",
              "score": 1,
              "detail": "0 stylesheet(s) load render-blocking (no media scope / print).",
              "assessment": "observed"
            },
            {
              "id": "legacyHeadLibs",
              "label": "No legacy libs blocking <head>",
              "weight": 0.4,
              "status": "pass",
              "score": 1,
              "detail": "No legacy libraries blocking in <head>.",
              "assessment": "observed"
            },
            {
              "id": "bfcache",
              "label": "Back/forward cache not blocked",
              "weight": 0.5,
              "status": "pass",
              "score": 1,
              "detail": "No BFCache blockers detected — back/forward navigations can restore instantly from memory.",
              "assessment": "observed"
            },
            {
              "id": "speculationRules",
              "label": "Speculation Rules (prefetch/prerender)",
              "weight": 0.3,
              "status": "info",
              "score": 1,
              "detail": "No Speculation Rules (optional: makes next-page navigations feel instant).",
              "recommendation": "Consider a <script type=\"speculationrules\"> block to prerender likely next pages on hover.",
              "assessment": "not-applicable"
            },
            {
              "id": "cssContainment",
              "label": "CSS containment",
              "weight": 0.2,
              "status": "info",
              "score": 1,
              "detail": "CSS containment not assessed — stylesheets are external and deep render is off.",
              "recommendation": "Consider contain: content (or layout/paint) on self-contained widgets to limit style/layout recalculation scope.",
              "assessment": "not-applicable"
            },
            {
              "id": "scrollbarGutter",
              "label": "scrollbar-gutter reserved",
              "weight": 0.2,
              "status": "info",
              "score": 1,
              "detail": "scrollbar-gutter not assessed — stylesheets are external and deep render is off.",
              "recommendation": "Set scrollbar-gutter: stable on the root/scroll containers so the scrollbar appearing doesn't shift content sideways.",
              "assessment": "not-applicable"
            },
            {
              "id": "viewTransitions",
              "label": "View Transitions API",
              "weight": 0.3,
              "status": "info",
              "score": 1,
              "detail": "No View Transitions usage detected (optional: native cross-fade/morph between pages and states).",
              "recommendation": "Consider the View Transitions API (@view-transition / startViewTransition) for smooth page and state transitions without JS animation libraries.",
              "assessment": "not-applicable"
            },
            {
              "id": "scrollDrivenAnimations",
              "label": "Scroll-driven animations (CSS)",
              "weight": 0.2,
              "status": "info",
              "score": 1,
              "detail": "No scroll-driven animation usage detected (optional: animation-timeline: scroll()/view()).",
              "recommendation": "Consider CSS scroll-driven animations (animation-timeline) for scroll effects — they run off the main thread with zero JS.",
              "assessment": "not-applicable"
            },
            {
              "id": "serverTiming",
              "label": "Server-Timing header",
              "weight": 0.2,
              "status": "info",
              "score": 1,
              "detail": "No Server-Timing header on the document.",
              "recommendation": "Emit a Server-Timing header (e.g. db;dur=42, cache;desc=hit) to surface backend timings in DevTools and RUM analytics.",
              "assessment": "not-applicable"
            },
            {
              "id": "compressionDictionary",
              "label": "Compression Dictionary Transport",
              "weight": 0.2,
              "status": "info",
              "score": 1,
              "detail": "No compression-dictionary headers (cutting-edge: Use-As-Dictionary lets returning visitors download only the diff of updated assets).",
              "recommendation": "Consider Compression Dictionary Transport (Use-As-Dictionary on key assets) so returning visitors fetch deltas instead of full files.",
              "assessment": "not-applicable"
            },
            {
              "id": "earlyHintsReady",
              "label": "Early Hints (103) readiness",
              "weight": 0.3,
              "status": "info",
              "score": 1,
              "detail": "No Link response header with preload/preconnect on the document.",
              "recommendation": "Send 103 Early Hints with Link headers (rel=preload/preconnect) on the main document so browsers start fetching critical assets before the HTML is ready.",
              "assessment": "not-applicable"
            }
          ],
          "summary": "Scored 94/100 across 23 performance signals (0 failing) — including LCP-image handling, CSS @import chains, revalidators, BFCache eligibility, preconnect coverage and embed facades."
        },
        {
          "key": "accessibility",
          "label": "Accessibility",
          "weight": 1.2,
          "score": 76,
          "grade": "C",
          "scoreAvailable": true,
          "coverage": {
            "scored": 19,
            "observed": 19,
            "heuristic": 0,
            "notTested": 1,
            "notApplicable": 7
          },
          "checks": [
            {
              "id": "lang",
              "label": "Document language declared",
              "weight": 1.4,
              "status": "pass",
              "score": 1,
              "detail": "lang=\"en\".",
              "assessment": "observed"
            },
            {
              "id": "imgAlt",
              "label": "Images have alt attributes",
              "weight": 1.8,
              "status": "info",
              "score": 1,
              "detail": "No images.",
              "evidence": {
                "total": 0,
                "missingAlt": 0
              },
              "assessment": "not-applicable"
            },
            {
              "id": "altQuality",
              "label": "Alt text is meaningful",
              "weight": 0.6,
              "status": "pass",
              "score": 1,
              "detail": "No generic alt text detected.",
              "assessment": "observed"
            },
            {
              "id": "formLabels",
              "label": "Form inputs are labelled",
              "weight": 1.8,
              "status": "info",
              "score": 1,
              "detail": "No form fields.",
              "evidence": {
                "total": 0,
                "unlabeled": 0
              },
              "assessment": "not-applicable"
            },
            {
              "id": "linkText",
              "label": "Descriptive link text",
              "weight": 0.9,
              "status": "pass",
              "score": 1,
              "detail": "0 vague and 0 empty link(s) of 1.",
              "assessment": "observed"
            },
            {
              "id": "buttonNames",
              "label": "Buttons have accessible names",
              "weight": 0.9,
              "status": "info",
              "score": 1,
              "detail": "No buttons.",
              "assessment": "not-applicable"
            },
            {
              "id": "zoom",
              "label": "Pinch-zoom not disabled",
              "weight": 1,
              "status": "pass",
              "score": 1,
              "detail": "Users can zoom.",
              "assessment": "observed"
            },
            {
              "id": "landmarks",
              "label": "Landmark regions",
              "weight": 1,
              "status": "fail",
              "score": 0,
              "detail": "Landmarks present: main:false nav:false header:false footer:false.",
              "recommendation": "Use <main>, <nav>, <header> and <footer> so assistive tech can jump between regions.",
              "assessment": "observed"
            },
            {
              "id": "skipLink",
              "label": "Skip-to-content link",
              "weight": 0.5,
              "status": "pass",
              "score": 1,
              "detail": "A skip link is present.",
              "assessment": "observed"
            },
            {
              "id": "headingStructure",
              "label": "Headings form an outline",
              "weight": 0.8,
              "status": "fail",
              "score": 0,
              "detail": "No headings.",
              "recommendation": "Add headings to structure the page.",
              "assessment": "observed"
            },
            {
              "id": "ariaHidden",
              "label": "No focusable content in aria-hidden",
              "weight": 0.6,
              "status": "pass",
              "score": 1,
              "detail": "No focusable elements hidden from assistive tech.",
              "assessment": "observed"
            },
            {
              "id": "tabindex",
              "label": "No positive tabindex",
              "weight": 0.5,
              "status": "pass",
              "score": 1,
              "detail": "Natural focus order preserved.",
              "assessment": "observed"
            },
            {
              "id": "autoplay",
              "label": "No autoplaying media",
              "weight": 0.4,
              "status": "pass",
              "score": 1,
              "detail": "No autoplaying audio/video.",
              "assessment": "observed"
            },
            {
              "id": "contrast",
              "label": "Text colour contrast (WCAG AA)",
              "weight": 1.4,
              "status": "info",
              "score": 1,
              "detail": "No colour pairs to evaluate (colours likely set via external CSS — enable deep render to assess).",
              "evidence": {
                "checked": 0,
                "failures": 0,
                "worst": null
              },
              "assessment": "not-tested"
            },
            {
              "id": "accessibleNames",
              "label": "Interactive elements are named",
              "weight": 1.3,
              "status": "pass",
              "score": 1,
              "detail": "1/1 interactive elements expose an accessible name.",
              "evidence": {
                "total": 1,
                "named": 1
              },
              "assessment": "observed"
            },
            {
              "id": "semanticInteractive",
              "label": "Interactive elements are semantic",
              "weight": 1,
              "status": "pass",
              "score": 1,
              "detail": "All interactive elements use <a>/<button>.",
              "assessment": "observed"
            },
            {
              "id": "validNesting",
              "label": "No invalid interactive nesting",
              "weight": 0.7,
              "status": "pass",
              "score": 1,
              "detail": "No invalid nesting detected.",
              "assessment": "observed"
            },
            {
              "id": "reducedMotion",
              "label": "Respects prefers-reduced-motion",
              "weight": 0.6,
              "status": "info",
              "score": 1,
              "detail": "No inline animations detected.",
              "assessment": "not-applicable"
            },
            {
              "id": "landmarkUniqueness",
              "label": "Unique top-level landmarks",
              "weight": 0.6,
              "status": "warn",
              "score": 0.5,
              "detail": "No main landmark.",
              "recommendation": "Expose exactly one <main> landmark so screen-reader users can jump to primary content.",
              "assessment": "observed"
            },
            {
              "id": "ariaRefs",
              "label": "ARIA references resolve",
              "weight": 0.6,
              "status": "pass",
              "score": 1,
              "detail": "All aria-labelledby/describedby/controls point to existing IDs.",
              "assessment": "observed"
            },
            {
              "id": "emptyHeadings",
              "label": "No empty headings",
              "weight": 0.5,
              "status": "pass",
              "score": 1,
              "detail": "No empty headings.",
              "assessment": "observed"
            },
            {
              "id": "touchTargets",
              "label": "Adequate touch-target size",
              "weight": 0.5,
              "status": "info",
              "score": 1,
              "detail": "No inline-sized interactive elements to assess.",
              "assessment": "not-applicable"
            },
            {
              "id": "langFormat",
              "label": "Valid lang value",
              "weight": 0.4,
              "status": "pass",
              "score": 1,
              "detail": "lang=\"en\" is well-formed.",
              "assessment": "observed"
            },
            {
              "id": "a11yOverlay",
              "label": "No accessibility overlay widget",
              "weight": 0.8,
              "status": "pass",
              "score": 1,
              "detail": "No accessibility overlay detected.",
              "assessment": "observed"
            },
            {
              "id": "focusRing",
              "label": "Keyboard focus ring preserved",
              "weight": 0.7,
              "status": "pass",
              "score": 1,
              "detail": "No focus-outline removal detected.",
              "assessment": "observed"
            },
            {
              "id": "inlineLang",
              "label": "Language of parts (lang on foreign content)",
              "weight": 0.3,
              "status": "info",
              "score": 1,
              "detail": "No inline lang attributes found — untagged foreign-language passages can't be detected statically.",
              "recommendation": "If the page quotes or embeds text in another language, wrap it with lang=\"xx\" (WCAG 3.1.2) so screen readers pronounce it correctly.",
              "assessment": "not-applicable"
            },
            {
              "id": "translateAttr",
              "label": "Machine-translation hints (translate=no)",
              "weight": 0.2,
              "status": "info",
              "score": 1,
              "detail": "No translate=\"no\"/notranslate markers found.",
              "recommendation": "Mark brand names, code snippets and proper nouns with translate=\"no\" so browser auto-translation doesn't mangle them.",
              "assessment": "not-applicable"
            }
          ],
          "summary": "Scored 76/100 against 19 WCAG checks (2 failing, 1 risky) — including computed colour-contrast, accessible-name coverage, semantic interactivity and ARIA-reference integrity."
        },
        {
          "key": "codeQuality",
          "label": "Code Quality",
          "weight": 0.9,
          "score": 87,
          "grade": "B",
          "scoreAvailable": true,
          "coverage": {
            "scored": 24,
            "observed": 24,
            "heuristic": 0,
            "notTested": 0,
            "notApplicable": 2
          },
          "checks": [
            {
              "id": "doctype",
              "label": "HTML5 doctype",
              "weight": 1,
              "status": "pass",
              "score": 1,
              "detail": "Standards-mode <!doctype html>.",
              "assessment": "observed"
            },
            {
              "id": "charset",
              "label": "Character encoding declared early",
              "weight": 1,
              "status": "pass",
              "score": 1,
              "detail": "Charset declared within the first 1KB.",
              "assessment": "observed"
            },
            {
              "id": "lang",
              "label": "Language attribute",
              "weight": 0.6,
              "status": "pass",
              "score": 1,
              "detail": "html lang set.",
              "assessment": "observed"
            },
            {
              "id": "deprecatedTags",
              "label": "No deprecated tags",
              "weight": 1,
              "status": "pass",
              "score": 1,
              "detail": "No deprecated HTML tags.",
              "assessment": "observed"
            },
            {
              "id": "deprecatedAttrs",
              "label": "No presentational attributes",
              "weight": 0.6,
              "status": "pass",
              "score": 1,
              "detail": "No deprecated presentational attributes.",
              "assessment": "observed"
            },
            {
              "id": "inlineStyles",
              "label": "Limited inline styles",
              "weight": 0.9,
              "status": "pass",
              "score": 1,
              "detail": "0 elements (0.0%) use inline style attributes.",
              "assessment": "observed"
            },
            {
              "id": "inlineHandlers",
              "label": "No inline event handlers",
              "weight": 0.7,
              "status": "pass",
              "score": 1,
              "detail": "No inline on* event handlers.",
              "assessment": "observed"
            },
            {
              "id": "dupeIds",
              "label": "Unique element IDs",
              "weight": 0.9,
              "status": "pass",
              "score": 1,
              "detail": "All element IDs are unique.",
              "assessment": "observed"
            },
            {
              "id": "emptyElements",
              "label": "No empty interactive elements",
              "weight": 0.5,
              "status": "pass",
              "score": 1,
              "detail": "No empty links.",
              "assessment": "observed"
            },
            {
              "id": "semanticRatio",
              "label": "Semantic elements over div soup",
              "weight": 0.8,
              "status": "fail",
              "score": 0,
              "detail": "1 <div>s vs 0 semantic element(s) (7% divs).",
              "recommendation": "Replace generic <div>s with semantic elements where appropriate.",
              "assessment": "observed"
            },
            {
              "id": "mixedContent",
              "label": "No mixed content",
              "weight": 1.1,
              "status": "pass",
              "score": 1,
              "detail": "No insecure http resources on an https page.",
              "evidence": {
                "mixed": 0
              },
              "assessment": "observed"
            },
            {
              "id": "leftovers",
              "label": "No debug leftovers",
              "weight": 0.5,
              "status": "pass",
              "score": 1,
              "detail": "No TODO/console leftovers in output.",
              "assessment": "observed"
            },
            {
              "id": "comments",
              "label": "Few HTML comments in production",
              "weight": 0.3,
              "status": "pass",
              "score": 1,
              "detail": "0 HTML comment(s) in the output.",
              "assessment": "observed"
            },
            {
              "id": "favicon",
              "label": "Favicon declared",
              "weight": 0.4,
              "status": "warn",
              "score": 0.5,
              "detail": "No favicon declared.",
              "recommendation": "Add a favicon and apple-touch-icon.",
              "assessment": "observed"
            },
            {
              "id": "domSize",
              "label": "Reasonable DOM size",
              "weight": 0.8,
              "status": "pass",
              "score": 1,
              "detail": "14 DOM elements.",
              "assessment": "observed"
            },
            {
              "id": "domDepth",
              "label": "DOM not too deeply nested",
              "weight": 0.5,
              "status": "pass",
              "score": 1,
              "detail": "Maximum nesting depth ~3.",
              "assessment": "observed"
            },
            {
              "id": "outdatedLibs",
              "label": "No outdated/known-risk libraries",
              "weight": 1,
              "status": "info",
              "score": 1,
              "detail": "No fingerprinted libraries.",
              "evidence": {
                "libs": []
              },
              "assessment": "not-applicable"
            },
            {
              "id": "jsUrls",
              "label": "No javascript: URLs",
              "weight": 0.6,
              "status": "pass",
              "score": 1,
              "detail": "No javascript: URLs.",
              "assessment": "observed"
            },
            {
              "id": "metaRefresh",
              "label": "No meta-refresh redirects",
              "weight": 0.5,
              "status": "pass",
              "score": 1,
              "detail": "No meta refresh.",
              "assessment": "observed"
            },
            {
              "id": "singletons",
              "label": "Valid document structure",
              "weight": 0.7,
              "status": "pass",
              "score": 1,
              "detail": "Exactly one html/head/body/title.",
              "assessment": "observed"
            },
            {
              "id": "brokenAnchors",
              "label": "In-page anchors resolve",
              "weight": 0.5,
              "status": "warn",
              "score": 0.5,
              "detail": "1 anchor link(s) point to a missing target.",
              "recommendation": "Fix in-page anchors that point to IDs which don't exist.",
              "assessment": "observed"
            },
            {
              "id": "noSecrets",
              "label": "No secrets/internal data exposed",
              "weight": 0.7,
              "status": "pass",
              "score": 1,
              "detail": "No obvious secrets or internal data in the markup.",
              "assessment": "observed"
            },
            {
              "id": "importantAbuse",
              "label": "No !important abuse",
              "weight": 0.5,
              "status": "pass",
              "score": 1,
              "detail": "0 !important declaration(s).",
              "assessment": "observed"
            },
            {
              "id": "semanticInteractive",
              "label": "Interactive elements are real controls",
              "weight": 0.6,
              "status": "pass",
              "score": 1,
              "detail": "Interactivity uses <a>/<button>.",
              "assessment": "observed"
            },
            {
              "id": "dupMeta",
              "label": "No duplicate meta tags",
              "weight": 0.4,
              "status": "pass",
              "score": 1,
              "detail": "No duplicate description/viewport tags.",
              "assessment": "observed"
            },
            {
              "id": "modernCssAdoption",
              "label": "Modern-CSS adoption",
              "weight": 0,
              "status": "info",
              "score": 1,
              "detail": "Modern-CSS adoption not assessed (external stylesheets not fetched) — container queries, anchor positioning and text-wrap balance can't be detected from the served HTML alone.",
              "assessment": "not-applicable"
            }
          ],
          "summary": "Scored 87/100 on 24 front-end hygiene checks (21 clean) — including outdated-library detection, document validity, broken anchors, exposed secrets and !important abuse."
        },
        {
          "key": "uiux",
          "label": "UI / UX",
          "weight": 1.05,
          "score": 50,
          "grade": "E",
          "scoreAvailable": true,
          "coverage": {
            "scored": 9,
            "observed": 3,
            "heuristic": 6,
            "notTested": 2,
            "notApplicable": 17
          },
          "checks": [
            {
              "id": "responsive",
              "label": "Mobile-responsive viewport",
              "weight": 1.8,
              "status": "pass",
              "score": 1,
              "detail": "Responsive viewport configured.",
              "assessment": "observed"
            },
            {
              "id": "mediaQueries",
              "label": "Responsive CSS present",
              "weight": 0.6,
              "status": "info",
              "score": 1,
              "detail": "No inline media queries (may be in external CSS).",
              "assessment": "not-tested"
            },
            {
              "id": "cta",
              "label": "Clear call-to-action",
              "weight": 1.5,
              "status": "info",
              "score": 0.3,
              "detail": "A conversion CTA is optional for this page; no score penalty.",
              "evidence": {
                "ctas": 0,
                "purpose": "general",
                "pageLang": "en"
              },
              "assessment": "not-applicable"
            },
            {
              "id": "navigation",
              "label": "Discoverable navigation",
              "weight": 1.2,
              "status": "info",
              "score": 0,
              "detail": "0 navigation link(s) inside <nav>.",
              "recommendation": "Where useful, provide a clear route back to the main page. A fixed number of navigation links is not required.",
              "assessment": "not-applicable"
            },
            {
              "id": "search",
              "label": "Site search",
              "weight": 0.4,
              "status": "info",
              "score": 1,
              "detail": "No site search detected.",
              "recommendation": "For content-heavy sites, add search to help users find things fast.",
              "assessment": "not-applicable"
            },
            {
              "id": "breadcrumbs",
              "label": "Breadcrumbs / wayfinding",
              "weight": 0.3,
              "status": "info",
              "score": 1,
              "detail": "No breadcrumbs detected.",
              "assessment": "not-applicable"
            },
            {
              "id": "contact",
              "label": "Contact information",
              "weight": 0.8,
              "status": "info",
              "score": 0.5,
              "detail": "No obvious contact information. This conversion check is not required for the inferred page purpose.",
              "assessment": "not-applicable"
            },
            {
              "id": "social",
              "label": "Social proof / links",
              "weight": 0.4,
              "status": "info",
              "score": 1,
              "detail": "No social links detected.",
              "assessment": "not-applicable"
            },
            {
              "id": "footer",
              "label": "Footer present",
              "weight": 0.4,
              "status": "warn",
              "score": 0.5,
              "detail": "No footer landmark.",
              "recommendation": "Add a footer with secondary nav, legal links and contact info.",
              "assessment": "observed"
            },
            {
              "id": "readability",
              "label": "Readable prose (Flesch)",
              "weight": 1,
              "status": "info",
              "score": 1,
              "detail": "Too little text to assess readability.",
              "evidence": {
                "flesch": 91,
                "grade": 1.3
              },
              "assessment": "not-applicable"
            },
            {
              "id": "scannability",
              "label": "Scannable content blocks",
              "weight": 0.7,
              "status": "warn",
              "score": 0.5,
              "detail": "Very little paragraph text.",
              "assessment": "heuristic"
            },
            {
              "id": "legibility",
              "label": "Legible base font size",
              "weight": 0.7,
              "status": "info",
              "score": 1,
              "detail": "Font size was not measured; computed styles and external CSS are not evaluated in this check.",
              "assessment": "not-tested"
            },
            {
              "id": "valueProp",
              "label": "Clear headline / value prop",
              "weight": 0.9,
              "status": "fail",
              "score": 0,
              "detail": "No H1 headline to anchor the page.",
              "recommendation": "Lead with a clear, benefit-driven headline that states what you offer.",
              "assessment": "heuristic"
            },
            {
              "id": "hierarchy",
              "label": "Visual hierarchy",
              "weight": 0.8,
              "status": "warn",
              "score": 0,
              "detail": "0 section heading(s) and 0 image(s) establish rhythm.",
              "recommendation": "Use headings, imagery and whitespace to create a scannable hierarchy.",
              "assessment": "heuristic"
            },
            {
              "id": "polish",
              "label": "Tab/brand polish",
              "weight": 0.3,
              "status": "warn",
              "score": 0.5,
              "detail": "Favicon + descriptive title give a polished browser-tab presence.",
              "recommendation": "Add a favicon for a polished, trustworthy tab presence.",
              "assessment": "heuristic"
            },
            {
              "id": "clicksToContact",
              "label": "Contact reachable in ≤1 click",
              "weight": 1.6,
              "status": "info",
              "score": 0,
              "detail": "Estimated no click(s) to contact — no contact path found from this page. This conversion check is not required for the inferred page purpose.",
              "evidence": {
                "clicks": 99
              },
              "assessment": "not-applicable"
            },
            {
              "id": "colorConsistency",
              "label": "Disciplined colour palette",
              "weight": 1.1,
              "status": "pass",
              "score": 1,
              "detail": "3 distinct colours used in inline/embedded styles.",
              "evidence": {
                "colors": 3
              },
              "assessment": "heuristic"
            },
            {
              "id": "typeScale",
              "label": "Consistent type scale",
              "weight": 1,
              "status": "info",
              "score": 1,
              "detail": "No inline font sizes to assess.",
              "evidence": {
                "fontSizes": 0,
                "fontFamilies": 0
              },
              "assessment": "not-applicable"
            },
            {
              "id": "fontDiscipline",
              "label": "Limited font families",
              "weight": 0.7,
              "status": "info",
              "score": 1,
              "detail": "0 distinct font families.",
              "assessment": "not-applicable"
            },
            {
              "id": "buttonConsistency",
              "label": "Consistent button styling",
              "weight": 1,
              "status": "info",
              "score": 1,
              "detail": "0 visually-distinct button/CTA styles detected.",
              "assessment": "not-applicable"
            },
            {
              "id": "spacingScale",
              "label": "Consistent spacing scale",
              "weight": 0.7,
              "status": "pass",
              "score": 1,
              "detail": "1 distinct margin/padding/gap values.",
              "assessment": "heuristic"
            },
            {
              "id": "importantAbuse",
              "label": "No !important abuse",
              "weight": 0.5,
              "status": "pass",
              "score": 1,
              "detail": "0 !important declaration(s).",
              "assessment": "observed"
            },
            {
              "id": "aboveFold",
              "label": "Opening content signals (HTML estimate)",
              "weight": 1.2,
              "status": "info",
              "score": 0,
              "detail": "Hero has headline:✗ supporting text:✗ CTA:✗. This conversion check is not required for the inferred page purpose.",
              "assessment": "not-applicable"
            },
            {
              "id": "trustSignals",
              "label": "Conversion trust signals",
              "weight": 0.9,
              "status": "info",
              "score": 0,
              "detail": "No testimonials, logos, ratings or guarantees detected. This conversion check is not required for the inferred page purpose.",
              "assessment": "not-applicable"
            },
            {
              "id": "classSprawl",
              "label": "Maintainable class system",
              "weight": 0.6,
              "status": "info",
              "score": 1,
              "detail": "0 distinct class names across 14 elements (ratio 0.00).",
              "assessment": "not-applicable"
            },
            {
              "id": "themeColor",
              "label": "Browser chrome themed (theme-color/color-scheme)",
              "weight": 0.3,
              "status": "info",
              "score": 1,
              "detail": "theme-color ✗, color-scheme ✗.",
              "recommendation": "Add <meta name=\"theme-color\"> to tint browser chrome to your brand, and <meta name=\"color-scheme\"> so dark-mode users don't get a white flash before CSS loads.",
              "assessment": "not-applicable"
            },
            {
              "id": "manifest",
              "label": "Web app manifest",
              "weight": 0.3,
              "status": "info",
              "score": 1,
              "detail": "No web app manifest (optional: controls name/icon/colours when users install or pin the site).",
              "recommendation": "Add a manifest.json with name, icons and theme colours, linked via <link rel=\"manifest\">.",
              "assessment": "not-applicable"
            },
            {
              "id": "serviceWorker",
              "label": "Service worker (offline/cache layer)",
              "weight": 0.4,
              "status": "info",
              "score": 1,
              "detail": "No service worker detected (optional: only worth adding for app-like sites that benefit from offline/installable behaviour).",
              "assessment": "not-applicable"
            }
          ],
          "summary": "Scored 50/100 across 13 UI/UX & conversion checks — including click-depth to contact, design-token consistency, above-the-fold pitch and trust signals that most graders ignore."
        },
        {
          "key": "dataTracking",
          "label": "Data & Tracking",
          "weight": 0.8,
          "score": 85,
          "grade": "B",
          "scoreAvailable": true,
          "coverage": {
            "scored": 6,
            "observed": 6,
            "heuristic": 0,
            "notTested": 2,
            "notApplicable": 5
          },
          "checks": [
            {
              "id": "hasAnalytics",
              "label": "Web analytics installed",
              "weight": 2.4,
              "status": "info",
              "score": 0,
              "detail": "No recognized client-side analytics detected. The page may intentionally omit analytics or measure activity server-side; no score penalty.",
              "recommendation": "If measurement is needed, verify your server-side or client-side setup against your goals; analytics is optional for this score.",
              "evidence": {
                "analytics": [],
                "tagManager": false
              },
              "assessment": "not-tested"
            },
            {
              "id": "conversionTracking",
              "label": "Conversion / marketing tracking",
              "weight": 1.2,
              "status": "info",
              "score": 1,
              "detail": "No advertising/marketing pixels — fine for a privacy-first site (only needed if you run paid acquisition).",
              "recommendation": "If you run paid acquisition, add the relevant pixels (Meta, Google Ads, LinkedIn) to measure ROI.",
              "assessment": "not-applicable"
            },
            {
              "id": "tagManager",
              "label": "Tag governance",
              "weight": 0.8,
              "status": "info",
              "score": 1,
              "detail": "Few tags; a manager is optional at this scale.",
              "assessment": "not-applicable"
            },
            {
              "id": "consent",
              "label": "Tracking and consent markup",
              "weight": 2,
              "status": "info",
              "score": 1,
              "detail": "No recognized profiling trackers; consent requirements were not assessed.",
              "evidence": {
                "consent": []
              },
              "assessment": "not-tested"
            },
            {
              "id": "privacyPolicy",
              "label": "Privacy policy link",
              "weight": 0.8,
              "status": "warn",
              "score": 0.5,
              "detail": "No privacy policy link found.",
              "recommendation": "Link to a privacy/cookie policy — it's legally required when you collect data and builds trust.",
              "assessment": "observed"
            },
            {
              "id": "trackerCount",
              "label": "Reasonable tracker count",
              "weight": 0.9,
              "status": "pass",
              "score": 1,
              "detail": "0 distinct tracking tool(s) detected.",
              "evidence": {
                "vendors": []
              },
              "assessment": "observed"
            },
            {
              "id": "duplicateAnalytics",
              "label": "No duplicate analytics",
              "weight": 0.6,
              "status": "pass",
              "score": 1,
              "detail": "0 GA4 property.",
              "assessment": "observed"
            },
            {
              "id": "piiLeak",
              "label": "No PII in tracking/URLs",
              "weight": 1,
              "status": "pass",
              "score": 1,
              "detail": "No obvious PII in tracking calls or URLs.",
              "assessment": "observed"
            },
            {
              "id": "gpcDnt",
              "label": "Honours GPC / Do-Not-Track",
              "weight": 0.4,
              "status": "info",
              "score": 1,
              "detail": "No consent-requiring tracking to gate — GPC/DNT not applicable.",
              "assessment": "not-applicable"
            },
            {
              "id": "firstPartyTagging",
              "label": "First-party / server-side tagging",
              "weight": 0.4,
              "status": "info",
              "score": 1,
              "detail": "Tagging appears fully client-side/third-party.",
              "assessment": "not-applicable"
            },
            {
              "id": "fingerprinting",
              "label": "No covert fingerprinting",
              "weight": 0.6,
              "status": "pass",
              "score": 1,
              "detail": "No device-fingerprinting libraries detected.",
              "assessment": "observed"
            },
            {
              "id": "cookiePolicy",
              "label": "Cookie policy / settings link",
              "weight": 0.4,
              "status": "info",
              "score": 1,
              "detail": "No dedicated cookie policy/settings link.",
              "assessment": "not-applicable"
            },
            {
              "id": "trackerPlacement",
              "label": "Trackers load non-blocking",
              "weight": 0.4,
              "status": "pass",
              "score": 1,
              "detail": "Tracking tags load async/deferred.",
              "assessment": "observed"
            }
          ],
          "summary": "Scored 85/100. Detected 0 tool(s) across 6 checks — including consent ordering, PII leakage, fingerprinting and duplicate-property detection."
        },
        {
          "key": "security",
          "label": "Security",
          "weight": 1.05,
          "score": 50,
          "grade": "E",
          "scoreAvailable": true,
          "coverage": {
            "scored": 12,
            "observed": 12,
            "heuristic": 0,
            "notTested": 1,
            "notApplicable": 6
          },
          "checks": [
            {
              "id": "https",
              "label": "Served over HTTPS",
              "weight": 3,
              "status": "pass",
              "score": 1,
              "detail": "The final URL is served over HTTPS.",
              "assessment": "observed"
            },
            {
              "id": "hsts",
              "label": "HSTS header",
              "weight": 1.4,
              "status": "warn",
              "score": 0,
              "detail": "No HSTS header.",
              "recommendation": "Set Strict-Transport-Security: max-age=31536000; includeSubDomains; preload.",
              "assessment": "observed"
            },
            {
              "id": "csp",
              "label": "Content Security Policy",
              "weight": 1.5,
              "status": "warn",
              "score": 0.2,
              "detail": "No Content-Security-Policy.",
              "recommendation": "Add a Content-Security-Policy (start in report-only mode) to mitigate XSS.",
              "assessment": "observed"
            },
            {
              "id": "xcto",
              "label": "X-Content-Type-Options: nosniff",
              "weight": 0.8,
              "status": "warn",
              "score": 0.5,
              "detail": "Missing X-Content-Type-Options: nosniff.",
              "recommendation": "Add X-Content-Type-Options: nosniff to stop MIME sniffing.",
              "assessment": "observed"
            },
            {
              "id": "clickjacking",
              "label": "Clickjacking protection",
              "weight": 1,
              "status": "warn",
              "score": 0.5,
              "detail": "No clickjacking protection.",
              "recommendation": "Set X-Frame-Options: SAMEORIGIN or a CSP frame-ancestors directive.",
              "assessment": "observed"
            },
            {
              "id": "referrerPolicy",
              "label": "Referrer-Policy",
              "weight": 0.6,
              "status": "warn",
              "score": 0.5,
              "detail": "No Referrer-Policy.",
              "recommendation": "Set Referrer-Policy: strict-origin-when-cross-origin to avoid leaking URLs.",
              "assessment": "observed"
            },
            {
              "id": "permissionsPolicy",
              "label": "Permissions-Policy",
              "weight": 0.5,
              "status": "info",
              "score": 1,
              "detail": "No Permissions-Policy (recommended).",
              "recommendation": "Add a Permissions-Policy to disable unused features (camera, geolocation…).",
              "assessment": "not-applicable"
            },
            {
              "id": "crossOrigin",
              "label": "Cross-origin policies (COOP/CORP)",
              "weight": 0.5,
              "status": "info",
              "score": 1,
              "detail": "COOP: —, CORP: —.",
              "recommendation": "Consider Cross-Origin-Opener-Policy and Cross-Origin-Resource-Policy to harden isolation.",
              "assessment": "not-applicable"
            },
            {
              "id": "disclosure",
              "label": "No stack/version disclosure",
              "weight": 0.6,
              "status": "pass",
              "score": 1,
              "detail": "No obvious version disclosure.",
              "assessment": "observed"
            },
            {
              "id": "mixedContent",
              "label": "No mixed content",
              "weight": 1,
              "status": "pass",
              "score": 1,
              "detail": "No insecure http resources on an https page.",
              "assessment": "observed"
            },
            {
              "id": "dangerousJs",
              "label": "No obvious dangerous JS sinks",
              "weight": 0.4,
              "status": "pass",
              "score": 1,
              "detail": "No eval/document.write in the served HTML.",
              "assessment": "observed"
            },
            {
              "id": "securityTxt",
              "label": "security.txt published",
              "weight": 0.4,
              "status": "warn",
              "score": 0.5,
              "detail": "No security.txt found.",
              "recommendation": "Publish /.well-known/security.txt with a disclosure contact so researchers can report issues responsibly.",
              "assessment": "observed"
            },
            {
              "id": "corsWildcard",
              "label": "No reflexive/wildcard CORS",
              "weight": 0.5,
              "status": "pass",
              "score": 1,
              "detail": "No permissive CORS header on the document.",
              "assessment": "observed"
            },
            {
              "id": "vulnerableDeps",
              "label": "No known-vulnerable libraries",
              "weight": 0.8,
              "status": "pass",
              "score": 1,
              "detail": "No outdated/known-risk client libraries detected.",
              "assessment": "observed"
            },
            {
              "id": "crossOriginIsolation",
              "label": "Cross-origin isolation headers",
              "weight": 0.3,
              "status": "info",
              "score": 1,
              "detail": "No Cross-Origin-Embedder-Policy (needed for full isolation / SharedArrayBuffer).",
              "recommendation": "If you need cross-origin isolation, pair COOP with Cross-Origin-Embedder-Policy.",
              "assessment": "not-applicable"
            },
            {
              "id": "reportingEndpoints",
              "label": "Violation reporting configured",
              "weight": 0.3,
              "status": "info",
              "score": 1,
              "detail": "No Reporting-Endpoints header or CSP report-to — policy violations in the field go unseen.",
              "recommendation": "Add a Reporting-Endpoints header (plus report-to in your CSP) so real-world policy breakage reaches you.",
              "assessment": "not-applicable"
            },
            {
              "id": "trustedTypes",
              "label": "Trusted Types (DOM-XSS defence)",
              "weight": 0.3,
              "status": "info",
              "score": 1,
              "detail": "No require-trusted-types-for CSP directive (optional hardening against DOM-based XSS).",
              "recommendation": "Consider CSP `require-trusted-types-for 'script'` to neutralise DOM-based XSS at innerHTML-style sinks.",
              "assessment": "not-applicable"
            },
            {
              "id": "caaRecords",
              "label": "CAA records restrict cert issuance",
              "weight": 0.5,
              "status": "info",
              "score": 0,
              "detail": "DNS lookup unavailable — couldn't verify CAA records.",
              "assessment": "not-tested"
            },
            {
              "id": "digestFields",
              "label": "Digest Fields (RFC 9530)",
              "weight": 0.2,
              "status": "info",
              "score": 0,
              "detail": "No Repr-Digest/Content-Digest header (RFC 9530 Digest Fields let clients verify response integrity — cutting-edge, mostly for APIs).",
              "assessment": "not-applicable"
            }
          ],
          "summary": "Scored 50/100 across 12 security checks (0 failing) — including CSP hardening, HSTS, security.txt, cookie prefixes, CORS, violation reporting and known-vulnerable-library detection."
        }
      ],
      "topIssues": [
        {
          "dimension": "seo",
          "title": "Exactly one H1",
          "detail": "The page has no <h1>."
        },
        {
          "dimension": "geo",
          "title": "Machine-extractable structured data",
          "detail": "No JSON-LD — AI engines must guess the page's facts and entities."
        },
        {
          "dimension": "security",
          "title": "HSTS header",
          "detail": "No HSTS header."
        },
        {
          "dimension": "security",
          "title": "Content Security Policy",
          "detail": "No Content-Security-Policy."
        },
        {
          "dimension": "accessibility",
          "title": "Landmark regions",
          "detail": "Landmarks present: main:false nav:false header:false footer:false."
        },
        {
          "dimension": "geo",
          "title": "Question-based headings",
          "detail": "No question-style headings (these map directly to user prompts)."
        }
      ],
      "meta": {
        "scoringVersion": "2026-10-06.2",
        "measurementMode": "static",
        "coverage": {
          "scored": 137,
          "observed": 122,
          "heuristic": 20,
          "notTested": 7,
          "notApplicable": 77
        },
        "statusCode": 200,
        "htmlBytes": 2744,
        "transferBytes": 500,
        "loadMs": 200,
        "redirected": false,
        "aiEnabled": false,
        "checksRun": 226
      }
    }
  ]
}
