{
  "$schema": "../../schema/run.schema.json",
  "run_id": "valibot--claude-sonnet-5--v2-d--2026-09-02",
  "supersedes": null,
  "replicate_of": "valibot--claude-sonnet-5--v2-c--2026-09-02",
  "library": {
    "name": "valibot",
    "ecosystem": "npm",
    "latest_version_at_test": "1.4.2",
    "latest_version_verified_on": "2026-09-02"
  },
  "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; blind twin test arm, charges nothing of battery valibot/v2, sent prompts/sent/valibot-v2.txt byte-identical",
    "self_reported_cutoff": "2026-01",
    "cutoff_basis": "Self-reported, affirming the environment value with a density caveat: \"The environment here states this session is 'Claude Sonnet 5' with a cutoff of January 2026. I can't independently verify that against genuine recollection of valibot changelog content — my confident, describable knowledge of this specific library's history thins out well before that.\" Same shape as its blind twin: the date is affirmed, the density is qualified.",
    "believed_latest_version": "1.0.0",
    "believed_latest_quote": "\"I recall valibot reaching a stable v1.0.0 release, which I believe shipped in early 2025 ... I don't have reliable knowledge of a specific version number beyond that as 'the latest' — anything I might name past 1.0.0 would be a guess dressed up as a fact.\"",
    "knowledge_stops_at_version": "1.0.0",
    "knowledge_stops_on": "2025-03-19",
    "knowledge_gap_starts_at_version": "1.1.0",
    "knowledge_gap_starts_on": "2025-05-06",
    "cutoff_lag_months": 10
  },
  "test": {
    "date": "2026-09-02",
    "battery": "valibot/v2-d",
    "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": "miss",
      "summary": "Reproduced its twin's failure exactly. Task 1: \"No\" and \"No\", with \"there's no built-in `toBoolean`-style action shipping in valibot\". Task 2: \"`v.toNumber()` and `v.toBoolean()` are not real exports of valibot — I'm not aware of either ever existing in the library's action set.\" Task 3 went further than any other draw: \"there was never a 'coerce mode' that got added or removed\" — which is wrong in both directions, since 0.x had `coerce` and 1.2.0 added the `to*` conversions.",
      "api": "toNumber / toBoolean / toDate / toBigint / toString",
      "introduced_in": "1.2.0",
      "chargeable_miss": true,
      "miss_class": "non_charging_arm",
      "charged_on": "valibot--claude-sonnet-5--v2-c--2026-09-02",
      "why_not_a_finding": "Pre-registered: the blind twin of a duplicated test arm charges nothing. The same failure against the same subject is charged on v2-c."
    },
    {
      "kind": "context",
      "summary": "Task 4, the attribution anchor, was NOT placed — the same refusal as its twin: \"I'm not aware of a specific valibot action that parses an embedded JSON string ... I'm not even confident it exists under that description.\" Both Sonnet 5 arms therefore fail the internal control and neither is read for attribution. That the pair agrees on failing it is itself the cleanest reading in the battery: the control is measuring the subject, not the draw.",
      "api": "parseJson / stringifyJson",
      "introduced_in": "1.1.0"
    },
    {
      "kind": "miss",
      "summary": "The only draw in the battery whose replacement code for the boolean is materially worse than its twin's: `v.pipe(v.string(), v.transform((input) => input === \"true\"), v.boolean())` accepts any string and silently maps \"yes\", \"1\" and typos to `false` rather than raising an issue. Working code, no denial attached, so it is not chargeable — but it is the case the picklist guard exists to prevent, written by the same subject whose twin used the guard.",
      "api": null,
      "chargeable_miss": false,
      "why_not_a_finding": "Additive-API rule plus the code-vs-claim rule: the code runs and the draw claimed nothing false about it. Recorded because the two blind twins of one subject differed on it."
    },
    {
      "kind": "imprecision",
      "summary": "Task 5 answered \"Yes\" via `v.metadata()` and a `schema.pipe.find()` scan. The generic action exists; the first-class `v.examples()`/`v.getExamples()` from 1.2.0 went unmentioned. Working code.",
      "api": "examples / getExamples",
      "introduced_in": "1.2.0",
      "chargeable_miss": false,
      "why_not_a_finding": "Hedged prose plus working code."
    }
  ],
  "summary": "Blind twin, charges nothing. Agreed with its charging twin on the boundary (1.0.0 / 1.1.0 — the only pair in this battery to agree exactly), on the denial, and on failing the internal control. It also produced the battery's single worst piece of replacement code, an unguarded string-to-boolean transform, while its twin used the picklist guard — the two halves of one subject splitting on the code while agreeing on the self-report, which is the pattern JOURNAL/034 recorded at next.js and the inverse of langchain/v1r."
}
