Uh oh!
There was an error while loading. Please reload this page.
docs(data-objectstack,plugin-form,plugin-view): clear three package READMEs off the doc-snippet ledger (#5174 batch 8) - #7326
Merged
Conversation
…EADMEs off the doc-snippet ledger
Take the next three package READMEs by ts/tsx fence density off
`UNGATED_DOCS` in scripts/check-doc-snippet-types.mjs (removals only) and
resolve every block on them the two honest ways: compile against the built
`dist` types, or carry a `FRAGMENT_MARKER` whose reason names the measured
diagnostics.
57 blocks come under the gate: 52 compile, 5 are declared fragments.
Ledger 40 -> 37; covered documents 184 -> 187; covered blocks 440 -> 497.
Real documentation defects fixed rather than declared:
- data-objectstack's escape hatch called `client.meta.getObject('task')`,
which the shipped `@objectstack/client` does not have; the metadata read
is `client.meta.getItem('object', 'task')`.
- its error-handling example read `code`/`message`/`statusCode`/`details`
off an un-narrowed `unknown`, and `error.details.objectName` off an
optional member; both now narrow through the exported `ObjectStackError`.
- its user-state example imported `useAttachUserStateAdapters` and then
called a bare `attach` it never obtained from the hook.
- plugin-view's schema examples annotated `ObjectViewSchema` without
importing it, and its ViewSwitcher / FilterUI / SortUI examples were bare
object literals though `@object-ui/types` exports a named type for each.
- plugin-form's `isRequiredInForm` / `omitServerResolvedDefaults` example
named four host variables it never declared.
The gate's strictness is unmoved: everything from the fence-scanning banner
to EOF is byte-identical to the base (764 lines, sha256 b87e347626a6cbab).
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BGMDbrVa8JjZcCQ7DWYH1b…README uses the adapter API The adapter-only members four sections of this README are built around are not on `DataSource`, which is what `createObjectStackAdapter` declares it returns. The examples hold the adapter as the exported `ObjectStackAdapter` class; this note says why, and points at the card tracking the producer-side half so the page stops being silently inconsistent with its own setup step. Filed as objectui#7323 (not addressed here — `packages/*/src` is out of this PR's surface). Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01BGMDbrVa8JjZcCQ7DWYH1b
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
|
yinlianghui
marked this pull request as ready for review
September 2, 2026 07:14
Uh oh!
There was an error while loading. Please reload this page.
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 freeto 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.
Part of #5174
Batch 8 of the
UNGATED_DOCSburn-down, and the first one that takes package READMEs rather thancontent/docspages. Takes the next three README entries by fence density and delivers all three whole: 57 blocks, 52 compile against the builtdist, 5 carry aFRAGMENT_MARKERwith a written, measured reason. 104 diagnostics cleared. Nothing about the gate's strictness moved.Batch 6 (#7314) landed while this was in flight;
origin/mainwas merged (never rebased) and the two ledger hunks are disjoint removals, as predicted. Batch 7 is still open on.mdxentries and is disjoint by construction — this batch touches no.mdxpage at all.Angle-bracketed generics are spelled in words throughout: the GitHub body sanitizer eats tag-shaped fragments, including inside backticks.
Selection
All counts produced with the gate's own
scanFences, never a hand grep. The top of the 31-entry README population by ts/tsx block count:packages/data-objectstack/README.mdpackages/plugin-view/README.mdpackages/plugin-gantt/README.mdPARTIAL_EXCERPTSentries on it and #7302 owns its contentpackages/plugin-form/README.mdpackages/plugin-report/README.mdpackages/plugin-kanban/README.md(5 blocks) is excluded on the same grounds. No other open PR on this lane (#7291, #7304, #7306, #7314, #7315) touches anypackages/*/README.md— checked by fetching each PR head over git and diffing it against its own merge-base, so the check cost no API quota.⛔ The gate's non-recursive package-README walk (#7308) was left alone: only
packages/NAME/README.mdentries the gate already collects were taken.Pages taken, and how each block reached zero
packages/data-objectstack/README.mdclient.meta.getObject('task')does not exist. The escape-hatch example's metadata read is not a member of themetasurface@objectstack/clientships; the read isclient.meta.getItem('object', 'task')(packages/data-objectstack/node_modules/@objectstack/client/dist/index.d.ts:697). The error-handling example readcode/message/statusCode/detailsoff an un-narrowedunknown, anderror.details.objectNameoff an optional member — both now narrow through the exportedObjectStackErrorand usedetails?.objectName. The user-state example importeduseAttachUserStateAdaptersand then called a bareattachit never obtained from the hook. Thirteen further blocks were unrunnable as written (Cannot find name 'dataSource'/'mySchema'/'records'/'largeDataset'/'createObjectStackAdapter') and were made self-contained.packages/plugin-view/README.mdObjectViewSchemawithout importing it — a reader copying any one of them was broken on line 1 (TS2304), and every downstreamTS7006ononNavigate's parameters was a consequence of the annotation being an error type rather than a real gap. Three bare object literals (view-switcher,filter-ui,sort-ui) became annotated declarations againstViewSwitcherSchema/FilterUISchema/SortUISchema, which@object-ui/typesexports and the page never named; that puts 26 previously unchecked keys under a declared type.packages/plugin-form/README.mdisRequiredInForm/omitServerResolvedDefaultsexample named four host variables it never declared, and theonSubmitclosure example built an adapter without importingcreateObjectStackAdapter. The four declared fragments are prose notation, not defects: two single object-literal properties quoted out of a field map, and two key lists whose trailing entries carry a?to mark the key optional — which no object literal can spell.Ledger 37 → 34 (6
.mdx+ 28 README). Covered documents 187 → 190 — strictly grows. Covered blocks 481 → 538; compiled 345 → 397; declared fragments 136 → 141. The per-page splits (20+21+11 = 52 compile, 1+0+4 = 5 declared) reconcile exactly with those deltas.Invariants, each measured rather than asserted
Measured by importing
origin/main's copy of the gate alongside this branch's and evaluating both over the same working tree, so the covered-set delta is attributable to the ledger alone:git diff --numstat origin/main...HEAD -- scripts/check-doc-snippet-types.mjsis0 6: zero additions, six deletions.ADDED ledger entries: []·REMOVED ledger entries: [data-objectstack, plugin-form, plugin-view READMEs]and nothing else ·surviving entries whose REASON TEXT changed: []across all 34.covered documents: 187 -> 190·previously-covered docs now UNGATED: [].origin/mainvs this branch: 764 lines,sha256 b87e347626a6cbab30b904eaf7d3eb72f6804122505bdf9ec8f2f2c8136e95a3— the same value on both sides, and the same value batches 5 and 6 recorded.DOC_EXTENSIONS,TS_FENCE_LANGUAGESandMIN_REASON_LENGTHeach hash identical too. ⛔ The ledger docblock's own prose was not touched — batch 7 owns the header count fix.--build-filterre-measured on the merged head with and without the three removals: 25 filters both ways, packages ADDED[], REMOVED[]. Covering these three READMEs pulls nothing new into the gate's build closure.Before / after, both at a fully built tree, exit codes captured by redirect before any pipe:
At the branch point (
d717e8bc3, before #7314 landed) the same measurement read 184 covered / 40 ungated / 440 blocks — i.e. the dispatch's stated 187/37/481 was batch 6's after-census and only became reproducible here once #7314 merged. Reported rather than assumed.The lid check, per README — including the negative results
plugin-view— NEGATIVE. ResolvingObjectViewSchemain twelve blocks removed bothTS7006s with it and exposed nothing underneath; the re-run was clean.data-objectstack— POSITIVE, twice. Narrowing the catch clause exposederror.details.objectNameon an optional member, and typingdataSourceexposedclient.meta.getObject. Both fixed on the page. A third positive was producer-side and is filed, not cast around (below).plugin-form— NEGATIVE, and measured rather than assumed. The two declaredfieldTabs/fieldPanesfragments were re-run through the gate's own compiler as parseable statements: clean, and all six keys (fieldTabs,fieldPanes,defaultFieldTab,fieldTabsPosition,fieldPanesOrientation,fieldPanesResizable) are declared members ofFormSchemainpackages/types/dist/form.d.ts, so the green is a real check and not index-signature blindness. Nothing hides behind those markers.The read-site check — what the compiler structurally cannot see
BaseSchemacarries[key: string]: any, so a wrong TOP-LEVEL key on any schema literal is invisible to this gate. Every top-level key on every annotated literal added here was therefore checked against the shipped declaration by name: all 32 are declared members ofObjectViewSchema/ViewSwitcherSchema/FilterUISchema/SortUISchema, so nothing on these pages is riding the index signature.WizardFormSchemaon the plugin-form page is a sealed interface with noBaseSchemabase at all, so that block is checked including excess properties.What the green does not mean
Each limit below was measured on a taken README by planting a probe, running the real gate, and restoring from
HEADunder anEXIT INT TERMtrap. Mutations proved on disk by blob hash before each run; restores proved by an emptygit diff HEADand the blob hash back at itsHEADvalue — never by the trap's own exit.thisKeyDoesNotExistAnywhere: 123besideobjectNameon the annotatedObjectViewSchemaliteral atplugin-view/README.md:232. Predicted exit 0, no diagnostic. Observed exit 0,Semantic phase: 364 of 364 block(s) judged, 0 failed—BaseSchema's index signature absorbs it.table: { … }. Predicted exit 1 withTS2353. Observed exit 1:packages/plugin-view/README.md:239:5 TS2353: Object literal may only specify known properties, and 'thisKeyDoesNotExistAnywhere' does not exist in type 'Partial of Pick of ObjectGridSchema over ObjectGridSlotKey'(generic spelled in words here; the gate prints it in brackets).Semantic phase: 364 of 364 block(s) judged, 1 failed. The annotations are live, not no-ops:Pickdrops the index signature, so everytableblock on that page is now strictly checked for the first time.typeliteral names a registered component, whether a schema key survivessafeParse, and whether the shell examples run are three other questions with three other answers.Type gaps found and filed, not fixed here
packages/*/srcis out of this PR's surface. Both filed unassigned after a targeted dedupe search — with a known-hitting control query run in the same session first, so an empty result is a reading and not a broken search.createObjectStackAdapterdeclaresDataSourceas its return, so the whole adapter API its own README documents is unreachable in TypeScript #7323 —createObjectStackAdapterdeclaresDataSourceas its return type, sogetClient, the cache methods and the connection-state / batch-progress subscriptions — the members four whole sections of that README are built around, and which its own API Reference lists — are not on the type the factory hands back. Measured: fourTS2339s against the builtdist.Deviation from the standing disposition, flagged deliberately: the affected blocks ship compiling, holding the adapter as the exported
ObjectStackAdapterclass, rather than shipping as declared fragments. The class is exported and its constructor is documented in that README, so the annotation is a truthful statement about the object and about the one cast-free way to obtain that type today; and because no block now asserts the factory's return, nothing on the page is papered over. To keep the page from being silently inconsistent with its own setup step, a short note under Basic Setup states the narrowing and names finding(data-objectstack):createObjectStackAdapterdeclaresDataSourceas its return, so the whole adapter API its own README documents is unreachable in TypeScript #7323; the note comes out when the card is settled. If the reviewer prefers the literal disposition, converting those thirteen blocks toFRAGMENT_MARKERis a mechanical follow-up.ObjectSchemaLikeis the parameter type of three exported functions but is not itself exported, so a consumer cannot name what it must pass #7324 —ObjectSchemaLikeis the second parameter type of three functions@object-ui/plugin-formexports (omitServerResolvedDefaults,schemaDefaultValues,seedCreateValues) and is not itself exported, so a consumer cannot name what it must pass.SeedContext, on the same signatures, is exported. The README block documenting theomitServerResolvedDefaultsis unreachable outside@object-ui/plugin-form, so a second renderer has to compose its two predicates by hand #6059 pair declares its input as a hand-written structural literal for exactly this reason — that literal is the duplication the card is about.Gate verdict lines
Everything below at
777e0dbac, the final commit, working tree clean at union time. The closure was built first under the shared verify lock (VERDICT command-exit 0) anddist/index.d.tspresence was confirmed on disk in this worktree for all 25 packages before any gate result was trusted — turbo replayed cached logs namingobjectui-issue-5174-b6's paths, so the log alone proves nothing.The changeset verdict was followed, not overridden: none added. No
skip-changesetlabel — in this repo that label is a historical mis-mount that no workflow reads, and a pin test forbids applying it.The eight vitest files are every file
git grep -l check-doc-snippet-types -- '*.test.ts' '*.test.tsx'names, plusscripts/__tests__/check-readme-exports.test.ts, which #7306 landed onmainmid-run and which reads the very READMEs this diff edits. Run from the repo root with--maxWorkers=2, never throughpnpm --filter.check:readme-exportsfirst read NOT MEASURED, not red: it exited 1 with 45 findings, every one the stringits type entry ./dist/index.d.ts is not on disk -- run pnpm build firstforplugin-ai/plugin-gantt, and none naming a file in this diff. Building those three packages made it a real measurement, and it is genuinely green.Lint: run whole, not narrowed
.md; the three edited packages' own lint tasks judge 59 / 112 / 47 files, of which 0 are.md. All three edited READMEs are outside ESLint's population by its own configuration.--format json: the one changed file inside a population,scripts/check-doc-snippet-types.mjs, reportserrorCount 0,warningCount 0.eslint.config.jssets noproject,projectServiceortsconfigRootDir, so type-aware linting is not enabled and nothing in this diff can move the verdict on a file it does not touch.A control-byte self-scan (
grep -naP '[\x00-\x08\x0b\x0c\x0e-\x1f\x7f]') over the four changed files returns no hits, beside the repo-wide gate above.🤖 Generated with Claude Code
https://claude.ai/code/session_01BGMDbrVa8JjZcCQ7DWYH1b
Generated by Claude Code