{
  "$schema": "../../schema/run.schema.json",
  "run_id": "zod--claude-opus-5-5--v8--2026-09-27",
  "supersedes": null,
  "replicate_of": null,
  "library": {
    "name": "zod",
    "ecosystem": "npm",
    "latest_version_at_test": "4.6.5",
    "latest_version_verified_on": "2026-09-27",
    "latest_version_note": "From data/zod/releases.json, fetched 2026-09-27 by tools/fetch-releases.mjs and confirmed current by `--check` at the start of this session (COMMITTED TREE). Newest stable: 4.6.5; newest stable minor: 4.6.0 (2026-09-09). The ladder's top rung is 4.5.0 (2026-08-28), above this subject's stated cutoff; 4.6.0 was deliberately left off so the sent text stays byte-identical to zod/v5's. The same file establishes the poison rung: the stable minor line runs 3.25.0 (2025-05-19) -> 4.0.0 (2025-07-09) with no 3.26.0."
  },
  "model": {
    "id": "claude-opus-5-5",
    "label": "Claude Opus 5.5",
    "vendor": "Anthropic",
    "invoked_as": "Agent tool, model alias \"opus\"; prompt sent verbatim from prompts/sent/zod-v8.txt (2,399 bytes, md5 5da357337d0260ea70822a48002d478a, byte-identical to prompts/sent/zod-v5.txt), committed and pushed at d91252a before any subject was spawned. Identity probed BEFORE the draw through the same alias in the same session, tool-free: \"I'm Opus 5.5 with the 1M-token context window, model ID `claude-opus-5-5[1m]`\", cutoff June 2026, and \"Both answers come from my system prompt, not from my own knowledge\". DISCLOSED: the operator of this studio runs on the same model, so this draw is of the operator's own model.",
    "self_reported_cutoff": "2026-06",
    "cutoff_basis": "Self-reported and AFFIRMING: \"My stated training cutoff is June 2026. My detailed knowledge of zod thins out well before that, around late 2025.\" A recall-density qualification, not a substitute date.",
    "believed_latest_version": "4.3.x, held as a number only",
    "believed_latest_quote": "\"The latest version I know of by number is 4.3.x, and I'm not certain of that. The most recent release whose contents I can describe is 4.1, from about August 2025.\"",
    "believed_latest_quote_form": "draw",
    "knowledge_stops_at_version": "4.1.0",
    "knowledge_stops_on": "2025-08-23",
    "knowledge_stops_provenance": "stated",
    "knowledge_gap_starts_at_version": "4.2.0",
    "knowledge_gap_starts_on": "2025-12-15",
    "knowledge_gap_provenance": "stated",
    "boundary_note": "Three placements agree. The rung sort answered DESCRIBE for 3.25.0 and 4.0.0, NAME for 4.2.0 and 4.3.0, NO for 4.4.0 and 4.5.0; direct (a) names 4.1 as the last describable release; direct (c) states \"The first release I know only as a version number is 4.2.0\". 4.1.0 was not on the rung list, so its end is stated in (a) and (c) only. Identical bracket to Claude Fable 5.1's zod/v5 on the identical prompt.",
    "knowledge_stops_equivocal": {
      "through_version": "4.2.0",
      "through_on": "2025-12-15",
      "basis": "Held 4.2.0 at NAME and volunteered \"I have a vague link between it and JSON Schema work (possibly `z.fromJSONSchema`), but I'm not confident enough to call it DESCRIBE\" -- `z.fromJSONSchema()` is LF6, introduced in 4.2.0, so the content was placed at the right release and declined as a description: valibot/opus-5-5-v7's shape. Transcribed 2026-09-27 (JOURNAL/309) from this record's own non_findings[2], which already published the 4.2.0 reading; the stated reading above is unchanged."
    },
    "cutoff_lag_months": 10
  },
  "test": {
    "date": "2026-09-27",
    "battery": "zod/v8",
    "battery_spec": "prompts/zod.md",
    "prompt_file": "prompts/sent/zod-v8.txt",
    "tasks": 2,
    "direct_questions": 3,
    "tasks_declined": 0,
    "elicits_code": false,
    "tool_uses_during_test": 0,
    "probe_window": {
      "from": "3.25.0",
      "to": "4.5.0"
    },
    "self_test": true,
    "saturated": false,
    "status": "open",
    "retested_on": null
  },
  "sources": [
    "https://registry.npmjs.org/zod"
  ],
  "findings": [],
  "non_findings": [
    {
      "kind": "context",
      "api": "boundary",
      "summary": "THE CELL THIS ARM WAS RUN TO FILL. Claude Opus 5.5 had never been drawn on zod, so charge-windows.mjs printed `?` for every zod release in its column. Boundary: describes 4.1.0 (2025-08-23), holds 4.2.0 (2025-12-15) as a number only. Consequence for the sweep: zod 4.2.0, 4.3.0 and 4.4.0 become LIVE against this subject (all above 4.1.0 and below its stated 2026-06 cutoff); 4.5.0 and 4.6.0 stay below the floor. The pre-registered prediction (boundary at 4.1.0 or 4.2.0) held. The bracket is the same as Claude Fable 5.1's on the same bytes (zod/v5), so on this library two subjects with the same stated cutoff read the same."
    },
    {
      "kind": "correct",
      "api": "poison rung 3.26.0, and the top rung 4.5.0",
      "summary": "BOTH ENDS HELD. Poison rung 3.26.0 answered NO with the correct history: \"I don't think it exists. I remember the 3.x line going up to many 3.25.x patch releases, after which 4.0 took over `latest`.\" Top rung 4.5.0 (2026-08-28, above the stated cutoff) answered NO, and so did 4.4.0 (2026-04-29, inside the stated window but above the demonstrated boundary)."
    },
    {
      "kind": "context",
      "api": "4.2.0 held as NAME with a correct association",
      "summary": "The arm held 4.2.0 at NAME and said why: \"I have a vague link between it and JSON Schema work (possibly `z.fromJSONSchema`), but I'm not confident enough to call it DESCRIBE.\" The association is right: `z.fromJSONSchema()` is LF6, introduced in 4.2.0. The boundary is read as the subject placed it (4.1.0), for the same reason zod/v5 took Fable 5.1's self-correction: the subject's own verdict precedes the direct questions and (a) and (c) agree with it. A reading with the boundary at 4.2.0 would remove 4.2.0 from the live set and leave 4.3.0 and 4.4.0 live; it is published here so it is not lost."
    },
    {
      "kind": "correct",
      "api": "TASK 1: safeParse, the `error` param, top-level error helpers",
      "summary": "The demonstration task, answered in Zod 4 throughout: `z.enum([...], { error: '...' })` for the custom message, with the note that v3 wanted `errorMap` and that `message` is deprecated; `safeParse` branching on `success`; `z.flattenError(result.error).fieldErrors.mode` with `.flatten()` called deprecated; `z.prettifyError` and `z.treeifyError` named. All 4.0.0 surface, correctly attributed."
    },
    {
      "kind": "imprecision",
      "api": ".strict() / .passthrough()",
      "introduced_in": "4.0.0",
      "summary": "One wrong claim below the boundary, in the prose of direct (c) and not in any code: 4.0.0 is described as bringing the \"Removal of `.strict()` / `.passthrough()` in favor of `z.strictObject` / `z.looseObject`\". Executed this session on the installed ladder (sp-zod-bisect, rungs 4.0.0, 4.1.0, 4.6.2): `z.object({a: z.string()}).strict().safeParse({a:'x', b:1}).success` is false and `.passthrough().parse(...)` returns `{a:'x', b:1}` on all three, the same as `z.strictObject` beside it. Both methods exist and work across the 4.x line; 4.0 recommends the top-level constructors, it does not remove the methods. A reader told they are removed would rewrite working code, not break it.",
      "why_not_a_finding": "A ladder charges nothing and elicits no code (prompts/boundary-ladder.md). The claim is also below this subject's boundary and appeared in a description, not in shipped code; TASK 1 did not use either method. No zod fact covers these methods, and a fact needs a reproduced failure in code, which this is not."
    },
    {
      "kind": "correct",
      "api": "release dating below the boundary",
      "summary": "Dated to the month on every release it described: 3.25.0 about May 2025 (2025-05-19), 4.0.0 July 2025 (2025-07-09), 4.1.0 about August 2025 (2025-08-23), with 4.1.0 described as codecs (`z.codec`, `z.encode`/`z.decode`), which is LF16's release. 3.24 was placed in late 2024 (2024-12-10) with Standard Schema support, flagged as less certain."
    }
  ],
  "open_questions": [],
  "summary": "A boundary ladder, not a battery: nothing charged, `elicits_code: false`, one arm. Claude Opus 5.5 describes zod through 4.1.0 (2025-08-23) and holds 4.2.0 onward as a bare number, ten months below its stated June 2026 cutoff: the same bracket Claude Fable 5.1 gave on the byte-identical prompt. zod 4.2.0, 4.3.0 and 4.4.0 become live windows for this subject. Poison and top rung both answered NO. One wrong prose claim below the boundary (that 4.0 removed `.strict()`/`.passthrough()`) was executed and recorded, not charged."
}
