Skip to content

docs(packages): make the three nested package READMEs compile, and retire their UNGATED_DOCS rows - #9521

Merged
os-try-charles merged 1 commit into
mainfrom
claude/issue-9412-ungated-docs-paydown
Sep 14, 2026
Merged

os-try-charles merged 1 commit into
mainfrom
claude/issue-9412-ungated-docs-paydown

Conversation

@claude

@claude claude Bot commented Sep 14, 2026

Copy link
Copy Markdown
Contributor

Fixes #9412

Pays down all three UNGATED_DOCS rows objectui#7308 opened for the nested
packages/** READMEs. No row was deleted to clear the ledger and nothing about
the gate's strictness moved: two pages leave by compiling, one block leaves by a
FRAGMENT_MARKER carrying a written reason, and the four objectui#7856 card-2
records beneath them are byte-for-byte untouched.

The census, re-derived first

Re-derived on this branch's base 8196b10631 with the gate's own analyzer, the
three rows temporarily lifted — analyze() for the population, compileSnippets()
for the phases — over the closure the gate's own --build-filter names (35/35
turbo tasks successful). Every figure the rows recorded on 9ba7e9c3 still held,
per page and per diagnostic code:

page blocks failing diagnostics (re-derived)
packages/components/src/__tests__/README.md 1 1 9 semantic (TS2593 x3, TS2304 x5, TS2552 x1)
packages/core/src/adapters/README.md 5 3 9 semantic (TS2304 x2, TS2355 x6, TS2420 x1)
packages/types/src/zod/README.md 14 9 10 syntax (TS1109) + 9 semantic (TS2304 x8, TS2307 x1)

20 blocks, 13 failing, 37 diagnostics. In that same run the sentinel produced
TS2305, the positive control 0, and both bound controls TS2307, so those are
readings from a program demonstrably able to report non-zero.

The defect, not the hygiene

packages/core/src/adapters/README.md fence 239 — the custom-adapter template —
declared implements DataSource with the generic parameter while omitting
getObjectSchema, which that interface REQUIRES (TS2420), and wrote
// Your implementation as the whole body of six methods annotated
non-void (TS2355 x6). A reader who copied it got a class that does not satisfy
the interface it claims.

Read off the built packages/types/dist/data.d.ts, that interface has exactly
six required members — find, findOne, create, update, delete,
getObjectSchema — and every other member is optional. The template now carries
all six, and each unimplemented body throws rather than falling off the end, so
the reader's class type-checks at every step of being filled in. Two signatures
were also brought back onto the declared ones: findOne gained its third
parameter and bulk's operation argument is now the declared union rather than
string. The page's other two failing blocks were excerpts naming a value the
prose introduces; each now declares it.

The page that is worth its size — and one correction to why

packages/types/src/zod/README.md, four separable repairs:

  1. fences 301 and 368 wrote the elision braces-dot-dot-dot literally, which
    TypeScript reads as a spread with no operand; both are real initialisers now;
  2. fence 368 was a single fence holding a BEFORE program and an AFTER program,
    so ButtonSchema and button were each declared twice in one module. Split
    into the two blocks it was really holding, each of which compiles;
  3. six excerpts continued an earlier block's imports. Each is self-contained
    now, against the built dist/*.d.ts, with a declare const stand-in only
    where the value is genuinely the reader's own (userInput, internalConfig,
    registry);
  4. fence 220 is a shape sketch — a bare object literal at statement position with
    optionality markers written on keys — and is re-fenced as an unhighlighted
    block, which takes it out of the ts/tsx population this gate collects. That
    page sits below a package root, so it is outside check:doc-fences' walk by
    the coupling pin's own subtraction; that gate is green either way.

@hookform/resolvers/zod was left alone as a bug and handled as the bound it is:
the block imports only what @object-ui/types declares, and stands the two
react-hook-form bindings in with declare, the way packages/layout/README.md
already does for its router peers.

⚠️ One premise in the card is false and is corrected in the ledger header
rather than carried forward.
The retired row said packages/types "lists the
whole of src/ in its manifest files", so this page ships inside the npm
tarball. It does not. That manifest's files is dist, README.md,
CHANGELOG.md, LICENSE, and npm pack --dry-run --json run in that package
reports 134 tarball entries, zero of them under src/, with exactly one README —
the package-root one. Same answer for @object-ui/components (216 entries) and
@object-ui/core (208). Control in the same command: the identical filter over
dist/ returns 130, 212 and 204 entries respectively, so the filter does return
non-zero when there is something to find. The page was still worth clearing, on
the reason every other row gives — it is a page a reader copies from — but a
later card should not plan around it shipping.

The one declared fragment, and why it is not the cheap way out

packages/components/src/__tests__/README.md holds one block: the suite's
"Adding New Tests" pattern. Both routes to compiling it were MEASURED red in this
program before the marker was written:

  • vitest — the row's own first suggested remedy — produces a [bound] failure
    by construction, because vitest IS this gate's ROOT-DECLARED control
    specifier: the only thing that declares it is this repository's own root
    manifest, which is not a claim about anything a reader installs;
  • ./test-utils produces TS2307, because every block is compiled at the
    repository root while that helper is suite-local and unshipped
    (@object-ui/components lists dist in files, and dist/ holds no
    test-utils).

The row anticipated exactly this and named the marker as its alternative. The
block now imports both specifiers anyway, because they are the ones a file in
that directory really writes and the page previously taught neither — a
declare const stand-in here would have taught a spelling nobody should copy.
The marker costs no coverage: the block imports no documented package surface at
all, so there is nothing underneath it that compiling would have checked.

Verification

pnpm check:doc-snippets — exit 0 at 3c5e89cfaf:

  sentinel     importing 'ThisNameIsDefinitelyNotExported' produced 1 diagnostic(s) (TS2305)
  positive     importing 'BaseSchema' produced 0 diagnostic(s)
  undeclared   importing '@floating-ui/react-dom' ... produced 1 diagnostic(s) (TS2307)
  root-declared importing 'vitest' ... produced 1 diagnostic(s) (TS2307)

Scanned 249 document(s): 245 covered (129 of them hold a ts/tsx block), 4 ungated
Covered blocks: 827 - 670 to compile, 157 declared fragment(s).
Syntax phase:   every block parsed, so every one of them reached the semantic phase.
Root bound:     no block imports a specifier that resolves only through this repository's ROOT manifest.
Semantic phase: 670 of 670 block(s) judged, 0 failed.

Ablation, run from the committed tree at 3c5e89cfaf, both legs. Deleting
getObjectSchema from the repaired template: the edit was proven on disk first
(the anchor's grep -c went 1 to 0 and the blob hash moved off the HEAD blob),
then the gate returned exit 1 with exactly
TS2420 ... Property 'getObjectSchema' is missing, at
packages/core/src/adapters/README.md:256:14. Restore leg: git checkout HEAD --
on that path put the blob hash back to the HEAD blob byte-for-byte, git diff HEAD
is empty, and the gate returned to exit 0 with 670 of 670 judged and 0 failed. So
this page's green is a measurement, not an absence.

Other gates, all exit 0: check:doc-types, check:doc-fences,
check:readme-exports, check:doc-examples, check:doc-example-ids,
scripts/check-doc-links.mjs, check-changeset-presence,
check-changeset-no-major, check:changeset-claims,
check-governed-queue-guard --test over all five changed paths (not governed).

Tests: scripts/ (158 files, 4646 tests), packages/core + packages/types
(342 files, 7567 tests), packages/components + packages/data-objectstack
(341 files, 3568 tests) — all passing. type-check:scripts exits 0, and
tsc --listFiles confirms the edited test file is inside that program.

Targeted lint rather than the repository-wide scan, declared: the two lintable
files this diff touches were linted with eslint --no-inline-config --format json,
2 files, 0 errors, 0 warnings. The narrowing is safe to read because
eslint.config.js configures no type-aware linting at all — it names no
parserOptions.project and no projectService — so nothing in this diff can move
the verdict on a file it did not touch. The repository-wide run stays CI's.

Two pins in scripts/__tests__/check-doc-snippet-types.test.ts asserted the
three rows EXIST, so they INVERTED with the debt rather than relaxing: one now
asserts no nested README is ledgered and that all of them are covered, keeping
verbatim the half that was never about the debt; the other keeps the row-shape
requirement live for any future nested row and is made non-vacuous by exercising
the shape checker against a conforming row and a deficient one, since the
population it used to loop over is now empty.

A changeset is present with EMPTY frontmatter — declared as releasing nothing,
which the tarball evidence above supports.


Generated by Claude Code

…tire their UNGATED_DOCS rows

objectui#7308 brought the nested `packages/**` READMEs into `check:doc-snippets`'
scan surface ledger-first, writing three `UNGATED_DOCS` rows rather than leaving
the pages outside the walk. This pays that debt down. The census was re-derived
on this branch's base with the gate's own analyzer before any edit, the rows
temporarily lifted, and every figure the rows recorded still held: 20 blocks, 13
failing (3 syntax-phase, 10 semantic), 37 diagnostics, split across the three
pages exactly as written.

The one reader-visible defect is on `packages/core/src/adapters/README.md`. Its
custom-adapter template declared `implements DataSource<T>` while omitting
`getObjectSchema`, which the interface requires (TS2420), and wrote
`// Your implementation` as the whole body of six methods annotated non-`void`
(TS2355 x6). A reader who copied it got a class that does not satisfy the
interface it claims. The template now implements all six REQUIRED members and
throws from each unimplemented body, so the reader's class type-checks at every
step of being filled in. The page's two other blocks were excerpts naming a
value the prose introduces; each now declares it.

`packages/types/src/zod/README.md` had two `{ ... }` elisions TypeScript reads as
a spread with no operand, six excerpts continuing an earlier block's imports, one
fence holding a before-and-after pair that declared the same two names twice, and
a shape sketch fenced as TypeScript. All four classes are repaired in place; the
sketch is re-fenced as an unhighlighted block, which takes it out of the ts/tsx
population.

`packages/components/src/__tests__/README.md` is the single declared fragment.
Both of its specifiers were measured refused in this program before the marker
was written: `vitest` is this gate's own ROOT-DECLARED control specifier, so the
row's first suggested remedy produces a bound failure by construction, and
`./test-utils` is TS2307 because every block compiles at the repository root
while that helper is suite-local and unshipped. The block now carries the imports
a file in that directory really writes, which is what the page owed its reader.

Nothing about the gate's strictness moved, and no row was deleted to clear the
ledger. The four objectui#7856 card-2 records below them are untouched.

Verification: `pnpm check:doc-snippets` exits 0 over 249 documents, 670 of 670
compiled blocks judged, 0 failed, with the sentinel at TS2305, the positive
control at 0, and both bound controls at TS2307 in the same run.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013VGeMu3p6qEFWR6K6GGLaW
@github-actions

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

Metric Value Budget
Eager closure (gzip, 329 chunks) 3062.1 KB 3104.5 KB
Main entry chunk (gzip) 145.7 KB 350 KB
Entry file index-CbxOH983.js
Status PASS

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

Package Size Gzipped
app-shell (consoleActionDispatch.js) 0.20KB 0.19KB
app-shell (index.js) 16.69KB 6.21KB
app-shell (runtime-config.js) 20.68KB 7.36KB
app-shell (types.js) 0.01KB 0.04KB
app-shell (urlParams.js) 10.06KB 3.86KB
auth (ActiveOrganizationStorage.js) 25.05KB 9.16KB
auth (AuthContext.js) 0.31KB 0.24KB
auth (AuthGuard.js) 2.07KB 1.00KB
auth (AuthProvider.js) 40.18KB 10.59KB
auth (AuthShell.js) 3.49KB 1.40KB
auth (ForgotPasswordForm.js) 12.21KB 3.45KB
auth (LoginForm.js) 18.15KB 5.39KB
auth (PreviewBanner.js) 0.90KB 0.50KB
auth (RegisterForm.js) 6.65KB 2.22KB
auth (SocialSignInButtons.js) 9.61KB 3.89KB
auth (UserMenu.js) 3.41KB 1.23KB
auth (auth-gate-events.js) 1.29KB 0.66KB
auth (authStyles.js) 5.04KB 1.72KB
auth (createAuthClient.js) 40.21KB 10.80KB
auth (createAuthenticatedFetch.js) 8.46KB 3.43KB
auth (index.js) 3.19KB 1.44KB
auth (invitation-status.js) 1.22KB 0.70KB
auth (org-roles.js) 6.66KB 2.78KB
auth (phone-identifier.js) 1.11KB 0.66KB
auth (types.js) 0.59KB 0.35KB
auth (useAuth.js) 5.30KB 1.02KB
auth (useWorkspaceAdminStatus.js) 11.08KB 4.58KB
collaboration (CommentThread.js) 26.08KB 7.56KB
collaboration (LiveCursors.js) 3.17KB 1.27KB
collaboration (PresenceAvatars.js) 6.49KB 2.64KB
collaboration (PresenceProvider.js) 2.79KB 1.13KB
collaboration (index.js) 1.68KB 0.73KB
collaboration (useCollaborationTranslation.js) 6.05KB 2.52KB
collaboration (useCommentSearch.js) 1.98KB 0.88KB
collaboration (useConflictResolution.js) 7.75KB 1.86KB
collaboration (useMentionNotifications.js) 1.81KB 0.68KB
collaboration (usePresence.js) 6.33KB 1.84KB
collaboration (useRealtimeSubscription.js) 7.91KB 2.01KB
components (index.js) 544.93KB 130.50KB
core (index.js) 8.52KB 3.41KB
create-plugin (index.js) 27.94KB 9.51KB
data-objectstack (index.js) 213.54KB 59.33KB
fields (index.js) 249.20KB 62.88KB
i18n (LocalizationContext.js) 1.76KB 0.96KB
i18n (builtinAggregateLabels.js) 0.86KB 0.49KB
i18n (currency.js) 1.22KB 0.64KB
i18n (fallbackInterpolation.js) 6.25KB 2.77KB
i18n (i18n.js) 8.87KB 3.64KB
i18n (index.js) 5.22KB 2.26KB
i18n (pickLocalized.js) 9.86KB 3.95KB
i18n (provider.js) 32.15KB 10.49KB
i18n (useDisplayLocale.js) 2.85KB 1.45KB
i18n (useObjectLabel.js) 34.34KB 9.17KB
i18n (useSafeTranslation.js) 5.60KB 2.33KB
layout (index.js) 38.83KB 10.95KB
mobile (MobileProvider.js) 0.92KB 0.49KB
mobile (ResponsiveContainer.js) 0.94KB 0.38KB
mobile (breakpoints.js) 1.51KB 0.70KB
mobile (createOfflineDataSource.js) 5.61KB 1.75KB
mobile (index.js) 1.99KB 0.87KB
mobile (offlineQueue.js) 3.91KB 1.35KB
mobile (pwa.js) 0.97KB 0.49KB
mobile (serviceWorker.js) 1.48KB 0.62KB
mobile (serviceWorkerSource.js) 3.41KB 1.48KB
mobile (useBreakpoint.js) 1.54KB 0.65KB
mobile (useGesture.js) 6.96KB 1.98KB
mobile (useOfflineSync.js) 1.99KB 0.72KB
mobile (usePullToRefresh.js) 2.53KB 0.85KB
mobile (useResponsive.js) 0.72KB 0.42KB
mobile (useSpecGesture.js) 4.39KB 1.66KB
mobile (useTouchTarget.js) 1.01KB 0.54KB
permissions (MePermissionsProvider.js) 13.52KB 4.88KB
permissions (PermissionContext.js) 0.31KB 0.25KB
permissions (PermissionGuard.js) 0.89KB 0.45KB
permissions (PermissionProvider.js) 6.24KB 2.16KB
permissions (discardProofCache.js) 1.04KB 0.55KB
permissions (evaluator.js) 8.39KB 3.10KB
permissions (index.js) 0.93KB 0.41KB
permissions (store.js) 0.91KB 0.42KB
permissions (useFieldPermissions.js) 1.28KB 0.53KB
permissions (usePermissions.js) 4.83KB 2.27KB
plugin-ai (index.js) 14.81KB 3.63KB
plugin-calendar (index.js) 49.99KB 14.24KB
plugin-charts (index.js) 71.33KB 19.90KB
plugin-chatbot (index.js) 195.34KB 46.51KB
plugin-dashboard (index.js) 131.44KB 34.65KB
plugin-designer (index.js) 215.94KB 44.33KB
plugin-detail (index.js) 252.48KB 65.61KB
plugin-editor (index.js) 2.23KB 1.05KB
plugin-form (index.js) 136.71KB 34.16KB
plugin-gantt (index.js) 167.62KB 41.26KB
plugin-grid (index.js) 212.83KB 57.97KB
plugin-kanban (index.js) 46.63KB 14.53KB
plugin-list (index.js) 112.67KB 27.68KB
plugin-map (index.js) 21.48KB 6.99KB
plugin-markdown (index.js) 13.88KB 4.80KB
plugin-report (index.js) 43.41KB 11.93KB
plugin-timeline (index.js) 30.07KB 8.74KB
plugin-tree (index.js) 10.58KB 3.72KB
plugin-view (index.js) 84.36KB 20.78KB
providers (DataSourceProvider.js) 0.75KB 0.39KB
providers (MetadataProvider.js) 1.37KB 0.59KB
providers (ThemeProvider.js) 1.90KB 0.85KB
providers (UploadProvider.js) 11.66KB 3.50KB
providers (index.js) 0.45KB 0.23KB
providers (types.js) 0.01KB 0.04KB
react-runtime (index.js) 5.62KB 2.34KB
react (LazyPluginLoader.js) 4.47KB 1.63KB
react (SchemaRenderer.js) 99.04KB 32.62KB
react (data-invalidation.js) 5.05KB 2.08KB
react (index.js) 4.63KB 2.18KB
react (schema-input.js) 4.25KB 2.04KB
react (spec-input.js) 0.20KB 0.18KB
sdui-parser (codegen.js) 6.58KB 2.74KB
sdui-parser (dashboard-widget-options.js) 3.08KB 1.30KB
sdui-parser (index.js) 5.66KB 2.50KB
sdui-parser (input-type.js) 2.84KB 1.40KB
sdui-parser (kanban-quick-add.js) 3.89KB 1.87KB
sdui-parser (parse.js) 25.28KB 7.80KB
sdui-parser (provenance.js) 3.66KB 1.82KB
sdui-parser (types.js) 0.28KB 0.23KB
sdui-parser (validate.js) 14.82KB 4.99KB
types (ai.js) 0.20KB 0.17KB
types (api-types.js) 0.20KB 0.18KB
types (app.js) 2.87KB 1.00KB
types (base.js) 0.20KB 0.18KB
types (blocks.js) 0.20KB 0.18KB
types (complex.js) 2.93KB 1.49KB
types (crud.js) 0.20KB 0.18KB
types (dashboard-filter-alias.js) 6.23KB 2.74KB
types (data-display.js) 3.75KB 1.85KB
types (data-protocol.js) 0.20KB 0.19KB
types (data.js) 0.20KB 0.18KB
types (designer.js) 1.85KB 0.85KB
types (disclosure.js) 0.20KB 0.18KB
types (error-code.js) 1.54KB 0.88KB
types (expression.js) 0.20KB 0.18KB
types (feedback.js) 0.20KB 0.18KB
types (field-types.js) 0.20KB 0.18KB
types (form.js) 0.20KB 0.18KB
types (http-inflight.js) 8.87KB 3.73KB
types (http-retry.js) 4.32KB 2.02KB
types (icon-key-migration.js) 4.26KB 1.63KB
types (index.js) 4.74KB 2.25KB
types (layout.js) 0.20KB 0.18KB
types (managed-by.js) 0.19KB 0.18KB
types (mobile.js) 4.73KB 2.28KB
types (navigation.js) 0.20KB 0.18KB
types (objectql.js) 0.20KB 0.18KB
types (overlay.js) 0.20KB 0.18KB
types (permissions.js) 0.20KB 0.18KB
types (plugin-scope.js) 0.20KB 0.18KB
types (record-components.js) 0.20KB 0.19KB
types (record-semantics.js) 1.28KB 0.67KB
types (registry.js) 0.20KB 0.18KB
types (reports.js) 0.20KB 0.18KB
types (select-option.js) 0.20KB 0.19KB
types (spec-report.js) 5.05KB 1.93KB
types (spec-ui-namespace.js) 0.20KB 0.19KB
types (strict-authoring-face.js) 14.04KB 5.36KB
types (system-fields.js) 3.33KB 1.54KB
types (theme.js) 6.28KB 2.87KB
types (ui-action.js) 8.11KB 3.32KB
types (views.js) 0.20KB 0.18KB
types (widget.js) 0.20KB 0.18KB

Size Limits

  • ✅ Core packages should be < 50KB gzipped
  • ✅ Component packages should be < 100KB gzipped
  • ⚠️ Plugin packages should be < 150KB gzipped

@os-try-charles
os-try-charles marked this pull request as ready for review September 14, 2026 17:46
@os-try-charles
os-try-charles added this pull request to the merge queue Sep 14, 2026
Merged via the queue into main with commit 2b67a62 Sep 14, 2026
38 checks passed
@os-try-charles
os-try-charles deleted the claude/issue-9412-ungated-docs-paydown branch September 14, 2026 18:05
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

1 participant