Repository navigation
docs(types,fields): rows / options[].description docblocks stop asserting a refusal the spec no longer performs - #9588
Merged
Conversation
…rms for `rows` / `options[].description` Five shipped doc comments told readers that `@objectstack/spec` REFUSES two keys BY NAME. It declares both. The sentences were measured correctly against 17.2.0 and outlived the contract they described: 17.3.0 implemented the maintainer's 2026-08-25 Option-A ruling on objectui#6140 / objectui#6153, and this repo's pin has moved past it (measured: every lockfile resolution is 17.4.0). Docblocks under `packages/types/src` ship in `dist/*.d.ts`, so the false prose was reaching consumers' editor tooltips. Each site re-measured against the installed artifact, not the changelog: - `rows` is ACCEPTED on textarea/markdown/html/richtext as an integer >= 1, and is TYPE-GATED — on other field types the refusal arrives as a cross-field refinement naming the key, deliberately NOT `unrecognized_keys`. - `options[].description` is ACCEPTED as a string, and a field whose `options` carry it parses whole, so it may now be authored. - `select-option.ts` no longer enumerates the spec's option keys at all: the enumeration is what went stale, and the keys arrive through the `Omit` by reference. Two sites are now written as single-line claims about the installed pin, which moves them out of `check-installed-spec-pin-claims.mjs`'s ledger of known-stale debt and into the population that gate re-derives at every bump; their ledger entries are deleted here, as that gate's both-direction ratchet requires. Also corrects the UNRELEASED objectui#7014 changeset, which publishes verbatim into the CHANGELOG at the next release and would have shipped the same false guidance -- alongside this change's own entry contradicting it. Its dated 17.2.0 measurements are kept as the record; its present-tense claims are not. No runtime behaviour, type surface or export changes. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01XeoGH6X7MtfbjcRDscyXi1
Contributor
✅ 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
|
os-justin
marked this pull request as ready for review
September 16, 2026 04:07
This was referenced Sep 16, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Fixes #7635
Five shipped doc comments assert that
@objectstack/specREFUSESrowsandoptions[].descriptionBY NAME. It declares both. This corrects the prose; it changes no runtime behaviour, type surface or export.The premise the card was parked on is dead — re-derived, not inherited
The card calls itself 「bump-blocked」 and says 「The repo is still on 17.2.0 — so nothing is broken today」. Measured on
origin/main'spnpm-lock.yaml: there is exactly one@objectstack/specpackage entry and it is 17.4.0; every one of the 29 declared ranges resolves to it. The installed artifact agrees (node_modules/@objectstack/spec/package.json= 17.4.0). The bump landed and went past the version the card names, so the false comments are false onmain, now.24x17.0.0, 2x17.1.0, 1x17.2.0, 1x17.3.0, 7x17.4.0is the specifier-range histogram (whatpackage.jsonfiles ask for), not resolved versions. No@objectstack/specresolves below 17.4.0. The conclusion is unchanged and strictly stronger.What the contract actually holds (measured against installed 17.4.0, not the changelog)
SelectOptionSchemakeyscolor, default, description, label, value, visibleWhen— six, includingdescriptiondescriptioninvalid_typeoptionscarry itrowson textarea/markdown/html/richtext>= 1(0answerstoo_small,1.5answersinvalid_type: expected int)rowsontext/numberunrecognized_keysicon/disabledon an optiontoolbar/preview/minHeight/maxHeightThe type-gating nuance is load-bearing and the old prose could not express it: "declared" does not mean "declared everywhere", and the refusal for the wrong field type arrives through a different channel than the one the old comments named.
The census — the card's "three comments" is not right
Re-derived from PRs #7510 / #7520 rather than trusted:
packages/types/src/field-types.ts(MarkdownFieldMetadata.rows,HtmlFieldMetadata.rows,SelectOptionMetadata.description) plus theLookupField.optionDescription.test.tsxheader. All four are false today.titleto the spec #7520 rewrote one comment, inpackages/app-shell/src/views/DashboardView.tsx— abouttitle, not about either of this card's keys. ⛔ I did not touch it, for two measured reasons:DashboardSchemastill refuses roottitleby name at 17.4.0 (so the claim is true), and docs(app-shell): DashboardView's header comment stops attributingtitleto the spec #7520's text no longer exists anyway — objectui#7509 replaced it wholesale when it retired the legacytitleread.⇒ the real count is four false sites from those two PRs, not three, and the third PR-#7520 site is not one of them. Two further sites in the same family were falsified by the repair itself and are fixed here: the
SelectOptionMetadatainterface docblock (which listeddescriptionamong the by-name refusals) and theRichtextFieldMetadatacross-reference registered on the card by comment5576403316. Pluspackages/types/src/select-option.ts, named by the pin's own header.⭐ A gate DOES read these sites — the card's framing is out of date
The card says 「Nothing goes red」 and blames
check:spec-symbols. That specific claim is correct — I ran it, it is green, and its member rule passes precisely because these citations now name keys the symbol does declare.But
check:installed-pin-claims(scripts/check-installed-spec-pin-claims.mjs, objectui#8924) landed after this card was filed and it reads two of these very sites — it had them ledgered as known-stale debt, with reasons written in anticipation of this repair ("re-parse the schema before moving the number"). Repairing the prose made it go red, by design:Both entries are deleted here, as that gate's both-direction ratchet requires. Taking Zone 3's "if a comment can be replaced by something a gate CAN read, that is better than better prose" literally, the two repaired claims are written as single-line claims about the installed pin, which is the shape the gate recognises. They therefore moved out of the ledger and into the checked population —
23 -> 25 at the pin,52 -> 50 ledger entries,stale 45 -> 43. They now go red at the next bump instead of quietly lying. The other three sit on facts no instrument reads, and say so rather than reading as live (AGENTS.md #9).⭐ An unreleased changeset would have shipped the same falsehood
check:changeset-claimsflagged that.changeset/7014-select-option-spec-claim-correction.md— PR #7510's own changeset, still pending — names a file this change edits. Reading the paragraph as that gate asks: its dated 17.2.0 measurements are fine, but its present-tense guidance is now false and harmful — it tells authors that writingdescriptionon an option "makesPUT /api/v1/meta/object/:namefail the whole field with a 422", and that the comments "now say these are objectui-side read-model extensions that must never reach authored object metadata".That body publishes verbatim into the CHANGELOG at the next release — the same release as this change's own entry, which says the opposite. Corrected in place, frontmatter untouched, per the precedent that gate names;
check:changeset-overwriterecords the deliberate modification (report-only, its case 2). This is the only site where the defect would have escaped the repo.Gates
Hand-derived from this repo's
package.jsonand.github/workflows/—dispatch-gates.mjsrefuses for objectui paths by design (it reads the objectstack tree), as the dispatch predicted. Exit codes captured to a file before reading, never through a pipe.check:installed-pin-claims80 recognised claim site(s) - 25 at the pin, 50 ledger entr(ies)check:spec-symbolsnothing cites a key its spec symbol does not declarecheck:changeset-presence4 source file(s) of 2 released package(s) ... declares 1 changeset(s)check:changeset-claimscheck:changeset-overwritecheck:control-bytesscanned 7739 tracked text file(s)check:new-line-citations0 new citation(s)check:comment-mask-corpusTest Files 193 passed (193) / Tests 4561 passed (4561)type-check(types,fields)DoneTests cover
packages/types/, theLookupFieldsite, andscripts/__tests__/check-installed-spec-pin-claims.test.ts— owed separately because this diff edits that gate script. Run from the repo root (pnpm exec vitest run <paths>); thepnpm --filter PKG exec vitestform is refused by the #3378 guard and is a false green. Heavy runs went through the shared verify lock.type-checkfirst failed withTS2307on an unbuilt dependency closure — built@object-ui/fields^.../@object-ui/types^..., then both passed.Verified the repair reaches the published surface: after
pnpm --filter @object-ui/types run build,dist/field-types.d.tscarries the corrected sentence and nodist/*.d.tsstill saysREFUSES \rows` BY NAME. The two survivingNOT a spec keystrings indist/select-option.d.tsare theicon/disabled` docblocks, which I measured as genuinely still refused.Acceptance notes
packages/types/src/data-display.ts— out of surface (batch sibling objectui#9256). Not reached; no comment repair led there..changeset/was in surface because published bytes move: docblocks underpackages/types/srcship indist/*.d.ts.os-dev-reportcomment on When the @objectstack/spec pin moves to 17.3: PR #7510 / #7520's comment "repairs" become FALSE —rowsandoptions[].descriptionare now declared keys #7635.🤖 Generated with Claude Code
https://claude.ai/code/session_01XeoGH6X7MtfbjcRDscyXi1
Generated by Claude Code