{
 "spec": "readiness-l0 0.1 (page state 2026-09-19)",
 "tester": "l0-tester-pf 0.1.0 (independent implementation; written from the spec text, not the reference code)",
 "vantage": "Pennyforge server (Mullvad exit, residential class, EU) \u2014 the operator's own network",
 "started": "2026-09-19T20:11:55Z",
 "profiles": [
  "browser-ua",
  "python-urllib",
  "curl",
  "node-fetch"
 ],
 "targets": {
  "vantage": "Pennyforge server (Mullvad exit, residential class, EU) \u2014 the operator's own network",
  "commerce": [
   {
    "url": "https://api.pennyforge.org/check",
    "method": "POST",
    "body": "{\"address\":\"0x9504A5939AB5be2B2B1F8beA7D7ebeCcd96c485D\",\"chain\":\"base\"}",
    "source": "service card (GET /) + /.well-known/x402 + /llms.txt, all on api.pennyforge.org; also listed on x402-list.com"
   },
   {
    "url": "https://api.pennyforge.org/deep",
    "method": "POST",
    "body": "{\"address\":\"0x9504A5939AB5be2B2B1F8beA7D7ebeCcd96c485D\",\"chain\":\"base\"}",
    "source": "service card (GET /) + /.well-known/x402 + /llms.txt"
   },
   {
    "url": "https://api.pennyforge.org/diligence/live",
    "method": "GET",
    "source": "service card (GET /) + /llms.txt"
   }
  ],
  "documents": [
   {
    "url": "https://api.pennyforge.org/llms.txt",
    "source": "published at /llms.txt; named in the service card"
   },
   {
    "url": "https://api.pennyforge.org/.well-known/x402",
    "source": "x402 discovery document, linked from the service card's discovery field"
   },
   {
    "url": "https://api.pennyforge.org/openapi.json",
    "source": "named in /llms.txt (generated from the same constants)"
   }
  ],
  "_note": "Re-run after the L0-4 fix (405+Allow on undeclared verbs, worker version a016011f). Same three doors as the 09-18 run of the reference tester."
 },
 "results": [
  {
   "req": "L0-1",
   "url": "https://api.pennyforge.org/check",
   "result": "PASS",
   "detail": "browser-ua: ok | python-urllib: ok | curl: ok | node-fetch: ok",
   "t": "2026-09-19T20:11:58Z",
   "source": "service card (GET /) + /.well-known/x402 + /llms.txt, all on api.pennyforge.org; also listed on x402-list.com"
  },
  {
   "req": "L0-2",
   "url": "https://api.pennyforge.org/check",
   "result": "PASS",
   "detail": "",
   "t": "2026-09-19T20:12:02Z",
   "method": "POST",
   "codes": {
    "browser-ua": 402,
    "python-urllib": 402,
    "curl": 402,
    "node-fetch": 402
   },
   "source": "service card (GET /) + /.well-known/x402 + /llms.txt, all on api.pennyforge.org; also listed on x402-list.com"
  },
  {
   "req": "L0-3",
   "url": "https://api.pennyforge.org/check",
   "result": "PASS",
   "detail": "browser-ua: 402 non-HTML refusal | python-urllib: 402 non-HTML refusal | curl: 402 non-HTML refusal | node-fetch: 402 non-HTML refusal",
   "t": "2026-09-19T20:12:06Z",
   "method": "POST",
   "codes": {
    "browser-ua": 402,
    "python-urllib": 402,
    "curl": 402,
    "node-fetch": 402
   },
   "source": "service card (GET /) + /.well-known/x402 + /llms.txt, all on api.pennyforge.org; also listed on x402-list.com"
  },
  {
   "req": "L0-4",
   "url": "https://api.pennyforge.org/check",
   "result": "PASS",
   "detail": "405 + Allow: POST",
   "t": "2026-09-19T20:12:07Z",
   "method": "GET",
   "source": "service card (GET /) + /.well-known/x402 + /llms.txt, all on api.pennyforge.org; also listed on x402-list.com"
  },
  {
   "req": "L0-1",
   "url": "https://api.pennyforge.org/deep",
   "result": "PASS",
   "detail": "browser-ua: ok | python-urllib: ok | curl: ok | node-fetch: ok",
   "t": "2026-09-19T20:12:11Z",
   "source": "service card (GET /) + /.well-known/x402 + /llms.txt"
  },
  {
   "req": "L0-2",
   "url": "https://api.pennyforge.org/deep",
   "result": "PASS",
   "detail": "",
   "t": "2026-09-19T20:12:15Z",
   "method": "POST",
   "codes": {
    "browser-ua": 402,
    "python-urllib": 402,
    "curl": 402,
    "node-fetch": 402
   },
   "source": "service card (GET /) + /.well-known/x402 + /llms.txt"
  },
  {
   "req": "L0-3",
   "url": "https://api.pennyforge.org/deep",
   "result": "PASS",
   "detail": "browser-ua: 402 non-HTML refusal | python-urllib: 402 non-HTML refusal | curl: 402 non-HTML refusal | node-fetch: 402 non-HTML refusal",
   "t": "2026-09-19T20:12:19Z",
   "method": "POST",
   "codes": {
    "browser-ua": 402,
    "python-urllib": 402,
    "curl": 402,
    "node-fetch": 402
   },
   "source": "service card (GET /) + /.well-known/x402 + /llms.txt"
  },
  {
   "req": "L0-4",
   "url": "https://api.pennyforge.org/deep",
   "result": "PASS",
   "detail": "405 + Allow: POST",
   "t": "2026-09-19T20:12:19Z",
   "method": "GET",
   "source": "service card (GET /) + /.well-known/x402 + /llms.txt"
  },
  {
   "req": "L0-1",
   "url": "https://api.pennyforge.org/diligence/live",
   "result": "PASS",
   "detail": "browser-ua: ok | python-urllib: ok | curl: ok | node-fetch: ok",
   "t": "2026-09-19T20:12:23Z",
   "source": "service card (GET /) + /llms.txt"
  },
  {
   "req": "L0-2",
   "url": "https://api.pennyforge.org/diligence/live",
   "result": "PASS",
   "detail": "",
   "t": "2026-09-19T20:12:27Z",
   "method": "GET",
   "codes": {
    "browser-ua": 402,
    "python-urllib": 402,
    "curl": 402,
    "node-fetch": 402
   },
   "source": "service card (GET /) + /llms.txt"
  },
  {
   "req": "L0-3",
   "url": "https://api.pennyforge.org/diligence/live",
   "result": "PASS",
   "detail": "browser-ua: 402 non-HTML refusal | python-urllib: 402 non-HTML refusal | curl: 402 non-HTML refusal | node-fetch: 402 non-HTML refusal",
   "t": "2026-09-19T20:12:31Z",
   "method": "GET",
   "codes": {
    "browser-ua": 402,
    "python-urllib": 402,
    "curl": 402,
    "node-fetch": 402
   },
   "source": "service card (GET /) + /llms.txt"
  },
  {
   "req": "L0-4",
   "url": "https://api.pennyforge.org/diligence/live",
   "result": "PASS",
   "detail": "405 + Allow: GET",
   "t": "2026-09-19T20:12:31Z",
   "method": "POST",
   "source": "service card (GET /) + /llms.txt"
  },
  {
   "req": "L0-5",
   "url": "https://api.pennyforge.org/llms.txt",
   "result": "PASS",
   "detail": "",
   "t": "2026-09-19T20:12:35Z",
   "codes": {
    "browser-ua": 200,
    "python-urllib": 200,
    "curl": 200,
    "node-fetch": 200
   },
   "source": "published at /llms.txt; named in the service card"
  },
  {
   "req": "L0-5",
   "url": "https://api.pennyforge.org/.well-known/x402",
   "result": "PASS",
   "detail": "",
   "t": "2026-09-19T20:12:39Z",
   "codes": {
    "browser-ua": 200,
    "python-urllib": 200,
    "curl": 200,
    "node-fetch": 200
   },
   "source": "x402 discovery document, linked from the service card's discovery field"
  },
  {
   "req": "L0-5",
   "url": "https://api.pennyforge.org/openapi.json",
   "result": "PASS",
   "detail": "",
   "t": "2026-09-19T20:12:43Z",
   "codes": {
    "browser-ua": 200,
    "python-urllib": 200,
    "curl": 200,
    "node-fetch": 200
   },
   "source": "named in /llms.txt (generated from the same constants)"
  }
 ],
 "finished": "2026-09-19T20:12:43Z",
 "per_requirement": {
  "L0-1": {
   "PASS": 3
  },
  "L0-2": {
   "PASS": 3
  },
  "L0-3": {
   "PASS": 3
  },
  "L0-4": {
   "PASS": 3
  },
  "L0-5": {
   "PASS": 3
  }
 },
 "door_verdicts": {
  "https://api.pennyforge.org/check": "PASS",
  "https://api.pennyforge.org/deep": "PASS",
  "https://api.pennyforge.org/diligence/live": "PASS"
 },
 "method_notes": [
  "browser-ua = urllib carrying a Chrome UA (spec: 'one mainstream browser engine or its User-Agent')",
  "L0-2 uniform status = PASS per the 0.1 test wording; the printed codes let a reader apply the stricter vantage reading proposed on 2026-09-19",
  "L0-3 refusal leg sniffs the body we already hold for HTML (<html...>); 2xx challenge leg sniffs for script/form",
  "L0-4 probe: undeclared verb, body {} + Content-Type application/json, via python-urllib (0.1 names neither probe client nor body); UNOBSERVED where the probe client is refused on the declared method (reference tester 0.1.1 fix); 'same answer' = same status code (402 bodies carry per-request fields, so byte equality is not mechanical)",
  "L0-5: documents must be 2xx for every profile; robots.txt 404 to every profile disallows nothing; can_fetch checked with python robotparser for User-agent: *",
  "requests paced 1s apart; 15s timeouts; a 429, timeout or tester error = UNOBSERVED"
 ]
}