Name the answer-engine crawlers, and ship the territory as well as the map - #82
Merged
Conversation
…ory as well as the map Two discovery gaps the 2026-09-04 audit itemized, both entirely in our hands. ROBOTS.TXT. Every one of the 27 crawlers the audit checks was already permitted by the wildcard -- nothing was blocked, nothing was missing -- and it still marked the file down for never naming them. So the answer-engine crawlers are now named individually, each with the same `Allow: /` the wildcard already gave. Worth being explicit about why this is not redundant noise: a crawler obeys the most specific group that names it and ignores every other group, so a named block REPLACES the wildcard rather than adding to it. Each one has to be complete on its own, and each one is. Access is unchanged. What changes is that a reader gets an answer instead of an inference. The maintenance cost is stated in the file rather than discovered later: every crawler named is one this file has to keep current, and a crawler that renames itself falls back to the wildcard, which still allows it. The failure mode is a stale comment, not a blocked crawler. LLMS.TXT. The convention pairs a map with the territory, and we shipped only the map. /llms-full.txt now expands every page into one plain-text document -- 2,115 words, 13 sections -- so a retrieval system can take the substance in one request instead of fetching eight HTML pages and stripping markup from each. Derived from the copy deck like everything else here, which is what makes it safe: it has no content of its own and cannot make a claim the site does not. /llms.txt gains the `## Optional` section the convention defines -- a named section meaning "skip these if context is short" -- pointing at llms-full.txt, the three /ai/ endpoints and the privacy policy. Privacy moved into it from the main list, where it was competing with pages someone screening an expert actually reads first. The privacy policy is linked, not inlined. It is long, it is shared with sites/www, and a model summarizing a legal commitment out of a flattened copy is worse than sending the reader to the authoritative page. `astro check` still reports the same 2 pre-existing errors in scope.astro. No new ones. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01CpEXBMByKmpV1f9G7UUZhF
This was referenced Sep 5, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
The two gaps from the root-page audit that need no copy decisions and no waiting on external profiles. Worth 9 points on paper; the real argument for each is below.
robots.txt — explicit crawler blocks
The audit's own detail said
bots_missing: [],bots_blocked: [],citation_bots_ok: true. Every one of the 27 crawlers it checks was already permitted. The single miss wascitation_bots_explicit: false— we served oneUser-agent: *block and never named anyone.So the answer-engine crawlers are now named individually — OpenAI, Anthropic, Perplexity, Google, Bing, Apple — each with the same
Allow: /the wildcard already gave.This is not redundant noise, and the file says why. A crawler obeys the most specific group that names it and ignores every other group, the wildcard included. A named block therefore replaces
User-agent: *for that crawler rather than adding to it, which means each block has to be complete on its own. Each is. Access is unchanged in both directions — nothing granted, nothing withdrawn.The maintenance cost is written into the file rather than left to be discovered: every crawler named is one this file has to keep current, and a crawler that renames itself falls back to the wildcard, which still allows it. The failure mode is a stale comment, not a blocked crawler. If that ever stops being true, delete the blocks and keep the wildcard.
llms.txt — the missing half
The convention pairs a map with the territory. We shipped the map.
New
/llms-full.txt— every page expanded into one plain-text document, 2,115 words across 13 sections, so a retrieval system can take the substance in one request instead of fetching eight HTML pages and stripping markup from each. Generated from the copy deck like everything else here, which is what makes it safe to ship: it has no content of its own, so it cannot make a claim the site does not make./llms.txtgains## Optional— a defined section name in the convention, not a label of our choosing. It means "skip these if the context window is short." It points at llms-full.txt, the three/ai/endpoints, and the privacy policy.Privacy moved into
## Optionalfrom the main page list, where it was competing for attention with pages someone screening an expert actually reads first.The privacy policy is linked, not inlined. It is long, it is shared with
sites/www, and a model summarizing a legal commitment out of a flattened copy is a worse outcome than sending the reader to the authoritative page. Same reasoning excludes the intake form: a form is an action, not a document.One fix found while building: the testimony-record criterion carries an optional link, and its copy is written to run into it ("Not buried:"). In plain text that left a line hanging on a colon, so the href is resolved and appended — the text equivalent of the anchor the page renders.
Verification
yarn buildclean;/llms-full.txtand/llms.txtboth emitted.astro checkreports the same 2 pre-existing errors inscope.astroand no new ones.Score movement is unverified until this deploys — the audit reads production.
Not in this PR
The remaining root-page gaps need copy decisions or things that do not exist yet: front-loading and outbound links (−4, copy), an author signal (−1), RSS (−2, needs the blog), Crunchbase and an
/aboutlink (Brand & Entity), andareaServed, which is still the deliberate omission #77 was going to re-price.🤖 Generated with Claude Code
https://claude.ai/code/session_01CpEXBMByKmpV1f9G7UUZhF