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

os-sales merged 2 commits into
mainfrom
claude/issue-5174-ungated-docs-batch9

Conversation

@claude

@claude claude Bot 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/main d88e20f55. 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 removed blocks compile declared
packages/plugin-report/README.md 13 13 0
content/docs/plugins/plugin-detail.mdx 7 7 0
content/docs/plugins/plugin-calendar-view.mdx 2 1 1
content/docs/utilities/create-plugin.mdx 1 0 1
total 23 21 2

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 HEAD and 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.

# probe predicted observed
1 runtimeFilter misspelled in the new defineReport RED RED — TS2561, "Did you mean to write 'runtimeFilter'?"
2 comments.data.map reverted to comments.map RED RED — TS2339 Property 'map' does not exist on type 'QueryResult of any'
3 'archived_only' added to the restated union RED RED — TS2322 against the declared four
4 wrong top-level key on an annotated ReportComponentSchema literal GREEN GREEN — 0 failed
5 the same wrong key one level down, inside ReportField RED RED — TS2561 'labell' does not exist in type 'ReportField'
6 the calendar-view fragment marker disabled RED RED — 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

command exit verdict line
node scripts/check-doc-snippet-types.mjs 0 Every covered documentation snippet compiles against the built types.
node scripts/check-doc-fence-languages.mjs 0 every 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.mjs 0 Every documented component type is registered.
node scripts/check-doc-links.mjs 0 Links are valid across 17 scan roots.
node scripts/check-control-bytes.mjs 0 OK (scanned 6140 tracked text file(s); skipped 85 binary)
node scripts/check-readme-exports.mjs 0 406 self-imports judged (406 real, 0 wrong-path, 0 fabricated)
node scripts/check-skill-examples.mjs 0 Every marked skill example holds up against the built types.
node scripts/check-changeset-presence.mjs 0 No 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) 0 Test Files 15 passed (15) / Tests 489 passed (489)
pnpm run lint:root 0 32 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 #7432 landed 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-sales and 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-actions github-actions Bot added documentation Improvements or additions to documentation plugin labels Sep 3, 2026
@github-actions

github-actions Bot commented Sep 3, 2026

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

Metric Value Budget
Eager closure (gzip, 48 chunks) 3178.8 KB 3191.4 KB
Main entry chunk (gzip) 143.2 KB 350 KB
Entry file index-Brm1fWPZ.js —
Status PASS —

The eager closure is every chunk the entry reaches through static imports — what the browser fetches and parses before the app renders. The entry chunk on its own is a small fraction of it.


📦 Bundle Size Report

Package Size Gzipped
app-shell (consoleActionDispatch.js) 0.20KB 0.19KB
app-shell (index.js) 15.67KB 5.75KB
app-shell (runtime-config.js) 20.68KB 7.36KB
app-shell (types.js) 0.01KB 0.04KB
app-shell (urlParams.js) 10.06KB 3.86KB
auth (ActiveOrganizationStorage.js) 25.05KB 9.16KB
auth (AuthContext.js) 0.31KB 0.24KB
auth (AuthGuard.js) 2.07KB 1.00KB
auth (AuthProvider.js) 40.18KB 10.59KB
auth (AuthShell.js) 3.49KB 1.40KB
auth (ForgotPasswordForm.js) 12.21KB 3.45KB
auth (LoginForm.js) 18.15KB 5.39KB
auth (PreviewBanner.js) 0.90KB 0.50KB
auth (RegisterForm.js) 6.65KB 2.22KB
auth (SocialSignInButtons.js) 9.61KB 3.89KB
auth (UserMenu.js) 3.41KB 1.23KB
auth (auth-gate-events.js) 1.29KB 0.66KB
auth (authStyles.js) 5.04KB 1.72KB
auth (createAuthClient.js) 40.21KB 10.80KB
auth (createAuthenticatedFetch.js) 8.46KB 3.43KB
auth (index.js) 3.19KB 1.44KB
auth (invitation-status.js) 1.22KB 0.70KB
auth (org-roles.js) 6.66KB 2.78KB
auth (phone-identifier.js) 1.11KB 0.66KB
auth (types.js) 0.59KB 0.35KB
auth (useAuth.js) 5.30KB 1.02KB
auth (useWorkspaceAdminStatus.js) 5.13KB 2.35KB
collaboration (CommentThread.js) 26.08KB 7.56KB
collaboration (LiveCursors.js) 3.17KB 1.27KB
collaboration (PresenceAvatars.js) 6.49KB 2.64KB
collaboration (PresenceProvider.js) 2.79KB 1.13KB
collaboration (index.js) 1.68KB 0.73KB
collaboration (useCollaborationTranslation.js) 6.05KB 2.52KB
collaboration (useCommentSearch.js) 1.98KB 0.88KB
collaboration (useConflictResolution.js) 7.75KB 1.86KB
collaboration (useMentionNotifications.js) 1.81KB 0.68KB
collaboration (usePresence.js) 6.33KB 1.84KB
collaboration (useRealtimeSubscription.js) 7.91KB 2.01KB
components (index.js) 516.24KB 117.82KB
core (index.js) 5.80KB 2.32KB
create-plugin (index.js) 10.08KB 3.26KB
data-objectstack (index.js) 178.20KB 49.60KB
fields (index.js) 244.08KB 61.71KB
i18n (LocalizationContext.js) 1.76KB 0.96KB
i18n (currency.js) 1.22KB 0.64KB
i18n (fallbackInterpolation.js) 6.25KB 2.77KB
i18n (i18n.js) 4.28KB 1.75KB
i18n (index.js) 3.44KB 1.39KB
i18n (pickLocalized.js) 7.62KB 3.26KB
i18n (provider.js) 26.89KB 9.04KB
i18n (useDisplayLocale.js) 2.85KB 1.45KB
i18n (useObjectLabel.js) 33.40KB 8.71KB
i18n (useSafeTranslation.js) 5.60KB 2.33KB
layout (index.js) 38.98KB 10.98KB
mobile (MobileProvider.js) 0.92KB 0.49KB
mobile (ResponsiveContainer.js) 0.94KB 0.38KB
mobile (breakpoints.js) 1.51KB 0.70KB
mobile (createOfflineDataSource.js) 5.61KB 1.75KB
mobile (index.js) 1.55KB 0.62KB
mobile (offlineQueue.js) 3.91KB 1.35KB
mobile (pwa.js) 0.97KB 0.49KB
mobile (serviceWorker.js) 1.48KB 0.62KB
mobile (serviceWorkerSource.js) 3.41KB 1.48KB
mobile (useBreakpoint.js) 1.54KB 0.65KB
mobile (useGesture.js) 6.96KB 1.98KB
mobile (useOfflineSync.js) 1.99KB 0.72KB
mobile (usePullToRefresh.js) 2.53KB 0.85KB
mobile (useResponsive.js) 0.72KB 0.42KB
mobile (useResponsiveConfig.js) 1.37KB 0.63KB
mobile (useSpecGesture.js) 4.32KB 1.64KB
mobile (useTouchTarget.js) 1.01KB 0.54KB
permissions (MePermissionsProvider.js) 11.71KB 4.29KB
permissions (PermissionContext.js) 0.31KB 0.25KB
permissions (PermissionGuard.js) 0.89KB 0.45KB
permissions (PermissionProvider.js) 6.24KB 2.16KB
permissions (discardProofCache.js) 1.04KB 0.55KB
permissions (evaluator.js) 5.12KB 1.74KB
permissions (index.js) 0.93KB 0.41KB
permissions (store.js) 0.91KB 0.42KB
permissions (useFieldPermissions.js) 1.28KB 0.53KB
permissions (usePermissions.js) 4.83KB 2.27KB
plugin-ai (index.js) 15.75KB 3.80KB
plugin-calendar (index.js) 47.14KB 13.02KB
plugin-charts (index.js) 70.31KB 19.55KB
plugin-chatbot (index.js) 196.19KB 46.43KB
plugin-dashboard (index.js) 132.79KB 34.62KB
plugin-designer (index.js) 212.87KB 43.19KB
plugin-detail (index.js) 251.27KB 64.20KB
plugin-editor (index.js) 2.46KB 1.10KB
plugin-form (index.js) 132.87KB 32.66KB
plugin-gantt (index.js) 167.18KB 40.94KB
plugin-grid (index.js) 209.25KB 56.71KB
plugin-kanban (index.js) 53.21KB 14.66KB
plugin-list (index.js) 113.53KB 27.66KB
plugin-map (index.js) 20.20KB 6.66KB
plugin-markdown (index.js) 13.72KB 4.69KB
plugin-report (index.js) 43.51KB 11.94KB
plugin-timeline (index.js) 30.21KB 8.66KB
plugin-tree (index.js) 8.98KB 3.08KB
plugin-view (index.js) 85.90KB 21.12KB
providers (DataSourceProvider.js) 0.75KB 0.39KB
providers (MetadataProvider.js) 1.37KB 0.59KB
providers (ThemeProvider.js) 1.90KB 0.85KB
providers (UploadProvider.js) 11.66KB 3.50KB
providers (index.js) 0.45KB 0.23KB
providers (types.js) 0.01KB 0.04KB
react-runtime (index.js) 5.62KB 2.34KB
react (LazyPluginLoader.js) 4.47KB 1.63KB
react (SchemaRenderer.js) 81.07KB 26.86KB
react (data-invalidation.js) 5.05KB 2.08KB
react (index.js) 3.11KB 1.48KB
react (schema-input.js) 2.32KB 1.24KB
react (spec-input.js) 0.20KB 0.18KB
sdui-parser (codegen.js) 5.41KB 2.34KB
sdui-parser (dashboard-widget-options.js) 3.08KB 1.30KB
sdui-parser (index.js) 4.93KB 2.24KB
sdui-parser (input-type.js) 2.84KB 1.40KB
sdui-parser (parse.js) 20.57KB 5.88KB
sdui-parser (provenance.js) 3.66KB 1.82KB
sdui-parser (types.js) 0.28KB 0.23KB
sdui-parser (validate.js) 10.35KB 3.60KB
types (ai.js) 0.20KB 0.17KB
types (api-types.js) 0.20KB 0.18KB
types (app.js) 2.87KB 0.99KB
types (base.js) 0.20KB 0.18KB
types (blocks.js) 0.20KB 0.18KB
types (complex.js) 2.74KB 1.41KB
types (crud.js) 0.20KB 0.18KB
types (dashboard-filter-alias.js) 6.23KB 2.74KB
types (data-display.js) 3.75KB 1.85KB
types (data-protocol.js) 0.20KB 0.19KB
types (data.js) 0.20KB 0.18KB
types (designer.js) 1.85KB 0.85KB
types (disclosure.js) 0.20KB 0.18KB
types (error-code.js) 1.54KB 0.88KB
types (feedback.js) 0.20KB 0.18KB
types (field-types.js) 0.20KB 0.18KB
types (form.js) 0.20KB 0.18KB
types (http-inflight.js) 8.87KB 3.73KB
types (http-retry.js) 4.32KB 2.02KB
types (icon-key-migration.js) 4.26KB 1.63KB
types (index.js) 4.74KB 2.25KB
types (layout.js) 0.20KB 0.18KB
types (managed-by.js) 0.19KB 0.18KB
types (mobile.js) 2.59KB 1.31KB
types (navigation.js) 0.20KB 0.18KB
types (objectql.js) 0.20KB 0.18KB
types (overlay.js) 0.20KB 0.18KB
types (permissions.js) 0.20KB 0.18KB
types (plugin-scope.js) 0.20KB 0.18KB
types (record-components.js) 0.20KB 0.19KB
types (record-semantics.js) 1.28KB 0.67KB
types (registry.js) 0.20KB 0.18KB
types (reports.js) 0.20KB 0.18KB
types (spec-report.js) 5.05KB 1.93KB
types (spec-ui-namespace.js) 0.20KB 0.19KB
types (system-fields.js) 3.33KB 1.54KB
types (theme.js) 6.28KB 2.87KB
types (ui-action.js) 8.11KB 3.32KB
types (views.js) 0.20KB 0.18KB
types (widget.js) 0.20KB 0.18KB

Size Limits

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

os-sales commented Sep 3, 2026

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(await colorsFor('accent', [{ ...ROW, accent: '#abc' }])).toEqual(['#abc']);      // passes
expect(await colorsFor('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 free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentation Improvements or additions to documentation plugin

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants