{
  "$schema": "../../schema/run.schema.json",
  "run_id": "react-router--claude-fable-5-1--v1-b--2026-09-09",
  "supersedes": null,
  "replicate_of": "react-router--claude-fable-5-1--v1-a--2026-09-09",
  "library": {
    "name": "react-router",
    "ecosystem": "npm",
    "latest_version_at_test": "8.3.1",
    "latest_version_verified_on": "2026-09-09",
    "latest_version_note": "`https://registry.npmjs.org/react-router` read this session before the prompt was written: `dist-tags.latest` is 8.3.1, `version-7` is 7.18.3, `version-6` is 6.30.6. Three real installs were driven this session, each under the package's real name in its own scratch directory beside `react@19.2.8`: `react-router@7.11.0`, `@7.14.2` and `@8.3.1`."
  },
  "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/react-router-v1.txt, concurrently with and blind to `v1-a`. The `-b` half of a pair duplicated at birth: it charges nothing by design, whatever it finds (HARNESS.md § *Every new battery runs its test arm in duplicate*).",
    "self_reported_cutoff": null,
    "cutoff_basis": "REPUDIATED, and therefore null — independently of its twin, on the same plain wording. \"The environment I am running in states a training cutoff of June 2026. My *usable* knowledge of this library is dense through roughly late 2025 and thin after that, **which is the more honest number for the purposes of your measurement**.\" It names the environment value, offers a second date, and says the second is the more honest number for the measurement — choosing between two dates rather than qualifying recall, which is the distinguishing test in HARNESS.md § *A library-scoped substitute cutoff is still a repudiation*. Both twins repudiated, in different words, on the wording that was supposed to prevent it.",
    "believed_latest_version": "7.13.0",
    "believed_latest_quote": "\"Latest version I have any awareness of: the 7.x line continuing into early 2026, somewhere around 7.10–7.13. I cannot vouch for those numbers individually. Most recent release whose contents I can actually describe: the **7.9.x** series, with 7.9.0 shipping roughly **September 2025** ... Patch releases through roughly October 2025 I know as bug fixes only.\"\n\nBRACKET PROVENANCE — Clean and self-consistent across (a), (c) and (d): 7.9.0 described with contents and dated to September 2025 (actual 2025-09-12), 7.9.x patches known \"as bug fixes only\", and \"First release I know only as a version number: **7.10.0** (my guess is Nov–Dec 2025)\" — a guess that is right, 7.10.0 shipped 2025-12-02. Its twin's bracket sits one release higher because `v1-a` described 7.10.0's contents at partial confidence where this arm did not.",
    "knowledge_stops_at_version": "7.9.0",
    "knowledge_stops_on": "2025-09-12",
    "knowledge_gap_starts_at_version": "7.10.0",
    "knowledge_gap_starts_on": "2025-12-02",
    "cutoff_lag_months": 9
  },
  "test": {
    "date": "2026-09-09",
    "battery": "react-router/v1-b",
    "battery_spec": "prompts/react-router.md",
    "prompt_file": "prompts/sent/react-router-v1.txt",
    "tasks": 4,
    "direct_questions": 4,
    "elicits_code": true,
    "tool_uses_during_test": 0,
    "probe_window": {
      "from": "7.12.0",
      "to": "7.15.0"
    },
    "self_test": false,
    "saturated": false,
    "status": "open",
    "retested_on": null
  },
  "sources": [
    "https://registry.npmjs.org/react-router",
    "https://github.com/remix-run/react-router/blob/main/packages/react-router/CHANGELOG.md"
  ],
  "findings": [],
  "non_findings": [
    {
      "kind": "miss",
      "summary": "LF1, reproduced independently of its twin and uncharged twice over — the `-b` arm charges nothing by design, and this arm also repudiated its cutoff. \"What I believe it actually produces on the current implementation is the pattern back unchanged: `/books/:id.json`\", with the same segment-splitting mechanism its twin gave and the same anchored regex. Executed this session: 8.3.1 returns `\"/books/7.json\"`, 7.11.0 returns the pattern. Two blind draws of the same subject reached the same stale belief in the same words, which is what a duplicated arm is for. Charged nowhere: the only arm licensed to charge in this battery is a DIFFERENT SUBJECT (Claude Opus 5, v1-c), and a miss is only ever charged on another arm of the same subject.",
      "api": "generatePath",
      "introduced_in": "7.12.0",
      "chargeable_miss": true,
      "miss_class": "non_charging_arm",
      "charged_on": null,
      "why_not_a_finding": "The `-b` half of a born-duplicated pair charges nothing; this arm additionally repudiated its stated cutoff."
    },
    {
      "kind": "correct",
      "summary": "THE TWIN SPLIT, AND IT IS THE MOST INTERESTING LINE IN THE PAIR. On the same prompt, `v1-a` asserted the stale behaviour flatly and `v1-b` asserted it AND told the developer how to find out it was wrong: \"Caveat on my own claim: it is possible a 7.x patch taught `generatePath` (or the typed `href()` helper) about params embedded mid-segment; I do not recall one, but I would confirm with a one-line test before relying on either outcome: `expect(generatePath('/books/:id.json', { id: '7' })).toBe('/books/7.json');`\" That assertion is the exact test that PASSES on the current release. The arm wrote the falsifier for its own belief and shipped the workaround anyway. Under the code-vs-claim rule the hedge would reduce this to an imprecision on a charging arm — which is the fifth time the `-b` twin has held the better answer (HARNESS.md § *The `-b` twin streak*).",
      "api": "generatePath",
      "introduced_in": "7.12.0"
    },
    {
      "kind": "miss",
      "summary": "LF3, reproduced with a different confidence profile from its twin's. This arm attributed `unstable_instrumentations` to \"late 2025 (my memory says the 7.9/7.10 window)\", flagged it as unstable-prefixed, showed a hand-rolled route-tree wrapper FIRST as \"what I would actually ship today\", and put the `unstable_instrumentations` version second with an explicit warning: \"this is the shape as I remember it; verify against the `unstable_instrumentations` docs page because I am not certain of the argument names.\" The identifiers are real below 7.15.0 and have zero occurrences in 8.3.1's `dist`, so the shipped shape is stale — but the primary recommendation is a hand-roll that works, and the stale API is hedged. On a charging arm this ordering is what separates an S1 from an imprecision.",
      "api": "instrumentations",
      "introduced_in": "7.15.0",
      "chargeable_miss": true,
      "miss_class": "non_charging_arm",
      "charged_on": null,
      "why_not_a_finding": "Non-charging twin; cutoff also repudiated; and the stale API is offered second, behind a working hand-roll and a warning."
    },
    {
      "kind": "imprecision",
      "summary": "Task 3, same shape as both other above-floor arms: `new URL(request.url)`, no mention of the normalised `url` argument (LF2), working code, imprecision under the additive rule. It makes the same unadjudicable `.data`-stripping claim its twin does, in the same direction, and adds the one qualification that makes it honest — \"if you ever log at the adapter/`handleDataRequest` layer instead of in the loader you will see the raw `.data` URL.\"",
      "api": "url",
      "introduced_in": "7.15.0"
    },
    {
      "kind": "context",
      "summary": "THE PREDICTION IS FALSIFIED ON THIS ARM TOO. Boundary 7.9.0 (2025-09-12) against a 2025-12-15 median: the loudest library the Index has probed reads three months EARLIER than this subject's median across seven quieter ones. Two blind Fable 5.1 draws, both falsifying, and the Opus 5 arm confirming by twenty days at the same release — which is the pattern that points at the 81-day release gap rather than at discussion volume.",
      "api": null,
      "introduced_in": null
    },
    {
      "kind": "context",
      "summary": "The poison rung produced no false positive here either: \"**7.19.0** — I do not know this one. It could exist by mid-2026 on the same cadence, but I have no memory of it and would not assert it was published.\" It asserted 7.9.0 and 7.5.0 as real with contents, called 7.13.0 \"plausibly real\", and declined both 8.x rungs. Three arms, three refusals of a version that has never been published, zero confabulations across the rung set.",
      "api": null,
      "introduced_in": null
    }
  ],
  "open_questions": [],
  "summary": "The blind twin, and it reproduced its pair-mate's two stale beliefs in different words while repudiating its cutoff independently — \"the more honest number for the purposes of your measurement\" — on the same standing wording. Its boundary is one release lower than its twin's, 7.9.0 / 7.10.0, and falsifies the battery's prediction on the same side. The line worth keeping is that it wrote the falsifier for its own claim: it shipped the workaround for `generatePath` and, beside it, the one-line assertion that passes on the current release, telling the developer to run it before trusting either outcome."
}
