docs(types): the four objectql mirror docblocks say "not defaulted on parse" (objectui#8735) - #9077
Conversation
… parse" (objectui#8735)
objectui#8317 made `@object-ui/types`' zod mirrors stop substituting imported
`@objectstack/spec` defaults on parse, via `stripImportedDefaults`. Four
docblocks in `zod/objectql.zod.ts` still described the OLD behaviour in the
present tense, so each stated the opposite of what its own export does:
:98 `method` "now defaults to `'GET'` on parse"
:121-122 `prefix.type` "defaults to `'text'` on parse ... so the renderer
always gets a value"
:128-129 `type` "now defaults to `'none'` on parse"
:135-136 `pageSize` "with a default of 25 on parse"
Each is rewritten to say the key is declared and accepted but NOT defaulted on
parse. Measured per key against the code, spec leg vs mirror leg, each with a
firing control (a key whose authored value does survive the same parse):
method spec {"url":"/x","method":"GET"} mirror {"url":"/x"}
prefix.type spec prefix{field,type:"text"} mirror prefix{field}
type spec {"type":"none"} mirror {}
pageSize spec {"pageSize":25,...} mirror {"pageSizeOptions":[10,20]}
Comment-only: no default, no behaviour and no accept set moves. Each key is
still declared, still accepted, and still checked (an illegal value is refused
on all four).
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Jmxdo7bmeqCQHLSfmLVX9w
…jectui#8735) `scripts/check-changeset-presence.mjs` guards `<pkg>/src/**` of every package in the `fixed` group; `isPublishedSource` clause (a) returns true for anything under `src/` first and unconditionally, with no content-level inspection, so a comment-only edit inside `packages/types/src/` is guarded like any other source change. Independently, the corrected text is emitted verbatim into the published `dist/zod/objectql.zod.d.ts`, so it really does ship. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Jmxdo7bmeqCQHLSfmLVX9w
✅ Console Performance Budget
The eager closure is every chunk the entry reaches through static imports — what the browser fetches and parses before the app renders. The entry chunk on its own is a small fraction of it. 📦 Bundle Size Report
Size Limits
|
Landing provenance — PR #9077 (card objectui#8735)Reviewed / landed head: ① in-seat clause-② contract review — NOT OWED, and that is a non-applicability, not a PASSThe card declares ② the enqueue gates
Verbatim from the carriers run — it names its own board, so the reading is not about the wrong repo:
The widening-tells run reports one file NOT MEASURED and I am not counting that as clean. The tool ⭐ the control — why that clean reading is a real negativeA gate that returns 0 proves nothing until it is known to fire in the region under test. Same tool, same It fires on this exact path. The 0 on the real diff is therefore a measurement, not a silence. ③ every check, not a required subset35 check-runs on charter provenance, with its own controlThe governing files are byte-identical between the clone's carriers strippedNeither carrier holds Generated by Claude Code |
Fixes #8735
objectui#8317 made
@object-ui/types' zod mirrors stop substituting imported@objectstack/specdefaults on parse, viastripImportedDefaults. Four docblocks inpackages/types/src/zod/objectql.zod.tsstill described the OLD behaviour in the present tense, so each stated the opposite of what its own export does. Each now says the key is declared and accepted but NOT defaulted on parse.Comment-only. No default, no behaviour and no accept set moves.
Premise re-derived on my own base
Re-measured on
c3a427378(my clone'sorigin/main, not the card's numbers). All four survive; anchors are the end-of-sentence lines.HttpRequestSchema.method:98methodnow defaults to'GET'on parse"ListColumnSchema.prefix.type:121-122'text'on parse ... so the renderer always gets a value"SelectionConfigSchema.type:128-129typenow defaults to'none'on parse"PaginationConfigSchema.pageSize:135-136grep -Fon these sentences returns a false 0 for three of the four, because they wrap across a line break — it reads exactly like "already fixed". Flattening the docblock line-prefix first givesflattened_count=1for all four:Live-query controls on that same corpus: "on parse" occurs 5 times, an absent sentinel 0 times.
Each rewrite measured against the code, with a firing control
For every key: the spec leg still substitutes the default; the mirror leg does not; an authored value is preserved; an illegal value is refused. The firing control is a key whose value does survive the same parse, so an absent key is a real absence and not an empty probe.
SelectionConfigSchema's shape has exactly one key, so no sibling can serve as its control; C's firing control is the authored leg of the same key. A/B/D use a genuine sibling key in the same parse output. My first attempt at C put the control on the omitted leg, where it could not fire — that run is discarded, not reported.The probe was a scratch file. It is not in this diff.
The changeset question, answered by reading the gate
scripts/check-changeset-presence.mjs,isPublishedSource:Clause (a) answers first and unconditionally, and the gate does no content-level inspection anywhere — it classifies by path. So a comment-only edit inside
packages/types/src/is guarded exactly like any other source change, provided the package is in thefixedgroup.@object-ui/typesis:versioned: true, ignored: false(read from the gate's owndiscoverPackages; control:README.mdreturnsfalsefrom the same function).⇒ a changeset is owed. The gate's own verdict lines, both directions:
Restore leg: byte-identical (
git hash-objectmatches before and after),git diff HEADempty, gate back to rc=0.Independently — and this is why the entry is a
patchrather than an empty declaration — the corrected text really ships. Built@object-ui/typesand matched the emitted declarations (flattened, since the emitted text wraps too):filesfor this package is["dist", ...],privateunset, so those declarations are in the npm tarball. This matches the gate header's own recorded finding (objectui#5666) that comment text insrcreaches a published.d.ts.Verification
pnpm --filter @object-ui/types testpnpm --filter @object-ui/types run type-checkpnpm --filter @object-ui/types buildcheck:changeset-presencecheck:spec-symbolscheck:control-bytescheck:comment-mask-corpuscheck:new-line-citationsAGENTS.mdmatches)Every rc was captured to a file before any pipe, and each line quotes the gate's own verdict rather than a bare exit code.
Lint, as a proven narrowing (the repo-wide baseline is red on
main, so a repo-wide run is not the measurement):packages/types.--format json: package total 0 errors, 278 warnings (pre-existing); my file: 0 errors, 0 warnings.eslint.config.jssetslanguageOptionstoecmaVersion+globalsonly — noparserOptions.project, noprojectService, no type-checked preset (each queried and 0, against a file that exists; control termrulesreturns 12). Type-aware linting is off, so a comment-only edit in one file cannot move any untouched file's verdict.Scope
stripImportedDefaults(...)crossing is exactly as it was.Clause-②: noholds: the diff is comments only, mechanically checked — 14 added and 7 removed lines, 0 of them non-comment (control: the classifier returnsfalseforexport const X = 1;). No accept set moves;needs:contract-reviewis correctly absent on both carriers.Note for the reviewer
One behavior change rides along: prefix.type defaults to 'text' on parsealso appears in threeCHANGELOG.mdfiles (packages/core,packages/react,packages/types). Those are left alone deliberately: they are historical release records that were true when written, andcheck-changeset-presence.mjs's header records a maintainer ruling (2026-08-24) that those compiled copies are never hand-edited.Generated by Claude Code
Generated by Claude Code