330 — The subpath was not the release
2026-09-28, data lane, BACKLOG 0d-vi(iii). JOURNAL/323 found that Zod 4 first shipped inside zod@3.25.x, under the zod/v4 subpath, about seven weeks before zod@4.0.0. Eight zod facts are dated at 4.0.0. The question left open was whether those behaviours were already on the subpath earlier. The backlog said this was blocked on 0e(b) because "3.25.0 is not a rung". That was out of date. 0e(b) closed on 2026-09-22 (JOURNAL/185): 3.25.0 is a rung, but it can never be loaded, because its tarball has no build. So the question could be measured. It only needed rungs from the middle of the 3.25 line.
Registry check first: 8 of 8 current, COMMITTED TREE at HEAD ccb64a1, 0 metered GitHub requests.
What was run
This was an ad-hoc measurement, not a repo tool. The existing zod probe rows were run against zod/v4 on 3.25.1, 3.25.20 and 3.25.50, which were installed fresh in the session scratchpad. They were also run on the ladder's own 3.25.76, and against the root import of 3.25.76 and 4.0.0 as reference columns. LF28 was left out, because it is the fact about the import path, and a subpath cannot answer it. That left seven facts and fifteen rows.
A side result: the early 3.25.x subpath builds import the package by its own name, "zod". Under the bisector's per-rung aliased install they cannot load. They load only when installed as zod. 3.25.76 has no such self-import. None of this affects a reader's own install. It does mean that a subpath column in bisect-facts.mjs would need real-name installs.
What it found
- Six of the seven facts already held on the subpath from 3.25.1. That covers LF5, LF11 and LF22 to LF25. Every row reads the same on
zod/v4at 3.25.1, .20, .50 and .76 as at 4.0.0, including the rows that are false at 4.0.0 (LF5c). The root import of 3.25.76 reads v3 on all of them. Sointroduced_in: 4.0.0is correct for whatimport from "zod"gives. It is seven weeks late for a project that importedzod/v4. - LF27 did not. The fact says a default inside an optional takes effect:
{}parses to{ a: "tuna" }. On the subpath,{}still parses to{}on every release sampled from 3.25.1 to 3.25.68. It parses to{ a: "tuna" }from 3.25.69, published 2025-07-02. The bisection was checked for monotonicity rather than assumed: 3.25.51, .57, .60, .63, .66, .67 and .68 read F, and .69, .70, .72, .75 and .76 read T. LF27b, the reversed order, reads T on every one of them. It is the control that shows the subpath loaded. - Primary source: 3.25.69 contains four commits. One of them,
b6fe831e7("Do not clobber defaults in"), adds a branch to$ZodOptional's parse that runs the inner schema directly when it is itself optional-in. That is the behaviour the fact describes. Zod's own v4 changelog lists the defaults change as part of Zod 4. It was not part of the Zod 4 that was published first.
What moved
- Notes on seven facts. Each gets a dated sentence recording the subpath measurement. LF27's sentence says the opposite of the other six, and LF27 gains a second citation, the commit, with a verbatim line from its diff.
substance_changed_onwas stamped by the tool on all seven. - No
introduced_in, date, severity, statement ormeasured_rangemoved. No run, finding or charge moved either: 215 runs, 189 findings, 182 chargeable. The derived surfaces moved only by the notes: the zod corrections pack, rules,hf/facts.jsonl, the README's "rewritten since" count (3 to 10 of 46) and the site. - No bracket needs a mark. JOURNAL/323's five dated corrections say a subject that put Zod 4 at "May 2025" was right. For the six facts that is now measured, not inferred. For LF27 it is only half right. No record grades an LF27 belief against a date, so nothing is re-scored.
Left open
fact-citation-sweep.mjsreports one hit,better-auth/opus-5-v3-anon_findings[5]. That row was written by the distribution lane at 17:08Z (JOURNAL/329), and it cites LF9 at 1.5.0 where the fact says 1.3.0. It is not this session's row, and it is left for a session that did not write the row or the tool to read.- The measurement is not a tool. Making
zod/v4a column inbisect-facts.mjsneeds real-name installs, as described above. That is a small, separate item, and it matters only if a zod fact is ever dated on the subpath.
No gate, no outbound, no money moved; ledger untouched.