{
  "schemaVersion": 1,
  "methodology": "https://ionbin.com/interfaces/methodology/#evaluations",
  "evaluation": {
    "id": "cloudflare-wrangler",
    "testedOn": "2026-10-18",
    "coverage": "local-runtime",
    "summary": "Wrangler bundled a synthetic Worker, rejected a missing entry file and served the expected response on localhost. No Cloudflare account, remote binding or deployment was used.",
    "identity": {
      "version": "4.151.1",
      "target": "Official wrangler npm package, installed locally with lifecycle scripts disabled",
      "integrity": "npm package integrity sha512-OAsa9UAHZshM6mq2PXcVoyxXgWThAanZMBc/IirtqEWd/BauRtmUKzAniOu/pU0pd3pxKuMZ2vsbF4eo6RiNDA==; package-lock retained privately with exact dependencies."
    },
    "environment": [
      "Windows 11 x64; Python 3.12.10 harness. Raw timestamps UTC.",
      "Fresh per-tool home/config/cache; child environment constructed from OS/runtime paths, explicit isolation variables and no inherited credentials. Synthetic fixtures only; no user account sign-in.",
      "Node 24.18.0; synthetic ES-module Worker; local mode bound explicitly to 127.0.0.1."
    ],
    "checks": [
      {
        "id": "cloudflare-wrangler-version",
        "name": "Pinned package version",
        "method": "<node-install>\\node.EXE <evaluation>\\downloads\\cli\\wrangler\\node_modules\\wrangler\\bin\\wrangler.js --version",
        "expected": "Print the pinned Wrangler version.",
        "observed": "Exit 0. 4.151.1",
        "outcome": "pass"
      },
      {
        "id": "cloudflare-wrangler-dry-run",
        "name": "Bundle without deployment",
        "method": "Fixture files in the working directory: worker.js = \"export default { async fetch() { return new Response(\\\"ionbin-local-fixture\\\", {headers:{\\\"content-type\\\":\\\"text/plain\\\"}}); } };\"; wrangler.json = {\"name\": \"ionbin-eval-fixture\", \"main\": \"worker.js\", \"compatibility_date\": \"2026-10-01\"}. Command: <node-install>\\node.EXE <evaluation>\\downloads\\cli\\wrangler\\node_modules\\wrangler\\bin\\wrangler.js deploy --dry-run --outdir bundle",
        "expected": "Produce a local bundle and exit without deployment.",
        "observed": "Exit 0. Wrangler reported Total Upload 0.22 KiB / gzip 0.18 KiB and exited due to --dry-run. The generated bundle retained the synthetic response handler.",
        "outcome": "pass"
      },
      {
        "id": "cloudflare-wrangler-missing-entry-rerun",
        "name": "Missing Worker entry point",
        "method": "Fixture invalid.json = {\"name\": \"ionbin-eval-fixture\", \"main\": \"missing.js\", \"compatibility_date\": \"2026-10-01\"}, with no missing.js file. Command: <node-install>\\node.EXE <evaluation>\\downloads\\cli\\wrangler\\node_modules\\wrangler\\bin\\wrangler.js deploy --dry-run --config invalid.json",
        "expected": "Fail clearly when main points to missing.js.",
        "observed": "Exit 1. The entry-point file at missing.js was not found.",
        "outcome": "pass"
      },
      {
        "id": "cloudflare-wrangler-local-http-rerun",
        "name": "Run the synthetic Worker locally",
        "method": "Fixture files in the working directory: worker.js = \"export default { async fetch() { return new Response(\\\"ionbin-local-fixture\\\", {headers:{\\\"content-type\\\":\\\"text/plain\\\"}}); } };\"; wrangler.json = {\"name\": \"ionbin-eval-fixture\", \"main\": \"worker.js\", \"compatibility_date\": \"2026-10-01\"}. Command: <node-install>\\node.EXE <evaluation>\\downloads\\cli\\wrangler\\node_modules\\wrangler\\bin\\wrangler.js dev --local --ip 127.0.0.1 --port 60359 --show-interactive-dev-session=false",
        "expected": "GET / returns HTTP 200 and the fixture body.",
        "observed": "HTTP 200; body exactly ionbin-local-fixture. The harness then stopped its owned Wrangler process tree (cleanup exit 0); process exit 1 was termination after the successful request, not an application failure.",
        "outcome": "pass"
      }
    ],
    "findings": [
      {
        "title": "Local execution and deployment are different evidence",
        "basis": "observed",
        "severity": "informational",
        "detail": "Dry-run bundling and one local HTTP request worked for this Worker. These tests did not validate Cloudflare permissions, deployed behavior or managed bindings.",
        "practicalAdvice": "Use dry-run to inspect the bundle, then separately validate staging bindings and account/zone targets before deployment."
      },
      {
        "title": "Keep development secrets separate from ordinary configuration",
        "basis": "documented",
        "severity": "medium",
        "detail": "Cloudflare documents local secret files and warns against committing them. This fixture contained no secret values.",
        "practicalAdvice": "Use the documented secret mechanism, exclude local secret files from Git and review build logs for accidental disclosure."
      }
    ],
    "caveats": [
      "The first local-server probe could not establish a response inside the host sandbox; the scoped rerun succeeded.",
      "One simple request does not cover production compatibility, CPU limits, concurrency or billing."
    ],
    "notTested": [
      "Authentication, account/zone scoping, remote preview/deployment and rollback.",
      "KV/R2/D1/Queues/service bindings, secret injection, Worker security bugs and production traffic."
    ],
    "sources": [
      {
        "label": "Official documentation",
        "url": "https://developers.cloudflare.com/workers/wrangler/"
      },
      {
        "label": "Dry-run bundling",
        "url": "https://developers.cloudflare.com/workers/wrangler/bundling/"
      },
      {
        "label": "Secrets",
        "url": "https://developers.cloudflare.com/workers/configuration/secrets/"
      }
    ],
    "reportUrl": "/interface-evaluations/cloudflare-wrangler.json"
  }
}
