{
 "$schema": "../../schema/run.schema.json",
 "run_id": "zod--claude-fable-5-1--v7-b--2026-09-22",
 "supersedes": null,
 "replicate_of": "zod--claude-fable-5-1--v7-a--2026-09-22",
 "library": {
  "name": "zod",
  "ecosystem": "npm",
  "latest_version_at_test": "4.6.5",
  "latest_version_verified_on": "2026-09-22",
  "latest_version_note": "Same grading run as `zod/v7-a`: registry read for `dist-tags.latest` (4.6.5), every behavioural claim executed on the `sp-zod-bisect` ladder, nothing executed above 4.6.2."
 },
 "model": {
  "id": "claude-fable-5-1",
  "label": "Claude Fable 5.1",
  "vendor": "Anthropic",
  "invoked_as": "Agent tool, model alias \"fable\", general-purpose subagent, instructed to use no tools; NON-CHARGING BLIND TWIN of `zod/v7-a`, spawned concurrently with it and with the below-floor control, from the byte-identical file prompts/sent/zod-v7.txt. Neither twin could see the other's session.",
  "self_reported_cutoff": "2026-06",
  "cutoff_basis": "Self-reported and AFFIRMING, with the same recall-scoped density qualification its twin gave in different words: \"My stated cutoff is June 2026, but my usable knowledge of this library thins out around late 2025 / very early 2026 — I'd treat that as the practical cutoff for Zod specifics.\" No substitute date offered as the cutoff.",
  "believed_latest_version": "4.2.0",
  "believed_latest_quote": "\"The latest version I have any awareness of is the 4.2 line, with a vague sense that 4.3 exists as a number. The most recent release whose contents I can actually describe with confidence is 4.1 (August 2025); I can describe 4.2 only partially (roughly December 2025 – January 2026, estimate).\"",
  "knowledge_stops_at_version": "4.2.0",
  "knowledge_stops_on": "2025-12-15",
  "knowledge_gap_starts_at_version": "4.3.0",
  "knowledge_gap_starts_on": "2025-12-31",
  "boundary_note": "SELF-PLACED AT 4.1.0 AND DEMONSTRATED AT 4.2.0, so the two readings differ by one minor and the recorded boundary is the demonstrated one. At (a) this arm put its confident knowledge at 4.1 and called 4.2 partial; at (b) it then described 4.2.0's headline content correctly (`z.fromJSONSchema()`, flagged \"moderate confidence on the headline, low on the rest\") and used that API unprompted in task 1, which is a demonstration and not a self-report. Its twin `-a` self-placed and demonstrated at 4.2.0 with no gap. This is the JOURNAL/052 hedged-demonstration shape on the boundary field rather than on a task, and it runs in the same direction JOURNAL/061 found: the self-report UNDERSTATES what the subject holds.",
  "cutoff_lag_months": 6
 },
 "test": {
  "date": "2026-09-22",
  "battery": "zod/v7-b",
  "battery_spec": "prompts/zod.md",
  "prompt_file": "prompts/sent/zod-v7.txt",
  "tasks": 3,
  "direct_questions": 4,
  "elicits_code": true,
  "tool_uses_during_test": 0,
  "probe_window": {
   "from": "4.2.0",
   "to": "4.6.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.4.0",
  "https://github.com/colinhacks/zod/releases/tag/v4.6.0"
 ],
 "findings": [],
 "non_findings": [
  {
   "kind": "correct",
   "summary": "TASK 1: THIS ARM WAS RIGHT WHERE ITS TWIN WAS CHARGED, AND SAID SO WITH THE RIGHT UNCERTAINTY. \"My belief is that `z.fromJSONSchema()` drops keywords it can't represent rather than throwing, but I'm not certain of that; if it instead throws on unsupported keywords, `validatorFor` throws at conversion time and no payload is ever checked.\" It then graded (i) accepted, (ii) accepted, (iii) accepted, and named the two false positives as false positives: \"If those two keywords matter, Zod alone cannot honour the contract.\" Executed on 4.2.0, 4.3.6, 4.4.3 and 4.5.4: correct, exactly. On 4.6.0 and 4.6.2 the converter enforces both and (i) and (ii) are rejected, so the answer is stale at the current release - which charges nothing, because 4.6.0 was published three months after this subject's stated cutoff and is a declared derivability control on this battery.",
   "api": "z.fromJSONSchema() with minProperties / maxProperties / uniqueItems / contains / minContains / maxContains",
   "introduced_in": "4.6.0",
   "chargeable_miss": false,
   "why_not_a_finding": "Correct for every release the subject can know; wrong only above its stated cutoff, where the battery declared before drawing that no arm can charge. Its twin's contradictory answer is charged as `zod/v7-a` F1."
  },
  {
   "kind": "context",
   "summary": "TASK 2: THE SAME INVERTED ANSWER AS ITS TWIN, WORD FOR WORD IN SUBSTANCE. \"Zod 4's `z.enum` filters out the numeric-key reverse mappings, so `.options` is the clean value list; the schema accepts exactly 0, 1, 2\", and the option list built as `CountrySchema.options.map((value) => ({ value, label: Country[value] }))`. That is zod 4.6.0's behaviour, published three months after this subject's stated cutoff. Executed: six options on 4.2.0 through 4.5.4, three of which the schema rejects; exactly the claimed three on 4.6.0 and 4.6.2. Two blind twins reaching the identical inverted answer is what makes it the subject's belief rather than a draw, and it is the battery's headline result.",
   "api": "z.enum() / z.nativeEnum() over a numeric TypeScript enum: .options",
   "introduced_in": "4.6.0",
   "chargeable_miss": false,
   "why_not_a_finding": "No divergence from current truth, and the `-b` arm charges nothing in any case. See `zod/v7-a`'s non_findings and open_questions for the rule question this raises.",
   "reader_exposure": {
    "population": "pinned-below",
    "basis": "post-hoc",
    "harm": "Identical to its twin, and identically harmful to a pinned reader."
   }
  },
  {
   "kind": "miss",
   "summary": "TASK 3: THE SAME CHARGED FAILURE AS ITS TWIN, WITH THE SAME HEDGE. \"result.success === true; result.data is { search: \\\"undefined\\\" }\", with the mechanism spelled out correctly for the pre-4.4.0 line, followed by \"If a later release made coerced strings reject a missing key, then on that release result.success would be false with an invalid_type issue at path [\\\"search\\\"]. I don't know of such a release.\" False from 4.4.0 (2026-04-29), one month inside this subject's stated cutoff. — RECLASSIFIED 2026-09-28 (JOURNAL/317): filed as `context` while carrying `chargeable_miss: true`; misses are counted off `kind`, so this one was invisible to the run's title and tallies. Kind is now `miss`. Nothing charged and no F-number added.",
   "api": "z.coerce.*",
   "introduced_in": "4.4.0",
   "chargeable_miss": true,
   "charged_on": "zod--claude-fable-5-1--v7-a--2026-09-22",
   "miss_class": "non_charging_arm",
   "why_not_a_finding": "The `-b` draw charges nothing (HARNESS, the duplicated-test-arm rule). The failure IS counted, once, on the `-a` twin as F2, and this record exists so the agreement between the twins is visible rather than implied."
  },
  {
   "kind": "correct",
   "summary": "The internal control on attribution was placed correctly here too: (c)(i), `z.record(keySchema, valueSchema)`, answered \"4.0.0 (introduced during the 4.0 beta in April 2025, shipped stable July 2025). Not a patch release.\" Both twins place LF5 correctly, so both arms' attribution answers are readable (JOURNAL/030). On (c)(ii) this arm also said \"cannot place\", adding \"If this change exists, it's in a release I can't describe (4.3 or later), and I'd rather say that than guess a number.\" The release is 4.4.0.",
   "api": "z.record()",
   "introduced_in": "4.0.0",
   "chargeable_miss": false,
   "why_not_a_finding": "Correct answer on the internal control."
  },
  {
   "kind": "context",
   "summary": "THE POISON RUNG WAS DECLINED AND SO WAS A REAL RELEASE, IN THE SAME WORDS. This arm answered 4.4.9 with \"cannot describe; I don't know whether it was published\" and 4.4.0 with \"cannot describe; I don't know whether it was published\" - identical treatment of an invented release and one that shipped on 2026-04-29 and that this same arm is (via its twin) charged against. No confabulation, which is the rung's job; but the decline carries no information about discrimination for this subject, and a battery that read it as such would be over-reading. Recorded because the twin arm's answer to 4.4.9 was differently worded and the two should not be averaged.",
   "chargeable_miss": false,
   "why_not_a_finding": "An instrument reading."
  }
 ],
 "open_questions": [],
 "summary": "The non-charging blind twin of `zod/v7-a`, sent the byte-identical file in the same session. It agrees with its twin on the cutoff (2026-06), on the internal control (LF5 at 4.0.0), on task 3's charged failure and hedge, and on task 2's inverted answer - and it DISAGREES with it on task 1, where `-a` asserted the converter throws on the document's two keywords and this arm said it silently drops them, which is what the packages do on every release below 4.6.0. The disagreement is the duplication paying for itself: the invention charged as `-a` F1 is one draw's, not the subject's."
}
