Skip to content

GEO remediation: correct llms.txt, restore the docs link graph, enrich schema - #672

Merged
babltiga merged 2 commits into
mainfrom
fix/AF-geo-website-remediation
Aug 3, 2026
Merged

GEO remediation: correct llms.txt, restore the docs link graph, enrich schema#672
babltiga merged 2 commits into
mainfrom
fix/AF-geo-website-remediation

Conversation

@babltiga

@babltiga babltiga commented Aug 3, 2026

Copy link
Copy Markdown
Contributor

Acts on a GEO (Generative Engine Optimization) audit of https://accessflow.bablsoft.com/65/100. Two of the findings are drift against rules already in CLAUDE.md, not new advice.

Score before

Criterion (weight) Score Evidence
Technical accessibility (20%) 92 Static HTML = inherent SSR; live 200 to a GPTBot UA; robots/sitemap/canonical/OG/HSTS/CSP all present
Structural readability (20%) 70 Clean H1→H2→H3 and per-page ToC, but 0 question-form headings and 2 <table> across 13 pages
Citability (25%) 55 Good What it is. pattern in docs; no Q&A, no glossary, no citable statistics
Authority & brand (20%) 45 No sameAs, no datePublished, no rendered date anywhere
Multi-modal (15%) 65 18 images at 100% alt coverage; no video

Platform split: Google AI Overviews ~62 · AI Mode ~58 · Bing Copilot ~60 · ChatGPT ~35 · Perplexity ~30. The ChatGPT/Perplexity gap is entirely off-site (they cite Wikipedia 47.9% / Reddit 46.7%) and is out of scope here — no code change moves it.

The two defects

llms.txt misstated the product. It is the file AI crawlers ground on, and it never mentioned Snowflake, BigQuery or Databricks — 12 homepage mentions each — omitted the WAREHOUSE family entirely, and listed only /docs/ instead of the twelve rendered chapter URLs, so a crawler reading it could not reach the chapters at all. An AI system answering "does AccessFlow support Snowflake?" from this file got it wrong.

The docs link graph was broken. All 12 docs pages linked the hub as href="index.html". Cloudflare 307-redirects …/index.html to the directory (verified live: /docs/configuration/ai/index.html307), so on the 11 sub-directory pages these were self-referential redirect hops — and /docs/ had zero inbound internal links from any chapter. CLAUDE.md already bans this ("never ../index.html, which costs a 307 redirect hop"); the docs sidebar ToC gets it right with absolute paths, so this was drift.

What changed

Before After
llms.txt warehouse engines absent Snowflake, BigQuery, Databricks + WAREHOUSE family
llms.txt docs links 1 (/docs/) 12 rendered chapter URLs
Stale href="index.html" 36 0
Question-form headings 0 18
<table> elements 2 4
Rendered dates none all 12 docs pages
Organization.sameAs absent present (verified URLs only)

Schema: Organization gained sameAs / description / foundingDate; SoftwareApplication gained featureList, softwareRequirements, downloadUrl, installUrl, softwareHelp, isAccessibleForFree, datePublished; a new WebPage node dates the homepage itself; every TechArticle gained datePublished + articleSection.

New content: a homepage Common questions section (6 Q&As, wired into nav + footer on all 13 pages), an 18-engine matrix in the connectors chapter (engine / family / query language / row-security / install), and a review-plan settings table.

Deliberate non-goals

  • No FAQPage schema. Google retired FAQ rich results for all sites in May 2026 — the Q&A ships as content only. No HowTo either (deprecated 2023).
  • sameAs lists only the two URLs that return 200 (GitHub org + repo). No invented LinkedIn/X/Wikidata entries — those become real sameAs targets once the profiles exist.
  • No aggregateRating — there are no real ratings to cite.
  • No new URLs. A /docs/faq/ page would have needed wiring into docs.ts, LEGACY_DOCS_ANCHORS, sitemap.xml and the hub nav, and would start with no ranking history. ~44% of AI citations come from the first 30% of a page, so the homepage was the better host.
  • Off-site entity presence (Wikidata, Reddit, YouTube, LinkedIn) and IndexNow are not in this PR. They are what actually move ChatGPT/Perplexity, and they are not code.

Second commit: the guards did not cover this

79dbb8a7 is a one-line paths-filter fix. The four guards protecting website/ live in the frontend suite — CSP script hash, cross-chapter nav/footer consistency, security.txt expiry, and the docs anchor contract — but the frontend job only matched frontend/**. A website-only PR skipped the job and shipped past every one of them, including the guard added in #670 to catch exactly this kind of drift. This PR would itself have gone unverified.

Verification

frontend/src/config/__tests__/55/55 pass, including all four website guards. Plus, across all 13 pages: 0 stale index.html links, every JSON-LD block parses, every file tag-balanced, every meta description ≤160 rendered chars, rendered <time> / JSON-LD dateModified / sitemap.xml <lastmod> all consistent, and the CSP inline-script hash byte-identical in both files and matching _headers.

Needs a human after deploy

  1. curl -sSI https://accessflow.bablsoft.com/docs/configuration/ai/200, and nothing on the site should link the …/index.html form that returns 307. Only verifiable post-deploy.
  2. Paste the homepage and one docs page into Google's Rich Results Test to confirm the enriched graph parses server-side.

One unresolved discrepancy (not fixed here)

The homepage roadmap lists automated sensitive-data discovery under Planned, while CLAUDE.md documents it as a shipped module (AF-623) with a full env-var reference. I kept it out of llms.txt rather than overstate the product. One of the two sources needs correcting — that is a content decision, not an SEO one.

llms.txt never mentioned Snowflake, BigQuery or Databricks, omitted the
WAREHOUSE engine family, and listed only /docs/ instead of the twelve
rendered chapter URLs - so AI crawlers grounding on it answered warehouse
questions wrongly and could not reach the chapters.

All twelve docs pages linked the hub as href="index.html", which Cloudflare
307-redirects to the directory. On the eleven sub-directory pages those were
self-redirects, leaving /docs/ with no inbound internal links.

Also enrich the JSON-LD graph (Organization sameAs/description/foundingDate,
SoftwareApplication featureList and install metadata, a WebPage node,
datePublished on every TechArticle), render a Last updated date on each docs
page, add question-form headings with self-contained answers, tabulate the
engine matrix and review-plan settings, and add a homepage Common questions
section. No FAQPage schema - Google retired FAQ rich results in May 2026.
The four guards protecting website/ live in the frontend suite — the CSP
script hash, cross-chapter nav/footer consistency, security.txt expiry, and
the docs anchor contract. The frontend job's paths-filter only matched
frontend/**, so a PR touching website/ alone skipped the job and shipped
past every guard, including the one added to catch exactly that drift.
@github-actions

github-actions Bot commented Aug 3, 2026

Copy link
Copy Markdown
Contributor

Frontend Test Results

1 327 tests  ±0   1 327 ✅ ±0   4m 45s ⏱️ +17s
  173 suites ±0       0 💤 ±0 
    1 files   ±0       0 ❌ ±0 

Results for commit 79dbb8a. ± Comparison against base commit c1b158e.

@github-actions

github-actions Bot commented Aug 3, 2026

Copy link
Copy Markdown
Contributor

Coverage Report for Frontend Coverage (frontend)

Status Category Percentage Covered / Total
🟢 Lines 93.83% (🎯 90%) 2087 / 2224
🟢 Statements 91.82% (🎯 90%) 2324 / 2531
🟢 Functions 90.98% (🎯 90%) 636 / 699
🟢 Branches 83.59% (🎯 80%) 1310 / 1567
File CoverageNo changed files found.
Generated in workflow #857 for commit 79dbb8a by the Vitest Coverage Report Action

@github-actions

github-actions Bot commented Aug 3, 2026

Copy link
Copy Markdown
Contributor

Backend Test Results

5 592 tests   5 592 ✅  17m 36s ⏱️
  695 suites      0 💤
  695 files        0 ❌

Results for commit 79dbb8a.

@github-actions

github-actions Bot commented Aug 3, 2026

Copy link
Copy Markdown
Contributor

Backend Code Coverage

Overall Project 93.17% 🍏

There is no coverage information present for the Files changed

@babltiga
babltiga merged commit 7901c36 into main Aug 3, 2026
34 checks passed
@babltiga
babltiga deleted the fix/AF-geo-website-remediation branch August 3, 2026 12:13
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant