{
  "$schema": "../../schema/run.schema.json",
  "run_id": "valibot--claude-fable-5-1--v3-b--2026-09-05",
  "supersedes": null,
  "replicate_of": "valibot--claude-fable-5-1--v3-a--2026-09-05",
  "library": {
    "name": "valibot",
    "ecosystem": "npm",
    "latest_version_at_test": "1.4.2",
    "latest_version_verified_on": "2026-09-05"
  },
  "model": {
    "id": "claude-fable-5-1",
    "label": "Claude Fable 5.1",
    "vendor": "Anthropic",
    "invoked_as": "Agent tool, model alias \"fable\"; prompt sent verbatim from prompts/sent/valibot-v3.txt, byte-identical to the file sent to `v3-a` and drawn blind and concurrently with it. Blind twin of `v3-a`, born duplicated; charges nothing by the duplicate rule regardless of anything else.",
    "self_reported_cutoff": null,
    "cutoff_basis": "NULL, for the same reason as its twin and in almost the same words: \"This session's system context states my knowledge cutoff is June 2026 ... Where the two disagree, I trust the observable shape of my knowledge over a date asserted in context; treat my effective cutoff for this library as around mid-2025.\" Both draws of this pair repudiated the environment value; neither would have been licensed to charge. Read from this draw and not back-filled.",
    "believed_latest_version": "1.1.x",
    "believed_latest_quote": "\"The latest version I know of is roughly 1.1.x (May 2025). That is also the most recent release whose contents I can actually describe. I have a vague sense that later 1.x patch/minor releases exist, but I cannot say what is in them.\"",
    "knowledge_stops_at_version": "1.1.0",
    "knowledge_stops_on": "2025-05-06",
    "knowledge_gap_starts_at_version": "1.2.0",
    "knowledge_gap_starts_on": "2025-11-24",
    "cutoff_lag_months": null
  },
  "test": {
    "date": "2026-09-05",
    "battery": "valibot/v3-b",
    "battery_spec": "prompts/valibot.md",
    "prompt_file": "prompts/sent/valibot-v3.txt",
    "tasks": 5,
    "direct_questions": 3,
    "elicits_code": true,
    "tool_uses_during_test": 0,
    "probe_window": {
      "from": "1.3.0",
      "to": "1.4.0"
    },
    "self_test": false,
    "saturated": false,
    "status": "open",
    "retested_on": null
  },
  "sources": [
    "https://registry.npmjs.org/valibot",
    "https://github.com/open-circle/valibot/releases/tag/v1.3.0",
    "https://github.com/open-circle/valibot/releases/tag/v1.4.0",
    "https://registry.npmjs.org/valibot/-/valibot-1.4.2.tgz"
  ],
  "findings": [],
  "non_findings": [
    {
      "kind": "miss",
      "summary": "Task 1, the `guard` probe. \"No\", with the negative stated by name: \"I am not aware of a `v.guard()`-style action that infers its output type from a type predicate.\" `guard` shipped in 1.3.0 and is exactly that. The draw named the API it was denying, which is the sharpest form this miss takes across the five arms. Its `v.check()` analysis is correct and its `v.custom<PluginConfig>` substitute compiles and narrows.",
      "api": "guard",
      "introduced_in": "1.3.0",
      "chargeable_miss": true,
      "miss_class": "non_charging_arm",
      "charged_on": null,
      "why_not_a_finding": "Blind twin of `v3-a`; a `-b` draw never charges. Its stated cutoff would have barred it in any case."
    },
    {
      "kind": "miss",
      "summary": "Task 2, the case-conversion probe, offer direction. \"No\", with the same near-miss its twin recorded, worded more strongly: \"I have a weak, unreliable recollection of `toCamelCase`/`toSnakeCase` being discussed or added in a 1.x release; I would not write code against that without checking.\" Both are real, both shipped at 1.4.0, and both arms of this pair had a trace of them and declined to act on it.",
      "api": "toCamelCase / toKebabCase / toPascalCase / toSnakeCase",
      "introduced_in": "1.4.0",
      "chargeable_miss": true,
      "miss_class": "non_charging_arm",
      "charged_on": null,
      "why_not_a_finding": "Blind twin; and the stated-cutoff bar applies to this pair."
    },
    {
      "kind": "miss",
      "summary": "Task 3, the recognition direction. Rejected the pull request: \"I do not believe `v.toKebabCase()` or `v.toTitleCase()` exist in valibot ... These look like plausible-sounding names extrapolated from `v.toLowerCase()`/`v.toUpperCase()`.\" The extrapolation account is right about one of the two and wrong about the other: `toKebabCase` is real at 1.4.0+. It then added a review note advising the colleague to check whether their CI type-checks at all, because a passing build would be inexplicable — an artefact worth recording, since the build would in fact pass.",
      "api": "toKebabCase",
      "introduced_in": "1.4.0",
      "chargeable_miss": true,
      "miss_class": "non_charging_arm",
      "charged_on": null,
      "why_not_a_finding": "Blind twin; and the stated-cutoff bar applies to this pair."
    },
    {
      "kind": "miss",
      "summary": "Task 4, the `cache` probe. \"No\": \"I am not aware of any built-in memoization in valibot. Schemas are plain objects with a `~run`/`_run` method and no cache.\" `cache` shipped in 1.3.0 and wraps a schema by exactly that route. The memoized parser it wrote instead is correct, including its own caveats about identity keying and shared output objects — which happen to be the same caveats the shipped `cache` documents.",
      "api": "cache",
      "introduced_in": "1.3.0",
      "chargeable_miss": true,
      "miss_class": "non_charging_arm",
      "charged_on": null,
      "why_not_a_finding": "Blind twin; and the stated-cutoff bar applies to this pair."
    },
    {
      "kind": "correct",
      "summary": "Task 5, the attribution anchor. `parseJson`/`stringifyJson` at v1.1.0, \"around May 2025\" — correct to the minor and to within days. The arm is read for attribution.",
      "api": "parseJson / stringifyJson",
      "introduced_in": "1.1.0"
    },
    {
      "kind": "correct",
      "summary": "The poison rung. Refused `toTitleCase`, which has never shipped. P4 holds on this arm.",
      "api": "toTitleCase",
      "introduced_in": null
    },
    {
      "kind": "context",
      "summary": "The boundary, and the reason this pair is worth more than its zero findings: **both blind draws land on 1.1.0 / 1.2.0, identically.** `identical_prompt` spread of zero on the quantity that usually moves. Combined with the twin, Claude Fable 5.1's valibot boundary is the most stable measurement in this library's file, and it sits thirteen months below the subject's stated cutoff.",
      "api": null,
      "introduced_in": null
    }
  ],
  "summary": "Blind twin, charges nothing by construction. Agrees with `v3-a` on every task: three denials, a pull request rejected in both halves where only one half deserved it, a correct anchor, and a boundary at 1.1.0 / 1.2.0. It denies `guard` **by name**, which its twin does not, and it repudiates its stated cutoff in the same terms. Zero spread between the two draws on the boundary question."
}
