Skip to content

fix(types,plugin-dashboard)!: object-pivot and object-data-table refuse the DrillDownConfig members they never read (objectui#10685) - #10710

Merged
objectstack-fleet[bot] merged 8 commits into
mainfrom
claude/issue-10685-drilldown-per-block
Sep 27, 2026
Merged

objectstack-fleet[bot] merged 8 commits into
mainfrom
claude/issue-10685-drilldown-per-block

Conversation

@objectstack-fleet

@objectstack-fleet objectstack-fleet Bot commented Sep 25, 2026 •

Copy link
Copy Markdown
Contributor

Fixes #10685
Clause-②: no — a per-block narrowing, as the ruling recorded for objectui#9002

What this does

This applies objectui#9002's ruling B (comment 5643445104, a per-block refusal) to the sibling blocks of object-metric, as triage 5837818071 directed. Each block refuses, by name, the DrillDownConfig members it can never honour; the shared DrillDownConfig keeps every member for the blocks that read them. The seat's round-2 ruling (option A) widened the claim's file surface by packages/types/src/objectql.ts and packages/types/src/zod/objectql.zod.ts, so the object-data-table half shuts BOTH doors here, and merging this PR completes the card.

  • @object-ui/types adds two per-block shapes beside ObjectMetricDrillDownConfig in data-display.ts, exported on the root entry and on the @object-ui/types/data-display subpath:
  • TypeScript door. ObjectDataTableSchema.drillDown in objectql.ts is typed with ObjectDataTableDrillDownConfig. The data table's component prop is anchored Equal to that schema by the two objectui#6576 pins, so the widget's prop refuses exactly what the schema refuses.
  • Zod door. The object-data-table mirror's drillDown in objectql.zod.ts is the shared DrillDownConfigSchema extended so that filter, maxRows and report are retirementTombstone arms whose messages name the key and the blocks that read it, and target is z.enum(['drawer', 'dialog']) with an error naming the refused 'navigate'. enabled, mode, title and columns parse exactly as before. Nothing else in objectql.zod.ts changes. This is the door objectui validate and objectui check run (safeValidateSchema), so a stored JSON table config carrying one of the four is now refused there.
  • @object-ui/plugin-dashboard: ObjectPivotTableProps.schema gains drillDown?: ObjectPivotDrillDownConfig, and the component reads its drill config through that type instead of through any.
  • Docblocks: the shared DrillDownConfig.mode docblock names only object-data-table (none of charts, pivot tables or metric cards reads it) and says what each value does there; the DrillDownConfig class docblock no longer says "target is honoured by all of them", and the declared-keys pin's comment no longer names the table among the navigateOnly deliverers.
  • object-chart: no type change (see H4). Its refused set is pinned.
  • Pins: drill-down-per-block-10685.test.ts in @object-ui/types (one describe per block, @ts-expect-error per refused member with the read members as controls, plus a RUNTIME describe over the zod door), and ObjectPivotTable.drillDownRefusal-10685.test.tsx in @object-ui/plugin-dashboard (the published component's prop). The two 6576 anchor pins are re-pointed at the table shape, and the 7352 mirror pin's table leg runs over the values the table now accepts, with a non-vacuity check that the host-synthesised table configs stay in it.
  • Changesets: 10685-drilldown-per-block.md (@object-ui/types minor with a breaking banner, @object-ui/plugin-dashboard patch) opens with the banner "Breaking for authored metadata, graded minor by this repo's convention": objectui validate / safeValidateSchema now refuse a stored object-data-table config carrying drillDown.filter, .maxRows, .report or target: 'navigate' that parsed green before, none was ever read, and the migration is to delete the key or write 'drawer' / 'dialog'. minor because the change narrows the published validator's accept set and the published ObjectDataTableSchema type, the grade every pending zod-door refusal in this repo carries (6881, 6951, 6972, 7322, 7963, 8801, 7352); objectui#9002's patch was graded on a TypeScript-door-only refusal, which does not describe this change. @object-ui/plugin-dashboard stays patch: a React-prop narrowing with no runtime door, the 9002 shape. The changeset also says object-pivot's refusal is at the TypeScript door only (no zod mirror exists for it). H6: .changeset/7352-drill-down-config-mirror.md and .changeset/6576-widget-schema-anchors.md each have the falsified sentence scoped "at this change" plus a ⚠️ Dated note, 2026-09-25 … objectui#10685; frontmatter md5 before and after: 7352 ecedb10c5189b2c8841ea736b67c3cc6 both, 6576 b25dbc26fe50c14d0b6f0cc8fe6cb9e1 both.

H1: the table, re-measured per block

Read sites were re-read on origin/main 5c61e524 this round. The one-member-at-a-time runtime probe (rendered DOM, data source calls and openRecordList calls compared against a control, with and without a DrillNavigationProvider) was run in round 1 at bc97f9247 and is recorded in report comment 5839013332; it was not re-run, and no read site moved since.

block reads never reads
object-chart enabled (isDrillEnabled), filter (computeDrillFilter), title (resolveDrillTitle), target including 'navigate' (openRecordList), maxRows (drawer pageSize), columns mode, report: already refused by the spec's ChartDrillDown type and by the zod mirror (unrecognized_keys)
object-pivot enabled, filter, title, and target, columns, maxRows, report through DrillDownDrawer mode
object-data-table enabled (isDrillEnabled), mode ('record' opens the row; 'filter' turns the drill off), a non-template title, columns (the record drawer's field list), target in two arms ('dialog', anything else drawn as a drawer) filter, maxRows, report; target: 'navigate' was drawn as a drawer

@object-ui/core's drill-down.ts helpers read enabled, filter and title only; DrillNavigationContext carries one handler, openRecordList(objectName, filter); the data-table renderer the table spreads its node into never names drillDown; RecordDetailDrawer takes fields, title and a two-armed target.

The card's runtime-door bullet also names ChartSchema.drillDown. That is the plain chart node, whose renderer ChartRenderer.tsx reads no drillDown; it is outside this card's three blocks and deliberately untouched, the plain-chart remainder.

H2: can never honour, or not yet honoured (one line each)

  • object-pivot · mode: never. Every pivot click point is an aggregated bucket (a cell, a row or column header, a total), so the pivot always drills through; mode chooses drill-to-record for a clicked ROW, and a pivot has none. This is the metric's reasoning in 5643445104.
  • object-chart · mode, report: never, by the contract. Its drill type is @objectstack/spec's ChartDrillDown, which declares neither; the spec's schema refuses both by name ("A chart segment is always an aggregate"). Already refused before this card; only pinned here.
  • object-data-table · filter, maxRows, report: never. All three configure a drilled LIST (its scope, its row cap, the report that replaces it). The table drills to the RECORD its row already is, RecordDetailDrawer lists nothing, and the block's mode: 'filter' arm is pinned as "ignored", so there is no list drill for them to act on. A row that drills through to a list of another object would need a drill-target member DrillDownConfig does not have: a new capability, not an unread member.
  • object-data-table · target: 'navigate': refused, not honoured (H3).

H3: navigate on the data table

object-chart honours navigate by calling openRecordList(objectName, merged filter), the object's LIST page scoped by the drill filter. DrillNavigationContext has no record-level handler and @object-ui/app-shell's useOpenRecordList builds only the list route. The table's click point is one record, so the list page is the wrong destination, and a "navigate to this record" arm needs a new host seam, not a small hunk. So the table's shape refuses navigate on both doors and an author gets a type error, or a validate refusal, instead of a drawer.

H4: where the shape differs from PR objectui#10681

  • object-chart keeps its spec-bound type. ObjectChartSchema.drillDown is already per-block (the spec's ChartDrillDown), pinned Equal to that symbol by object-chart-undeclared-keys-8885.test.ts. A tombstoned local type would unbind it from the spec. A fresh mode or report literal is already a compile error and the zod mirror already refuses both by name.
  • Registration sentences: none added. The object-pivot and object-data-table registrations advertise no drillDown input (adding one widens the designer palette, a shape decision). object-chart's description is pinned by packages/plugin-charts/src/index.test.ts to list exactly the six spec keys and NOT mode or report.
  • Zod door narrowed for the table only, because a runtime validator (safeValidateSchema, run by objectui validate) reads that block's drill members and accepted all four; the round-1 probe showed the same door refuses a bad value on enabled, so it does reach drillDown. object-pivot has no zod mirror, so its refusal is TypeScript-only and the changeset says so.

Verification (measured at 430223947f = a1217b515 merged with origin/main 5c61e524; head 64d43b6d67 = that head + a second merge of origin/main 41ae65b26 + the changeset commit)

  • Round 3 delta and its gates (head 64d43b6d67). Against 430223947f the 14 files of this card differ in two places only: the changeset (the minor grade and its banner) and one line of index.ts that main's own refactor(types,plugin-kanban): retire ColumnWidthConfig / ColumnWidthConfigSchema (objectui#10582) #10730 deleted (a retired ColumnWidthConfig export); the other 12 are byte-identical, and the branch's diff against main is still exactly these 14 files. Re-run at this head, each exit 0: check-changeset-presence (11 source files of 2 released packages, 1 changeset); changeset:check; check-changeset-no-major (the Changeset Bump Policy step); check:changeset-claims (36 pending changesets, unchanged reading); check:pending-changeset-literals; check:new-line-citations (0 new citation(s)); check:control-bytes OK; check-changeset-overwrite (report-only: it reports the 6576 and 7352 edits, the intended shape). No suite, type-check or ablation was re-run: the delta is a changeset plus main's already-green commits merged with a clean merge-tree, and none of the measured sources moved.

  • Closure build pnpm --workspace-concurrency=2 --filter '@object-ui/plugin-dashboard^...' run build, under the verify lock: VERDICT command-exit 0. dist/data-display.d.ts and dist/objectql.d.ts carry ObjectDataTableDrillDownConfig (2 hits each), dist/index.d.ts carries ObjectPivotDrillDownConfig.

  • pnpm --filter @object-ui/types run type-check then pnpm --filter @object-ui/plugin-dashboard run type-check: VERDICT command-exit 0. tsc --listFilesOnly on each tsconfig.test.json lists the four types pins and the two plugin-dashboard pins, and plugin-dashboard's program reads @object-ui/types through dist/data-display.d.ts and dist/objectql.d.ts.

  • pnpm exec vitest run --maxWorkers=2 packages/types/ packages/plugin-dashboard/ from the repo root: Test Files 378 passed (378), Tests 6562 passed (6562), VERDICT command-exit 0.

  • Gates, each exit 0: check-changeset-presence (11 source files of 2 released packages, 1 changeset); check:new-line-citations (0 new citation(s)); check:control-bytes OK; changeset:check (no major); check:pending-changeset-literals; check:changeset-claims (36 pending changesets name a touched file; the two whose prose is about drill-down, 7363 and 8885, were read and stay true, and the rest describe other regions of these files); check:spec-symbols; check:self-import; check:esm-specifiers; check:test-path-roots; check:vi-mock-specifiers; check:handler-key-reads; check:unreferenced-sources; check:metadata-write-doors; type-check:coverage; check:component-surface-parity; check:doc-types; check-governed-queue-guard --test over the 14 paths: NOT GOVERNED.

  • NOT MEASURED: check:readme-exports exits 1 on a prerequisite (385 README self-imports unjudgeable because other packages' dist/index.d.ts are not built); this diff edits no README. Left to CI.

  • ESLint was run on the 11 touched source and test files, not the whole repo. The narrowing is a measurement, for three reasons: the config is the root eslint.config.js and neither package has its own; --format json reports 11 files, 0 errors and 80 warnings (all no-explicit-any, none on a line this branch added, by intersecting message lines with the branch's added-line set); --print-config shows empty parserOptions, so there is no type-aware linting and the diff cannot move any untouched file's verdict. Under --no-inline-config the same run shows 1 error, the block-disabled SpecFormField alias in index.ts that is on main and outside this diff; the package lint scripts are eslint ., which honours the disable. Full pnpm lint is left to CI.

  • CI on this head: Inert vi.mock Specifier Check is red on main since f9c06ef6a (PR objectui#10729), filed as objectui#10732. Confirmed locally in a no-install probe worktree at 5c61e524: exactly one hit, apps/console/src/__tests__/filterContextTokensSweep-10666.test.tsx, outside this surface; in an installed worktree the specifier is found through node_modules and the checker passes. Not touched here.

Red on base, then green on head

The five touched sources (data-display.ts, index.ts, objectql.ts, zod/objectql.zod.ts, ObjectPivotTable.tsx) were swapped to their origin/main 5c61e524 blobs with the HEAD pins in place, then restored to HEAD (every blob equal to HEAD, git diff HEAD empty, types dist rebuilt, markers back to 2 and 1).

  • Types test program (tsc -p tsconfig.test.json): exit 2. TS2305/TS2724 on the two new type names imported by the per-block pin and the 6576 pin, and nine TS2578 Unused '@ts-expect-error' on the per-block pin's refusals (the pivot's two, the table's seven).
  • Vitest on the per-block pin and the 7352 mirror pin: Tests 4 failed | 59 passed (63), the four failures being the zod describe's filter, maxRows, report and target rows.
  • Types dist built from base sources (markers 0 and 0), then the plugin-dashboard test program: exit 2, TS2305 on the 6576 anchor's ObjectDataTableDrillDownConfig import and two TS2578 on the pivot pin.

Ablations (each through ablation-replace.mjs: anchor hit once, blob changed, command run, restored to the HEAD blob with an empty git diff HEAD)

  • TS wiring. ObjectDataTableSchema.drillDown back to the shared DrillDownConfig, with a JSDoc marker ABLATED_10685_TS1 on the line. Types program exit 2: TS2344 on _SchemaTakesTheTableShape, TS2578 on nodeWithFilter and nodeWithNavigate, TS2344 on the 6576 pin's assertionDrillDownDeclared, plus zod-mirror-parity.test.ts going red with objectql.zod.ts#ObjectDataTableSchema (the repo's TS/zod parity pin sees the two doors disagree: a second, independent instrument). Dist leg: types rebuilt, marker count in dist/objectql.d.ts 1, plugin-dashboard program exit 2 (TS2344 on ObjectDataTable.schemaAnchor-6576's Equal); after the restore rebuild the marker count is 0 and ObjectDataTableDrillDownConfig is back to 2. A first pass of this leg read the dist marker with the wrong grep (tsc emits the import() type with single quotes) and got 0; the downstream red was the same in both passes, and the marker form above is the evidence.
  • Each table tombstone alone (never to DrillDownConfig['KEY']): filter gives TS2578 on withFilter and nodeWithFilter; maxRows on withMaxRows; report on withReport; target widened back to the shared union gives TS2578 on withNavigate and nodeWithNavigate. Each also turns zod-mirror-parity red as above.
  • Pivot tombstone neutralised (marker ABLATED_10685_PIVOT): types program TS2578 on withMode and handedAcross; dist marker 1; plugin-dashboard program exit 2 with two TS2578 on the pivot pin; marker 0 after the restore rebuild.
  • Chart binding (ObjectChartSchema.drillDown to the shared type): TS2578 on the chart pin's withMode and withReport, plus the 8885 pin's TS2344 and TS2578.
  • Zod door back to the shared mirror: Tests 4 failed | 59 passed (63), the four refusal rows. Each zod member alone (the tombstone renamed away, or target widened to include navigate): exactly one failure each, its own row, 62 passed.

Direction: red as predicted in every leg, with one increase (the parity pin) beyond the prediction.

Serial

origin/main 5c61e524 and PR objectui#8941's head bb7d5e718 (claude/pr-7058-lucide-react-1.41.0) were fetched into private refs; git merge-tree --write-tree exits 0 against both. PR objectui#10707 and PR objectui#10643 have merged; objectui#10657 has no open PR and no branch (its test is on main). main had moved in three of this PR's files (the filter docblocks in objectql.ts, the masked column in data-display.ts, the filter describes in objectql.zod.ts), so main was merged in (430223947f, a merge commit, no conflicts). In round 3 main had moved again in one file (index.ts, #10730's retired export), so origin/main 41ae65b26 was merged in the same way (4f2f7a530f, no conflicts). At head 64d43b6d67, merge-tree --write-tree exits 0 against origin/main 41ae65b26 and against the three open PRs that touch these files: PR objectui#10734 (856ecc953, ObjectChartSchema regions of objectql.ts / objectql.zod.ts, disjoint), PR objectui#10714 (218f642484, data-display.ts) and PR objectui#8941 (bb7d5e718, objectql.ts). The branch diff against main is exactly the 14 files of this card.

Acceptance notes

  • mode: 'filter' on object-data-table turns the row drill off, as ObjectDataTable.drill.test.tsx pins, instead of drilling through. The rewritten docblock says so. Value-level, outside the card's member set; recorded here only.
  • maxRows reaches each drill list as the drill table's pageSize (DrillDownDrawer and the chart's drawer), a page size rather than the "Hard cap on rows fetched" the shared docblock promises. Observation, outside this card.
  • object-chart, non-fresh values. A value typed as the shared DrillDownConfig is still assignable to ObjectChartSchema.drillDown, because the spec type omits mode and report rather than tombstoning them. No producer in the tree hands a typed shared config across.
  • Spec guidance text. @objectstack/spec's ChartDrillDownSchema refusal text for mode calls it "a TABLE / PIVOT / METRIC drill key"; on object-pivot and object-metric it is now refused. Reported to the seat in round 1 for the spec repository; not touched here.
  • PR assignee. Set to os-elon-musk in round 1 (read back matching); found empty at the start of this round and set again to match the card's assignee, per the dispatch rule.

Session: https://claude.ai/code/session_014mXUNuFomfj24w7s1pZzhN


Generated by Claude Code

…ts prop type

`object-pivot` takes its own drill shape, `ObjectPivotDrillDownConfig`:
the shared `DrillDownConfig` with `mode?: never`. Every pivot click point
is an aggregated bucket, so the block always drills through and never
read `mode`. The `DrillDownConfig.mode` docblock now names only the block
that reads the key, `object-data-table`.

Pins, compile-time: the per-block shapes for object-pivot and object-chart
in @object-ui/types, and ObjectPivotTable's schema.drillDown prop in
@object-ui/plugin-dashboard.

Co-Authored-By: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014mXUNuFomfj24w7s1pZzhN
…ntry's mode reading

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

github-actions Bot commented Sep 25, 2026 •

Copy link
Copy Markdown
Contributor

changeset-claim-re-read

⚠️ 36 pending changeset(s) describe a file this change touches

Their bodies publish verbatim into the CHANGELOG at the next release, so this is a request to re-read them against your diff — addressed here because you are the one seat that can answer it without re-deriving anything.

⛔ Nothing here blocks, and nothing here is a verdict on your change. This gate exits 0, is not a required context, and judges name resolution, never meaning: it asked whether a pending body names a file you touched. "Is this sentence still true?" is the one question it will not answer, and the one you are being asked to answer.

.changeset/5903-objectgantt-declared-keys.md

  • names packages/types/src/objectql.ts → packages/types/src/objectql.ts — edited by this change

    Both halves move together. The TS declaration (packages/types/src/objectql.ts) and its zod mirror (src/zod/objectql.zod.ts) gain the same ten keys at the same requiredness — all optional — and no KnownDrift entry is added. navigation is taken from @objectstack/spec's NavigationConfigSchema by reference rather than restated, matching ObjectGridSchema.navigation.

  • names src/zod/objectql.zod.ts → packages/types/src/zod/objectql.zod.ts — edited by this change

    Both halves move together. The TS declaration (packages/types/src/objectql.ts) and its zod mirror (src/zod/objectql.zod.ts) gain the same ten keys at the same requiredness — all optional — and no KnownDrift entry is added. navigation is taken from @objectstack/spec's NavigationConfigSchema by reference rather than restated, matching ObjectGridSchema.navigation.

.changeset/6051-gantt-flat-config-declared-keys.md

  • names packages/types/src/index.ts → packages/types/src/index.ts — edited by this change

    GanttConfig itself gains nine members and is a published type, exported by name from packages/types/src/index.ts: lockField, objectField, summaryExtent, defaultCollapsedDepth, borderColorField, dependencyTypes, timeZone, exportFileName, interactions. The entry file's diff is empty only because the export list already named the type — the widening happened at the declaration.

.changeset/6349-types-internal-name-collisions-batch-1.md

  • names data-display.ts → packages/types/src/data-display.ts — edited by this change

    BreadcrumbItem / BreadcrumbSchema — re-pointed, because one copy was stale. Both were declared in data-display.ts and in navigation.ts. The data-display pair was not a second dialect but a strict SUBSET: no key declared differently on either side, and missing BreadcrumbItem.icon / onClick / siblings and BreadcrumbSchema.maxItems. Everything that reads a breadcrumb was already on the navigation declaration — registry.ts maps the 'breadcrumb' component type to it, src/index.ts re-exports it under the bare names, zod/navigation.zod.ts mirrors it (icon, onClick, siblings, maxItems included), the ui:breadcrumb renderer consumes it, and the component's own documentation page documents icon and maxItems. data-display.ts now re-exports the one authority.

.changeset/6881-retire-data-table-toolbar.md

  • names data-display.ts → packages/types/src/data-display.ts — edited by this change

    What was measured. The key was declared on both published faces — data-display.ts (toolbar?: SchemaNode[], "Table toolbar actions/content") and the Zod mirror (SchemaNode | SchemaNode[]) — documented, mirrored, and read by NOTHING: data-table.tsx, the registered renderer for type: 'data-table', contains the word only in two prose comments and never reads schema.toolbar. The sibling emptyAction slot on the same interface IS mounted through SchemaRenderer, so the census zero is a reading, not a blind query. An author who wrote a toolbar got a green document and a blank result, with no signal anywhere that said so — the declared-vs-enforced failure mode that is worst for AI-authored metadata, which has nothing but the declaration to go on.

.changeset/6940-rowactions-boolean-mirror.md

  • names zod/objectql.zod.ts → packages/types/src/zod/objectql.zod.ts — edited by this change

    The list view's same-named rowActions in zod/objectql.zod.ts — z.array(z.string()), the legacy bare-name action list on ObjectGridSchema — is a different key that is correct as it stands, is in parity with its own TS twin (rowActions?: string[]), and is not touched.

.changeset/6951-tree-view-data-retired.md

  • names data-display.ts → packages/types/src/data-display.ts — edited by this change

    Two published faces, one retirement — and why a tombstone, not a deletion. The TypeScript interface TreeViewSchema (@object-ui/types, data-display.ts) declares data?: never; the Zod mirror TreeViewSchema (@object-ui/types/zod, data-display.zod.ts) declares data as a retirementTombstone(). BaseSchema already declares data?: any (z.any().optional() on the mirror), so DELETING the member would not have refused the key — it would have ADMITTED it, unvalidated, through the base member, and the renderer would have drawn an empty tree. The tombstone on the extended schema shadows the base member on both faces; the pin measures the base accepting the very document the extended schema refuses.

.changeset/6972-markdown-inert-keys-retired.md

  • names data-display.ts → packages/types/src/data-display.ts — edited by this change

    What was measured, on this branch's base. sanitize was declared ?: boolean with @default true on both published faces — data-display.ts and the Zod mirror — documented, and read by NOTHING. Worse than an ordinary inert key, it implied a switch that does not exist: sanitization is unconditional. rehypePlugins in plugin-markdown/src/MarkdownImpl.tsx is a module-level const array whose last link is [rehypeSanitize, sanitizeSchema], handed to ReactMarkdown as-is — no ternary, no if, no runtime assembly. MarkdownRenderer forwards exactly content and className, and MarkdownImplProps accepts only those two. A repo-wide grep for schema.sanitize over packages/ and apps/ returns nothing, against a control of 20 .tsx files reading schema.content in the same query shape, so the zero is a reading, not a blind query. An author writing sanitize: false believed they turned XSS filtering off; one writing sanitize: true believed they turned it on. Neither was true.

.changeset/7113-chart-data-model.md

  • names objectql.zod.ts → packages/types/src/zod/objectql.zod.ts — edited by this change

    .extend() with a NEW key still works and preserves the fold and the refinement; .optional(), z.discriminatedUnion, z.toJSONSchema and safeValidateSchema are all unaffected. Nothing in this repository calls the throwing combinators on either const, and the published surface already ships refined mirrors (objectql.zod.ts, complex.zod.ts, form.zod.ts, app.zod.ts), so the class is not new — but it is a real behaviour change on a published export and it belongs in the release note rather than in a reviewer's file.

.changeset/7200-object-form-section-style-keys-undeclared.md

  • names zod/objectql.zod.ts → packages/types/src/zod/objectql.zod.ts — edited by this change

    The authored-metadata type now agrees with @objectstack/spec, whose FormSectionSchema is a strict object declaring neither key, and with the ruling's rationale (maintainer 2026-09-01, verbatim): "retire the reads … Declaring the keys was weighed and not adopted: it would formally invite free Tailwind strings into authored metadata, the exact class the boundary exists to keep out." A ?: never tombstone was not used: ObjectFormSection has no zod mirror (ObjectFormSchema in zod/objectql.zod.ts does not declare sections), so there is no parse door to refuse at, and a tombstone is still a declaration in completion and in the published .d.ts.

.changeset/7265-types-user-filter-field-derives.md

  • names zod/objectql.zod.ts → packages/types/src/zod/objectql.zod.ts — edited by this change

    zod/objectql.zod.ts declared two schemas under names @objectstack/spec/ui already exports. They were triaged separately, by reading their sites, and went different ways.

.changeset/7322-object-kanban-group-by-limit.md

  • names objectql.ts → packages/types/src/objectql.ts — edited by this change

    Breaking for authored metadata: ObjectKanbanSchema.groupField is RETIRED (objectui#7322, ADR-0049 enforce-or-remove), and the two keys the object-kanban renderer actually reads — groupBy and limit — are now DECLARED and validated on both published faces: the TypeScript interface in objectql.ts and the Zod mirror in zod/objectql.zod.ts.

  • names zod/objectql.zod.ts → packages/types/src/zod/objectql.zod.ts — edited by this change

    Breaking for authored metadata: ObjectKanbanSchema.groupField is RETIRED (objectui#7322, ADR-0049 enforce-or-remove), and the two keys the object-kanban renderer actually reads — groupBy and limit — are now DECLARED and validated on both published faces: the TypeScript interface in objectql.ts and the Zod mirror in zod/objectql.zod.ts.

.changeset/7363-objectql-union-arms.md

  • names objectql.ts → packages/types/src/objectql.ts — edited by this change

    ObjectGallerySchema and ObjectDataTableSchema are members of ObjectQLComponentSchema on both faces — the TS union in objectql.ts and the zod union in zod/objectql.zod.ts — so AnyComponentSchema, and with it validateSchema / safeValidateSchema / objectui validate, has an arm for object-gallery and object-data-table nodes (objectui#7363).

  • names zod/objectql.zod.ts → packages/types/src/zod/objectql.zod.ts — edited by this change

    ObjectGallerySchema and ObjectDataTableSchema are members of ObjectQLComponentSchema on both faces — the TS union in objectql.ts and the zod union in zod/objectql.zod.ts — so AnyComponentSchema, and with it validateSchema / safeValidateSchema / objectui validate, has an arm for object-gallery and object-data-table nodes (objectui#7363).

.changeset/7632-shared-record-source-config.md

  • names packages/types/src/objectql.ts → packages/types/src/objectql.ts — edited by this change

    That ladder is published contract on both faces — packages/types/src/objectql.ts and its zod mirror both ship .describe() strings naming getDataConfig's order (objectui#6939, maintainer ruling 2026-09-02), pinned by objectql-record-source-refinement-6939.test.ts — and it was hand-copied into five plugin components with no gate holding them together. A change to the ruled order had five edit sites and nothing that noticed a missed one; that is the AGENTS.md #0.1 drift class.

.changeset/7722-wrapper-class-five-more.md

  • names data-display.ts → packages/types/src/data-display.ts — edited by this change

    Each of renderers/form/switch.tsx, textarea.tsx, date-picker.tsx, select.tsx and renderers/data-display/list.tsx reads schema.wrapperClass onto its wrapper element, and neither the TypeScript interface (form.ts, data-display.ts) nor the zod mirror (zod/form.zod.ts, zod/data-display.zod.ts) declared the key. The reads compiled through BaseSchema's index signature (objectui#5155) and the values parsed through .passthrough(), admitted unexamined. The same key, on the same class of read, is declared on CheckboxSchema (objectui#6938), FileUploadSchema and FilterBuilderSchema (objectui#6150); these five were left out only because their doc pages never listed it.

.changeset/7804-objectql-handler-key-arms.md

  • names objectql.ts → packages/types/src/objectql.ts — edited by this change

    The four plain objectql.ts node faces declare the nine handler keys their registered renderers read (objectui#7804, the objectql.ts slice): ObjectFormSchema.onCancel / .onError / .onOpenChange / .onStepChange / .onSuccess, ObjectGallerySchema.onCardClick / .onRowClick, ObjectGridSchema.onNavigate and ObjectViewSchema.onNavigate.

.changeset/7804-tree-view-handler-slot.md

  • names objectql.ts → packages/types/src/objectql.ts — edited by this change

    'runtime-slot' and not 'retired', measured at this key's own channel. 'retired' publishes "no renderer reads this key, so nothing could ever run it" — true of the two siblings already tombstoned on this arm (onSelectChange, onExpandChange) and flatly false here, since the read is live and INVOKED. ⚠️ No in-repo host builds a tree-view node carrying the key: the channel is wired end to end and only the supplier is absent, which is the same shape as ObjectFormSchema.onStepChange in this card's objectql.ts slice and is not evidence of a dead read. The TypeScript declaration is unchanged and still callable, so a programmatic host supplies it exactly as before.

.changeset/7917-export-breadcrumb-object-tree-zod-schemas.md

  • names objectql.zod.ts → packages/types/src/zod/objectql.zod.ts — edited by this change

    AnyComponentSchema declares 107 node component types. 105 of them could be named on the ./zod barrel — ButtonSchema.safeParse(node), which is what a designer, a form builder or a targeted test needs. The arms declaring type: 'breadcrumb' (navigation.zod.ts) and type: 'object-tree' (objectql.zod.ts) could not: both were already export const in their own module, but index.zod.ts — the package's only zod entry point — did not re-export them, so the schemas existed, were maintained, and were applied by the union while no consumer could name them.

.changeset/7963-alert-dialog-footer-keys-retired.md

  • names objectql.ts → packages/types/src/objectql.ts — edited by this change

    Nothing else moves. These spellings are overloaded across the tree and every other owner is a live key on a different declaration — FormSchema.cancelLabel, objectql.ts's confirmLabel, plugin-designer's ConfirmDialog React props, plugin-grid's def.confirmLabel, and plugin-form's ModalForm / DrawerForm, which build a local cancelLabel from schema.cancelText. None is an AlertDialogSchema; none is touched, and a pin asserts it. No fixture, catalog schema, example app or doc fence authored any of the three on an alert-dialog node, so no shipped document is stranded.

.changeset/8331-data-table-empty-action-primitive-node.md

  • names packages/types/src/data-display.ts → packages/types/src/data-display.ts — edited by this change

    Behaviour change on a published surface, deliberately. DataTableSchema.emptyAction is declared SchemaNode on both published faces — packages/types/src/data-display.ts and its Zod twin in packages/types/src/zod/data-display.zod.ts — and SchemaNode is BaseSchema | string | number | boolean | null | undefined. The empty-state render path additionally required typeof … === 'object', so an authored emptyAction: 'Create the first record' rendered nothing and reported nothing: declared wider than enforced, failing in the direction that loses the author's content without a diagnostic. A node that renders nothing today therefore starts rendering.

.changeset/8478-describe-line-addresses.md

.changeset/8735-objectql-mirror-docblocks-not-defaulted.md

  • names zod/objectql.zod.ts → packages/types/src/zod/objectql.zod.ts — edited by this change

    Correct four zod/objectql.zod.ts docblocks that described the behaviour objectui#8317 removed. Since that change the zod mirrors strip imported @objectstack/spec defaults at this package's import boundary, but the docblocks on HttpRequestSchema, ListColumnSchema, SelectionConfigSchema and PaginationConfigSchema still said, in the present tense, that method, prefix.type, type and pageSize are defaulted on parse — the opposite of what each export does. Each now says the key is declared and accepted but NOT defaulted on parse.

.changeset/8767-object-grid-refuses-string-sort.md

  • names packages/types/src/objectql.ts → packages/types/src/objectql.ts — edited by this change

    Migration. Write the array: sort: [{ field: 'name', order: 'desc' }]. Both keys are required. SortConfig.order carries no ? in @object-ui/types (packages/types/src/objectql.ts) and no .optional() in its zod mirror, and the protocol's own reusable SortItemSchema requires order as well — measured: that schema refuses [{ field: 'name' }] with invalid_value at 0.order. Do not omit it: this block's array arm interpolates whatever is present, so an omitted order lowers to $orderby: 'name undefined' today. That is pre-existing behaviour on the arm this change does not touch, and it is filed as a successor card rather than widened into here.

.changeset/8801-object-kanban-allow-collapse-retired.md

  • names packages/types/src/objectql.ts → packages/types/src/objectql.ts — edited by this change

    • the declarations retired here — packages/types/src/objectql.ts and its mirror packages/types/src/zod/objectql.zod.ts; - the pins that assert the retirement — object-kanban-allow-collapse-retired-8801.test.ts and bare-kanban-node-key-retired-8802.test.ts; - a comment in packages/types/src/zod/complex.zod.ts, recording that the deleted retiredZeroReadKanbanKey helper once carried this spelling on the SIBLING arm; - one row of content/docs/api/schema-reference.md; - the .changeset/ release notes that discuss it — this one, the two historical entries covering the sibling arm's own spelling, and objectui#9629's note recording the correction to this paragraph.
  • names packages/types/src/zod/objectql.zod.ts → packages/types/src/zod/objectql.zod.ts — edited by this change

    • the declarations retired here — packages/types/src/objectql.ts and its mirror packages/types/src/zod/objectql.zod.ts; - the pins that assert the retirement — object-kanban-allow-collapse-retired-8801.test.ts and bare-kanban-node-key-retired-8802.test.ts; - a comment in packages/types/src/zod/complex.zod.ts, recording that the deleted retiredZeroReadKanbanKey helper once carried this spelling on the SIBLING arm; - one row of content/docs/api/schema-reference.md; - the .changeset/ release notes that discuss it — this one, the two historical entries covering the sibling arm's own spelling, and objectui#9629's note recording the correction to this paragraph.

.changeset/8885-object-chart-drilldown-title-compareto.md

  • names packages/types/src/objectql.ts → packages/types/src/objectql.ts — edited by this change

    ObjectChart.tsx reads all three off schema, and until now neither published copy declared any of them: not the TS interface (packages/types/src/objectql.ts) and not the zod mirror (packages/types/src/zod/objectql.zod.ts). They rode BaseSchema's index signature / .passthrough() and arrived unvalidated. drillDown was the sharpest case — this component's registry inputs advertise it to the designer palette, and @objectstack/spec publishes ChartDrillDownSchema for exactly this carrier, so an author was offered a key that neither published shape mentioned.

  • names packages/types/src/zod/objectql.zod.ts → packages/types/src/zod/objectql.zod.ts — edited by this change

    ObjectChart.tsx reads all three off schema, and until now neither published copy declared any of them: not the TS interface (packages/types/src/objectql.ts) and not the zod mirror (packages/types/src/zod/objectql.zod.ts). They rode BaseSchema's index signature / .passthrough() and arrived unvalidated. drillDown was the sharpest case — this component's registry inputs advertise it to the designer palette, and @objectstack/spec publishes ChartDrillDownSchema for exactly this carrier, so an author was offered a key that neither published shape mentioned.

.changeset/8913-object-kanban-columns-declared.md

  • names objectql.ts → packages/types/src/objectql.ts — edited by this change

    What moved. ObjectKanbanSchema gains columns on both halves that move together — the TypeScript interface (objectql.ts) and its Zod mirror (zod/objectql.zod.ts). Retiring the bare kanban node type key (objectui#8802) removed the only face that judged a lane, and object-kanban had never declared the key, so it rode BaseSchema's [key: string]: any / .passthrough(): read by the renderer at three sites, named by no published face.

  • names zod/objectql.zod.ts → packages/types/src/zod/objectql.zod.ts — edited by this change

    What moved. ObjectKanbanSchema gains columns on both halves that move together — the TypeScript interface (objectql.ts) and its Zod mirror (zod/objectql.zod.ts). Retiring the bare kanban node type key (objectui#8802) removed the only face that judged a lane, and object-kanban had never declared the key, so it rode BaseSchema's [key: string]: any / .passthrough(): read by the renderer at three sites, named by no published face.

.changeset/8990-object-kanban-groupby-optional.md

  • names packages/types/src/objectql.ts → packages/types/src/objectql.ts — edited by this change

    @objectstack/spec declares the key optional — groupBy: z.string().optional() on ObjectKanbanPropsSchema — while this package required it on the TypeScript declaration (packages/types/src/objectql.ts) and on the Zod mirror (packages/types/src/zod/objectql.zod.ts). objectui was therefore narrower than the protocol on a published key: ObjectKanbanSchema.safeParse and safeValidateSchema refused an object-kanban node the protocol accepts, and such a node could not be annotated with its own type.

  • names packages/types/src/zod/objectql.zod.ts → packages/types/src/zod/objectql.zod.ts — edited by this change

    @objectstack/spec declares the key optional — groupBy: z.string().optional() on ObjectKanbanPropsSchema — while this package required it on the TypeScript declaration (packages/types/src/objectql.ts) and on the Zod mirror (packages/types/src/zod/objectql.zod.ts). objectui was therefore narrower than the protocol on a published key: ObjectKanbanSchema.safeParse and safeValidateSchema refused an object-kanban node the protocol accepts, and such a node could not be annotated with its own type.

.changeset/8992-user-actions-collapse-and-docblock.md

  • names objectql.zod.ts → packages/types/src/zod/objectql.zod.ts — edited by this change

    objectql.zod.ts's UserActionsSchema read stripImportedDefaults(Spec).extend({ group, hideFields, rowColor }), an extension that existed only because @objectstack/spec did not declare those three keys while normalizeListViewSchema folded objectui's legacy showGroup / showHideFields / showColor onto them. The protocol adopted all three in 17.3.0 (objectui#5435's ruling), so the extension is now a second local copy of a protocol declaration — the shape two faces start drifting from — and it collapses into the plain by-reference re-export its own note always said it would become.

.changeset/9092-inline-locale-declared-face.md

  • names objectql.ts → packages/types/src/objectql.ts — edited by this change

    • AppComponentSchema.label (app.ts) - ObjectGridSchema.label and .description (objectql.ts) - PageNodeSchema.aria.ariaLabel (layout.ts)

.changeset/9256-list-timeline-content-channels.md

  • names packages/types/src/data-display.ts → packages/types/src/data-display.ts — edited by this change

    These two were held out of the previous family-D slice for a SERIAL constraint on packages/types/src/data-display.ts and never for a verdict. Readership was re-derived for both rather than inherited: a TypeScript compiler-API sweep files every .body / .children read under the declared type of its receiver and answers zero for ListSchema and TimelineSchema while its live controls fire. timeline's bare-key owner is any-typed, so it was attributed directly as well — packages/plugin-timeline contains no channel read of any kind.

.changeset/9309-object-gallery-filter-destination-typed.md

  • names objectql.ts → packages/types/src/objectql.ts — edited by this change

    ObjectGallerySchema.filter is typed as the destination its own docblock names — QueryParams['$filter'] — on both faces, the TS interface in objectql.ts and the zod mirror in zod/objectql.zod.ts (objectui#9309).

  • names zod/objectql.zod.ts → packages/types/src/zod/objectql.zod.ts — edited by this change

    ObjectGallerySchema.filter is typed as the destination its own docblock names — QueryParams['$filter'] — on both faces, the TS interface in objectql.ts and the zod mirror in zod/objectql.zod.ts (objectui#9309).

.changeset/9511-record-id-is-a-string.md

  • names objectql.ts → packages/types/src/objectql.ts — edited by this change

    The three authorable keys, each on BOTH faces. ObjectFormSchema.recordId (objectql.ts + zod/objectql.zod.ts), DetailViewSchema.resourceId (views.ts + zod/views.zod.ts) and DetailSchema.resourceId (crud.ts + zod/crud.zod.ts). ⚠️ The crud pair is DetailSchema, not DetailViewSchema, and it reaches the same renderer — not by symbol but by data flow: plugin-detail registers the 'detail' node type onto DetailView. A read that follows TypeScript symbols alone finds two keys and is incomplete.

  • names zod/objectql.zod.ts → packages/types/src/zod/objectql.zod.ts — edited by this change

    The three authorable keys, each on BOTH faces. ObjectFormSchema.recordId (objectql.ts + zod/objectql.zod.ts), DetailViewSchema.resourceId (views.ts + zod/views.zod.ts) and DetailSchema.resourceId (crud.ts + zod/crud.zod.ts). ⚠️ The crud pair is DetailSchema, not DetailViewSchema, and it reaches the same renderer — not by symbol but by data flow: plugin-detail registers the 'detail' node type onto DetailView. A read that follows TypeScript symbols alone finds two keys and is incomplete.

.changeset/9549-tree-filter-declared.md

  • names objectql.ts → packages/types/src/objectql.ts — edited by this change

    ObjectTreeSchema.filter is declared on both faces, in the shape objectui#9309 settled for ObjectGallerySchema.filter: QueryParams['$filter'] by indexed access on the TS interface in objectql.ts, and the same two-arm union (array first) on the zod mirror in zod/objectql.zod.ts (objectui#9549).

  • names zod/objectql.zod.ts → packages/types/src/zod/objectql.zod.ts — edited by this change

    ObjectTreeSchema.filter is declared on both faces, in the shape objectui#9309 settled for ObjectGallerySchema.filter: QueryParams['$filter'] by indexed access on the TS interface in objectql.ts, and the same two-arm union (array first) on the zod mirror in zod/objectql.zod.ts (objectui#9549).

.changeset/9550-object-tree-root-barrel.md

  • names objectql.ts → packages/types/src/objectql.ts — edited by this change

    ObjectQLComponentSchema declares the node types an ObjectQL block may be. Every one of its arms was a named export of this package's root barrel except ObjectTreeSchema, which was declared in objectql.ts, applied by the union, and re-exported by the ./zod barrel (objectui#7917) — while no TypeScript consumer could name it. There is no ./objectql subpath to reach around the barrel: the package's exports map is pinned by packages/types/src/__tests__/package-exports-manifest.test.ts, and the root barrel was the only route to this type.

.changeset/9606-object-kanban-card-title.md

  • names zod/objectql.zod.ts → packages/types/src/zod/objectql.zod.ts — edited by this change

    Both published faces of the object-kanban arm now name the key: the zod mirror ObjectKanbanSchema in zod/objectql.zod.ts and its TypeScript twin, the ObjectKanbanSchema interface in objectql.ts. Both declare it OPTIONAL, at the same requiredness the other face uses, so the two faces accept and refuse the same documents. (Located and cited by SYMBOL: line addresses in zod/objectql.zod.ts have drifted before, and this change is itself about a drifted mirror.)

  • names objectql.ts → packages/types/src/objectql.ts — edited by this change

    Both published faces of the object-kanban arm now name the key: the zod mirror ObjectKanbanSchema in zod/objectql.zod.ts and its TypeScript twin, the ObjectKanbanSchema interface in objectql.ts. Both declare it OPTIONAL, at the same requiredness the other face uses, so the two faces accept and refuse the same documents. (Located and cited by SYMBOL: line addresses in zod/objectql.zod.ts have drifted before, and this change is itself about a drifted mirror.)

.changeset/9628-kanban-column-collapsed-honoured.md

  • names objectql.ts → packages/types/src/objectql.ts — edited by this change

    The key was declared on both published faces of the object-kanban arm — the lane element of ObjectKanbanSchema (objectql.ts and its Zod mirror) and the runtime lane KanbanColumn (complex.ts and its mirror) — and read by KanbanEnhanced alone, a module no production source imports. An authored { "id": "todo", "title": "To Do", "collapsed": true } therefore parsed green on both faces and reached a board that did nothing with it: KanbanImpl's only collapse is the SWIMLANE row's, held in viewer state under objectui:kanban-collapsed:ANGLE-BRACKETS(swimlaneField) and never keyed to a lane's declared value. That is the ADR-0049 declared-but-unhonoured shape.

.changeset/table-renderer-declared-column-contract-5350.md

  • names packages/types/src/data-display.ts → packages/types/src/data-display.ts — edited by this change

    renderers/complex/table.tsx resolved a heading as col.header || col.label and a cell as row[col.accessorKey || col.name]. Neither label nor name is declared on TableColumn, which declares header and accessorKey — both required (packages/types/src/data-display.ts). This was the fourth site of the column-alias family, after data-table, ObjectDataTable and ObjectGrid (objectui#5350).

Read the paragraph, not the line: both false halves of the objectui#8617 claim sat in one paragraph, and correcting either alone would have left it asserting the same wrong thing.

If a claim did go false, correct the body. That is precedented and prose-only, frontmatter untouched; check-changeset-overwrite.mjs will report the correction as its own case 2 ("correcting a declaration on purpose … legitimate"), which is the intended shape — one gate asks for the read, the other records the write.

Not covered, stated so nobody reads this as more: a born-false claim that spells no line address at all (objectui#9495 coordinated one by ORDINAL — "a grep finds that member first" — and deciding that means reading what the sentence means), a claim spelled as a symbol or a package rather than a backticked file name, and a file named ambiguously.

Angle-bracketed names in the quoted prose above are rewritten as ANGLE-BRACKETS(name): GitHub deletes tag-shaped fragments from a stored body, and a quote that silently loses the identifier it is about is worse than a visible repair.

Compared the checked-out tree with 41ae65b26 (merge-base with origin/main): 11 file(s) changed outside .changeset/, read against 1562 pending declaration(s) that publish a body (2149 pending in total). · run

@github-actions

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

Metric Value Budget
Eager closure (gzip, 329 chunks) 3061.3 KB 3104.5 KB
Main entry chunk (gzip) 148.2 KB 350 KB
Entry file index-DmL_T4C8.js —
Status PASS —

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


📦 Bundle Size Report

Package Size Gzipped
app-shell (consoleActionDispatch.js) 0.20KB 0.19KB
app-shell (index.js) 16.57KB 6.15KB
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) 27.95KB 10.04KB
auth (AuthContext.js) 0.31KB 0.24KB
auth (AuthGuard.js) 2.07KB 1.00KB
auth (AuthProvider.js) 40.17KB 10.58KB
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.39KB 1.21KB
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.52KB 3.45KB
auth (index.js) 3.63KB 1.64KB
auth (invitation-status.js) 1.22KB 0.70KB
auth (org-roles.js) 6.66KB 2.78KB
auth (phone-identifier.js) 1.11KB 0.66KB
auth (types.js) 0.59KB 0.35KB
auth (useAuth.js) 5.30KB 1.02KB
auth (useWorkspaceAdminStatus.js) 11.08KB 4.58KB
collaboration (CommentThread.js) 27.13KB 7.95KB
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) 547.33KB 130.98KB
core (index.js) 9.52KB 3.79KB
create-plugin (index.js) 27.94KB 9.51KB
data-objectstack (index.js) 223.91KB 62.28KB
fields (index.js) 259.18KB 65.61KB
i18n (LocalizationContext.js) 1.76KB 0.96KB
i18n (builtinAggregateLabels.js) 0.86KB 0.49KB
i18n (currency.js) 2.59KB 1.22KB
i18n (fallbackInterpolation.js) 6.25KB 2.77KB
i18n (i18n.js) 8.87KB 3.64KB
i18n (index.js) 5.24KB 2.27KB
i18n (pickLocalized.js) 9.86KB 3.95KB
i18n (provider.js) 39.40KB 12.91KB
i18n (useDisplayLocale.js) 3.52KB 1.76KB
i18n (useObjectLabel.js) 34.34KB 9.17KB
i18n (useSafeTranslation.js) 5.60KB 2.33KB
layout (index.js) 39.28KB 11.09KB
mobile (MobileProvider.js) 0.92KB 0.49KB
mobile (ResponsiveContainer.js) 0.94KB 0.38KB
mobile (breakpoints.js) 1.51KB 0.70KB
mobile (createOfflineDataSource.js) 5.61KB 1.75KB
mobile (index.js) 1.99KB 0.87KB
mobile (offlineQueue.js) 3.91KB 1.35KB
mobile (pwa.js) 0.97KB 0.49KB
mobile (serviceWorker.js) 1.48KB 0.62KB
mobile (serviceWorkerSource.js) 3.41KB 1.48KB
mobile (useBreakpoint.js) 1.54KB 0.65KB
mobile (useGesture.js) 6.96KB 1.98KB
mobile (useOfflineSync.js) 1.99KB 0.72KB
mobile (usePullToRefresh.js) 6.62KB 2.45KB
mobile (useResponsive.js) 0.72KB 0.42KB
mobile (useSpecGesture.js) 5.52KB 2.10KB
mobile (useTouchTarget.js) 1.01KB 0.54KB
permissions (MePermissionsProvider.js) 13.52KB 4.88KB
permissions (PermissionContext.js) 0.31KB 0.25KB
permissions (PermissionGuard.js) 0.89KB 0.45KB
permissions (PermissionProvider.js) 6.24KB 2.16KB
permissions (discardProofCache.js) 1.04KB 0.55KB
permissions (evaluator.js) 8.33KB 3.07KB
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) 16.01KB 3.93KB
plugin-calendar (index.js) 51.52KB 14.64KB
plugin-charts (index.js) 80.42KB 22.22KB
plugin-chatbot (index.js) 198.40KB 47.22KB
plugin-dashboard (index.js) 133.85KB 35.54KB
plugin-designer (index.js) 216.25KB 44.39KB
plugin-detail (index.js) 232.85KB 61.58KB
plugin-editor (index.js) 2.23KB 1.05KB
plugin-form (index.js) 154.22KB 39.52KB
plugin-gantt (index.js) 169.71KB 41.93KB
plugin-grid (index.js) 216.70KB 59.29KB
plugin-kanban (index.js) 48.36KB 15.09KB
plugin-list (index.js) 115.91KB 28.80KB
plugin-map (index.js) 22.85KB 7.58KB
plugin-markdown (index.js) 13.88KB 4.80KB
plugin-report (index.js) 43.55KB 11.99KB
plugin-timeline (index.js) 30.84KB 9.01KB
plugin-tree (index.js) 10.52KB 3.69KB
plugin-view (index.js) 87.83KB 22.01KB
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) 116.21KB 38.14KB
react (data-invalidation.js) 5.05KB 2.08KB
react (index.js) 4.03KB 1.86KB
react (schema-input.js) 4.25KB 2.04KB
react (spec-input.js) 0.20KB 0.18KB
sdui-parser (body-dialect.js) 4.78KB 2.09KB
sdui-parser (codegen.js) 6.58KB 2.74KB
sdui-parser (dashboard-widget-options.js) 3.08KB 1.30KB
sdui-parser (index.js) 5.78KB 2.56KB
sdui-parser (input-type.js) 2.84KB 1.40KB
sdui-parser (kanban-quick-add.js) 3.89KB 1.87KB
sdui-parser (parse.js) 25.28KB 7.80KB
sdui-parser (provenance.js) 3.66KB 1.82KB
sdui-parser (types.js) 0.28KB 0.23KB
sdui-parser (validate.js) 18.27KB 6.20KB
types (ai.js) 4.11KB 2.06KB
types (api-types.js) 0.20KB 0.18KB
types (app.js) 2.87KB 1.00KB
types (base.js) 0.20KB 0.18KB
types (blocks.js) 0.20KB 0.18KB
types (complex.js) 2.93KB 1.49KB
types (crud.js) 0.20KB 0.18KB
types (dashboard-filter-alias.js) 6.23KB 2.74KB
types (data-display.js) 3.75KB 1.85KB
types (data-protocol.js) 0.20KB 0.19KB
types (data.js) 0.20KB 0.18KB
types (designer.js) 1.85KB 0.85KB
types (disclosure.js) 0.20KB 0.18KB
types (error-code.js) 1.54KB 0.88KB
types (expression.js) 0.20KB 0.18KB
types (feedback.js) 0.20KB 0.18KB
types (field-types.js) 0.20KB 0.18KB
types (form.js) 0.20KB 0.18KB
types (http-inflight.js) 8.87KB 3.73KB
types (http-retry.js) 4.32KB 2.02KB
types (icon-key-migration.js) 4.26KB 1.63KB
types (index.js) 4.74KB 2.25KB
types (layout.js) 0.20KB 0.18KB
types (managed-by.js) 0.19KB 0.18KB
types (mobile.js) 5.00KB 2.39KB
types (navigation.js) 0.20KB 0.18KB
types (objectql.js) 0.20KB 0.18KB
types (overlay.js) 0.20KB 0.18KB
types (permissions.js) 2.52KB 1.31KB
types (plugin-scope.js) 0.20KB 0.18KB
types (record-components.js) 0.20KB 0.19KB
types (record-semantics.js) 1.28KB 0.67KB
types (registry.js) 0.20KB 0.18KB
types (reports.js) 0.20KB 0.18KB
types (select-option.js) 0.20KB 0.19KB
types (spec-report.js) 5.05KB 1.93KB
types (spec-ui-namespace.js) 0.20KB 0.19KB
types (strict-authoring-face.js) 17.15KB 6.32KB
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

…port and target navigate on both doors

`ObjectDataTableSchema.drillDown` takes the block's own shape,
`ObjectDataTableDrillDownConfig`: the shared `DrillDownConfig` with
`filter`, `maxRows` and `report` as `?: never` tombstones and `target`
narrowed to 'drawer' | 'dialog'. The zod mirror's `drillDown` extends the
shared mirror the same way, refusing each member by name, so
`objectui validate` refuses a stored config carrying one. A row drills
to the one record it already is; none of the four was ever read.

The DrillDownConfig class docblock and the declared-keys pin comment no
longer say every block honours every target arm. The 6576 anchor pins
follow the new shape, the 7352 mirror pin's table leg runs over the
values the table takes, and the 6576 changeset carries a dated note.

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

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

Metric Value Budget
Eager closure (gzip, 329 chunks) 3061.3 KB 3104.5 KB
Main entry chunk (gzip) 148.2 KB 350 KB
Entry file index-Bw24R-51.js —
Status PASS —

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


📦 Bundle Size Report

Package Size Gzipped
app-shell (consoleActionDispatch.js) 0.20KB 0.19KB
app-shell (index.js) 16.57KB 6.15KB
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) 27.95KB 10.04KB
auth (AuthContext.js) 0.31KB 0.24KB
auth (AuthGuard.js) 2.07KB 1.00KB
auth (AuthProvider.js) 40.17KB 10.58KB
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.39KB 1.21KB
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.52KB 3.45KB
auth (index.js) 3.63KB 1.64KB
auth (invitation-status.js) 1.22KB 0.70KB
auth (org-roles.js) 6.66KB 2.78KB
auth (phone-identifier.js) 1.11KB 0.66KB
auth (types.js) 0.59KB 0.35KB
auth (useAuth.js) 5.30KB 1.02KB
auth (useWorkspaceAdminStatus.js) 11.08KB 4.58KB
collaboration (CommentThread.js) 27.13KB 7.95KB
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) 547.33KB 130.98KB
core (index.js) 9.52KB 3.79KB
create-plugin (index.js) 27.94KB 9.51KB
data-objectstack (index.js) 223.91KB 62.28KB
fields (index.js) 259.18KB 65.61KB
i18n (LocalizationContext.js) 1.76KB 0.96KB
i18n (builtinAggregateLabels.js) 0.86KB 0.49KB
i18n (currency.js) 2.59KB 1.22KB
i18n (fallbackInterpolation.js) 6.25KB 2.77KB
i18n (i18n.js) 8.87KB 3.64KB
i18n (index.js) 5.24KB 2.27KB
i18n (pickLocalized.js) 9.86KB 3.95KB
i18n (provider.js) 39.40KB 12.91KB
i18n (useDisplayLocale.js) 3.52KB 1.76KB
i18n (useObjectLabel.js) 34.34KB 9.17KB
i18n (useSafeTranslation.js) 5.60KB 2.33KB
layout (index.js) 39.28KB 11.09KB
mobile (MobileProvider.js) 0.92KB 0.49KB
mobile (ResponsiveContainer.js) 0.94KB 0.38KB
mobile (breakpoints.js) 1.51KB 0.70KB
mobile (createOfflineDataSource.js) 5.61KB 1.75KB
mobile (index.js) 1.99KB 0.87KB
mobile (offlineQueue.js) 3.91KB 1.35KB
mobile (pwa.js) 0.97KB 0.49KB
mobile (serviceWorker.js) 1.48KB 0.62KB
mobile (serviceWorkerSource.js) 3.41KB 1.48KB
mobile (useBreakpoint.js) 1.54KB 0.65KB
mobile (useGesture.js) 6.96KB 1.98KB
mobile (useOfflineSync.js) 1.99KB 0.72KB
mobile (usePullToRefresh.js) 6.62KB 2.45KB
mobile (useResponsive.js) 0.72KB 0.42KB
mobile (useSpecGesture.js) 5.52KB 2.10KB
mobile (useTouchTarget.js) 1.01KB 0.54KB
permissions (MePermissionsProvider.js) 13.52KB 4.88KB
permissions (PermissionContext.js) 0.31KB 0.25KB
permissions (PermissionGuard.js) 0.89KB 0.45KB
permissions (PermissionProvider.js) 6.24KB 2.16KB
permissions (discardProofCache.js) 1.04KB 0.55KB
permissions (evaluator.js) 8.33KB 3.07KB
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) 16.01KB 3.93KB
plugin-calendar (index.js) 51.52KB 14.64KB
plugin-charts (index.js) 80.42KB 22.22KB
plugin-chatbot (index.js) 198.40KB 47.22KB
plugin-dashboard (index.js) 133.85KB 35.54KB
plugin-designer (index.js) 216.25KB 44.39KB
plugin-detail (index.js) 232.85KB 61.58KB
plugin-editor (index.js) 2.23KB 1.05KB
plugin-form (index.js) 154.22KB 39.52KB
plugin-gantt (index.js) 169.71KB 41.93KB
plugin-grid (index.js) 216.70KB 59.29KB
plugin-kanban (index.js) 48.36KB 15.09KB
plugin-list (index.js) 115.91KB 28.80KB
plugin-map (index.js) 22.85KB 7.58KB
plugin-markdown (index.js) 13.88KB 4.80KB
plugin-report (index.js) 43.55KB 11.99KB
plugin-timeline (index.js) 30.84KB 9.01KB
plugin-tree (index.js) 10.52KB 3.69KB
plugin-view (index.js) 87.83KB 22.01KB
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) 116.21KB 38.14KB
react (data-invalidation.js) 5.05KB 2.08KB
react (index.js) 4.03KB 1.86KB
react (schema-input.js) 4.25KB 2.04KB
react (spec-input.js) 0.20KB 0.18KB
sdui-parser (body-dialect.js) 4.78KB 2.09KB
sdui-parser (codegen.js) 6.58KB 2.74KB
sdui-parser (dashboard-widget-options.js) 3.08KB 1.30KB
sdui-parser (index.js) 5.78KB 2.56KB
sdui-parser (input-type.js) 2.84KB 1.40KB
sdui-parser (kanban-quick-add.js) 3.89KB 1.87KB
sdui-parser (parse.js) 25.28KB 7.80KB
sdui-parser (provenance.js) 3.66KB 1.82KB
sdui-parser (types.js) 0.28KB 0.23KB
sdui-parser (validate.js) 18.27KB 6.20KB
types (ai.js) 4.11KB 2.06KB
types (api-types.js) 0.20KB 0.18KB
types (app.js) 2.87KB 1.00KB
types (base.js) 0.20KB 0.18KB
types (blocks.js) 0.20KB 0.18KB
types (complex.js) 2.93KB 1.49KB
types (crud.js) 0.20KB 0.18KB
types (dashboard-filter-alias.js) 6.23KB 2.74KB
types (data-display.js) 3.75KB 1.85KB
types (data-protocol.js) 0.20KB 0.19KB
types (data.js) 0.20KB 0.18KB
types (designer.js) 1.85KB 0.85KB
types (disclosure.js) 0.20KB 0.18KB
types (error-code.js) 1.54KB 0.88KB
types (expression.js) 0.20KB 0.18KB
types (feedback.js) 0.20KB 0.18KB
types (field-types.js) 0.20KB 0.18KB
types (form.js) 0.20KB 0.18KB
types (http-inflight.js) 8.87KB 3.73KB
types (http-retry.js) 4.32KB 2.02KB
types (icon-key-migration.js) 4.26KB 1.63KB
types (index.js) 4.74KB 2.25KB
types (layout.js) 0.20KB 0.18KB
types (managed-by.js) 0.19KB 0.18KB
types (mobile.js) 5.00KB 2.39KB
types (navigation.js) 0.20KB 0.18KB
types (objectql.js) 0.20KB 0.18KB
types (overlay.js) 0.20KB 0.18KB
types (permissions.js) 2.52KB 1.31KB
types (plugin-scope.js) 0.20KB 0.18KB
types (record-components.js) 0.20KB 0.19KB
types (record-semantics.js) 1.28KB 0.67KB
types (registry.js) 0.20KB 0.18KB
types (reports.js) 0.20KB 0.18KB
types (select-option.js) 0.20KB 0.19KB
types (spec-report.js) 5.05KB 1.93KB
types (spec-ui-namespace.js) 0.20KB 0.19KB
types (strict-authoring-face.js) 17.15KB 6.32KB
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

`ObjectDataTableSchema.drillDown` now names `ObjectDataTableDrillDownConfig`,
so the shared type is referenced only from docblocks, and
`object-ui/no-unused-imports` fails `@object-ui/types#lint` on it.

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

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

Metric Value Budget
Eager closure (gzip, 329 chunks) 3061.3 KB 3104.5 KB
Main entry chunk (gzip) 148.2 KB 350 KB
Entry file index-COMX_mSK.js —
Status PASS —

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


📦 Bundle Size Report

Package Size Gzipped
app-shell (consoleActionDispatch.js) 0.20KB 0.19KB
app-shell (index.js) 16.57KB 6.15KB
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) 27.95KB 10.04KB
auth (AuthContext.js) 0.31KB 0.24KB
auth (AuthGuard.js) 2.07KB 1.00KB
auth (AuthProvider.js) 40.17KB 10.58KB
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.39KB 1.21KB
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.52KB 3.45KB
auth (index.js) 3.63KB 1.64KB
auth (invitation-status.js) 1.22KB 0.70KB
auth (org-roles.js) 6.66KB 2.78KB
auth (phone-identifier.js) 1.11KB 0.66KB
auth (types.js) 0.59KB 0.35KB
auth (useAuth.js) 5.30KB 1.02KB
auth (useWorkspaceAdminStatus.js) 11.08KB 4.58KB
collaboration (CommentThread.js) 27.13KB 7.95KB
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) 547.33KB 130.98KB
core (index.js) 9.52KB 3.79KB
create-plugin (index.js) 27.94KB 9.51KB
data-objectstack (index.js) 223.91KB 62.28KB
fields (index.js) 259.18KB 65.61KB
i18n (LocalizationContext.js) 1.76KB 0.96KB
i18n (builtinAggregateLabels.js) 0.86KB 0.49KB
i18n (currency.js) 2.59KB 1.22KB
i18n (fallbackInterpolation.js) 6.25KB 2.77KB
i18n (i18n.js) 8.87KB 3.64KB
i18n (index.js) 5.24KB 2.27KB
i18n (pickLocalized.js) 9.86KB 3.95KB
i18n (provider.js) 39.40KB 12.91KB
i18n (translateFn.js) 0.20KB 0.18KB
i18n (useDisplayLocale.js) 3.52KB 1.76KB
i18n (useObjectLabel.js) 34.34KB 9.17KB
i18n (useSafeTranslation.js) 5.60KB 2.33KB
layout (index.js) 39.28KB 11.09KB
mobile (MobileProvider.js) 0.92KB 0.49KB
mobile (ResponsiveContainer.js) 0.94KB 0.38KB
mobile (breakpoints.js) 1.51KB 0.70KB
mobile (createOfflineDataSource.js) 5.61KB 1.75KB
mobile (index.js) 1.99KB 0.87KB
mobile (offlineQueue.js) 3.91KB 1.35KB
mobile (pwa.js) 0.97KB 0.49KB
mobile (serviceWorker.js) 1.48KB 0.62KB
mobile (serviceWorkerSource.js) 3.41KB 1.48KB
mobile (useBreakpoint.js) 1.54KB 0.65KB
mobile (useGesture.js) 6.96KB 1.98KB
mobile (useOfflineSync.js) 1.99KB 0.72KB
mobile (usePullToRefresh.js) 6.62KB 2.45KB
mobile (useResponsive.js) 0.72KB 0.42KB
mobile (useSpecGesture.js) 5.52KB 2.10KB
mobile (useTouchTarget.js) 1.01KB 0.54KB
permissions (MePermissionsProvider.js) 13.52KB 4.88KB
permissions (PermissionContext.js) 0.31KB 0.25KB
permissions (PermissionGuard.js) 0.89KB 0.45KB
permissions (PermissionProvider.js) 6.24KB 2.16KB
permissions (discardProofCache.js) 1.04KB 0.55KB
permissions (evaluator.js) 8.33KB 3.07KB
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) 16.01KB 3.93KB
plugin-calendar (index.js) 51.52KB 14.64KB
plugin-charts (index.js) 80.42KB 22.22KB
plugin-chatbot (index.js) 198.40KB 47.22KB
plugin-dashboard (index.js) 133.85KB 35.54KB
plugin-designer (index.js) 216.25KB 44.39KB
plugin-detail (index.js) 232.88KB 61.59KB
plugin-editor (index.js) 2.23KB 1.05KB
plugin-form (index.js) 154.22KB 39.52KB
plugin-gantt (index.js) 169.71KB 41.93KB
plugin-grid (index.js) 216.70KB 59.29KB
plugin-kanban (index.js) 48.36KB 15.09KB
plugin-list (index.js) 115.91KB 28.80KB
plugin-map (index.js) 22.85KB 7.58KB
plugin-markdown (index.js) 13.88KB 4.80KB
plugin-report (index.js) 43.55KB 11.99KB
plugin-timeline (index.js) 30.85KB 9.02KB
plugin-tree (index.js) 10.52KB 3.69KB
plugin-view (index.js) 87.83KB 22.01KB
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) 116.21KB 38.14KB
react (data-invalidation.js) 5.05KB 2.08KB
react (index.js) 4.03KB 1.86KB
react (schema-input.js) 4.25KB 2.04KB
react (spec-input.js) 0.20KB 0.18KB
sdui-parser (body-dialect.js) 4.78KB 2.09KB
sdui-parser (codegen.js) 6.58KB 2.74KB
sdui-parser (dashboard-widget-options.js) 3.08KB 1.30KB
sdui-parser (index.js) 5.78KB 2.56KB
sdui-parser (input-type.js) 2.84KB 1.40KB
sdui-parser (kanban-quick-add.js) 3.89KB 1.87KB
sdui-parser (parse.js) 25.28KB 7.80KB
sdui-parser (provenance.js) 3.66KB 1.82KB
sdui-parser (types.js) 0.28KB 0.23KB
sdui-parser (validate.js) 18.27KB 6.20KB
types (ai.js) 4.11KB 2.06KB
types (api-types.js) 0.20KB 0.18KB
types (app.js) 2.87KB 1.00KB
types (base.js) 0.20KB 0.18KB
types (blocks.js) 0.20KB 0.18KB
types (complex.js) 2.93KB 1.49KB
types (crud.js) 0.20KB 0.18KB
types (dashboard-filter-alias.js) 6.23KB 2.74KB
types (data-display.js) 3.75KB 1.85KB
types (data-protocol.js) 0.20KB 0.19KB
types (data.js) 0.20KB 0.18KB
types (designer.js) 1.85KB 0.85KB
types (disclosure.js) 0.20KB 0.18KB
types (error-code.js) 1.54KB 0.88KB
types (expression.js) 0.20KB 0.18KB
types (feedback.js) 0.20KB 0.18KB
types (field-types.js) 0.20KB 0.18KB
types (form.js) 0.20KB 0.18KB
types (http-inflight.js) 8.87KB 3.73KB
types (http-retry.js) 4.32KB 2.02KB
types (icon-key-migration.js) 4.26KB 1.63KB
types (index.js) 4.74KB 2.25KB
types (layout.js) 0.20KB 0.18KB
types (managed-by.js) 0.19KB 0.18KB
types (mobile.js) 5.00KB 2.39KB
types (navigation.js) 0.20KB 0.18KB
types (objectql.js) 0.20KB 0.18KB
types (overlay.js) 0.20KB 0.18KB
types (permissions.js) 2.52KB 1.31KB
types (plugin-scope.js) 0.20KB 0.18KB
types (record-components.js) 0.20KB 0.19KB
types (record-semantics.js) 1.28KB 0.67KB
types (registry.js) 0.20KB 0.18KB
types (reports.js) 0.20KB 0.18KB
types (select-option.js) 0.20KB 0.19KB
types (spec-report.js) 5.05KB 1.93KB
types (spec-ui-namespace.js) 0.20KB 0.19KB
types (strict-authoring-face.js) 17.15KB 6.32KB
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

@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

CI note (domain:ui seat 2, session session_014mXUNuFomfj24w7s1pZzhN): Inert vi.mock Specifier Check is red here, but not because of this PR.

  • The one hit is apps/console/src/__tests__/filterContextTokensSweep-10666.test.tsx:51, a file this PR does not touch.
  • The same check has been red on main since f9c06ef6a (PR objectui#10729); 9c78ebe3a before it is green. The job runs before pnpm install, so that test's mock path into packages/plugin-map/node_modules cannot resolve.
  • No fix exists yet. It is filed as objectui#10732, with the direction there; widening this PR to fix it would be out of scope.
  • It is not a required check, so it does not block this PR's merge.
  • A re-run would fail the same way on the same base, so none is spent.

Generated by Claude Code

@github-actions

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

Metric Value Budget
Eager closure (gzip, 329 chunks) 3062.4 KB 3104.5 KB
Main entry chunk (gzip) 148.3 KB 350 KB
Entry file index-CceRdjYB.js —
Status PASS —

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


📦 Bundle Size Report

Package Size Gzipped
app-shell (consoleActionDispatch.js) 0.20KB 0.19KB
app-shell (index.js) 16.57KB 6.15KB
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) 27.95KB 10.04KB
auth (AuthContext.js) 0.31KB 0.24KB
auth (AuthGuard.js) 2.07KB 1.00KB
auth (AuthProvider.js) 40.17KB 10.58KB
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.39KB 1.21KB
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.52KB 3.45KB
auth (index.js) 3.63KB 1.64KB
auth (invitation-status.js) 1.22KB 0.70KB
auth (org-roles.js) 6.66KB 2.78KB
auth (phone-identifier.js) 1.11KB 0.66KB
auth (types.js) 0.59KB 0.35KB
auth (useAuth.js) 5.30KB 1.02KB
auth (useWorkspaceAdminStatus.js) 11.08KB 4.58KB
collaboration (CommentThread.js) 27.13KB 7.95KB
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) 547.82KB 131.15KB
core (index.js) 9.52KB 3.79KB
create-plugin (index.js) 27.94KB 9.51KB
data-objectstack (index.js) 223.91KB 62.28KB
fields (index.js) 259.29KB 65.64KB
i18n (LocalizationContext.js) 1.76KB 0.96KB
i18n (builtinAggregateLabels.js) 0.86KB 0.49KB
i18n (currency.js) 2.59KB 1.22KB
i18n (fallbackInterpolation.js) 6.25KB 2.77KB
i18n (i18n.js) 8.87KB 3.64KB
i18n (index.js) 5.24KB 2.27KB
i18n (pickLocalized.js) 9.86KB 3.95KB
i18n (provider.js) 39.40KB 12.91KB
i18n (translateFn.js) 0.20KB 0.18KB
i18n (useDisplayLocale.js) 3.52KB 1.76KB
i18n (useObjectLabel.js) 34.34KB 9.17KB
i18n (useSafeTranslation.js) 5.60KB 2.33KB
layout (index.js) 39.28KB 11.09KB
mobile (MobileProvider.js) 0.92KB 0.49KB
mobile (ResponsiveContainer.js) 0.94KB 0.38KB
mobile (breakpoints.js) 1.51KB 0.70KB
mobile (createOfflineDataSource.js) 5.61KB 1.75KB
mobile (index.js) 1.99KB 0.87KB
mobile (offlineQueue.js) 3.91KB 1.35KB
mobile (pwa.js) 0.97KB 0.49KB
mobile (serviceWorker.js) 1.48KB 0.62KB
mobile (serviceWorkerSource.js) 3.41KB 1.48KB
mobile (useBreakpoint.js) 1.54KB 0.65KB
mobile (useGesture.js) 6.96KB 1.98KB
mobile (useOfflineSync.js) 1.99KB 0.72KB
mobile (usePullToRefresh.js) 6.62KB 2.45KB
mobile (useResponsive.js) 0.72KB 0.42KB
mobile (useSpecGesture.js) 5.52KB 2.10KB
mobile (useTouchTarget.js) 1.01KB 0.54KB
permissions (MePermissionsProvider.js) 13.52KB 4.88KB
permissions (PermissionContext.js) 0.31KB 0.25KB
permissions (PermissionGuard.js) 0.89KB 0.45KB
permissions (PermissionProvider.js) 6.24KB 2.16KB
permissions (discardProofCache.js) 1.04KB 0.55KB
permissions (evaluator.js) 8.33KB 3.07KB
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) 16.01KB 3.93KB
plugin-calendar (index.js) 51.65KB 14.69KB
plugin-charts (index.js) 81.82KB 22.51KB
plugin-chatbot (index.js) 198.40KB 47.22KB
plugin-dashboard (index.js) 134.05KB 35.61KB
plugin-designer (index.js) 216.25KB 44.39KB
plugin-detail (index.js) 233.23KB 61.74KB
plugin-editor (index.js) 2.23KB 1.05KB
plugin-form (index.js) 155.41KB 39.70KB
plugin-gantt (index.js) 169.75KB 41.96KB
plugin-grid (index.js) 218.12KB 59.72KB
plugin-kanban (index.js) 48.43KB 15.11KB
plugin-list (index.js) 114.70KB 28.42KB
plugin-map (index.js) 22.90KB 7.62KB
plugin-markdown (index.js) 13.88KB 4.80KB
plugin-report (index.js) 43.55KB 11.99KB
plugin-timeline (index.js) 30.91KB 9.05KB
plugin-tree (index.js) 10.58KB 3.72KB
plugin-view (index.js) 87.83KB 22.01KB
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) 116.21KB 38.14KB
react (data-invalidation.js) 5.05KB 2.08KB
react (index.js) 4.03KB 1.86KB
react (schema-input.js) 4.25KB 2.04KB
react (spec-input.js) 0.20KB 0.18KB
sdui-parser (body-dialect.js) 4.78KB 2.09KB
sdui-parser (codegen.js) 6.58KB 2.74KB
sdui-parser (dashboard-widget-options.js) 3.08KB 1.30KB
sdui-parser (index.js) 5.78KB 2.56KB
sdui-parser (input-type.js) 2.84KB 1.40KB
sdui-parser (kanban-quick-add.js) 3.89KB 1.87KB
sdui-parser (parse.js) 25.28KB 7.80KB
sdui-parser (provenance.js) 3.66KB 1.82KB
sdui-parser (types.js) 0.28KB 0.23KB
sdui-parser (validate.js) 18.27KB 6.20KB
types (ai.js) 4.11KB 2.06KB
types (api-types.js) 0.20KB 0.18KB
types (app.js) 2.87KB 1.00KB
types (base.js) 0.20KB 0.18KB
types (blocks.js) 0.20KB 0.18KB
types (complex.js) 2.93KB 1.49KB
types (crud.js) 0.20KB 0.18KB
types (dashboard-filter-alias.js) 6.23KB 2.74KB
types (data-display.js) 3.75KB 1.85KB
types (data-protocol.js) 0.20KB 0.19KB
types (data.js) 0.20KB 0.18KB
types (designer.js) 1.85KB 0.85KB
types (disclosure.js) 0.20KB 0.18KB
types (error-code.js) 1.54KB 0.88KB
types (expression.js) 0.20KB 0.18KB
types (feedback.js) 0.20KB 0.18KB
types (field-types.js) 0.20KB 0.18KB
types (form.js) 0.20KB 0.18KB
types (http-inflight.js) 8.87KB 3.73KB
types (http-retry.js) 4.32KB 2.02KB
types (icon-key-migration.js) 4.26KB 1.63KB
types (index.js) 4.74KB 2.25KB
types (layout.js) 0.20KB 0.18KB
types (managed-by.js) 0.19KB 0.18KB
types (mobile.js) 5.00KB 2.39KB
types (navigation.js) 0.20KB 0.18KB
types (objectql.js) 0.20KB 0.18KB
types (overlay.js) 0.20KB 0.18KB
types (permissions.js) 2.52KB 1.31KB
types (plugin-scope.js) 0.20KB 0.18KB
types (record-components.js) 0.20KB 0.19KB
types (record-semantics.js) 1.28KB 0.67KB
types (registry.js) 0.20KB 0.18KB
types (reports.js) 0.20KB 0.18KB
types (select-option.js) 0.20KB 0.19KB
types (spec-report.js) 5.05KB 1.93KB
types (spec-ui-namespace.js) 0.20KB 0.19KB
types (strict-authoring-face.js) 17.15KB 6.32KB
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

@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

Contract review

Served-tier: CONTRACT_REVIEW_TIER
Head-sha: 430223947fa3b36fdb33575437ce9d1f69419ded

① Derived judgments

  • Never-read claims, re-read at head, row by row — H1 holds. object-data-table (ObjectDataTable.tsx): reads enabled and mode (l.644 isDrillEnabled(drillDown) && (drillDown?.mode ?? 'record') === 'record'), a non-template title (l.1115), columns (fields=, l.1128), target in two arms (l.1130 === 'dialog' ? 'dialog' : 'drawer'); no read of drillDown.filter, .maxRows, .report; 'navigate' fell into the drawer arm. RecordDetailDrawer props are fields, title, target?: 'drawer' | 'dialog'; data-table.tsx has 0 mentions of drillDown; core drill-down.ts reads config.filter, config.title, config.enabled only; DrillNavigationContext carries one handler openRecordList(objectName, filter?). object-pivot (l.313-361): isDrillEnabled, computeDrillFilter, resolveDrillTitle, target, columns, maxRows, report into DrillDownDrawer, no mode; DrillDownDrawerProps has no mode. object-chart: enabled, filter, title, target incl. navigate → openRecordList (l.1109-1117), maxRows → pageSize (l.1522), columns (l.1523); mode/report occur only in the hard-coded inner table literal. Tombstone reader lists are true: filter → chart + pivot via computeDrillFilter; maxRows → chart pageSize, pivot + metric via DrillDownDrawer.maxRows (metric l.583); report → pivot + metric via DrillDownDrawer.report (metric l.584); navigate → chart branch and DrillDownDrawer.navigateOnly for pivot + metric.
  • TS door. Both new interfaces use the 10681 idiom (REFUSED BY NAME docblock + @deprecated, ?: never; target?: 'drawer' | 'dialog'). Exported from src/index.ts (root) and declared in data-display.ts (the ./data-display subpath in exports). Built here from head: ObjectDataTableDrillDownConfig 2 hits in dist/data-display.d.ts, 2 in dist/objectql.d.ts, 1 in dist/index.d.ts; ObjectPivotDrillDownConfig 3 / 1.
  • ObjectDataTable prop. ObjectDataTable.schemaAnchor-6576.test.ts pins Equal of the prop's drillDown to ObjectDataTableDrillDownConfig | undefined, and ablating the schema wiring turns it red (TS2344). Producers: DashboardRenderer l.790 and DashboardGridLayout l.401 hand options.drillDown ?? { enabled: true, mode: 'record' }; DrillDownDrawer l.130 and ObjectChart l.1526 hand { enabled: true, mode: 'record', target: 'dialog' } (maxRows goes on the node as pageSize). No designer, console or app-shell source writes drillDown on a table; no content/fixture carries a refused member. CI Type Check green.
  • Zod door. retirementTombstone = z.never({ error }).optional().describe(). Probe through safeValidateSchema: filter, maxRows, report each yield exactly one issue at drillDown.KEY, code invalid_type, message "REFUSED on object-data-table (objectui#10685) — drillDown.KEY …" naming the readers; target: 'navigate' yields invalid_value at drillDown.target naming 'drawer'/'dialog', the refused 'navigate' and the three blocks it applies on. Kept members: 23 values over enabled/mode/title/columns/target (valid and malformed) parse identically on the table mirror and on DrillDownConfigSchema.optional() — 23 identical, 0 different. objectql.zod.ts hunks: the ObjectDataTableSchema docblock and its drillDown member only. zod-mirror-parity compiles green at head.
  • object-chart untouched. ObjectChartSchema.drillDown?: ChartDrillDown (objectql.ts l.4470), pinned Equal by object-chart-undeclared-keys-8885.test.ts l.110; spec 17.4.0 ChartDrillDownSchema is a strictObject whose unknown-key guidance names mode ("a TABLE / PIVOT / METRIC drill key … A chart segment is always an aggregate") and report. H4 true.
  • Pins (worktree at head, offline install, types dist built here; dependency dists borrowed from sibling worktree 68eedfed15, so the closure build itself was not re-measured — CI Build & E2E green). Head green: types tsc -p tsconfig.test.json exit 0, plugin-dashboard exit 0, 10 pin files 140/140, full packages/types/ packages/plugin-dashboard/ 378 files / 6562 tests (matches body). Base red (five sources swapped to 5c61e524 blobs, verified by hash; HEAD pins): types program exit 2 = TS2305 ×2, TS2724 ×1, TS2578 ×9; per-block + 7352 vitest 4 failed | 59 passed (63), the four zod rows; dist rebuilt from base (markers 0/0/0) then plugin-dashboard exit 2 = TS2305 ×1 + TS2578 ×2. Restore: all five blobs equal HEAD, git diff HEAD empty, markers back to 2/2/1. Ablations (anchor ×1→×0, blobs recorded, each restored to the HEAD blob with an empty diff): TS door → TS2344 _SchemaTakesTheTableShape, TS2578 ×2 nodeWithFilter/nodeWithNavigate, TS2344 on the 6576 pin, TS2322 in zod-mirror-parity naming objectql.zod.ts#ObjectDataTableSchema; dist marker 1 and plugin-dashboard TS2344 on schemaAnchor-6576; marker 0 after the restore rebuild. Pivot tombstone → TS2578 ×2 (l.63, l.66), dist marker 1, plugin-dashboard TS2578 ×2 (l.49, l.52). Zod door → 4 failed | 59 passed, and the parity program also goes red (TS2322 ×2) — one increase beyond the body's prediction, same direction. Zod filter alone → exactly 1 failed | 7 passed. 7352 non-vacuity: adding enabled to TABLE_REFUSED_KEYS fails it (1 failed | 49 passed) — real; TABLE_ACCEPTED keeps 6 of the 12 ACCEPTED labels, the six the check names.
  • Docblocks. mode: names object-data-table alone, 'record' default, 'filter' turns the drill off — matches l.644. Class docblock: "every target arm a block's shape admits is one that block honours" — true after the narrowing. Declared-keys pin comment lists pivot/metric only for navigateOnly — true. Nit, pre-existing and retained: the objectql.ts drillDown docblock says DashboardRenderer defaults to { enabled: true } while the mirror's describe and the code say { enabled: true, mode: 'record' }.
  • Seat's widening. objectql.ts: import line + ObjectDataTableSchema.drillDown only; objectql.zod.ts: ObjectDataTableSchema docblock + member only. No hunk outside.
  • Two body imprecisions (wording). H3 "the console's useOpenRecordList": the hook lives in packages/app-shell/src/views/useOpenRecordList.ts (@object-ui/app-shell). The card's runtime-door bullet also names ChartSchema.drillDown; that is the plain chart node, whose renderer ChartRenderer.tsx reads no drillDown at all (one comment mention) — outside this card's three blocks and correctly untouched, but the round-1 sentence saying so was dropped while "merging this PR completes the card" was added. Re-add one sentence recording it as the plain-chart remainder.

② Semver level

  • FAIL — '@object-ui/types': patch does not hold; minor with a breaking banner is owed. Rules applied. objectstack AGENTS.md (the Clause-② rule the claim cites): "The declaration is Clause-②: yes|no plus at most one arm from the closed pair (widening)/(narrowing): yes takes at least minor, (narrowing) is BREAKING … Breaking changesets must carry their migration." objectui AGENTS.md 版本号策略: "objectui 自身的破坏性变更也标 minor(在正文里写清 breaking 语义即可)". This change narrows the published validator's accept set (safeValidateSchema / objectui validate refuse a stored object-data-table config that parsed green yesterday) and the published ObjectDataTableSchema type. Every pending precedent for a zod-door refusal is minor with a breaking banner: 6881, 6951, 6972, 7322, 7963 ("Breaking, and graded minor by this repo's convention"), 8801, and 7352 itself ("Accept-set change on the published validator … minor"). The 9002 precedent (.changeset/9002-metric-drilldown-refusal.md, patch) was graded on the stated condition "Refused at the TypeScript door only … no runtime validator in this repository reads the members", and its ACCEPT record says "no runtime change"; that condition does not hold here. Clause-②: no itself is right (a narrowing, no widening).
  • Replacement frontmatter for .changeset/10685-drilldown-per-block.md:
    '@object-ui/types': minor / '@object-ui/plugin-dashboard': patch (plugin-dashboard is a React-prop narrowing with no runtime door, the 9002 shape).
  • Replacement banner, replacing the bold "Stored JSON:" paragraph: "Breaking for authored metadata, graded minor by this repo's convention (AGENTS.md: a breaking change here is minor, never major): object-data-table no longer accepts drillDown.filter, drillDown.maxRows, drillDown.report or drillDown.target: 'navigate' on either published face — the TypeScript ObjectDataTableSchema.drillDown and its zod mirror, the door objectui validate / safeValidateSchema run — so a stored JSON table config that parsed green before is refused by name now. Each refusal names the key and the blocks that do read it. None of the four was ever read by this block. Migration: delete the key; for the drill target write 'drawer' or 'dialog'. enabled, mode, title and columns are accepted exactly as before." Rest of the body kept.
  • PR body Changesets bullet must follow: "(@object-ui/types minor with a breaking banner, @object-ui/plugin-dashboard patch)" in place of "both patch". Title unchanged.
  • 10685 changeset, remaining sentences: all measured true — stored-JSON refusal, readers named, four never read, 'navigate' drawn as a drawer, the base mirror accepted all four, kept members unchanged (23/23), pivot TS-door-only (zero pivot code lines under packages/types/src/zod/), root + subpath exports, TSX compile failures, runtime unchanged.
  • 6576 and 7352 edits: each scopes the falsified sentence "at this change" and adds ⚠️ Dated note, 2026-09-25 … objectui#10685 (commits e9303d0 / 916bc17 dated 2026-09-25). Frontmatter md5 re-measured base = head: 7352 ecedb10c5189b2c8841ea736b67c3cc6, 6576 b25dbc26fe50c14d0b6f0cc8fe6cb9e1. The 7352 note's reader list (mode table only; report pivot + metric) is true.
  • 7363 stays true (both arms present, safeValidateSchema has the table arm). 8885 stays true in its collective reading ("mode and report for the table / pivot / metric widgets" describes what the shared type carries for that group, not per-block liveness).
  • Title and body against head: sha 430223947f = a1217b515 + 5c61e524, 14 files, 11 sources of 2 packages, 36 pending changesets, 378/6562, dist hits 2/2/1, red-on-base inventory, ablation inventory, ESLint 11 files / 0 errors / 80 no-explicit-any / 0 on added lines, --listFilesOnly (five types pins incl. parity; two plugin-dashboard pins reading dist/data-display.d.ts, dist/objectql.d.ts, dist/index.d.ts), 10707 and 10643 merged, 10657 no PR and no branch, f9c06ef6a = PR fix: resolve context tokens in every directly authored data node's own filter (objectui#10666) #10729, finding(console,ci): main is red on Inert vi.mock Specifier Check since PR objectui#10729 — filterContextTokensSweep-10666.test.tsx mocks a path inside packages/plugin-map/node_modules, which the pre-install check can never resolve #10732 open — all re-measured true. One count is wrong: "main had moved in four of this PR's files" — measured three (data-display.ts, objectql.ts, zod/objectql.zod.ts; index.ts did not move), matching the three items the parenthesis names. Replace "four" with "three". Fixes #10685 closes the card as the ruling family closes it (chart already refused and pinned; pivot at the TS door only, as 9002/10681 accepted; table on both doors; mode docblock; one pin per block with read controls), with the plain-chart ChartSchema.drillDown sentence recorded as above.
  • What stops landing: the patch level on @object-ui/types with no breaking banner (replacements above); the body's "four" → "three" and its Changesets bullet. Nothing else in ①–③.

③ Boundary flags

Implemented-by: claude/issue-10685-drilldown-per-block
Reviewed-by: session_014mXUNuFomfj24w7s1pZzhN

VERDICT: FAIL


Generated by Claude Code

…ith a breaking banner

The 10685 changeset narrows the published validator's accept set:
`objectui validate` / `safeValidateSchema` refuse a stored
`object-data-table` config carrying `drillDown.filter`, `.maxRows`,
`.report` or `target: 'navigate'` that parsed green before. The repo's
convention grades that `minor` with a breaking banner (as 6881, 6951,
6972, 7322, 7963, 8801 and 7352 do); `patch` was the grade for a
TypeScript-door-only refusal, which no longer describes this change.
`@object-ui/plugin-dashboard` stays `patch`: a React-prop narrowing with
no runtime door. Every other sentence is kept.

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

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

Metric Value Budget
Eager closure (gzip, 329 chunks) 3062.4 KB 3104.5 KB
Main entry chunk (gzip) 148.3 KB 350 KB
Entry file index-Bs1rpa77.js —
Status PASS —

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


📦 Bundle Size Report

Package Size Gzipped
app-shell (consoleActionDispatch.js) 0.20KB 0.19KB
app-shell (index.js) 16.57KB 6.15KB
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) 27.95KB 10.04KB
auth (AuthContext.js) 0.31KB 0.24KB
auth (AuthGuard.js) 2.07KB 1.00KB
auth (AuthProvider.js) 40.17KB 10.58KB
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.39KB 1.21KB
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.52KB 3.45KB
auth (index.js) 3.63KB 1.64KB
auth (invitation-status.js) 1.22KB 0.70KB
auth (org-roles.js) 6.66KB 2.78KB
auth (phone-identifier.js) 1.11KB 0.66KB
auth (types.js) 0.59KB 0.35KB
auth (useAuth.js) 5.30KB 1.02KB
auth (useWorkspaceAdminStatus.js) 11.08KB 4.58KB
collaboration (CommentThread.js) 27.13KB 7.95KB
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) 547.88KB 131.16KB
core (index.js) 9.52KB 3.79KB
create-plugin (index.js) 27.94KB 9.51KB
data-objectstack (index.js) 223.91KB 62.28KB
fields (index.js) 259.29KB 65.64KB
i18n (LocalizationContext.js) 1.76KB 0.96KB
i18n (builtinAggregateLabels.js) 0.86KB 0.49KB
i18n (currency.js) 2.59KB 1.22KB
i18n (fallbackInterpolation.js) 6.25KB 2.77KB
i18n (i18n.js) 8.87KB 3.64KB
i18n (index.js) 5.24KB 2.27KB
i18n (pickLocalized.js) 9.86KB 3.95KB
i18n (provider.js) 39.40KB 12.91KB
i18n (translateFn.js) 0.20KB 0.18KB
i18n (useDisplayLocale.js) 3.52KB 1.76KB
i18n (useObjectLabel.js) 34.34KB 9.17KB
i18n (useSafeTranslation.js) 5.60KB 2.33KB
layout (index.js) 39.28KB 11.09KB
mobile (MobileProvider.js) 0.92KB 0.49KB
mobile (ResponsiveContainer.js) 0.94KB 0.38KB
mobile (breakpoints.js) 1.51KB 0.70KB
mobile (createOfflineDataSource.js) 5.61KB 1.75KB
mobile (index.js) 1.99KB 0.87KB
mobile (offlineQueue.js) 3.91KB 1.35KB
mobile (pwa.js) 0.97KB 0.49KB
mobile (serviceWorker.js) 1.48KB 0.62KB
mobile (serviceWorkerSource.js) 3.41KB 1.48KB
mobile (useBreakpoint.js) 1.54KB 0.65KB
mobile (useGesture.js) 6.96KB 1.98KB
mobile (useOfflineSync.js) 1.99KB 0.72KB
mobile (usePullToRefresh.js) 6.62KB 2.45KB
mobile (useResponsive.js) 0.72KB 0.42KB
mobile (useSpecGesture.js) 5.52KB 2.10KB
mobile (useTouchTarget.js) 1.01KB 0.54KB
permissions (MePermissionsProvider.js) 13.52KB 4.88KB
permissions (PermissionContext.js) 0.31KB 0.25KB
permissions (PermissionGuard.js) 0.89KB 0.45KB
permissions (PermissionProvider.js) 6.24KB 2.16KB
permissions (discardProofCache.js) 1.04KB 0.55KB
permissions (evaluator.js) 8.33KB 3.07KB
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) 16.01KB 3.93KB
plugin-calendar (index.js) 51.65KB 14.69KB
plugin-charts (index.js) 81.82KB 22.51KB
plugin-chatbot (index.js) 198.40KB 47.22KB
plugin-dashboard (index.js) 134.05KB 35.61KB
plugin-designer (index.js) 216.25KB 44.39KB
plugin-detail (index.js) 233.23KB 61.74KB
plugin-editor (index.js) 2.23KB 1.05KB
plugin-form (index.js) 155.50KB 39.71KB
plugin-gantt (index.js) 169.75KB 41.96KB
plugin-grid (index.js) 218.12KB 59.72KB
plugin-kanban (index.js) 48.43KB 15.11KB
plugin-list (index.js) 114.70KB 28.42KB
plugin-map (index.js) 22.90KB 7.62KB
plugin-markdown (index.js) 13.88KB 4.80KB
plugin-report (index.js) 43.55KB 11.99KB
plugin-timeline (index.js) 30.91KB 9.05KB
plugin-tree (index.js) 10.58KB 3.72KB
plugin-view (index.js) 87.83KB 22.01KB
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) 116.21KB 38.14KB
react (data-invalidation.js) 5.05KB 2.08KB
react (index.js) 4.03KB 1.86KB
react (schema-input.js) 4.25KB 2.04KB
react (spec-input.js) 0.20KB 0.18KB
sdui-parser (body-dialect.js) 4.78KB 2.09KB
sdui-parser (codegen.js) 6.58KB 2.74KB
sdui-parser (dashboard-widget-options.js) 3.08KB 1.30KB
sdui-parser (index.js) 5.78KB 2.56KB
sdui-parser (input-type.js) 2.84KB 1.40KB
sdui-parser (kanban-quick-add.js) 3.89KB 1.87KB
sdui-parser (parse.js) 25.28KB 7.80KB
sdui-parser (provenance.js) 3.66KB 1.82KB
sdui-parser (types.js) 0.28KB 0.23KB
sdui-parser (validate.js) 18.27KB 6.20KB
types (ai.js) 4.11KB 2.06KB
types (api-types.js) 0.20KB 0.18KB
types (app.js) 2.87KB 1.00KB
types (base.js) 0.20KB 0.18KB
types (blocks.js) 0.20KB 0.18KB
types (complex.js) 2.93KB 1.49KB
types (crud.js) 0.20KB 0.18KB
types (dashboard-filter-alias.js) 6.23KB 2.74KB
types (data-display.js) 3.75KB 1.85KB
types (data-protocol.js) 0.20KB 0.19KB
types (data.js) 0.20KB 0.18KB
types (designer.js) 1.85KB 0.85KB
types (disclosure.js) 0.20KB 0.18KB
types (error-code.js) 1.54KB 0.88KB
types (expression.js) 0.20KB 0.18KB
types (feedback.js) 0.20KB 0.18KB
types (field-types.js) 0.20KB 0.18KB
types (form.js) 0.20KB 0.18KB
types (http-inflight.js) 8.87KB 3.73KB
types (http-retry.js) 4.32KB 2.02KB
types (icon-key-migration.js) 4.26KB 1.63KB
types (index.js) 4.74KB 2.25KB
types (layout.js) 0.20KB 0.18KB
types (managed-by.js) 0.19KB 0.18KB
types (mobile.js) 5.00KB 2.39KB
types (navigation.js) 0.20KB 0.18KB
types (objectql.js) 0.20KB 0.18KB
types (overlay.js) 0.20KB 0.18KB
types (permissions.js) 2.52KB 1.31KB
types (plugin-scope.js) 0.20KB 0.18KB
types (record-components.js) 0.20KB 0.19KB
types (record-semantics.js) 1.28KB 0.67KB
types (registry.js) 0.20KB 0.18KB
types (reports.js) 0.20KB 0.18KB
types (select-option.js) 0.20KB 0.19KB
types (spec-report.js) 5.05KB 1.93KB
types (spec-ui-namespace.js) 0.20KB 0.19KB
types (strict-authoring-face.js) 17.15KB 6.32KB
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

@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

Contract review

Served-tier: CONTRACT_REVIEW_TIER
Head-sha: 64d43b6d67dee3aafbdb1c04faf65be1357a359b

① Derived judgments

  • Round-3 delta is exactly as claimed. git log 430223947f..HEAD: the branch's 64d43b6d67 (parent 4f2f7a530f) and the merge 4f2f7a530f (parents 430223947f, 41ae65b268), which brings main's c3a26ccdaa (refactor(types,plugin-kanban): retire ColumnWidthConfig / ColumnWidthConfigSchema (objectui#10582) #10730), cf00ea8b21 (fix(plugin-form): a wizard goes back to its loading state when it is pointed at another record (objectui#10726) #10737), 41ae65b268 (fix(components): data-table's header context menu offers no sort on a sortable: false column (objectui#10727) #10739). Branch commit name-status/numstat: M .changeset/10685-drilldown-per-block.md 14/9, nothing else. Main's merged commits 5c61e52417..41ae65b268: 16 files, +628 −48 (3 new changesets 10582/10726/10727, components/.../data-table.tsx 17/3, plugin-form/WizardForm.tsx 15/0, recordSwapLoading.test.tsx 65/7, two new tests, plugin-kanban/index.tsx 2/1, plugin-kanban/types.ts 3/1, types/.../column-width-config-retired-10582.test.ts 139/0, zod-mirror-parity.test.ts 3/5, types/src/complex.ts 6/19, types/src/index.ts 0/1, zod/complex.zod.ts 0/10, zod/index.zod.ts 0/1). Whole 430223947f..HEAD = those 16 + the changeset = 17 files. Among the 14 card files only two differ: the changeset (14/9) and packages/types/src/index.ts (0/1: the ColumnWidthConfig, line, the identical hunk refactor(types,plugin-kanban): retire ColumnWidthConfig / ColumnWidthConfigSchema (objectui#10582) #10730 applied on main); the other 12 are byte-identical. PR vs merge-base 41ae65b268: exactly the 14 files, +563 −36; the PR's own index.ts hunk is the two added exports only. Merge is clean: merge-tree --write-tree vs main exit 0.
  • Banner verbatim: yes. Whitespace-normalised, 762 chars, identical to the record's text. Kept paragraph (two sentences) measured true at head: base mirror drillDown: DrillDownConfigSchema.optional() (main objectql.zod.ts l.2733); head DrillDownConfigSchema.extend({ filter: retirementTombstone( l.2745; ObjectDataTable.tsx l.1130 === 'dialog' ? 'dialog' : 'drawer' (navigate was drawn as a drawer), l.644 reads mode. They add the never-read reason and the base mirror's name, neither of which the banner states; no contradiction (the banner's "parsed green before" and the kept "accepted all four" are one fact at two grains). Judged an acceptable reading of "replace": the record said "Rest of the body kept" and had measured those sentences true. Nit only: "Its row drills…" now opens a paragraph one paragraph away from its antecedent; optional "The table's row drills…". The remaining 4 paragraphs are identical to 430223947f.
  • Frontmatter: '@object-ui/types': minor, '@object-ui/plugin-dashboard': patch, no major; CI Changeset Bump Policy green.
  • 6576 and 7352 edits stand: no hunk since 430223947f; frontmatter md5 at head = main = 430223947f: 7352 ecedb10c5189b2c8841ea736b67c3cc6, 6576 b25dbc26fe50c14d0b6f0cc8fe6cb9e1.

② Semver level

③ Boundary flags

Implemented-by: claude/issue-10685-drilldown-per-block
Reviewed-by: session_014mXUNuFomfj24w7s1pZzhN

VERDICT: PASS


Generated by Claude Code

@objectstack-fleet objectstack-fleet Bot changed the title fix(types,plugin-dashboard): object-pivot refuses drillDown.mode on its prop type (objectui#10685, first half) fix(types,plugin-dashboard)!: object-pivot and object-data-table refuse the DrillDownConfig members they never read (objectui#10685) Sep 27, 2026
@objectstack-fleet
objectstack-fleet Bot marked this pull request as ready for review September 27, 2026 03:43
@objectstack-fleet
objectstack-fleet Bot added this pull request to the merge queue Sep 27, 2026
Merged via the queue into main with commit 5ad3b88 Sep 27, 2026
44 of 45 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

2 participants