{
  "version": "riddle-proof.profile-result.v1",
  "profile_name": "riddle-site-v462-good-catch-diary-current-surface",
  "runner": "riddle",
  "status": "passed",
  "baseline_policy": "invariant_only",
  "route": {
    "requested": "https://riddledc.com/proof/good-catches/",
    "observed": "/proof/good-catches/",
    "expected_path": "/proof/good-catches/",
    "matched": true,
    "http_status": 200
  },
  "artifacts": {
    "screenshots": [
      "riddle-site-v462-good-catch-diary-current-surface-desktop",
      "riddle-site-v462-good-catch-diary-current-surface-phone",
      "riddle-site-v462-good-catch-diary-current-surface-ipad-mini",
      "riddle-site-v462-good-catch-diary-current-surface-ipad"
    ],
    "console": "console.json",
    "proof_json": "proof.json",
    "dom_summary": "dom-summary.json",
    "riddle_artifacts": [
      {
        "name": "proof.json",
        "url": "https://cdn.riddledc.com/scripts/job_f448859c/proof.json.json",
        "source": "artifacts"
      },
      {
        "name": "console.json",
        "url": "https://cdn.riddledc.com/scripts/job_f448859c/console.json.json",
        "source": "artifacts"
      },
      {
        "name": "dom-summary.json",
        "url": "https://cdn.riddledc.com/scripts/job_f448859c/dom-summary.json.json",
        "source": "artifacts"
      },
      {
        "name": "riddle-site-v462-good-catch-diary-current-surface-desktop.png",
        "url": "https://cdn.riddledc.com/scripts/job_f448859c/riddle-site-v462-good-catch-diary-current-surface-desktop.png",
        "source": "artifacts"
      },
      {
        "name": "riddle-site-v462-good-catch-diary-current-surface-phone.png",
        "url": "https://cdn.riddledc.com/scripts/job_f448859c/riddle-site-v462-good-catch-diary-current-surface-phone.png",
        "source": "artifacts"
      },
      {
        "name": "riddle-site-v462-good-catch-diary-current-surface-ipad-mini.png",
        "url": "https://cdn.riddledc.com/scripts/job_f448859c/riddle-site-v462-good-catch-diary-current-surface-ipad-mini.png",
        "source": "artifacts"
      },
      {
        "name": "riddle-site-v462-good-catch-diary-current-surface-ipad.png",
        "url": "https://cdn.riddledc.com/scripts/job_f448859c/riddle-site-v462-good-catch-diary-current-surface-ipad.png",
        "source": "artifacts"
      }
    ]
  },
  "checks": [
    {
      "type": "route_loaded",
      "label": "route_loaded",
      "status": "passed",
      "evidence": {
        "expected_path": "/proof/good-catches/",
        "observed_paths": [
          "/proof/good-catches/",
          "/proof/good-catches/",
          "/proof/good-catches/",
          "/proof/good-catches/"
        ],
        "http_statuses": [
          200,
          200,
          200,
          200
        ]
      }
    },
    {
      "type": "selector_visible",
      "label": "selector_visible",
      "status": "passed",
      "evidence": {
        "selector": ".catch-grid",
        "visible_counts": [
          1,
          1,
          1,
          1
        ]
      }
    },
    {
      "type": "selector_count_equals",
      "label": "selector_count_equals",
      "status": "passed",
      "evidence": {
        "selector": ".catch-card",
        "expected_count": 39,
        "counts": [
          39,
          39,
          39,
          39
        ]
      }
    },
    {
      "type": "selector_text_visible",
      "label": "selector_text_visible",
      "status": "passed",
      "evidence": {
        "selector": ".catch-grid",
        "text": "Profile Warnings docs lagged behind the shipped surface",
        "pattern": null,
        "viewports": [
          {
            "viewport": "desktop",
            "selector_count": 1,
            "visible_count": 1,
            "matched_count": 1,
            "matched": true,
            "samples": [
              "May 17, 2026 < $0.01 Riddle site Riddle Proof Profile Warnings Profile Warnings docs lagged behind the shipped surface Bug: Riddle Proof had shipped nonblocking profile warnings for ambiguous network mock response selectors, but the public "
            ]
          },
          {
            "viewport": "phone",
            "selector_count": 1,
            "visible_count": 1,
            "matched_count": 1,
            "matched": true,
            "samples": [
              "May 17, 2026 < $0.01 Riddle site Riddle Proof Profile Warnings Profile Warnings docs lagged behind the shipped surface Bug: Riddle Proof had shipped nonblocking profile warnings for ambiguous network mock response selectors, but the public "
            ]
          },
          {
            "viewport": "ipad-mini",
            "selector_count": 1,
            "visible_count": 1,
            "matched_count": 1,
            "matched": true,
            "samples": [
              "May 17, 2026 < $0.01 Riddle site Riddle Proof Profile Warnings Profile Warnings docs lagged behind the shipped surface Bug: Riddle Proof had shipped nonblocking profile warnings for ambiguous network mock response selectors, but the public "
            ]
          },
          {
            "viewport": "ipad",
            "selector_count": 1,
            "visible_count": 1,
            "matched_count": 1,
            "matched": true,
            "samples": [
              "May 17, 2026 < $0.01 Riddle site Riddle Proof Profile Warnings Profile Warnings docs lagged behind the shipped surface Bug: Riddle Proof had shipped nonblocking profile warnings for ambiguous network mock response selectors, but the public "
            ]
          }
        ]
      }
    },
    {
      "type": "selector_text_visible",
      "label": "selector_text_visible",
      "status": "passed",
      "evidence": {
        "selector": ".catch-grid",
        "text": "Evidence Manifest preloaded noisy unused assets",
        "pattern": null,
        "viewports": [
          {
            "viewport": "desktop",
            "selector_count": 1,
            "visible_count": 1,
            "matched_count": 1,
            "matched": true,
            "samples": [
              "May 17, 2026 < $0.01 Riddle site Riddle Proof Profile Warnings Profile Warnings docs lagged behind the shipped surface Bug: Riddle Proof had shipped nonblocking profile warnings for ambiguous network mock response selectors, but the public "
            ]
          },
          {
            "viewport": "phone",
            "selector_count": 1,
            "visible_count": 1,
            "matched_count": 1,
            "matched": true,
            "samples": [
              "May 17, 2026 < $0.01 Riddle site Riddle Proof Profile Warnings Profile Warnings docs lagged behind the shipped surface Bug: Riddle Proof had shipped nonblocking profile warnings for ambiguous network mock response selectors, but the public "
            ]
          },
          {
            "viewport": "ipad-mini",
            "selector_count": 1,
            "visible_count": 1,
            "matched_count": 1,
            "matched": true,
            "samples": [
              "May 17, 2026 < $0.01 Riddle site Riddle Proof Profile Warnings Profile Warnings docs lagged behind the shipped surface Bug: Riddle Proof had shipped nonblocking profile warnings for ambiguous network mock response selectors, but the public "
            ]
          },
          {
            "viewport": "ipad",
            "selector_count": 1,
            "visible_count": 1,
            "matched_count": 1,
            "matched": true,
            "samples": [
              "May 17, 2026 < $0.01 Riddle site Riddle Proof Profile Warnings Profile Warnings docs lagged behind the shipped surface Bug: Riddle Proof had shipped nonblocking profile warnings for ambiguous network mock response selectors, but the public "
            ]
          }
        ]
      }
    },
    {
      "type": "selector_text_visible",
      "label": "selector_text_visible",
      "status": "passed",
      "evidence": {
        "selector": ".catch-grid",
        "text": "Builder accepted a saved preview path as a fresh build",
        "pattern": null,
        "viewports": [
          {
            "viewport": "desktop",
            "selector_count": 1,
            "visible_count": 1,
            "matched_count": 1,
            "matched": true,
            "samples": [
              "May 17, 2026 < $0.01 Riddle site Riddle Proof Profile Warnings Profile Warnings docs lagged behind the shipped surface Bug: Riddle Proof had shipped nonblocking profile warnings for ambiguous network mock response selectors, but the public "
            ]
          },
          {
            "viewport": "phone",
            "selector_count": 1,
            "visible_count": 1,
            "matched_count": 1,
            "matched": true,
            "samples": [
              "May 17, 2026 < $0.01 Riddle site Riddle Proof Profile Warnings Profile Warnings docs lagged behind the shipped surface Bug: Riddle Proof had shipped nonblocking profile warnings for ambiguous network mock response selectors, but the public "
            ]
          },
          {
            "viewport": "ipad-mini",
            "selector_count": 1,
            "visible_count": 1,
            "matched_count": 1,
            "matched": true,
            "samples": [
              "May 17, 2026 < $0.01 Riddle site Riddle Proof Profile Warnings Profile Warnings docs lagged behind the shipped surface Bug: Riddle Proof had shipped nonblocking profile warnings for ambiguous network mock response selectors, but the public "
            ]
          },
          {
            "viewport": "ipad",
            "selector_count": 1,
            "visible_count": 1,
            "matched_count": 1,
            "matched": true,
            "samples": [
              "May 17, 2026 < $0.01 Riddle site Riddle Proof Profile Warnings Profile Warnings docs lagged behind the shipped surface Bug: Riddle Proof had shipped nonblocking profile warnings for ambiguous network mock response selectors, but the public "
            ]
          }
        ]
      }
    },
    {
      "type": "selector_text_visible",
      "label": "selector_text_visible",
      "status": "passed",
      "evidence": {
        "selector": ".proof-stats",
        "text": "39",
        "pattern": null,
        "viewports": [
          {
            "viewport": "desktop",
            "selector_count": 1,
            "visible_count": 1,
            "matched_count": 1,
            "matched": true,
            "samples": [
              "39 curated catches from recent real browser proof runs. <$0.10 Even a ten-minute proof run is under nine cents of browser time. 0 source Many findings can be detected from the outside with a URL and browser contract. Manifest Each catch lin"
            ]
          },
          {
            "viewport": "phone",
            "selector_count": 1,
            "visible_count": 1,
            "matched_count": 1,
            "matched": true,
            "samples": [
              "39 curated catches from recent real browser proof runs. <$0.10 Even a ten-minute proof run is under nine cents of browser time. 0 source Many findings can be detected from the outside with a URL and browser contract. Manifest Each catch lin"
            ]
          },
          {
            "viewport": "ipad-mini",
            "selector_count": 1,
            "visible_count": 1,
            "matched_count": 1,
            "matched": true,
            "samples": [
              "39 curated catches from recent real browser proof runs. <$0.10 Even a ten-minute proof run is under nine cents of browser time. 0 source Many findings can be detected from the outside with a URL and browser contract. Manifest Each catch lin"
            ]
          },
          {
            "viewport": "ipad",
            "selector_count": 1,
            "visible_count": 1,
            "matched_count": 1,
            "matched": true,
            "samples": [
              "39 curated catches from recent real browser proof runs. <$0.10 Even a ten-minute proof run is under nine cents of browser time. 0 source Many findings can be detected from the outside with a URL and browser contract. Manifest Each catch lin"
            ]
          }
        ]
      }
    },
    {
      "type": "artifact_link_status",
      "label": "diary screenshot artifacts",
      "status": "passed",
      "evidence": {
        "selector": "img[src*='/proof/good-catches/artifacts/']",
        "expected_count": 39,
        "min_count": null,
        "allowed_statuses": [
          "2xx",
          "3xx"
        ],
        "require_nonzero_bytes": true,
        "min_bytes": 10000,
        "allowed_content_types": [
          "image/*"
        ],
        "viewports": [
          {
            "viewport": "desktop",
            "selector": "img[src*='/proof/good-catches/artifacts/']",
            "total_count": 39,
            "discovered_count": 39,
            "ok_count": 39,
            "failed_count": 0,
            "truncated": false,
            "max_links": 45,
            "result_count": 39,
            "stored_result_count": 5,
            "omitted_result_count": 34,
            "omitted_success_count": 34,
            "results_compacted": true,
            "min_bytes": 10000,
            "allowed_content_types": [
              "image/*"
            ],
            "status_counts": {
              "200": 39
            },
            "failures": []
          }
        ],
        "failures": []
      }
    },
    {
      "type": "link_status",
      "label": "diary evidence anchors",
      "status": "passed",
      "evidence": {
        "selector": "a.catch-link[href*='/proof/good-catches/evidence/#']",
        "expected_count": 39,
        "min_count": null,
        "allowed_statuses": [
          "2xx",
          "3xx"
        ],
        "require_nonzero_bytes": true,
        "min_bytes": 1000,
        "allowed_content_types": [
          "text/html"
        ],
        "viewports": [
          {
            "viewport": "desktop",
            "selector": "a.catch-link[href*='/proof/good-catches/evidence/#']",
            "total_count": 39,
            "discovered_count": 39,
            "ok_count": 39,
            "failed_count": 0,
            "truncated": false,
            "max_links": 45,
            "result_count": 39,
            "stored_result_count": 5,
            "omitted_result_count": 34,
            "omitted_success_count": 34,
            "results_compacted": true,
            "min_bytes": 1000,
            "allowed_content_types": [
              "text/html"
            ],
            "status_counts": {
              "206": 39
            },
            "failures": []
          }
        ],
        "failures": []
      }
    },
    {
      "type": "http_status",
      "label": "llms advertises proof storytelling surfaces",
      "status": "passed",
      "evidence": {
        "url": "https://riddledc.com/llms.txt",
        "method": "GET",
        "allowed_statuses": [
          200
        ],
        "require_nonzero_bytes": false,
        "min_bytes": 800,
        "allowed_content_types": [
          "text/plain"
        ],
        "viewports": [
          {
            "viewport": "desktop",
            "key": "GET https://riddledc.com/llms.txt",
            "url": "https://riddledc.com/llms.txt",
            "method": "GET",
            "status": 200,
            "status_text": "OK",
            "ok": true,
            "error": null,
            "content_type": "text/plain",
            "content_length": null,
            "bytes": 2014,
            "body_contains": {
              "Good Catch Diary: https://riddledc.com/proof/good-catches/": true,
              "Evidence Manifest: https://riddledc.com/proof/good-catches/evidence/": true,
              "Use the Good Catch Diary and Evidence Manifest when you need examples of real proof-driven catches.": true
            },
            "body_contains_missing": [],
            "body_not_contains": null,
            "body_not_contains_found": [],
            "body_not_patterns": null,
            "body_not_patterns_found": [],
            "body_sample": "# Riddle\n\nHosted browser automation, Preview, and proof artifacts for AI agents.\n\nRiddle gives agents hosted browsers, screenshots, console logs, DOM evidence, static and server previews, MCP tools, OpenAPI actions, and proof receipts. Use this file as the compact starting point for agent-readable Riddle docs.\n\n## Core Agent Resources\n\n- API documentation: https://riddledc.com/docs/markdown.md\n- Riddle Proof docs: https://riddledc.com/docs/riddle-proof/markdown.md\n- Preview tools docs: https://riddledc.com/docs/preview/markdown.md\n- MCP docs: https://riddledc.com/mcp/markdown.md\n- Agent guide: https://riddledc.com/ai-agents/guide/markdown.md\n\n## Machine Contracts\n\n- GPT Actions OpenAPI YAML: https://riddledc.com/.well-known/riddledc-actions-openapi.yaml\n- GPT Actions OpenAPI JSON: https://riddledc.com/riddledc-actions-openapi.json\n- Public sitemap: https://riddledc.com/sitemap.xml\n- Robots policy: https://riddledc.com/robots.txt\n\n## Proof And Evidence\n\n- Riddle Proof landing page: http",
            "failures": []
          }
        ],
        "failures": []
      }
    },
    {
      "type": "http_status",
      "label": "riddle proof markdown includes profile warnings",
      "status": "passed",
      "evidence": {
        "url": "https://riddledc.com/docs/riddle-proof/markdown.md",
        "method": "GET",
        "allowed_statuses": [
          200
        ],
        "require_nonzero_bytes": false,
        "min_bytes": 1000,
        "allowed_content_types": [
          "text/markdown",
          "text/plain"
        ],
        "viewports": [
          {
            "viewport": "desktop",
            "key": "GET https://riddledc.com/docs/riddle-proof/markdown.md",
            "url": "https://riddledc.com/docs/riddle-proof/markdown.md",
            "method": "GET",
            "status": 200,
            "status_text": "OK",
            "ok": true,
            "error": null,
            "content_type": "text/markdown",
            "content_length": 20561,
            "bytes": 20561,
            "body_contains": {
              "## Profile Warnings": true,
              "warnings": true,
              "request_body_contains": true,
              "network_mocks": true
            },
            "body_contains_missing": [],
            "body_not_contains": null,
            "body_not_contains_found": [],
            "body_not_patterns": null,
            "body_not_patterns_found": [],
            "body_sample": "# Riddle Proof\n\nEvidence-backed workflows for agent-authored browser changes.\n\nPlain text for agents: https://riddledc.com/docs/riddle-proof/markdown.md\n\n## What It Is\n\nRiddle Proof is a workflow for turning an agent's code change into inspectable evidence. It runs the actual app in a browser, exercises the behavior that matters, captures artifacts, and records whether the change met the stated proof criteria.\n\nBuild output and unit tests are still important, but they do not prove that a user-facing browser flow works. Riddle Proof fills that gap with real previews, screenshots, JSON artifacts, console output, diagnostics, and ship gates.\n\nThe contract is agent-agnostic: use it from Codex, Claude Code, OpenClaw, CI, or any workflow that can run a browser proof script and preserve the resulting evidence.\n\nShort version: bring your agent; Riddle brings the proof.\n\n## When To Use It\n\nUse Riddle Proof when correctness depends on the browser, a running server, generated assets, timing, layo",
            "failures": []
          }
        ],
        "failures": []
      }
    },
    {
      "type": "no_horizontal_overflow",
      "label": "no_horizontal_overflow",
      "status": "passed",
      "evidence": {
        "max_overflow_px": 1,
        "overflow_px": [
          0,
          0,
          0,
          0
        ],
        "bounds_overflow_px": [
          0,
          0,
          0,
          0
        ],
        "overflow_offender_counts": [
          0,
          0,
          0,
          0
        ],
        "viewports": [
          "desktop",
          "phone",
          "ipad-mini",
          "ipad"
        ]
      }
    },
    {
      "type": "no_fatal_console_errors",
      "label": "no_fatal_console_errors",
      "status": "passed",
      "evidence": {
        "console_fatal_count": 0,
        "page_error_count": 0,
        "total_console_fatal_count": 0,
        "total_page_error_count": 0,
        "allowed_console_fatal_count": 0,
        "explicitly_allowed_console_fatal_count": 0,
        "allowed_expected_network_mock_console_count": 0,
        "allowed_expected_network_mock_console_events": [],
        "allowed_page_error_count": 0,
        "allowed_console_texts": [],
        "allowed_console_patterns": [],
        "allowed_page_error_texts": [],
        "allowed_page_error_patterns": []
      }
    },
    {
      "type": "no_console_warnings",
      "label": "no_console_warnings",
      "status": "passed",
      "evidence": {
        "console_warning_count": 0,
        "total_console_warning_count": 0,
        "allowed_console_warning_count": 0,
        "allowed_console_texts": [],
        "allowed_console_patterns": [],
        "unallowed_console_warning_samples": [],
        "allowed_console_warning_samples": []
      }
    }
  ],
  "summary": "riddle-site-v462-good-catch-diary-current-surface passed 14 check(s) across 4 viewport(s) (desktop, phone, ipad-mini, ipad).",
  "captured_at": "2026-05-17T06:27:33.741Z",
  "evidence": {
    "version": "riddle-proof.profile-evidence.v1",
    "profile_name": "riddle-site-v462-good-catch-diary-current-surface",
    "target_url": "https://riddledc.com/proof/good-catches/",
    "baseline_policy": "invariant_only",
    "captured_at": "2026-05-17T06:27:33.741Z",
    "viewports": [
      {
        "name": "desktop",
        "width": 1280,
        "height": 900,
        "url": "https://riddledc.com/proof/good-catches/",
        "route": {
          "requested": "https://riddledc.com/proof/good-catches/",
          "observed": "/proof/good-catches/",
          "expected_path": "/proof/good-catches/",
          "matched": true,
          "http_status": 200
        },
        "title": "Good Catch Diary - Riddle Proof | Riddle",
        "body_text_length": 42600,
        "body_text_sample": "Skip to main content Riddle Docs Proof MCP Pricing Blog Playground Sign Up Log In ← Riddle Proof GOOD CATCH DIARY Real bugs caught by cheap browser proof. A running diary of browser-visible issues found by real Riddle Proof runs. Each entry explains the bug, the evidence, and the general proof lesson. Open the evidence manifest Read the docs 39 curated catches from recent real browser proof runs. <$0.10 Even a ten-minute proof run is under nine cents of browser time. 0 source Many findings can be detected from the outside with a URL and browser contract. Manifest Each catch links to a receipt with screenshots, logs, run metadata, and the sales lesson. The diary BUG → EVIDENCE → LESSON May 17, 2026 < $0.01 Riddle site Riddle Proof Profile Warnings Profile Warnings docs lagged behind the shipped surface Bug: Riddle Proof had shipped nonblocking profile warnings for ambiguous network mock response selectors, but the public Riddle Proof docs and agent-facing markdown did not mention Profile Warnings or the warnings result field. Why normal checks missed it: The docs page loaded cleanly, the existing Profile Mode section and network mock terms were visible, /docs/riddle-proof/markdown.md returned 200 text/markdown with nonzero bytes, overflow stayed at 0px, and fatal console/page errors were clean. The gap was semantic: the newly shipped warning surface was absent from both human and machine-consumable docs. Proof lesson: The proof product needs proof for its own proof-authoring contract. When a package adds evidence, warnings, or profile semantics, rendered docs and raw agent-facing markdown should be audited together so agents do not rediscover shipped behavior from changelogs or dogfood notes. Evidence: Initial production job job_6d37e766 proved /docs/riddle-proof/ was otherwise healthy while rendered docs missed Profile Warnings and /docs/riddle-proof/markdown.md missed Profile Warnings plus warnings. Riddle-site PR #131 added the rendered and markdown docs, sidebar link, static guard, and docs-proof checks. Static Preview ps_08e95368 passed as job_cc796a28, Amplify job 112 deployed commit 80b3780, and final production job job_ad1cc6ec passed 9 checks across desktop, phone, iPad Mini, and iPad. Open evidence manifest → Screenshot only → May 17, 2026 < $0.05 LilArcade Builder preview boundary Builder accepted a saved preview path as a fresh build Bug: LilArcade Builder accepted a same-host saved preview URL from /saved/riddle-proof-v454-sneaky-existing/index.html as if it were a fresh build artifact, leaving Open in new tab and Save to Arcade available instead of rejecting the stale saved-artifact path. Why normal checks missed it: The unsafe URL used the trusted preview bucket host, auth and chat both worked, and the page stayed visually stable. The defect only surfaced when proof treated Builder preview context as stricter than saved-player context and required the forbidden saved-preview-path mock to stay at zero hits. Proof lesson: Preview URL safety is contextual. A URL sanitizer that is correct for saved player pages can be too permissive for fresh Builder builds, so proof profiles should encode allowed artifact prefixes, forbidden network hits, and recovery behavior together. Evidence: Initial production job job_643e881d caught Builder rendering Open in new tab and Save to Arcade for the same-host saved preview URL, with forbidden-saved-preview-path-v454 hit twice. LilArcade PR #444 added a Builder-only preview URL gate. Static Preview job job_5e778318 and final production job job_bc56fa3c passed: the saved path was rejected, the forbidden mock stayed at 0 hits, and the recovery build could still be saved and played. Open evidence manifest → Screenshot only → May 16, 2026 < $0.01 Riddle site Good Catch Diary warning hygiene Evidence Manifest preloaded noisy unused assets Bug: The public Good Catch Evidence Manifest looked healthy, but browser console evidence showed unused preload warnings from automatic route prefetch and eager below-the-fold proof screenshots. Why normal checks missed it: The route loaded, all 36 manifest cards rendered, the Profile Mode docs catch and job IDs were visible, overflow stayed at 0px, and fatal console/page errors were clean. The issue lived in warning-level browser noise that the previous fatal-console contract intentionally ignored. Proof lesson: Warning hygiene deserves its own contract. Nonfatal browser warnings can hide performance debt and make later proof runs noisy, so mature public evidence pages should be able to require zero unallowed warnings. Evidence: Initial production job job_07d46452 used the new no_console_warnings contract and caught 9 unused Next CSS preload warnings while the page otherwise passed. Riddle-site PR #128 disabled shared navigation prefetch and lazy-loaded Good Catch screenshots. Fixed Preview job job_1a70de27 and final production job job_4339e21c passed 9 checks across desktop, phone, iPad Mini, and iPad with 0 console warnings. Open evidence manifest → Screenshot only → May 16, 2026 < $0.01 Riddle site Riddle Proof Profile Mode Profile Mode docs lagged behind proof primitives Bug: The public Riddle Proof docs explained profile text semantics, but they did not document the Profile Mode primitives that recent real proof runs were using: network mocks, repeated and delayed responses, request-body receipts, setup actions, and iframe checks. Why normal checks missed it: The docs page loaded cleanly, the existing Profile Text Semantics section was visible, the raw markdown route returned 200, overflow stayed at 0px, and fatal console evidence was clean. The drift was semantic: the rendered and machine-consumable docs had not caught up with the reusable proof contract. Proof lesson: The proof surface itself needs proof. When a package adds or relies on reusable audit primitives, public rendered docs and raw agent-facing markdown should be tested as product contracts. Evidence: Initial production job job_bb0aa65a proved /docs/riddle-proof/ was healthy while both rendered docs and /docs/riddle-proof/markdown.md missed Profile Mode, network_mocks, repeat_responses, delay_ms, request_body_contains, setup_actions, frame_text_visible, and frame_url_equals. Riddle-site PR #126 added the Profile Mode section and regenerated markdown. Static Preview job job_88ad03aa and final production job job_22ee6a7c passed 14 checks across desktop, phone, iPad Mini, and iPad. Open evidence manifest → Screenshot only → May 16, 2026 < $0.01 Riddle site llms.txt proof receipts llms.txt hid the raw proof bundle Bug: The public llms.txt agent index linked to the human proof example page, but it did not link directly to the raw machine-consumable proof bundle that agents should ingest. Why normal checks missed it: The file itself returned 200 text/plain, the human proof example page returned 200, the raw JSON bundle returned 200 application/json, overflow stayed at 0px, and fatal console evidence was clean. The missing contract was discovery: agents had to infer the raw proof receipt from the human page. Proof lesson: Agent indexes should point to raw receipts, not only review pages. If a product publishes machine-consumable proof artifacts, the compact discovery surface needs to expose them directly. Evidence: Production job job_a5d4383b proved /llms.txt, /examples/riddle-proof/, and /examples/riddle-proof/docs-live-proof-bundle.json were healthy while llms.txt omitted the raw bundle URL. Riddle-site PR #124 added Raw proof bundle JSON to llms.txt and ratcheted the static llms guard. Static Preview job job_df22fbc2 and final production job job_ceafae1b passed 6 checks across desktop, phone, iPad Mini, and iPad. Open evidence manifest → Screenshot only → May 16, 2026 < $0.01 Riddle site proof receipts agent-proof Proof example bundle drifted behind the agent-proof contract Bug: The public proof example page rendered cleanly and linked to healthy artifacts, but the raw JSON bundle that agents consume was stale a",
        "scroll_width": 1280,
        "client_width": 1280,
        "overflow_px": 0,
        "bounds_overflow_px": 0,
        "overflow_offenders": [],
        "selectors": {
          ".catch-grid": {
            "count": 1,
            "visible_count": 1
          },
          ".catch-card": {
            "count": 39,
            "visible_count": 39
          },
          ".proof-stats": {
            "count": 1,
            "visible_count": 1
          }
        },
        "frames": {},
        "text_sequences": {
          ".catch-grid": {
            "count": 1,
            "visible_count": 1,
            "texts": [
              "May 17, 2026 < $0.01 Riddle site Riddle Proof Profile Warnings Profile Warnings docs lagged behind the shipped surface Bug: Riddle Proof had shipped nonblocking profile warnings for ambiguous network mock response selectors, but the public "
            ],
            "visible_texts": [
              "May 17, 2026 < $0.01 Riddle site Riddle Proof Profile Warnings Profile Warnings docs lagged behind the shipped surface Bug: Riddle Proof had shipped nonblocking profile warnings for ambiguous network mock response selectors, but the public "
            ],
            "match_texts": [
              "May 17, 2026 < $0.01 Riddle site Riddle Proof Profile Warnings Profile Warnings docs lagged behind the shipped surface Bug: Riddle Proof had shipped nonblocking profile warnings for ambiguous network mock response selectors, but the public Riddle Proof docs and agent-facing markdown did not mention Profile Warnings or the warnings result field. Why normal checks missed it: The docs page loaded cleanly, the existing Profile Mode section and network mock terms were visible, /docs/riddle-proof/markdown.md returned 200 text/markdown with nonzero bytes, overflow stayed at 0px, and fatal console/page errors were clean. The gap was semantic: the newly shipped warning surface was absent from both human and machine-consumable docs. Proof lesson: The proof product needs proof for its own proof-authoring contract. When a package adds evidence, warnings, or profile semantics, rendered docs and raw agent-facing markdown should be audited together so agents do not rediscover shipped behavior from changelogs or dogfood notes. Evidence: Initial production job job_6d37e766 proved /docs/riddle-proof/ was otherwise healthy while rendered docs missed Profile Warnings and /docs/riddle-proof/markdown.md missed Profile Warnings plus warnings. Riddle-site PR #131 added the rendered and markdown docs, sidebar link, static guard, and docs-proof checks. Static Preview ps_08e95368 passed as job_cc796a28, Amplify job 112 deployed commit 80b3780, and final production job job_ad1cc6ec passed 9 checks across desktop, phone, iPad Mini, and iPad. Open evidence manifest → Screenshot only → May 17, 2026 < $0.05 LilArcade Builder preview boundary Builder accepted a saved preview path as a fresh build Bug: LilArcade Builder accepted a same-host saved preview URL from /saved/riddle-proof-v454-sneaky-existing/index.html as if it were a fresh build artifact, leaving Open in new tab and Save to Arcade available instead of rejecting the stale saved-artifact path. Why normal checks missed it: The unsafe URL used the trusted preview bucket host, auth and chat both worked, and the page stayed visually stable. The defect only surfaced when proof treated Builder preview context as stricter than saved-player context and required the forbidden saved-preview-path mock to stay at zero hits. Proof lesson: Preview URL safety is contextual. A URL sanitizer that is correct for saved player pages can be too permissive for fresh Builder builds, so proof profiles should encode allowed artifact prefixes, forbidden network hits, and recovery behavior together. Evidence: Initial production job job_643e881d caught Builder rendering Open in new tab and Save to Arcade for the same-host saved preview URL, with forbidden-saved-preview-path-v454 hit twice. LilArcade PR #444 added a Builder-only preview URL gate. Static Preview job job_5e778318 and final production job job_bc56fa3c passed: the saved path was rejected, the forbidden mock stayed at 0 hits, and the recovery build could still be saved and played. Open evidence manifest → Screenshot only → May 16, 2026 < $0.01 Riddle site Good Catch Diary warning hygiene Evidence Manifest preloaded noisy unused assets Bug: The public Good Catch Evidence Manifest looked healthy, but browser console evidence showed unused preload warnings from automatic route prefetch and eager below-the-fold proof screenshots. Why normal checks missed it: The route loaded, all 36 manifest cards rendered, the Profile Mode docs catch and job IDs were visible, overflow stayed at 0px, and fatal console/page errors were clean. The issue lived in warning-level browser noise that the previous fatal-console contract intentionally ignored. Proof lesson: Warning hygiene deserves its own contract. Nonfatal browser warnings can hide performance debt and make later proof runs noisy, so mature public evidence pages should be able to require zero unallowed warnings. Evidence: Initial production job job_07d46452 used the new no_console_warnings contract and caught 9 unused Next CSS preload warnings while the page otherwise passed. Riddle-site PR #128 disabled shared navigation prefetch and lazy-loaded Good Catch screenshots. Fixed Preview job job_1a70de27 and final production job job_4339e21c passed 9 checks across desktop, phone, iPad Mini, and iPad with 0 console warnings. Open evidence manifest → Screenshot only → May 16, 2026 < $0.01 Riddle site Riddle Proof Profile Mode Profile Mode docs lagged behind proof primitives Bug: The public Riddle Proof docs explained profile text semantics, but they did not document the Profile Mode primitives that recent real proof runs were using: network mocks, repeated and delayed responses, request-body receipts, setup actions, and iframe checks. Why normal checks missed it: The docs page loaded cleanly, the existing Profile Text Semantics section was visible, the raw markdown route returned 200, overflow stayed at 0px, and fatal console evidence was clean. The drift was semantic: the rendered and machine-consumable docs had not caught up with the reusable proof contract. Proof lesson: The proof surface itself needs proof. When a package adds or relies on reusable audit primitives, public rendered docs and raw agent-facing markdown should be tested as product contracts. Evidence: Initial production job job_bb0aa65a proved /docs/riddle-proof/ was healthy while both rendered docs and /docs/riddle-proof/markdown.md missed Profile Mode, network_mocks, repeat_responses, delay_ms, request_body_contains, setup_actions, frame_text_visible, and frame_url_equals. Riddle-site PR #126 added the Profile Mode section and regenerated markdown. Static Preview job job_88ad03aa and final production job job_22ee6a7c passed 14 checks across desktop, phone, iPad Mini, and iPad. Open evidence manifest → Screenshot only → May 16, 2026 < $0.01 Riddle site llms.txt proof receipts llms.txt hid the raw proof bundle Bug: The public llms.txt agent index linked to the human proof example page, but it did not link directly to the raw machine-consumable proof bundle that agents should ingest. Why normal checks missed it: The file itself returned 200 text/plain, the human proof example page returned 200, the raw JSON bundle returned 200 application/json, overflow stayed at 0px, and fatal console evidence was clean. The missing contract was discovery: agents had to infer the raw proof receipt from the human page. Proof lesson: Agent indexes should point to raw receipts, not only review pages. If a product publishes machine-consumable proof artifacts, the compact discovery surface needs to expose them directly. Evidence: Production job job_a5d4383b proved /llms.txt, /examples/riddle-proof/, and /examples/riddle-proof/docs-live-proof-bundle.json were healthy while llms.txt omitted the raw bundle URL. Riddle-site PR #124 added Raw proof bundle JSON to llms.txt and ratcheted the static llms guard. Static Preview job job_df22fbc2 and final production job job_ceafae1b passed 6 checks across desktop, phone, iPad Mini, and iPad. Open evidence manifest → Screenshot only → May 16, 2026 < $0.01 Riddle site proof receipts agent-proof Proof example bundle drifted behind the agent-proof contract Bug: The public proof example page rendered cleanly and linked to healthy artifacts, but the raw JSON bundle that agents consume was stale and did not carry proof receipts, the Bring your agent; Riddle brings the proof promise, or the agent-proof contract. Why normal checks missed it: The human page looked trustworthy: the route loaded, the proof example status was passed, all seven artifact links were healthy, overflow was 0px, and fatal console evidence was clean. The drift lived in the machine-consumable proof contract behind the page. Proof lesson: Proof examples are product surfaces too. If agents are expected to consume a raw proof bundle, the proof should validate the raw JSON contract, not only the rendered page and artifact links. Evidence: Initial production job job_30609bc5 proved the page and seven artifact lin"
            ],
            "visible_match_texts": [
              "May 17, 2026 < $0.01 Riddle site Riddle Proof Profile Warnings Profile Warnings docs lagged behind the shipped surface Bug: Riddle Proof had shipped nonblocking profile warnings for ambiguous network mock response selectors, but the public Riddle Proof docs and agent-facing markdown did not mention Profile Warnings or the warnings result field. Why normal checks missed it: The docs page loaded cleanly, the existing Profile Mode section and network mock terms were visible, /docs/riddle-proof/markdown.md returned 200 text/markdown with nonzero bytes, overflow stayed at 0px, and fatal console/page errors were clean. The gap was semantic: the newly shipped warning surface was absent from both human and machine-consumable docs. Proof lesson: The proof product needs proof for its own proof-authoring contract. When a package adds evidence, warnings, or profile semantics, rendered docs and raw agent-facing markdown should be audited together so agents do not rediscover shipped behavior from changelogs or dogfood notes. Evidence: Initial production job job_6d37e766 proved /docs/riddle-proof/ was otherwise healthy while rendered docs missed Profile Warnings and /docs/riddle-proof/markdown.md missed Profile Warnings plus warnings. Riddle-site PR #131 added the rendered and markdown docs, sidebar link, static guard, and docs-proof checks. Static Preview ps_08e95368 passed as job_cc796a28, Amplify job 112 deployed commit 80b3780, and final production job job_ad1cc6ec passed 9 checks across desktop, phone, iPad Mini, and iPad. Open evidence manifest → Screenshot only → May 17, 2026 < $0.05 LilArcade Builder preview boundary Builder accepted a saved preview path as a fresh build Bug: LilArcade Builder accepted a same-host saved preview URL from /saved/riddle-proof-v454-sneaky-existing/index.html as if it were a fresh build artifact, leaving Open in new tab and Save to Arcade available instead of rejecting the stale saved-artifact path. Why normal checks missed it: The unsafe URL used the trusted preview bucket host, auth and chat both worked, and the page stayed visually stable. The defect only surfaced when proof treated Builder preview context as stricter than saved-player context and required the forbidden saved-preview-path mock to stay at zero hits. Proof lesson: Preview URL safety is contextual. A URL sanitizer that is correct for saved player pages can be too permissive for fresh Builder builds, so proof profiles should encode allowed artifact prefixes, forbidden network hits, and recovery behavior together. Evidence: Initial production job job_643e881d caught Builder rendering Open in new tab and Save to Arcade for the same-host saved preview URL, with forbidden-saved-preview-path-v454 hit twice. LilArcade PR #444 added a Builder-only preview URL gate. Static Preview job job_5e778318 and final production job job_bc56fa3c passed: the saved path was rejected, the forbidden mock stayed at 0 hits, and the recovery build could still be saved and played. Open evidence manifest → Screenshot only → May 16, 2026 < $0.01 Riddle site Good Catch Diary warning hygiene Evidence Manifest preloaded noisy unused assets Bug: The public Good Catch Evidence Manifest looked healthy, but browser console evidence showed unused preload warnings from automatic route prefetch and eager below-the-fold proof screenshots. Why normal checks missed it: The route loaded, all 36 manifest cards rendered, the Profile Mode docs catch and job IDs were visible, overflow stayed at 0px, and fatal console/page errors were clean. The issue lived in warning-level browser noise that the previous fatal-console contract intentionally ignored. Proof lesson: Warning hygiene deserves its own contract. Nonfatal browser warnings can hide performance debt and make later proof runs noisy, so mature public evidence pages should be able to require zero unallowed warnings. Evidence: Initial production job job_07d46452 used the new no_console_warnings contract and caught 9 unused Next CSS preload warnings while the page otherwise passed. Riddle-site PR #128 disabled shared navigation prefetch and lazy-loaded Good Catch screenshots. Fixed Preview job job_1a70de27 and final production job job_4339e21c passed 9 checks across desktop, phone, iPad Mini, and iPad with 0 console warnings. Open evidence manifest → Screenshot only → May 16, 2026 < $0.01 Riddle site Riddle Proof Profile Mode Profile Mode docs lagged behind proof primitives Bug: The public Riddle Proof docs explained profile text semantics, but they did not document the Profile Mode primitives that recent real proof runs were using: network mocks, repeated and delayed responses, request-body receipts, setup actions, and iframe checks. Why normal checks missed it: The docs page loaded cleanly, the existing Profile Text Semantics section was visible, the raw markdown route returned 200, overflow stayed at 0px, and fatal console evidence was clean. The drift was semantic: the rendered and machine-consumable docs had not caught up with the reusable proof contract. Proof lesson: The proof surface itself needs proof. When a package adds or relies on reusable audit primitives, public rendered docs and raw agent-facing markdown should be tested as product contracts. Evidence: Initial production job job_bb0aa65a proved /docs/riddle-proof/ was healthy while both rendered docs and /docs/riddle-proof/markdown.md missed Profile Mode, network_mocks, repeat_responses, delay_ms, request_body_contains, setup_actions, frame_text_visible, and frame_url_equals. Riddle-site PR #126 added the Profile Mode section and regenerated markdown. Static Preview job job_88ad03aa and final production job job_22ee6a7c passed 14 checks across desktop, phone, iPad Mini, and iPad. Open evidence manifest → Screenshot only → May 16, 2026 < $0.01 Riddle site llms.txt proof receipts llms.txt hid the raw proof bundle Bug: The public llms.txt agent index linked to the human proof example page, but it did not link directly to the raw machine-consumable proof bundle that agents should ingest. Why normal checks missed it: The file itself returned 200 text/plain, the human proof example page returned 200, the raw JSON bundle returned 200 application/json, overflow stayed at 0px, and fatal console evidence was clean. The missing contract was discovery: agents had to infer the raw proof receipt from the human page. Proof lesson: Agent indexes should point to raw receipts, not only review pages. If a product publishes machine-consumable proof artifacts, the compact discovery surface needs to expose them directly. Evidence: Production job job_a5d4383b proved /llms.txt, /examples/riddle-proof/, and /examples/riddle-proof/docs-live-proof-bundle.json were healthy while llms.txt omitted the raw bundle URL. Riddle-site PR #124 added Raw proof bundle JSON to llms.txt and ratcheted the static llms guard. Static Preview job job_df22fbc2 and final production job job_ceafae1b passed 6 checks across desktop, phone, iPad Mini, and iPad. Open evidence manifest → Screenshot only → May 16, 2026 < $0.01 Riddle site proof receipts agent-proof Proof example bundle drifted behind the agent-proof contract Bug: The public proof example page rendered cleanly and linked to healthy artifacts, but the raw JSON bundle that agents consume was stale and did not carry proof receipts, the Bring your agent; Riddle brings the proof promise, or the agent-proof contract. Why normal checks missed it: The human page looked trustworthy: the route loaded, the proof example status was passed, all seven artifact links were healthy, overflow was 0px, and fatal console evidence was clean. The drift lived in the machine-consumable proof contract behind the page. Proof lesson: Proof examples are product surfaces too. If agents are expected to consume a raw proof bundle, the proof should validate the raw JSON contract, not only the rendered page and artifact links. Evidence: Initial production job job_30609bc5 proved the page and seven artifact lin"
            ]
          },
          ".proof-stats": {
            "count": 1,
            "visible_count": 1,
            "texts": [
              "39 curated catches from recent real browser proof runs. <$0.10 Even a ten-minute proof run is under nine cents of browser time. 0 source Many findings can be detected from the outside with a URL and browser contract. Manifest Each catch lin"
            ],
            "visible_texts": [
              "39 curated catches from recent real browser proof runs. <$0.10 Even a ten-minute proof run is under nine cents of browser time. 0 source Many findings can be detected from the outside with a URL and browser contract. Manifest Each catch lin"
            ],
            "match_texts": [
              "39 curated catches from recent real browser proof runs. <$0.10 Even a ten-minute proof run is under nine cents of browser time. 0 source Many findings can be detected from the outside with a URL and browser contract. Manifest Each catch links to a receipt with screenshots, logs, run metadata, and the sales lesson."
            ],
            "visible_match_texts": [
              "39 curated catches from recent real browser proof runs. <$0.10 Even a ten-minute proof run is under nine cents of browser time. 0 source Many findings can be detected from the outside with a URL and browser contract. Manifest Each catch links to a receipt with screenshots, logs, run metadata, and the sales lesson."
            ]
          }
        },
        "text_matches": {},
        "http_statuses": {
          "GET https://riddledc.com/llms.txt": {
            "version": "riddle-proof.http-status.v1",
            "url": "https://riddledc.com/llms.txt",
            "method": "GET",
            "status": 200,
            "ok": true,
            "error": null,
            "request_body_bytes": 0,
            "allowed_statuses": [
              200
            ],
            "require_nonzero_bytes": false,
            "min_bytes": 800,
            "allowed_content_types": [
              "text/plain"
            ],
            "redirected": false,
            "final_url": "https://riddledc.com/llms.txt",
            "content_type": "text/plain",
            "content_length": null,
            "status_text": "OK",
            "bytes": 2014,
            "body_sample": "# Riddle\n\nHosted browser automation, Preview, and proof artifacts for AI agents.\n\nRiddle gives agents hosted browsers, screenshots, console logs, DOM evidence, static and server previews, MCP tools, OpenAPI actions, and proof receipts. Use this file as the compact starting point for agent-readable Riddle docs.\n\n## Core Agent Resources\n\n- API documentation: https://riddledc.com/docs/markdown.md\n- Riddle Proof docs: https://riddledc.com/docs/riddle-proof/markdown.md\n- Preview tools docs: https://riddledc.com/docs/preview/markdown.md\n- MCP docs: https://riddledc.com/mcp/markdown.md\n- Agent guide: https://riddledc.com/ai-agents/guide/markdown.md\n\n## Machine Contracts\n\n- GPT Actions OpenAPI YAML: https://riddledc.com/.well-known/riddledc-actions-openapi.yaml\n- GPT Actions OpenAPI JSON: https://riddledc.com/riddledc-actions-openapi.json\n- Public sitemap: https://riddledc.com/sitemap.xml\n- Robots policy: https://riddledc.com/robots.txt\n\n## Proof And Evidence\n\n- Riddle Proof landing page: http",
            "body_contains": {
              "Good Catch Diary: https://riddledc.com/proof/good-catches/": true,
              "Evidence Manifest: https://riddledc.com/proof/good-catches/evidence/": true,
              "Use the Good Catch Diary and Evidence Manifest when you need examples of real proof-driven catches.": true
            }
          },
          "GET https://riddledc.com/docs/riddle-proof/markdown.md": {
            "version": "riddle-proof.http-status.v1",
            "url": "https://riddledc.com/docs/riddle-proof/markdown.md",
            "method": "GET",
            "status": 200,
            "ok": true,
            "error": null,
            "request_body_bytes": 0,
            "allowed_statuses": [
              200
            ],
            "require_nonzero_bytes": false,
            "min_bytes": 1000,
            "allowed_content_types": [
              "text/markdown",
              "text/plain"
            ],
            "redirected": false,
            "final_url": "https://riddledc.com/docs/riddle-proof/markdown.md",
            "content_type": "text/markdown",
            "content_length": 20561,
            "status_text": "OK",
            "bytes": 20561,
            "body_sample": "# Riddle Proof\n\nEvidence-backed workflows for agent-authored browser changes.\n\nPlain text for agents: https://riddledc.com/docs/riddle-proof/markdown.md\n\n## What It Is\n\nRiddle Proof is a workflow for turning an agent's code change into inspectable evidence. It runs the actual app in a browser, exercises the behavior that matters, captures artifacts, and records whether the change met the stated proof criteria.\n\nBuild output and unit tests are still important, but they do not prove that a user-facing browser flow works. Riddle Proof fills that gap with real previews, screenshots, JSON artifacts, console output, diagnostics, and ship gates.\n\nThe contract is agent-agnostic: use it from Codex, Claude Code, OpenClaw, CI, or any workflow that can run a browser proof script and preserve the resulting evidence.\n\nShort version: bring your agent; Riddle brings the proof.\n\n## When To Use It\n\nUse Riddle Proof when correctness depends on the browser, a running server, generated assets, timing, layo",
            "body_contains": {
              "## Profile Warnings": true,
              "warnings": true,
              "request_body_contains": true,
              "network_mocks": true
            }
          }
        },
        "link_statuses": {
          "img[src*='/proof/good-catches/artifacts/']": {
            "version": "riddle-proof.link-status.v1",
            "selector": "img[src*='/proof/good-catches/artifacts/']",
            "max_links": 45,
            "same_origin_only": true,
            "dedupe": true,
            "require_nonzero_bytes": true,
            "min_bytes": 10000,
            "allowed_content_types": [
              "image/*"
            ],
            "allowed_statuses": [
              "2xx",
              "3xx"
            ],
            "discovered_count": 39,
            "total_count": 39,
            "truncated": false,
            "ok_count": 39,
            "failed_count": 0,
            "status_counts": {
              "200": 39
            },
            "failures": [],
            "result_count": 39,
            "stored_result_count": 5,
            "omitted_result_count": 34,
            "omitted_success_count": 34,
            "results_compacted": true,
            "results": [
              {
                "url": "https://riddledc.com/proof/good-catches/artifacts/job_6d37e766/riddle-site-v460-riddle-proof-profile-warnings-docs-desktop.png",
                "tag": "img",
                "text": null,
                "status": 200,
                "method": "HEAD",
                "ok": true,
                "content_type": "image/png",
                "content_length": 1356247,
                "bytes": null,
                "redirected": false,
                "final_url": "https://riddledc.com/proof/good-catches/artifacts/job_6d37e766/riddle-site-v460-riddle-proof-profile-warnings-docs-desktop.png",
                "error": null
              },
              {
                "url": "https://riddledc.com/proof/good-catches/artifacts/job_643e881d/lilarcade-v454-builder-saved-preview-path-rejection-desktop.png",
                "tag": "img",
                "text": null,
                "status": 200,
                "method": "HEAD",
                "ok": true,
                "content_type": "image/png",
                "content_length": 36325,
                "bytes": null,
                "redirected": false,
                "final_url": "https://riddledc.com/proof/good-catches/artifacts/job_643e881d/lilarcade-v454-builder-saved-preview-path-rejection-desktop.png",
                "error": null
              },
              {
                "url": "https://riddledc.com/proof/good-catches/artifacts/job_07d46452/riddle-site-v443-good-catch-warning-hygiene-desktop.png",
                "tag": "img",
                "text": null,
                "status": 200,
                "method": "HEAD",
                "ok": true,
                "content_type": "image/png",
                "content_length": 9670725,
                "bytes": null,
                "redirected": false,
                "final_url": "https://riddledc.com/proof/good-catches/artifacts/job_07d46452/riddle-site-v443-good-catch-warning-hygiene-desktop.png",
                "error": null
              },
              {
                "url": "https://riddledc.com/proof/good-catches/artifacts/job_bb0aa65a/riddle-site-v441-riddle-proof-profile-mode-contract-desktop.png",
                "tag": "img",
                "text": null,
                "status": 200,
                "method": "HEAD",
                "ok": true,
                "content_type": "image/png",
                "content_length": 1264710,
                "bytes": null,
                "redirected": false,
                "final_url": "https://riddledc.com/proof/good-catches/artifacts/job_bb0aa65a/riddle-site-v441-riddle-proof-profile-mode-contract-desktop.png",
                "error": null
              },
              {
                "url": "https://riddledc.com/proof/good-catches/artifacts/job_a5d4383b/riddle-site-v426-llms-proof-example-raw-bundle-desktop.png",
                "tag": "img",
                "text": null,
                "status": 200,
                "method": "HEAD",
                "ok": true,
                "content_type": "image/png",
                "content_length": 92204,
                "bytes": null,
                "redirected": false,
                "final_url": "https://riddledc.com/proof/good-catches/artifacts/job_a5d4383b/riddle-site-v426-llms-proof-example-raw-bundle-desktop.png",
                "error": null
              }
            ]
          },
          "a.catch-link[href*='/proof/good-catches/evidence/#']": {
            "version": "riddle-proof.link-status.v1",
            "selector": "a.catch-link[href*='/proof/good-catches/evidence/#']",
            "max_links": 45,
            "same_origin_only": true,
            "dedupe": true,
            "require_nonzero_bytes": true,
            "min_bytes": 1000,
            "allowed_content_types": [
              "text/html"
            ],
            "allowed_statuses": [
              "2xx",
              "3xx"
            ],
            "discovered_count": 39,
            "total_count": 39,
            "truncated": false,
            "ok_count": 39,
            "failed_count": 0,
            "status_counts": {
              "206": 39
            },
            "failures": [],
            "result_count": 39,
            "stored_result_count": 5,
            "omitted_result_count": 34,
            "omitted_success_count": 34,
            "results_compacted": true,
            "results": [
              {
                "url": "https://riddledc.com/proof/good-catches/evidence/#profile-warnings-docs-lagged-behind-shipped-surface",
                "tag": "a",
                "text": "Open evidence manifest →",
                "status": 206,
                "method": "GET",
                "ok": true,
                "content_type": "text/html; charset=utf-8",
                "content_length": 1000,
                "bytes": 1000,
                "redirected": false,
                "final_url": "https://riddledc.com/proof/good-catches/evidence/",
                "error": null
              },
              {
                "url": "https://riddledc.com/proof/good-catches/evidence/#builder-accepted-saved-preview-path-as-fresh-build",
                "tag": "a",
                "text": "Open evidence manifest →",
                "status": 206,
                "method": "GET",
                "ok": true,
                "content_type": "text/html; charset=utf-8",
                "content_length": 1000,
                "bytes": 1000,
                "redirected": false,
                "final_url": "https://riddledc.com/proof/good-catches/evidence/",
                "error": null
              },
              {
                "url": "https://riddledc.com/proof/good-catches/evidence/#evidence-manifest-preloaded-noisy-unused-assets",
                "tag": "a",
                "text": "Open evidence manifest →",
                "status": 206,
                "method": "GET",
                "ok": true,
                "content_type": "text/html; charset=utf-8",
                "content_length": 1000,
                "bytes": 1000,
                "redirected": false,
                "final_url": "https://riddledc.com/proof/good-catches/evidence/",
                "error": null
              },
              {
                "url": "https://riddledc.com/proof/good-catches/evidence/#profile-mode-docs-lagged-behind-proof-primitives",
                "tag": "a",
                "text": "Open evidence manifest →",
                "status": 206,
                "method": "GET",
                "ok": true,
                "content_type": "text/html; charset=utf-8",
                "content_length": 1000,
                "bytes": 1000,
                "redirected": false,
                "final_url": "https://riddledc.com/proof/good-catches/evidence/",
                "error": null
              },
              {
                "url": "https://riddledc.com/proof/good-catches/evidence/#llms-txt-hid-the-raw-proof-bundle",
                "tag": "a",
                "text": "Open evidence manifest →",
                "status": 206,
                "method": "GET",
                "ok": true,
                "content_type": "text/html; charset=utf-8",
                "content_length": 1000,
                "bytes": 1000,
                "redirected": false,
                "final_url": "https://riddledc.com/proof/good-catches/evidence/",
                "error": null
              }
            ]
          }
        },
        "setup_action_results": [],
        "screenshot_label": "riddle-site-v462-good-catch-diary-current-surface-desktop"
      },
      {
        "name": "phone",
        "width": 390,
        "height": 844,
        "url": "https://riddledc.com/proof/good-catches/",
        "route": {
          "requested": "https://riddledc.com/proof/good-catches/",
          "observed": "/proof/good-catches/",
          "expected_path": "/proof/good-catches/",
          "matched": true,
          "http_status": 200
        },
        "title": "Good Catch Diary - Riddle Proof | Riddle",
        "body_text_length": 42546,
        "body_text_sample": "Skip to main content Riddle ← Riddle Proof GOOD CATCH DIARY Real bugs caught by cheap browser proof. A running diary of browser-visible issues found by real Riddle Proof runs. Each entry explains the bug, the evidence, and the general proof lesson. Open the evidence manifest Read the docs 39 curated catches from recent real browser proof runs. <$0.10 Even a ten-minute proof run is under nine cents of browser time. 0 source Many findings can be detected from the outside with a URL and browser contract. Manifest Each catch links to a receipt with screenshots, logs, run metadata, and the sales lesson. The diary BUG → EVIDENCE → LESSON May 17, 2026 < $0.01 Riddle site Riddle Proof Profile Warnings Profile Warnings docs lagged behind the shipped surface Bug: Riddle Proof had shipped nonblocking profile warnings for ambiguous network mock response selectors, but the public Riddle Proof docs and agent-facing markdown did not mention Profile Warnings or the warnings result field. Why normal checks missed it: The docs page loaded cleanly, the existing Profile Mode section and network mock terms were visible, /docs/riddle-proof/markdown.md returned 200 text/markdown with nonzero bytes, overflow stayed at 0px, and fatal console/page errors were clean. The gap was semantic: the newly shipped warning surface was absent from both human and machine-consumable docs. Proof lesson: The proof product needs proof for its own proof-authoring contract. When a package adds evidence, warnings, or profile semantics, rendered docs and raw agent-facing markdown should be audited together so agents do not rediscover shipped behavior from changelogs or dogfood notes. Evidence: Initial production job job_6d37e766 proved /docs/riddle-proof/ was otherwise healthy while rendered docs missed Profile Warnings and /docs/riddle-proof/markdown.md missed Profile Warnings plus warnings. Riddle-site PR #131 added the rendered and markdown docs, sidebar link, static guard, and docs-proof checks. Static Preview ps_08e95368 passed as job_cc796a28, Amplify job 112 deployed commit 80b3780, and final production job job_ad1cc6ec passed 9 checks across desktop, phone, iPad Mini, and iPad. Open evidence manifest → Screenshot only → May 17, 2026 < $0.05 LilArcade Builder preview boundary Builder accepted a saved preview path as a fresh build Bug: LilArcade Builder accepted a same-host saved preview URL from /saved/riddle-proof-v454-sneaky-existing/index.html as if it were a fresh build artifact, leaving Open in new tab and Save to Arcade available instead of rejecting the stale saved-artifact path. Why normal checks missed it: The unsafe URL used the trusted preview bucket host, auth and chat both worked, and the page stayed visually stable. The defect only surfaced when proof treated Builder preview context as stricter than saved-player context and required the forbidden saved-preview-path mock to stay at zero hits. Proof lesson: Preview URL safety is contextual. A URL sanitizer that is correct for saved player pages can be too permissive for fresh Builder builds, so proof profiles should encode allowed artifact prefixes, forbidden network hits, and recovery behavior together. Evidence: Initial production job job_643e881d caught Builder rendering Open in new tab and Save to Arcade for the same-host saved preview URL, with forbidden-saved-preview-path-v454 hit twice. LilArcade PR #444 added a Builder-only preview URL gate. Static Preview job job_5e778318 and final production job job_bc56fa3c passed: the saved path was rejected, the forbidden mock stayed at 0 hits, and the recovery build could still be saved and played. Open evidence manifest → Screenshot only → May 16, 2026 < $0.01 Riddle site Good Catch Diary warning hygiene Evidence Manifest preloaded noisy unused assets Bug: The public Good Catch Evidence Manifest looked healthy, but browser console evidence showed unused preload warnings from automatic route prefetch and eager below-the-fold proof screenshots. Why normal checks missed it: The route loaded, all 36 manifest cards rendered, the Profile Mode docs catch and job IDs were visible, overflow stayed at 0px, and fatal console/page errors were clean. The issue lived in warning-level browser noise that the previous fatal-console contract intentionally ignored. Proof lesson: Warning hygiene deserves its own contract. Nonfatal browser warnings can hide performance debt and make later proof runs noisy, so mature public evidence pages should be able to require zero unallowed warnings. Evidence: Initial production job job_07d46452 used the new no_console_warnings contract and caught 9 unused Next CSS preload warnings while the page otherwise passed. Riddle-site PR #128 disabled shared navigation prefetch and lazy-loaded Good Catch screenshots. Fixed Preview job job_1a70de27 and final production job job_4339e21c passed 9 checks across desktop, phone, iPad Mini, and iPad with 0 console warnings. Open evidence manifest → Screenshot only → May 16, 2026 < $0.01 Riddle site Riddle Proof Profile Mode Profile Mode docs lagged behind proof primitives Bug: The public Riddle Proof docs explained profile text semantics, but they did not document the Profile Mode primitives that recent real proof runs were using: network mocks, repeated and delayed responses, request-body receipts, setup actions, and iframe checks. Why normal checks missed it: The docs page loaded cleanly, the existing Profile Text Semantics section was visible, the raw markdown route returned 200, overflow stayed at 0px, and fatal console evidence was clean. The drift was semantic: the rendered and machine-consumable docs had not caught up with the reusable proof contract. Proof lesson: The proof surface itself needs proof. When a package adds or relies on reusable audit primitives, public rendered docs and raw agent-facing markdown should be tested as product contracts. Evidence: Initial production job job_bb0aa65a proved /docs/riddle-proof/ was healthy while both rendered docs and /docs/riddle-proof/markdown.md missed Profile Mode, network_mocks, repeat_responses, delay_ms, request_body_contains, setup_actions, frame_text_visible, and frame_url_equals. Riddle-site PR #126 added the Profile Mode section and regenerated markdown. Static Preview job job_88ad03aa and final production job job_22ee6a7c passed 14 checks across desktop, phone, iPad Mini, and iPad. Open evidence manifest → Screenshot only → May 16, 2026 < $0.01 Riddle site llms.txt proof receipts llms.txt hid the raw proof bundle Bug: The public llms.txt agent index linked to the human proof example page, but it did not link directly to the raw machine-consumable proof bundle that agents should ingest. Why normal checks missed it: The file itself returned 200 text/plain, the human proof example page returned 200, the raw JSON bundle returned 200 application/json, overflow stayed at 0px, and fatal console evidence was clean. The missing contract was discovery: agents had to infer the raw proof receipt from the human page. Proof lesson: Agent indexes should point to raw receipts, not only review pages. If a product publishes machine-consumable proof artifacts, the compact discovery surface needs to expose them directly. Evidence: Production job job_a5d4383b proved /llms.txt, /examples/riddle-proof/, and /examples/riddle-proof/docs-live-proof-bundle.json were healthy while llms.txt omitted the raw bundle URL. Riddle-site PR #124 added Raw proof bundle JSON to llms.txt and ratcheted the static llms guard. Static Preview job job_df22fbc2 and final production job job_ceafae1b passed 6 checks across desktop, phone, iPad Mini, and iPad. Open evidence manifest → Screenshot only → May 16, 2026 < $0.01 Riddle site proof receipts agent-proof Proof example bundle drifted behind the agent-proof contract Bug: The public proof example page rendered cleanly and linked to healthy artifacts, but the raw JSON bundle that agents consume was stale and did not carry proof receipts, the Bring your agent;",
        "scroll_width": 390,
        "client_width": 390,
        "overflow_px": 0,
        "bounds_overflow_px": 0,
        "overflow_offenders": [],
        "selectors": {
          ".catch-grid": {
            "count": 1,
            "visible_count": 1
          },
          ".catch-card": {
            "count": 39,
            "visible_count": 39
          },
          ".proof-stats": {
            "count": 1,
            "visible_count": 1
          }
        },
        "frames": {},
        "text_sequences": {
          ".catch-grid": {
            "count": 1,
            "visible_count": 1,
            "texts": [
              "May 17, 2026 < $0.01 Riddle site Riddle Proof Profile Warnings Profile Warnings docs lagged behind the shipped surface Bug: Riddle Proof had shipped nonblocking profile warnings for ambiguous network mock response selectors, but the public "
            ],
            "visible_texts": [
              "May 17, 2026 < $0.01 Riddle site Riddle Proof Profile Warnings Profile Warnings docs lagged behind the shipped surface Bug: Riddle Proof had shipped nonblocking profile warnings for ambiguous network mock response selectors, but the public "
            ],
            "match_texts": [
              "May 17, 2026 < $0.01 Riddle site Riddle Proof Profile Warnings Profile Warnings docs lagged behind the shipped surface Bug: Riddle Proof had shipped nonblocking profile warnings for ambiguous network mock response selectors, but the public Riddle Proof docs and agent-facing markdown did not mention Profile Warnings or the warnings result field. Why normal checks missed it: The docs page loaded cleanly, the existing Profile Mode section and network mock terms were visible, /docs/riddle-proof/markdown.md returned 200 text/markdown with nonzero bytes, overflow stayed at 0px, and fatal console/page errors were clean. The gap was semantic: the newly shipped warning surface was absent from both human and machine-consumable docs. Proof lesson: The proof product needs proof for its own proof-authoring contract. When a package adds evidence, warnings, or profile semantics, rendered docs and raw agent-facing markdown should be audited together so agents do not rediscover shipped behavior from changelogs or dogfood notes. Evidence: Initial production job job_6d37e766 proved /docs/riddle-proof/ was otherwise healthy while rendered docs missed Profile Warnings and /docs/riddle-proof/markdown.md missed Profile Warnings plus warnings. Riddle-site PR #131 added the rendered and markdown docs, sidebar link, static guard, and docs-proof checks. Static Preview ps_08e95368 passed as job_cc796a28, Amplify job 112 deployed commit 80b3780, and final production job job_ad1cc6ec passed 9 checks across desktop, phone, iPad Mini, and iPad. Open evidence manifest → Screenshot only → May 17, 2026 < $0.05 LilArcade Builder preview boundary Builder accepted a saved preview path as a fresh build Bug: LilArcade Builder accepted a same-host saved preview URL from /saved/riddle-proof-v454-sneaky-existing/index.html as if it were a fresh build artifact, leaving Open in new tab and Save to Arcade available instead of rejecting the stale saved-artifact path. Why normal checks missed it: The unsafe URL used the trusted preview bucket host, auth and chat both worked, and the page stayed visually stable. The defect only surfaced when proof treated Builder preview context as stricter than saved-player context and required the forbidden saved-preview-path mock to stay at zero hits. Proof lesson: Preview URL safety is contextual. A URL sanitizer that is correct for saved player pages can be too permissive for fresh Builder builds, so proof profiles should encode allowed artifact prefixes, forbidden network hits, and recovery behavior together. Evidence: Initial production job job_643e881d caught Builder rendering Open in new tab and Save to Arcade for the same-host saved preview URL, with forbidden-saved-preview-path-v454 hit twice. LilArcade PR #444 added a Builder-only preview URL gate. Static Preview job job_5e778318 and final production job job_bc56fa3c passed: the saved path was rejected, the forbidden mock stayed at 0 hits, and the recovery build could still be saved and played. Open evidence manifest → Screenshot only → May 16, 2026 < $0.01 Riddle site Good Catch Diary warning hygiene Evidence Manifest preloaded noisy unused assets Bug: The public Good Catch Evidence Manifest looked healthy, but browser console evidence showed unused preload warnings from automatic route prefetch and eager below-the-fold proof screenshots. Why normal checks missed it: The route loaded, all 36 manifest cards rendered, the Profile Mode docs catch and job IDs were visible, overflow stayed at 0px, and fatal console/page errors were clean. The issue lived in warning-level browser noise that the previous fatal-console contract intentionally ignored. Proof lesson: Warning hygiene deserves its own contract. Nonfatal browser warnings can hide performance debt and make later proof runs noisy, so mature public evidence pages should be able to require zero unallowed warnings. Evidence: Initial production job job_07d46452 used the new no_console_warnings contract and caught 9 unused Next CSS preload warnings while the page otherwise passed. Riddle-site PR #128 disabled shared navigation prefetch and lazy-loaded Good Catch screenshots. Fixed Preview job job_1a70de27 and final production job job_4339e21c passed 9 checks across desktop, phone, iPad Mini, and iPad with 0 console warnings. Open evidence manifest → Screenshot only → May 16, 2026 < $0.01 Riddle site Riddle Proof Profile Mode Profile Mode docs lagged behind proof primitives Bug: The public Riddle Proof docs explained profile text semantics, but they did not document the Profile Mode primitives that recent real proof runs were using: network mocks, repeated and delayed responses, request-body receipts, setup actions, and iframe checks. Why normal checks missed it: The docs page loaded cleanly, the existing Profile Text Semantics section was visible, the raw markdown route returned 200, overflow stayed at 0px, and fatal console evidence was clean. The drift was semantic: the rendered and machine-consumable docs had not caught up with the reusable proof contract. Proof lesson: The proof surface itself needs proof. When a package adds or relies on reusable audit primitives, public rendered docs and raw agent-facing markdown should be tested as product contracts. Evidence: Initial production job job_bb0aa65a proved /docs/riddle-proof/ was healthy while both rendered docs and /docs/riddle-proof/markdown.md missed Profile Mode, network_mocks, repeat_responses, delay_ms, request_body_contains, setup_actions, frame_text_visible, and frame_url_equals. Riddle-site PR #126 added the Profile Mode section and regenerated markdown. Static Preview job job_88ad03aa and final production job job_22ee6a7c passed 14 checks across desktop, phone, iPad Mini, and iPad. Open evidence manifest → Screenshot only → May 16, 2026 < $0.01 Riddle site llms.txt proof receipts llms.txt hid the raw proof bundle Bug: The public llms.txt agent index linked to the human proof example page, but it did not link directly to the raw machine-consumable proof bundle that agents should ingest. Why normal checks missed it: The file itself returned 200 text/plain, the human proof example page returned 200, the raw JSON bundle returned 200 application/json, overflow stayed at 0px, and fatal console evidence was clean. The missing contract was discovery: agents had to infer the raw proof receipt from the human page. Proof lesson: Agent indexes should point to raw receipts, not only review pages. If a product publishes machine-consumable proof artifacts, the compact discovery surface needs to expose them directly. Evidence: Production job job_a5d4383b proved /llms.txt, /examples/riddle-proof/, and /examples/riddle-proof/docs-live-proof-bundle.json were healthy while llms.txt omitted the raw bundle URL. Riddle-site PR #124 added Raw proof bundle JSON to llms.txt and ratcheted the static llms guard. Static Preview job job_df22fbc2 and final production job job_ceafae1b passed 6 checks across desktop, phone, iPad Mini, and iPad. Open evidence manifest → Screenshot only → May 16, 2026 < $0.01 Riddle site proof receipts agent-proof Proof example bundle drifted behind the agent-proof contract Bug: The public proof example page rendered cleanly and linked to healthy artifacts, but the raw JSON bundle that agents consume was stale and did not carry proof receipts, the Bring your agent; Riddle brings the proof promise, or the agent-proof contract. Why normal checks missed it: The human page looked trustworthy: the route loaded, the proof example status was passed, all seven artifact links were healthy, overflow was 0px, and fatal console evidence was clean. The drift lived in the machine-consumable proof contract behind the page. Proof lesson: Proof examples are product surfaces too. If agents are expected to consume a raw proof bundle, the proof should validate the raw JSON contract, not only the rendered page and artifact links. Evidence: Initial production job job_30609bc5 proved the page and seven artifact lin"
            ],
            "visible_match_texts": [
              "May 17, 2026 < $0.01 Riddle site Riddle Proof Profile Warnings Profile Warnings docs lagged behind the shipped surface Bug: Riddle Proof had shipped nonblocking profile warnings for ambiguous network mock response selectors, but the public Riddle Proof docs and agent-facing markdown did not mention Profile Warnings or the warnings result field. Why normal checks missed it: The docs page loaded cleanly, the existing Profile Mode section and network mock terms were visible, /docs/riddle-proof/markdown.md returned 200 text/markdown with nonzero bytes, overflow stayed at 0px, and fatal console/page errors were clean. The gap was semantic: the newly shipped warning surface was absent from both human and machine-consumable docs. Proof lesson: The proof product needs proof for its own proof-authoring contract. When a package adds evidence, warnings, or profile semantics, rendered docs and raw agent-facing markdown should be audited together so agents do not rediscover shipped behavior from changelogs or dogfood notes. Evidence: Initial production job job_6d37e766 proved /docs/riddle-proof/ was otherwise healthy while rendered docs missed Profile Warnings and /docs/riddle-proof/markdown.md missed Profile Warnings plus warnings. Riddle-site PR #131 added the rendered and markdown docs, sidebar link, static guard, and docs-proof checks. Static Preview ps_08e95368 passed as job_cc796a28, Amplify job 112 deployed commit 80b3780, and final production job job_ad1cc6ec passed 9 checks across desktop, phone, iPad Mini, and iPad. Open evidence manifest → Screenshot only → May 17, 2026 < $0.05 LilArcade Builder preview boundary Builder accepted a saved preview path as a fresh build Bug: LilArcade Builder accepted a same-host saved preview URL from /saved/riddle-proof-v454-sneaky-existing/index.html as if it were a fresh build artifact, leaving Open in new tab and Save to Arcade available instead of rejecting the stale saved-artifact path. Why normal checks missed it: The unsafe URL used the trusted preview bucket host, auth and chat both worked, and the page stayed visually stable. The defect only surfaced when proof treated Builder preview context as stricter than saved-player context and required the forbidden saved-preview-path mock to stay at zero hits. Proof lesson: Preview URL safety is contextual. A URL sanitizer that is correct for saved player pages can be too permissive for fresh Builder builds, so proof profiles should encode allowed artifact prefixes, forbidden network hits, and recovery behavior together. Evidence: Initial production job job_643e881d caught Builder rendering Open in new tab and Save to Arcade for the same-host saved preview URL, with forbidden-saved-preview-path-v454 hit twice. LilArcade PR #444 added a Builder-only preview URL gate. Static Preview job job_5e778318 and final production job job_bc56fa3c passed: the saved path was rejected, the forbidden mock stayed at 0 hits, and the recovery build could still be saved and played. Open evidence manifest → Screenshot only → May 16, 2026 < $0.01 Riddle site Good Catch Diary warning hygiene Evidence Manifest preloaded noisy unused assets Bug: The public Good Catch Evidence Manifest looked healthy, but browser console evidence showed unused preload warnings from automatic route prefetch and eager below-the-fold proof screenshots. Why normal checks missed it: The route loaded, all 36 manifest cards rendered, the Profile Mode docs catch and job IDs were visible, overflow stayed at 0px, and fatal console/page errors were clean. The issue lived in warning-level browser noise that the previous fatal-console contract intentionally ignored. Proof lesson: Warning hygiene deserves its own contract. Nonfatal browser warnings can hide performance debt and make later proof runs noisy, so mature public evidence pages should be able to require zero unallowed warnings. Evidence: Initial production job job_07d46452 used the new no_console_warnings contract and caught 9 unused Next CSS preload warnings while the page otherwise passed. Riddle-site PR #128 disabled shared navigation prefetch and lazy-loaded Good Catch screenshots. Fixed Preview job job_1a70de27 and final production job job_4339e21c passed 9 checks across desktop, phone, iPad Mini, and iPad with 0 console warnings. Open evidence manifest → Screenshot only → May 16, 2026 < $0.01 Riddle site Riddle Proof Profile Mode Profile Mode docs lagged behind proof primitives Bug: The public Riddle Proof docs explained profile text semantics, but they did not document the Profile Mode primitives that recent real proof runs were using: network mocks, repeated and delayed responses, request-body receipts, setup actions, and iframe checks. Why normal checks missed it: The docs page loaded cleanly, the existing Profile Text Semantics section was visible, the raw markdown route returned 200, overflow stayed at 0px, and fatal console evidence was clean. The drift was semantic: the rendered and machine-consumable docs had not caught up with the reusable proof contract. Proof lesson: The proof surface itself needs proof. When a package adds or relies on reusable audit primitives, public rendered docs and raw agent-facing markdown should be tested as product contracts. Evidence: Initial production job job_bb0aa65a proved /docs/riddle-proof/ was healthy while both rendered docs and /docs/riddle-proof/markdown.md missed Profile Mode, network_mocks, repeat_responses, delay_ms, request_body_contains, setup_actions, frame_text_visible, and frame_url_equals. Riddle-site PR #126 added the Profile Mode section and regenerated markdown. Static Preview job job_88ad03aa and final production job job_22ee6a7c passed 14 checks across desktop, phone, iPad Mini, and iPad. Open evidence manifest → Screenshot only → May 16, 2026 < $0.01 Riddle site llms.txt proof receipts llms.txt hid the raw proof bundle Bug: The public llms.txt agent index linked to the human proof example page, but it did not link directly to the raw machine-consumable proof bundle that agents should ingest. Why normal checks missed it: The file itself returned 200 text/plain, the human proof example page returned 200, the raw JSON bundle returned 200 application/json, overflow stayed at 0px, and fatal console evidence was clean. The missing contract was discovery: agents had to infer the raw proof receipt from the human page. Proof lesson: Agent indexes should point to raw receipts, not only review pages. If a product publishes machine-consumable proof artifacts, the compact discovery surface needs to expose them directly. Evidence: Production job job_a5d4383b proved /llms.txt, /examples/riddle-proof/, and /examples/riddle-proof/docs-live-proof-bundle.json were healthy while llms.txt omitted the raw bundle URL. Riddle-site PR #124 added Raw proof bundle JSON to llms.txt and ratcheted the static llms guard. Static Preview job job_df22fbc2 and final production job job_ceafae1b passed 6 checks across desktop, phone, iPad Mini, and iPad. Open evidence manifest → Screenshot only → May 16, 2026 < $0.01 Riddle site proof receipts agent-proof Proof example bundle drifted behind the agent-proof contract Bug: The public proof example page rendered cleanly and linked to healthy artifacts, but the raw JSON bundle that agents consume was stale and did not carry proof receipts, the Bring your agent; Riddle brings the proof promise, or the agent-proof contract. Why normal checks missed it: The human page looked trustworthy: the route loaded, the proof example status was passed, all seven artifact links were healthy, overflow was 0px, and fatal console evidence was clean. The drift lived in the machine-consumable proof contract behind the page. Proof lesson: Proof examples are product surfaces too. If agents are expected to consume a raw proof bundle, the proof should validate the raw JSON contract, not only the rendered page and artifact links. Evidence: Initial production job job_30609bc5 proved the page and seven artifact lin"
            ]
          },
          ".proof-stats": {
            "count": 1,
            "visible_count": 1,
            "texts": [
              "39 curated catches from recent real browser proof runs. <$0.10 Even a ten-minute proof run is under nine cents of browser time. 0 source Many findings can be detected from the outside with a URL and browser contract. Manifest Each catch lin"
            ],
            "visible_texts": [
              "39 curated catches from recent real browser proof runs. <$0.10 Even a ten-minute proof run is under nine cents of browser time. 0 source Many findings can be detected from the outside with a URL and browser contract. Manifest Each catch lin"
            ],
            "match_texts": [
              "39 curated catches from recent real browser proof runs. <$0.10 Even a ten-minute proof run is under nine cents of browser time. 0 source Many findings can be detected from the outside with a URL and browser contract. Manifest Each catch links to a receipt with screenshots, logs, run metadata, and the sales lesson."
            ],
            "visible_match_texts": [
              "39 curated catches from recent real browser proof runs. <$0.10 Even a ten-minute proof run is under nine cents of browser time. 0 source Many findings can be detected from the outside with a URL and browser contract. Manifest Each catch links to a receipt with screenshots, logs, run metadata, and the sales lesson."
            ]
          }
        },
        "text_matches": {},
        "http_statuses": {},
        "link_statuses": {},
        "setup_action_results": [],
        "screenshot_label": "riddle-site-v462-good-catch-diary-current-surface-phone"
      },
      {
        "name": "ipad-mini",
        "width": 768,
        "height": 1024,
        "url": "https://riddledc.com/proof/good-catches/",
        "route": {
          "requested": "https://riddledc.com/proof/good-catches/",
          "observed": "/proof/good-catches/",
          "expected_path": "/proof/good-catches/",
          "matched": true,
          "http_status": 200
        },
        "title": "Good Catch Diary - Riddle Proof | Riddle",
        "body_text_length": 42546,
        "body_text_sample": "Skip to main content Riddle ← Riddle Proof GOOD CATCH DIARY Real bugs caught by cheap browser proof. A running diary of browser-visible issues found by real Riddle Proof runs. Each entry explains the bug, the evidence, and the general proof lesson. Open the evidence manifest Read the docs 39 curated catches from recent real browser proof runs. <$0.10 Even a ten-minute proof run is under nine cents of browser time. 0 source Many findings can be detected from the outside with a URL and browser contract. Manifest Each catch links to a receipt with screenshots, logs, run metadata, and the sales lesson. The diary BUG → EVIDENCE → LESSON May 17, 2026 < $0.01 Riddle site Riddle Proof Profile Warnings Profile Warnings docs lagged behind the shipped surface Bug: Riddle Proof had shipped nonblocking profile warnings for ambiguous network mock response selectors, but the public Riddle Proof docs and agent-facing markdown did not mention Profile Warnings or the warnings result field. Why normal checks missed it: The docs page loaded cleanly, the existing Profile Mode section and network mock terms were visible, /docs/riddle-proof/markdown.md returned 200 text/markdown with nonzero bytes, overflow stayed at 0px, and fatal console/page errors were clean. The gap was semantic: the newly shipped warning surface was absent from both human and machine-consumable docs. Proof lesson: The proof product needs proof for its own proof-authoring contract. When a package adds evidence, warnings, or profile semantics, rendered docs and raw agent-facing markdown should be audited together so agents do not rediscover shipped behavior from changelogs or dogfood notes. Evidence: Initial production job job_6d37e766 proved /docs/riddle-proof/ was otherwise healthy while rendered docs missed Profile Warnings and /docs/riddle-proof/markdown.md missed Profile Warnings plus warnings. Riddle-site PR #131 added the rendered and markdown docs, sidebar link, static guard, and docs-proof checks. Static Preview ps_08e95368 passed as job_cc796a28, Amplify job 112 deployed commit 80b3780, and final production job job_ad1cc6ec passed 9 checks across desktop, phone, iPad Mini, and iPad. Open evidence manifest → Screenshot only → May 17, 2026 < $0.05 LilArcade Builder preview boundary Builder accepted a saved preview path as a fresh build Bug: LilArcade Builder accepted a same-host saved preview URL from /saved/riddle-proof-v454-sneaky-existing/index.html as if it were a fresh build artifact, leaving Open in new tab and Save to Arcade available instead of rejecting the stale saved-artifact path. Why normal checks missed it: The unsafe URL used the trusted preview bucket host, auth and chat both worked, and the page stayed visually stable. The defect only surfaced when proof treated Builder preview context as stricter than saved-player context and required the forbidden saved-preview-path mock to stay at zero hits. Proof lesson: Preview URL safety is contextual. A URL sanitizer that is correct for saved player pages can be too permissive for fresh Builder builds, so proof profiles should encode allowed artifact prefixes, forbidden network hits, and recovery behavior together. Evidence: Initial production job job_643e881d caught Builder rendering Open in new tab and Save to Arcade for the same-host saved preview URL, with forbidden-saved-preview-path-v454 hit twice. LilArcade PR #444 added a Builder-only preview URL gate. Static Preview job job_5e778318 and final production job job_bc56fa3c passed: the saved path was rejected, the forbidden mock stayed at 0 hits, and the recovery build could still be saved and played. Open evidence manifest → Screenshot only → May 16, 2026 < $0.01 Riddle site Good Catch Diary warning hygiene Evidence Manifest preloaded noisy unused assets Bug: The public Good Catch Evidence Manifest looked healthy, but browser console evidence showed unused preload warnings from automatic route prefetch and eager below-the-fold proof screenshots. Why normal checks missed it: The route loaded, all 36 manifest cards rendered, the Profile Mode docs catch and job IDs were visible, overflow stayed at 0px, and fatal console/page errors were clean. The issue lived in warning-level browser noise that the previous fatal-console contract intentionally ignored. Proof lesson: Warning hygiene deserves its own contract. Nonfatal browser warnings can hide performance debt and make later proof runs noisy, so mature public evidence pages should be able to require zero unallowed warnings. Evidence: Initial production job job_07d46452 used the new no_console_warnings contract and caught 9 unused Next CSS preload warnings while the page otherwise passed. Riddle-site PR #128 disabled shared navigation prefetch and lazy-loaded Good Catch screenshots. Fixed Preview job job_1a70de27 and final production job job_4339e21c passed 9 checks across desktop, phone, iPad Mini, and iPad with 0 console warnings. Open evidence manifest → Screenshot only → May 16, 2026 < $0.01 Riddle site Riddle Proof Profile Mode Profile Mode docs lagged behind proof primitives Bug: The public Riddle Proof docs explained profile text semantics, but they did not document the Profile Mode primitives that recent real proof runs were using: network mocks, repeated and delayed responses, request-body receipts, setup actions, and iframe checks. Why normal checks missed it: The docs page loaded cleanly, the existing Profile Text Semantics section was visible, the raw markdown route returned 200, overflow stayed at 0px, and fatal console evidence was clean. The drift was semantic: the rendered and machine-consumable docs had not caught up with the reusable proof contract. Proof lesson: The proof surface itself needs proof. When a package adds or relies on reusable audit primitives, public rendered docs and raw agent-facing markdown should be tested as product contracts. Evidence: Initial production job job_bb0aa65a proved /docs/riddle-proof/ was healthy while both rendered docs and /docs/riddle-proof/markdown.md missed Profile Mode, network_mocks, repeat_responses, delay_ms, request_body_contains, setup_actions, frame_text_visible, and frame_url_equals. Riddle-site PR #126 added the Profile Mode section and regenerated markdown. Static Preview job job_88ad03aa and final production job job_22ee6a7c passed 14 checks across desktop, phone, iPad Mini, and iPad. Open evidence manifest → Screenshot only → May 16, 2026 < $0.01 Riddle site llms.txt proof receipts llms.txt hid the raw proof bundle Bug: The public llms.txt agent index linked to the human proof example page, but it did not link directly to the raw machine-consumable proof bundle that agents should ingest. Why normal checks missed it: The file itself returned 200 text/plain, the human proof example page returned 200, the raw JSON bundle returned 200 application/json, overflow stayed at 0px, and fatal console evidence was clean. The missing contract was discovery: agents had to infer the raw proof receipt from the human page. Proof lesson: Agent indexes should point to raw receipts, not only review pages. If a product publishes machine-consumable proof artifacts, the compact discovery surface needs to expose them directly. Evidence: Production job job_a5d4383b proved /llms.txt, /examples/riddle-proof/, and /examples/riddle-proof/docs-live-proof-bundle.json were healthy while llms.txt omitted the raw bundle URL. Riddle-site PR #124 added Raw proof bundle JSON to llms.txt and ratcheted the static llms guard. Static Preview job job_df22fbc2 and final production job job_ceafae1b passed 6 checks across desktop, phone, iPad Mini, and iPad. Open evidence manifest → Screenshot only → May 16, 2026 < $0.01 Riddle site proof receipts agent-proof Proof example bundle drifted behind the agent-proof contract Bug: The public proof example page rendered cleanly and linked to healthy artifacts, but the raw JSON bundle that agents consume was stale and did not carry proof receipts, the Bring your agent;",
        "scroll_width": 768,
        "client_width": 768,
        "overflow_px": 0,
        "bounds_overflow_px": 0,
        "overflow_offenders": [],
        "selectors": {
          ".catch-grid": {
            "count": 1,
            "visible_count": 1
          },
          ".catch-card": {
            "count": 39,
            "visible_count": 39
          },
          ".proof-stats": {
            "count": 1,
            "visible_count": 1
          }
        },
        "frames": {},
        "text_sequences": {
          ".catch-grid": {
            "count": 1,
            "visible_count": 1,
            "texts": [
              "May 17, 2026 < $0.01 Riddle site Riddle Proof Profile Warnings Profile Warnings docs lagged behind the shipped surface Bug: Riddle Proof had shipped nonblocking profile warnings for ambiguous network mock response selectors, but the public "
            ],
            "visible_texts": [
              "May 17, 2026 < $0.01 Riddle site Riddle Proof Profile Warnings Profile Warnings docs lagged behind the shipped surface Bug: Riddle Proof had shipped nonblocking profile warnings for ambiguous network mock response selectors, but the public "
            ],
            "match_texts": [
              "May 17, 2026 < $0.01 Riddle site Riddle Proof Profile Warnings Profile Warnings docs lagged behind the shipped surface Bug: Riddle Proof had shipped nonblocking profile warnings for ambiguous network mock response selectors, but the public Riddle Proof docs and agent-facing markdown did not mention Profile Warnings or the warnings result field. Why normal checks missed it: The docs page loaded cleanly, the existing Profile Mode section and network mock terms were visible, /docs/riddle-proof/markdown.md returned 200 text/markdown with nonzero bytes, overflow stayed at 0px, and fatal console/page errors were clean. The gap was semantic: the newly shipped warning surface was absent from both human and machine-consumable docs. Proof lesson: The proof product needs proof for its own proof-authoring contract. When a package adds evidence, warnings, or profile semantics, rendered docs and raw agent-facing markdown should be audited together so agents do not rediscover shipped behavior from changelogs or dogfood notes. Evidence: Initial production job job_6d37e766 proved /docs/riddle-proof/ was otherwise healthy while rendered docs missed Profile Warnings and /docs/riddle-proof/markdown.md missed Profile Warnings plus warnings. Riddle-site PR #131 added the rendered and markdown docs, sidebar link, static guard, and docs-proof checks. Static Preview ps_08e95368 passed as job_cc796a28, Amplify job 112 deployed commit 80b3780, and final production job job_ad1cc6ec passed 9 checks across desktop, phone, iPad Mini, and iPad. Open evidence manifest → Screenshot only → May 17, 2026 < $0.05 LilArcade Builder preview boundary Builder accepted a saved preview path as a fresh build Bug: LilArcade Builder accepted a same-host saved preview URL from /saved/riddle-proof-v454-sneaky-existing/index.html as if it were a fresh build artifact, leaving Open in new tab and Save to Arcade available instead of rejecting the stale saved-artifact path. Why normal checks missed it: The unsafe URL used the trusted preview bucket host, auth and chat both worked, and the page stayed visually stable. The defect only surfaced when proof treated Builder preview context as stricter than saved-player context and required the forbidden saved-preview-path mock to stay at zero hits. Proof lesson: Preview URL safety is contextual. A URL sanitizer that is correct for saved player pages can be too permissive for fresh Builder builds, so proof profiles should encode allowed artifact prefixes, forbidden network hits, and recovery behavior together. Evidence: Initial production job job_643e881d caught Builder rendering Open in new tab and Save to Arcade for the same-host saved preview URL, with forbidden-saved-preview-path-v454 hit twice. LilArcade PR #444 added a Builder-only preview URL gate. Static Preview job job_5e778318 and final production job job_bc56fa3c passed: the saved path was rejected, the forbidden mock stayed at 0 hits, and the recovery build could still be saved and played. Open evidence manifest → Screenshot only → May 16, 2026 < $0.01 Riddle site Good Catch Diary warning hygiene Evidence Manifest preloaded noisy unused assets Bug: The public Good Catch Evidence Manifest looked healthy, but browser console evidence showed unused preload warnings from automatic route prefetch and eager below-the-fold proof screenshots. Why normal checks missed it: The route loaded, all 36 manifest cards rendered, the Profile Mode docs catch and job IDs were visible, overflow stayed at 0px, and fatal console/page errors were clean. The issue lived in warning-level browser noise that the previous fatal-console contract intentionally ignored. Proof lesson: Warning hygiene deserves its own contract. Nonfatal browser warnings can hide performance debt and make later proof runs noisy, so mature public evidence pages should be able to require zero unallowed warnings. Evidence: Initial production job job_07d46452 used the new no_console_warnings contract and caught 9 unused Next CSS preload warnings while the page otherwise passed. Riddle-site PR #128 disabled shared navigation prefetch and lazy-loaded Good Catch screenshots. Fixed Preview job job_1a70de27 and final production job job_4339e21c passed 9 checks across desktop, phone, iPad Mini, and iPad with 0 console warnings. Open evidence manifest → Screenshot only → May 16, 2026 < $0.01 Riddle site Riddle Proof Profile Mode Profile Mode docs lagged behind proof primitives Bug: The public Riddle Proof docs explained profile text semantics, but they did not document the Profile Mode primitives that recent real proof runs were using: network mocks, repeated and delayed responses, request-body receipts, setup actions, and iframe checks. Why normal checks missed it: The docs page loaded cleanly, the existing Profile Text Semantics section was visible, the raw markdown route returned 200, overflow stayed at 0px, and fatal console evidence was clean. The drift was semantic: the rendered and machine-consumable docs had not caught up with the reusable proof contract. Proof lesson: The proof surface itself needs proof. When a package adds or relies on reusable audit primitives, public rendered docs and raw agent-facing markdown should be tested as product contracts. Evidence: Initial production job job_bb0aa65a proved /docs/riddle-proof/ was healthy while both rendered docs and /docs/riddle-proof/markdown.md missed Profile Mode, network_mocks, repeat_responses, delay_ms, request_body_contains, setup_actions, frame_text_visible, and frame_url_equals. Riddle-site PR #126 added the Profile Mode section and regenerated markdown. Static Preview job job_88ad03aa and final production job job_22ee6a7c passed 14 checks across desktop, phone, iPad Mini, and iPad. Open evidence manifest → Screenshot only → May 16, 2026 < $0.01 Riddle site llms.txt proof receipts llms.txt hid the raw proof bundle Bug: The public llms.txt agent index linked to the human proof example page, but it did not link directly to the raw machine-consumable proof bundle that agents should ingest. Why normal checks missed it: The file itself returned 200 text/plain, the human proof example page returned 200, the raw JSON bundle returned 200 application/json, overflow stayed at 0px, and fatal console evidence was clean. The missing contract was discovery: agents had to infer the raw proof receipt from the human page. Proof lesson: Agent indexes should point to raw receipts, not only review pages. If a product publishes machine-consumable proof artifacts, the compact discovery surface needs to expose them directly. Evidence: Production job job_a5d4383b proved /llms.txt, /examples/riddle-proof/, and /examples/riddle-proof/docs-live-proof-bundle.json were healthy while llms.txt omitted the raw bundle URL. Riddle-site PR #124 added Raw proof bundle JSON to llms.txt and ratcheted the static llms guard. Static Preview job job_df22fbc2 and final production job job_ceafae1b passed 6 checks across desktop, phone, iPad Mini, and iPad. Open evidence manifest → Screenshot only → May 16, 2026 < $0.01 Riddle site proof receipts agent-proof Proof example bundle drifted behind the agent-proof contract Bug: The public proof example page rendered cleanly and linked to healthy artifacts, but the raw JSON bundle that agents consume was stale and did not carry proof receipts, the Bring your agent; Riddle brings the proof promise, or the agent-proof contract. Why normal checks missed it: The human page looked trustworthy: the route loaded, the proof example status was passed, all seven artifact links were healthy, overflow was 0px, and fatal console evidence was clean. The drift lived in the machine-consumable proof contract behind the page. Proof lesson: Proof examples are product surfaces too. If agents are expected to consume a raw proof bundle, the proof should validate the raw JSON contract, not only the rendered page and artifact links. Evidence: Initial production job job_30609bc5 proved the page and seven artifact lin"
            ],
            "visible_match_texts": [
              "May 17, 2026 < $0.01 Riddle site Riddle Proof Profile Warnings Profile Warnings docs lagged behind the shipped surface Bug: Riddle Proof had shipped nonblocking profile warnings for ambiguous network mock response selectors, but the public Riddle Proof docs and agent-facing markdown did not mention Profile Warnings or the warnings result field. Why normal checks missed it: The docs page loaded cleanly, the existing Profile Mode section and network mock terms were visible, /docs/riddle-proof/markdown.md returned 200 text/markdown with nonzero bytes, overflow stayed at 0px, and fatal console/page errors were clean. The gap was semantic: the newly shipped warning surface was absent from both human and machine-consumable docs. Proof lesson: The proof product needs proof for its own proof-authoring contract. When a package adds evidence, warnings, or profile semantics, rendered docs and raw agent-facing markdown should be audited together so agents do not rediscover shipped behavior from changelogs or dogfood notes. Evidence: Initial production job job_6d37e766 proved /docs/riddle-proof/ was otherwise healthy while rendered docs missed Profile Warnings and /docs/riddle-proof/markdown.md missed Profile Warnings plus warnings. Riddle-site PR #131 added the rendered and markdown docs, sidebar link, static guard, and docs-proof checks. Static Preview ps_08e95368 passed as job_cc796a28, Amplify job 112 deployed commit 80b3780, and final production job job_ad1cc6ec passed 9 checks across desktop, phone, iPad Mini, and iPad. Open evidence manifest → Screenshot only → May 17, 2026 < $0.05 LilArcade Builder preview boundary Builder accepted a saved preview path as a fresh build Bug: LilArcade Builder accepted a same-host saved preview URL from /saved/riddle-proof-v454-sneaky-existing/index.html as if it were a fresh build artifact, leaving Open in new tab and Save to Arcade available instead of rejecting the stale saved-artifact path. Why normal checks missed it: The unsafe URL used the trusted preview bucket host, auth and chat both worked, and the page stayed visually stable. The defect only surfaced when proof treated Builder preview context as stricter than saved-player context and required the forbidden saved-preview-path mock to stay at zero hits. Proof lesson: Preview URL safety is contextual. A URL sanitizer that is correct for saved player pages can be too permissive for fresh Builder builds, so proof profiles should encode allowed artifact prefixes, forbidden network hits, and recovery behavior together. Evidence: Initial production job job_643e881d caught Builder rendering Open in new tab and Save to Arcade for the same-host saved preview URL, with forbidden-saved-preview-path-v454 hit twice. LilArcade PR #444 added a Builder-only preview URL gate. Static Preview job job_5e778318 and final production job job_bc56fa3c passed: the saved path was rejected, the forbidden mock stayed at 0 hits, and the recovery build could still be saved and played. Open evidence manifest → Screenshot only → May 16, 2026 < $0.01 Riddle site Good Catch Diary warning hygiene Evidence Manifest preloaded noisy unused assets Bug: The public Good Catch Evidence Manifest looked healthy, but browser console evidence showed unused preload warnings from automatic route prefetch and eager below-the-fold proof screenshots. Why normal checks missed it: The route loaded, all 36 manifest cards rendered, the Profile Mode docs catch and job IDs were visible, overflow stayed at 0px, and fatal console/page errors were clean. The issue lived in warning-level browser noise that the previous fatal-console contract intentionally ignored. Proof lesson: Warning hygiene deserves its own contract. Nonfatal browser warnings can hide performance debt and make later proof runs noisy, so mature public evidence pages should be able to require zero unallowed warnings. Evidence: Initial production job job_07d46452 used the new no_console_warnings contract and caught 9 unused Next CSS preload warnings while the page otherwise passed. Riddle-site PR #128 disabled shared navigation prefetch and lazy-loaded Good Catch screenshots. Fixed Preview job job_1a70de27 and final production job job_4339e21c passed 9 checks across desktop, phone, iPad Mini, and iPad with 0 console warnings. Open evidence manifest → Screenshot only → May 16, 2026 < $0.01 Riddle site Riddle Proof Profile Mode Profile Mode docs lagged behind proof primitives Bug: The public Riddle Proof docs explained profile text semantics, but they did not document the Profile Mode primitives that recent real proof runs were using: network mocks, repeated and delayed responses, request-body receipts, setup actions, and iframe checks. Why normal checks missed it: The docs page loaded cleanly, the existing Profile Text Semantics section was visible, the raw markdown route returned 200, overflow stayed at 0px, and fatal console evidence was clean. The drift was semantic: the rendered and machine-consumable docs had not caught up with the reusable proof contract. Proof lesson: The proof surface itself needs proof. When a package adds or relies on reusable audit primitives, public rendered docs and raw agent-facing markdown should be tested as product contracts. Evidence: Initial production job job_bb0aa65a proved /docs/riddle-proof/ was healthy while both rendered docs and /docs/riddle-proof/markdown.md missed Profile Mode, network_mocks, repeat_responses, delay_ms, request_body_contains, setup_actions, frame_text_visible, and frame_url_equals. Riddle-site PR #126 added the Profile Mode section and regenerated markdown. Static Preview job job_88ad03aa and final production job job_22ee6a7c passed 14 checks across desktop, phone, iPad Mini, and iPad. Open evidence manifest → Screenshot only → May 16, 2026 < $0.01 Riddle site llms.txt proof receipts llms.txt hid the raw proof bundle Bug: The public llms.txt agent index linked to the human proof example page, but it did not link directly to the raw machine-consumable proof bundle that agents should ingest. Why normal checks missed it: The file itself returned 200 text/plain, the human proof example page returned 200, the raw JSON bundle returned 200 application/json, overflow stayed at 0px, and fatal console evidence was clean. The missing contract was discovery: agents had to infer the raw proof receipt from the human page. Proof lesson: Agent indexes should point to raw receipts, not only review pages. If a product publishes machine-consumable proof artifacts, the compact discovery surface needs to expose them directly. Evidence: Production job job_a5d4383b proved /llms.txt, /examples/riddle-proof/, and /examples/riddle-proof/docs-live-proof-bundle.json were healthy while llms.txt omitted the raw bundle URL. Riddle-site PR #124 added Raw proof bundle JSON to llms.txt and ratcheted the static llms guard. Static Preview job job_df22fbc2 and final production job job_ceafae1b passed 6 checks across desktop, phone, iPad Mini, and iPad. Open evidence manifest → Screenshot only → May 16, 2026 < $0.01 Riddle site proof receipts agent-proof Proof example bundle drifted behind the agent-proof contract Bug: The public proof example page rendered cleanly and linked to healthy artifacts, but the raw JSON bundle that agents consume was stale and did not carry proof receipts, the Bring your agent; Riddle brings the proof promise, or the agent-proof contract. Why normal checks missed it: The human page looked trustworthy: the route loaded, the proof example status was passed, all seven artifact links were healthy, overflow was 0px, and fatal console evidence was clean. The drift lived in the machine-consumable proof contract behind the page. Proof lesson: Proof examples are product surfaces too. If agents are expected to consume a raw proof bundle, the proof should validate the raw JSON contract, not only the rendered page and artifact links. Evidence: Initial production job job_30609bc5 proved the page and seven artifact lin"
            ]
          },
          ".proof-stats": {
            "count": 1,
            "visible_count": 1,
            "texts": [
              "39 curated catches from recent real browser proof runs. <$0.10 Even a ten-minute proof run is under nine cents of browser time. 0 source Many findings can be detected from the outside with a URL and browser contract. Manifest Each catch lin"
            ],
            "visible_texts": [
              "39 curated catches from recent real browser proof runs. <$0.10 Even a ten-minute proof run is under nine cents of browser time. 0 source Many findings can be detected from the outside with a URL and browser contract. Manifest Each catch lin"
            ],
            "match_texts": [
              "39 curated catches from recent real browser proof runs. <$0.10 Even a ten-minute proof run is under nine cents of browser time. 0 source Many findings can be detected from the outside with a URL and browser contract. Manifest Each catch links to a receipt with screenshots, logs, run metadata, and the sales lesson."
            ],
            "visible_match_texts": [
              "39 curated catches from recent real browser proof runs. <$0.10 Even a ten-minute proof run is under nine cents of browser time. 0 source Many findings can be detected from the outside with a URL and browser contract. Manifest Each catch links to a receipt with screenshots, logs, run metadata, and the sales lesson."
            ]
          }
        },
        "text_matches": {},
        "http_statuses": {},
        "link_statuses": {},
        "setup_action_results": [],
        "screenshot_label": "riddle-site-v462-good-catch-diary-current-surface-ipad-mini"
      },
      {
        "name": "ipad",
        "width": 820,
        "height": 1180,
        "url": "https://riddledc.com/proof/good-catches/",
        "route": {
          "requested": "https://riddledc.com/proof/good-catches/",
          "observed": "/proof/good-catches/",
          "expected_path": "/proof/good-catches/",
          "matched": true,
          "http_status": 200
        },
        "title": "Good Catch Diary - Riddle Proof | Riddle",
        "body_text_length": 42546,
        "body_text_sample": "Skip to main content Riddle ← Riddle Proof GOOD CATCH DIARY Real bugs caught by cheap browser proof. A running diary of browser-visible issues found by real Riddle Proof runs. Each entry explains the bug, the evidence, and the general proof lesson. Open the evidence manifest Read the docs 39 curated catches from recent real browser proof runs. <$0.10 Even a ten-minute proof run is under nine cents of browser time. 0 source Many findings can be detected from the outside with a URL and browser contract. Manifest Each catch links to a receipt with screenshots, logs, run metadata, and the sales lesson. The diary BUG → EVIDENCE → LESSON May 17, 2026 < $0.01 Riddle site Riddle Proof Profile Warnings Profile Warnings docs lagged behind the shipped surface Bug: Riddle Proof had shipped nonblocking profile warnings for ambiguous network mock response selectors, but the public Riddle Proof docs and agent-facing markdown did not mention Profile Warnings or the warnings result field. Why normal checks missed it: The docs page loaded cleanly, the existing Profile Mode section and network mock terms were visible, /docs/riddle-proof/markdown.md returned 200 text/markdown with nonzero bytes, overflow stayed at 0px, and fatal console/page errors were clean. The gap was semantic: the newly shipped warning surface was absent from both human and machine-consumable docs. Proof lesson: The proof product needs proof for its own proof-authoring contract. When a package adds evidence, warnings, or profile semantics, rendered docs and raw agent-facing markdown should be audited together so agents do not rediscover shipped behavior from changelogs or dogfood notes. Evidence: Initial production job job_6d37e766 proved /docs/riddle-proof/ was otherwise healthy while rendered docs missed Profile Warnings and /docs/riddle-proof/markdown.md missed Profile Warnings plus warnings. Riddle-site PR #131 added the rendered and markdown docs, sidebar link, static guard, and docs-proof checks. Static Preview ps_08e95368 passed as job_cc796a28, Amplify job 112 deployed commit 80b3780, and final production job job_ad1cc6ec passed 9 checks across desktop, phone, iPad Mini, and iPad. Open evidence manifest → Screenshot only → May 17, 2026 < $0.05 LilArcade Builder preview boundary Builder accepted a saved preview path as a fresh build Bug: LilArcade Builder accepted a same-host saved preview URL from /saved/riddle-proof-v454-sneaky-existing/index.html as if it were a fresh build artifact, leaving Open in new tab and Save to Arcade available instead of rejecting the stale saved-artifact path. Why normal checks missed it: The unsafe URL used the trusted preview bucket host, auth and chat both worked, and the page stayed visually stable. The defect only surfaced when proof treated Builder preview context as stricter than saved-player context and required the forbidden saved-preview-path mock to stay at zero hits. Proof lesson: Preview URL safety is contextual. A URL sanitizer that is correct for saved player pages can be too permissive for fresh Builder builds, so proof profiles should encode allowed artifact prefixes, forbidden network hits, and recovery behavior together. Evidence: Initial production job job_643e881d caught Builder rendering Open in new tab and Save to Arcade for the same-host saved preview URL, with forbidden-saved-preview-path-v454 hit twice. LilArcade PR #444 added a Builder-only preview URL gate. Static Preview job job_5e778318 and final production job job_bc56fa3c passed: the saved path was rejected, the forbidden mock stayed at 0 hits, and the recovery build could still be saved and played. Open evidence manifest → Screenshot only → May 16, 2026 < $0.01 Riddle site Good Catch Diary warning hygiene Evidence Manifest preloaded noisy unused assets Bug: The public Good Catch Evidence Manifest looked healthy, but browser console evidence showed unused preload warnings from automatic route prefetch and eager below-the-fold proof screenshots. Why normal checks missed it: The route loaded, all 36 manifest cards rendered, the Profile Mode docs catch and job IDs were visible, overflow stayed at 0px, and fatal console/page errors were clean. The issue lived in warning-level browser noise that the previous fatal-console contract intentionally ignored. Proof lesson: Warning hygiene deserves its own contract. Nonfatal browser warnings can hide performance debt and make later proof runs noisy, so mature public evidence pages should be able to require zero unallowed warnings. Evidence: Initial production job job_07d46452 used the new no_console_warnings contract and caught 9 unused Next CSS preload warnings while the page otherwise passed. Riddle-site PR #128 disabled shared navigation prefetch and lazy-loaded Good Catch screenshots. Fixed Preview job job_1a70de27 and final production job job_4339e21c passed 9 checks across desktop, phone, iPad Mini, and iPad with 0 console warnings. Open evidence manifest → Screenshot only → May 16, 2026 < $0.01 Riddle site Riddle Proof Profile Mode Profile Mode docs lagged behind proof primitives Bug: The public Riddle Proof docs explained profile text semantics, but they did not document the Profile Mode primitives that recent real proof runs were using: network mocks, repeated and delayed responses, request-body receipts, setup actions, and iframe checks. Why normal checks missed it: The docs page loaded cleanly, the existing Profile Text Semantics section was visible, the raw markdown route returned 200, overflow stayed at 0px, and fatal console evidence was clean. The drift was semantic: the rendered and machine-consumable docs had not caught up with the reusable proof contract. Proof lesson: The proof surface itself needs proof. When a package adds or relies on reusable audit primitives, public rendered docs and raw agent-facing markdown should be tested as product contracts. Evidence: Initial production job job_bb0aa65a proved /docs/riddle-proof/ was healthy while both rendered docs and /docs/riddle-proof/markdown.md missed Profile Mode, network_mocks, repeat_responses, delay_ms, request_body_contains, setup_actions, frame_text_visible, and frame_url_equals. Riddle-site PR #126 added the Profile Mode section and regenerated markdown. Static Preview job job_88ad03aa and final production job job_22ee6a7c passed 14 checks across desktop, phone, iPad Mini, and iPad. Open evidence manifest → Screenshot only → May 16, 2026 < $0.01 Riddle site llms.txt proof receipts llms.txt hid the raw proof bundle Bug: The public llms.txt agent index linked to the human proof example page, but it did not link directly to the raw machine-consumable proof bundle that agents should ingest. Why normal checks missed it: The file itself returned 200 text/plain, the human proof example page returned 200, the raw JSON bundle returned 200 application/json, overflow stayed at 0px, and fatal console evidence was clean. The missing contract was discovery: agents had to infer the raw proof receipt from the human page. Proof lesson: Agent indexes should point to raw receipts, not only review pages. If a product publishes machine-consumable proof artifacts, the compact discovery surface needs to expose them directly. Evidence: Production job job_a5d4383b proved /llms.txt, /examples/riddle-proof/, and /examples/riddle-proof/docs-live-proof-bundle.json were healthy while llms.txt omitted the raw bundle URL. Riddle-site PR #124 added Raw proof bundle JSON to llms.txt and ratcheted the static llms guard. Static Preview job job_df22fbc2 and final production job job_ceafae1b passed 6 checks across desktop, phone, iPad Mini, and iPad. Open evidence manifest → Screenshot only → May 16, 2026 < $0.01 Riddle site proof receipts agent-proof Proof example bundle drifted behind the agent-proof contract Bug: The public proof example page rendered cleanly and linked to healthy artifacts, but the raw JSON bundle that agents consume was stale and did not carry proof receipts, the Bring your agent;",
        "scroll_width": 820,
        "client_width": 820,
        "overflow_px": 0,
        "bounds_overflow_px": 0,
        "overflow_offenders": [],
        "selectors": {
          ".catch-grid": {
            "count": 1,
            "visible_count": 1
          },
          ".catch-card": {
            "count": 39,
            "visible_count": 39
          },
          ".proof-stats": {
            "count": 1,
            "visible_count": 1
          }
        },
        "frames": {},
        "text_sequences": {
          ".catch-grid": {
            "count": 1,
            "visible_count": 1,
            "texts": [
              "May 17, 2026 < $0.01 Riddle site Riddle Proof Profile Warnings Profile Warnings docs lagged behind the shipped surface Bug: Riddle Proof had shipped nonblocking profile warnings for ambiguous network mock response selectors, but the public "
            ],
            "visible_texts": [
              "May 17, 2026 < $0.01 Riddle site Riddle Proof Profile Warnings Profile Warnings docs lagged behind the shipped surface Bug: Riddle Proof had shipped nonblocking profile warnings for ambiguous network mock response selectors, but the public "
            ],
            "match_texts": [
              "May 17, 2026 < $0.01 Riddle site Riddle Proof Profile Warnings Profile Warnings docs lagged behind the shipped surface Bug: Riddle Proof had shipped nonblocking profile warnings for ambiguous network mock response selectors, but the public Riddle Proof docs and agent-facing markdown did not mention Profile Warnings or the warnings result field. Why normal checks missed it: The docs page loaded cleanly, the existing Profile Mode section and network mock terms were visible, /docs/riddle-proof/markdown.md returned 200 text/markdown with nonzero bytes, overflow stayed at 0px, and fatal console/page errors were clean. The gap was semantic: the newly shipped warning surface was absent from both human and machine-consumable docs. Proof lesson: The proof product needs proof for its own proof-authoring contract. When a package adds evidence, warnings, or profile semantics, rendered docs and raw agent-facing markdown should be audited together so agents do not rediscover shipped behavior from changelogs or dogfood notes. Evidence: Initial production job job_6d37e766 proved /docs/riddle-proof/ was otherwise healthy while rendered docs missed Profile Warnings and /docs/riddle-proof/markdown.md missed Profile Warnings plus warnings. Riddle-site PR #131 added the rendered and markdown docs, sidebar link, static guard, and docs-proof checks. Static Preview ps_08e95368 passed as job_cc796a28, Amplify job 112 deployed commit 80b3780, and final production job job_ad1cc6ec passed 9 checks across desktop, phone, iPad Mini, and iPad. Open evidence manifest → Screenshot only → May 17, 2026 < $0.05 LilArcade Builder preview boundary Builder accepted a saved preview path as a fresh build Bug: LilArcade Builder accepted a same-host saved preview URL from /saved/riddle-proof-v454-sneaky-existing/index.html as if it were a fresh build artifact, leaving Open in new tab and Save to Arcade available instead of rejecting the stale saved-artifact path. Why normal checks missed it: The unsafe URL used the trusted preview bucket host, auth and chat both worked, and the page stayed visually stable. The defect only surfaced when proof treated Builder preview context as stricter than saved-player context and required the forbidden saved-preview-path mock to stay at zero hits. Proof lesson: Preview URL safety is contextual. A URL sanitizer that is correct for saved player pages can be too permissive for fresh Builder builds, so proof profiles should encode allowed artifact prefixes, forbidden network hits, and recovery behavior together. Evidence: Initial production job job_643e881d caught Builder rendering Open in new tab and Save to Arcade for the same-host saved preview URL, with forbidden-saved-preview-path-v454 hit twice. LilArcade PR #444 added a Builder-only preview URL gate. Static Preview job job_5e778318 and final production job job_bc56fa3c passed: the saved path was rejected, the forbidden mock stayed at 0 hits, and the recovery build could still be saved and played. Open evidence manifest → Screenshot only → May 16, 2026 < $0.01 Riddle site Good Catch Diary warning hygiene Evidence Manifest preloaded noisy unused assets Bug: The public Good Catch Evidence Manifest looked healthy, but browser console evidence showed unused preload warnings from automatic route prefetch and eager below-the-fold proof screenshots. Why normal checks missed it: The route loaded, all 36 manifest cards rendered, the Profile Mode docs catch and job IDs were visible, overflow stayed at 0px, and fatal console/page errors were clean. The issue lived in warning-level browser noise that the previous fatal-console contract intentionally ignored. Proof lesson: Warning hygiene deserves its own contract. Nonfatal browser warnings can hide performance debt and make later proof runs noisy, so mature public evidence pages should be able to require zero unallowed warnings. Evidence: Initial production job job_07d46452 used the new no_console_warnings contract and caught 9 unused Next CSS preload warnings while the page otherwise passed. Riddle-site PR #128 disabled shared navigation prefetch and lazy-loaded Good Catch screenshots. Fixed Preview job job_1a70de27 and final production job job_4339e21c passed 9 checks across desktop, phone, iPad Mini, and iPad with 0 console warnings. Open evidence manifest → Screenshot only → May 16, 2026 < $0.01 Riddle site Riddle Proof Profile Mode Profile Mode docs lagged behind proof primitives Bug: The public Riddle Proof docs explained profile text semantics, but they did not document the Profile Mode primitives that recent real proof runs were using: network mocks, repeated and delayed responses, request-body receipts, setup actions, and iframe checks. Why normal checks missed it: The docs page loaded cleanly, the existing Profile Text Semantics section was visible, the raw markdown route returned 200, overflow stayed at 0px, and fatal console evidence was clean. The drift was semantic: the rendered and machine-consumable docs had not caught up with the reusable proof contract. Proof lesson: The proof surface itself needs proof. When a package adds or relies on reusable audit primitives, public rendered docs and raw agent-facing markdown should be tested as product contracts. Evidence: Initial production job job_bb0aa65a proved /docs/riddle-proof/ was healthy while both rendered docs and /docs/riddle-proof/markdown.md missed Profile Mode, network_mocks, repeat_responses, delay_ms, request_body_contains, setup_actions, frame_text_visible, and frame_url_equals. Riddle-site PR #126 added the Profile Mode section and regenerated markdown. Static Preview job job_88ad03aa and final production job job_22ee6a7c passed 14 checks across desktop, phone, iPad Mini, and iPad. Open evidence manifest → Screenshot only → May 16, 2026 < $0.01 Riddle site llms.txt proof receipts llms.txt hid the raw proof bundle Bug: The public llms.txt agent index linked to the human proof example page, but it did not link directly to the raw machine-consumable proof bundle that agents should ingest. Why normal checks missed it: The file itself returned 200 text/plain, the human proof example page returned 200, the raw JSON bundle returned 200 application/json, overflow stayed at 0px, and fatal console evidence was clean. The missing contract was discovery: agents had to infer the raw proof receipt from the human page. Proof lesson: Agent indexes should point to raw receipts, not only review pages. If a product publishes machine-consumable proof artifacts, the compact discovery surface needs to expose them directly. Evidence: Production job job_a5d4383b proved /llms.txt, /examples/riddle-proof/, and /examples/riddle-proof/docs-live-proof-bundle.json were healthy while llms.txt omitted the raw bundle URL. Riddle-site PR #124 added Raw proof bundle JSON to llms.txt and ratcheted the static llms guard. Static Preview job job_df22fbc2 and final production job job_ceafae1b passed 6 checks across desktop, phone, iPad Mini, and iPad. Open evidence manifest → Screenshot only → May 16, 2026 < $0.01 Riddle site proof receipts agent-proof Proof example bundle drifted behind the agent-proof contract Bug: The public proof example page rendered cleanly and linked to healthy artifacts, but the raw JSON bundle that agents consume was stale and did not carry proof receipts, the Bring your agent; Riddle brings the proof promise, or the agent-proof contract. Why normal checks missed it: The human page looked trustworthy: the route loaded, the proof example status was passed, all seven artifact links were healthy, overflow was 0px, and fatal console evidence was clean. The drift lived in the machine-consumable proof contract behind the page. Proof lesson: Proof examples are product surfaces too. If agents are expected to consume a raw proof bundle, the proof should validate the raw JSON contract, not only the rendered page and artifact links. Evidence: Initial production job job_30609bc5 proved the page and seven artifact lin"
            ],
            "visible_match_texts": [
              "May 17, 2026 < $0.01 Riddle site Riddle Proof Profile Warnings Profile Warnings docs lagged behind the shipped surface Bug: Riddle Proof had shipped nonblocking profile warnings for ambiguous network mock response selectors, but the public Riddle Proof docs and agent-facing markdown did not mention Profile Warnings or the warnings result field. Why normal checks missed it: The docs page loaded cleanly, the existing Profile Mode section and network mock terms were visible, /docs/riddle-proof/markdown.md returned 200 text/markdown with nonzero bytes, overflow stayed at 0px, and fatal console/page errors were clean. The gap was semantic: the newly shipped warning surface was absent from both human and machine-consumable docs. Proof lesson: The proof product needs proof for its own proof-authoring contract. When a package adds evidence, warnings, or profile semantics, rendered docs and raw agent-facing markdown should be audited together so agents do not rediscover shipped behavior from changelogs or dogfood notes. Evidence: Initial production job job_6d37e766 proved /docs/riddle-proof/ was otherwise healthy while rendered docs missed Profile Warnings and /docs/riddle-proof/markdown.md missed Profile Warnings plus warnings. Riddle-site PR #131 added the rendered and markdown docs, sidebar link, static guard, and docs-proof checks. Static Preview ps_08e95368 passed as job_cc796a28, Amplify job 112 deployed commit 80b3780, and final production job job_ad1cc6ec passed 9 checks across desktop, phone, iPad Mini, and iPad. Open evidence manifest → Screenshot only → May 17, 2026 < $0.05 LilArcade Builder preview boundary Builder accepted a saved preview path as a fresh build Bug: LilArcade Builder accepted a same-host saved preview URL from /saved/riddle-proof-v454-sneaky-existing/index.html as if it were a fresh build artifact, leaving Open in new tab and Save to Arcade available instead of rejecting the stale saved-artifact path. Why normal checks missed it: The unsafe URL used the trusted preview bucket host, auth and chat both worked, and the page stayed visually stable. The defect only surfaced when proof treated Builder preview context as stricter than saved-player context and required the forbidden saved-preview-path mock to stay at zero hits. Proof lesson: Preview URL safety is contextual. A URL sanitizer that is correct for saved player pages can be too permissive for fresh Builder builds, so proof profiles should encode allowed artifact prefixes, forbidden network hits, and recovery behavior together. Evidence: Initial production job job_643e881d caught Builder rendering Open in new tab and Save to Arcade for the same-host saved preview URL, with forbidden-saved-preview-path-v454 hit twice. LilArcade PR #444 added a Builder-only preview URL gate. Static Preview job job_5e778318 and final production job job_bc56fa3c passed: the saved path was rejected, the forbidden mock stayed at 0 hits, and the recovery build could still be saved and played. Open evidence manifest → Screenshot only → May 16, 2026 < $0.01 Riddle site Good Catch Diary warning hygiene Evidence Manifest preloaded noisy unused assets Bug: The public Good Catch Evidence Manifest looked healthy, but browser console evidence showed unused preload warnings from automatic route prefetch and eager below-the-fold proof screenshots. Why normal checks missed it: The route loaded, all 36 manifest cards rendered, the Profile Mode docs catch and job IDs were visible, overflow stayed at 0px, and fatal console/page errors were clean. The issue lived in warning-level browser noise that the previous fatal-console contract intentionally ignored. Proof lesson: Warning hygiene deserves its own contract. Nonfatal browser warnings can hide performance debt and make later proof runs noisy, so mature public evidence pages should be able to require zero unallowed warnings. Evidence: Initial production job job_07d46452 used the new no_console_warnings contract and caught 9 unused Next CSS preload warnings while the page otherwise passed. Riddle-site PR #128 disabled shared navigation prefetch and lazy-loaded Good Catch screenshots. Fixed Preview job job_1a70de27 and final production job job_4339e21c passed 9 checks across desktop, phone, iPad Mini, and iPad with 0 console warnings. Open evidence manifest → Screenshot only → May 16, 2026 < $0.01 Riddle site Riddle Proof Profile Mode Profile Mode docs lagged behind proof primitives Bug: The public Riddle Proof docs explained profile text semantics, but they did not document the Profile Mode primitives that recent real proof runs were using: network mocks, repeated and delayed responses, request-body receipts, setup actions, and iframe checks. Why normal checks missed it: The docs page loaded cleanly, the existing Profile Text Semantics section was visible, the raw markdown route returned 200, overflow stayed at 0px, and fatal console evidence was clean. The drift was semantic: the rendered and machine-consumable docs had not caught up with the reusable proof contract. Proof lesson: The proof surface itself needs proof. When a package adds or relies on reusable audit primitives, public rendered docs and raw agent-facing markdown should be tested as product contracts. Evidence: Initial production job job_bb0aa65a proved /docs/riddle-proof/ was healthy while both rendered docs and /docs/riddle-proof/markdown.md missed Profile Mode, network_mocks, repeat_responses, delay_ms, request_body_contains, setup_actions, frame_text_visible, and frame_url_equals. Riddle-site PR #126 added the Profile Mode section and regenerated markdown. Static Preview job job_88ad03aa and final production job job_22ee6a7c passed 14 checks across desktop, phone, iPad Mini, and iPad. Open evidence manifest → Screenshot only → May 16, 2026 < $0.01 Riddle site llms.txt proof receipts llms.txt hid the raw proof bundle Bug: The public llms.txt agent index linked to the human proof example page, but it did not link directly to the raw machine-consumable proof bundle that agents should ingest. Why normal checks missed it: The file itself returned 200 text/plain, the human proof example page returned 200, the raw JSON bundle returned 200 application/json, overflow stayed at 0px, and fatal console evidence was clean. The missing contract was discovery: agents had to infer the raw proof receipt from the human page. Proof lesson: Agent indexes should point to raw receipts, not only review pages. If a product publishes machine-consumable proof artifacts, the compact discovery surface needs to expose them directly. Evidence: Production job job_a5d4383b proved /llms.txt, /examples/riddle-proof/, and /examples/riddle-proof/docs-live-proof-bundle.json were healthy while llms.txt omitted the raw bundle URL. Riddle-site PR #124 added Raw proof bundle JSON to llms.txt and ratcheted the static llms guard. Static Preview job job_df22fbc2 and final production job job_ceafae1b passed 6 checks across desktop, phone, iPad Mini, and iPad. Open evidence manifest → Screenshot only → May 16, 2026 < $0.01 Riddle site proof receipts agent-proof Proof example bundle drifted behind the agent-proof contract Bug: The public proof example page rendered cleanly and linked to healthy artifacts, but the raw JSON bundle that agents consume was stale and did not carry proof receipts, the Bring your agent; Riddle brings the proof promise, or the agent-proof contract. Why normal checks missed it: The human page looked trustworthy: the route loaded, the proof example status was passed, all seven artifact links were healthy, overflow was 0px, and fatal console evidence was clean. The drift lived in the machine-consumable proof contract behind the page. Proof lesson: Proof examples are product surfaces too. If agents are expected to consume a raw proof bundle, the proof should validate the raw JSON contract, not only the rendered page and artifact links. Evidence: Initial production job job_30609bc5 proved the page and seven artifact lin"
            ]
          },
          ".proof-stats": {
            "count": 1,
            "visible_count": 1,
            "texts": [
              "39 curated catches from recent real browser proof runs. <$0.10 Even a ten-minute proof run is under nine cents of browser time. 0 source Many findings can be detected from the outside with a URL and browser contract. Manifest Each catch lin"
            ],
            "visible_texts": [
              "39 curated catches from recent real browser proof runs. <$0.10 Even a ten-minute proof run is under nine cents of browser time. 0 source Many findings can be detected from the outside with a URL and browser contract. Manifest Each catch lin"
            ],
            "match_texts": [
              "39 curated catches from recent real browser proof runs. <$0.10 Even a ten-minute proof run is under nine cents of browser time. 0 source Many findings can be detected from the outside with a URL and browser contract. Manifest Each catch links to a receipt with screenshots, logs, run metadata, and the sales lesson."
            ],
            "visible_match_texts": [
              "39 curated catches from recent real browser proof runs. <$0.10 Even a ten-minute proof run is under nine cents of browser time. 0 source Many findings can be detected from the outside with a URL and browser contract. Manifest Each catch links to a receipt with screenshots, logs, run metadata, and the sales lesson."
            ]
          }
        },
        "text_matches": {},
        "http_statuses": {},
        "link_statuses": {},
        "setup_action_results": [],
        "screenshot_label": "riddle-site-v462-good-catch-diary-current-surface-ipad"
      }
    ],
    "console": {
      "events": [],
      "fatal_count": 0
    },
    "page_errors": [],
    "dialogs": [],
    "network_mocks": [],
    "dom_summary": {
      "expected_viewport_count": 4,
      "viewport_count": 4,
      "partial": false,
      "routes": [
        {
          "requested": "https://riddledc.com/proof/good-catches/",
          "observed": "/proof/good-catches/",
          "expected_path": "/proof/good-catches/",
          "matched": true,
          "http_status": 200
        },
        {
          "requested": "https://riddledc.com/proof/good-catches/",
          "observed": "/proof/good-catches/",
          "expected_path": "/proof/good-catches/",
          "matched": true,
          "http_status": 200
        },
        {
          "requested": "https://riddledc.com/proof/good-catches/",
          "observed": "/proof/good-catches/",
          "expected_path": "/proof/good-catches/",
          "matched": true,
          "http_status": 200
        },
        {
          "requested": "https://riddledc.com/proof/good-catches/",
          "observed": "/proof/good-catches/",
          "expected_path": "/proof/good-catches/",
          "matched": true,
          "http_status": 200
        }
      ],
      "titles": [
        "Good Catch Diary - Riddle Proof | Riddle",
        "Good Catch Diary - Riddle Proof | Riddle",
        "Good Catch Diary - Riddle Proof | Riddle",
        "Good Catch Diary - Riddle Proof | Riddle"
      ],
      "overflow_px": [
        0,
        0,
        0,
        0
      ],
      "bounds_overflow_px": [
        0,
        0,
        0,
        0
      ],
      "overflow_offender_counts": [
        0,
        0,
        0,
        0
      ],
      "frames": [
        {
          "viewport": "desktop",
          "selectors": []
        },
        {
          "viewport": "phone",
          "selectors": []
        },
        {
          "viewport": "ipad-mini",
          "selectors": []
        },
        {
          "viewport": "ipad",
          "selectors": []
        }
      ],
      "http_status": [
        {
          "viewport": "desktop",
          "requests": [
            {
              "key": "GET https://riddledc.com/llms.txt",
              "url": "https://riddledc.com/llms.txt",
              "method": "GET",
              "status": 200,
              "ok": true,
              "error": null
            },
            {
              "key": "GET https://riddledc.com/docs/riddle-proof/markdown.md",
              "url": "https://riddledc.com/docs/riddle-proof/markdown.md",
              "method": "GET",
              "status": 200,
              "ok": true,
              "error": null
            }
          ]
        }
      ],
      "link_status": [
        {
          "viewport": "desktop",
          "selectors": [
            {
              "selector": "img[src*='/proof/good-catches/artifacts/']",
              "total_count": 39,
              "ok_count": 39,
              "failed_count": 0,
              "truncated": false
            },
            {
              "selector": "a.catch-link[href*='/proof/good-catches/evidence/#']",
              "total_count": 39,
              "ok_count": 39,
              "failed_count": 0,
              "truncated": false
            }
          ]
        }
      ],
      "route_inventory": [],
      "network_mock_count": 0,
      "network_mock_hit_count": 0,
      "dialog_count": 0,
      "dialog_accept_count": 0,
      "dialog_dismiss_count": 0
    }
  },
  "riddle": {
    "job_id": "job_f448859c",
    "status": "completed",
    "terminal": true
  }
}
