{
  "$schema": "../../schema/run.schema.json",
  "run_id": "valibot--claude-fable-5-1--v4-b--2026-09-06",
  "supersedes": null,
  "replicate_of": "valibot--claude-fable-5-1--v4-a--2026-09-06",
  "library": {
    "name": "valibot",
    "ecosystem": "npm",
    "latest_version_at_test": "1.4.2",
    "latest_version_verified_on": "2026-09-06",
    "latest_version_note": "Re-verified this session: `npm view valibot version` returns 1.4.2, unchanged from the `v3` battery a day earlier. The probe surfaces were re-executed against `valibot@1.4.2` installed in the session scratchpad: `guard`, `cache`, `toKebabCase`, `toCamelCase`, `toSnakeCase`, `toPascalCase`, `toUpperCase`, `toLowerCase`, `parseJson`, `stringifyJson`, `parseBoolean`, `slug`, `check` and `custom` all resolve to functions; `toTitleCase` is `undefined` — the poison rung is still absent from the current release. The introducing releases are the ones the `v3` export diff established across 1.0.0/1.1.0/1.2.0/1.3.0/1.4.0/1.4.2; 1.1.0 was re-installed this session to check the one new claim the arms made, and `slug` is present at 1.1.0 while `guard`, `cache` and `toKebabCase` are not."
  },
  "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-v4.txt, byte-identical to its twin and spawned concurrently and blind. Same identity probe as `v4-a`: Claude Fable 5.1, `claude-fable-5-1`, cutoff June 2026, all three from its system prompt. The `-b` position of a born-duplicated pair, so it charges nothing whatever it finds (HARNESS.md § *Every new battery runs its test arm in duplicate*).",
    "self_reported_cutoff": "2026-06",
    "cutoff_basis": "Self-reported, AFFIRMING the environment value with a density caveat, and it named the gap as the interesting quantity without being asked: \"My stated knowledge cutoff is June 2026. In practice, my detailed knowledge of this specific library gets unreliable after roughly mid-2025; the gap between those two dates is itself a finding worth recording.\" Same reading as its twin under HARNESS.md § *A density self-assessment is not a stated cutoff*. Both arms of this pair affirmed; both arms of the `v3` pair, sent the same tasks with one extra clause on this question, repudiated. Two for two in each direction is the evidence that the clause was doing the work.",
    "believed_latest_version": "1.1.0",
    "believed_latest_quote": "\"The latest version I can describe with reasonable confidence is **1.1.0 (~May 2025)**. I believe patch releases followed (1.1.x), and I have a vague sense that a 1.2.0 may exist later in 2025, but I can't tell you what's in it.\"",
    "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": 13
  },
  "test": {
    "date": "2026-09-06",
    "battery": "valibot/v4-b",
    "battery_spec": "prompts/valibot.md",
    "prompt_file": "prompts/sent/valibot-v4.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\", then: \"There is no built-in action that consumes a type predicate and narrows … there's no `guard`/`refine`-with-narrowing action that I know of.\" Like its twin it produced the real name inside the denial. `guard` shipped at 1.3.0 (2026-03-17). Its `v.custom<PluginConfig>` substitute compiles and narrows, and its warning that the generic is not derived from the predicate is correct.",
      "api": "guard",
      "introduced_in": "1.3.0",
      "chargeable_miss": true,
      "miss_class": "non_charging_arm",
      "charged_on": "valibot--claude-fable-5-1--v4-a--2026-09-06",
      "why_not_a_finding": "The `-b` position of a born-duplicated pair charges nothing. The identical miss is charged as F1 on the twin, which affirmed the same cutoff."
    },
    {
      "kind": "miss",
      "summary": "Task 2, the case-conversion probe, offer direction. \"No\", with a hedge that dates itself precisely: \"I'm confident there was no `toKebabCase` through valibot 1.1. If a later release added case converters, I don't know about it.\" That is the cleanest statement of the pre-1.4.0 truth any arm in either battery has produced — correct as at its own boundary, stale as at the release under test.",
      "api": "toCamelCase / toKebabCase / toPascalCase / toSnakeCase",
      "introduced_in": "1.4.0",
      "chargeable_miss": true,
      "miss_class": "non_charging_arm",
      "charged_on": "valibot--claude-fable-5-1--v4-a--2026-09-06",
      "why_not_a_finding": "Blind twin. Charged as part of F3 on `v4-a`."
    },
    {
      "kind": "miss",
      "summary": "Task 3, the recognition direction. \"As far as I know, **neither** `v.toKebabCase()` nor `v.toTitleCase()` exists in valibot, so this fails at compile time … `toTitleCase` in particular I'm quite sure has never existed.\" The confidence is graded and it is graded correctly on the half that is invented and incorrectly on the half that ships — the same rejected-correct pull request its twin is charged for.",
      "api": "toKebabCase",
      "introduced_in": "1.4.0",
      "chargeable_miss": true,
      "miss_class": "non_charging_arm",
      "charged_on": "valibot--claude-fable-5-1--v4-a--2026-09-06",
      "why_not_a_finding": "Blind twin. Charged as F3 on `v4-a`."
    },
    {
      "kind": "miss",
      "summary": "Task 4, the `cache` probe. \"No\": \"Valibot has no memoizing schema or action. `v.lazy()` exists but it's for recursive/deferred schema construction, not result caching. You wrap it yourself.\" `cache` shipped at 1.3.0 and wraps a schema by exactly that route; the memoized parser it wrote instead is correct.",
      "api": "cache",
      "introduced_in": "1.3.0",
      "chargeable_miss": true,
      "miss_class": "non_charging_arm",
      "charged_on": "valibot--claude-fable-5-1--v4-a--2026-09-06",
      "why_not_a_finding": "Blind twin. Charged as F2 on `v4-a`."
    },
    {
      "kind": "correct",
      "summary": "Task 5, the attribution anchor. `parseJson`/`stringifyJson` at 1.1.0, \"around May 2025\" — correct to the minor and to within days. It went further than the task asked and separated the built-in from the older `rawTransform` workaround it dated to the 0.31 line (June 2024), which is also right.",
      "api": "parseJson / stringifyJson",
      "introduced_in": "1.1.0"
    },
    {
      "kind": "correct",
      "summary": "The poison rung, refused, and with the sharpest wording in the pair: \"`toTitleCase` in particular I'm quite sure has never existed; there's no locale-aware title-casing in the library.\" P5 holds 2/2 on this pair.",
      "api": "toTitleCase",
      "introduced_in": null
    },
    {
      "kind": "context",
      "summary": "Zero spread against its twin, for the second battery running. Same boundary (1.1.0 / 1.2.0), same first-unknown release named as 1.2.0, same four denials, same correct anchor, same affirmed cutoff. The `v3` pair agreed exactly too, on a different direct question. Four Fable 5.1 measurements of valibot across two batteries now sit on one release.",
      "api": null,
      "introduced_in": null
    }
  ],
  "open_questions": [],
  "summary": "The blind twin, and it agrees with `v4-a` on every quantity that matters: the same four reproduced failures, the same 1.1.0 / 1.2.0 boundary, the same correct 1.1.0 anchor, the same refusal of the poison rung, and — the quantity this battery exists to measure — the same affirmation of its June 2026 cutoff with a density caveat rather than a repudiation. It charges nothing, by position. Its task-2 hedge is the most precisely dated stale sentence in either valibot battery: confident there was no `toKebabCase` through 1.1, and unaware of everything after."
}
