{
  "$schema": "../../schema/run.schema.json",
  "run_id": "valibot--claude-haiku-4-5--v2-g--2026-09-02",
  "supersedes": null,
  "replicate_of": null,
  "library": {
    "name": "valibot",
    "ecosystem": "npm",
    "latest_version_at_test": "1.4.2",
    "latest_version_verified_on": "2026-09-02"
  },
  "model": {
    "id": "claude-haiku-4-5",
    "label": "Claude Haiku 4.5",
    "vendor": "Anthropic",
    "invoked_as": "Agent tool, model alias \"haiku\", general-purpose subagent, instructed to use no tools; BELOW-FLOOR CONTROL arm, single, charges nothing of battery valibot/v2, sent prompts/sent/valibot-v2.txt byte-identical",
    "self_reported_cutoff": "2025-02",
    "cutoff_basis": "Self-reported: \"Training cutoff: February 2025.\"",
    "believed_latest_version": null,
    "believed_latest_quote": "\"I'm confident in describing valibot's core API as it existed around late 2024/early 2025, but I'm hesitant to pin a specific version number or date without being certain.\"",
    "knowledge_stops_at_version": null,
    "knowledge_stops_on": null,
    "knowledge_gap_starts_at_version": null,
    "knowledge_gap_starts_on": null,
    "cutoff_lag_months": null
  },
  "test": {
    "date": "2026-09-02",
    "battery": "valibot/v2-g",
    "battery_spec": "prompts/valibot.md",
    "prompt_file": "prompts/sent/valibot-v2.txt",
    "tasks": 5,
    "direct_questions": 3,
    "tool_uses_during_test": 0,
    "probe_window": {
      "from": "1.1.0",
      "to": "1.2.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.1.0",
    "https://github.com/open-circle/valibot/releases/tag/v1.2.0",
    "https://github.com/open-circle/valibot/releases/tag/v1.3.0",
    "https://registry.npmjs.org/valibot/-/valibot-1.4.2.tgz"
  ],
  "findings": [],
  "non_findings": [
    {
      "kind": "context",
      "summary": "THE CONTROL RESULT, and it falsifies pre-registered prediction P3. This subject's stated cutoff is nine months BELOW valibot 1.2.0, and it answered task 1 \"yes\" and \"yes\" and wrote `v.pipe(v.string(), v.toNumber())` and `v.pipe(v.string(), v.toBoolean())` — the current API, verbatim — where all six above-floor draws denied both actions exist. In task 2 it accepted the pull request: \"The code compiles and runs. Both `v.toNumber()` and `v.toBoolean()` are real built-in actions in the current stable release.\" Under the rule fixed before the run, task 1 is therefore marked DERIVABLE ON PASS: the names are reachable from the problem statement (Zod's `z.coerce.number()` is the obvious donor) and no PASS on this probe may be read as knowledge. Every FAILURE stands untouched — JOURNAL/031: a derivable outcome kills a pass, not a failure.",
      "api": "toNumber / toBoolean / toDate / toBigint / toString",
      "introduced_in": "1.2.0"
    },
    {
      "kind": "context",
      "summary": "The control was right about the API and wrong about the task. Its `v.pipe(v.string(), v.toBoolean())` returns `true` for the input \"false\" — verified against valibot@1.4.2 — so on the actual scenario the battery posed, the below-floor control that named the right API produced the wrong answer, and the six above-floor draws that denied the API produced the right one. Recorded because it is the cleanest illustration in the Index of why a derivable name is not knowledge.",
      "api": "toBoolean",
      "introduced_in": "1.2.0"
    },
    {
      "kind": "correct",
      "summary": "Behaved as a below-floor control should on everything that is not derivable. Task 4: \"I don't want to guess incorrectly about which release or when it shipped\" — the anchor is not placed, as expected nine months below it. Task 5: declined to claim, then speculated a `.example(1)` method that has never existed in any shape. Direct question (c): declined to list any release with contents. Both bracket ends are null.",
      "api": null
    }
  ],
  "summary": "Below-floor control, single arm, charges nothing — and the most consequential arm in the battery. Nine months under the target release it produced the target API on both halves and accepted the test pull request, which falsifies P3 and marks the coercion probe DERIVABLE ON PASS. It could not place the 1.1.0 anchor, could not name a version it can describe, and invented a `.example()` method, so its knowledge of the library is demonstrably below the window; what it had was the name, not the release. The asymmetry is the point: a derivable name makes a pass unreadable and leaves six failures exactly where they were."
}
