Agent-readiness — robots.txt Content-Signal, agent-skills index, markdown twins, nginx diff prepared
What was done
1. robots.txt — Content-Signal directive
Added Content-Signal: ai-train=yes, search=yes, ai-input=yes to public/robots.txt. Aligned with Bailey’s AI-visibility strategy (memory feedback_cloudflare_managed_robots_off): we want AI training corpora and AI assistants to use the public site, not opt out. A comment in the file warns future maintainers not to flip ai-train to no without revisiting the strategy.
2. /.well-known/agent-skills/ — discovery index + four skill docs
Created public/.well-known/agent-skills/ with:
site-navigation.md— top-level sections, search, markdown twins, Bailey’s scope (phases 2/6/9 explicitly out)contact-bailey.md— phone, email, address, contact-form?topic=variants, what to send for a project inquiryservice-area-research.md— 25-city × 6-county coverage map, URL pattern, Murphy unincorporated noteclient-page-access-info.md—/clients/is mostly public; one subpath is HTTP-basic-auth gated; what an agent should do on 401index.json— discovery index with$schema,description,publisher,updated, and askillsarray. Each skill entry hasname,type,description,url,sha256. SHA-256 digests computed via PowerShellGet-FileHashand verified against file contents.schema.json— minimal JSON Schema (draft 2020-12) describing the index format. Honest about being a non-standard convention promoted by isitagentready.com, not an IANA-registered or RFC-defined format.
3. Markdown twins for five landing pages
Hand-curated, AI-agent-optimized markdown summaries (not 1:1 mirrors of HTML):
public/index.md— homepage twinpublic/about.mdpublic/services.mdpublic/service-areas.mdpublic/contact.md
Updated src/layouts/BaseLayout.astro to emit <link rel="alternate" type="text/markdown" href="/foo.md"> in <head> when the current path matches a hand-curated twin in the markdownTwins allowlist. Pages without a twin do not get the link.
4. Nginx config — diff prepared, NOT applied
Downloaded the live config to .tmp/nginx-edit/baileyengineers.com.live. Drafted .tmp/nginx-edit/baileyengineers.com.proposed with two additions:
types { text/markdown md; }+include /etc/nginx/mime.types;so.mdtwins serve astext/markdown; charset=utf-8in browsers (default mime.types doesn’t map.md). The re-include is required because nginx’stypes {}block in a server context replaces — not extends — the inherited types map.add_header Link "</.well-known/agent-skills/index.json>; rel=\"service-desc\"; type=\"application/json\"";at server level so every response advertises the agent-skills index. RFC 8288 / RFC 8631;service-descis the IANA-registered relation for a machine-readable service description.
The diff preserves every existing block: 30+ legacy /development-data* redirects, the basic-auth block for /clients/site_evaluation_eagle_2026_05_04/, error_page 404, default try_files, root, index, and absolute_redirect off. The diff has not been applied. Per memory reference_production_hosting, nginx config edits are non-routine and require explicit approval.
5. Built and verified locally
Ran npm run build — 200 pages built clean. Verified in dist/:
robots.txtincludes the new Content-Signal directive.well-known/agent-skills/contains all 6 files (4 skill .md, schema.json, index.json)- 5 markdown twins present at site root
<link rel="alternate" type="text/markdown">emitted on/,/about/,/services/,/service-areas/,/contact/and absent on a sample non-twin page (/privacy/)
Deploy outcome
Approved by Ryan and shipped same-session.
Nginx config: applied via the safe-edit pattern. Backup captured at /etc/nginx/sites-available/baileyengineers.com.bak-20260505-171611 before the edit. Two real changes ended up in the final diff:
- Server-level
add_header Link '</.well-known/agent-skills/index.json>; rel="service-desc"; type="application/json"' always;— thealwaysflag ensures the header rides on 4xx/5xx responses too (verified on the basic-auth 401, see smoke tests below). - Surgical
location ~* \.md$ { default_type text/markdown; charset_types text/markdown; charset utf-8; }— replaces my first-passtypes {}+ re-include approach. Provably can’t touch any other MIME mapping becausedefault_typeonly fires when there’s no extension match in the inheritedmime.types, and the stockmime.typeshas no.mdentry.
nginx -t passed; systemctl reload nginx clean.
Dist deploy: SCP’d dist/ to /var/www/baileyengineers.com/, ran chown/chmod sweep, nginx -t clean. Note: the deploy hit a known-but-not-yet-documented SCP gotcha — scp -r dist\* dst/ silently drops dot-prefixed entries (.well-known/, .htaccess) because the local shell glob expansion skips dotfiles. First-round smoke test caught the missing /.well-known/agent-skills/index.json (404). Fixed with a follow-up scp -r dist\.well-known dst/ plus a chown/chmod sweep on the new directory. Memory reference_production_hosting.md updated with the canonical fix: use dist\. instead of dist\*.
Smoke tests — all green via https://baileyengineers.com/
| # | Check | Result |
|---|---|---|
| 1 | robots.txt contains Content-Signal: ai-train=yes, search=yes, ai-input=yes | PASS |
| 2 | Link: </.well-known/agent-skills/index.json>; rel="service-desc"; type="application/json" on / (HEAD) | PASS |
| 3 | /.well-known/agent-skills/index.json → 200, Content-Type: application/json, parses, 4 skills, publisher = “Bailey Engineering” | PASS |
| 4 | All five markdown twins (/index.md, /about.md, /services.md, /service-areas.md, /contact.md) return Content-Type: text/markdown; charset=utf-8 | PASS |
| 4b | /.well-known/agent-skills/site-navigation.md returns Content-Type: text/markdown; charset=utf-8 | PASS |
| 5 | All five HTML pages contain <link rel="alternate" type="text/markdown" href="/foo.md"> | PASS |
| 6 | /clients/ returns 200 (public) | PASS |
| 7 | /clients/site_evaluation_eagle_2026_05_04/ returns 401 with WWW-Authenticate: Basic realm="Bailey Clients" | PASS |
| 7b | Same URL with bailey:BaileyClients-882642 returns 200 | PASS |
| 7c | Link header present on the 401 (confirms always flag working) | PASS |
| 8 | SHA-256 of site-navigation.md as fetched matches the digest in index.json | PASS |
What was intentionally deferred
Per ask-revised.md, the following are not implemented because no backing service exists. Publishing empty/placeholder versions would either misrepresent the site or violate the relevant spec:
/.well-known/api-catalog(RFC 9727) — no public APIs- OAuth 2.0 Authorization Server Metadata — no auth server
- OAuth 2.0 Protected Resource Metadata — no protected resources
- OpenID Connect Discovery — no OIDC provider
- MCP Server Card — no MCP endpoint
- WebMCP / browser-side agent tools — speculative; no clear safe scope
Each can be revisited if/when Bailey ships a real corresponding service.
How to test (after nginx diff is approved + applied)
Run via the Cloudflare-fronted hostname, not origin IP:
# Content-Signal in robots.txt
curl -s https://baileyengineers.com/robots.txt | grep -i content-signal
# Link header (only after nginx diff is applied)
curl -sI https://baileyengineers.com/ | grep -i '^link:'
# Agent skills index
curl -s https://baileyengineers.com/.well-known/agent-skills/index.json | jq .
# Skill files resolve and Content-Type is text/markdown
curl -sI https://baileyengineers.com/.well-known/agent-skills/site-navigation.md | grep -i content-type
# Markdown twins resolve as text/markdown (only after nginx diff is applied)
curl -sI https://baileyengineers.com/index.md | grep -i content-type
curl -sI https://baileyengineers.com/about.md | grep -i content-type
# HTML page advertises markdown alternate
curl -s https://baileyengineers.com/about/ | grep 'rel="alternate".*text/markdown'
Until the nginx diff lands, .md files will serve from the origin without a Content-Type: text/markdown header — most browsers will offer a download dialog instead of rendering. The agent-skills index and skill .md files will still resolve, just without the Link discovery header at the root.
Files affected
Created:
public/.well-known/agent-skills/site-navigation.mdpublic/.well-known/agent-skills/contact-bailey.mdpublic/.well-known/agent-skills/service-area-research.mdpublic/.well-known/agent-skills/client-page-access-info.mdpublic/.well-known/agent-skills/index.jsonpublic/.well-known/agent-skills/schema.jsonpublic/index.mdpublic/about.mdpublic/services.mdpublic/service-areas.mdpublic/contact.md.tmp/nginx-edit/baileyengineers.com.live(downloaded baseline; not deployed).tmp/nginx-edit/baileyengineers.com.proposed(draft; not deployed)src/content/devlog/2026-05-05-agent-readiness.md(this file)
Modified:
public/robots.txt— added Content-Signal directivesrc/layouts/BaseLayout.astro— addedmarkdownTwinsmap and conditional<link rel="alternate">emission
Not modified (pending approval):
/etc/nginx/sites-available/baileyengineers.comon productiondist/not deployed; SCP step not run