docs(plugin-report,docs): shrink UNGATED_DOCS by four — plugin-report README plus the last three .mdx entries - #7458

Merged
os-sales merged 2 commits into
mainfrom
claude/issue-5174-ungated-docs-batch9
Sep 3, 2026
Merged

docs(plugin-report,docs): shrink UNGATED_DOCS by four — plugin-report README plus the last three .mdx entries#7458
os-sales merged 2 commits into
mainfrom
claude/issue-5174-ungated-docs-batch9

Conversation

@claude

@claudeclaudeBot commented Sep 3, 2026

Copy link
Copy Markdown
Contributor

Part of #5174 — batch 9 of the UNGATED_DOCS shrink. The card stays open; this
removes four of its entries.

All figures below are at b701323ec, the final commit, after merging
origin/maind88e20f55. Exit codes were captured by redirect before any
pipe, and every gate line quotes the gate's own printed verdict.

What this removes, and what it bought

ledger entry removedblockscompiledeclared
packages/plugin-report/README.md13130
content/docs/plugins/plugin-detail.mdx770
content/docs/plugins/plugin-calendar-view.mdx211
content/docs/utilities/create-plugin.mdx101
total23212

37 diagnostics cleared (17 on the README, 20 across the three pages). Only the
two honest routes were used — compile against the built dist/, or a
FRAGMENT_MARKER whose reason names the diagnostics it was measured from. No
third route, no ledger addition, and no block made vacuous to get it green.

Ledger invariants, asserted mechanically

Both copies of the gate were imported side by side and evaluated over the same
working tree
, so the covered-set delta is attributable to the ledger alone:

LEDGER entry count: 32 -> 28
ADDED entries: []
REMOVED entries: ["content/docs/plugins/plugin-calendar-view.mdx",
"content/docs/plugins/plugin-detail.mdx",
"content/docs/utilities/create-plugin.mdx",
"packages/plugin-report/README.md"]
surviving entries whose REASON TEXT changed: []
COVERED documents: 195 -> 199 STRICTLY GROWS: true
previously-covered docs now UNGATED: []
blocks to compile : 411 -> 432
declared fragments : 155 -> 157
covered blocks : 566 -> 589
build filters : 25 -> 26 ADDED: ["--filter=@object-ui/plugin-report..."]

git diff --numstat origin/main...HEAD on the gate file reads 0 11
0 additions, 11 deletions. The hunk is removals only.

Strictness proven byte for byte: everything from the Fence scanning banner
to EOF is identical on both sides — 795 lines, sha256
d203debfa0073ccdb527a08e1e191b2d04b4cc00c5303ee27d4bfc76d09c7241 on
origin/main and on this branch. Nothing about how the gate judges a block
moved; only the list of documents it is allowed to skip.

The gate, before and after

BEFORE (origin/main d88e20f55's ledger, same tree)
195 covered, 32 ungated · 566 covered blocks — 411 to compile, 155 fragments
AFTER (this branch, node scripts/check-doc-snippet-types.mjs -> exit 0)
Scanned 227 document(s): 199 covered (97 of them hold a ts/tsx block), 28 ungated
Covered blocks: 589 — 432 to compile, 157 declared fragment(s).
Syntax phase: every block parsed, so every one of them reached the semantic phase.
Semantic phase: 432 of 432 block(s) judged, 0 failed.
Every covered documentation snippet compiles against the built types.

Controls all held: resolution landed on
/home/user/objectui-issue-5174-b9/packages/types/dist/index.d.ts (this
worktree's built artifact), sentinel TS2305, positive control 0 diagnostics,
undeclared control TS2307.

Per document — what changed, and why it is honest

packages/plugin-report/README.md — 13 blocks, all 13 compile

17 diagnostics: TS2304x15, TS2552x1, TS1108x1. Every one was a block using an
ambient name the page never defined, and the page's own prose already said so
("dataSource and router are host-provided"). Those names are now declared
against the shipped types
rather than floating — the pattern
packages/data-objectstack/README.md and packages/plugin-view/README.md
already use:

  • dataSource / ds / myAdapter as DataSource, router as
    { push: (href: string) => void }, reportDefinition / report as
    ReportComponentSchema or SpecReport depending on which renderer the block
    addresses, rows as Array of Record of string to unknown, refetch and
    notify as their real callback shapes.
  • The stored-document example (isDatasetReport(stored)) held a bare return
    at top level (TS1108). It is now a component function, which also puts the
    isDatasetReport narrowing under the compiler: unknown narrows to the
    renderer's report type, and that is checked.
  • The one block that was worse than broken: the filter-time date helper
    ended in runtimeFilter: { close_date: { $gte: daysAgo(30) } }. TypeScript
    parses that as a labelled block statement, so it would have compiled green
    with any spelling at all — covering it as written would have bought nothing.
    It is now a real defineReport call, and defineReport takes
    z.input of a strict ReportSchema, so the key is genuinely checked (probe 1
    below).
  • One JSX-bearing ts fence is now tsx. The gate parses every block as TSX
    regardless of the label, so this changes no verdict — it is a mislabel
    correction for the reader, in the direction that keeps the block collected.

content/docs/plugins/plugin-detail.mdx — 7 blocks, all 7 compile

16 diagnostics. Five blocks continued an earlier block; they now carry their own
imports and declarations. Two findings worth naming:

  • A real defect, fixed: the Console-integration example did
    const comments = await dataSource.find('sys_comment', ...) and then
    comments.map(...). DataSource.find resolves to Promise of
    QueryResult, which is { data: T[], total?, ... } — not an array. The rows
    are comments.data. Measured as TS2339 by probe 2.
  • The Filter Modes block restated the FeedFilterMode union beside the
    declared one, where nothing compared them. It now restates it against
    FeedFilterMode as imported from @object-ui/plugin-detail, so a typo or a
    retired member fails (probe 3). The four members are unchanged and still
    visible to the reader.

content/docs/plugins/plugin-calendar-view.mdx — 1 compiles, 1 declared

The "After" block names @object-ui/plugin-calendar and compiles. The "Before"
block quotes the retired @object-ui/plugin-calendar-view specifier on
purpose
— it is the before half of a migration guide — so it carries a
FRAGMENT_MARKER naming its measured TS2882 + TS2307. Repairing it would delete
the thing the section documents. This is exactly the disposition the removed
ledger entry itself predicted.

content/docs/utilities/create-plugin.mdx — 1 block, declared

React.lazy(() => import('./HeavyImpl')) points at a module in the reader's
own
plugin, which cannot exist beside this page (TS2307), and React is the
UMD global a one-line excerpt does not import (TS2686). Declared with both
measured; importing our way out would make the snippet about this repository
rather than about the plugin the reader is scaffolding.

Non-vacuity — six probes, direction predicted before each run

A newly covered document that cannot fail the gate has bought nothing, so each
probe was planted, proved on disk (the injected text counted, the removed
text counted, and git hash-object shown to differ from the HEAD blob), run,
then restored with git checkout HEAD -- ABSOLUTE_PATH under a
SIGTERM/SIGINT/exit trap, and the restore proved by an empty
git diff HEADand a blob hash equal to the HEAD blob. No rebuild sits
between mutation and reading: the mutation is markdown the gate reads straight
from disk, and the dist/ it compiles against is untouched.

#probepredictedobserved
1runtimeFilter misspelled in the new defineReportREDRED — TS2561, "Did you mean to write 'runtimeFilter'?"
2comments.data.map reverted to comments.mapREDRED — TS2339 Property 'map' does not exist on type 'QueryResult of any'
3'archived_only' added to the restated unionREDRED — TS2322 against the declared four
4wrong top-level key on an annotated ReportComponentSchema literalGREENGREEN — 0 failed
5the same wrong key one level down, inside ReportFieldREDRED — TS2561 'labell' does not exist in type 'ReportField'
6the calendar-view fragment marker disabledREDRED — the TS2882 + TS2307 its reason names

All six matched, including the direction of probe 4.

What the green does not mean

Probe 4 is the honest half. BaseSchema declares [key: string]: any, so a
wrong top-level key on any schema literal that extends it is invisible to
this gate — measured, not assumed. Probe 5 shows the floor: one level down, in a
type that does not extend BaseSchema (ReportField), excess-property checking
bites normally. Discharged by declaration check rather than left unknown: every
top-level key on the annotated literals in these blocks
(type, title, fields, schedule) is a declared member of
ReportComponentSchema, so nothing on these pages rides the index signature.
The defineReport calls are not affected at all — ReportSchema is strict, so
probe 1 reds at the top level.

Probe 6 is the fragment half: a declared fragment is not compiled, so the only
thing standing behind it is its written reason. Disabling the marker shows the
reason is true — the two diagnostics it names are the two the gate reports.

Gates and tests, all at b701323ec

commandexitverdict line
node scripts/check-doc-snippet-types.mjs0Every covered documentation snippet compiles against the built types.
node scripts/check-doc-fence-languages.mjs0every TypeScript block in 227 document(s) is fenced ts/tsx/typescript, except 80 declared file(s) carrying 90 block(s)
node scripts/check-doc-component-types.mjs0Every documented component type is registered.
node scripts/check-doc-links.mjs0Links are valid across 17 scan roots.
node scripts/check-control-bytes.mjs0OK (scanned 6140 tracked text file(s); skipped 85 binary)
node scripts/check-readme-exports.mjs0406 self-imports judged (406 real, 0 wrong-path, 0 fabricated)
node scripts/check-skill-examples.mjs0Every marked skill example holds up against the built types.
node scripts/check-changeset-presence.mjs0No source or published contract of a released package changed in this range, so no changeset is owed.
pnpm exec vitest run --maxWorkers=2 (15 suites, repo root)0Test Files 15 passed (15) / Tests 489 passed (489)
pnpm run lint:root032 problems (0 errors, 32 warnings) — all pre-existing

The check-doc-fences / check-doc-snippets walk-equality pin couples the three
doc gates, and all three are green above.

Changeset: none owed, and the verdict is the gate's, not a guess. A
packages/*/README.md does ship inside the package's files, so it was checked
rather than assumed: check-changeset-presence compared the tree with the
merge-base d88e20f55 and reports 5 files changed, 0 of them published source of
a package the release covers. Verdict followed; none added. No label was applied —
in objectui skip-changeset is a historical mis-mount that no workflow reads and
a pin test forbids applying.

Test suite selection re-derived at the merged head, not inherited:
git grep -l for the gate's name plus for each edited document and the sibling
README gate, which is 15 files including check-skill-examples.test.ts that
landed on main mid-run. vitest ran from the repo root, never through
pnpm --filter ... exec vitest.

One NOT MEASURED, corrected rather than reported as red: the first run of
check-readme-exports exited 1 with 3 findings, all the string "its type entry
./dist/index.d.ts is not on disk" for plugin-ai, none naming a file in this
diff — a missing precondition, not a verdict. Building that closure made it a
real measurement. The same half-built tree then failed two cases in
check-readme-exports.test.ts, which branch on packagesUnbuilt === 0 and are
written for a cleanly built or cleanly unbuilt tree; building the last unbuilt
package (plugin-tree) put the tree in one of those two states and the suite is
green, 489/489.

Build: serialised through the shared verify lock
(OS_VERIFY_LOCK_SLOT=issue-5174-b9, set before the first attempt), VERDICT command-exit 0 on every run. Because turbo replays cached logs that can name
another worktree's paths, dist/index.d.ts presence was confirmed on disk in
this worktree
for all 26 build-filter packages before any gate result was
trusted (26/26 present).

Serial constraint

The seat declared this file's regions disjoint at region level rather than
serialising the whole file: this branch touches the UNGATED_DOCS object literal
only, while #7432 touched CONTROL_REAL_EXPORT, a one-line harness constant some
290 lines away. That declaration obliged a merge of origin/main before opening,
and #7432landed in the meantime. The merge was clean — no conflict, no
hand-ordering — and CONTROL_REAL_EXPORT now reads BaseSchema on this branch,
with the positive control still reporting 0 diagnostics. Every number above was
re-taken after that merge. #7449, which moved the three gates' scan roots and put
an ownership-map block beside this ledger, is also on main and is included;
none of batch 8's figures were reused.

⛔ Excluded on the standing ruling, and named so the boundary is explicit:
packages/plugin-gantt/README.md and packages/plugin-kanban/README.md are
owned by #7302 / PARTIAL_EXCERPTS and are untouched here. plugin-gantt is the
largest entry left in the ledger by fence count (18), so it is exactly the
neighbour the exclusion exists for.

Ledger after this batch

28 entries: 0 .mdx under content/docs, 27 package READMEs, plus the root
README.md. The .mdx half of this ledger is now empty.


Generated by Claude Code

os-salesand others added 2 commits September 3, 2026 06:41
… README plus the last three .mdx entries
Batch 9 of objectui#5174. Removes four entries from `UNGATED_DOCS` in
`scripts/check-doc-snippet-types.mjs` and makes the 23 blocks they were
hiding honest: 21 compile against the built `dist/`, 2 carry a
`FRAGMENT_MARKER` with a measured reason.
- packages/plugin-report/README.md — 13 blocks, all 13 compile. 17
diagnostics cleared. Host-provided names (`dataSource`, `router`, `ds`,
`stored`, `report`, `rows`, `refetch`, `myAdapter`, `notify`) are now
declared against the shipped types instead of floating; the stored-document
example became a component so its `return` sits in a function body; the
filter-time date helper, which parsed as a labelled block statement and so
verified nothing, is now a real `defineReport` call that checks
`runtimeFilter`; the JSX-bearing `ts` fence is `tsx`.
- content/docs/plugins/plugin-detail.mdx — 7 blocks, all 7 compile. Real
defect fixed: the Console-integration example called `.map` on the result of
`dataSource.find`, which resolves to a `QueryResult`, not an array — the rows
are `.data`. The Filter Modes block restated the `FeedFilterMode` union
beside the declared one; it now checks against it.
- content/docs/plugins/plugin-calendar-view.mdx — 2 blocks: the "After" block
compiles, the "Before" block declares a fragment (it quotes the retired
package on purpose).
- content/docs/utilities/create-plugin.mdx — 1 block, declared: it points at
`./HeavyImpl` in the reader's own plugin.
Ledger 32 to 28, removals only (0 additions, 11 deletions). Covered documents
196 to 200; covered blocks 577 to 600; compiled 421 to 442; declared fragments
156 to 158. Gate strictness byte-identical from the fence-scanning banner to
EOF (sha256 b633996e6b55f08870ce1046f6f432914ca72320da6ce257dcc19fe661d6f313
on both sides).
Part of #5174
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019aCUUSwWefnbCJ4Xk1vqQW
@github-actionsgithub-actionsBot added documentation Improvements or additions to documentation plugin labels Sep 3, 2026
@github-actions

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

MetricValueBudget
Eager closure (gzip, 48 chunks)3178.8 KB3191.4 KB
Main entry chunk (gzip)143.2 KB350 KB
Entry fileindex-Brm1fWPZ.js
StatusPASS

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

PackageSizeGzipped
app-shell (consoleActionDispatch.js)0.20KB0.19KB
app-shell (index.js)15.67KB5.75KB
app-shell (runtime-config.js)20.68KB7.36KB
app-shell (types.js)0.01KB0.04KB
app-shell (urlParams.js)10.06KB3.86KB
auth (ActiveOrganizationStorage.js)25.05KB9.16KB
auth (AuthContext.js)0.31KB0.24KB
auth (AuthGuard.js)2.07KB1.00KB
auth (AuthProvider.js)40.18KB10.59KB
auth (AuthShell.js)3.49KB1.40KB
auth (ForgotPasswordForm.js)12.21KB3.45KB
auth (LoginForm.js)18.15KB5.39KB
auth (PreviewBanner.js)0.90KB0.50KB
auth (RegisterForm.js)6.65KB2.22KB
auth (SocialSignInButtons.js)9.61KB3.89KB
auth (UserMenu.js)3.41KB1.23KB
auth (auth-gate-events.js)1.29KB0.66KB
auth (authStyles.js)5.04KB1.72KB
auth (createAuthClient.js)40.21KB10.80KB
auth (createAuthenticatedFetch.js)8.46KB3.43KB
auth (index.js)3.19KB1.44KB
auth (invitation-status.js)1.22KB0.70KB
auth (org-roles.js)6.66KB2.78KB
auth (phone-identifier.js)1.11KB0.66KB
auth (types.js)0.59KB0.35KB
auth (useAuth.js)5.30KB1.02KB
auth (useWorkspaceAdminStatus.js)5.13KB2.35KB
collaboration (CommentThread.js)26.08KB7.56KB
collaboration (LiveCursors.js)3.17KB1.27KB
collaboration (PresenceAvatars.js)6.49KB2.64KB
collaboration (PresenceProvider.js)2.79KB1.13KB
collaboration (index.js)1.68KB0.73KB
collaboration (useCollaborationTranslation.js)6.05KB2.52KB
collaboration (useCommentSearch.js)1.98KB0.88KB
collaboration (useConflictResolution.js)7.75KB1.86KB
collaboration (useMentionNotifications.js)1.81KB0.68KB
collaboration (usePresence.js)6.33KB1.84KB
collaboration (useRealtimeSubscription.js)7.91KB2.01KB
components (index.js)516.24KB117.82KB
core (index.js)5.80KB2.32KB
create-plugin (index.js)10.08KB3.26KB
data-objectstack (index.js)178.20KB49.60KB
fields (index.js)244.08KB61.71KB
i18n (LocalizationContext.js)1.76KB0.96KB
i18n (currency.js)1.22KB0.64KB
i18n (fallbackInterpolation.js)6.25KB2.77KB
i18n (i18n.js)4.28KB1.75KB
i18n (index.js)3.44KB1.39KB
i18n (pickLocalized.js)7.62KB3.26KB
i18n (provider.js)26.89KB9.04KB
i18n (useDisplayLocale.js)2.85KB1.45KB
i18n (useObjectLabel.js)33.40KB8.71KB
i18n (useSafeTranslation.js)5.60KB2.33KB
layout (index.js)38.98KB10.98KB
mobile (MobileProvider.js)0.92KB0.49KB
mobile (ResponsiveContainer.js)0.94KB0.38KB
mobile (breakpoints.js)1.51KB0.70KB
mobile (createOfflineDataSource.js)5.61KB1.75KB
mobile (index.js)1.55KB0.62KB
mobile (offlineQueue.js)3.91KB1.35KB
mobile (pwa.js)0.97KB0.49KB
mobile (serviceWorker.js)1.48KB0.62KB
mobile (serviceWorkerSource.js)3.41KB1.48KB
mobile (useBreakpoint.js)1.54KB0.65KB
mobile (useGesture.js)6.96KB1.98KB
mobile (useOfflineSync.js)1.99KB0.72KB
mobile (usePullToRefresh.js)2.53KB0.85KB
mobile (useResponsive.js)0.72KB0.42KB
mobile (useResponsiveConfig.js)1.37KB0.63KB
mobile (useSpecGesture.js)4.32KB1.64KB
mobile (useTouchTarget.js)1.01KB0.54KB
permissions (MePermissionsProvider.js)11.71KB4.29KB
permissions (PermissionContext.js)0.31KB0.25KB
permissions (PermissionGuard.js)0.89KB0.45KB
permissions (PermissionProvider.js)6.24KB2.16KB
permissions (discardProofCache.js)1.04KB0.55KB
permissions (evaluator.js)5.12KB1.74KB
permissions (index.js)0.93KB0.41KB
permissions (store.js)0.91KB0.42KB
permissions (useFieldPermissions.js)1.28KB0.53KB
permissions (usePermissions.js)4.83KB2.27KB
plugin-ai (index.js)15.75KB3.80KB
plugin-calendar (index.js)47.14KB13.02KB
plugin-charts (index.js)70.31KB19.55KB
plugin-chatbot (index.js)196.19KB46.43KB
plugin-dashboard (index.js)132.79KB34.62KB
plugin-designer (index.js)212.87KB43.19KB
plugin-detail (index.js)251.27KB64.20KB
plugin-editor (index.js)2.46KB1.10KB
plugin-form (index.js)132.87KB32.66KB
plugin-gantt (index.js)167.18KB40.94KB
plugin-grid (index.js)209.25KB56.71KB
plugin-kanban (index.js)53.21KB14.66KB
plugin-list (index.js)113.53KB27.66KB
plugin-map (index.js)20.20KB6.66KB
plugin-markdown (index.js)13.72KB4.69KB
plugin-report (index.js)43.51KB11.94KB
plugin-timeline (index.js)30.21KB8.66KB
plugin-tree (index.js)8.98KB3.08KB
plugin-view (index.js)85.90KB21.12KB
providers (DataSourceProvider.js)0.75KB0.39KB
providers (MetadataProvider.js)1.37KB0.59KB
providers (ThemeProvider.js)1.90KB0.85KB
providers (UploadProvider.js)11.66KB3.50KB
providers (index.js)0.45KB0.23KB
providers (types.js)0.01KB0.04KB
react-runtime (index.js)5.62KB2.34KB
react (LazyPluginLoader.js)4.47KB1.63KB
react (SchemaRenderer.js)81.07KB26.86KB
react (data-invalidation.js)5.05KB2.08KB
react (index.js)3.11KB1.48KB
react (schema-input.js)2.32KB1.24KB
react (spec-input.js)0.20KB0.18KB
sdui-parser (codegen.js)5.41KB2.34KB
sdui-parser (dashboard-widget-options.js)3.08KB1.30KB
sdui-parser (index.js)4.93KB2.24KB
sdui-parser (input-type.js)2.84KB1.40KB
sdui-parser (parse.js)20.57KB5.88KB
sdui-parser (provenance.js)3.66KB1.82KB
sdui-parser (types.js)0.28KB0.23KB
sdui-parser (validate.js)10.35KB3.60KB
types (ai.js)0.20KB0.17KB
types (api-types.js)0.20KB0.18KB
types (app.js)2.87KB0.99KB
types (base.js)0.20KB0.18KB
types (blocks.js)0.20KB0.18KB
types (complex.js)2.74KB1.41KB
types (crud.js)0.20KB0.18KB
types (dashboard-filter-alias.js)6.23KB2.74KB
types (data-display.js)3.75KB1.85KB
types (data-protocol.js)0.20KB0.19KB
types (data.js)0.20KB0.18KB
types (designer.js)1.85KB0.85KB
types (disclosure.js)0.20KB0.18KB
types (error-code.js)1.54KB0.88KB
types (feedback.js)0.20KB0.18KB
types (field-types.js)0.20KB0.18KB
types (form.js)0.20KB0.18KB
types (http-inflight.js)8.87KB3.73KB
types (http-retry.js)4.32KB2.02KB
types (icon-key-migration.js)4.26KB1.63KB
types (index.js)4.74KB2.25KB
types (layout.js)0.20KB0.18KB
types (managed-by.js)0.19KB0.18KB
types (mobile.js)2.59KB1.31KB
types (navigation.js)0.20KB0.18KB
types (objectql.js)0.20KB0.18KB
types (overlay.js)0.20KB0.18KB
types (permissions.js)0.20KB0.18KB
types (plugin-scope.js)0.20KB0.18KB
types (record-components.js)0.20KB0.19KB
types (record-semantics.js)1.28KB0.67KB
types (registry.js)0.20KB0.18KB
types (reports.js)0.20KB0.18KB
types (spec-report.js)5.05KB1.93KB
types (spec-ui-namespace.js)0.20KB0.19KB
types (system-fields.js)3.33KB1.54KB
types (theme.js)6.28KB2.87KB
types (ui-action.js)8.11KB3.32KB
types (views.js)0.20KB0.18KB
types (widget.js)0.20KB0.18KB

Size Limits

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

@os-salesClaude

Copy link
Copy Markdown
Collaborator

Test (shard 3/4) is red, and it is not this PR's — reasoning first, confirmation pending

Posted by the domain:devx seat (session session_019aCUUSwWefnbCJ4Xk1vqQW) reviewing batch 9. ⛔ Not flipping this PR ready while a check is red.

The failure:

AssertionError: expected [ '#abc' ] to deeply equal [ '#123456' ]
❯ packages/plugin-timeline/src/ObjectTimeline.colorFieldLadder-7243.test.tsx:109:72

Why it cannot be this diff's. This PR changes three .mdx documents, one package README, and scripts/check-doc-snippet-types.mjs. It contains zero runtime source and zero plugin-timeline files — measured, not assumed: git diff --name-only against the merge base lists 5 files, none under packages/plugin-timeline/. check-doc-snippet-types.mjs is executed only by the documentation gates, never by a component test. There is no path by which markdown or a docs gate can change what colorsFor('accent', …) returns.

The failure shape says the same thing. Line 109 is the second of a pair:

expect(awaitcolorsFor('accent',[{ ...ROW,accent: '#abc'}])).toEqual(['#abc']);// passesexpect(awaitcolorsFor('accent',[{ ...ROW,accent: '#123456'}])).toEqual(['#123456']);// returns ['#abc']

The second call returned the first call's value. That is state leaking across two invocations inside one test — a caching or async-settlement defect, the classic shape of a nondeterministic failure. It is not a wrong expectation, and it is not something a docs change can reach.

Provenance: the test arrived with e75f4c986 — "fix(gantt,calendar,timeline): resolve colorField through one shared ladder (#7338)". A shared resolution ladder is exactly the kind of change that introduces cross-call memoisation.

No fix exists to port. I searched for an existing card covering this test or this symptom and found none (the search returned a live, non-empty result set, so the empty match on this symptom is a real negative rather than a silently-zeroed query). Filing it as a finding so it is owned rather than absorbed.

⛔ Not doing, and saying so explicitly: not skipping, disabling, quarantining or retrying this test into green, and not touching plugin-timeline from a docs PR to make my own PR pass.

Next: one re-run of the failed job, which is the single re-run this failure is entitled to. It is currently refused with "This workflow is already running" (shards 1 and 4 are still in flight), so it will be spent once the run completes. If it comes back green, this was nondeterministic and the finding stands on its own; if it reproduces identically, the failure is real and still not this PR's — and it then blocks every PR in the repo, not just this one, which makes it the more urgent item.


Generated by Claude Code

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentationImprovements or additions to documentationplugin

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@os-sales@claude
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

docs(plugin-report,docs): shrink UNGATED_DOCS by four — plugin-report README plus the last three .mdx entries - #7458

Merged
os-sales merged 2 commits into
mainfrom
claude/issue-5174-ungated-docs-batch9
Sep 3, 2026
Merged

docs(plugin-report,docs): shrink UNGATED_DOCS by four — plugin-report README plus the last three .mdx entries#7458
os-sales merged 2 commits into
mainfrom
claude/issue-5174-ungated-docs-batch9

Conversation

@claude

@claudeclaudeBot commented Sep 3, 2026

Copy link
Copy Markdown
Contributor

Part of #5174 — batch 9 of the UNGATED_DOCS shrink. The card stays open; this
removes four of its entries.

All figures below are at b701323ec, the final commit, after merging
origin/maind88e20f55. Exit codes were captured by redirect before any
pipe, and every gate line quotes the gate's own printed verdict.

What this removes, and what it bought

ledger entry removedblockscompiledeclared
packages/plugin-report/README.md13130
content/docs/plugins/plugin-detail.mdx770
content/docs/plugins/plugin-calendar-view.mdx211
content/docs/utilities/create-plugin.mdx101
total23212

37 diagnostics cleared (17 on the README, 20 across the three pages). Only the
two honest routes were used — compile against the built dist/, or a
FRAGMENT_MARKER whose reason names the diagnostics it was measured from. No
third route, no ledger addition, and no block made vacuous to get it green.

Ledger invariants, asserted mechanically

Both copies of the gate were imported side by side and evaluated over the same
working tree
, so the covered-set delta is attributable to the ledger alone:

LEDGER entry count: 32 -> 28
ADDED entries: []
REMOVED entries: ["content/docs/plugins/plugin-calendar-view.mdx",
"content/docs/plugins/plugin-detail.mdx",
"content/docs/utilities/create-plugin.mdx",
"packages/plugin-report/README.md"]
surviving entries whose REASON TEXT changed: []
COVERED documents: 195 -> 199 STRICTLY GROWS: true
previously-covered docs now UNGATED: []
blocks to compile : 411 -> 432
declared fragments : 155 -> 157
covered blocks : 566 -> 589
build filters : 25 -> 26 ADDED: ["--filter=@object-ui/plugin-report..."]

git diff --numstat origin/main...HEAD on the gate file reads 0 11
0 additions, 11 deletions. The hunk is removals only.

Strictness proven byte for byte: everything from the Fence scanning banner
to EOF is identical on both sides — 795 lines, sha256
d203debfa0073ccdb527a08e1e191b2d04b4cc00c5303ee27d4bfc76d09c7241 on
origin/main and on this branch. Nothing about how the gate judges a block
moved; only the list of documents it is allowed to skip.

The gate, before and after

BEFORE (origin/main d88e20f55's ledger, same tree)
195 covered, 32 ungated · 566 covered blocks — 411 to compile, 155 fragments
AFTER (this branch, node scripts/check-doc-snippet-types.mjs -> exit 0)
Scanned 227 document(s): 199 covered (97 of them hold a ts/tsx block), 28 ungated
Covered blocks: 589 — 432 to compile, 157 declared fragment(s).
Syntax phase: every block parsed, so every one of them reached the semantic phase.
Semantic phase: 432 of 432 block(s) judged, 0 failed.
Every covered documentation snippet compiles against the built types.

Controls all held: resolution landed on
/home/user/objectui-issue-5174-b9/packages/types/dist/index.d.ts (this
worktree's built artifact), sentinel TS2305, positive control 0 diagnostics,
undeclared control TS2307.

Per document — what changed, and why it is honest

packages/plugin-report/README.md — 13 blocks, all 13 compile

17 diagnostics: TS2304x15, TS2552x1, TS1108x1. Every one was a block using an
ambient name the page never defined, and the page's own prose already said so
("dataSource and router are host-provided"). Those names are now declared
against the shipped types
rather than floating — the pattern
packages/data-objectstack/README.md and packages/plugin-view/README.md
already use:

  • dataSource / ds / myAdapter as DataSource, router as
    { push: (href: string) => void }, reportDefinition / report as
    ReportComponentSchema or SpecReport depending on which renderer the block
    addresses, rows as Array of Record of string to unknown, refetch and
    notify as their real callback shapes.
  • The stored-document example (isDatasetReport(stored)) held a bare return
    at top level (TS1108). It is now a component function, which also puts the
    isDatasetReport narrowing under the compiler: unknown narrows to the
    renderer's report type, and that is checked.
  • The one block that was worse than broken: the filter-time date helper
    ended in runtimeFilter: { close_date: { $gte: daysAgo(30) } }. TypeScript
    parses that as a labelled block statement, so it would have compiled green
    with any spelling at all — covering it as written would have bought nothing.
    It is now a real defineReport call, and defineReport takes
    z.input of a strict ReportSchema, so the key is genuinely checked (probe 1
    below).
  • One JSX-bearing ts fence is now tsx. The gate parses every block as TSX
    regardless of the label, so this changes no verdict — it is a mislabel
    correction for the reader, in the direction that keeps the block collected.

content/docs/plugins/plugin-detail.mdx — 7 blocks, all 7 compile

16 diagnostics. Five blocks continued an earlier block; they now carry their own
imports and declarations. Two findings worth naming:

  • A real defect, fixed: the Console-integration example did
    const comments = await dataSource.find('sys_comment', ...) and then
    comments.map(...). DataSource.find resolves to Promise of
    QueryResult, which is { data: T[], total?, ... } — not an array. The rows
    are comments.data. Measured as TS2339 by probe 2.
  • The Filter Modes block restated the FeedFilterMode union beside the
    declared one, where nothing compared them. It now restates it against
    FeedFilterMode as imported from @object-ui/plugin-detail, so a typo or a
    retired member fails (probe 3). The four members are unchanged and still
    visible to the reader.

content/docs/plugins/plugin-calendar-view.mdx — 1 compiles, 1 declared

The "After" block names @object-ui/plugin-calendar and compiles. The "Before"
block quotes the retired @object-ui/plugin-calendar-view specifier on
purpose
— it is the before half of a migration guide — so it carries a
FRAGMENT_MARKER naming its measured TS2882 + TS2307. Repairing it would delete
the thing the section documents. This is exactly the disposition the removed
ledger entry itself predicted.

content/docs/utilities/create-plugin.mdx — 1 block, declared

React.lazy(() => import('./HeavyImpl')) points at a module in the reader's
own
plugin, which cannot exist beside this page (TS2307), and React is the
UMD global a one-line excerpt does not import (TS2686). Declared with both
measured; importing our way out would make the snippet about this repository
rather than about the plugin the reader is scaffolding.

Non-vacuity — six probes, direction predicted before each run

A newly covered document that cannot fail the gate has bought nothing, so each
probe was planted, proved on disk (the injected text counted, the removed
text counted, and git hash-object shown to differ from the HEAD blob), run,
then restored with git checkout HEAD -- ABSOLUTE_PATH under a
SIGTERM/SIGINT/exit trap, and the restore proved by an empty
git diff HEADand a blob hash equal to the HEAD blob. No rebuild sits
between mutation and reading: the mutation is markdown the gate reads straight
from disk, and the dist/ it compiles against is untouched.

#probepredictedobserved
1runtimeFilter misspelled in the new defineReportREDRED — TS2561, "Did you mean to write 'runtimeFilter'?"
2comments.data.map reverted to comments.mapREDRED — TS2339 Property 'map' does not exist on type 'QueryResult of any'
3'archived_only' added to the restated unionREDRED — TS2322 against the declared four
4wrong top-level key on an annotated ReportComponentSchema literalGREENGREEN — 0 failed
5the same wrong key one level down, inside ReportFieldREDRED — TS2561 'labell' does not exist in type 'ReportField'
6the calendar-view fragment marker disabledREDRED — the TS2882 + TS2307 its reason names

All six matched, including the direction of probe 4.

What the green does not mean

Probe 4 is the honest half. BaseSchema declares [key: string]: any, so a
wrong top-level key on any schema literal that extends it is invisible to
this gate — measured, not assumed. Probe 5 shows the floor: one level down, in a
type that does not extend BaseSchema (ReportField), excess-property checking
bites normally. Discharged by declaration check rather than left unknown: every
top-level key on the annotated literals in these blocks
(type, title, fields, schedule) is a declared member of
ReportComponentSchema, so nothing on these pages rides the index signature.
The defineReport calls are not affected at all — ReportSchema is strict, so
probe 1 reds at the top level.

Probe 6 is the fragment half: a declared fragment is not compiled, so the only
thing standing behind it is its written reason. Disabling the marker shows the
reason is true — the two diagnostics it names are the two the gate reports.

Gates and tests, all at b701323ec

commandexitverdict line
node scripts/check-doc-snippet-types.mjs0Every covered documentation snippet compiles against the built types.
node scripts/check-doc-fence-languages.mjs0every TypeScript block in 227 document(s) is fenced ts/tsx/typescript, except 80 declared file(s) carrying 90 block(s)
node scripts/check-doc-component-types.mjs0Every documented component type is registered.
node scripts/check-doc-links.mjs0Links are valid across 17 scan roots.
node scripts/check-control-bytes.mjs0OK (scanned 6140 tracked text file(s); skipped 85 binary)
node scripts/check-readme-exports.mjs0406 self-imports judged (406 real, 0 wrong-path, 0 fabricated)
node scripts/check-skill-examples.mjs0Every marked skill example holds up against the built types.
node scripts/check-changeset-presence.mjs0No source or published contract of a released package changed in this range, so no changeset is owed.
pnpm exec vitest run --maxWorkers=2 (15 suites, repo root)0Test Files 15 passed (15) / Tests 489 passed (489)
pnpm run lint:root032 problems (0 errors, 32 warnings) — all pre-existing

The check-doc-fences / check-doc-snippets walk-equality pin couples the three
doc gates, and all three are green above.

Changeset: none owed, and the verdict is the gate's, not a guess. A
packages/*/README.md does ship inside the package's files, so it was checked
rather than assumed: check-changeset-presence compared the tree with the
merge-base d88e20f55 and reports 5 files changed, 0 of them published source of
a package the release covers. Verdict followed; none added. No label was applied —
in objectui skip-changeset is a historical mis-mount that no workflow reads and
a pin test forbids applying.

Test suite selection re-derived at the merged head, not inherited:
git grep -l for the gate's name plus for each edited document and the sibling
README gate, which is 15 files including check-skill-examples.test.ts that
landed on main mid-run. vitest ran from the repo root, never through
pnpm --filter ... exec vitest.

One NOT MEASURED, corrected rather than reported as red: the first run of
check-readme-exports exited 1 with 3 findings, all the string "its type entry
./dist/index.d.ts is not on disk" for plugin-ai, none naming a file in this
diff — a missing precondition, not a verdict. Building that closure made it a
real measurement. The same half-built tree then failed two cases in
check-readme-exports.test.ts, which branch on packagesUnbuilt === 0 and are
written for a cleanly built or cleanly unbuilt tree; building the last unbuilt
package (plugin-tree) put the tree in one of those two states and the suite is
green, 489/489.

Build: serialised through the shared verify lock
(OS_VERIFY_LOCK_SLOT=issue-5174-b9, set before the first attempt), VERDICT command-exit 0 on every run. Because turbo replays cached logs that can name
another worktree's paths, dist/index.d.ts presence was confirmed on disk in
this worktree
for all 26 build-filter packages before any gate result was
trusted (26/26 present).

Serial constraint

The seat declared this file's regions disjoint at region level rather than
serialising the whole file: this branch touches the UNGATED_DOCS object literal
only, while #7432 touched CONTROL_REAL_EXPORT, a one-line harness constant some
290 lines away. That declaration obliged a merge of origin/main before opening,
and #7432landed in the meantime. The merge was clean — no conflict, no
hand-ordering — and CONTROL_REAL_EXPORT now reads BaseSchema on this branch,
with the positive control still reporting 0 diagnostics. Every number above was
re-taken after that merge. #7449, which moved the three gates' scan roots and put
an ownership-map block beside this ledger, is also on main and is included;
none of batch 8's figures were reused.

⛔ Excluded on the standing ruling, and named so the boundary is explicit:
packages/plugin-gantt/README.md and packages/plugin-kanban/README.md are
owned by #7302 / PARTIAL_EXCERPTS and are untouched here. plugin-gantt is the
largest entry left in the ledger by fence count (18), so it is exactly the
neighbour the exclusion exists for.

Ledger after this batch

28 entries: 0 .mdx under content/docs, 27 package READMEs, plus the root
README.md. The .mdx half of this ledger is now empty.


Generated by Claude Code

os-salesand others added 2 commits September 3, 2026 06:41
… README plus the last three .mdx entries
Batch 9 of objectui#5174. Removes four entries from `UNGATED_DOCS` in
`scripts/check-doc-snippet-types.mjs` and makes the 23 blocks they were
hiding honest: 21 compile against the built `dist/`, 2 carry a
`FRAGMENT_MARKER` with a measured reason.
- packages/plugin-report/README.md — 13 blocks, all 13 compile. 17
diagnostics cleared. Host-provided names (`dataSource`, `router`, `ds`,
`stored`, `report`, `rows`, `refetch`, `myAdapter`, `notify`) are now
declared against the shipped types instead of floating; the stored-document
example became a component so its `return` sits in a function body; the
filter-time date helper, which parsed as a labelled block statement and so
verified nothing, is now a real `defineReport` call that checks
`runtimeFilter`; the JSX-bearing `ts` fence is `tsx`.
- content/docs/plugins/plugin-detail.mdx — 7 blocks, all 7 compile. Real
defect fixed: the Console-integration example called `.map` on the result of
`dataSource.find`, which resolves to a `QueryResult`, not an array — the rows
are `.data`. The Filter Modes block restated the `FeedFilterMode` union
beside the declared one; it now checks against it.
- content/docs/plugins/plugin-calendar-view.mdx — 2 blocks: the "After" block
compiles, the "Before" block declares a fragment (it quotes the retired
package on purpose).
- content/docs/utilities/create-plugin.mdx — 1 block, declared: it points at
`./HeavyImpl` in the reader's own plugin.
Ledger 32 to 28, removals only (0 additions, 11 deletions). Covered documents
196 to 200; covered blocks 577 to 600; compiled 421 to 442; declared fragments
156 to 158. Gate strictness byte-identical from the fence-scanning banner to
EOF (sha256 b633996e6b55f08870ce1046f6f432914ca72320da6ce257dcc19fe661d6f313
on both sides).
Part of #5174
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019aCUUSwWefnbCJ4Xk1vqQW
@github-actionsgithub-actionsBot added documentation Improvements or additions to documentation plugin labels Sep 3, 2026
@github-actions

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

MetricValueBudget
Eager closure (gzip, 48 chunks)3178.8 KB3191.4 KB
Main entry chunk (gzip)143.2 KB350 KB
Entry fileindex-Brm1fWPZ.js
StatusPASS

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

PackageSizeGzipped
app-shell (consoleActionDispatch.js)0.20KB0.19KB
app-shell (index.js)15.67KB5.75KB
app-shell (runtime-config.js)20.68KB7.36KB
app-shell (types.js)0.01KB0.04KB
app-shell (urlParams.js)10.06KB3.86KB
auth (ActiveOrganizationStorage.js)25.05KB9.16KB
auth (AuthContext.js)0.31KB0.24KB
auth (AuthGuard.js)2.07KB1.00KB
auth (AuthProvider.js)40.18KB10.59KB
auth (AuthShell.js)3.49KB1.40KB
auth (ForgotPasswordForm.js)12.21KB3.45KB
auth (LoginForm.js)18.15KB5.39KB
auth (PreviewBanner.js)0.90KB0.50KB
auth (RegisterForm.js)6.65KB2.22KB
auth (SocialSignInButtons.js)9.61KB3.89KB
auth (UserMenu.js)3.41KB1.23KB
auth (auth-gate-events.js)1.29KB0.66KB
auth (authStyles.js)5.04KB1.72KB
auth (createAuthClient.js)40.21KB10.80KB
auth (createAuthenticatedFetch.js)8.46KB3.43KB
auth (index.js)3.19KB1.44KB
auth (invitation-status.js)1.22KB0.70KB
auth (org-roles.js)6.66KB2.78KB
auth (phone-identifier.js)1.11KB0.66KB
auth (types.js)0.59KB0.35KB
auth (useAuth.js)5.30KB1.02KB
auth (useWorkspaceAdminStatus.js)5.13KB2.35KB
collaboration (CommentThread.js)26.08KB7.56KB
collaboration (LiveCursors.js)3.17KB1.27KB
collaboration (PresenceAvatars.js)6.49KB2.64KB
collaboration (PresenceProvider.js)2.79KB1.13KB
collaboration (index.js)1.68KB0.73KB
collaboration (useCollaborationTranslation.js)6.05KB2.52KB
collaboration (useCommentSearch.js)1.98KB0.88KB
collaboration (useConflictResolution.js)7.75KB1.86KB
collaboration (useMentionNotifications.js)1.81KB0.68KB
collaboration (usePresence.js)6.33KB1.84KB
collaboration (useRealtimeSubscription.js)7.91KB2.01KB
components (index.js)516.24KB117.82KB
core (index.js)5.80KB2.32KB
create-plugin (index.js)10.08KB3.26KB
data-objectstack (index.js)178.20KB49.60KB
fields (index.js)244.08KB61.71KB
i18n (LocalizationContext.js)1.76KB0.96KB
i18n (currency.js)1.22KB0.64KB
i18n (fallbackInterpolation.js)6.25KB2.77KB
i18n (i18n.js)4.28KB1.75KB
i18n (index.js)3.44KB1.39KB
i18n (pickLocalized.js)7.62KB3.26KB
i18n (provider.js)26.89KB9.04KB
i18n (useDisplayLocale.js)2.85KB1.45KB
i18n (useObjectLabel.js)33.40KB8.71KB
i18n (useSafeTranslation.js)5.60KB2.33KB
layout (index.js)38.98KB10.98KB
mobile (MobileProvider.js)0.92KB0.49KB
mobile (ResponsiveContainer.js)0.94KB0.38KB
mobile (breakpoints.js)1.51KB0.70KB
mobile (createOfflineDataSource.js)5.61KB1.75KB
mobile (index.js)1.55KB0.62KB
mobile (offlineQueue.js)3.91KB1.35KB
mobile (pwa.js)0.97KB0.49KB
mobile (serviceWorker.js)1.48KB0.62KB
mobile (serviceWorkerSource.js)3.41KB1.48KB
mobile (useBreakpoint.js)1.54KB0.65KB
mobile (useGesture.js)6.96KB1.98KB
mobile (useOfflineSync.js)1.99KB0.72KB
mobile (usePullToRefresh.js)2.53KB0.85KB
mobile (useResponsive.js)0.72KB0.42KB
mobile (useResponsiveConfig.js)1.37KB0.63KB
mobile (useSpecGesture.js)4.32KB1.64KB
mobile (useTouchTarget.js)1.01KB0.54KB
permissions (MePermissionsProvider.js)11.71KB4.29KB
permissions (PermissionContext.js)0.31KB0.25KB
permissions (PermissionGuard.js)0.89KB0.45KB
permissions (PermissionProvider.js)6.24KB2.16KB
permissions (discardProofCache.js)1.04KB0.55KB
permissions (evaluator.js)5.12KB1.74KB
permissions (index.js)0.93KB0.41KB
permissions (store.js)0.91KB0.42KB
permissions (useFieldPermissions.js)1.28KB0.53KB
permissions (usePermissions.js)4.83KB2.27KB
plugin-ai (index.js)15.75KB3.80KB
plugin-calendar (index.js)47.14KB13.02KB
plugin-charts (index.js)70.31KB19.55KB
plugin-chatbot (index.js)196.19KB46.43KB
plugin-dashboard (index.js)132.79KB34.62KB
plugin-designer (index.js)212.87KB43.19KB
plugin-detail (index.js)251.27KB64.20KB
plugin-editor (index.js)2.46KB1.10KB
plugin-form (index.js)132.87KB32.66KB
plugin-gantt (index.js)167.18KB40.94KB
plugin-grid (index.js)209.25KB56.71KB
plugin-kanban (index.js)53.21KB14.66KB
plugin-list (index.js)113.53KB27.66KB
plugin-map (index.js)20.20KB6.66KB
plugin-markdown (index.js)13.72KB4.69KB
plugin-report (index.js)43.51KB11.94KB
plugin-timeline (index.js)30.21KB8.66KB
plugin-tree (index.js)8.98KB3.08KB
plugin-view (index.js)85.90KB21.12KB
providers (DataSourceProvider.js)0.75KB0.39KB
providers (MetadataProvider.js)1.37KB0.59KB
providers (ThemeProvider.js)1.90KB0.85KB
providers (UploadProvider.js)11.66KB3.50KB
providers (index.js)0.45KB0.23KB
providers (types.js)0.01KB0.04KB
react-runtime (index.js)5.62KB2.34KB
react (LazyPluginLoader.js)4.47KB1.63KB
react (SchemaRenderer.js)81.07KB26.86KB
react (data-invalidation.js)5.05KB2.08KB
react (index.js)3.11KB1.48KB
react (schema-input.js)2.32KB1.24KB
react (spec-input.js)0.20KB0.18KB
sdui-parser (codegen.js)5.41KB2.34KB
sdui-parser (dashboard-widget-options.js)3.08KB1.30KB
sdui-parser (index.js)4.93KB2.24KB
sdui-parser (input-type.js)2.84KB1.40KB
sdui-parser (parse.js)20.57KB5.88KB
sdui-parser (provenance.js)3.66KB1.82KB
sdui-parser (types.js)0.28KB0.23KB
sdui-parser (validate.js)10.35KB3.60KB
types (ai.js)0.20KB0.17KB
types (api-types.js)0.20KB0.18KB
types (app.js)2.87KB0.99KB
types (base.js)0.20KB0.18KB
types (blocks.js)0.20KB0.18KB
types (complex.js)2.74KB1.41KB
types (crud.js)0.20KB0.18KB
types (dashboard-filter-alias.js)6.23KB2.74KB
types (data-display.js)3.75KB1.85KB
types (data-protocol.js)0.20KB0.19KB
types (data.js)0.20KB0.18KB
types (designer.js)1.85KB0.85KB
types (disclosure.js)0.20KB0.18KB
types (error-code.js)1.54KB0.88KB
types (feedback.js)0.20KB0.18KB
types (field-types.js)0.20KB0.18KB
types (form.js)0.20KB0.18KB
types (http-inflight.js)8.87KB3.73KB
types (http-retry.js)4.32KB2.02KB
types (icon-key-migration.js)4.26KB1.63KB
types (index.js)4.74KB2.25KB
types (layout.js)0.20KB0.18KB
types (managed-by.js)0.19KB0.18KB
types (mobile.js)2.59KB1.31KB
types (navigation.js)0.20KB0.18KB
types (objectql.js)0.20KB0.18KB
types (overlay.js)0.20KB0.18KB
types (permissions.js)0.20KB0.18KB
types (plugin-scope.js)0.20KB0.18KB
types (record-components.js)0.20KB0.19KB
types (record-semantics.js)1.28KB0.67KB
types (registry.js)0.20KB0.18KB
types (reports.js)0.20KB0.18KB
types (spec-report.js)5.05KB1.93KB
types (spec-ui-namespace.js)0.20KB0.19KB
types (system-fields.js)3.33KB1.54KB
types (theme.js)6.28KB2.87KB
types (ui-action.js)8.11KB3.32KB
types (views.js)0.20KB0.18KB
types (widget.js)0.20KB0.18KB

Size Limits

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

@os-salesClaude

Copy link
Copy Markdown
Collaborator

Test (shard 3/4) is red, and it is not this PR's — reasoning first, confirmation pending

Posted by the domain:devx seat (session session_019aCUUSwWefnbCJ4Xk1vqQW) reviewing batch 9. ⛔ Not flipping this PR ready while a check is red.

The failure:

AssertionError: expected [ '#abc' ] to deeply equal [ '#123456' ]
❯ packages/plugin-timeline/src/ObjectTimeline.colorFieldLadder-7243.test.tsx:109:72

Why it cannot be this diff's. This PR changes three .mdx documents, one package README, and scripts/check-doc-snippet-types.mjs. It contains zero runtime source and zero plugin-timeline files — measured, not assumed: git diff --name-only against the merge base lists 5 files, none under packages/plugin-timeline/. check-doc-snippet-types.mjs is executed only by the documentation gates, never by a component test. There is no path by which markdown or a docs gate can change what colorsFor('accent', …) returns.

The failure shape says the same thing. Line 109 is the second of a pair:

expect(awaitcolorsFor('accent',[{ ...ROW,accent: '#abc'}])).toEqual(['#abc']);// passesexpect(awaitcolorsFor('accent',[{ ...ROW,accent: '#123456'}])).toEqual(['#123456']);// returns ['#abc']

The second call returned the first call's value. That is state leaking across two invocations inside one test — a caching or async-settlement defect, the classic shape of a nondeterministic failure. It is not a wrong expectation, and it is not something a docs change can reach.

Provenance: the test arrived with e75f4c986 — "fix(gantt,calendar,timeline): resolve colorField through one shared ladder (#7338)". A shared resolution ladder is exactly the kind of change that introduces cross-call memoisation.

No fix exists to port. I searched for an existing card covering this test or this symptom and found none (the search returned a live, non-empty result set, so the empty match on this symptom is a real negative rather than a silently-zeroed query). Filing it as a finding so it is owned rather than absorbed.

⛔ Not doing, and saying so explicitly: not skipping, disabling, quarantining or retrying this test into green, and not touching plugin-timeline from a docs PR to make my own PR pass.

Next: one re-run of the failed job, which is the single re-run this failure is entitled to. It is currently refused with "This workflow is already running" (shards 1 and 4 are still in flight), so it will be spent once the run completes. If it comes back green, this was nondeterministic and the finding stands on its own; if it reproduces identically, the failure is real and still not this PR's — and it then blocks every PR in the repo, not just this one, which makes it the more urgent item.


Generated by Claude Code

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentationImprovements or additions to documentationplugin

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@os-sales@claude
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

docs(plugin-report,docs): shrink UNGATED_DOCS by four — plugin-report README plus the last three .mdx entries - #7458

Merged
os-sales merged 2 commits into
mainfrom
claude/issue-5174-ungated-docs-batch9
Sep 3, 2026
Merged

docs(plugin-report,docs): shrink UNGATED_DOCS by four — plugin-report README plus the last three .mdx entries#7458
os-sales merged 2 commits into
mainfrom
claude/issue-5174-ungated-docs-batch9

Conversation

@claude

@claudeclaudeBot commented Sep 3, 2026

Copy link
Copy Markdown
Contributor

Part of #5174 — batch 9 of the UNGATED_DOCS shrink. The card stays open; this
removes four of its entries.

All figures below are at b701323ec, the final commit, after merging
origin/maind88e20f55. Exit codes were captured by redirect before any
pipe, and every gate line quotes the gate's own printed verdict.

What this removes, and what it bought

ledger entry removedblockscompiledeclared
packages/plugin-report/README.md13130
content/docs/plugins/plugin-detail.mdx770
content/docs/plugins/plugin-calendar-view.mdx211
content/docs/utilities/create-plugin.mdx101
total23212

37 diagnostics cleared (17 on the README, 20 across the three pages). Only the
two honest routes were used — compile against the built dist/, or a
FRAGMENT_MARKER whose reason names the diagnostics it was measured from. No
third route, no ledger addition, and no block made vacuous to get it green.

Ledger invariants, asserted mechanically

Both copies of the gate were imported side by side and evaluated over the same
working tree
, so the covered-set delta is attributable to the ledger alone:

LEDGER entry count: 32 -> 28
ADDED entries: []
REMOVED entries: ["content/docs/plugins/plugin-calendar-view.mdx",
"content/docs/plugins/plugin-detail.mdx",
"content/docs/utilities/create-plugin.mdx",
"packages/plugin-report/README.md"]
surviving entries whose REASON TEXT changed: []
COVERED documents: 195 -> 199 STRICTLY GROWS: true
previously-covered docs now UNGATED: []
blocks to compile : 411 -> 432
declared fragments : 155 -> 157
covered blocks : 566 -> 589
build filters : 25 -> 26 ADDED: ["--filter=@object-ui/plugin-report..."]

git diff --numstat origin/main...HEAD on the gate file reads 0 11
0 additions, 11 deletions. The hunk is removals only.

Strictness proven byte for byte: everything from the Fence scanning banner
to EOF is identical on both sides — 795 lines, sha256
d203debfa0073ccdb527a08e1e191b2d04b4cc00c5303ee27d4bfc76d09c7241 on
origin/main and on this branch. Nothing about how the gate judges a block
moved; only the list of documents it is allowed to skip.

The gate, before and after

BEFORE (origin/main d88e20f55's ledger, same tree)
195 covered, 32 ungated · 566 covered blocks — 411 to compile, 155 fragments
AFTER (this branch, node scripts/check-doc-snippet-types.mjs -> exit 0)
Scanned 227 document(s): 199 covered (97 of them hold a ts/tsx block), 28 ungated
Covered blocks: 589 — 432 to compile, 157 declared fragment(s).
Syntax phase: every block parsed, so every one of them reached the semantic phase.
Semantic phase: 432 of 432 block(s) judged, 0 failed.
Every covered documentation snippet compiles against the built types.

Controls all held: resolution landed on
/home/user/objectui-issue-5174-b9/packages/types/dist/index.d.ts (this
worktree's built artifact), sentinel TS2305, positive control 0 diagnostics,
undeclared control TS2307.

Per document — what changed, and why it is honest

packages/plugin-report/README.md — 13 blocks, all 13 compile

17 diagnostics: TS2304x15, TS2552x1, TS1108x1. Every one was a block using an
ambient name the page never defined, and the page's own prose already said so
("dataSource and router are host-provided"). Those names are now declared
against the shipped types
rather than floating — the pattern
packages/data-objectstack/README.md and packages/plugin-view/README.md
already use:

  • dataSource / ds / myAdapter as DataSource, router as
    { push: (href: string) => void }, reportDefinition / report as
    ReportComponentSchema or SpecReport depending on which renderer the block
    addresses, rows as Array of Record of string to unknown, refetch and
    notify as their real callback shapes.
  • The stored-document example (isDatasetReport(stored)) held a bare return
    at top level (TS1108). It is now a component function, which also puts the
    isDatasetReport narrowing under the compiler: unknown narrows to the
    renderer's report type, and that is checked.
  • The one block that was worse than broken: the filter-time date helper
    ended in runtimeFilter: { close_date: { $gte: daysAgo(30) } }. TypeScript
    parses that as a labelled block statement, so it would have compiled green
    with any spelling at all — covering it as written would have bought nothing.
    It is now a real defineReport call, and defineReport takes
    z.input of a strict ReportSchema, so the key is genuinely checked (probe 1
    below).
  • One JSX-bearing ts fence is now tsx. The gate parses every block as TSX
    regardless of the label, so this changes no verdict — it is a mislabel
    correction for the reader, in the direction that keeps the block collected.

content/docs/plugins/plugin-detail.mdx — 7 blocks, all 7 compile

16 diagnostics. Five blocks continued an earlier block; they now carry their own
imports and declarations. Two findings worth naming:

  • A real defect, fixed: the Console-integration example did
    const comments = await dataSource.find('sys_comment', ...) and then
    comments.map(...). DataSource.find resolves to Promise of
    QueryResult, which is { data: T[], total?, ... } — not an array. The rows
    are comments.data. Measured as TS2339 by probe 2.
  • The Filter Modes block restated the FeedFilterMode union beside the
    declared one, where nothing compared them. It now restates it against
    FeedFilterMode as imported from @object-ui/plugin-detail, so a typo or a
    retired member fails (probe 3). The four members are unchanged and still
    visible to the reader.

content/docs/plugins/plugin-calendar-view.mdx — 1 compiles, 1 declared

The "After" block names @object-ui/plugin-calendar and compiles. The "Before"
block quotes the retired @object-ui/plugin-calendar-view specifier on
purpose
— it is the before half of a migration guide — so it carries a
FRAGMENT_MARKER naming its measured TS2882 + TS2307. Repairing it would delete
the thing the section documents. This is exactly the disposition the removed
ledger entry itself predicted.

content/docs/utilities/create-plugin.mdx — 1 block, declared

React.lazy(() => import('./HeavyImpl')) points at a module in the reader's
own
plugin, which cannot exist beside this page (TS2307), and React is the
UMD global a one-line excerpt does not import (TS2686). Declared with both
measured; importing our way out would make the snippet about this repository
rather than about the plugin the reader is scaffolding.

Non-vacuity — six probes, direction predicted before each run

A newly covered document that cannot fail the gate has bought nothing, so each
probe was planted, proved on disk (the injected text counted, the removed
text counted, and git hash-object shown to differ from the HEAD blob), run,
then restored with git checkout HEAD -- ABSOLUTE_PATH under a
SIGTERM/SIGINT/exit trap, and the restore proved by an empty
git diff HEADand a blob hash equal to the HEAD blob. No rebuild sits
between mutation and reading: the mutation is markdown the gate reads straight
from disk, and the dist/ it compiles against is untouched.

#probepredictedobserved
1runtimeFilter misspelled in the new defineReportREDRED — TS2561, "Did you mean to write 'runtimeFilter'?"
2comments.data.map reverted to comments.mapREDRED — TS2339 Property 'map' does not exist on type 'QueryResult of any'
3'archived_only' added to the restated unionREDRED — TS2322 against the declared four
4wrong top-level key on an annotated ReportComponentSchema literalGREENGREEN — 0 failed
5the same wrong key one level down, inside ReportFieldREDRED — TS2561 'labell' does not exist in type 'ReportField'
6the calendar-view fragment marker disabledREDRED — the TS2882 + TS2307 its reason names

All six matched, including the direction of probe 4.

What the green does not mean

Probe 4 is the honest half. BaseSchema declares [key: string]: any, so a
wrong top-level key on any schema literal that extends it is invisible to
this gate — measured, not assumed. Probe 5 shows the floor: one level down, in a
type that does not extend BaseSchema (ReportField), excess-property checking
bites normally. Discharged by declaration check rather than left unknown: every
top-level key on the annotated literals in these blocks
(type, title, fields, schedule) is a declared member of
ReportComponentSchema, so nothing on these pages rides the index signature.
The defineReport calls are not affected at all — ReportSchema is strict, so
probe 1 reds at the top level.

Probe 6 is the fragment half: a declared fragment is not compiled, so the only
thing standing behind it is its written reason. Disabling the marker shows the
reason is true — the two diagnostics it names are the two the gate reports.

Gates and tests, all at b701323ec

commandexitverdict line
node scripts/check-doc-snippet-types.mjs0Every covered documentation snippet compiles against the built types.
node scripts/check-doc-fence-languages.mjs0every TypeScript block in 227 document(s) is fenced ts/tsx/typescript, except 80 declared file(s) carrying 90 block(s)
node scripts/check-doc-component-types.mjs0Every documented component type is registered.
node scripts/check-doc-links.mjs0Links are valid across 17 scan roots.
node scripts/check-control-bytes.mjs0OK (scanned 6140 tracked text file(s); skipped 85 binary)
node scripts/check-readme-exports.mjs0406 self-imports judged (406 real, 0 wrong-path, 0 fabricated)
node scripts/check-skill-examples.mjs0Every marked skill example holds up against the built types.
node scripts/check-changeset-presence.mjs0No source or published contract of a released package changed in this range, so no changeset is owed.
pnpm exec vitest run --maxWorkers=2 (15 suites, repo root)0Test Files 15 passed (15) / Tests 489 passed (489)
pnpm run lint:root032 problems (0 errors, 32 warnings) — all pre-existing

The check-doc-fences / check-doc-snippets walk-equality pin couples the three
doc gates, and all three are green above.

Changeset: none owed, and the verdict is the gate's, not a guess. A
packages/*/README.md does ship inside the package's files, so it was checked
rather than assumed: check-changeset-presence compared the tree with the
merge-base d88e20f55 and reports 5 files changed, 0 of them published source of
a package the release covers. Verdict followed; none added. No label was applied —
in objectui skip-changeset is a historical mis-mount that no workflow reads and
a pin test forbids applying.

Test suite selection re-derived at the merged head, not inherited:
git grep -l for the gate's name plus for each edited document and the sibling
README gate, which is 15 files including check-skill-examples.test.ts that
landed on main mid-run. vitest ran from the repo root, never through
pnpm --filter ... exec vitest.

One NOT MEASURED, corrected rather than reported as red: the first run of
check-readme-exports exited 1 with 3 findings, all the string "its type entry
./dist/index.d.ts is not on disk" for plugin-ai, none naming a file in this
diff — a missing precondition, not a verdict. Building that closure made it a
real measurement. The same half-built tree then failed two cases in
check-readme-exports.test.ts, which branch on packagesUnbuilt === 0 and are
written for a cleanly built or cleanly unbuilt tree; building the last unbuilt
package (plugin-tree) put the tree in one of those two states and the suite is
green, 489/489.

Build: serialised through the shared verify lock
(OS_VERIFY_LOCK_SLOT=issue-5174-b9, set before the first attempt), VERDICT command-exit 0 on every run. Because turbo replays cached logs that can name
another worktree's paths, dist/index.d.ts presence was confirmed on disk in
this worktree
for all 26 build-filter packages before any gate result was
trusted (26/26 present).

Serial constraint

The seat declared this file's regions disjoint at region level rather than
serialising the whole file: this branch touches the UNGATED_DOCS object literal
only, while #7432 touched CONTROL_REAL_EXPORT, a one-line harness constant some
290 lines away. That declaration obliged a merge of origin/main before opening,
and #7432landed in the meantime. The merge was clean — no conflict, no
hand-ordering — and CONTROL_REAL_EXPORT now reads BaseSchema on this branch,
with the positive control still reporting 0 diagnostics. Every number above was
re-taken after that merge. #7449, which moved the three gates' scan roots and put
an ownership-map block beside this ledger, is also on main and is included;
none of batch 8's figures were reused.

⛔ Excluded on the standing ruling, and named so the boundary is explicit:
packages/plugin-gantt/README.md and packages/plugin-kanban/README.md are
owned by #7302 / PARTIAL_EXCERPTS and are untouched here. plugin-gantt is the
largest entry left in the ledger by fence count (18), so it is exactly the
neighbour the exclusion exists for.

Ledger after this batch

28 entries: 0 .mdx under content/docs, 27 package READMEs, plus the root
README.md. The .mdx half of this ledger is now empty.


Generated by Claude Code

os-salesand others added 2 commits September 3, 2026 06:41
… README plus the last three .mdx entries
Batch 9 of objectui#5174. Removes four entries from `UNGATED_DOCS` in
`scripts/check-doc-snippet-types.mjs` and makes the 23 blocks they were
hiding honest: 21 compile against the built `dist/`, 2 carry a
`FRAGMENT_MARKER` with a measured reason.
- packages/plugin-report/README.md — 13 blocks, all 13 compile. 17
diagnostics cleared. Host-provided names (`dataSource`, `router`, `ds`,
`stored`, `report`, `rows`, `refetch`, `myAdapter`, `notify`) are now
declared against the shipped types instead of floating; the stored-document
example became a component so its `return` sits in a function body; the
filter-time date helper, which parsed as a labelled block statement and so
verified nothing, is now a real `defineReport` call that checks
`runtimeFilter`; the JSX-bearing `ts` fence is `tsx`.
- content/docs/plugins/plugin-detail.mdx — 7 blocks, all 7 compile. Real
defect fixed: the Console-integration example called `.map` on the result of
`dataSource.find`, which resolves to a `QueryResult`, not an array — the rows
are `.data`. The Filter Modes block restated the `FeedFilterMode` union
beside the declared one; it now checks against it.
- content/docs/plugins/plugin-calendar-view.mdx — 2 blocks: the "After" block
compiles, the "Before" block declares a fragment (it quotes the retired
package on purpose).
- content/docs/utilities/create-plugin.mdx — 1 block, declared: it points at
`./HeavyImpl` in the reader's own plugin.
Ledger 32 to 28, removals only (0 additions, 11 deletions). Covered documents
196 to 200; covered blocks 577 to 600; compiled 421 to 442; declared fragments
156 to 158. Gate strictness byte-identical from the fence-scanning banner to
EOF (sha256 b633996e6b55f08870ce1046f6f432914ca72320da6ce257dcc19fe661d6f313
on both sides).
Part of #5174
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019aCUUSwWefnbCJ4Xk1vqQW
@github-actionsgithub-actionsBot added documentation Improvements or additions to documentation plugin labels Sep 3, 2026
@github-actions

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

MetricValueBudget
Eager closure (gzip, 48 chunks)3178.8 KB3191.4 KB
Main entry chunk (gzip)143.2 KB350 KB
Entry fileindex-Brm1fWPZ.js
StatusPASS

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

PackageSizeGzipped
app-shell (consoleActionDispatch.js)0.20KB0.19KB
app-shell (index.js)15.67KB5.75KB
app-shell (runtime-config.js)20.68KB7.36KB
app-shell (types.js)0.01KB0.04KB
app-shell (urlParams.js)10.06KB3.86KB
auth (ActiveOrganizationStorage.js)25.05KB9.16KB
auth (AuthContext.js)0.31KB0.24KB
auth (AuthGuard.js)2.07KB1.00KB
auth (AuthProvider.js)40.18KB10.59KB
auth (AuthShell.js)3.49KB1.40KB
auth (ForgotPasswordForm.js)12.21KB3.45KB
auth (LoginForm.js)18.15KB5.39KB
auth (PreviewBanner.js)0.90KB0.50KB
auth (RegisterForm.js)6.65KB2.22KB
auth (SocialSignInButtons.js)9.61KB3.89KB
auth (UserMenu.js)3.41KB1.23KB
auth (auth-gate-events.js)1.29KB0.66KB
auth (authStyles.js)5.04KB1.72KB
auth (createAuthClient.js)40.21KB10.80KB
auth (createAuthenticatedFetch.js)8.46KB3.43KB
auth (index.js)3.19KB1.44KB
auth (invitation-status.js)1.22KB0.70KB
auth (org-roles.js)6.66KB2.78KB
auth (phone-identifier.js)1.11KB0.66KB
auth (types.js)0.59KB0.35KB
auth (useAuth.js)5.30KB1.02KB
auth (useWorkspaceAdminStatus.js)5.13KB2.35KB
collaboration (CommentThread.js)26.08KB7.56KB
collaboration (LiveCursors.js)3.17KB1.27KB
collaboration (PresenceAvatars.js)6.49KB2.64KB
collaboration (PresenceProvider.js)2.79KB1.13KB
collaboration (index.js)1.68KB0.73KB
collaboration (useCollaborationTranslation.js)6.05KB2.52KB
collaboration (useCommentSearch.js)1.98KB0.88KB
collaboration (useConflictResolution.js)7.75KB1.86KB
collaboration (useMentionNotifications.js)1.81KB0.68KB
collaboration (usePresence.js)6.33KB1.84KB
collaboration (useRealtimeSubscription.js)7.91KB2.01KB
components (index.js)516.24KB117.82KB
core (index.js)5.80KB2.32KB
create-plugin (index.js)10.08KB3.26KB
data-objectstack (index.js)178.20KB49.60KB
fields (index.js)244.08KB61.71KB
i18n (LocalizationContext.js)1.76KB0.96KB
i18n (currency.js)1.22KB0.64KB
i18n (fallbackInterpolation.js)6.25KB2.77KB
i18n (i18n.js)4.28KB1.75KB
i18n (index.js)3.44KB1.39KB
i18n (pickLocalized.js)7.62KB3.26KB
i18n (provider.js)26.89KB9.04KB
i18n (useDisplayLocale.js)2.85KB1.45KB
i18n (useObjectLabel.js)33.40KB8.71KB
i18n (useSafeTranslation.js)5.60KB2.33KB
layout (index.js)38.98KB10.98KB
mobile (MobileProvider.js)0.92KB0.49KB
mobile (ResponsiveContainer.js)0.94KB0.38KB
mobile (breakpoints.js)1.51KB0.70KB
mobile (createOfflineDataSource.js)5.61KB1.75KB
mobile (index.js)1.55KB0.62KB
mobile (offlineQueue.js)3.91KB1.35KB
mobile (pwa.js)0.97KB0.49KB
mobile (serviceWorker.js)1.48KB0.62KB
mobile (serviceWorkerSource.js)3.41KB1.48KB
mobile (useBreakpoint.js)1.54KB0.65KB
mobile (useGesture.js)6.96KB1.98KB
mobile (useOfflineSync.js)1.99KB0.72KB
mobile (usePullToRefresh.js)2.53KB0.85KB
mobile (useResponsive.js)0.72KB0.42KB
mobile (useResponsiveConfig.js)1.37KB0.63KB
mobile (useSpecGesture.js)4.32KB1.64KB
mobile (useTouchTarget.js)1.01KB0.54KB
permissions (MePermissionsProvider.js)11.71KB4.29KB
permissions (PermissionContext.js)0.31KB0.25KB
permissions (PermissionGuard.js)0.89KB0.45KB
permissions (PermissionProvider.js)6.24KB2.16KB
permissions (discardProofCache.js)1.04KB0.55KB
permissions (evaluator.js)5.12KB1.74KB
permissions (index.js)0.93KB0.41KB
permissions (store.js)0.91KB0.42KB
permissions (useFieldPermissions.js)1.28KB0.53KB
permissions (usePermissions.js)4.83KB2.27KB
plugin-ai (index.js)15.75KB3.80KB
plugin-calendar (index.js)47.14KB13.02KB
plugin-charts (index.js)70.31KB19.55KB
plugin-chatbot (index.js)196.19KB46.43KB
plugin-dashboard (index.js)132.79KB34.62KB
plugin-designer (index.js)212.87KB43.19KB
plugin-detail (index.js)251.27KB64.20KB
plugin-editor (index.js)2.46KB1.10KB
plugin-form (index.js)132.87KB32.66KB
plugin-gantt (index.js)167.18KB40.94KB
plugin-grid (index.js)209.25KB56.71KB
plugin-kanban (index.js)53.21KB14.66KB
plugin-list (index.js)113.53KB27.66KB
plugin-map (index.js)20.20KB6.66KB
plugin-markdown (index.js)13.72KB4.69KB
plugin-report (index.js)43.51KB11.94KB
plugin-timeline (index.js)30.21KB8.66KB
plugin-tree (index.js)8.98KB3.08KB
plugin-view (index.js)85.90KB21.12KB
providers (DataSourceProvider.js)0.75KB0.39KB
providers (MetadataProvider.js)1.37KB0.59KB
providers (ThemeProvider.js)1.90KB0.85KB
providers (UploadProvider.js)11.66KB3.50KB
providers (index.js)0.45KB0.23KB
providers (types.js)0.01KB0.04KB
react-runtime (index.js)5.62KB2.34KB
react (LazyPluginLoader.js)4.47KB1.63KB
react (SchemaRenderer.js)81.07KB26.86KB
react (data-invalidation.js)5.05KB2.08KB
react (index.js)3.11KB1.48KB
react (schema-input.js)2.32KB1.24KB
react (spec-input.js)0.20KB0.18KB
sdui-parser (codegen.js)5.41KB2.34KB
sdui-parser (dashboard-widget-options.js)3.08KB1.30KB
sdui-parser (index.js)4.93KB2.24KB
sdui-parser (input-type.js)2.84KB1.40KB
sdui-parser (parse.js)20.57KB5.88KB
sdui-parser (provenance.js)3.66KB1.82KB
sdui-parser (types.js)0.28KB0.23KB
sdui-parser (validate.js)10.35KB3.60KB
types (ai.js)0.20KB0.17KB
types (api-types.js)0.20KB0.18KB
types (app.js)2.87KB0.99KB
types (base.js)0.20KB0.18KB
types (blocks.js)0.20KB0.18KB
types (complex.js)2.74KB1.41KB
types (crud.js)0.20KB0.18KB
types (dashboard-filter-alias.js)6.23KB2.74KB
types (data-display.js)3.75KB1.85KB
types (data-protocol.js)0.20KB0.19KB
types (data.js)0.20KB0.18KB
types (designer.js)1.85KB0.85KB
types (disclosure.js)0.20KB0.18KB
types (error-code.js)1.54KB0.88KB
types (feedback.js)0.20KB0.18KB
types (field-types.js)0.20KB0.18KB
types (form.js)0.20KB0.18KB
types (http-inflight.js)8.87KB3.73KB
types (http-retry.js)4.32KB2.02KB
types (icon-key-migration.js)4.26KB1.63KB
types (index.js)4.74KB2.25KB
types (layout.js)0.20KB0.18KB
types (managed-by.js)0.19KB0.18KB
types (mobile.js)2.59KB1.31KB
types (navigation.js)0.20KB0.18KB
types (objectql.js)0.20KB0.18KB
types (overlay.js)0.20KB0.18KB
types (permissions.js)0.20KB0.18KB
types (plugin-scope.js)0.20KB0.18KB
types (record-components.js)0.20KB0.19KB
types (record-semantics.js)1.28KB0.67KB
types (registry.js)0.20KB0.18KB
types (reports.js)0.20KB0.18KB
types (spec-report.js)5.05KB1.93KB
types (spec-ui-namespace.js)0.20KB0.19KB
types (system-fields.js)3.33KB1.54KB
types (theme.js)6.28KB2.87KB
types (ui-action.js)8.11KB3.32KB
types (views.js)0.20KB0.18KB
types (widget.js)0.20KB0.18KB

Size Limits

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

@os-salesClaude

Copy link
Copy Markdown
Collaborator

Test (shard 3/4) is red, and it is not this PR's — reasoning first, confirmation pending

Posted by the domain:devx seat (session session_019aCUUSwWefnbCJ4Xk1vqQW) reviewing batch 9. ⛔ Not flipping this PR ready while a check is red.

The failure:

AssertionError: expected [ '#abc' ] to deeply equal [ '#123456' ]
❯ packages/plugin-timeline/src/ObjectTimeline.colorFieldLadder-7243.test.tsx:109:72

Why it cannot be this diff's. This PR changes three .mdx documents, one package README, and scripts/check-doc-snippet-types.mjs. It contains zero runtime source and zero plugin-timeline files — measured, not assumed: git diff --name-only against the merge base lists 5 files, none under packages/plugin-timeline/. check-doc-snippet-types.mjs is executed only by the documentation gates, never by a component test. There is no path by which markdown or a docs gate can change what colorsFor('accent', …) returns.

The failure shape says the same thing. Line 109 is the second of a pair:

expect(awaitcolorsFor('accent',[{ ...ROW,accent: '#abc'}])).toEqual(['#abc']);// passesexpect(awaitcolorsFor('accent',[{ ...ROW,accent: '#123456'}])).toEqual(['#123456']);// returns ['#abc']

The second call returned the first call's value. That is state leaking across two invocations inside one test — a caching or async-settlement defect, the classic shape of a nondeterministic failure. It is not a wrong expectation, and it is not something a docs change can reach.

Provenance: the test arrived with e75f4c986 — "fix(gantt,calendar,timeline): resolve colorField through one shared ladder (#7338)". A shared resolution ladder is exactly the kind of change that introduces cross-call memoisation.

No fix exists to port. I searched for an existing card covering this test or this symptom and found none (the search returned a live, non-empty result set, so the empty match on this symptom is a real negative rather than a silently-zeroed query). Filing it as a finding so it is owned rather than absorbed.

⛔ Not doing, and saying so explicitly: not skipping, disabling, quarantining or retrying this test into green, and not touching plugin-timeline from a docs PR to make my own PR pass.

Next: one re-run of the failed job, which is the single re-run this failure is entitled to. It is currently refused with "This workflow is already running" (shards 1 and 4 are still in flight), so it will be spent once the run completes. If it comes back green, this was nondeterministic and the finding stands on its own; if it reproduces identically, the failure is real and still not this PR's — and it then blocks every PR in the repo, not just this one, which makes it the more urgent item.


Generated by Claude Code

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentationImprovements or additions to documentationplugin

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@os-sales@claude
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

docs(plugin-report,docs): shrink UNGATED_DOCS by four — plugin-report README plus the last three .mdx entries - #7458

Merged
os-sales merged 2 commits into
mainfrom
claude/issue-5174-ungated-docs-batch9
Sep 3, 2026
Merged

docs(plugin-report,docs): shrink UNGATED_DOCS by four — plugin-report README plus the last three .mdx entries#7458
os-sales merged 2 commits into
mainfrom
claude/issue-5174-ungated-docs-batch9

Conversation

@claude

@claudeclaudeBot commented Sep 3, 2026

Copy link
Copy Markdown
Contributor

Part of #5174 — batch 9 of the UNGATED_DOCS shrink. The card stays open; this
removes four of its entries.

All figures below are at b701323ec, the final commit, after merging
origin/maind88e20f55. Exit codes were captured by redirect before any
pipe, and every gate line quotes the gate's own printed verdict.

What this removes, and what it bought

ledger entry removedblockscompiledeclared
packages/plugin-report/README.md13130
content/docs/plugins/plugin-detail.mdx770
content/docs/plugins/plugin-calendar-view.mdx211
content/docs/utilities/create-plugin.mdx101
total23212

37 diagnostics cleared (17 on the README, 20 across the three pages). Only the
two honest routes were used — compile against the built dist/, or a
FRAGMENT_MARKER whose reason names the diagnostics it was measured from. No
third route, no ledger addition, and no block made vacuous to get it green.

Ledger invariants, asserted mechanically

Both copies of the gate were imported side by side and evaluated over the same
working tree
, so the covered-set delta is attributable to the ledger alone:

LEDGER entry count: 32 -> 28
ADDED entries: []
REMOVED entries: ["content/docs/plugins/plugin-calendar-view.mdx",
"content/docs/plugins/plugin-detail.mdx",
"content/docs/utilities/create-plugin.mdx",
"packages/plugin-report/README.md"]
surviving entries whose REASON TEXT changed: []
COVERED documents: 195 -> 199 STRICTLY GROWS: true
previously-covered docs now UNGATED: []
blocks to compile : 411 -> 432
declared fragments : 155 -> 157
covered blocks : 566 -> 589
build filters : 25 -> 26 ADDED: ["--filter=@object-ui/plugin-report..."]

git diff --numstat origin/main...HEAD on the gate file reads 0 11
0 additions, 11 deletions. The hunk is removals only.

Strictness proven byte for byte: everything from the Fence scanning banner
to EOF is identical on both sides — 795 lines, sha256
d203debfa0073ccdb527a08e1e191b2d04b4cc00c5303ee27d4bfc76d09c7241 on
origin/main and on this branch. Nothing about how the gate judges a block
moved; only the list of documents it is allowed to skip.

The gate, before and after

BEFORE (origin/main d88e20f55's ledger, same tree)
195 covered, 32 ungated · 566 covered blocks — 411 to compile, 155 fragments
AFTER (this branch, node scripts/check-doc-snippet-types.mjs -> exit 0)
Scanned 227 document(s): 199 covered (97 of them hold a ts/tsx block), 28 ungated
Covered blocks: 589 — 432 to compile, 157 declared fragment(s).
Syntax phase: every block parsed, so every one of them reached the semantic phase.
Semantic phase: 432 of 432 block(s) judged, 0 failed.
Every covered documentation snippet compiles against the built types.

Controls all held: resolution landed on
/home/user/objectui-issue-5174-b9/packages/types/dist/index.d.ts (this
worktree's built artifact), sentinel TS2305, positive control 0 diagnostics,
undeclared control TS2307.

Per document — what changed, and why it is honest

packages/plugin-report/README.md — 13 blocks, all 13 compile

17 diagnostics: TS2304x15, TS2552x1, TS1108x1. Every one was a block using an
ambient name the page never defined, and the page's own prose already said so
("dataSource and router are host-provided"). Those names are now declared
against the shipped types
rather than floating — the pattern
packages/data-objectstack/README.md and packages/plugin-view/README.md
already use:

  • dataSource / ds / myAdapter as DataSource, router as
    { push: (href: string) => void }, reportDefinition / report as
    ReportComponentSchema or SpecReport depending on which renderer the block
    addresses, rows as Array of Record of string to unknown, refetch and
    notify as their real callback shapes.
  • The stored-document example (isDatasetReport(stored)) held a bare return
    at top level (TS1108). It is now a component function, which also puts the
    isDatasetReport narrowing under the compiler: unknown narrows to the
    renderer's report type, and that is checked.
  • The one block that was worse than broken: the filter-time date helper
    ended in runtimeFilter: { close_date: { $gte: daysAgo(30) } }. TypeScript
    parses that as a labelled block statement, so it would have compiled green
    with any spelling at all — covering it as written would have bought nothing.
    It is now a real defineReport call, and defineReport takes
    z.input of a strict ReportSchema, so the key is genuinely checked (probe 1
    below).
  • One JSX-bearing ts fence is now tsx. The gate parses every block as TSX
    regardless of the label, so this changes no verdict — it is a mislabel
    correction for the reader, in the direction that keeps the block collected.

content/docs/plugins/plugin-detail.mdx — 7 blocks, all 7 compile

16 diagnostics. Five blocks continued an earlier block; they now carry their own
imports and declarations. Two findings worth naming:

  • A real defect, fixed: the Console-integration example did
    const comments = await dataSource.find('sys_comment', ...) and then
    comments.map(...). DataSource.find resolves to Promise of
    QueryResult, which is { data: T[], total?, ... } — not an array. The rows
    are comments.data. Measured as TS2339 by probe 2.
  • The Filter Modes block restated the FeedFilterMode union beside the
    declared one, where nothing compared them. It now restates it against
    FeedFilterMode as imported from @object-ui/plugin-detail, so a typo or a
    retired member fails (probe 3). The four members are unchanged and still
    visible to the reader.

content/docs/plugins/plugin-calendar-view.mdx — 1 compiles, 1 declared

The "After" block names @object-ui/plugin-calendar and compiles. The "Before"
block quotes the retired @object-ui/plugin-calendar-view specifier on
purpose
— it is the before half of a migration guide — so it carries a
FRAGMENT_MARKER naming its measured TS2882 + TS2307. Repairing it would delete
the thing the section documents. This is exactly the disposition the removed
ledger entry itself predicted.

content/docs/utilities/create-plugin.mdx — 1 block, declared

React.lazy(() => import('./HeavyImpl')) points at a module in the reader's
own
plugin, which cannot exist beside this page (TS2307), and React is the
UMD global a one-line excerpt does not import (TS2686). Declared with both
measured; importing our way out would make the snippet about this repository
rather than about the plugin the reader is scaffolding.

Non-vacuity — six probes, direction predicted before each run

A newly covered document that cannot fail the gate has bought nothing, so each
probe was planted, proved on disk (the injected text counted, the removed
text counted, and git hash-object shown to differ from the HEAD blob), run,
then restored with git checkout HEAD -- ABSOLUTE_PATH under a
SIGTERM/SIGINT/exit trap, and the restore proved by an empty
git diff HEADand a blob hash equal to the HEAD blob. No rebuild sits
between mutation and reading: the mutation is markdown the gate reads straight
from disk, and the dist/ it compiles against is untouched.

#probepredictedobserved
1runtimeFilter misspelled in the new defineReportREDRED — TS2561, "Did you mean to write 'runtimeFilter'?"
2comments.data.map reverted to comments.mapREDRED — TS2339 Property 'map' does not exist on type 'QueryResult of any'
3'archived_only' added to the restated unionREDRED — TS2322 against the declared four
4wrong top-level key on an annotated ReportComponentSchema literalGREENGREEN — 0 failed
5the same wrong key one level down, inside ReportFieldREDRED — TS2561 'labell' does not exist in type 'ReportField'
6the calendar-view fragment marker disabledREDRED — the TS2882 + TS2307 its reason names

All six matched, including the direction of probe 4.

What the green does not mean

Probe 4 is the honest half. BaseSchema declares [key: string]: any, so a
wrong top-level key on any schema literal that extends it is invisible to
this gate — measured, not assumed. Probe 5 shows the floor: one level down, in a
type that does not extend BaseSchema (ReportField), excess-property checking
bites normally. Discharged by declaration check rather than left unknown: every
top-level key on the annotated literals in these blocks
(type, title, fields, schedule) is a declared member of
ReportComponentSchema, so nothing on these pages rides the index signature.
The defineReport calls are not affected at all — ReportSchema is strict, so
probe 1 reds at the top level.

Probe 6 is the fragment half: a declared fragment is not compiled, so the only
thing standing behind it is its written reason. Disabling the marker shows the
reason is true — the two diagnostics it names are the two the gate reports.

Gates and tests, all at b701323ec

commandexitverdict line
node scripts/check-doc-snippet-types.mjs0Every covered documentation snippet compiles against the built types.
node scripts/check-doc-fence-languages.mjs0every TypeScript block in 227 document(s) is fenced ts/tsx/typescript, except 80 declared file(s) carrying 90 block(s)
node scripts/check-doc-component-types.mjs0Every documented component type is registered.
node scripts/check-doc-links.mjs0Links are valid across 17 scan roots.
node scripts/check-control-bytes.mjs0OK (scanned 6140 tracked text file(s); skipped 85 binary)
node scripts/check-readme-exports.mjs0406 self-imports judged (406 real, 0 wrong-path, 0 fabricated)
node scripts/check-skill-examples.mjs0Every marked skill example holds up against the built types.
node scripts/check-changeset-presence.mjs0No source or published contract of a released package changed in this range, so no changeset is owed.
pnpm exec vitest run --maxWorkers=2 (15 suites, repo root)0Test Files 15 passed (15) / Tests 489 passed (489)
pnpm run lint:root032 problems (0 errors, 32 warnings) — all pre-existing

The check-doc-fences / check-doc-snippets walk-equality pin couples the three
doc gates, and all three are green above.

Changeset: none owed, and the verdict is the gate's, not a guess. A
packages/*/README.md does ship inside the package's files, so it was checked
rather than assumed: check-changeset-presence compared the tree with the
merge-base d88e20f55 and reports 5 files changed, 0 of them published source of
a package the release covers. Verdict followed; none added. No label was applied —
in objectui skip-changeset is a historical mis-mount that no workflow reads and
a pin test forbids applying.

Test suite selection re-derived at the merged head, not inherited:
git grep -l for the gate's name plus for each edited document and the sibling
README gate, which is 15 files including check-skill-examples.test.ts that
landed on main mid-run. vitest ran from the repo root, never through
pnpm --filter ... exec vitest.

One NOT MEASURED, corrected rather than reported as red: the first run of
check-readme-exports exited 1 with 3 findings, all the string "its type entry
./dist/index.d.ts is not on disk" for plugin-ai, none naming a file in this
diff — a missing precondition, not a verdict. Building that closure made it a
real measurement. The same half-built tree then failed two cases in
check-readme-exports.test.ts, which branch on packagesUnbuilt === 0 and are
written for a cleanly built or cleanly unbuilt tree; building the last unbuilt
package (plugin-tree) put the tree in one of those two states and the suite is
green, 489/489.

Build: serialised through the shared verify lock
(OS_VERIFY_LOCK_SLOT=issue-5174-b9, set before the first attempt), VERDICT command-exit 0 on every run. Because turbo replays cached logs that can name
another worktree's paths, dist/index.d.ts presence was confirmed on disk in
this worktree
for all 26 build-filter packages before any gate result was
trusted (26/26 present).

Serial constraint

The seat declared this file's regions disjoint at region level rather than
serialising the whole file: this branch touches the UNGATED_DOCS object literal
only, while #7432 touched CONTROL_REAL_EXPORT, a one-line harness constant some
290 lines away. That declaration obliged a merge of origin/main before opening,
and #7432landed in the meantime. The merge was clean — no conflict, no
hand-ordering — and CONTROL_REAL_EXPORT now reads BaseSchema on this branch,
with the positive control still reporting 0 diagnostics. Every number above was
re-taken after that merge. #7449, which moved the three gates' scan roots and put
an ownership-map block beside this ledger, is also on main and is included;
none of batch 8's figures were reused.

⛔ Excluded on the standing ruling, and named so the boundary is explicit:
packages/plugin-gantt/README.md and packages/plugin-kanban/README.md are
owned by #7302 / PARTIAL_EXCERPTS and are untouched here. plugin-gantt is the
largest entry left in the ledger by fence count (18), so it is exactly the
neighbour the exclusion exists for.

Ledger after this batch

28 entries: 0 .mdx under content/docs, 27 package READMEs, plus the root
README.md. The .mdx half of this ledger is now empty.


Generated by Claude Code

os-salesand others added 2 commits September 3, 2026 06:41
… README plus the last three .mdx entries
Batch 9 of objectui#5174. Removes four entries from `UNGATED_DOCS` in
`scripts/check-doc-snippet-types.mjs` and makes the 23 blocks they were
hiding honest: 21 compile against the built `dist/`, 2 carry a
`FRAGMENT_MARKER` with a measured reason.
- packages/plugin-report/README.md — 13 blocks, all 13 compile. 17
diagnostics cleared. Host-provided names (`dataSource`, `router`, `ds`,
`stored`, `report`, `rows`, `refetch`, `myAdapter`, `notify`) are now
declared against the shipped types instead of floating; the stored-document
example became a component so its `return` sits in a function body; the
filter-time date helper, which parsed as a labelled block statement and so
verified nothing, is now a real `defineReport` call that checks
`runtimeFilter`; the JSX-bearing `ts` fence is `tsx`.
- content/docs/plugins/plugin-detail.mdx — 7 blocks, all 7 compile. Real
defect fixed: the Console-integration example called `.map` on the result of
`dataSource.find`, which resolves to a `QueryResult`, not an array — the rows
are `.data`. The Filter Modes block restated the `FeedFilterMode` union
beside the declared one; it now checks against it.
- content/docs/plugins/plugin-calendar-view.mdx — 2 blocks: the "After" block
compiles, the "Before" block declares a fragment (it quotes the retired
package on purpose).
- content/docs/utilities/create-plugin.mdx — 1 block, declared: it points at
`./HeavyImpl` in the reader's own plugin.
Ledger 32 to 28, removals only (0 additions, 11 deletions). Covered documents
196 to 200; covered blocks 577 to 600; compiled 421 to 442; declared fragments
156 to 158. Gate strictness byte-identical from the fence-scanning banner to
EOF (sha256 b633996e6b55f08870ce1046f6f432914ca72320da6ce257dcc19fe661d6f313
on both sides).
Part of #5174
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019aCUUSwWefnbCJ4Xk1vqQW
@github-actionsgithub-actionsBot added documentation Improvements or additions to documentation plugin labels Sep 3, 2026
@github-actions

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

MetricValueBudget
Eager closure (gzip, 48 chunks)3178.8 KB3191.4 KB
Main entry chunk (gzip)143.2 KB350 KB
Entry fileindex-Brm1fWPZ.js
StatusPASS

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

PackageSizeGzipped
app-shell (consoleActionDispatch.js)0.20KB0.19KB
app-shell (index.js)15.67KB5.75KB
app-shell (runtime-config.js)20.68KB7.36KB
app-shell (types.js)0.01KB0.04KB
app-shell (urlParams.js)10.06KB3.86KB
auth (ActiveOrganizationStorage.js)25.05KB9.16KB
auth (AuthContext.js)0.31KB0.24KB
auth (AuthGuard.js)2.07KB1.00KB
auth (AuthProvider.js)40.18KB10.59KB
auth (AuthShell.js)3.49KB1.40KB
auth (ForgotPasswordForm.js)12.21KB3.45KB
auth (LoginForm.js)18.15KB5.39KB
auth (PreviewBanner.js)0.90KB0.50KB
auth (RegisterForm.js)6.65KB2.22KB
auth (SocialSignInButtons.js)9.61KB3.89KB
auth (UserMenu.js)3.41KB1.23KB
auth (auth-gate-events.js)1.29KB0.66KB
auth (authStyles.js)5.04KB1.72KB
auth (createAuthClient.js)40.21KB10.80KB
auth (createAuthenticatedFetch.js)8.46KB3.43KB
auth (index.js)3.19KB1.44KB
auth (invitation-status.js)1.22KB0.70KB
auth (org-roles.js)6.66KB2.78KB
auth (phone-identifier.js)1.11KB0.66KB
auth (types.js)0.59KB0.35KB
auth (useAuth.js)5.30KB1.02KB
auth (useWorkspaceAdminStatus.js)5.13KB2.35KB
collaboration (CommentThread.js)26.08KB7.56KB
collaboration (LiveCursors.js)3.17KB1.27KB
collaboration (PresenceAvatars.js)6.49KB2.64KB
collaboration (PresenceProvider.js)2.79KB1.13KB
collaboration (index.js)1.68KB0.73KB
collaboration (useCollaborationTranslation.js)6.05KB2.52KB
collaboration (useCommentSearch.js)1.98KB0.88KB
collaboration (useConflictResolution.js)7.75KB1.86KB
collaboration (useMentionNotifications.js)1.81KB0.68KB
collaboration (usePresence.js)6.33KB1.84KB
collaboration (useRealtimeSubscription.js)7.91KB2.01KB
components (index.js)516.24KB117.82KB
core (index.js)5.80KB2.32KB
create-plugin (index.js)10.08KB3.26KB
data-objectstack (index.js)178.20KB49.60KB
fields (index.js)244.08KB61.71KB
i18n (LocalizationContext.js)1.76KB0.96KB
i18n (currency.js)1.22KB0.64KB
i18n (fallbackInterpolation.js)6.25KB2.77KB
i18n (i18n.js)4.28KB1.75KB
i18n (index.js)3.44KB1.39KB
i18n (pickLocalized.js)7.62KB3.26KB
i18n (provider.js)26.89KB9.04KB
i18n (useDisplayLocale.js)2.85KB1.45KB
i18n (useObjectLabel.js)33.40KB8.71KB
i18n (useSafeTranslation.js)5.60KB2.33KB
layout (index.js)38.98KB10.98KB
mobile (MobileProvider.js)0.92KB0.49KB
mobile (ResponsiveContainer.js)0.94KB0.38KB
mobile (breakpoints.js)1.51KB0.70KB
mobile (createOfflineDataSource.js)5.61KB1.75KB
mobile (index.js)1.55KB0.62KB
mobile (offlineQueue.js)3.91KB1.35KB
mobile (pwa.js)0.97KB0.49KB
mobile (serviceWorker.js)1.48KB0.62KB
mobile (serviceWorkerSource.js)3.41KB1.48KB
mobile (useBreakpoint.js)1.54KB0.65KB
mobile (useGesture.js)6.96KB1.98KB
mobile (useOfflineSync.js)1.99KB0.72KB
mobile (usePullToRefresh.js)2.53KB0.85KB
mobile (useResponsive.js)0.72KB0.42KB
mobile (useResponsiveConfig.js)1.37KB0.63KB
mobile (useSpecGesture.js)4.32KB1.64KB
mobile (useTouchTarget.js)1.01KB0.54KB
permissions (MePermissionsProvider.js)11.71KB4.29KB
permissions (PermissionContext.js)0.31KB0.25KB
permissions (PermissionGuard.js)0.89KB0.45KB
permissions (PermissionProvider.js)6.24KB2.16KB
permissions (discardProofCache.js)1.04KB0.55KB
permissions (evaluator.js)5.12KB1.74KB
permissions (index.js)0.93KB0.41KB
permissions (store.js)0.91KB0.42KB
permissions (useFieldPermissions.js)1.28KB0.53KB
permissions (usePermissions.js)4.83KB2.27KB
plugin-ai (index.js)15.75KB3.80KB
plugin-calendar (index.js)47.14KB13.02KB
plugin-charts (index.js)70.31KB19.55KB
plugin-chatbot (index.js)196.19KB46.43KB
plugin-dashboard (index.js)132.79KB34.62KB
plugin-designer (index.js)212.87KB43.19KB
plugin-detail (index.js)251.27KB64.20KB
plugin-editor (index.js)2.46KB1.10KB
plugin-form (index.js)132.87KB32.66KB
plugin-gantt (index.js)167.18KB40.94KB
plugin-grid (index.js)209.25KB56.71KB
plugin-kanban (index.js)53.21KB14.66KB
plugin-list (index.js)113.53KB27.66KB
plugin-map (index.js)20.20KB6.66KB
plugin-markdown (index.js)13.72KB4.69KB
plugin-report (index.js)43.51KB11.94KB
plugin-timeline (index.js)30.21KB8.66KB
plugin-tree (index.js)8.98KB3.08KB
plugin-view (index.js)85.90KB21.12KB
providers (DataSourceProvider.js)0.75KB0.39KB
providers (MetadataProvider.js)1.37KB0.59KB
providers (ThemeProvider.js)1.90KB0.85KB
providers (UploadProvider.js)11.66KB3.50KB
providers (index.js)0.45KB0.23KB
providers (types.js)0.01KB0.04KB
react-runtime (index.js)5.62KB2.34KB
react (LazyPluginLoader.js)4.47KB1.63KB
react (SchemaRenderer.js)81.07KB26.86KB
react (data-invalidation.js)5.05KB2.08KB
react (index.js)3.11KB1.48KB
react (schema-input.js)2.32KB1.24KB
react (spec-input.js)0.20KB0.18KB
sdui-parser (codegen.js)5.41KB2.34KB
sdui-parser (dashboard-widget-options.js)3.08KB1.30KB
sdui-parser (index.js)4.93KB2.24KB
sdui-parser (input-type.js)2.84KB1.40KB
sdui-parser (parse.js)20.57KB5.88KB
sdui-parser (provenance.js)3.66KB1.82KB
sdui-parser (types.js)0.28KB0.23KB
sdui-parser (validate.js)10.35KB3.60KB
types (ai.js)0.20KB0.17KB
types (api-types.js)0.20KB0.18KB
types (app.js)2.87KB0.99KB
types (base.js)0.20KB0.18KB
types (blocks.js)0.20KB0.18KB
types (complex.js)2.74KB1.41KB
types (crud.js)0.20KB0.18KB
types (dashboard-filter-alias.js)6.23KB2.74KB
types (data-display.js)3.75KB1.85KB
types (data-protocol.js)0.20KB0.19KB
types (data.js)0.20KB0.18KB
types (designer.js)1.85KB0.85KB
types (disclosure.js)0.20KB0.18KB
types (error-code.js)1.54KB0.88KB
types (feedback.js)0.20KB0.18KB
types (field-types.js)0.20KB0.18KB
types (form.js)0.20KB0.18KB
types (http-inflight.js)8.87KB3.73KB
types (http-retry.js)4.32KB2.02KB
types (icon-key-migration.js)4.26KB1.63KB
types (index.js)4.74KB2.25KB
types (layout.js)0.20KB0.18KB
types (managed-by.js)0.19KB0.18KB
types (mobile.js)2.59KB1.31KB
types (navigation.js)0.20KB0.18KB
types (objectql.js)0.20KB0.18KB
types (overlay.js)0.20KB0.18KB
types (permissions.js)0.20KB0.18KB
types (plugin-scope.js)0.20KB0.18KB
types (record-components.js)0.20KB0.19KB
types (record-semantics.js)1.28KB0.67KB
types (registry.js)0.20KB0.18KB
types (reports.js)0.20KB0.18KB
types (spec-report.js)5.05KB1.93KB
types (spec-ui-namespace.js)0.20KB0.19KB
types (system-fields.js)3.33KB1.54KB
types (theme.js)6.28KB2.87KB
types (ui-action.js)8.11KB3.32KB
types (views.js)0.20KB0.18KB
types (widget.js)0.20KB0.18KB

Size Limits

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

@os-salesClaude

Copy link
Copy Markdown
Collaborator

Test (shard 3/4) is red, and it is not this PR's — reasoning first, confirmation pending

Posted by the domain:devx seat (session session_019aCUUSwWefnbCJ4Xk1vqQW) reviewing batch 9. ⛔ Not flipping this PR ready while a check is red.

The failure:

AssertionError: expected [ '#abc' ] to deeply equal [ '#123456' ]
❯ packages/plugin-timeline/src/ObjectTimeline.colorFieldLadder-7243.test.tsx:109:72

Why it cannot be this diff's. This PR changes three .mdx documents, one package README, and scripts/check-doc-snippet-types.mjs. It contains zero runtime source and zero plugin-timeline files — measured, not assumed: git diff --name-only against the merge base lists 5 files, none under packages/plugin-timeline/. check-doc-snippet-types.mjs is executed only by the documentation gates, never by a component test. There is no path by which markdown or a docs gate can change what colorsFor('accent', …) returns.

The failure shape says the same thing. Line 109 is the second of a pair:

expect(awaitcolorsFor('accent',[{ ...ROW,accent: '#abc'}])).toEqual(['#abc']);// passesexpect(awaitcolorsFor('accent',[{ ...ROW,accent: '#123456'}])).toEqual(['#123456']);// returns ['#abc']

The second call returned the first call's value. That is state leaking across two invocations inside one test — a caching or async-settlement defect, the classic shape of a nondeterministic failure. It is not a wrong expectation, and it is not something a docs change can reach.

Provenance: the test arrived with e75f4c986 — "fix(gantt,calendar,timeline): resolve colorField through one shared ladder (#7338)". A shared resolution ladder is exactly the kind of change that introduces cross-call memoisation.

No fix exists to port. I searched for an existing card covering this test or this symptom and found none (the search returned a live, non-empty result set, so the empty match on this symptom is a real negative rather than a silently-zeroed query). Filing it as a finding so it is owned rather than absorbed.

⛔ Not doing, and saying so explicitly: not skipping, disabling, quarantining or retrying this test into green, and not touching plugin-timeline from a docs PR to make my own PR pass.

Next: one re-run of the failed job, which is the single re-run this failure is entitled to. It is currently refused with "This workflow is already running" (shards 1 and 4 are still in flight), so it will be spent once the run completes. If it comes back green, this was nondeterministic and the finding stands on its own; if it reproduces identically, the failure is real and still not this PR's — and it then blocks every PR in the repo, not just this one, which makes it the more urgent item.


Generated by Claude Code

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentationImprovements or additions to documentationplugin

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@os-sales@claude
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

docs(plugin-report,docs): shrink UNGATED_DOCS by four — plugin-report README plus the last three .mdx entries - #7458

Merged
os-sales merged 2 commits into
mainfrom
claude/issue-5174-ungated-docs-batch9
Sep 3, 2026
Merged

docs(plugin-report,docs): shrink UNGATED_DOCS by four — plugin-report README plus the last three .mdx entries#7458
os-sales merged 2 commits into
mainfrom
claude/issue-5174-ungated-docs-batch9

Conversation

@claude

@claudeclaudeBot commented Sep 3, 2026

Copy link
Copy Markdown
Contributor

Part of #5174 — batch 9 of the UNGATED_DOCS shrink. The card stays open; this
removes four of its entries.

All figures below are at b701323ec, the final commit, after merging
origin/maind88e20f55. Exit codes were captured by redirect before any
pipe, and every gate line quotes the gate's own printed verdict.

What this removes, and what it bought

ledger entry removedblockscompiledeclared
packages/plugin-report/README.md13130
content/docs/plugins/plugin-detail.mdx770
content/docs/plugins/plugin-calendar-view.mdx211
content/docs/utilities/create-plugin.mdx101
total23212

37 diagnostics cleared (17 on the README, 20 across the three pages). Only the
two honest routes were used — compile against the built dist/, or a
FRAGMENT_MARKER whose reason names the diagnostics it was measured from. No
third route, no ledger addition, and no block made vacuous to get it green.

Ledger invariants, asserted mechanically

Both copies of the gate were imported side by side and evaluated over the same
working tree
, so the covered-set delta is attributable to the ledger alone:

LEDGER entry count: 32 -> 28
ADDED entries: []
REMOVED entries: ["content/docs/plugins/plugin-calendar-view.mdx",
"content/docs/plugins/plugin-detail.mdx",
"content/docs/utilities/create-plugin.mdx",
"packages/plugin-report/README.md"]
surviving entries whose REASON TEXT changed: []
COVERED documents: 195 -> 199 STRICTLY GROWS: true
previously-covered docs now UNGATED: []
blocks to compile : 411 -> 432
declared fragments : 155 -> 157
covered blocks : 566 -> 589
build filters : 25 -> 26 ADDED: ["--filter=@object-ui/plugin-report..."]

git diff --numstat origin/main...HEAD on the gate file reads 0 11
0 additions, 11 deletions. The hunk is removals only.

Strictness proven byte for byte: everything from the Fence scanning banner
to EOF is identical on both sides — 795 lines, sha256
d203debfa0073ccdb527a08e1e191b2d04b4cc00c5303ee27d4bfc76d09c7241 on
origin/main and on this branch. Nothing about how the gate judges a block
moved; only the list of documents it is allowed to skip.

The gate, before and after

BEFORE (origin/main d88e20f55's ledger, same tree)
195 covered, 32 ungated · 566 covered blocks — 411 to compile, 155 fragments
AFTER (this branch, node scripts/check-doc-snippet-types.mjs -> exit 0)
Scanned 227 document(s): 199 covered (97 of them hold a ts/tsx block), 28 ungated
Covered blocks: 589 — 432 to compile, 157 declared fragment(s).
Syntax phase: every block parsed, so every one of them reached the semantic phase.
Semantic phase: 432 of 432 block(s) judged, 0 failed.
Every covered documentation snippet compiles against the built types.

Controls all held: resolution landed on
/home/user/objectui-issue-5174-b9/packages/types/dist/index.d.ts (this
worktree's built artifact), sentinel TS2305, positive control 0 diagnostics,
undeclared control TS2307.

Per document — what changed, and why it is honest

packages/plugin-report/README.md — 13 blocks, all 13 compile

17 diagnostics: TS2304x15, TS2552x1, TS1108x1. Every one was a block using an
ambient name the page never defined, and the page's own prose already said so
("dataSource and router are host-provided"). Those names are now declared
against the shipped types
rather than floating — the pattern
packages/data-objectstack/README.md and packages/plugin-view/README.md
already use:

  • dataSource / ds / myAdapter as DataSource, router as
    { push: (href: string) => void }, reportDefinition / report as
    ReportComponentSchema or SpecReport depending on which renderer the block
    addresses, rows as Array of Record of string to unknown, refetch and
    notify as their real callback shapes.
  • The stored-document example (isDatasetReport(stored)) held a bare return
    at top level (TS1108). It is now a component function, which also puts the
    isDatasetReport narrowing under the compiler: unknown narrows to the
    renderer's report type, and that is checked.
  • The one block that was worse than broken: the filter-time date helper
    ended in runtimeFilter: { close_date: { $gte: daysAgo(30) } }. TypeScript
    parses that as a labelled block statement, so it would have compiled green
    with any spelling at all — covering it as written would have bought nothing.
    It is now a real defineReport call, and defineReport takes
    z.input of a strict ReportSchema, so the key is genuinely checked (probe 1
    below).
  • One JSX-bearing ts fence is now tsx. The gate parses every block as TSX
    regardless of the label, so this changes no verdict — it is a mislabel
    correction for the reader, in the direction that keeps the block collected.

content/docs/plugins/plugin-detail.mdx — 7 blocks, all 7 compile

16 diagnostics. Five blocks continued an earlier block; they now carry their own
imports and declarations. Two findings worth naming:

  • A real defect, fixed: the Console-integration example did
    const comments = await dataSource.find('sys_comment', ...) and then
    comments.map(...). DataSource.find resolves to Promise of
    QueryResult, which is { data: T[], total?, ... } — not an array. The rows
    are comments.data. Measured as TS2339 by probe 2.
  • The Filter Modes block restated the FeedFilterMode union beside the
    declared one, where nothing compared them. It now restates it against
    FeedFilterMode as imported from @object-ui/plugin-detail, so a typo or a
    retired member fails (probe 3). The four members are unchanged and still
    visible to the reader.

content/docs/plugins/plugin-calendar-view.mdx — 1 compiles, 1 declared

The "After" block names @object-ui/plugin-calendar and compiles. The "Before"
block quotes the retired @object-ui/plugin-calendar-view specifier on
purpose
— it is the before half of a migration guide — so it carries a
FRAGMENT_MARKER naming its measured TS2882 + TS2307. Repairing it would delete
the thing the section documents. This is exactly the disposition the removed
ledger entry itself predicted.

content/docs/utilities/create-plugin.mdx — 1 block, declared

React.lazy(() => import('./HeavyImpl')) points at a module in the reader's
own
plugin, which cannot exist beside this page (TS2307), and React is the
UMD global a one-line excerpt does not import (TS2686). Declared with both
measured; importing our way out would make the snippet about this repository
rather than about the plugin the reader is scaffolding.

Non-vacuity — six probes, direction predicted before each run

A newly covered document that cannot fail the gate has bought nothing, so each
probe was planted, proved on disk (the injected text counted, the removed
text counted, and git hash-object shown to differ from the HEAD blob), run,
then restored with git checkout HEAD -- ABSOLUTE_PATH under a
SIGTERM/SIGINT/exit trap, and the restore proved by an empty
git diff HEADand a blob hash equal to the HEAD blob. No rebuild sits
between mutation and reading: the mutation is markdown the gate reads straight
from disk, and the dist/ it compiles against is untouched.

#probepredictedobserved
1runtimeFilter misspelled in the new defineReportREDRED — TS2561, "Did you mean to write 'runtimeFilter'?"
2comments.data.map reverted to comments.mapREDRED — TS2339 Property 'map' does not exist on type 'QueryResult of any'
3'archived_only' added to the restated unionREDRED — TS2322 against the declared four
4wrong top-level key on an annotated ReportComponentSchema literalGREENGREEN — 0 failed
5the same wrong key one level down, inside ReportFieldREDRED — TS2561 'labell' does not exist in type 'ReportField'
6the calendar-view fragment marker disabledREDRED — the TS2882 + TS2307 its reason names

All six matched, including the direction of probe 4.

What the green does not mean

Probe 4 is the honest half. BaseSchema declares [key: string]: any, so a
wrong top-level key on any schema literal that extends it is invisible to
this gate — measured, not assumed. Probe 5 shows the floor: one level down, in a
type that does not extend BaseSchema (ReportField), excess-property checking
bites normally. Discharged by declaration check rather than left unknown: every
top-level key on the annotated literals in these blocks
(type, title, fields, schedule) is a declared member of
ReportComponentSchema, so nothing on these pages rides the index signature.
The defineReport calls are not affected at all — ReportSchema is strict, so
probe 1 reds at the top level.

Probe 6 is the fragment half: a declared fragment is not compiled, so the only
thing standing behind it is its written reason. Disabling the marker shows the
reason is true — the two diagnostics it names are the two the gate reports.

Gates and tests, all at b701323ec

commandexitverdict line
node scripts/check-doc-snippet-types.mjs0Every covered documentation snippet compiles against the built types.
node scripts/check-doc-fence-languages.mjs0every TypeScript block in 227 document(s) is fenced ts/tsx/typescript, except 80 declared file(s) carrying 90 block(s)
node scripts/check-doc-component-types.mjs0Every documented component type is registered.
node scripts/check-doc-links.mjs0Links are valid across 17 scan roots.
node scripts/check-control-bytes.mjs0OK (scanned 6140 tracked text file(s); skipped 85 binary)
node scripts/check-readme-exports.mjs0406 self-imports judged (406 real, 0 wrong-path, 0 fabricated)
node scripts/check-skill-examples.mjs0Every marked skill example holds up against the built types.
node scripts/check-changeset-presence.mjs0No source or published contract of a released package changed in this range, so no changeset is owed.
pnpm exec vitest run --maxWorkers=2 (15 suites, repo root)0Test Files 15 passed (15) / Tests 489 passed (489)
pnpm run lint:root032 problems (0 errors, 32 warnings) — all pre-existing

The check-doc-fences / check-doc-snippets walk-equality pin couples the three
doc gates, and all three are green above.

Changeset: none owed, and the verdict is the gate's, not a guess. A
packages/*/README.md does ship inside the package's files, so it was checked
rather than assumed: check-changeset-presence compared the tree with the
merge-base d88e20f55 and reports 5 files changed, 0 of them published source of
a package the release covers. Verdict followed; none added. No label was applied —
in objectui skip-changeset is a historical mis-mount that no workflow reads and
a pin test forbids applying.

Test suite selection re-derived at the merged head, not inherited:
git grep -l for the gate's name plus for each edited document and the sibling
README gate, which is 15 files including check-skill-examples.test.ts that
landed on main mid-run. vitest ran from the repo root, never through
pnpm --filter ... exec vitest.

One NOT MEASURED, corrected rather than reported as red: the first run of
check-readme-exports exited 1 with 3 findings, all the string "its type entry
./dist/index.d.ts is not on disk" for plugin-ai, none naming a file in this
diff — a missing precondition, not a verdict. Building that closure made it a
real measurement. The same half-built tree then failed two cases in
check-readme-exports.test.ts, which branch on packagesUnbuilt === 0 and are
written for a cleanly built or cleanly unbuilt tree; building the last unbuilt
package (plugin-tree) put the tree in one of those two states and the suite is
green, 489/489.

Build: serialised through the shared verify lock
(OS_VERIFY_LOCK_SLOT=issue-5174-b9, set before the first attempt), VERDICT command-exit 0 on every run. Because turbo replays cached logs that can name
another worktree's paths, dist/index.d.ts presence was confirmed on disk in
this worktree
for all 26 build-filter packages before any gate result was
trusted (26/26 present).

Serial constraint

The seat declared this file's regions disjoint at region level rather than
serialising the whole file: this branch touches the UNGATED_DOCS object literal
only, while #7432 touched CONTROL_REAL_EXPORT, a one-line harness constant some
290 lines away. That declaration obliged a merge of origin/main before opening,
and #7432landed in the meantime. The merge was clean — no conflict, no
hand-ordering — and CONTROL_REAL_EXPORT now reads BaseSchema on this branch,
with the positive control still reporting 0 diagnostics. Every number above was
re-taken after that merge. #7449, which moved the three gates' scan roots and put
an ownership-map block beside this ledger, is also on main and is included;
none of batch 8's figures were reused.

⛔ Excluded on the standing ruling, and named so the boundary is explicit:
packages/plugin-gantt/README.md and packages/plugin-kanban/README.md are
owned by #7302 / PARTIAL_EXCERPTS and are untouched here. plugin-gantt is the
largest entry left in the ledger by fence count (18), so it is exactly the
neighbour the exclusion exists for.

Ledger after this batch

28 entries: 0 .mdx under content/docs, 27 package READMEs, plus the root
README.md. The .mdx half of this ledger is now empty.


Generated by Claude Code

os-salesand others added 2 commits September 3, 2026 06:41
… README plus the last three .mdx entries
Batch 9 of objectui#5174. Removes four entries from `UNGATED_DOCS` in
`scripts/check-doc-snippet-types.mjs` and makes the 23 blocks they were
hiding honest: 21 compile against the built `dist/`, 2 carry a
`FRAGMENT_MARKER` with a measured reason.
- packages/plugin-report/README.md — 13 blocks, all 13 compile. 17
diagnostics cleared. Host-provided names (`dataSource`, `router`, `ds`,
`stored`, `report`, `rows`, `refetch`, `myAdapter`, `notify`) are now
declared against the shipped types instead of floating; the stored-document
example became a component so its `return` sits in a function body; the
filter-time date helper, which parsed as a labelled block statement and so
verified nothing, is now a real `defineReport` call that checks
`runtimeFilter`; the JSX-bearing `ts` fence is `tsx`.
- content/docs/plugins/plugin-detail.mdx — 7 blocks, all 7 compile. Real
defect fixed: the Console-integration example called `.map` on the result of
`dataSource.find`, which resolves to a `QueryResult`, not an array — the rows
are `.data`. The Filter Modes block restated the `FeedFilterMode` union
beside the declared one; it now checks against it.
- content/docs/plugins/plugin-calendar-view.mdx — 2 blocks: the "After" block
compiles, the "Before" block declares a fragment (it quotes the retired
package on purpose).
- content/docs/utilities/create-plugin.mdx — 1 block, declared: it points at
`./HeavyImpl` in the reader's own plugin.
Ledger 32 to 28, removals only (0 additions, 11 deletions). Covered documents
196 to 200; covered blocks 577 to 600; compiled 421 to 442; declared fragments
156 to 158. Gate strictness byte-identical from the fence-scanning banner to
EOF (sha256 b633996e6b55f08870ce1046f6f432914ca72320da6ce257dcc19fe661d6f313
on both sides).
Part of #5174
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019aCUUSwWefnbCJ4Xk1vqQW
@github-actionsgithub-actionsBot added documentation Improvements or additions to documentation plugin labels Sep 3, 2026
@github-actions

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

MetricValueBudget
Eager closure (gzip, 48 chunks)3178.8 KB3191.4 KB
Main entry chunk (gzip)143.2 KB350 KB
Entry fileindex-Brm1fWPZ.js
StatusPASS

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

PackageSizeGzipped
app-shell (consoleActionDispatch.js)0.20KB0.19KB
app-shell (index.js)15.67KB5.75KB
app-shell (runtime-config.js)20.68KB7.36KB
app-shell (types.js)0.01KB0.04KB
app-shell (urlParams.js)10.06KB3.86KB
auth (ActiveOrganizationStorage.js)25.05KB9.16KB
auth (AuthContext.js)0.31KB0.24KB
auth (AuthGuard.js)2.07KB1.00KB
auth (AuthProvider.js)40.18KB10.59KB
auth (AuthShell.js)3.49KB1.40KB
auth (ForgotPasswordForm.js)12.21KB3.45KB
auth (LoginForm.js)18.15KB5.39KB
auth (PreviewBanner.js)0.90KB0.50KB
auth (RegisterForm.js)6.65KB2.22KB
auth (SocialSignInButtons.js)9.61KB3.89KB
auth (UserMenu.js)3.41KB1.23KB
auth (auth-gate-events.js)1.29KB0.66KB
auth (authStyles.js)5.04KB1.72KB
auth (createAuthClient.js)40.21KB10.80KB
auth (createAuthenticatedFetch.js)8.46KB3.43KB
auth (index.js)3.19KB1.44KB
auth (invitation-status.js)1.22KB0.70KB
auth (org-roles.js)6.66KB2.78KB
auth (phone-identifier.js)1.11KB0.66KB
auth (types.js)0.59KB0.35KB
auth (useAuth.js)5.30KB1.02KB
auth (useWorkspaceAdminStatus.js)5.13KB2.35KB
collaboration (CommentThread.js)26.08KB7.56KB
collaboration (LiveCursors.js)3.17KB1.27KB
collaboration (PresenceAvatars.js)6.49KB2.64KB
collaboration (PresenceProvider.js)2.79KB1.13KB
collaboration (index.js)1.68KB0.73KB
collaboration (useCollaborationTranslation.js)6.05KB2.52KB
collaboration (useCommentSearch.js)1.98KB0.88KB
collaboration (useConflictResolution.js)7.75KB1.86KB
collaboration (useMentionNotifications.js)1.81KB0.68KB
collaboration (usePresence.js)6.33KB1.84KB
collaboration (useRealtimeSubscription.js)7.91KB2.01KB
components (index.js)516.24KB117.82KB
core (index.js)5.80KB2.32KB
create-plugin (index.js)10.08KB3.26KB
data-objectstack (index.js)178.20KB49.60KB
fields (index.js)244.08KB61.71KB
i18n (LocalizationContext.js)1.76KB0.96KB
i18n (currency.js)1.22KB0.64KB
i18n (fallbackInterpolation.js)6.25KB2.77KB
i18n (i18n.js)4.28KB1.75KB
i18n (index.js)3.44KB1.39KB
i18n (pickLocalized.js)7.62KB3.26KB
i18n (provider.js)26.89KB9.04KB
i18n (useDisplayLocale.js)2.85KB1.45KB
i18n (useObjectLabel.js)33.40KB8.71KB
i18n (useSafeTranslation.js)5.60KB2.33KB
layout (index.js)38.98KB10.98KB
mobile (MobileProvider.js)0.92KB0.49KB
mobile (ResponsiveContainer.js)0.94KB0.38KB
mobile (breakpoints.js)1.51KB0.70KB
mobile (createOfflineDataSource.js)5.61KB1.75KB
mobile (index.js)1.55KB0.62KB
mobile (offlineQueue.js)3.91KB1.35KB
mobile (pwa.js)0.97KB0.49KB
mobile (serviceWorker.js)1.48KB0.62KB
mobile (serviceWorkerSource.js)3.41KB1.48KB
mobile (useBreakpoint.js)1.54KB0.65KB
mobile (useGesture.js)6.96KB1.98KB
mobile (useOfflineSync.js)1.99KB0.72KB
mobile (usePullToRefresh.js)2.53KB0.85KB
mobile (useResponsive.js)0.72KB0.42KB
mobile (useResponsiveConfig.js)1.37KB0.63KB
mobile (useSpecGesture.js)4.32KB1.64KB
mobile (useTouchTarget.js)1.01KB0.54KB
permissions (MePermissionsProvider.js)11.71KB4.29KB
permissions (PermissionContext.js)0.31KB0.25KB
permissions (PermissionGuard.js)0.89KB0.45KB
permissions (PermissionProvider.js)6.24KB2.16KB
permissions (discardProofCache.js)1.04KB0.55KB
permissions (evaluator.js)5.12KB1.74KB
permissions (index.js)0.93KB0.41KB
permissions (store.js)0.91KB0.42KB
permissions (useFieldPermissions.js)1.28KB0.53KB
permissions (usePermissions.js)4.83KB2.27KB
plugin-ai (index.js)15.75KB3.80KB
plugin-calendar (index.js)47.14KB13.02KB
plugin-charts (index.js)70.31KB19.55KB
plugin-chatbot (index.js)196.19KB46.43KB
plugin-dashboard (index.js)132.79KB34.62KB
plugin-designer (index.js)212.87KB43.19KB
plugin-detail (index.js)251.27KB64.20KB
plugin-editor (index.js)2.46KB1.10KB
plugin-form (index.js)132.87KB32.66KB
plugin-gantt (index.js)167.18KB40.94KB
plugin-grid (index.js)209.25KB56.71KB
plugin-kanban (index.js)53.21KB14.66KB
plugin-list (index.js)113.53KB27.66KB
plugin-map (index.js)20.20KB6.66KB
plugin-markdown (index.js)13.72KB4.69KB
plugin-report (index.js)43.51KB11.94KB
plugin-timeline (index.js)30.21KB8.66KB
plugin-tree (index.js)8.98KB3.08KB
plugin-view (index.js)85.90KB21.12KB
providers (DataSourceProvider.js)0.75KB0.39KB
providers (MetadataProvider.js)1.37KB0.59KB
providers (ThemeProvider.js)1.90KB0.85KB
providers (UploadProvider.js)11.66KB3.50KB
providers (index.js)0.45KB0.23KB
providers (types.js)0.01KB0.04KB
react-runtime (index.js)5.62KB2.34KB
react (LazyPluginLoader.js)4.47KB1.63KB
react (SchemaRenderer.js)81.07KB26.86KB
react (data-invalidation.js)5.05KB2.08KB
react (index.js)3.11KB1.48KB
react (schema-input.js)2.32KB1.24KB
react (spec-input.js)0.20KB0.18KB
sdui-parser (codegen.js)5.41KB2.34KB
sdui-parser (dashboard-widget-options.js)3.08KB1.30KB
sdui-parser (index.js)4.93KB2.24KB
sdui-parser (input-type.js)2.84KB1.40KB
sdui-parser (parse.js)20.57KB5.88KB
sdui-parser (provenance.js)3.66KB1.82KB
sdui-parser (types.js)0.28KB0.23KB
sdui-parser (validate.js)10.35KB3.60KB
types (ai.js)0.20KB0.17KB
types (api-types.js)0.20KB0.18KB
types (app.js)2.87KB0.99KB
types (base.js)0.20KB0.18KB
types (blocks.js)0.20KB0.18KB
types (complex.js)2.74KB1.41KB
types (crud.js)0.20KB0.18KB
types (dashboard-filter-alias.js)6.23KB2.74KB
types (data-display.js)3.75KB1.85KB
types (data-protocol.js)0.20KB0.19KB
types (data.js)0.20KB0.18KB
types (designer.js)1.85KB0.85KB
types (disclosure.js)0.20KB0.18KB
types (error-code.js)1.54KB0.88KB
types (feedback.js)0.20KB0.18KB
types (field-types.js)0.20KB0.18KB
types (form.js)0.20KB0.18KB
types (http-inflight.js)8.87KB3.73KB
types (http-retry.js)4.32KB2.02KB
types (icon-key-migration.js)4.26KB1.63KB
types (index.js)4.74KB2.25KB
types (layout.js)0.20KB0.18KB
types (managed-by.js)0.19KB0.18KB
types (mobile.js)2.59KB1.31KB
types (navigation.js)0.20KB0.18KB
types (objectql.js)0.20KB0.18KB
types (overlay.js)0.20KB0.18KB
types (permissions.js)0.20KB0.18KB
types (plugin-scope.js)0.20KB0.18KB
types (record-components.js)0.20KB0.19KB
types (record-semantics.js)1.28KB0.67KB
types (registry.js)0.20KB0.18KB
types (reports.js)0.20KB0.18KB
types (spec-report.js)5.05KB1.93KB
types (spec-ui-namespace.js)0.20KB0.19KB
types (system-fields.js)3.33KB1.54KB
types (theme.js)6.28KB2.87KB
types (ui-action.js)8.11KB3.32KB
types (views.js)0.20KB0.18KB
types (widget.js)0.20KB0.18KB

Size Limits

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

@os-salesClaude

Copy link
Copy Markdown
Collaborator

Test (shard 3/4) is red, and it is not this PR's — reasoning first, confirmation pending

Posted by the domain:devx seat (session session_019aCUUSwWefnbCJ4Xk1vqQW) reviewing batch 9. ⛔ Not flipping this PR ready while a check is red.

The failure:

AssertionError: expected [ '#abc' ] to deeply equal [ '#123456' ]
❯ packages/plugin-timeline/src/ObjectTimeline.colorFieldLadder-7243.test.tsx:109:72

Why it cannot be this diff's. This PR changes three .mdx documents, one package README, and scripts/check-doc-snippet-types.mjs. It contains zero runtime source and zero plugin-timeline files — measured, not assumed: git diff --name-only against the merge base lists 5 files, none under packages/plugin-timeline/. check-doc-snippet-types.mjs is executed only by the documentation gates, never by a component test. There is no path by which markdown or a docs gate can change what colorsFor('accent', …) returns.

The failure shape says the same thing. Line 109 is the second of a pair:

expect(awaitcolorsFor('accent',[{ ...ROW,accent: '#abc'}])).toEqual(['#abc']);// passesexpect(awaitcolorsFor('accent',[{ ...ROW,accent: '#123456'}])).toEqual(['#123456']);// returns ['#abc']

The second call returned the first call's value. That is state leaking across two invocations inside one test — a caching or async-settlement defect, the classic shape of a nondeterministic failure. It is not a wrong expectation, and it is not something a docs change can reach.

Provenance: the test arrived with e75f4c986 — "fix(gantt,calendar,timeline): resolve colorField through one shared ladder (#7338)". A shared resolution ladder is exactly the kind of change that introduces cross-call memoisation.

No fix exists to port. I searched for an existing card covering this test or this symptom and found none (the search returned a live, non-empty result set, so the empty match on this symptom is a real negative rather than a silently-zeroed query). Filing it as a finding so it is owned rather than absorbed.

⛔ Not doing, and saying so explicitly: not skipping, disabling, quarantining or retrying this test into green, and not touching plugin-timeline from a docs PR to make my own PR pass.

Next: one re-run of the failed job, which is the single re-run this failure is entitled to. It is currently refused with "This workflow is already running" (shards 1 and 4 are still in flight), so it will be spent once the run completes. If it comes back green, this was nondeterministic and the finding stands on its own; if it reproduces identically, the failure is real and still not this PR's — and it then blocks every PR in the repo, not just this one, which makes it the more urgent item.


Generated by Claude Code

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentationImprovements or additions to documentationplugin

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@os-sales@claude
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

docs(plugin-report,docs): shrink UNGATED_DOCS by four — plugin-report README plus the last three .mdx entries - #7458

Merged
os-sales merged 2 commits into
mainfrom
claude/issue-5174-ungated-docs-batch9
Sep 3, 2026
Merged

docs(plugin-report,docs): shrink UNGATED_DOCS by four — plugin-report README plus the last three .mdx entries#7458
os-sales merged 2 commits into
mainfrom
claude/issue-5174-ungated-docs-batch9

Conversation

@claude

@claudeclaudeBot commented Sep 3, 2026

Copy link
Copy Markdown
Contributor

Part of #5174 — batch 9 of the UNGATED_DOCS shrink. The card stays open; this
removes four of its entries.

All figures below are at b701323ec, the final commit, after merging
origin/maind88e20f55. Exit codes were captured by redirect before any
pipe, and every gate line quotes the gate's own printed verdict.

What this removes, and what it bought

ledger entry removedblockscompiledeclared
packages/plugin-report/README.md13130
content/docs/plugins/plugin-detail.mdx770
content/docs/plugins/plugin-calendar-view.mdx211
content/docs/utilities/create-plugin.mdx101
total23212

37 diagnostics cleared (17 on the README, 20 across the three pages). Only the
two honest routes were used — compile against the built dist/, or a
FRAGMENT_MARKER whose reason names the diagnostics it was measured from. No
third route, no ledger addition, and no block made vacuous to get it green.

Ledger invariants, asserted mechanically

Both copies of the gate were imported side by side and evaluated over the same
working tree
, so the covered-set delta is attributable to the ledger alone:

LEDGER entry count: 32 -> 28
ADDED entries: []
REMOVED entries: ["content/docs/plugins/plugin-calendar-view.mdx",
"content/docs/plugins/plugin-detail.mdx",
"content/docs/utilities/create-plugin.mdx",
"packages/plugin-report/README.md"]
surviving entries whose REASON TEXT changed: []
COVERED documents: 195 -> 199 STRICTLY GROWS: true
previously-covered docs now UNGATED: []
blocks to compile : 411 -> 432
declared fragments : 155 -> 157
covered blocks : 566 -> 589
build filters : 25 -> 26 ADDED: ["--filter=@object-ui/plugin-report..."]

git diff --numstat origin/main...HEAD on the gate file reads 0 11
0 additions, 11 deletions. The hunk is removals only.

Strictness proven byte for byte: everything from the Fence scanning banner
to EOF is identical on both sides — 795 lines, sha256
d203debfa0073ccdb527a08e1e191b2d04b4cc00c5303ee27d4bfc76d09c7241 on
origin/main and on this branch. Nothing about how the gate judges a block
moved; only the list of documents it is allowed to skip.

The gate, before and after

BEFORE (origin/main d88e20f55's ledger, same tree)
195 covered, 32 ungated · 566 covered blocks — 411 to compile, 155 fragments
AFTER (this branch, node scripts/check-doc-snippet-types.mjs -> exit 0)
Scanned 227 document(s): 199 covered (97 of them hold a ts/tsx block), 28 ungated
Covered blocks: 589 — 432 to compile, 157 declared fragment(s).
Syntax phase: every block parsed, so every one of them reached the semantic phase.
Semantic phase: 432 of 432 block(s) judged, 0 failed.
Every covered documentation snippet compiles against the built types.

Controls all held: resolution landed on
/home/user/objectui-issue-5174-b9/packages/types/dist/index.d.ts (this
worktree's built artifact), sentinel TS2305, positive control 0 diagnostics,
undeclared control TS2307.

Per document — what changed, and why it is honest

packages/plugin-report/README.md — 13 blocks, all 13 compile

17 diagnostics: TS2304x15, TS2552x1, TS1108x1. Every one was a block using an
ambient name the page never defined, and the page's own prose already said so
("dataSource and router are host-provided"). Those names are now declared
against the shipped types
rather than floating — the pattern
packages/data-objectstack/README.md and packages/plugin-view/README.md
already use:

  • dataSource / ds / myAdapter as DataSource, router as
    { push: (href: string) => void }, reportDefinition / report as
    ReportComponentSchema or SpecReport depending on which renderer the block
    addresses, rows as Array of Record of string to unknown, refetch and
    notify as their real callback shapes.
  • The stored-document example (isDatasetReport(stored)) held a bare return
    at top level (TS1108). It is now a component function, which also puts the
    isDatasetReport narrowing under the compiler: unknown narrows to the
    renderer's report type, and that is checked.
  • The one block that was worse than broken: the filter-time date helper
    ended in runtimeFilter: { close_date: { $gte: daysAgo(30) } }. TypeScript
    parses that as a labelled block statement, so it would have compiled green
    with any spelling at all — covering it as written would have bought nothing.
    It is now a real defineReport call, and defineReport takes
    z.input of a strict ReportSchema, so the key is genuinely checked (probe 1
    below).
  • One JSX-bearing ts fence is now tsx. The gate parses every block as TSX
    regardless of the label, so this changes no verdict — it is a mislabel
    correction for the reader, in the direction that keeps the block collected.

content/docs/plugins/plugin-detail.mdx — 7 blocks, all 7 compile

16 diagnostics. Five blocks continued an earlier block; they now carry their own
imports and declarations. Two findings worth naming:

  • A real defect, fixed: the Console-integration example did
    const comments = await dataSource.find('sys_comment', ...) and then
    comments.map(...). DataSource.find resolves to Promise of
    QueryResult, which is { data: T[], total?, ... } — not an array. The rows
    are comments.data. Measured as TS2339 by probe 2.
  • The Filter Modes block restated the FeedFilterMode union beside the
    declared one, where nothing compared them. It now restates it against
    FeedFilterMode as imported from @object-ui/plugin-detail, so a typo or a
    retired member fails (probe 3). The four members are unchanged and still
    visible to the reader.

content/docs/plugins/plugin-calendar-view.mdx — 1 compiles, 1 declared

The "After" block names @object-ui/plugin-calendar and compiles. The "Before"
block quotes the retired @object-ui/plugin-calendar-view specifier on
purpose
— it is the before half of a migration guide — so it carries a
FRAGMENT_MARKER naming its measured TS2882 + TS2307. Repairing it would delete
the thing the section documents. This is exactly the disposition the removed
ledger entry itself predicted.

content/docs/utilities/create-plugin.mdx — 1 block, declared

React.lazy(() => import('./HeavyImpl')) points at a module in the reader's
own
plugin, which cannot exist beside this page (TS2307), and React is the
UMD global a one-line excerpt does not import (TS2686). Declared with both
measured; importing our way out would make the snippet about this repository
rather than about the plugin the reader is scaffolding.

Non-vacuity — six probes, direction predicted before each run

A newly covered document that cannot fail the gate has bought nothing, so each
probe was planted, proved on disk (the injected text counted, the removed
text counted, and git hash-object shown to differ from the HEAD blob), run,
then restored with git checkout HEAD -- ABSOLUTE_PATH under a
SIGTERM/SIGINT/exit trap, and the restore proved by an empty
git diff HEADand a blob hash equal to the HEAD blob. No rebuild sits
between mutation and reading: the mutation is markdown the gate reads straight
from disk, and the dist/ it compiles against is untouched.

#probepredictedobserved
1runtimeFilter misspelled in the new defineReportREDRED — TS2561, "Did you mean to write 'runtimeFilter'?"
2comments.data.map reverted to comments.mapREDRED — TS2339 Property 'map' does not exist on type 'QueryResult of any'
3'archived_only' added to the restated unionREDRED — TS2322 against the declared four
4wrong top-level key on an annotated ReportComponentSchema literalGREENGREEN — 0 failed
5the same wrong key one level down, inside ReportFieldREDRED — TS2561 'labell' does not exist in type 'ReportField'
6the calendar-view fragment marker disabledREDRED — the TS2882 + TS2307 its reason names

All six matched, including the direction of probe 4.

What the green does not mean

Probe 4 is the honest half. BaseSchema declares [key: string]: any, so a
wrong top-level key on any schema literal that extends it is invisible to
this gate — measured, not assumed. Probe 5 shows the floor: one level down, in a
type that does not extend BaseSchema (ReportField), excess-property checking
bites normally. Discharged by declaration check rather than left unknown: every
top-level key on the annotated literals in these blocks
(type, title, fields, schedule) is a declared member of
ReportComponentSchema, so nothing on these pages rides the index signature.
The defineReport calls are not affected at all — ReportSchema is strict, so
probe 1 reds at the top level.

Probe 6 is the fragment half: a declared fragment is not compiled, so the only
thing standing behind it is its written reason. Disabling the marker shows the
reason is true — the two diagnostics it names are the two the gate reports.

Gates and tests, all at b701323ec

commandexitverdict line
node scripts/check-doc-snippet-types.mjs0Every covered documentation snippet compiles against the built types.
node scripts/check-doc-fence-languages.mjs0every TypeScript block in 227 document(s) is fenced ts/tsx/typescript, except 80 declared file(s) carrying 90 block(s)
node scripts/check-doc-component-types.mjs0Every documented component type is registered.
node scripts/check-doc-links.mjs0Links are valid across 17 scan roots.
node scripts/check-control-bytes.mjs0OK (scanned 6140 tracked text file(s); skipped 85 binary)
node scripts/check-readme-exports.mjs0406 self-imports judged (406 real, 0 wrong-path, 0 fabricated)
node scripts/check-skill-examples.mjs0Every marked skill example holds up against the built types.
node scripts/check-changeset-presence.mjs0No source or published contract of a released package changed in this range, so no changeset is owed.
pnpm exec vitest run --maxWorkers=2 (15 suites, repo root)0Test Files 15 passed (15) / Tests 489 passed (489)
pnpm run lint:root032 problems (0 errors, 32 warnings) — all pre-existing

The check-doc-fences / check-doc-snippets walk-equality pin couples the three
doc gates, and all three are green above.

Changeset: none owed, and the verdict is the gate's, not a guess. A
packages/*/README.md does ship inside the package's files, so it was checked
rather than assumed: check-changeset-presence compared the tree with the
merge-base d88e20f55 and reports 5 files changed, 0 of them published source of
a package the release covers. Verdict followed; none added. No label was applied —
in objectui skip-changeset is a historical mis-mount that no workflow reads and
a pin test forbids applying.

Test suite selection re-derived at the merged head, not inherited:
git grep -l for the gate's name plus for each edited document and the sibling
README gate, which is 15 files including check-skill-examples.test.ts that
landed on main mid-run. vitest ran from the repo root, never through
pnpm --filter ... exec vitest.

One NOT MEASURED, corrected rather than reported as red: the first run of
check-readme-exports exited 1 with 3 findings, all the string "its type entry
./dist/index.d.ts is not on disk" for plugin-ai, none naming a file in this
diff — a missing precondition, not a verdict. Building that closure made it a
real measurement. The same half-built tree then failed two cases in
check-readme-exports.test.ts, which branch on packagesUnbuilt === 0 and are
written for a cleanly built or cleanly unbuilt tree; building the last unbuilt
package (plugin-tree) put the tree in one of those two states and the suite is
green, 489/489.

Build: serialised through the shared verify lock
(OS_VERIFY_LOCK_SLOT=issue-5174-b9, set before the first attempt), VERDICT command-exit 0 on every run. Because turbo replays cached logs that can name
another worktree's paths, dist/index.d.ts presence was confirmed on disk in
this worktree
for all 26 build-filter packages before any gate result was
trusted (26/26 present).

Serial constraint

The seat declared this file's regions disjoint at region level rather than
serialising the whole file: this branch touches the UNGATED_DOCS object literal
only, while #7432 touched CONTROL_REAL_EXPORT, a one-line harness constant some
290 lines away. That declaration obliged a merge of origin/main before opening,
and #7432landed in the meantime. The merge was clean — no conflict, no
hand-ordering — and CONTROL_REAL_EXPORT now reads BaseSchema on this branch,
with the positive control still reporting 0 diagnostics. Every number above was
re-taken after that merge. #7449, which moved the three gates' scan roots and put
an ownership-map block beside this ledger, is also on main and is included;
none of batch 8's figures were reused.

⛔ Excluded on the standing ruling, and named so the boundary is explicit:
packages/plugin-gantt/README.md and packages/plugin-kanban/README.md are
owned by #7302 / PARTIAL_EXCERPTS and are untouched here. plugin-gantt is the
largest entry left in the ledger by fence count (18), so it is exactly the
neighbour the exclusion exists for.

Ledger after this batch

28 entries: 0 .mdx under content/docs, 27 package READMEs, plus the root
README.md. The .mdx half of this ledger is now empty.


Generated by Claude Code

os-salesand others added 2 commits September 3, 2026 06:41
… README plus the last three .mdx entries
Batch 9 of objectui#5174. Removes four entries from `UNGATED_DOCS` in
`scripts/check-doc-snippet-types.mjs` and makes the 23 blocks they were
hiding honest: 21 compile against the built `dist/`, 2 carry a
`FRAGMENT_MARKER` with a measured reason.
- packages/plugin-report/README.md — 13 blocks, all 13 compile. 17
diagnostics cleared. Host-provided names (`dataSource`, `router`, `ds`,
`stored`, `report`, `rows`, `refetch`, `myAdapter`, `notify`) are now
declared against the shipped types instead of floating; the stored-document
example became a component so its `return` sits in a function body; the
filter-time date helper, which parsed as a labelled block statement and so
verified nothing, is now a real `defineReport` call that checks
`runtimeFilter`; the JSX-bearing `ts` fence is `tsx`.
- content/docs/plugins/plugin-detail.mdx — 7 blocks, all 7 compile. Real
defect fixed: the Console-integration example called `.map` on the result of
`dataSource.find`, which resolves to a `QueryResult`, not an array — the rows
are `.data`. The Filter Modes block restated the `FeedFilterMode` union
beside the declared one; it now checks against it.
- content/docs/plugins/plugin-calendar-view.mdx — 2 blocks: the "After" block
compiles, the "Before" block declares a fragment (it quotes the retired
package on purpose).
- content/docs/utilities/create-plugin.mdx — 1 block, declared: it points at
`./HeavyImpl` in the reader's own plugin.
Ledger 32 to 28, removals only (0 additions, 11 deletions). Covered documents
196 to 200; covered blocks 577 to 600; compiled 421 to 442; declared fragments
156 to 158. Gate strictness byte-identical from the fence-scanning banner to
EOF (sha256 b633996e6b55f08870ce1046f6f432914ca72320da6ce257dcc19fe661d6f313
on both sides).
Part of #5174
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019aCUUSwWefnbCJ4Xk1vqQW
@github-actionsgithub-actionsBot added documentation Improvements or additions to documentation plugin labels Sep 3, 2026
@github-actions

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

MetricValueBudget
Eager closure (gzip, 48 chunks)3178.8 KB3191.4 KB
Main entry chunk (gzip)143.2 KB350 KB
Entry fileindex-Brm1fWPZ.js
StatusPASS

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

PackageSizeGzipped
app-shell (consoleActionDispatch.js)0.20KB0.19KB
app-shell (index.js)15.67KB5.75KB
app-shell (runtime-config.js)20.68KB7.36KB
app-shell (types.js)0.01KB0.04KB
app-shell (urlParams.js)10.06KB3.86KB
auth (ActiveOrganizationStorage.js)25.05KB9.16KB
auth (AuthContext.js)0.31KB0.24KB
auth (AuthGuard.js)2.07KB1.00KB
auth (AuthProvider.js)40.18KB10.59KB
auth (AuthShell.js)3.49KB1.40KB
auth (ForgotPasswordForm.js)12.21KB3.45KB
auth (LoginForm.js)18.15KB5.39KB
auth (PreviewBanner.js)0.90KB0.50KB
auth (RegisterForm.js)6.65KB2.22KB
auth (SocialSignInButtons.js)9.61KB3.89KB
auth (UserMenu.js)3.41KB1.23KB
auth (auth-gate-events.js)1.29KB0.66KB
auth (authStyles.js)5.04KB1.72KB
auth (createAuthClient.js)40.21KB10.80KB
auth (createAuthenticatedFetch.js)8.46KB3.43KB
auth (index.js)3.19KB1.44KB
auth (invitation-status.js)1.22KB0.70KB
auth (org-roles.js)6.66KB2.78KB
auth (phone-identifier.js)1.11KB0.66KB
auth (types.js)0.59KB0.35KB
auth (useAuth.js)5.30KB1.02KB
auth (useWorkspaceAdminStatus.js)5.13KB2.35KB
collaboration (CommentThread.js)26.08KB7.56KB
collaboration (LiveCursors.js)3.17KB1.27KB
collaboration (PresenceAvatars.js)6.49KB2.64KB
collaboration (PresenceProvider.js)2.79KB1.13KB
collaboration (index.js)1.68KB0.73KB
collaboration (useCollaborationTranslation.js)6.05KB2.52KB
collaboration (useCommentSearch.js)1.98KB0.88KB
collaboration (useConflictResolution.js)7.75KB1.86KB
collaboration (useMentionNotifications.js)1.81KB0.68KB
collaboration (usePresence.js)6.33KB1.84KB
collaboration (useRealtimeSubscription.js)7.91KB2.01KB
components (index.js)516.24KB117.82KB
core (index.js)5.80KB2.32KB
create-plugin (index.js)10.08KB3.26KB
data-objectstack (index.js)178.20KB49.60KB
fields (index.js)244.08KB61.71KB
i18n (LocalizationContext.js)1.76KB0.96KB
i18n (currency.js)1.22KB0.64KB
i18n (fallbackInterpolation.js)6.25KB2.77KB
i18n (i18n.js)4.28KB1.75KB
i18n (index.js)3.44KB1.39KB
i18n (pickLocalized.js)7.62KB3.26KB
i18n (provider.js)26.89KB9.04KB
i18n (useDisplayLocale.js)2.85KB1.45KB
i18n (useObjectLabel.js)33.40KB8.71KB
i18n (useSafeTranslation.js)5.60KB2.33KB
layout (index.js)38.98KB10.98KB
mobile (MobileProvider.js)0.92KB0.49KB
mobile (ResponsiveContainer.js)0.94KB0.38KB
mobile (breakpoints.js)1.51KB0.70KB
mobile (createOfflineDataSource.js)5.61KB1.75KB
mobile (index.js)1.55KB0.62KB
mobile (offlineQueue.js)3.91KB1.35KB
mobile (pwa.js)0.97KB0.49KB
mobile (serviceWorker.js)1.48KB0.62KB
mobile (serviceWorkerSource.js)3.41KB1.48KB
mobile (useBreakpoint.js)1.54KB0.65KB
mobile (useGesture.js)6.96KB1.98KB
mobile (useOfflineSync.js)1.99KB0.72KB
mobile (usePullToRefresh.js)2.53KB0.85KB
mobile (useResponsive.js)0.72KB0.42KB
mobile (useResponsiveConfig.js)1.37KB0.63KB
mobile (useSpecGesture.js)4.32KB1.64KB
mobile (useTouchTarget.js)1.01KB0.54KB
permissions (MePermissionsProvider.js)11.71KB4.29KB
permissions (PermissionContext.js)0.31KB0.25KB
permissions (PermissionGuard.js)0.89KB0.45KB
permissions (PermissionProvider.js)6.24KB2.16KB
permissions (discardProofCache.js)1.04KB0.55KB
permissions (evaluator.js)5.12KB1.74KB
permissions (index.js)0.93KB0.41KB
permissions (store.js)0.91KB0.42KB
permissions (useFieldPermissions.js)1.28KB0.53KB
permissions (usePermissions.js)4.83KB2.27KB
plugin-ai (index.js)15.75KB3.80KB
plugin-calendar (index.js)47.14KB13.02KB
plugin-charts (index.js)70.31KB19.55KB
plugin-chatbot (index.js)196.19KB46.43KB
plugin-dashboard (index.js)132.79KB34.62KB
plugin-designer (index.js)212.87KB43.19KB
plugin-detail (index.js)251.27KB64.20KB
plugin-editor (index.js)2.46KB1.10KB
plugin-form (index.js)132.87KB32.66KB
plugin-gantt (index.js)167.18KB40.94KB
plugin-grid (index.js)209.25KB56.71KB
plugin-kanban (index.js)53.21KB14.66KB
plugin-list (index.js)113.53KB27.66KB
plugin-map (index.js)20.20KB6.66KB
plugin-markdown (index.js)13.72KB4.69KB
plugin-report (index.js)43.51KB11.94KB
plugin-timeline (index.js)30.21KB8.66KB
plugin-tree (index.js)8.98KB3.08KB
plugin-view (index.js)85.90KB21.12KB
providers (DataSourceProvider.js)0.75KB0.39KB
providers (MetadataProvider.js)1.37KB0.59KB
providers (ThemeProvider.js)1.90KB0.85KB
providers (UploadProvider.js)11.66KB3.50KB
providers (index.js)0.45KB0.23KB
providers (types.js)0.01KB0.04KB
react-runtime (index.js)5.62KB2.34KB
react (LazyPluginLoader.js)4.47KB1.63KB
react (SchemaRenderer.js)81.07KB26.86KB
react (data-invalidation.js)5.05KB2.08KB
react (index.js)3.11KB1.48KB
react (schema-input.js)2.32KB1.24KB
react (spec-input.js)0.20KB0.18KB
sdui-parser (codegen.js)5.41KB2.34KB
sdui-parser (dashboard-widget-options.js)3.08KB1.30KB
sdui-parser (index.js)4.93KB2.24KB
sdui-parser (input-type.js)2.84KB1.40KB
sdui-parser (parse.js)20.57KB5.88KB
sdui-parser (provenance.js)3.66KB1.82KB
sdui-parser (types.js)0.28KB0.23KB
sdui-parser (validate.js)10.35KB3.60KB
types (ai.js)0.20KB0.17KB
types (api-types.js)0.20KB0.18KB
types (app.js)2.87KB0.99KB
types (base.js)0.20KB0.18KB
types (blocks.js)0.20KB0.18KB
types (complex.js)2.74KB1.41KB
types (crud.js)0.20KB0.18KB
types (dashboard-filter-alias.js)6.23KB2.74KB
types (data-display.js)3.75KB1.85KB
types (data-protocol.js)0.20KB0.19KB
types (data.js)0.20KB0.18KB
types (designer.js)1.85KB0.85KB
types (disclosure.js)0.20KB0.18KB
types (error-code.js)1.54KB0.88KB
types (feedback.js)0.20KB0.18KB
types (field-types.js)0.20KB0.18KB
types (form.js)0.20KB0.18KB
types (http-inflight.js)8.87KB3.73KB
types (http-retry.js)4.32KB2.02KB
types (icon-key-migration.js)4.26KB1.63KB
types (index.js)4.74KB2.25KB
types (layout.js)0.20KB0.18KB
types (managed-by.js)0.19KB0.18KB
types (mobile.js)2.59KB1.31KB
types (navigation.js)0.20KB0.18KB
types (objectql.js)0.20KB0.18KB
types (overlay.js)0.20KB0.18KB
types (permissions.js)0.20KB0.18KB
types (plugin-scope.js)0.20KB0.18KB
types (record-components.js)0.20KB0.19KB
types (record-semantics.js)1.28KB0.67KB
types (registry.js)0.20KB0.18KB
types (reports.js)0.20KB0.18KB
types (spec-report.js)5.05KB1.93KB
types (spec-ui-namespace.js)0.20KB0.19KB
types (system-fields.js)3.33KB1.54KB
types (theme.js)6.28KB2.87KB
types (ui-action.js)8.11KB3.32KB
types (views.js)0.20KB0.18KB
types (widget.js)0.20KB0.18KB

Size Limits

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

@os-salesClaude

Copy link
Copy Markdown
Collaborator

Test (shard 3/4) is red, and it is not this PR's — reasoning first, confirmation pending

Posted by the domain:devx seat (session session_019aCUUSwWefnbCJ4Xk1vqQW) reviewing batch 9. ⛔ Not flipping this PR ready while a check is red.

The failure:

AssertionError: expected [ '#abc' ] to deeply equal [ '#123456' ]
❯ packages/plugin-timeline/src/ObjectTimeline.colorFieldLadder-7243.test.tsx:109:72

Why it cannot be this diff's. This PR changes three .mdx documents, one package README, and scripts/check-doc-snippet-types.mjs. It contains zero runtime source and zero plugin-timeline files — measured, not assumed: git diff --name-only against the merge base lists 5 files, none under packages/plugin-timeline/. check-doc-snippet-types.mjs is executed only by the documentation gates, never by a component test. There is no path by which markdown or a docs gate can change what colorsFor('accent', …) returns.

The failure shape says the same thing. Line 109 is the second of a pair:

expect(awaitcolorsFor('accent',[{ ...ROW,accent: '#abc'}])).toEqual(['#abc']);// passesexpect(awaitcolorsFor('accent',[{ ...ROW,accent: '#123456'}])).toEqual(['#123456']);// returns ['#abc']

The second call returned the first call's value. That is state leaking across two invocations inside one test — a caching or async-settlement defect, the classic shape of a nondeterministic failure. It is not a wrong expectation, and it is not something a docs change can reach.

Provenance: the test arrived with e75f4c986 — "fix(gantt,calendar,timeline): resolve colorField through one shared ladder (#7338)". A shared resolution ladder is exactly the kind of change that introduces cross-call memoisation.

No fix exists to port. I searched for an existing card covering this test or this symptom and found none (the search returned a live, non-empty result set, so the empty match on this symptom is a real negative rather than a silently-zeroed query). Filing it as a finding so it is owned rather than absorbed.

⛔ Not doing, and saying so explicitly: not skipping, disabling, quarantining or retrying this test into green, and not touching plugin-timeline from a docs PR to make my own PR pass.

Next: one re-run of the failed job, which is the single re-run this failure is entitled to. It is currently refused with "This workflow is already running" (shards 1 and 4 are still in flight), so it will be spent once the run completes. If it comes back green, this was nondeterministic and the finding stands on its own; if it reproduces identically, the failure is real and still not this PR's — and it then blocks every PR in the repo, not just this one, which makes it the more urgent item.


Generated by Claude Code

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentationImprovements or additions to documentationplugin

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@os-sales@claude
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

docs(plugin-report,docs): shrink UNGATED_DOCS by four — plugin-report README plus the last three .mdx entries - #7458

Merged
os-sales merged 2 commits into
mainfrom
claude/issue-5174-ungated-docs-batch9
Sep 3, 2026
Merged

docs(plugin-report,docs): shrink UNGATED_DOCS by four — plugin-report README plus the last three .mdx entries#7458
os-sales merged 2 commits into
mainfrom
claude/issue-5174-ungated-docs-batch9

Conversation

@claude

@claudeclaudeBot commented Sep 3, 2026

Copy link
Copy Markdown
Contributor

Part of #5174 — batch 9 of the UNGATED_DOCS shrink. The card stays open; this
removes four of its entries.

All figures below are at b701323ec, the final commit, after merging
origin/maind88e20f55. Exit codes were captured by redirect before any
pipe, and every gate line quotes the gate's own printed verdict.

What this removes, and what it bought

ledger entry removedblockscompiledeclared
packages/plugin-report/README.md13130
content/docs/plugins/plugin-detail.mdx770
content/docs/plugins/plugin-calendar-view.mdx211
content/docs/utilities/create-plugin.mdx101
total23212

37 diagnostics cleared (17 on the README, 20 across the three pages). Only the
two honest routes were used — compile against the built dist/, or a
FRAGMENT_MARKER whose reason names the diagnostics it was measured from. No
third route, no ledger addition, and no block made vacuous to get it green.

Ledger invariants, asserted mechanically

Both copies of the gate were imported side by side and evaluated over the same
working tree
, so the covered-set delta is attributable to the ledger alone:

LEDGER entry count: 32 -> 28
ADDED entries: []
REMOVED entries: ["content/docs/plugins/plugin-calendar-view.mdx",
"content/docs/plugins/plugin-detail.mdx",
"content/docs/utilities/create-plugin.mdx",
"packages/plugin-report/README.md"]
surviving entries whose REASON TEXT changed: []
COVERED documents: 195 -> 199 STRICTLY GROWS: true
previously-covered docs now UNGATED: []
blocks to compile : 411 -> 432
declared fragments : 155 -> 157
covered blocks : 566 -> 589
build filters : 25 -> 26 ADDED: ["--filter=@object-ui/plugin-report..."]

git diff --numstat origin/main...HEAD on the gate file reads 0 11
0 additions, 11 deletions. The hunk is removals only.

Strictness proven byte for byte: everything from the Fence scanning banner
to EOF is identical on both sides — 795 lines, sha256
d203debfa0073ccdb527a08e1e191b2d04b4cc00c5303ee27d4bfc76d09c7241 on
origin/main and on this branch. Nothing about how the gate judges a block
moved; only the list of documents it is allowed to skip.

The gate, before and after

BEFORE (origin/main d88e20f55's ledger, same tree)
195 covered, 32 ungated · 566 covered blocks — 411 to compile, 155 fragments
AFTER (this branch, node scripts/check-doc-snippet-types.mjs -> exit 0)
Scanned 227 document(s): 199 covered (97 of them hold a ts/tsx block), 28 ungated
Covered blocks: 589 — 432 to compile, 157 declared fragment(s).
Syntax phase: every block parsed, so every one of them reached the semantic phase.
Semantic phase: 432 of 432 block(s) judged, 0 failed.
Every covered documentation snippet compiles against the built types.

Controls all held: resolution landed on
/home/user/objectui-issue-5174-b9/packages/types/dist/index.d.ts (this
worktree's built artifact), sentinel TS2305, positive control 0 diagnostics,
undeclared control TS2307.

Per document — what changed, and why it is honest

packages/plugin-report/README.md — 13 blocks, all 13 compile

17 diagnostics: TS2304x15, TS2552x1, TS1108x1. Every one was a block using an
ambient name the page never defined, and the page's own prose already said so
("dataSource and router are host-provided"). Those names are now declared
against the shipped types
rather than floating — the pattern
packages/data-objectstack/README.md and packages/plugin-view/README.md
already use:

  • dataSource / ds / myAdapter as DataSource, router as
    { push: (href: string) => void }, reportDefinition / report as
    ReportComponentSchema or SpecReport depending on which renderer the block
    addresses, rows as Array of Record of string to unknown, refetch and
    notify as their real callback shapes.
  • The stored-document example (isDatasetReport(stored)) held a bare return
    at top level (TS1108). It is now a component function, which also puts the
    isDatasetReport narrowing under the compiler: unknown narrows to the
    renderer's report type, and that is checked.
  • The one block that was worse than broken: the filter-time date helper
    ended in runtimeFilter: { close_date: { $gte: daysAgo(30) } }. TypeScript
    parses that as a labelled block statement, so it would have compiled green
    with any spelling at all — covering it as written would have bought nothing.
    It is now a real defineReport call, and defineReport takes
    z.input of a strict ReportSchema, so the key is genuinely checked (probe 1
    below).
  • One JSX-bearing ts fence is now tsx. The gate parses every block as TSX
    regardless of the label, so this changes no verdict — it is a mislabel
    correction for the reader, in the direction that keeps the block collected.

content/docs/plugins/plugin-detail.mdx — 7 blocks, all 7 compile

16 diagnostics. Five blocks continued an earlier block; they now carry their own
imports and declarations. Two findings worth naming:

  • A real defect, fixed: the Console-integration example did
    const comments = await dataSource.find('sys_comment', ...) and then
    comments.map(...). DataSource.find resolves to Promise of
    QueryResult, which is { data: T[], total?, ... } — not an array. The rows
    are comments.data. Measured as TS2339 by probe 2.
  • The Filter Modes block restated the FeedFilterMode union beside the
    declared one, where nothing compared them. It now restates it against
    FeedFilterMode as imported from @object-ui/plugin-detail, so a typo or a
    retired member fails (probe 3). The four members are unchanged and still
    visible to the reader.

content/docs/plugins/plugin-calendar-view.mdx — 1 compiles, 1 declared

The "After" block names @object-ui/plugin-calendar and compiles. The "Before"
block quotes the retired @object-ui/plugin-calendar-view specifier on
purpose
— it is the before half of a migration guide — so it carries a
FRAGMENT_MARKER naming its measured TS2882 + TS2307. Repairing it would delete
the thing the section documents. This is exactly the disposition the removed
ledger entry itself predicted.

content/docs/utilities/create-plugin.mdx — 1 block, declared

React.lazy(() => import('./HeavyImpl')) points at a module in the reader's
own
plugin, which cannot exist beside this page (TS2307), and React is the
UMD global a one-line excerpt does not import (TS2686). Declared with both
measured; importing our way out would make the snippet about this repository
rather than about the plugin the reader is scaffolding.

Non-vacuity — six probes, direction predicted before each run

A newly covered document that cannot fail the gate has bought nothing, so each
probe was planted, proved on disk (the injected text counted, the removed
text counted, and git hash-object shown to differ from the HEAD blob), run,
then restored with git checkout HEAD -- ABSOLUTE_PATH under a
SIGTERM/SIGINT/exit trap, and the restore proved by an empty
git diff HEADand a blob hash equal to the HEAD blob. No rebuild sits
between mutation and reading: the mutation is markdown the gate reads straight
from disk, and the dist/ it compiles against is untouched.

#probepredictedobserved
1runtimeFilter misspelled in the new defineReportREDRED — TS2561, "Did you mean to write 'runtimeFilter'?"
2comments.data.map reverted to comments.mapREDRED — TS2339 Property 'map' does not exist on type 'QueryResult of any'
3'archived_only' added to the restated unionREDRED — TS2322 against the declared four
4wrong top-level key on an annotated ReportComponentSchema literalGREENGREEN — 0 failed
5the same wrong key one level down, inside ReportFieldREDRED — TS2561 'labell' does not exist in type 'ReportField'
6the calendar-view fragment marker disabledREDRED — the TS2882 + TS2307 its reason names

All six matched, including the direction of probe 4.

What the green does not mean

Probe 4 is the honest half. BaseSchema declares [key: string]: any, so a
wrong top-level key on any schema literal that extends it is invisible to
this gate — measured, not assumed. Probe 5 shows the floor: one level down, in a
type that does not extend BaseSchema (ReportField), excess-property checking
bites normally. Discharged by declaration check rather than left unknown: every
top-level key on the annotated literals in these blocks
(type, title, fields, schedule) is a declared member of
ReportComponentSchema, so nothing on these pages rides the index signature.
The defineReport calls are not affected at all — ReportSchema is strict, so
probe 1 reds at the top level.

Probe 6 is the fragment half: a declared fragment is not compiled, so the only
thing standing behind it is its written reason. Disabling the marker shows the
reason is true — the two diagnostics it names are the two the gate reports.

Gates and tests, all at b701323ec

commandexitverdict line
node scripts/check-doc-snippet-types.mjs0Every covered documentation snippet compiles against the built types.
node scripts/check-doc-fence-languages.mjs0every TypeScript block in 227 document(s) is fenced ts/tsx/typescript, except 80 declared file(s) carrying 90 block(s)
node scripts/check-doc-component-types.mjs0Every documented component type is registered.
node scripts/check-doc-links.mjs0Links are valid across 17 scan roots.
node scripts/check-control-bytes.mjs0OK (scanned 6140 tracked text file(s); skipped 85 binary)
node scripts/check-readme-exports.mjs0406 self-imports judged (406 real, 0 wrong-path, 0 fabricated)
node scripts/check-skill-examples.mjs0Every marked skill example holds up against the built types.
node scripts/check-changeset-presence.mjs0No source or published contract of a released package changed in this range, so no changeset is owed.
pnpm exec vitest run --maxWorkers=2 (15 suites, repo root)0Test Files 15 passed (15) / Tests 489 passed (489)
pnpm run lint:root032 problems (0 errors, 32 warnings) — all pre-existing

The check-doc-fences / check-doc-snippets walk-equality pin couples the three
doc gates, and all three are green above.

Changeset: none owed, and the verdict is the gate's, not a guess. A
packages/*/README.md does ship inside the package's files, so it was checked
rather than assumed: check-changeset-presence compared the tree with the
merge-base d88e20f55 and reports 5 files changed, 0 of them published source of
a package the release covers. Verdict followed; none added. No label was applied —
in objectui skip-changeset is a historical mis-mount that no workflow reads and
a pin test forbids applying.

Test suite selection re-derived at the merged head, not inherited:
git grep -l for the gate's name plus for each edited document and the sibling
README gate, which is 15 files including check-skill-examples.test.ts that
landed on main mid-run. vitest ran from the repo root, never through
pnpm --filter ... exec vitest.

One NOT MEASURED, corrected rather than reported as red: the first run of
check-readme-exports exited 1 with 3 findings, all the string "its type entry
./dist/index.d.ts is not on disk" for plugin-ai, none naming a file in this
diff — a missing precondition, not a verdict. Building that closure made it a
real measurement. The same half-built tree then failed two cases in
check-readme-exports.test.ts, which branch on packagesUnbuilt === 0 and are
written for a cleanly built or cleanly unbuilt tree; building the last unbuilt
package (plugin-tree) put the tree in one of those two states and the suite is
green, 489/489.

Build: serialised through the shared verify lock
(OS_VERIFY_LOCK_SLOT=issue-5174-b9, set before the first attempt), VERDICT command-exit 0 on every run. Because turbo replays cached logs that can name
another worktree's paths, dist/index.d.ts presence was confirmed on disk in
this worktree
for all 26 build-filter packages before any gate result was
trusted (26/26 present).

Serial constraint

The seat declared this file's regions disjoint at region level rather than
serialising the whole file: this branch touches the UNGATED_DOCS object literal
only, while #7432 touched CONTROL_REAL_EXPORT, a one-line harness constant some
290 lines away. That declaration obliged a merge of origin/main before opening,
and #7432landed in the meantime. The merge was clean — no conflict, no
hand-ordering — and CONTROL_REAL_EXPORT now reads BaseSchema on this branch,
with the positive control still reporting 0 diagnostics. Every number above was
re-taken after that merge. #7449, which moved the three gates' scan roots and put
an ownership-map block beside this ledger, is also on main and is included;
none of batch 8's figures were reused.

⛔ Excluded on the standing ruling, and named so the boundary is explicit:
packages/plugin-gantt/README.md and packages/plugin-kanban/README.md are
owned by #7302 / PARTIAL_EXCERPTS and are untouched here. plugin-gantt is the
largest entry left in the ledger by fence count (18), so it is exactly the
neighbour the exclusion exists for.

Ledger after this batch

28 entries: 0 .mdx under content/docs, 27 package READMEs, plus the root
README.md. The .mdx half of this ledger is now empty.


Generated by Claude Code

os-salesand others added 2 commits September 3, 2026 06:41
… README plus the last three .mdx entries
Batch 9 of objectui#5174. Removes four entries from `UNGATED_DOCS` in
`scripts/check-doc-snippet-types.mjs` and makes the 23 blocks they were
hiding honest: 21 compile against the built `dist/`, 2 carry a
`FRAGMENT_MARKER` with a measured reason.
- packages/plugin-report/README.md — 13 blocks, all 13 compile. 17
diagnostics cleared. Host-provided names (`dataSource`, `router`, `ds`,
`stored`, `report`, `rows`, `refetch`, `myAdapter`, `notify`) are now
declared against the shipped types instead of floating; the stored-document
example became a component so its `return` sits in a function body; the
filter-time date helper, which parsed as a labelled block statement and so
verified nothing, is now a real `defineReport` call that checks
`runtimeFilter`; the JSX-bearing `ts` fence is `tsx`.
- content/docs/plugins/plugin-detail.mdx — 7 blocks, all 7 compile. Real
defect fixed: the Console-integration example called `.map` on the result of
`dataSource.find`, which resolves to a `QueryResult`, not an array — the rows
are `.data`. The Filter Modes block restated the `FeedFilterMode` union
beside the declared one; it now checks against it.
- content/docs/plugins/plugin-calendar-view.mdx — 2 blocks: the "After" block
compiles, the "Before" block declares a fragment (it quotes the retired
package on purpose).
- content/docs/utilities/create-plugin.mdx — 1 block, declared: it points at
`./HeavyImpl` in the reader's own plugin.
Ledger 32 to 28, removals only (0 additions, 11 deletions). Covered documents
196 to 200; covered blocks 577 to 600; compiled 421 to 442; declared fragments
156 to 158. Gate strictness byte-identical from the fence-scanning banner to
EOF (sha256 b633996e6b55f08870ce1046f6f432914ca72320da6ce257dcc19fe661d6f313
on both sides).
Part of #5174
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019aCUUSwWefnbCJ4Xk1vqQW
@github-actionsgithub-actionsBot added documentation Improvements or additions to documentation plugin labels Sep 3, 2026
@github-actions

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

MetricValueBudget
Eager closure (gzip, 48 chunks)3178.8 KB3191.4 KB
Main entry chunk (gzip)143.2 KB350 KB
Entry fileindex-Brm1fWPZ.js
StatusPASS

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

PackageSizeGzipped
app-shell (consoleActionDispatch.js)0.20KB0.19KB
app-shell (index.js)15.67KB5.75KB
app-shell (runtime-config.js)20.68KB7.36KB
app-shell (types.js)0.01KB0.04KB
app-shell (urlParams.js)10.06KB3.86KB
auth (ActiveOrganizationStorage.js)25.05KB9.16KB
auth (AuthContext.js)0.31KB0.24KB
auth (AuthGuard.js)2.07KB1.00KB
auth (AuthProvider.js)40.18KB10.59KB
auth (AuthShell.js)3.49KB1.40KB
auth (ForgotPasswordForm.js)12.21KB3.45KB
auth (LoginForm.js)18.15KB5.39KB
auth (PreviewBanner.js)0.90KB0.50KB
auth (RegisterForm.js)6.65KB2.22KB
auth (SocialSignInButtons.js)9.61KB3.89KB
auth (UserMenu.js)3.41KB1.23KB
auth (auth-gate-events.js)1.29KB0.66KB
auth (authStyles.js)5.04KB1.72KB
auth (createAuthClient.js)40.21KB10.80KB
auth (createAuthenticatedFetch.js)8.46KB3.43KB
auth (index.js)3.19KB1.44KB
auth (invitation-status.js)1.22KB0.70KB
auth (org-roles.js)6.66KB2.78KB
auth (phone-identifier.js)1.11KB0.66KB
auth (types.js)0.59KB0.35KB
auth (useAuth.js)5.30KB1.02KB
auth (useWorkspaceAdminStatus.js)5.13KB2.35KB
collaboration (CommentThread.js)26.08KB7.56KB
collaboration (LiveCursors.js)3.17KB1.27KB
collaboration (PresenceAvatars.js)6.49KB2.64KB
collaboration (PresenceProvider.js)2.79KB1.13KB
collaboration (index.js)1.68KB0.73KB
collaboration (useCollaborationTranslation.js)6.05KB2.52KB
collaboration (useCommentSearch.js)1.98KB0.88KB
collaboration (useConflictResolution.js)7.75KB1.86KB
collaboration (useMentionNotifications.js)1.81KB0.68KB
collaboration (usePresence.js)6.33KB1.84KB
collaboration (useRealtimeSubscription.js)7.91KB2.01KB
components (index.js)516.24KB117.82KB
core (index.js)5.80KB2.32KB
create-plugin (index.js)10.08KB3.26KB
data-objectstack (index.js)178.20KB49.60KB
fields (index.js)244.08KB61.71KB
i18n (LocalizationContext.js)1.76KB0.96KB
i18n (currency.js)1.22KB0.64KB
i18n (fallbackInterpolation.js)6.25KB2.77KB
i18n (i18n.js)4.28KB1.75KB
i18n (index.js)3.44KB1.39KB
i18n (pickLocalized.js)7.62KB3.26KB
i18n (provider.js)26.89KB9.04KB
i18n (useDisplayLocale.js)2.85KB1.45KB
i18n (useObjectLabel.js)33.40KB8.71KB
i18n (useSafeTranslation.js)5.60KB2.33KB
layout (index.js)38.98KB10.98KB
mobile (MobileProvider.js)0.92KB0.49KB
mobile (ResponsiveContainer.js)0.94KB0.38KB
mobile (breakpoints.js)1.51KB0.70KB
mobile (createOfflineDataSource.js)5.61KB1.75KB
mobile (index.js)1.55KB0.62KB
mobile (offlineQueue.js)3.91KB1.35KB
mobile (pwa.js)0.97KB0.49KB
mobile (serviceWorker.js)1.48KB0.62KB
mobile (serviceWorkerSource.js)3.41KB1.48KB
mobile (useBreakpoint.js)1.54KB0.65KB
mobile (useGesture.js)6.96KB1.98KB
mobile (useOfflineSync.js)1.99KB0.72KB
mobile (usePullToRefresh.js)2.53KB0.85KB
mobile (useResponsive.js)0.72KB0.42KB
mobile (useResponsiveConfig.js)1.37KB0.63KB
mobile (useSpecGesture.js)4.32KB1.64KB
mobile (useTouchTarget.js)1.01KB0.54KB
permissions (MePermissionsProvider.js)11.71KB4.29KB
permissions (PermissionContext.js)0.31KB0.25KB
permissions (PermissionGuard.js)0.89KB0.45KB
permissions (PermissionProvider.js)6.24KB2.16KB
permissions (discardProofCache.js)1.04KB0.55KB
permissions (evaluator.js)5.12KB1.74KB
permissions (index.js)0.93KB0.41KB
permissions (store.js)0.91KB0.42KB
permissions (useFieldPermissions.js)1.28KB0.53KB
permissions (usePermissions.js)4.83KB2.27KB
plugin-ai (index.js)15.75KB3.80KB
plugin-calendar (index.js)47.14KB13.02KB
plugin-charts (index.js)70.31KB19.55KB
plugin-chatbot (index.js)196.19KB46.43KB
plugin-dashboard (index.js)132.79KB34.62KB
plugin-designer (index.js)212.87KB43.19KB
plugin-detail (index.js)251.27KB64.20KB
plugin-editor (index.js)2.46KB1.10KB
plugin-form (index.js)132.87KB32.66KB
plugin-gantt (index.js)167.18KB40.94KB
plugin-grid (index.js)209.25KB56.71KB
plugin-kanban (index.js)53.21KB14.66KB
plugin-list (index.js)113.53KB27.66KB
plugin-map (index.js)20.20KB6.66KB
plugin-markdown (index.js)13.72KB4.69KB
plugin-report (index.js)43.51KB11.94KB
plugin-timeline (index.js)30.21KB8.66KB
plugin-tree (index.js)8.98KB3.08KB
plugin-view (index.js)85.90KB21.12KB
providers (DataSourceProvider.js)0.75KB0.39KB
providers (MetadataProvider.js)1.37KB0.59KB
providers (ThemeProvider.js)1.90KB0.85KB
providers (UploadProvider.js)11.66KB3.50KB
providers (index.js)0.45KB0.23KB
providers (types.js)0.01KB0.04KB
react-runtime (index.js)5.62KB2.34KB
react (LazyPluginLoader.js)4.47KB1.63KB
react (SchemaRenderer.js)81.07KB26.86KB
react (data-invalidation.js)5.05KB2.08KB
react (index.js)3.11KB1.48KB
react (schema-input.js)2.32KB1.24KB
react (spec-input.js)0.20KB0.18KB
sdui-parser (codegen.js)5.41KB2.34KB
sdui-parser (dashboard-widget-options.js)3.08KB1.30KB
sdui-parser (index.js)4.93KB2.24KB
sdui-parser (input-type.js)2.84KB1.40KB
sdui-parser (parse.js)20.57KB5.88KB
sdui-parser (provenance.js)3.66KB1.82KB
sdui-parser (types.js)0.28KB0.23KB
sdui-parser (validate.js)10.35KB3.60KB
types (ai.js)0.20KB0.17KB
types (api-types.js)0.20KB0.18KB
types (app.js)2.87KB0.99KB
types (base.js)0.20KB0.18KB
types (blocks.js)0.20KB0.18KB
types (complex.js)2.74KB1.41KB
types (crud.js)0.20KB0.18KB
types (dashboard-filter-alias.js)6.23KB2.74KB
types (data-display.js)3.75KB1.85KB
types (data-protocol.js)0.20KB0.19KB
types (data.js)0.20KB0.18KB
types (designer.js)1.85KB0.85KB
types (disclosure.js)0.20KB0.18KB
types (error-code.js)1.54KB0.88KB
types (feedback.js)0.20KB0.18KB
types (field-types.js)0.20KB0.18KB
types (form.js)0.20KB0.18KB
types (http-inflight.js)8.87KB3.73KB
types (http-retry.js)4.32KB2.02KB
types (icon-key-migration.js)4.26KB1.63KB
types (index.js)4.74KB2.25KB
types (layout.js)0.20KB0.18KB
types (managed-by.js)0.19KB0.18KB
types (mobile.js)2.59KB1.31KB
types (navigation.js)0.20KB0.18KB
types (objectql.js)0.20KB0.18KB
types (overlay.js)0.20KB0.18KB
types (permissions.js)0.20KB0.18KB
types (plugin-scope.js)0.20KB0.18KB
types (record-components.js)0.20KB0.19KB
types (record-semantics.js)1.28KB0.67KB
types (registry.js)0.20KB0.18KB
types (reports.js)0.20KB0.18KB
types (spec-report.js)5.05KB1.93KB
types (spec-ui-namespace.js)0.20KB0.19KB
types (system-fields.js)3.33KB1.54KB
types (theme.js)6.28KB2.87KB
types (ui-action.js)8.11KB3.32KB
types (views.js)0.20KB0.18KB
types (widget.js)0.20KB0.18KB

Size Limits

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

@os-salesClaude

Copy link
Copy Markdown
Collaborator

Test (shard 3/4) is red, and it is not this PR's — reasoning first, confirmation pending

Posted by the domain:devx seat (session session_019aCUUSwWefnbCJ4Xk1vqQW) reviewing batch 9. ⛔ Not flipping this PR ready while a check is red.

The failure:

AssertionError: expected [ '#abc' ] to deeply equal [ '#123456' ]
❯ packages/plugin-timeline/src/ObjectTimeline.colorFieldLadder-7243.test.tsx:109:72

Why it cannot be this diff's. This PR changes three .mdx documents, one package README, and scripts/check-doc-snippet-types.mjs. It contains zero runtime source and zero plugin-timeline files — measured, not assumed: git diff --name-only against the merge base lists 5 files, none under packages/plugin-timeline/. check-doc-snippet-types.mjs is executed only by the documentation gates, never by a component test. There is no path by which markdown or a docs gate can change what colorsFor('accent', …) returns.

The failure shape says the same thing. Line 109 is the second of a pair:

expect(awaitcolorsFor('accent',[{ ...ROW,accent: '#abc'}])).toEqual(['#abc']);// passesexpect(awaitcolorsFor('accent',[{ ...ROW,accent: '#123456'}])).toEqual(['#123456']);// returns ['#abc']

The second call returned the first call's value. That is state leaking across two invocations inside one test — a caching or async-settlement defect, the classic shape of a nondeterministic failure. It is not a wrong expectation, and it is not something a docs change can reach.

Provenance: the test arrived with e75f4c986 — "fix(gantt,calendar,timeline): resolve colorField through one shared ladder (#7338)". A shared resolution ladder is exactly the kind of change that introduces cross-call memoisation.

No fix exists to port. I searched for an existing card covering this test or this symptom and found none (the search returned a live, non-empty result set, so the empty match on this symptom is a real negative rather than a silently-zeroed query). Filing it as a finding so it is owned rather than absorbed.

⛔ Not doing, and saying so explicitly: not skipping, disabling, quarantining or retrying this test into green, and not touching plugin-timeline from a docs PR to make my own PR pass.

Next: one re-run of the failed job, which is the single re-run this failure is entitled to. It is currently refused with "This workflow is already running" (shards 1 and 4 are still in flight), so it will be spent once the run completes. If it comes back green, this was nondeterministic and the finding stands on its own; if it reproduces identically, the failure is real and still not this PR's — and it then blocks every PR in the repo, not just this one, which makes it the more urgent item.


Generated by Claude Code

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentationImprovements or additions to documentationplugin

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@os-sales@claude
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

docs(plugin-report,docs): shrink UNGATED_DOCS by four — plugin-report README plus the last three .mdx entries - #7458

Merged
os-sales merged 2 commits into
mainfrom
claude/issue-5174-ungated-docs-batch9
Sep 3, 2026
Merged

docs(plugin-report,docs): shrink UNGATED_DOCS by four — plugin-report README plus the last three .mdx entries#7458
os-sales merged 2 commits into
mainfrom
claude/issue-5174-ungated-docs-batch9

Conversation

@claude

@claudeclaudeBot commented Sep 3, 2026

Copy link
Copy Markdown
Contributor

Part of #5174 — batch 9 of the UNGATED_DOCS shrink. The card stays open; this
removes four of its entries.

All figures below are at b701323ec, the final commit, after merging
origin/maind88e20f55. Exit codes were captured by redirect before any
pipe, and every gate line quotes the gate's own printed verdict.

What this removes, and what it bought

ledger entry removedblockscompiledeclared
packages/plugin-report/README.md13130
content/docs/plugins/plugin-detail.mdx770
content/docs/plugins/plugin-calendar-view.mdx211
content/docs/utilities/create-plugin.mdx101
total23212

37 diagnostics cleared (17 on the README, 20 across the three pages). Only the
two honest routes were used — compile against the built dist/, or a
FRAGMENT_MARKER whose reason names the diagnostics it was measured from. No
third route, no ledger addition, and no block made vacuous to get it green.

Ledger invariants, asserted mechanically

Both copies of the gate were imported side by side and evaluated over the same
working tree
, so the covered-set delta is attributable to the ledger alone:

LEDGER entry count: 32 -> 28
ADDED entries: []
REMOVED entries: ["content/docs/plugins/plugin-calendar-view.mdx",
"content/docs/plugins/plugin-detail.mdx",
"content/docs/utilities/create-plugin.mdx",
"packages/plugin-report/README.md"]
surviving entries whose REASON TEXT changed: []
COVERED documents: 195 -> 199 STRICTLY GROWS: true
previously-covered docs now UNGATED: []
blocks to compile : 411 -> 432
declared fragments : 155 -> 157
covered blocks : 566 -> 589
build filters : 25 -> 26 ADDED: ["--filter=@object-ui/plugin-report..."]

git diff --numstat origin/main...HEAD on the gate file reads 0 11
0 additions, 11 deletions. The hunk is removals only.

Strictness proven byte for byte: everything from the Fence scanning banner
to EOF is identical on both sides — 795 lines, sha256
d203debfa0073ccdb527a08e1e191b2d04b4cc00c5303ee27d4bfc76d09c7241 on
origin/main and on this branch. Nothing about how the gate judges a block
moved; only the list of documents it is allowed to skip.

The gate, before and after

BEFORE (origin/main d88e20f55's ledger, same tree)
195 covered, 32 ungated · 566 covered blocks — 411 to compile, 155 fragments
AFTER (this branch, node scripts/check-doc-snippet-types.mjs -> exit 0)
Scanned 227 document(s): 199 covered (97 of them hold a ts/tsx block), 28 ungated
Covered blocks: 589 — 432 to compile, 157 declared fragment(s).
Syntax phase: every block parsed, so every one of them reached the semantic phase.
Semantic phase: 432 of 432 block(s) judged, 0 failed.
Every covered documentation snippet compiles against the built types.

Controls all held: resolution landed on
/home/user/objectui-issue-5174-b9/packages/types/dist/index.d.ts (this
worktree's built artifact), sentinel TS2305, positive control 0 diagnostics,
undeclared control TS2307.

Per document — what changed, and why it is honest

packages/plugin-report/README.md — 13 blocks, all 13 compile

17 diagnostics: TS2304x15, TS2552x1, TS1108x1. Every one was a block using an
ambient name the page never defined, and the page's own prose already said so
("dataSource and router are host-provided"). Those names are now declared
against the shipped types
rather than floating — the pattern
packages/data-objectstack/README.md and packages/plugin-view/README.md
already use:

  • dataSource / ds / myAdapter as DataSource, router as
    { push: (href: string) => void }, reportDefinition / report as
    ReportComponentSchema or SpecReport depending on which renderer the block
    addresses, rows as Array of Record of string to unknown, refetch and
    notify as their real callback shapes.
  • The stored-document example (isDatasetReport(stored)) held a bare return
    at top level (TS1108). It is now a component function, which also puts the
    isDatasetReport narrowing under the compiler: unknown narrows to the
    renderer's report type, and that is checked.
  • The one block that was worse than broken: the filter-time date helper
    ended in runtimeFilter: { close_date: { $gte: daysAgo(30) } }. TypeScript
    parses that as a labelled block statement, so it would have compiled green
    with any spelling at all — covering it as written would have bought nothing.
    It is now a real defineReport call, and defineReport takes
    z.input of a strict ReportSchema, so the key is genuinely checked (probe 1
    below).
  • One JSX-bearing ts fence is now tsx. The gate parses every block as TSX
    regardless of the label, so this changes no verdict — it is a mislabel
    correction for the reader, in the direction that keeps the block collected.

content/docs/plugins/plugin-detail.mdx — 7 blocks, all 7 compile

16 diagnostics. Five blocks continued an earlier block; they now carry their own
imports and declarations. Two findings worth naming:

  • A real defect, fixed: the Console-integration example did
    const comments = await dataSource.find('sys_comment', ...) and then
    comments.map(...). DataSource.find resolves to Promise of
    QueryResult, which is { data: T[], total?, ... } — not an array. The rows
    are comments.data. Measured as TS2339 by probe 2.
  • The Filter Modes block restated the FeedFilterMode union beside the
    declared one, where nothing compared them. It now restates it against
    FeedFilterMode as imported from @object-ui/plugin-detail, so a typo or a
    retired member fails (probe 3). The four members are unchanged and still
    visible to the reader.

content/docs/plugins/plugin-calendar-view.mdx — 1 compiles, 1 declared

The "After" block names @object-ui/plugin-calendar and compiles. The "Before"
block quotes the retired @object-ui/plugin-calendar-view specifier on
purpose
— it is the before half of a migration guide — so it carries a
FRAGMENT_MARKER naming its measured TS2882 + TS2307. Repairing it would delete
the thing the section documents. This is exactly the disposition the removed
ledger entry itself predicted.

content/docs/utilities/create-plugin.mdx — 1 block, declared

React.lazy(() => import('./HeavyImpl')) points at a module in the reader's
own
plugin, which cannot exist beside this page (TS2307), and React is the
UMD global a one-line excerpt does not import (TS2686). Declared with both
measured; importing our way out would make the snippet about this repository
rather than about the plugin the reader is scaffolding.

Non-vacuity — six probes, direction predicted before each run

A newly covered document that cannot fail the gate has bought nothing, so each
probe was planted, proved on disk (the injected text counted, the removed
text counted, and git hash-object shown to differ from the HEAD blob), run,
then restored with git checkout HEAD -- ABSOLUTE_PATH under a
SIGTERM/SIGINT/exit trap, and the restore proved by an empty
git diff HEADand a blob hash equal to the HEAD blob. No rebuild sits
between mutation and reading: the mutation is markdown the gate reads straight
from disk, and the dist/ it compiles against is untouched.

#probepredictedobserved
1runtimeFilter misspelled in the new defineReportREDRED — TS2561, "Did you mean to write 'runtimeFilter'?"
2comments.data.map reverted to comments.mapREDRED — TS2339 Property 'map' does not exist on type 'QueryResult of any'
3'archived_only' added to the restated unionREDRED — TS2322 against the declared four
4wrong top-level key on an annotated ReportComponentSchema literalGREENGREEN — 0 failed
5the same wrong key one level down, inside ReportFieldREDRED — TS2561 'labell' does not exist in type 'ReportField'
6the calendar-view fragment marker disabledREDRED — the TS2882 + TS2307 its reason names

All six matched, including the direction of probe 4.

What the green does not mean

Probe 4 is the honest half. BaseSchema declares [key: string]: any, so a
wrong top-level key on any schema literal that extends it is invisible to
this gate — measured, not assumed. Probe 5 shows the floor: one level down, in a
type that does not extend BaseSchema (ReportField), excess-property checking
bites normally. Discharged by declaration check rather than left unknown: every
top-level key on the annotated literals in these blocks
(type, title, fields, schedule) is a declared member of
ReportComponentSchema, so nothing on these pages rides the index signature.
The defineReport calls are not affected at all — ReportSchema is strict, so
probe 1 reds at the top level.

Probe 6 is the fragment half: a declared fragment is not compiled, so the only
thing standing behind it is its written reason. Disabling the marker shows the
reason is true — the two diagnostics it names are the two the gate reports.

Gates and tests, all at b701323ec

commandexitverdict line
node scripts/check-doc-snippet-types.mjs0Every covered documentation snippet compiles against the built types.
node scripts/check-doc-fence-languages.mjs0every TypeScript block in 227 document(s) is fenced ts/tsx/typescript, except 80 declared file(s) carrying 90 block(s)
node scripts/check-doc-component-types.mjs0Every documented component type is registered.
node scripts/check-doc-links.mjs0Links are valid across 17 scan roots.
node scripts/check-control-bytes.mjs0OK (scanned 6140 tracked text file(s); skipped 85 binary)
node scripts/check-readme-exports.mjs0406 self-imports judged (406 real, 0 wrong-path, 0 fabricated)
node scripts/check-skill-examples.mjs0Every marked skill example holds up against the built types.
node scripts/check-changeset-presence.mjs0No source or published contract of a released package changed in this range, so no changeset is owed.
pnpm exec vitest run --maxWorkers=2 (15 suites, repo root)0Test Files 15 passed (15) / Tests 489 passed (489)
pnpm run lint:root032 problems (0 errors, 32 warnings) — all pre-existing

The check-doc-fences / check-doc-snippets walk-equality pin couples the three
doc gates, and all three are green above.

Changeset: none owed, and the verdict is the gate's, not a guess. A
packages/*/README.md does ship inside the package's files, so it was checked
rather than assumed: check-changeset-presence compared the tree with the
merge-base d88e20f55 and reports 5 files changed, 0 of them published source of
a package the release covers. Verdict followed; none added. No label was applied —
in objectui skip-changeset is a historical mis-mount that no workflow reads and
a pin test forbids applying.

Test suite selection re-derived at the merged head, not inherited:
git grep -l for the gate's name plus for each edited document and the sibling
README gate, which is 15 files including check-skill-examples.test.ts that
landed on main mid-run. vitest ran from the repo root, never through
pnpm --filter ... exec vitest.

One NOT MEASURED, corrected rather than reported as red: the first run of
check-readme-exports exited 1 with 3 findings, all the string "its type entry
./dist/index.d.ts is not on disk" for plugin-ai, none naming a file in this
diff — a missing precondition, not a verdict. Building that closure made it a
real measurement. The same half-built tree then failed two cases in
check-readme-exports.test.ts, which branch on packagesUnbuilt === 0 and are
written for a cleanly built or cleanly unbuilt tree; building the last unbuilt
package (plugin-tree) put the tree in one of those two states and the suite is
green, 489/489.

Build: serialised through the shared verify lock
(OS_VERIFY_LOCK_SLOT=issue-5174-b9, set before the first attempt), VERDICT command-exit 0 on every run. Because turbo replays cached logs that can name
another worktree's paths, dist/index.d.ts presence was confirmed on disk in
this worktree
for all 26 build-filter packages before any gate result was
trusted (26/26 present).

Serial constraint

The seat declared this file's regions disjoint at region level rather than
serialising the whole file: this branch touches the UNGATED_DOCS object literal
only, while #7432 touched CONTROL_REAL_EXPORT, a one-line harness constant some
290 lines away. That declaration obliged a merge of origin/main before opening,
and #7432landed in the meantime. The merge was clean — no conflict, no
hand-ordering — and CONTROL_REAL_EXPORT now reads BaseSchema on this branch,
with the positive control still reporting 0 diagnostics. Every number above was
re-taken after that merge. #7449, which moved the three gates' scan roots and put
an ownership-map block beside this ledger, is also on main and is included;
none of batch 8's figures were reused.

⛔ Excluded on the standing ruling, and named so the boundary is explicit:
packages/plugin-gantt/README.md and packages/plugin-kanban/README.md are
owned by #7302 / PARTIAL_EXCERPTS and are untouched here. plugin-gantt is the
largest entry left in the ledger by fence count (18), so it is exactly the
neighbour the exclusion exists for.

Ledger after this batch

28 entries: 0 .mdx under content/docs, 27 package READMEs, plus the root
README.md. The .mdx half of this ledger is now empty.


Generated by Claude Code

os-salesand others added 2 commits September 3, 2026 06:41
… README plus the last three .mdx entries
Batch 9 of objectui#5174. Removes four entries from `UNGATED_DOCS` in
`scripts/check-doc-snippet-types.mjs` and makes the 23 blocks they were
hiding honest: 21 compile against the built `dist/`, 2 carry a
`FRAGMENT_MARKER` with a measured reason.
- packages/plugin-report/README.md — 13 blocks, all 13 compile. 17
diagnostics cleared. Host-provided names (`dataSource`, `router`, `ds`,
`stored`, `report`, `rows`, `refetch`, `myAdapter`, `notify`) are now
declared against the shipped types instead of floating; the stored-document
example became a component so its `return` sits in a function body; the
filter-time date helper, which parsed as a labelled block statement and so
verified nothing, is now a real `defineReport` call that checks
`runtimeFilter`; the JSX-bearing `ts` fence is `tsx`.
- content/docs/plugins/plugin-detail.mdx — 7 blocks, all 7 compile. Real
defect fixed: the Console-integration example called `.map` on the result of
`dataSource.find`, which resolves to a `QueryResult`, not an array — the rows
are `.data`. The Filter Modes block restated the `FeedFilterMode` union
beside the declared one; it now checks against it.
- content/docs/plugins/plugin-calendar-view.mdx — 2 blocks: the "After" block
compiles, the "Before" block declares a fragment (it quotes the retired
package on purpose).
- content/docs/utilities/create-plugin.mdx — 1 block, declared: it points at
`./HeavyImpl` in the reader's own plugin.
Ledger 32 to 28, removals only (0 additions, 11 deletions). Covered documents
196 to 200; covered blocks 577 to 600; compiled 421 to 442; declared fragments
156 to 158. Gate strictness byte-identical from the fence-scanning banner to
EOF (sha256 b633996e6b55f08870ce1046f6f432914ca72320da6ce257dcc19fe661d6f313
on both sides).
Part of #5174
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019aCUUSwWefnbCJ4Xk1vqQW
@github-actionsgithub-actionsBot added documentation Improvements or additions to documentation plugin labels Sep 3, 2026
@github-actions

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

MetricValueBudget
Eager closure (gzip, 48 chunks)3178.8 KB3191.4 KB
Main entry chunk (gzip)143.2 KB350 KB
Entry fileindex-Brm1fWPZ.js
StatusPASS

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

PackageSizeGzipped
app-shell (consoleActionDispatch.js)0.20KB0.19KB
app-shell (index.js)15.67KB5.75KB
app-shell (runtime-config.js)20.68KB7.36KB
app-shell (types.js)0.01KB0.04KB
app-shell (urlParams.js)10.06KB3.86KB
auth (ActiveOrganizationStorage.js)25.05KB9.16KB
auth (AuthContext.js)0.31KB0.24KB
auth (AuthGuard.js)2.07KB1.00KB
auth (AuthProvider.js)40.18KB10.59KB
auth (AuthShell.js)3.49KB1.40KB
auth (ForgotPasswordForm.js)12.21KB3.45KB
auth (LoginForm.js)18.15KB5.39KB
auth (PreviewBanner.js)0.90KB0.50KB
auth (RegisterForm.js)6.65KB2.22KB
auth (SocialSignInButtons.js)9.61KB3.89KB
auth (UserMenu.js)3.41KB1.23KB
auth (auth-gate-events.js)1.29KB0.66KB
auth (authStyles.js)5.04KB1.72KB
auth (createAuthClient.js)40.21KB10.80KB
auth (createAuthenticatedFetch.js)8.46KB3.43KB
auth (index.js)3.19KB1.44KB
auth (invitation-status.js)1.22KB0.70KB
auth (org-roles.js)6.66KB2.78KB
auth (phone-identifier.js)1.11KB0.66KB
auth (types.js)0.59KB0.35KB
auth (useAuth.js)5.30KB1.02KB
auth (useWorkspaceAdminStatus.js)5.13KB2.35KB
collaboration (CommentThread.js)26.08KB7.56KB
collaboration (LiveCursors.js)3.17KB1.27KB
collaboration (PresenceAvatars.js)6.49KB2.64KB
collaboration (PresenceProvider.js)2.79KB1.13KB
collaboration (index.js)1.68KB0.73KB
collaboration (useCollaborationTranslation.js)6.05KB2.52KB
collaboration (useCommentSearch.js)1.98KB0.88KB
collaboration (useConflictResolution.js)7.75KB1.86KB
collaboration (useMentionNotifications.js)1.81KB0.68KB
collaboration (usePresence.js)6.33KB1.84KB
collaboration (useRealtimeSubscription.js)7.91KB2.01KB
components (index.js)516.24KB117.82KB
core (index.js)5.80KB2.32KB
create-plugin (index.js)10.08KB3.26KB
data-objectstack (index.js)178.20KB49.60KB
fields (index.js)244.08KB61.71KB
i18n (LocalizationContext.js)1.76KB0.96KB
i18n (currency.js)1.22KB0.64KB
i18n (fallbackInterpolation.js)6.25KB2.77KB
i18n (i18n.js)4.28KB1.75KB
i18n (index.js)3.44KB1.39KB
i18n (pickLocalized.js)7.62KB3.26KB
i18n (provider.js)26.89KB9.04KB
i18n (useDisplayLocale.js)2.85KB1.45KB
i18n (useObjectLabel.js)33.40KB8.71KB
i18n (useSafeTranslation.js)5.60KB2.33KB
layout (index.js)38.98KB10.98KB
mobile (MobileProvider.js)0.92KB0.49KB
mobile (ResponsiveContainer.js)0.94KB0.38KB
mobile (breakpoints.js)1.51KB0.70KB
mobile (createOfflineDataSource.js)5.61KB1.75KB
mobile (index.js)1.55KB0.62KB
mobile (offlineQueue.js)3.91KB1.35KB
mobile (pwa.js)0.97KB0.49KB
mobile (serviceWorker.js)1.48KB0.62KB
mobile (serviceWorkerSource.js)3.41KB1.48KB
mobile (useBreakpoint.js)1.54KB0.65KB
mobile (useGesture.js)6.96KB1.98KB
mobile (useOfflineSync.js)1.99KB0.72KB
mobile (usePullToRefresh.js)2.53KB0.85KB
mobile (useResponsive.js)0.72KB0.42KB
mobile (useResponsiveConfig.js)1.37KB0.63KB
mobile (useSpecGesture.js)4.32KB1.64KB
mobile (useTouchTarget.js)1.01KB0.54KB
permissions (MePermissionsProvider.js)11.71KB4.29KB
permissions (PermissionContext.js)0.31KB0.25KB
permissions (PermissionGuard.js)0.89KB0.45KB
permissions (PermissionProvider.js)6.24KB2.16KB
permissions (discardProofCache.js)1.04KB0.55KB
permissions (evaluator.js)5.12KB1.74KB
permissions (index.js)0.93KB0.41KB
permissions (store.js)0.91KB0.42KB
permissions (useFieldPermissions.js)1.28KB0.53KB
permissions (usePermissions.js)4.83KB2.27KB
plugin-ai (index.js)15.75KB3.80KB
plugin-calendar (index.js)47.14KB13.02KB
plugin-charts (index.js)70.31KB19.55KB
plugin-chatbot (index.js)196.19KB46.43KB
plugin-dashboard (index.js)132.79KB34.62KB
plugin-designer (index.js)212.87KB43.19KB
plugin-detail (index.js)251.27KB64.20KB
plugin-editor (index.js)2.46KB1.10KB
plugin-form (index.js)132.87KB32.66KB
plugin-gantt (index.js)167.18KB40.94KB
plugin-grid (index.js)209.25KB56.71KB
plugin-kanban (index.js)53.21KB14.66KB
plugin-list (index.js)113.53KB27.66KB
plugin-map (index.js)20.20KB6.66KB
plugin-markdown (index.js)13.72KB4.69KB
plugin-report (index.js)43.51KB11.94KB
plugin-timeline (index.js)30.21KB8.66KB
plugin-tree (index.js)8.98KB3.08KB
plugin-view (index.js)85.90KB21.12KB
providers (DataSourceProvider.js)0.75KB0.39KB
providers (MetadataProvider.js)1.37KB0.59KB
providers (ThemeProvider.js)1.90KB0.85KB
providers (UploadProvider.js)11.66KB3.50KB
providers (index.js)0.45KB0.23KB
providers (types.js)0.01KB0.04KB
react-runtime (index.js)5.62KB2.34KB
react (LazyPluginLoader.js)4.47KB1.63KB
react (SchemaRenderer.js)81.07KB26.86KB
react (data-invalidation.js)5.05KB2.08KB
react (index.js)3.11KB1.48KB
react (schema-input.js)2.32KB1.24KB
react (spec-input.js)0.20KB0.18KB
sdui-parser (codegen.js)5.41KB2.34KB
sdui-parser (dashboard-widget-options.js)3.08KB1.30KB
sdui-parser (index.js)4.93KB2.24KB
sdui-parser (input-type.js)2.84KB1.40KB
sdui-parser (parse.js)20.57KB5.88KB
sdui-parser (provenance.js)3.66KB1.82KB
sdui-parser (types.js)0.28KB0.23KB
sdui-parser (validate.js)10.35KB3.60KB
types (ai.js)0.20KB0.17KB
types (api-types.js)0.20KB0.18KB
types (app.js)2.87KB0.99KB
types (base.js)0.20KB0.18KB
types (blocks.js)0.20KB0.18KB
types (complex.js)2.74KB1.41KB
types (crud.js)0.20KB0.18KB
types (dashboard-filter-alias.js)6.23KB2.74KB
types (data-display.js)3.75KB1.85KB
types (data-protocol.js)0.20KB0.19KB
types (data.js)0.20KB0.18KB
types (designer.js)1.85KB0.85KB
types (disclosure.js)0.20KB0.18KB
types (error-code.js)1.54KB0.88KB
types (feedback.js)0.20KB0.18KB
types (field-types.js)0.20KB0.18KB
types (form.js)0.20KB0.18KB
types (http-inflight.js)8.87KB3.73KB
types (http-retry.js)4.32KB2.02KB
types (icon-key-migration.js)4.26KB1.63KB
types (index.js)4.74KB2.25KB
types (layout.js)0.20KB0.18KB
types (managed-by.js)0.19KB0.18KB
types (mobile.js)2.59KB1.31KB
types (navigation.js)0.20KB0.18KB
types (objectql.js)0.20KB0.18KB
types (overlay.js)0.20KB0.18KB
types (permissions.js)0.20KB0.18KB
types (plugin-scope.js)0.20KB0.18KB
types (record-components.js)0.20KB0.19KB
types (record-semantics.js)1.28KB0.67KB
types (registry.js)0.20KB0.18KB
types (reports.js)0.20KB0.18KB
types (spec-report.js)5.05KB1.93KB
types (spec-ui-namespace.js)0.20KB0.19KB
types (system-fields.js)3.33KB1.54KB
types (theme.js)6.28KB2.87KB
types (ui-action.js)8.11KB3.32KB
types (views.js)0.20KB0.18KB
types (widget.js)0.20KB0.18KB

Size Limits

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

@os-salesClaude

Copy link
Copy Markdown
Collaborator

Test (shard 3/4) is red, and it is not this PR's — reasoning first, confirmation pending

Posted by the domain:devx seat (session session_019aCUUSwWefnbCJ4Xk1vqQW) reviewing batch 9. ⛔ Not flipping this PR ready while a check is red.

The failure:

AssertionError: expected [ '#abc' ] to deeply equal [ '#123456' ]
❯ packages/plugin-timeline/src/ObjectTimeline.colorFieldLadder-7243.test.tsx:109:72

Why it cannot be this diff's. This PR changes three .mdx documents, one package README, and scripts/check-doc-snippet-types.mjs. It contains zero runtime source and zero plugin-timeline files — measured, not assumed: git diff --name-only against the merge base lists 5 files, none under packages/plugin-timeline/. check-doc-snippet-types.mjs is executed only by the documentation gates, never by a component test. There is no path by which markdown or a docs gate can change what colorsFor('accent', …) returns.

The failure shape says the same thing. Line 109 is the second of a pair:

expect(awaitcolorsFor('accent',[{ ...ROW,accent: '#abc'}])).toEqual(['#abc']);// passesexpect(awaitcolorsFor('accent',[{ ...ROW,accent: '#123456'}])).toEqual(['#123456']);// returns ['#abc']

The second call returned the first call's value. That is state leaking across two invocations inside one test — a caching or async-settlement defect, the classic shape of a nondeterministic failure. It is not a wrong expectation, and it is not something a docs change can reach.

Provenance: the test arrived with e75f4c986 — "fix(gantt,calendar,timeline): resolve colorField through one shared ladder (#7338)". A shared resolution ladder is exactly the kind of change that introduces cross-call memoisation.

No fix exists to port. I searched for an existing card covering this test or this symptom and found none (the search returned a live, non-empty result set, so the empty match on this symptom is a real negative rather than a silently-zeroed query). Filing it as a finding so it is owned rather than absorbed.

⛔ Not doing, and saying so explicitly: not skipping, disabling, quarantining or retrying this test into green, and not touching plugin-timeline from a docs PR to make my own PR pass.

Next: one re-run of the failed job, which is the single re-run this failure is entitled to. It is currently refused with "This workflow is already running" (shards 1 and 4 are still in flight), so it will be spent once the run completes. If it comes back green, this was nondeterministic and the finding stands on its own; if it reproduces identically, the failure is real and still not this PR's — and it then blocks every PR in the repo, not just this one, which makes it the more urgent item.


Generated by Claude Code

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentationImprovements or additions to documentationplugin

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@os-sales@claude