DeployFound

The fix cycle, proven in public

This page is rendered straight from the DeployFound database, every time it is loaded. Nothing here is a screenshot or a claim typed up after the fact. It shows the most recent audit of sidehud.com, and a complete fix cycle on a demo host we control: a problem planted on purpose, a fix proposed, approved, deployed, verified by a fresh crawl, rolled back to prove it reverses, and deployed again to end in the fixed state.

One honesty note before the details. On a customer zone, the fix below removes a firewall ruleset rule that blocks an AI bot. When this demo was built, our demo account token did not carry firewall ruleset permission, so on our own demo host the same block is held in an edge configuration flag. The permission was granted later on 29 Oct 2026, and the real ruleset remedy was then live tested on this zone, with its own deployment in the record below. The demo host keeps the flag so this cycle stays self contained. The audit cannot tell the difference, because it judges server behaviour, and neither can the lifecycle: snapshot first, approval before change, verification by re-crawl, rollback from the snapshot.

Step one: the audit of sidehud.com

Audit of https://sidehud.com/, run 2026-10-29T13:14:43.273Z, status complete. Audit id: d589c5d4-6604-4e5f-b71d-b104a74b0cf7.

Step two: the demo host gets audited

Latest audit of https://demo.deployfound.com/, run 2026-10-29T16:01:43.318Z, status complete. Audit id: ae856206-6985-4f26-9a5f-35c7a73dd5c3.

The server_bot_access check reported pass. Server behaviour matches robots.txt for every AI bot tested.

Step three: the deployment record

Every deployment in the database is listed below, newest first. The first cycle is the demo host fix described above. Later entries include test runs from building the dashboard and the accounts system, kept here because a public record that quietly drops its test runs would not be much of a record.

Deploy an llms.txt file

Target: https://example.com/. Door: cloudflare. Current status: approved. Deployment id: f15293b9-4367-4290-ba42-e678d763f23f.

Created 2026-10-30T08:29:23.821Z. Last updated 2026-10-30T08:29:24.476Z. Snapshot: not taken yet.

This site does not serve an llms.txt file today. Deploy an llms.txt file. The deployed file follows the llms.txt specification that Google Lighthouse checks in its Agentic Browsing category. Whether llms.txt influences AI citations is not proven, and DeployFound does not claim it. The file is built only from the site's own facts: its homepage title, its meta description, and its sitemap links. The previous edge state is snapshotted first, and rollback restores it exactly.

Timeline

  1. proposed at 2026-10-30T08:29:23.821Z: Proposed from audit e4b9250a-43fc-444b-b71b-ce0dc2687f3c, finding llms_txt (fail).
  2. approved at 2026-10-30T08:29:24.476Z: Approved by the owner. Nothing has changed yet.
State before (JSON)
{
  "finding": {
    "check_key": "llms_txt",
    "status": "fail",
    "severity": "low",
    "evidence": {
      "present": false,
      "httpStatus": 404,
      "bytes": 577,
      "contentType": "text/html; charset=utf-8",
      "responseBodyKind": "html",
      "servedHtmlInstead": false,
      "hasH1Heading": false,
      "hasBlockquote": false,
      "markdownLinkCount": 0,
      "shapeOk": false,
      "shapeIssues": [],
      "failedRules": [],
      "fetchError": null,
      "note": "No llms.txt found at /llms.txt. The fix deploys a file that follows the llms.txt specification that Google Lighthouse checks in its Agentic Browsing category. Whether llms.txt influences AI citations i ...

Deploy an llms.txt file

Target: https://demo.deployfound.com/. Door: cloudflare. Current status: rolled_back. Deployment id: 0d42a848-a661-4ad2-a601-2b8baf48c950.

Created 2026-10-29T16:00:17.236Z. Last updated 2026-10-29T16:01:41.469Z. Snapshot: deployments/0d42a848-a661-4ad2-a601-2b8baf48c950/snapshot-1793289623673.json.

This site does not serve an llms.txt file today. Deploy an llms.txt file. The deployed file follows the llms.txt specification that Google Lighthouse checks in its Agentic Browsing category. Whether llms.txt influences AI citations is not proven, and DeployFound does not claim it. The file is built only from the site's own facts: its homepage title, its meta description, and its sitemap links. The previous edge state is snapshotted first, and rollback restores it exactly.

Timeline

  1. proposed at 2026-10-29T16:00:17.236Z: Proposed from audit abe9c65c-107c-4371-8cd6-d9b237cd618b, finding llms_txt (info).
  2. approved at 2026-10-29T16:00:18.643Z: Approved by the owner. Nothing has changed yet.
  3. snapshot_saved at 2026-10-29T16:00:24.064Z: Snapshot of the current state saved to R2 at deployments/0d42a848-a661-4ad2-a601-2b8baf48c950/snapshot-1793289623673.json.
  4. change_applied at 2026-10-29T16:00:24.505Z: The fix was applied to the target.
  5. verified at 2026-10-29T16:00:35.389Z: Re-check passed. Observation only. Whether an llms.txt file exists is recorded here. No study shows the file by itself moves AI answers, so DeployFound never counts it as a verified fix. One labeled hygiene add-on can put the file in place, unproven, for owners who want it there.
  6. rollback_snapshot_restored at 2026-10-29T16:00:42.469Z: Snapshot deployments/0d42a848-a661-4ad2-a601-2b8baf48c950/snapshot-1793289623673.json was written back to the target.
  7. rolled_back at 2026-10-29T16:01:41.469Z: Re-check confirms the original problem is back, exactly as the snapshot left it. The deployment is fully reversed.

Latest verification

The re-check at 2026-10-29T16:01:41.469Z reported fail.

Verification evidence (JSON)
{
  "present": false,
  "httpStatus": 200,
  "bytes": 2738,
  "servedHtmlInstead": true,
  "hasH1Heading": false,
  "hasBlockquote": false,
  "markdownLinkCount": 0,
  "fetchError": null,
  "note": "Observation only. Whether an llms.txt file exists is recorded here. No study shows the file by itself moves AI answers, so DeployFound never counts it as a verified fix. One labeled hygiene add-on can put the file in place, unproven, for owners who want it there.",
  "verificationAuditId": "c9a075ec-25f9-40f2-a00b-324f757013f3",
  "auditFindingStatus": "info",
  "presenceVerified": false,
  "specShapeVerified": false,
  "verificationNote": "Verification confirms the llms.txt file is present and s ...
State before (JSON)
{
  "mechanism": "demo_kv",
  "scriptName": "deployfound-llms-demo-deployfound-com",
  "routePattern": "demo.deployfound.com/llms.txt",
  "scriptExisted": false,
  "scriptSource": null,
  "routeExisted": false,
  "routeId": null,
  "routeScript": null
}
State after (JSON)
{
  "mechanism": "demo_kv",
  "scriptName": "deployfound-llms-demo-deployfound-com",
  "routePattern": "demo.deployfound.com/llms.txt",
  "scriptExisted": false,
  "scriptSource": null,
  "routeExisted": false,
  "routeId": null,
  "routeScript": null
}

Stop the bot settings challenging AI crawlers

Target: https://deployfound.com/. Door: cloudflare. Current status: rolled_back. Deployment id: 54884330-5f2a-4ac6-86ca-96856effd728.

Created 2026-10-29T15:58:26.415Z. Last updated 2026-10-29T15:59:44.000Z. Snapshot: deployments/54884330-5f2a-4ac6-86ca-96856effd728/snapshot-1793289512099.json.

The audit found the server answering GPTBot with 403, ClaudeBot with 403 and CCBot with 403, while robots.txt allows GPTBot, ClaudeBot and CCBot. If this zone's bot settings are the cause, this fix turns off the controls that challenge those bots: AI bot protection set to disabled, and Bot Fight Mode off. Nothing else changes. The full bot configuration is snapshotted first, verification re-crawls the site, and rollback restores the configuration exactly as it was.

Timeline

  1. proposed at 2026-10-29T15:58:26.415Z: Proposed from audit f5d2e3ab-e157-4734-a656-a72a0bac3df1, finding server_bot_access (fail).
  2. approved at 2026-10-29T15:58:27.567Z: Approved by the owner. Nothing has changed yet.
  3. snapshot_saved at 2026-10-29T15:58:33.000Z: Snapshot of the current state saved to R2 at deployments/54884330-5f2a-4ac6-86ca-96856effd728/snapshot-1793289512099.json.
  4. change_applied at 2026-10-29T15:58:35.000Z: The fix was applied to the target.
  5. verified at 2026-10-29T15:59:05.000Z: Re-check passed. Server behaviour matches robots.txt for every AI bot tested.
  6. rollback_snapshot_restored at 2026-10-29T15:59:12.000Z: Snapshot deployments/54884330-5f2a-4ac6-86ca-96856effd728/snapshot-1793289512099.json was written back to the target.
  7. rolled_back at 2026-10-29T15:59:24.000Z: Re-check confirms the original problem is back, exactly as the snapshot left it. The deployment is fully reversed.
  8. zone_restored at 2026-10-29T15:59:44.000Z: Operator teardown after the live test cycle: the original bot management configuration was written back and confirmed by read, field for field identical to the pre-test snapshot.

Latest verification

The re-check at 2026-10-29T15:59:24.000Z reported fail.

Verification evidence (JSON)
{
  "perUserAgent": {
    "browser": {
      "status": 200,
      "challenge": false,
      "blocked": false
    },
    "GPTBot": {
      "status": 403,
      "challenge": false,
      "blocked": true
    },
    "ClaudeBot": {
      "status": 403,
      "challenge": false,
      "blocked": true
    },
    "Google-Extended": {
      "status": 200,
      "challenge": false,
      "blocked": false
    },
    "PerplexityBot": {
      "status": 200,
      "challenge": false,
      "blocked": false
    },
    "CCBot": {
      "status": 403,
      "challenge": false,
      "blocked": true
    }
  },
  "mismatches": [
    {
      "bot": "GPTBot",
      "robotsVerdict": "allowed",
      "serverStatus ...
State before (JSON)
{
  "config": {
    "enable_js": false,
    "fight_mode": false,
    "ai_bots_protection": "block",
    "content_bots_protection": "disabled",
    "crawler_protection": "disabled",
    "ai_training": "disallow",
    "ai_search": "disabled",
    "ai_user": "disabled",
    "is_robots_txt_managed": false,
    "bot_preference_sync_enabled": false,
    "cf_robots_variant": "policy_only",
    "ai_bots_migration_opt_out": false,
    "using_latest_model": true
  }
}
State after (JSON)
{
  "config": {
    "enable_js": false,
    "fight_mode": false,
    "ai_bots_protection": "block",
    "content_bots_protection": "disabled",
    "crawler_protection": "disabled",
    "ai_training": "disallow",
    "ai_search": "disabled",
    "ai_user": "disabled",
    "is_robots_txt_managed": false,
    "bot_preference_sync_enabled": false,
    "cf_robots_variant": "policy_only",
    "ai_bots_migration_opt_out": false,
    "using_latest_model": true
  }
}

Disable the firewall rule that blocks AI crawlers

Target: https://demo.deployfound.com/. Door: cloudflare. Current status: verified. Deployment id: 83cacfb4-b361-4121-ae03-d75611edefc5.

Created 2026-10-29T15:53:29.613Z. Last updated 2026-10-29T15:57:22.000Z. Snapshot: deployments/83cacfb4-b361-4121-ae03-d75611edefc5/snapshot-1793289372500.json.

The audit found the server answering GPTBot with a challenge page, while robots.txt allows GPTBot. If a rule in this zone's custom firewall ruleset is the cause, this fix disables only the rules that name those bots, nothing else. The full ruleset is snapshotted first, verification re-crawls the site, and rollback restores the ruleset exactly as it was.

Timeline

  1. proposed at 2026-10-29T15:53:29.613Z: Proposed from audit 6d29715f-85a8-45b4-8e88-1ae60f29e14c, finding server_bot_access (fail).
  2. approved at 2026-10-29T15:53:30.418Z: Approved by the owner. Nothing has changed yet.
  3. snapshot_saved at 2026-10-29T15:53:50.000Z: Snapshot of the current state saved to R2 at deployments/83cacfb4-b361-4121-ae03-d75611edefc5/snapshot-1793289229190.json.
  4. change_applied at 2026-10-29T15:54:27.000Z: The fix was applied to the target.
  5. verified at 2026-10-29T15:54:57.000Z: Re-check passed. Server behaviour matches robots.txt for every AI bot tested.
  6. rollback_snapshot_restored at 2026-10-29T15:55:05.000Z: Snapshot deployments/83cacfb4-b361-4121-ae03-d75611edefc5/snapshot-1793289229190.json was written back to the target.
  7. rolled_back at 2026-10-29T15:56:05.000Z: Re-check confirms the original problem is back, exactly as the snapshot left it. The deployment is fully reversed.
  8. snapshot_saved at 2026-10-29T15:56:13.000Z: Snapshot of the current state saved to R2 at deployments/83cacfb4-b361-4121-ae03-d75611edefc5/snapshot-1793289372500.json.
  9. change_applied at 2026-10-29T15:56:15.000Z: The fix was applied to the target.
  10. verified at 2026-10-29T15:56:34.000Z: Re-check passed. Server behaviour matches robots.txt for every AI bot tested.
  11. fixture_teardown at 2026-10-29T15:56:47.000Z: Operator teardown after the live test cycle: the test firewall rule was removed entirely and the zone entrypoint ruleset deleted, returning the zone to its exact pre-test state (no custom ruleset). The deployment above stays verified as the record of the cycle.
  12. zone_restored at 2026-10-29T15:57:22.000Z: Confirmed by read after teardown: the zone has no custom entrypoint ruleset again and its ruleset list matches the pre-test snapshot exactly.

Latest verification

The re-check at 2026-10-29T15:56:34.000Z reported pass.

Verification evidence (JSON)
{
  "perUserAgent": {
    "browser": {
      "status": 200,
      "challenge": false,
      "blocked": false
    },
    "GPTBot": {
      "status": 200,
      "challenge": false,
      "blocked": false
    },
    "ClaudeBot": {
      "status": 200,
      "challenge": false,
      "blocked": false
    },
    "Google-Extended": {
      "status": 200,
      "challenge": false,
      "blocked": false
    },
    "PerplexityBot": {
      "status": 200,
      "challenge": false,
      "blocked": false
    },
    "CCBot": {
      "status": 200,
      "challenge": false,
      "blocked": false
    }
  },
  "mismatches": [],
  "agreeingBlocks": [],
  "allowedThrough": [
    "GPTBot",
    "ClaudeBot",
 ...
State before (JSON)
{
  "phase": "http_request_firewall_custom",
  "ruleset": {
    "name": "DeployFound zone custom rules",
    "kind": "zone",
    "phase": "http_request_firewall_custom",
    "rules": [
      {
        "action": "block",
        "description": "DeployFound live test fixture 2026-10-29: blocks GPTBot on the demo host only",
        "enabled": true,
        "expression": "(http.host eq \"demo.deployfound.com\" and http.user_agent contains \"GPTBot\")",
        "id": "5562d230c7dc4cbea130ac99af727c86",
        "last_updated": "2026-10-29T15:55:06.821197Z",
        "ref": "5562d230c7dc4cbea130ac99af727c86",
        "version": "3"
      }
    ]
  }
}
State after (JSON)
{
  "phase": "http_request_firewall_custom",
  "ruleset": {
    "name": "DeployFound zone custom rules",
    "kind": "zone",
    "phase": "http_request_firewall_custom",
    "rules": [
      {
        "action": "block",
        "description": "DeployFound live test fixture 2026-10-29: blocks GPTBot on the demo host only",
        "enabled": false,
        "expression": "(http.host eq \"demo.deployfound.com\" and http.user_agent contains \"GPTBot\")",
        "id": "5562d230c7dc4cbea130ac99af727c86",
        "last_updated": "2026-10-29T15:56:16.323428Z",
        "ref": "5562d230c7dc4cbea130ac99af727c86",
        "version": "4"
      }
    ]
  }
}

Inject the missing head elements at the edge

Target: https://deployfound.com/hardening-check-second-missing-page. Door: cloudflare. Current status: proposed. Deployment id: aa647ca5-ba64-4427-8415-174e3ea7c273.

Created 2026-10-29T14:41:53.525Z. Last updated 2026-10-29T14:41:53.525Z. Snapshot: not taken yet.

This page is missing structured data (JSON-LD), so AI systems get a thinner read of it than they should. This fix deploys a small edge script on the site's Cloudflare that adds exactly that, built only from facts already on the page: its title, its URL, and the organization name from the domain. Nothing is invented, and nothing already on the page is changed. The finding also lists enough text in the server rendered HTML, which an edge injection cannot fix honestly, so that part stays for a code change. The previous edge state is snapshotted first, and rollback restores it exactly.

Timeline

  1. proposed at 2026-10-29T14:41:53.525Z: Proposed from audit 838cfe9d-13c8-4d49-afd3-6dfb30e8cfbe, finding extraction_basics (warn).
State before (JSON)
{
  "finding": {
    "check_key": "extraction_basics",
    "status": "warn",
    "severity": "low",
    "evidence": {
      "title": "Page not found | DeployFound",
      "titleLength": 28,
      "metaDescription": "That page does not exist. The audit, the demo and the explanation of how DeployFound works are all one click away.",
      "metaDescriptionLength": 114,
      "h1Count": 1,
      "firstH1": "This page is not here.",
      "jsonLdBlocks": 0,
      "rawHtmlBytes": 4997,
      "visibleTextChars": 676,
      "textToHtmlRatio": 0.135,
      "issues": [
        "thin_server_rendered_text",
        "no_json_ld"
      ],
      "note": "Text volume is measured on the raw HTML the server s ...

Inject the missing head elements at the edge

Target: https://deployfound.com/hardening-check-missing-page. Door: cloudflare. Current status: approved. Deployment id: 17c80208-c582-4edc-ba18-70d87141ab72.

Created 2026-10-29T14:39:04.795Z. Last updated 2026-10-29T14:39:05.537Z. Snapshot: not taken yet.

When a page is missing a meta description or structured data, AI systems get a thinner read of it than they should. This fix deploys a small edge script on the site's Cloudflare that adds the missing elements, built only from facts already on the page: its title, its URL, and the organization name from the domain. Nothing is invented, and nothing already on the page is changed. The previous edge state is snapshotted first, and rollback restores it exactly.

Timeline

  1. proposed at 2026-10-29T14:39:04.795Z: Proposed from audit f6027fb4-941f-4ddb-ac42-4b2e5d405494, finding extraction_basics (warn).
  2. approved at 2026-10-29T14:39:05.537Z: Approved by the owner. Nothing has changed yet.

Inject the missing head elements at the edge

Target: https://appjourney-test-site.com/. Door: cloudflare. Current status: approved. Deployment id: c0fc4452-daaf-40b3-8373-bed6e5548cc1.

Created 2026-10-29T14:24:14.421Z. Last updated 2026-10-29T14:24:16.126Z. Snapshot: not taken yet.

When a page is missing a meta description or structured data, AI systems get a thinner read of it than they should. This fix deploys a small edge script on the site's Cloudflare that adds the missing elements, built only from facts already on the page: its title, its URL, and the organization name from the domain. Nothing is invented, and nothing already on the page is changed. The previous edge state is snapshotted first, and rollback restores it exactly.

Timeline

  1. proposed at 2026-10-29T14:24:14.421Z: Proposed from audit 727f31c0-d9ea-4570-bdf6-d468b06c585a, finding extraction_basics (fail).
  2. approved at 2026-10-29T14:24:16.126Z: Approved by the owner. Nothing has changed yet.

Inject the missing head elements at the edge

Target: https://demo.deployfound.com/. Door: cloudflare. Current status: rolled_back. Deployment id: db568d55-bc7c-4ead-aad1-72b41b71f259.

Created 2026-10-29T14:09:12.782Z. Last updated 2026-10-29T14:10:23.063Z. Snapshot: deployments/db568d55-bc7c-4ead-aad1-72b41b71f259/snapshot-1793282954033.json.

This page is missing a meta description, so AI systems get a thinner read of it than they should. This fix deploys a small edge script on the site's Cloudflare that adds exactly that, built only from facts already on the page: its title, its URL, and the organization name from the domain. Nothing is invented, and nothing already on the page is changed. The previous edge state is snapshotted first, and rollback restores it exactly.

Timeline

  1. proposed at 2026-10-29T14:09:12.782Z: Proposed from audit 81287404-6c16-4630-9d0c-88c9081c6d08, finding extraction_basics (warn).
  2. approved at 2026-10-29T14:09:13.455Z: Approved by the owner. Nothing has changed yet.
  3. snapshot_saved at 2026-10-29T14:09:14.339Z: Snapshot of the current state saved to R2 at deployments/db568d55-bc7c-4ead-aad1-72b41b71f259/snapshot-1793282954033.json.
  4. change_applied at 2026-10-29T14:09:15.195Z: The fix was applied to the target.
  5. verified at 2026-10-29T14:09:24.699Z: Re-check passed. Text volume is measured on the raw HTML the server sends, before any scripts run. AI crawlers that do not run scripts only ever see that version.
  6. rollback_snapshot_restored at 2026-10-29T14:09:30.224Z: Snapshot deployments/db568d55-bc7c-4ead-aad1-72b41b71f259/snapshot-1793282954033.json was written back to the target.
  7. rolled_back at 2026-10-29T14:10:23.063Z: Re-check confirms the original problem is back, exactly as the snapshot left it. The deployment is fully reversed.

Latest verification

The re-check at 2026-10-29T14:10:23.063Z reported warn.

Verification evidence (JSON)
{
  "title": "Harbor Lane Bakery | Sourdough and pastries, baked every morning",
  "titleLength": 64,
  "metaDescription": null,
  "metaDescriptionLength": 0,
  "h1Count": 1,
  "firstH1": "Harbor Lane Bakery",
  "jsonLdBlocks": 1,
  "rawHtmlBytes": 2701,
  "visibleTextChars": 1608,
  "textToHtmlRatio": 0.595,
  "issues": [
    "missing_meta_description"
  ],
  "note": "Text volume is measured on the raw HTML the server sends, before any scripts run. AI crawlers that do not run scripts only ever see that version.",
  "verificationAuditId": "553b4495-1648-4444-a716-81f1ee44981a"
}
State before (JSON)
{
  "mechanism": "demo_kv",
  "scriptName": "deployfound-extract-demo-deployfound-com",
  "routePattern": "demo.deployfound.com/*",
  "scriptExisted": false,
  "scriptSource": null,
  "routeExisted": false,
  "routeId": null,
  "routeScript": null
}
State after (JSON)
{
  "mechanism": "demo_kv",
  "scriptName": "deployfound-extract-demo-deployfound-com",
  "routePattern": "demo.deployfound.com/*",
  "scriptExisted": false,
  "scriptSource": null,
  "routeExisted": false,
  "routeId": null,
  "routeScript": null
}

Serve a corrected robots.txt from the edge

Target: https://demo.deployfound.com/. Door: cloudflare. Current status: rolled_back. Deployment id: 049d0b32-f41b-49bc-8bc2-50c32fee1038.

Created 2026-10-29T14:08:55.185Z. Last updated 2026-10-29T14:11:04.230Z. Snapshot: deployments/049d0b32-f41b-49bc-8bc2-50c32fee1038/snapshot-1793282936538.json.

robots.txt blocks GPTBot at the root path. This fix deploys a small edge script on the site's Cloudflare that serves a corrected robots.txt: the block on that bot is removed, every existing valid rule is kept, and the major AI crawlers are explicitly welcomed. The previous edge state is snapshotted first, and rollback restores it exactly.

Timeline

  1. proposed at 2026-10-29T14:08:55.185Z: Proposed from audit 81287404-6c16-4630-9d0c-88c9081c6d08, finding ai_bot_rules (warn).
  2. approved at 2026-10-29T14:08:55.907Z: Approved by the owner. Nothing has changed yet.
  3. snapshot_saved at 2026-10-29T14:08:56.835Z: Snapshot of the current state saved to R2 at deployments/049d0b32-f41b-49bc-8bc2-50c32fee1038/snapshot-1793282936538.json.
  4. change_applied at 2026-10-29T14:08:57.177Z: The fix was applied to the target.
  5. verified at 2026-10-29T14:09:06.757Z: Re-check passed. robots.txt does not block any of the major AI bots at the root path.
  6. rollback_snapshot_restored at 2026-10-29T14:10:24.786Z: Snapshot deployments/049d0b32-f41b-49bc-8bc2-50c32fee1038/snapshot-1793282936538.json was written back to the target.
  7. rolled_back at 2026-10-29T14:11:04.230Z: Re-check confirms the original problem is back, exactly as the snapshot left it. The deployment is fully reversed.

Latest verification

The re-check at 2026-10-29T14:11:04.230Z reported warn.

Verification evidence (JSON)
{
  "bots": {
    "GPTBot": {
      "verdict": "blocked",
      "via": "specific"
    },
    "ClaudeBot": {
      "verdict": "allowed",
      "via": "wildcard"
    },
    "Google-Extended": {
      "verdict": "allowed",
      "via": "wildcard"
    },
    "PerplexityBot": {
      "verdict": "allowed",
      "via": "wildcard"
    },
    "CCBot": {
      "verdict": "allowed",
      "via": "wildcard"
    }
  },
  "blockedBots": [
    "GPTBot"
  ],
  "note": "robots.txt blocks at least one major AI bot at the root path.",
  "verificationAuditId": "0a2e95bd-2af1-427f-9499-cce8e67765f0"
}
State before (JSON)
{
  "mechanism": "demo_kv",
  "scriptName": "deployfound-robots-demo-deployfound-com",
  "routePattern": "demo.deployfound.com/robots.txt",
  "scriptExisted": false,
  "scriptSource": null,
  "routeExisted": false,
  "routeId": null,
  "routeScript": null
}
State after (JSON)
{
  "mechanism": "demo_kv",
  "scriptName": "deployfound-robots-demo-deployfound-com",
  "routePattern": "demo.deployfound.com/robots.txt",
  "scriptExisted": false,
  "scriptSource": null,
  "routeExisted": false,
  "routeId": null,
  "routeScript": null
}

Remove the server block that refuses an AI bot robots.txt welcomes

Target: https://demo.deployfound.com/. Door: cloudflare. Current status: verified. Deployment id: 786228ab-c817-4d76-8ce7-8b0ec8659362.

Created 2026-10-29T12:58:52.646Z. Last updated 2026-10-29T13:06:22.848Z. Snapshot: deployments/786228ab-c817-4d76-8ce7-8b0ec8659362/snapshot-1793279172101.json.

The audit found the classic hidden block: robots.txt allows GPTBot, but the server answered GPTBot with 403. This fix removes the edge block so the bot gets the same answer the rules promise. The zone state is snapshotted first, and rollback restores it exactly.

Timeline

  1. proposed at 2026-10-29T12:58:52.646Z: Proposed from audit c0dfd264-7efe-4ea5-867a-643bc898aa20, finding server_bot_access (fail).
  2. approved at 2026-10-29T13:00:10.641Z: Approved by the owner. Nothing has changed yet.
  3. snapshot_saved at 2026-10-29T13:01:39.227Z: Snapshot of the current state saved to R2 at deployments/786228ab-c817-4d76-8ce7-8b0ec8659362/snapshot-1793278898943.json.
  4. change_applied at 2026-10-29T13:01:39.676Z: The fix was applied to the target.
  5. verified at 2026-10-29T13:01:39.973Z: Re-check passed. Server behaviour matches robots.txt for every AI bot tested.
  6. rollback_snapshot_restored at 2026-10-29T13:02:14.518Z: Snapshot deployments/786228ab-c817-4d76-8ce7-8b0ec8659362/snapshot-1793278898943.json was written back to the target.
  7. verification_failed at 2026-10-29T13:02:27.064Z: The snapshot was restored but the re-check reports "pass" instead of the original problem, so the restore is not confirmed and this deployment is marked failed.
  8. rollback_snapshot_restored at 2026-10-29T13:03:28.133Z: Snapshot deployments/786228ab-c817-4d76-8ce7-8b0ec8659362/snapshot-1793278898943.json was written back to the target.
  9. verification_failed at 2026-10-29T13:04:23.367Z: The snapshot was restored but the re-check reports "pass" instead of the original problem, so the restore is not confirmed and this deployment is marked failed.
  10. rollback_snapshot_restored at 2026-10-29T13:05:56.329Z: Snapshot deployments/786228ab-c817-4d76-8ce7-8b0ec8659362/snapshot-1793278898943.json was written back to the target.
  11. rolled_back at 2026-10-29T13:06:06.447Z: Re-check confirms the original problem is back, exactly as the snapshot left it. The deployment is fully reversed.
  12. snapshot_saved at 2026-10-29T13:06:12.491Z: Snapshot of the current state saved to R2 at deployments/786228ab-c817-4d76-8ce7-8b0ec8659362/snapshot-1793279172101.json.
  13. change_applied at 2026-10-29T13:06:12.861Z: The fix was applied to the target.
  14. verified at 2026-10-29T13:06:22.848Z: Re-check passed. Server behaviour matches robots.txt for every AI bot tested.

Latest verification

The re-check at 2026-10-29T13:06:22.848Z reported pass.

Verification evidence (JSON)
{
  "perUserAgent": {
    "browser": {
      "status": 200,
      "challenge": false,
      "blocked": false
    },
    "GPTBot": {
      "status": 200,
      "challenge": false,
      "blocked": false
    },
    "ClaudeBot": {
      "status": 200,
      "challenge": false,
      "blocked": false
    },
    "Google-Extended": {
      "status": 200,
      "challenge": false,
      "blocked": false
    },
    "PerplexityBot": {
      "status": 200,
      "challenge": false,
      "blocked": false
    },
    "CCBot": {
      "status": 200,
      "challenge": false,
      "blocked": false
    }
  },
  "mismatches": [],
  "agreeingBlocks": [],
  "allowedThrough": [
    "GPTBot",
    "ClaudeBot",
 ...
State before (JSON)
{
  "enabled": true,
  "bot": "GPTBot",
  "host": "demo.deployfound.com",
  "mechanism": "kv_edge_flag",
  "note": "Demo fixture switched on by the operator through the KV API.",
  "updatedAt": "2026-10-29T13:05:56.078Z"
}
State after (JSON)
{
  "enabled": false,
  "bot": "GPTBot",
  "host": "demo.deployfound.com",
  "mechanism": "kv_edge_flag",
  "note": "On a customer zone this remedy removes a firewall ruleset rule that blocks the bot. The demo account token does not carry firewall ruleset permission (the rulesets API answered 403), so on this demo host the block is held in an edge configuration flag instead. The audit sees the same server behaviour either way.",
  "updatedAt": "2026-10-29T13:06:12.609Z"
}