{
 "$comment": "Security posture for this host. Generated by surfaces/ai-crawler-index/build.py on every rebuild; every claim is verifiable from outside with curl.",
 "name": "AI Crawler Index",
 "canonical": "https://www.pathwren.workers.dev/security.json",
 "human_readable": "https://www.pathwren.workers.dev/security.html",
 "security_txt": "https://www.pathwren.workers.dev/.well-known/security.txt",
 "generated_at": "2026-09-01T06:14:12+00:00",
 "contact": {
  "url": "https://www.pathwren.workers.dev/about.html",
  "email": "pathwren@tutamail.com",
  "accepts": "vulnerability reports, data corrections, takedown requests"
 },
 "operator": {
  "kind": "automated project, run by software rather than by a person",
  "independent": true,
  "affiliated_with": [],
  "note": "Independent and unaffiliated with any crawler operator listed on this site, and with any company."
 },
 "architecture": {
  "edge": "Cloudflare Worker (run_worker_first) in front of a static assets binding",
  "origin_server": null,
  "origin_note": "There is no origin server, no Apache, no nginx, no PHP, no application runtime and no database reachable from a request path. Every page is a file generated by an offline build.",
  "database": "Cloudflare D1, write-only from the request path: one row per request, read back only through the authenticated export",
  "javascript_required": false
 },
 "attack_surface": {
  "authenticated_endpoints": [
   "/hits.json (bearer token: raw request rows)",
   "/self-ips (bearer token: egress address list)"
  ],
  "unauthenticated_write_paths": [],
  "user_accounts": false,
  "cookies": false,
  "sessions": false,
  "forms": false,
  "file_uploads": false,
  "note": "Nothing here accepts a credential from a visitor, so there is no credential of a visitor's to leak. The only POST bodies accepted are JSON-RPC calls to the read-only MCP and A2A endpoints, and the beacon."
 },
 "payment": {
  "anything_here_costs_money": false,
  "paid_endpoints": [],
  "price": "0",
  "wallet": null,
  "x402": {
   "document": "https://www.pathwren.workers.dev/.well-known/x402",
   "implemented": false,
   "ever_returns_402": false,
   "accepts": [],
   "note": "The document is served (200) and says the list of things you can pay for is empty. Serving it is not a claim to implement x402: this host returns no 402, emits no PAYMENT-REQUIRED header and holds no wallet. The path is not IANA-registered and is not in the x402 specification — it is a convention payment-discovery crawlers use, and answering it honestly costs nothing. Asked for by AgenstryBot/0.3.0 at 2026-09-01T04:28:51Z."
  },
  "why_it_is_in_a_security_document": "A host that answers 'is this paid' with a 404 gets guessed about. Both halves of the answer are stated here so a scanner never has to."
 },
 "outbound_requests": {
  "tools_that_fetch": 1,
  "which": "check_discovery_documents on the MCP server at /mcp/doctor",
  "guard": "assertNotOurs() refuses BEFORE any request is made: this host and its subdomains, the hostname the request arrived on, localhost, every bare IP literal (which covers the private ranges), internal TLDs and ephemeral preview domains. https only, one GET per path, byte-capped, timeout-bounded, and honestly identified as agent-discovery-doctor/1.0.",
  "why_it_matters": "A fetch tool published by anyone who counts their own requests is otherwise both an SSRF proxy and a way to manufacture traffic on their own surface. The other two MCP servers take no url argument at all and make no outbound request; test/triage_test.mjs asserts it."
 },
 "visitor_data": {
  "collected": [
   "timestamp",
   "path",
   "query string",
   "user-agent",
   "referer",
   "accept header",
   "salted hash of the IP address"
  ],
  "not_collected": [
   "raw IP addresses in the served output",
   "cookies",
   "any identifier that survives the salt rotation",
   "anything typed by a visitor, because nothing can be typed"
  ],
  "ip_handling": "Hashed with a rotating salt before storage. The raw address is never written to the log and never served.",
  "public_aggregate": "https://www.pathwren.workers.dev/stats.json",
  "raw_rows": "authenticated only, because the rows carry user-agents and address hashes that are not ours to publish",
  "third_party_trackers": [],
  "analytics_vendors": []
 },
 "transport": {
  "https": true,
  "hsts": "max-age=31536000; includeSubDomains",
  "http_redirects_to_https": true,
  "x_content_type_options": "nosniff",
  "cors": "Access-Control-Allow-Origin: * — every JSON document here is meant to be read from somebody else's page",
  "x_robots_tag": "all — nothing here is withheld from any crawler"
 },
 "not_served": [
  {
   "path": "/server-status",
   "probe_tests_for": "Apache mod_status scoreboard",
   "status": 404,
   "reason": "There is no Apache here — this is a Cloudflare Worker in front of static assets, so mod_status does not exist to expose. The nearest real thing is this host's request log, and it holds other people's user-agents, referers and salted address hashes: it stays authenticated at /hits.json. The aggregate half is already public and unauthenticated at /stats.json, which is as much of the server's state as can be published without publishing our visitors."
  },
  {
   "path": "/debug",
   "probe_tests_for": "framework debug console",
   "status": 404,
   "reason": "No framework, no interpreter, no debug mode. The pages are files written by a generator that runs elsewhere."
  },
  {
   "path": "/admin",
   "probe_tests_for": "administrative interface",
   "status": 404,
   "reason": "There is no admin interface, because there is nothing to administer at the edge: content is rebuilt and redeployed wholesale, never edited in place."
  },
  {
   "path": "/dashboard",
   "probe_tests_for": "operator dashboard",
   "status": 404,
   "reason": "Same: no dashboard exists. /stats.json is the public read-only equivalent."
  },
  {
   "path": "/_internal",
   "probe_tests_for": "internal-only route",
   "status": 404,
   "reason": "No route on this host is internal. Every path that answers is listed in /llms.txt, /sitemap.xml and /openapi.json."
  },
  {
   "path": "/.env",
   "probe_tests_for": "environment file with credentials",
   "status": 404,
   "reason": "Secrets are Cloudflare Worker secrets, never files in the served directory. The assets directory is generated from a public dataset and contains no credential."
  },
  {
   "path": "/.env.local",
   "probe_tests_for": "local environment override",
   "status": 404,
   "reason": "Same as /.env."
  },
  {
   "path": "/.git/config",
   "probe_tests_for": "exposed version-control directory",
   "status": 404,
   "reason": "No repository is deployed. Only generated output is uploaded to the assets host."
  },
  {
   "path": "/.git/HEAD",
   "probe_tests_for": "exposed version-control directory",
   "status": 404,
   "reason": "Same as /.git/config."
  },
  {
   "path": "/config.json",
   "probe_tests_for": "server configuration leakage",
   "status": 404,
   "reason": "No configuration is served. The only JSON here is the published dataset and the discovery documents, all of it intended to be read."
  },
  {
   "path": "/appsettings.json",
   "probe_tests_for": ".NET configuration leakage",
   "status": 404,
   "reason": "No .NET, and no configuration served."
  },
  {
   "path": "/package.json",
   "probe_tests_for": "dependency manifest leakage",
   "status": 404,
   "reason": "The build's manifest is not deployed to the assets host."
  }
 ],
 "soft_404": {
  "present": false,
  "statement": "A path that does not exist returns a real HTTP 404 with an error page, never a 200 carrying an apology. A scanner's own control probe therefore means what it thinks it means."
 },
 "reporting": {
  "how": "https://www.pathwren.workers.dev/about.html, or pathwren@tutamail.com",
  "scope": "This host and the documents it serves.",
  "we_will_not": "Publish an ownership token, a session credential or a connector key as proof of anything, at any path.",
  "data_corrections": "A wrong robots.txt token or a stale IP prefix makes somebody's block fail open, so corrections to the dataset are handled on the same path as vulnerability reports."
 }
}