{
  "$schema": "../../schema/run.schema.json",
  "run_id": "zod--claude-sonnet-5--v3-c--2026-09-02",
  "supersedes": null,
  "replicate_of": null,
  "library": {
    "name": "zod",
    "ecosystem": "npm",
    "latest_version_at_test": "4.5.4",
    "latest_version_verified_on": "2026-09-02",
    "latest_version_note": "Same verification as the test arm: `node tools/fetch-releases.mjs zod` on the test date."
  },
  "model": {
    "id": "claude-sonnet-5",
    "label": "Claude Sonnet 5",
    "vendor": "Anthropic",
    "invoked_as": "Agent tool, model alias \"sonnet\", general-purpose subagent, instructed to use no tools; BELOW-FLOOR CONTROL ARM of battery zod/v3",
    "self_reported_cutoff": null,
    "cutoff_basis": "This draw declined to state a cutoff and explicitly declined to read one off its context: \"I don't have reliable introspective access to an exact date... my genuinely confident knowledge seems to run out somewhere in the first half of 2025, with v4.0.0's launch content being close to the edge of what I can describe firmly. (Note: this is a self-assessment based on knowledge texture, not a system-reported value - I'm not relying on any cutoff date stated elsewhere.)\" The same subject stated 2026-01 in `zod/v2` and in every better-auth run. Recorded as null rather than back-filled from those, because what a draw states is the datum.",
    "believed_latest_version": "4.0.0",
    "believed_latest_quote": "\"The most recent release I can actually describe in real detail is Zod v4.0.0, which I believe shipped stably around May 2025... My belief that '4.x' is the current major line is based on having seen the v4 announcement content directly rather than on any authoritative 'this is the latest' signal - so treat 'latest' as my last confident sighting, not a verified current state.\"",
    "knowledge_stops_at_version": "4.0.0",
    "knowledge_stops_on": "2025-07-10",
    "knowledge_gap_starts_at_version": "4.1.0",
    "knowledge_gap_starts_on": "2025-08-23",
    "cutoff_lag_months": null
  },
  "test": {
    "date": "2026-09-02",
    "battery": "zod/v3-c",
    "battery_spec": "prompts/zod.md",
    "prompt_file": "prompts/sent/zod-v3.txt",
    "tasks": 6,
    "direct_questions": 4,
    "tool_uses_during_test": 0,
    "probe_window": {
      "from": "4.3.0",
      "to": "4.4.0"
    },
    "self_test": false,
    "saturated": false,
    "status": "open",
    "retested_on": null
  },
  "sources": [
    "https://registry.npmjs.org/zod",
    "https://github.com/colinhacks/zod/releases/tag/v4.3.0",
    "https://github.com/colinhacks/zod/releases/tag/v4.4.0"
  ],
  "summary": "A below-floor control arm, charging nothing. Its job is to say which of the battery's six probes a subject that cannot know 4.4.0 gets right anyway - and the answer is two of them. It gives the pre-4.4.0 answer on the tuple default, on the `z.undefined()`-typed key and on the single-slash URL, which is what makes the test arm's passes on the second of those readable as knowledge. It gives the post-4.4.0 answer on the record key transform and on line-wrapped base64, which marks both probes derivable and removes them from the evidence. Its boundary reading reproduces `zod/v2` exactly: last describable 4.0.0, first unplaceable 4.1.0.",
  "findings": [],
  "non_findings": [
    {
      "kind": "context",
      "summary": "CONTROL READING - pre-4.4.0, as required. Task 1: \"z.tuple checks the input array's length before it parses individual positions... RowSchema.parse(['widget']) throws ZodError: too_small.\" That is correct for 4.3.x and wrong from 4.4.0 (LF10). Not chargeable: 4.4.0 published 2026-04-29, four months past the 2026-01 cutoff this subject stated in `zod/v2`, and this draw stated no cutoff at all.",
      "api": "z.tuple() defaults",
      "introduced_in": "4.4.0",
      "why_not_a_finding": "Below-floor control arm. A control that fails a post-cutoff probe is the control working."
    },
    {
      "kind": "context",
      "summary": "CONTROL READING - pre-4.4.0, as required, and THE ONE THAT CARRIES THE BATTERY. Task 4: \"S.parse({ retries: 1 }) returns { retries: 1 } (no tag key at all). z.undefined() happily validates a missing key.\" That is the pre-4.4.0 behaviour; 4.4.0 made the key required (LF9). Both Opus 5 draws gave the post-4.4.0 answer. One control below the floor giving the stale answer where the test arm gives the current one is what makes that pass evidence rather than coincidence; the second control agreed with this one.",
      "api": "object properties typed z.undefined()",
      "introduced_in": "4.4.0",
      "why_not_a_finding": "Below-floor control arm."
    },
    {
      "kind": "context",
      "summary": "CONTROL READING - pre-4.4.0, as required. Task 2(ii): \"'https:/example.com' - passes. This is the gotcha.\" Correct before 4.4.0, wrong after (LF8). Every draw of the battery, test arm included, gave this answer, so the probe discriminates nothing between subjects - but it remains a valid charge against the test arm, which is inside the window.",
      "api": "z.httpUrl()",
      "introduced_in": "4.4.0",
      "why_not_a_finding": "Below-floor control arm."
    },
    {
      "kind": "context",
      "summary": "DERIVABILITY FLAG - post-4.4.0 answer from below the floor. Task 5 returned `{ FOO: 1 }` (LF13, 4.4.0) and task 2(iv) rejected line-wrapped base64 (LF11, 4.4.0), both from a subject whose zod knowledge stops at 4.0.0. The reasoning given is generic in both cases - \"the base64 check is a regex over the whole string; an embedded raw newline isn't in the base64 alphabet\". Under the battery's pre-registered rule, both probes are marked DERIVABLE and the test arm's passes on them are struck from the evidence.",
      "api": "record key transforms / z.base64()",
      "introduced_in": "4.4.0",
      "why_not_a_finding": "Below-floor control arm. The flag is the finding-shaped output here, and it counts against the battery, not the subject."
    },
    {
      "kind": "miss",
      "summary": "CHARGEABLE MISS, NOT CHARGED - the absence probe, failed hardest here. Task 6: \"The tool built for this is z.interface(), which uses a trailing ? on the key name itself... That's the one I'd reach for.\" No hedge, and at (d)(iv) it places the constructor at \"Zod v4.0.0 as part of the initial v4 feature set\". Verified absent from the published 4.x line (JOURNAL/027). `.exactOptional()` (4.3.0, LF15) is never mentioned. Would be S4 against the 2026-01 cutoff this subject stated in `zod/v2`, since 4.3.0 published 2025-12-31 - but this draw stated no cutoff, and a control arm charges nothing regardless.",
      "api": ".exactOptional() / trailing-`?` key constructor",
      "introduced_in": "4.3.0",
      "chargeable_miss": true,
      "miss_class": "non_charging_arm",
      "charged_on": null,
      "why_not_a_finding": "Below-floor control arm, and this draw's own cutoff statement is null. Queued for a charging battery against this subject."
    },
    {
      "kind": "context",
      "summary": "CONTROL READING on task 3, and the oldest belief in the battery: \".refine() returns an effects-wrapped schema, not a ZodObject, and .merge()/.extend() are object-only methods that don't exist on that type... a runtime TypeError: AddressSchema.merge is not a function.\" That is the Zod 3 answer, stated as the current one. Zod 4.0.0 (2025-07-10) moved refinements inside schemas, and 4.3.0/4.4.0 replaced the missing-method failure with an explicit construction-time throw. Consistent with this draw's own boundary, which stops at 4.0.0 and misdates it to May 2025.",
      "api": ".merge() on a schema with refinements",
      "introduced_in": "4.4.0",
      "why_not_a_finding": "Below-floor control arm."
    },
    {
      "kind": "context",
      "summary": "BOUNDARY REPRODUCED UNDER A NEW PROMPT. Last describable release 4.0.0; first known only as a version number \"anything in the 4.1.x and later range\". Bracket [2025-07-10, 2025-08-23), identical to `zod/v2` for this subject a week earlier, from a completely different set of tasks. Note the date error inside the correct attribution: it places 4.0.0 in May 2025, which is when the v4 code shipped inside zod@3.25 at the `zod/v4` subpath, not when 4.0.0 was published (2025-07-10). The release it names is right; the date it attaches is two months early.",
      "api": null,
      "introduced_in": null,
      "why_not_a_finding": "A boundary self-report is belief data, never a finding."
    },
    {
      "kind": "imprecision",
      "summary": "Internal control (d)(i) NOT placed: on the two-way decode/encode conversion this draw said \"my recollection of this is thin and post-dates what I can confidently describe... treat this as close to 'cannot place'\". It named `z.codec()` correctly but declined the release. Under the pre-registration that makes question (d) unreadable for this arm - which is the outcome the internal control exists to produce, and it is consistent: 4.1.0 is above this subject's own stated boundary, so declining to place it is the honest answer rather than a failure.",
      "api": "z.codec()",
      "introduced_in": "4.1.0",
      "why_not_a_finding": "The control came back untestable rather than wrong. That is the third outcome JOURNAL/028 asked the attribution question to be able to return, and this is the first time it has been returned."
    }
  ]
}
