Skip to content

fix(plugin-kanban): delete KanbanEnhanced.tsx, the module no export or barrel reached (objectui#8932) - #10588

Merged
objectstack-fleet[bot] merged 6 commits into
mainfrom
claude/issue-8932-retire-kanban-enhanced
Sep 25, 2026
Merged

objectstack-fleet[bot] merged 6 commits into
mainfrom
claude/issue-8932-retire-kanban-enhanced

Conversation

@objectstack-fleet

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

Copy link
Copy Markdown
Contributor

Fixes #8932

Clause-②: no

@object-ui/plugin-kanban's exports map has no ./KanbanEnhanced entry. The published 17.6.0 map is . only; this release's in-repo map is . and ./style.css. The entry point does not export the component by name, so the declared surface does not move (the ruling's ③). The changeset still names the file for anyone who deep-imported it.

Executes ruling 5634037484, ratified 5810258711 (maintainer: 「同意」): A — delete packages/plugin-kanban/src/KanbanEnhanced.tsx and its test references. PM claim 5830002817. Rework round after contract review 5831016914. Implemented by the os-dev run in session https://claude.ai/code/session_014mXUNuFomfj24w7s1pZzhN.

What changes

  • packages/plugin-kanban/src/KanbanEnhanced.tsx is deleted.
  • Where the component was. I read the published 17.6.0 tarball with npm pack:
    • dist/index.js and dist/index.umd.cjs carry the component inlined (a KanbanEnhanced export of the chunk, bound to the minified function ct). It was reachable through the kanban-enhanced registry key and the entry's kanbanComponents map.
    • dist/index.d.ts references ./KanbanEnhanced.
    • The exports map is . only. The tarball contains no CSS file.
    • The component leaves the bundle in this release with the objectui#8257 / objectui#8802 key retirement (the pending 8802-8257-8008 entry), not with this PR. Building the base (d22b37bd8, after feat(types,plugin-kanban,plugin-gantt)!: retire the bare kanban / gantt node keys and the kanban-ui / kanban-enhanced registrations #8865) and this branch, dist/index.js and dist/index.umd.cjs contain KanbanEnhanced 0 times on both sides (control: KanbanImpl is found in dist/index.js).
  • What this PR removes from the published package, measured by building @object-ui/plugin-kanban on the base and on the branch:
    • dist/KanbanEnhanced.d.ts and dist/KanbanEnhanced.d.ts.map. Nothing else leaves the dist/ listing.
    • dist/index.d.ts is byte-identical (cmp exit 0).
    • @tanstack/react-virtual leaves the plugin's dependencies. The deleted module was the only file in the package that imported it, and check-unused-dependencies fails without this change. pnpm-lock.yaml loses just this importer's three lines. @object-ui/plugin-grid still declares the package, so no resolution moves.
  • style.css. The stylesheet first ships in this release (pending 4929-plugin-published-stylesheets.md). Built after this deletion, it does not carry three utility rules that only the deleted module used: border-border/50, text-yellow-500 and shadow-xl. Building with the module keeps 65 rules; building without it keeps 62.
  • @object-ui/types JSDoc (comment only). Four present-tense passages that named KanbanEnhanced as a live reader now name KanbanImpl as the one board. The two past counts are dated and name objectui#8932 rather than being deleted:
    • KanbanCard: "what KanbanImpl reads back".
    • KanbanColumn.cards: "measured at objectui#6939: 12 lines in KanbanImpl, and 8 in KanbanEnhanced until objectui#8932 deleted it".
    • ObjectKanbanSchema.columns, twice: "what KanbanImpl consumes", and "counted when there were two board implementations … KanbanImpl alone still reads all six members". I re-measured that last claim: KanbanImpl.tsx reads id, title, cards, limit, className and collapsed off the lane.
    • The past-tense passages on KanbanColumn.collapsed, on the retired color member, and on the retired lane-collapse key stay as they were.
    • git diff -w over the two files shows only lines starting with *.
  • Changesets:
    • .changeset/8932-retire-kanban-enhanced.md ('@object-ui/plugin-kanban': patch) states how the component left the bundle, what this change removes, the deep-import and dependency notes, and that style.css ships without the three rules.
    • .changeset/8932-kanban-enhanced-types-jsdoc.md ('@object-ui/types': patch) is one sentence on the JSDoc.

Premise re-checked on the current main (d22b37bd8)

H1: confirmed for the source tree, with lit controls.

H2: falsified. The module had two test references, not one:

  • src/__tests__/kanban-handler-slots-7664.test.tsx: a vi.mock target whose prop recorder no leg read.
  • src/cardPredicateScope.test.tsx: a direct import. This is the reference the index.tsx tombstone itself named.

I handled both as the ruling's intent directs: each test is deleted, or rewritten to what it still pins.

Test files: every assertion kept, removed or moved

kanban-handler-slots-7664.test.tsx: the KanbanEnhanced prop recorder and its enhanced log are removed. All legs are kept verbatim, because every probe records the KanbanImpl chunk. The log parameter type narrows to keyof typeof recorded. A docblock paragraph records the removal.

cardPredicateScope.test.tsx:

  • Removed: "KanbanEnhanced binds the ambient predicate scope alongside the card". Its KanbanBoard twin stays and pins the same verdict on the one registered board.
  • Moved, subject KanbanEnhanced → KanbanBoard:
    • "a scope-gated condition fails SOFT (no style) outside the provider". It is now the negative control for the live positive leg, which had none of its own.
    • "a bare-field condition no longer binds the card (objectui#5741)". Its canonical-spelling control moved with it.
  • Kept unchanged: "KanbanBoard (impl) binds the ambient predicate scope alongside the card" and the four relation-field legs (objectui#3501).

Other files the deletion forced

  • packages/plugin-kanban/src/index.tsx (comment only). The kanban-enhanced tombstone said the file "stays". It now records the deletion, names the new pin, and says that through 17.6.0 the component was also bundled behind the kanban-enhanced key.
  • scripts/__tests__/one-authority-per-exported-name-6273.test.ts: in KNOWN_COLLISIONS, ConditionalFormattingRule drops its third site, the deleted file. This baseline is shrink-only and fails on a stale site.
    • Ablation on the committed tree: I put the three-site entry back with ablation-replace (anchor 1 → 0, blob 0a8b7933d98f → d610bed3eea6).
    • Result: "declares no name twice outside the named, shrinking baseline" goes red with "KNOWN_COLLISIONS lists collisions that no longer exist", naming the deleted path.
    • Restore: blob equals HEAD, and git diff HEAD is empty.
  • packages/plugin-kanban/package.json and pnpm-lock.yaml: the dependency removal described above.

Pending changesets (H4)

Three pending changesets are reconciled in the objectui#10533 / #10540 form: the sentence is scoped to "at this change" and a dated note is added. The frontmatter stays byte-identical: the md5 of each file's frontmatter block is equal on base and head, and check-changeset-overwrite prints the same "declared at base" and "declares now" lines.

  • 8802-8257-8008-kanban-gantt-family-retirement.md: "KanbanEnhanced.tsx has zero non-test importers. ⛔ The file is deliberately left in place".
  • 6172-markdown-kanban-one-authority.md: "both files now re-point at it".
  • 8913-object-kanban-columns-declared.md: "exactly the members the two board implementations read" and "before either board implementation sees one". check-changeset-claims surfaced this entry once the branch edited objectql.ts.

Read and left as they are:

CardTemplate / ColumnWidthConfig: report only, not deleted

Neither type is in KanbanEnhanced's condition. Both are exported through . (the entry's export type line from ./types), and the deleted module named neither of them (0 hits).

  • CardTemplate is consumed. CardTemplates.tsx imports it for its templates prop and its onSelect signature, and CardTemplates is itself exported from the entry. Importers of the CardTemplates component in apps/, packages/, examples/, content/ and skills/, other than its own file and the entry: 0.
  • ColumnWidthConfig has no reader. 5 non-test source files name it: its declaration in packages/types/src/complex.ts, its Zod mirror, and three re-exports. That matches the reading objectui#8522 recorded.
  • Control on the same query: KanbanCard is named by the consumers KanbanImpl.tsx and useQuickAddReorder.ts.

Pin (H5): red on the base, green on the head

packages/plugin-kanban/src/__tests__/kanbanEnhancedRetired-8932.test.ts follows the chart-primitives-removed-7397 file-removal shape (existsSync with a lit control) and this package's useColumnWidthsRetired-8522 naming. It pins two things:

  • The file is absent from src/. Control: KanbanImpl.tsx in the same directory reads present.
  • No file under src/ names the module as a specifier (static or dynamic import, re-export, require, vi.mock / vi.doMock). Firing control: the same walk and pattern find the live board's lazy import in index.tsx.

Red on 76265dfdc (the base plus the pin alone): 2 failed. The first reported { retired: true, live: true }. The second listed __tests__/kanban-handler-slots-7664.test.tsx and cardPredicateScope.test.tsx, after its control assertion passed. Green on the head.

Verification (final head 313ca6321)

Test runs, all from the repo root under the shared verify lock:

  • pnpm exec vitest run --maxWorkers=2 packages/types/ packages/plugin-kanban/: 298 files and 5636 tests passed.
  • pnpm exec vitest run --maxWorkers=2 scripts/ (the root-level suite, which is outside the package graph): 177 files passed, 2 skipped, 5303 tests passed.
    • At 2165ee472 (the deletion without the dependency removal) the same suite had 1 failure: check-unused-dependencies.test.ts › "is green: every gated declaration has a consumer", with @tanstack/react-virtual / declared-without-consumer.

Type-check, lint and build:

  • pnpm --filter @object-ui/types type-check (tsc --noEmit && tsc -p tsconfig.examples.json && tsc -p tsconfig.test.json): exit 0 (at abda7fc09; the types source is unchanged since).
  • pnpm --filter @object-ui/plugin-kanban type-check: exit 0. --listFiles on the test program lists the pin and both rewritten tests.
  • pnpm type-check:scripts: exit 0.
  • pnpm --filter @object-ui/plugin-kanban lint: 0 errors.
  • pnpm --filter @object-ui/plugin-kanban build: exit 0.
  • These four ran in the first round. The plugin-kanban source changed since only in one index.tsx comment.

Gates, all exit 0 at 313ca6321:

  • Changesets: check-changeset-presence ("7 source file(s) of 2 released package(s) changed, and this change declares 2 changeset(s)"), check-changeset-no-major, check-changeset-fixed, check:pending-changeset-literals.
  • Report-only changeset gates: check-changeset-claims and check-changeset-overwrite. Their findings are addressed above.
  • Line citations and bytes: check:new-line-citations ("0 new citation(s)") and check:control-bytes.

First-round gates, green at a843148be and not reached by the later edits:

  • Mocks and test paths: check-vi-mock-specifiers, check-vi-mock-inherit, check-vi-mock-override-shape, check-test-path-roots.
  • Source and dependency checks: check:handler-key-reads, check:unreferenced-sources, check:unused-deps, check:phantom-deps.
  • Lockfile: check:lockfile-integrity and check:lockfile-dedupe.
  • Governed surface: check-governed-queue-guard --test answers NOT GOVERNED.

Merge check: git merge-tree --write-tree origin/main HEAD against origin/main 50e41f738 exits 0. main has not touched any file this branch changes since d22b37bd8, so no merge was needed.

NOT MEASURED:

  • check:sdui-registration-pins: it exits 2 without a console build (a prerequisite, not a verdict), and this diff changes no registration.
  • check:readme-exports: it needs every package built. The entry's dist/index.d.ts is byte-identical.

Surface

The claim's file surface named the module, one test, a pin, any pending changesets, and one new changeset. Beyond that, this PR touches:

  • cardPredicateScope.test.tsx: it imported the module.
  • index.tsx (comment only).
  • scripts/__tests__/one-authority-per-exported-name-6273.test.ts: the ratchet.
  • packages/plugin-kanban/package.json and pnpm-lock.yaml: the unused-dependency gate.
  • The two @object-ui/types files, packages/types/src/complex.ts and packages/types/src/objectql.ts (JSDoc only), plus their changeset. This was asked for by the contract review.

Serial overlaps:

  • objectui#10524 edits ChatbotSchema.body JSDoc in complex.ts, and objectui#10518 edits ObjectChartSchema in objectql.ts. Both are far from the four passages edited here.
  • ⚠️ Draft PR chore(deps): lucide-react 1.31.0 -> 1.43.0, with the one retired spelling repaired #8941 (the lucide-react bump) edits the adjacent lucide-react line in packages/plugin-kanban/package.json and the same importer block in pnpm-lock.yaml. Whichever PR lands second meets a textual conflict there, cleared by merging main and re-running pnpm install.

Acceptance notes


Generated by Claude Code

…ng names it

Red on the base: the file is present, and two test files still name it as a
module specifier (a direct import and a vi.mock target).

Claude-Session: https://claude.ai/code/session_014mXUNuFomfj24w7s1pZzhN
Co-authored-by: Claude <noreply@anthropic.com>
…r barrel reached

Executes the objectui#8932 ruling (delete). The package `exports` map is `.`
and `./style.css` only and the entry point never re-exported the component,
so nothing supported moves; the published package loses the
`dist/KanbanEnhanced.d.ts` typings, the only part of the module it shipped.

- cardPredicateScope.test.tsx: the KanbanEnhanced positive leg goes (the
  KanbanBoard leg pins the same verdict); its fail-soft and bare-field legs
  now run on KanbanBoard.
- kanban-handler-slots-7664.test.tsx: the unread KanbanEnhanced prop
  recorder goes; no assertion moves.
- index.tsx: the kanban-enhanced tombstone no longer says the file stays.
- one-authority collision baseline: ConditionalFormattingRule loses the
  deleted third site (shrink direction).
- two pending changesets scoped to "at this change" with a dated note.

Claude-Session: https://claude.ai/code/session_014mXUNuFomfj24w7s1pZzhN
Co-authored-by: Claude <noreply@anthropic.com>
… was KanbanEnhanced.tsx

The deleted module was the one file in @object-ui/plugin-kanban that imported
it, so the declaration had no consumer left and check-unused-dependencies
went red on the previous commit. The lockfile loses only this importer's
three lines; @object-ui/plugin-grid still declares the package. The
objectui#8932 changeset says so for anyone who got it transitively.

Claude-Session: https://claude.ai/code/session_014mXUNuFomfj24w7s1pZzhN
Co-authored-by: Claude <noreply@anthropic.com>
Measured by rebuilding dist/index.css with and without the module:
65 rules kept becomes 62, and the three that leave are border-border/50,
text-yellow-500 and shadow-xl.

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

github-actions Bot commented Sep 25, 2026 •

Copy link
Copy Markdown
Contributor

changeset-claim-re-read

⚠️ 29 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/6939-kanban-column-cards.md

  • names KanbanEnhanced.tsx → packages/plugin-kanban/src/KanbanEnhanced.tsx — ⚠️ this change leaves no such file

    Breaking, deliberately. KanbanColumn declared its card list as items in complex.ts and in the zod mirror complex.zod.ts. Every board reads cards. Measured on origin/main 78a3cc238: KanbanImpl.tsx reads .cards on 12 lines, KanbanEnhanced.tsx on 8, and bucketCardsIntoColumns twice more as col.cards || []; .items had zero read sites in either board (a same-shaped .title control on the same two files returns 8 and 3, so those zeros are readings and not a mis-shaped probe). Both catalog entries, the plugin docs and content/docs/api/schema-reference.md all author cards.

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

    Breaking, deliberately. KanbanColumn declared its card list as items in complex.ts and in the zod mirror complex.zod.ts. Every board reads cards. Measured on origin/main 78a3cc238: KanbanImpl.tsx reads .cards on 12 lines, KanbanEnhanced.tsx on 8, and bucketCardsIntoColumns twice more as col.cards || []; .items had zero read sites in either board (a same-shaped .title control on the same two files returns 8 and 3, so those zeros are readings and not a mis-shaped probe). Both catalog entries, the plugin docs and content/docs/api/schema-reference.md all author cards.

.changeset/5793-spec-range-floors.md

  • names pnpm-lock.yaml → pnpm-lock.yaml — edited by this change

    Nothing a consumer installs today changes: normal resolution already picks the newest 17.x, and pnpm-lock.yaml still resolves 17.2.0 on this edge after the bump. The change is to the declared floor only, which is why it is scored patch rather than minor — the same reasoning objectui#5753 used for the other direction on this dependency.

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

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

  • names scripts/__tests__/one-authority-per-exported-name-6273.test.ts → scripts/__tests__/one-authority-per-exported-name-6273.test.ts — edited by this change

    The three KNOWN_COLLISIONS lines came down in the same change; that baseline (scripts/__tests__/one-authority-per-exported-name-6273.test.ts) is shrink-only and fails in both directions, so converging without deleting them would have been red too. 43 entries → 40.

.changeset/6361-spec-floor-17-2-0.md

  • names pnpm-lock.yaml → pnpm-lock.yaml — edited by this change

    Nothing a consumer installs today changes: normal resolution already picks the newest 17.x, and pnpm-lock.yaml still resolves 17.2.0 on both edges after the bump — only the recorded specifier: moves. No source and no behaviour changes, which is why this is scored patch, on the reasoning objectui#5793 used for the same remediation on @object-ui/plugin-detail.

.changeset/6687-chatbot-surface-authorable.md

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

    Measured on both declaration faces before the fix, each with a control that had to hit: schema.surface appeared 0 times in renderer.tsx against schema.placeholder at 3 (one per registration) and schema.processVisibility at 1; and ChatbotSchema (packages/types/src/complex.ts) declared 34 keys, not this one. Two faces agreeing is what made the zero a reading rather than a bad query.

.changeset/7122-objectstack-family-17-3-0.md

  • names pnpm-lock.yaml → pnpm-lock.yaml — edited by this change

    @objectstack/client, core, formula and lint each pin @objectstack/spec EXACTLY, so resolving the spec alone to 17.3.0 left the console bundling TWO copies of it. Moving the family with it in pnpm-lock.yaml collapses the duplicate; every declared range already admitted 17.3.0, so no manifest moved.

.changeset/7295-chat-message-avatar-keys.md

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

    packages/plugin-chatbot/src/index.tsx:173–178 reads message.avatar || userAvatarUrl and message.avatarFallback || userAvatarFallback (and the assistant twins), the authoring-to-runtime seam spreads every unlisted key through (chatMessageAdapter.ts, ...passthrough), and the SDUI renderer feeds the authored messages[] straight in — a per-message avatar override renders, is documented, and no authoring-facing type declared it. ChatMessage in packages/types/src/complex.ts has no index signature (objectui#5155, deliberately — none is added here), so an author annotating ChatbotSchema.messages was told a value that renders is an error (TS2353); the zod mirror ChatMessageSchema is a plain strip-mode z.object, so the value parsed green and was silently DROPPED from the parsed output.

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

.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).

.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/7655-chatbot-registration-authoring-faces.md

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

    New published symbol: ChatbotSharedKey, the string-literal union of the twenty keys all three registrations read. It is exported from complex.ts because an exported interface may not extend a Pick over a private name (TS4022), so it is emitted into dist/complex.d.ts and is reachable through the published @object-ui/types/complex subpath (it is not re-exported from the package entry). It is a census, not an authoring face.

.changeset/7703-chatbot-dark-keys-retired.md

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

    Each member goes to ?: never on packages/types/src/complex.ts and to retirementTombstone(...) on packages/types/src/zod/complex.zod.ts — both halves, in lockstep, the convention MarkdownSchema.sanitize (objectui#6972), TimelineSchema.timeScale (objectui#6355) and ObjectViewSchema.viewTabBar (objectui#7779) already carry. Each refusal names the key, says why it is retired, and points at what to write instead; one string feeds both the parse-time message and the .describe() metadata, so the two cannot drift.

.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/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/8415-filter-builder-condition-id.md

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

    Breaking for authored metadata: a filter-builder CONDITION must now declare id (objectui#8415). It is declared on both published faces — the TypeScript interface FilterBuilderCondition in complex.ts and the Zod mirror FilterBuilderConditionSchema in zod/complex.zod.ts — so a key the renderer has always required is finally validated instead of silently discarded.

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

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

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

.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/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).

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

.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).

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

  • names complex.ts → packages/types/src/complex.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/calendar-readme-schema-keys-5045.md

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

    README.md's "Schema API / CalendarView" block described a CalendarViewSchema that does not exist. Measured against the interface itself (packages/types/src/complex.ts) and its zod mirror: events — the schema's only required key besides type — was published as events?, so a reader following the README omits it and TypeScript rejects the node; defaultDate was string where the schema says string | Date; and onDateClick was listed as a schema key when it is a CalendarViewProps component prop, sending readers to a different package's surface for a key calendar-view does not have (the schema's key is onDateChange). The block also listed 6 of the schema's 13 keys with nothing saying it was a summary (objectui#5045).

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 50e41f738 (merge-base with origin/main): 10 file(s) changed outside .changeset/, read against 1460 pending declaration(s) that publish a body (2042 pending in total). · run

@github-actions

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

Metric Value Budget
Eager closure (gzip, 329 chunks) 3047.1 KB 3104.5 KB
Main entry chunk (gzip) 147.8 KB 350 KB
Entry file index-hP1HSosD.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.68KB 6.20KB
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.18KB 10.59KB
auth (AuthShell.js) 3.49KB 1.40KB
auth (ForgotPasswordForm.js) 12.21KB 3.45KB
auth (LoginForm.js) 18.15KB 5.39KB
auth (PreviewBanner.js) 0.90KB 0.50KB
auth (RegisterForm.js) 6.65KB 2.22KB
auth (SocialSignInButtons.js) 9.61KB 3.89KB
auth (UserMenu.js) 3.41KB 1.23KB
auth (auth-gate-events.js) 1.29KB 0.66KB
auth (authStyles.js) 5.04KB 1.72KB
auth (createAuthClient.js) 40.21KB 10.80KB
auth (createAuthenticatedFetch.js) 8.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) 545.30KB 130.42KB
core (index.js) 9.22KB 3.71KB
create-plugin (index.js) 27.94KB 9.51KB
data-objectstack (index.js) 223.91KB 62.28KB
fields (index.js) 258.75KB 65.60KB
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.40KB 14.61KB
plugin-charts (index.js) 74.94KB 20.89KB
plugin-chatbot (index.js) 198.36KB 47.20KB
plugin-dashboard (index.js) 133.50KB 35.37KB
plugin-designer (index.js) 216.25KB 44.39KB
plugin-detail (index.js) 232.59KB 61.50KB
plugin-editor (index.js) 2.23KB 1.05KB
plugin-form (index.js) 147.92KB 37.83KB
plugin-gantt (index.js) 169.62KB 41.91KB
plugin-grid (index.js) 215.37KB 58.92KB
plugin-kanban (index.js) 48.26KB 15.04KB
plugin-list (index.js) 114.43KB 28.26KB
plugin-map (index.js) 22.42KB 7.38KB
plugin-markdown (index.js) 13.88KB 4.80KB
plugin-report (index.js) 43.55KB 11.99KB
plugin-timeline (index.js) 30.64KB 8.94KB
plugin-tree (index.js) 10.52KB 3.69KB
plugin-view (index.js) 87.31KB 21.78KB
providers (DataSourceProvider.js) 0.75KB 0.39KB
providers (MetadataProvider.js) 1.37KB 0.59KB
providers (ThemeProvider.js) 1.90KB 0.85KB
providers (UploadProvider.js) 11.66KB 3.50KB
providers (index.js) 0.45KB 0.23KB
providers (types.js) 0.01KB 0.04KB
react-runtime (index.js) 5.62KB 2.34KB
react (LazyPluginLoader.js) 4.47KB 1.63KB
react (SchemaRenderer.js) 114.58KB 37.60KB
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) 0.20KB 0.18KB
types (plugin-scope.js) 0.20KB 0.18KB
types (record-components.js) 0.20KB 0.19KB
types (record-semantics.js) 1.28KB 0.67KB
types (registry.js) 0.20KB 0.18KB
types (reports.js) 0.20KB 0.18KB
types (select-option.js) 0.20KB 0.19KB
types (spec-report.js) 5.05KB 1.93KB
types (spec-ui-namespace.js) 0.20KB 0.19KB
types (strict-authoring-face.js) 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: a843148be68dd2799ad1d11779462914d321f1ff

① Derived judgments

  • Refs. git rev-parse refs/review/pr-10588 = a843148be… (matches). Merge-base with main = d22b37bd8. Checkout untouched (only refs/review/* fetched; no worktree needed).
  • Reach, re-confirmed with a lit control (base d22b37bd8). git grep -E "(from|import|require|vi\.(do)?[mM]ock)\s*\(?\s*['\"][^'\"]*KanbanEnhanced" over packages apps examples content skills: 2 hits, both tests (kanban-handler-slots-7664.test.tsx:145 vi.mock, cardPredicateScope.test.tsx:22 import). Control, same pattern for KanbanImpl: packages/plugin-kanban/src/index.tsx:221 (React.lazy(() => import('./KanbanImpl'))). Non-test importers: 0. Barrel at base exports no KanbanEnhanced. In-repo exports at base/head/main: . + ./style.css.
  • ⛔ "Never in dist/index.js or the UMD bundle of the published package" is FALSE. npm pack @object-ui/plugin-kanban@latest = 17.6.0: dist/index.js line 14 import { useVirtualizer as Ee } from "@tanstack/react-virtual", line 1226 KanbanEnhanced: () => ct, line 1414 function ct({ columns, onCardMove, onColumnToggle, enableVirtualScrolling: i = !1, virtualScrollThreshold: a = 50, … (the component body, inlined), line 1632 "kanban-enhanced": mt, line 1635 s.register("kanban-enhanced", …); dist/index.umd.cjs carries ne=x({KanbanEnhanced:()=>se,default:()=>se}) and the same registration; dist/index.d.ts types kanbanComponents['kanban-enhanced'] as React.LazyExoticComponent OF typeof import('./KanbanEnhanced').KanbanEnhanced. The dev built base and head only (both post-feat(types,plugin-kanban,plugin-gantt)!: retire the bare kanban / gantt node keys and the kanban-ui / kanban-enhanced registrations #8865) and generalised to "never". Also the published 17.6.0 exports map is . ONLY (no ./style.css, 0 CSS files in the tarball): ./style.css arrives with pending entry 4929-plugin-published-stylesheets.md in this same release. The claim's exports-map citation describes the in-repo map, not the published one; either way no ./KanbanEnhanced entry ever existed.
  • feat(types,plugin-kanban,plugin-gantt)!: retire the bare kanban / gantt node keys and the kanban-ui / kanban-enhanced registrations #8865 precondition. At base kanban-enhanced is unregistered (pinned by kanban-family-registry-keys-retired-8257.test.ts, present at base), the file was still on disk, the map unchanged: situation unchanged; the deletion is the ruled next step.
  • "Sole reference" falsified: 2 references; the base index.tsx tombstone itself named cardPredicateScope.test.tsx.
  • cardPredicateScope.test.tsx: it 8 → 7, expect 9 → 8. Removed: the KanbanEnhanced positive leg (1 toBeTruthy), whose KanbanBoard twin stays. Moved to KanbanBoard (KanbanImpl accepts conditionalFormatting at KanbanImpl.tsx:142, reads predicate scope at :199): fail-soft (findByBg toBeUndefined, identical) and objectui#5741 bare-field (bare toBeUndefined + canonical toBeTruthy, identical). No assertion weakened; same behaviour now pinned on the live board, which previously had no negative control.
  • kanban-handler-slots-7664.test.tsx: it 6 → 6, expect 12 → 12. recorded.enhanced was pushed at base :147 and read by no leg (only the 'impl' | 'enhanced' type unions at :159/:174). Nothing dropped.
  • Forced extras. @tanstack/react-virtual at base in packages/plugin-kanban: package.json:46 and KanbanEnhanced.tsx:10 only; head: 0. Lockfile diff = exactly 3 lines in the plugin-kanban importer block; the @tanstack/react-virtual@3.14.9 package and snapshot entries remain (plugin-grid declares it). Lockfile Integrity Check and Lockfile Dedupe Check: success. KNOWN_COLLISIONS: 3 → 2, shrink-only, plus a 2-line comment; the two kept sites still declare ConditionalFormattingRule (KanbanImpl.tsx:132, objectql.ts:412). index.tsx: the whole hunk sits inside the /** … */ block at 452–472; comment-only.
  • Pin kanbanEnhancedRetired-8932.test.ts: existsSync with the KanbanImpl.tsx control; specifier walk with a firing control (index.tsx for KanbanImpl) before the empty-list assertion; regex covers from/import(/require(/vi.mock/vi.doMock with a /-prefixed name. On base the file exists and both test references exist, so both legs go red for the right reason; green on head (CI test shards success). Follows chart-primitives-removed-7397.test.ts (existsSync + control) and the …Retired-NNNN naming (useColumnWidthsRetired-8522.test.ts in the same dir).
  • Pending changesets: frontmatter md5 base == head for both (8802… 9fa322a3796b, 6172-markdown… d39978474714). "At this change" scoping plus ⚠️ Dated note, 2026-09-25 — … — objectui#8932. matches the main exemplars (6235, 8973, 10392, 7742). Other pending entries naming the file (git grep -l at head): 6172-kanban-trio-rename (stale since finding(plugin-kanban,types): after batch #70 the view:kanban registry inputs still declares titleField while the zod arm refuses it — two published faces of one type key, opposite verdicts, and every pin stays green #8802, not this PR's; omitted from the PR's "read and left" list), 6939 (anchored at 78a3cc238), 9628 (past tense). Not falsified by this deletion; leaving them is right.
  • H3: CardTemplate consumed by CardTemplates.tsx:12/18/20; ColumnWidthConfig named by 5 non-test files (decl complex.ts:274, zod complex.zod.ts:153, re-exports types/index.ts:342, plugin-kanban/types.ts:43, plugin-kanban/index.tsx:197), 0 readers; both reachable through . (index.d.ts exports them). Reported correctly, neither deleted.

② Semver level

  • (a) ./style.css: the sheet has never been published (17.6.0: 0 CSS files, exports . only). No in-repo host loads it (git grep plugin-kanban/style.css at head: docs, README, src/index.css header only; build-css.mjs states in-repo hosts compile the source). The three classes occur at base only in KanbanEnhanced.tsx (lines 262, 267, 285, 296), 0 in the package at head; all six MUST_SURVIVE classes still come from KanbanImpl.tsx / index.css. Incidental Tailwind-scan artefact; patch covers. The changeset's "also loses three utility rules" is imprecise (the sheet first ships in this release and simply does not carry them) but not a surface change.
  • (b) dist/KanbanEnhanced.d.ts(.map): present in 17.6.0; reachable only by a deep path no published exports map ever listed, and no dist/KanbanEnhanced.js ever existed, so a node10 deep import reached typings with no runtime. patch with the file named, as the ruling prescribed. In 17.6.0 index.d.ts referenced ./KanbanEnhanced; that reference already left with feat(types,plugin-kanban,plugin-gantt)!: retire the bare kanban / gantt node keys and the kanban-ui / kanban-enhanced registrations #8865, and the index.tsx diff here is comment-only, consistent with "index.d.ts byte-identical".
  • (c) @tanstack/react-virtual: a dependencies removal with the only consumer deleted; not a declared-API move; patch. The changeset's phantom-dependency paragraph is the right notice (17.6.0's bundle imported it at top level).
  • Level: the reachable surface (kanban-enhanced key + inlined component) retires under the 8802-8257-8008 entry's '@object-ui/plugin-kanban': minor in this same release; on top of that this PR moves no supported specifier. Clause-②: no and patch stand.
  • Changeset prose, sentence by sentence: removed file named for deep importers: yes. KanbanCard/KanbanColumn still exported, ConditionalFormattingRule = KanbanConditionalFormattingRule, KanbanEnhancedProps gone, react-virtual sole consumer, subpath never resolvable, key retired under types: does 'kanban-enhanced' get a declared arm? — its registration reads onColumnToggle / enableVirtualScrolling / virtualScrollThreshold and no schema in @object-ui/types declares the type at all (split from #7742) #8257: all true. ⛔ FALSE: "They were the only part of it this package ever shipped" and "The KanbanEnhanced component itself was never in dist/index.js or dist/index.umd.cjs, because nothing the entry point imports reached it" (evidence in ①). The PR body's H1 "The component was never in the bundle" repeats it. A pending entry publishes verbatim into the CHANGELOG beside the 8802 entry that retires that very key: self-contradicting release notes, and the same defect class (a false reachability claim in a changeset) that earned PR feat(types,plugin-kanban,plugin-gantt)!: retire the bare kanban / gantt node keys and the kanban-ui / kanban-enhanced registrations #8865 its F4 REWORK.

③ Boundary flags

  • CI on a843148be: second read, 45 check runs: 42 success, 3 skipped (coverage jobs, dependabot), 0 failed, 0 in progress. Build & E2E, Test (dist pins), Changeset Declaration / Bump Policy / Fixed Group / Claim Re-read / Overwrite Report, README Export Check, Lockfile Integrity, Lockfile Dedupe: success. No red check.
  • git merge-tree --write-tree refs/review/main(47ba7903d) refs/review/pr-10588: exit 0, tree 9cb0aaab, no conflicts; 8 main commits since base, none touching a PR file.
  • PR chore(deps): lucide-react 1.31.0 -> 1.43.0, with the one retired spelling repaired #8941 (draft, head 6f20cfb06, 41 files, last updated 2026-09-20): its plugin-kanban/package.json hunk changes only the lucide-react line, with the @tanstack/react-virtual line as context; pnpm-lock.yaml +57/−57 in the same importer block. Adjacent-line edits: textual 3-way conflict for whichever lands second, cleared by a re-pnpm install. Semantically independent (different dependency). Merge-time only.
  • @object-ui/types JSDoc: npm pack @object-ui/types@latest (17.6.0) dist/ has 0 KanbanEnhanced hits, so the passages are pending, not already published; JSDoc IS emitted into the typings (13 objectui# markers in 17.6.0 complex.d.ts), so they ship in the same release as this deletion. Present-tense and made false by the deletion (true of the base tree, where the module existed and read those members): complex.ts:60 "what KanbanImpl / KanbanEnhanced read back", complex.ts:132 "every board reads … KanbanImpl (12 lines), KanbanEnhanced (8) … all read column.cards", objectql.ts:3728 "what KanbanImpl / KanbanEnhanced consume", objectql.ts:3751 "the two board implementations read, counted off KanbanImpl, KanbanEnhanced". Past-tense readings at complex.ts:161-162, :171 and objectql.ts:3994 stay true. Not already false at base; under the seat standard these four are owed in this PR (comment-only edit plus an @object-ui/types patch changeset), or a maintainer waiver on the card. The claim's file surface was already extended for five forced files; extending it for this is the same act.
  • content/ docs and packages/plugin-kanban/README.md name neither KanbanEnhanced nor kanban-enhanced; troubleshooting.md:294 virtualScroll is a grid option. No other published text moves.
  • Should stop landing: the two false changeset sentences (②) and the owed @object-ui/types JSDoc correction (above). Everything else in ①–③ holds.

Implemented-by: claude/issue-8932-retire-kanban-enhanced
Reviewed-by: session_014mXUNuFomfj24w7s1pZzhN

VERDICT: FAIL — (1) rewrite .changeset/8932-retire-kanban-enhanced.md (and the PR body H1) so it no longer says the component was never in dist/index.js / dist/index.umd.cjs or that the typings were all that ever shipped: through 17.6.0 the component shipped inlined behind the kanban-enhanced key and left the bundle with objectui#8257/#8802 in this release; what this change removes is the source file, dist/KanbanEnhanced.d.ts(.map) and the orphaned dependency. (2) Correct the four present-tense @object-ui/types JSDoc passages (complex.ts:60, :132; objectql.ts:3728, :3751) with an @object-ui/types patch changeset, or record a maintainer waiver on objectui#8932. Semver patch / Clause-②: no, the deletion, the test rewrites, the pin, the lockfile edit, the ratchet edit and the two reconciled changesets are all correct as they stand.


Generated by Claude Code

…no longer names KanbanEnhanced as a reader

Contract review of a843148 (PR comment 5831016914):

- The changeset said the component was never in dist/index.js or the UMD
  bundle. Published 17.6.0 inlines it behind the kanban-enhanced key and
  exports `.` only. The entry now says the component left the bundle with
  the objectui#8257 / objectui#8802 key retirement, lists what this change
  removes (the source file, dist/KanbanEnhanced.d.ts(.map), the orphaned
  react-virtual dependency), and says style.css first ships in this release
  without the three rules. The index.tsx tombstone carried the same false
  clause and is corrected the same way.
- Four present-tense JSDoc passages in @object-ui/types (KanbanCard,
  KanbanColumn.cards, ObjectKanbanSchema.columns twice) named KanbanEnhanced
  as a live reader; KanbanImpl is now the one board, and the past counts are
  dated. Comment-only, with an @object-ui/types patch changeset.

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

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

Metric Value Budget
Eager closure (gzip, 329 chunks) 3047.3 KB 3104.5 KB
Main entry chunk (gzip) 147.9 KB 350 KB
Entry file index-BXiHI3D8.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.68KB 6.20KB
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.18KB 10.59KB
auth (AuthShell.js) 3.49KB 1.40KB
auth (ForgotPasswordForm.js) 12.21KB 3.45KB
auth (LoginForm.js) 18.15KB 5.39KB
auth (PreviewBanner.js) 0.90KB 0.50KB
auth (RegisterForm.js) 6.65KB 2.22KB
auth (SocialSignInButtons.js) 9.61KB 3.89KB
auth (UserMenu.js) 3.41KB 1.23KB
auth (auth-gate-events.js) 1.29KB 0.66KB
auth (authStyles.js) 5.04KB 1.72KB
auth (createAuthClient.js) 40.21KB 10.80KB
auth (createAuthenticatedFetch.js) 8.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) 546.32KB 130.64KB
core (index.js) 9.22KB 3.71KB
create-plugin (index.js) 27.94KB 9.51KB
data-objectstack (index.js) 223.91KB 62.28KB
fields (index.js) 258.79KB 65.62KB
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.40KB 14.61KB
plugin-charts (index.js) 74.94KB 20.89KB
plugin-chatbot (index.js) 198.36KB 47.20KB
plugin-dashboard (index.js) 133.50KB 35.37KB
plugin-designer (index.js) 216.25KB 44.39KB
plugin-detail (index.js) 232.59KB 61.50KB
plugin-editor (index.js) 2.23KB 1.05KB
plugin-form (index.js) 147.92KB 37.83KB
plugin-gantt (index.js) 169.62KB 41.91KB
plugin-grid (index.js) 215.37KB 58.92KB
plugin-kanban (index.js) 48.26KB 15.04KB
plugin-list (index.js) 114.43KB 28.26KB
plugin-map (index.js) 22.42KB 7.38KB
plugin-markdown (index.js) 13.88KB 4.80KB
plugin-report (index.js) 43.55KB 11.99KB
plugin-timeline (index.js) 30.64KB 8.94KB
plugin-tree (index.js) 10.52KB 3.69KB
plugin-view (index.js) 87.31KB 21.78KB
providers (DataSourceProvider.js) 0.75KB 0.39KB
providers (MetadataProvider.js) 1.37KB 0.59KB
providers (ThemeProvider.js) 1.90KB 0.85KB
providers (UploadProvider.js) 11.66KB 3.50KB
providers (index.js) 0.45KB 0.23KB
providers (types.js) 0.01KB 0.04KB
react-runtime (index.js) 5.62KB 2.34KB
react (LazyPluginLoader.js) 4.47KB 1.63KB
react (SchemaRenderer.js) 114.58KB 37.60KB
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) 0.20KB 0.18KB
types (plugin-scope.js) 0.20KB 0.18KB
types (record-components.js) 0.20KB 0.19KB
types (record-semantics.js) 1.28KB 0.67KB
types (registry.js) 0.20KB 0.18KB
types (reports.js) 0.20KB 0.18KB
types (select-option.js) 0.20KB 0.19KB
types (spec-report.js) 5.05KB 1.93KB
types (spec-ui-namespace.js) 0.20KB 0.19KB
types (strict-authoring-face.js) 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

…o its own change

check-changeset-claims asked for this paragraph to be re-read because the
branch now edits objectql.ts. The pending objectui#8913 entry says, in the
present tense, that the lane members are exactly what "the two board
implementations read". With KanbanEnhanced deleted, that is no longer true of
what ships. The sentence is now scoped to "at this change", with a dated note
in the objectui#10540 form. The frontmatter is byte-identical.

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

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

Metric Value Budget
Eager closure (gzip, 329 chunks) 3047.3 KB 3104.5 KB
Main entry chunk (gzip) 147.9 KB 350 KB
Entry file index-BXiHI3D8.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.68KB 6.20KB
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.18KB 10.59KB
auth (AuthShell.js) 3.49KB 1.40KB
auth (ForgotPasswordForm.js) 12.21KB 3.45KB
auth (LoginForm.js) 18.15KB 5.39KB
auth (PreviewBanner.js) 0.90KB 0.50KB
auth (RegisterForm.js) 6.65KB 2.22KB
auth (SocialSignInButtons.js) 9.61KB 3.89KB
auth (UserMenu.js) 3.41KB 1.23KB
auth (auth-gate-events.js) 1.29KB 0.66KB
auth (authStyles.js) 5.04KB 1.72KB
auth (createAuthClient.js) 40.21KB 10.80KB
auth (createAuthenticatedFetch.js) 8.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) 546.32KB 130.64KB
core (index.js) 9.22KB 3.71KB
create-plugin (index.js) 27.94KB 9.51KB
data-objectstack (index.js) 223.91KB 62.28KB
fields (index.js) 258.79KB 65.62KB
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.40KB 14.61KB
plugin-charts (index.js) 74.94KB 20.89KB
plugin-chatbot (index.js) 198.36KB 47.20KB
plugin-dashboard (index.js) 133.50KB 35.37KB
plugin-designer (index.js) 216.25KB 44.39KB
plugin-detail (index.js) 232.59KB 61.50KB
plugin-editor (index.js) 2.23KB 1.05KB
plugin-form (index.js) 147.92KB 37.83KB
plugin-gantt (index.js) 169.62KB 41.91KB
plugin-grid (index.js) 215.37KB 58.92KB
plugin-kanban (index.js) 48.26KB 15.04KB
plugin-list (index.js) 114.43KB 28.26KB
plugin-map (index.js) 22.42KB 7.38KB
plugin-markdown (index.js) 13.88KB 4.80KB
plugin-report (index.js) 43.55KB 11.99KB
plugin-timeline (index.js) 30.64KB 8.94KB
plugin-tree (index.js) 10.52KB 3.69KB
plugin-view (index.js) 87.31KB 21.78KB
providers (DataSourceProvider.js) 0.75KB 0.39KB
providers (MetadataProvider.js) 1.37KB 0.59KB
providers (ThemeProvider.js) 1.90KB 0.85KB
providers (UploadProvider.js) 11.66KB 3.50KB
providers (index.js) 0.45KB 0.23KB
providers (types.js) 0.01KB 0.04KB
react-runtime (index.js) 5.62KB 2.34KB
react (LazyPluginLoader.js) 4.47KB 1.63KB
react (SchemaRenderer.js) 114.58KB 37.60KB
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) 0.20KB 0.18KB
types (plugin-scope.js) 0.20KB 0.18KB
types (record-components.js) 0.20KB 0.19KB
types (record-semantics.js) 1.28KB 0.67KB
types (registry.js) 0.20KB 0.18KB
types (reports.js) 0.20KB 0.18KB
types (select-option.js) 0.20KB 0.19KB
types (spec-report.js) 5.05KB 1.93KB
types (spec-ui-namespace.js) 0.20KB 0.19KB
types (strict-authoring-face.js) 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: 313ca6321590325182ae727320564fff3b772828

① Derived judgments

  • Refs. git rev-parse refs/review/pr-10588 = 313ca6321… (matches). Merge-base with main = d22b37bd8. Rework delta a843148be..head = 6 files (8913-…, new 8932-kanban-enhanced-types-jsdoc.md, 8932-retire-kanban-enhanced.md, index.tsx +5/−4, complex.ts +6/−4, objectql.ts +8/−4). Checkout untouched (refs only).
  • 17.6.0 re-measured (npm pack @object-ui/plugin-kanban@17.6.0, 30 files): dist/index.js:14 imports @tanstack/react-virtual; :1414 function ct({ columns, onCardMove, onColumnToggle, enableVirtualScrolling: i = !1, virtualScrollThreshold: a = 50, … (the component, inlined); :1226 KanbanEnhanced: () => ct in chunk namespace nt; :1521 mt = t.lazy(() => … nt); :1630–1634 ht = { kanban: $, "kanban-enhanced": mt, "object-kanban": Pe }; :1635 s.register("kanban-enhanced", …); :1761 export list carries ht as kanbanComponents and no KanbanEnhanced by name. UMD: KanbanEnhanced ×1, kanban-enhanced ×2. index.d.ts:80 'kanban-enhanced': React.LazyExoticComponent OF typeof import('./KanbanEnhanced').KanbanEnhanced. exports = . only. CSS files: 0. dist/KanbanEnhanced.d.ts(.map) present, no dist/KanbanEnhanced.js. KanbanRenderer ($) renders pt = lazy of the KanbanImpl chunk (qe, :792), so KanbanImpl is the sole board behind every surviving entry.
  • FAIL item 1, fixed. .changeset/8932-retire-kanban-enhanced.md at head, sentence by sentence: "Through 17.6.0 … shipped inlined in dist/index.js and dist/index.umd.cjs, reachable through the kanban-enhanced registry key and the kanbanComponents map": true (above). "Leaves the bundle … with that key (objectui#8257 / finding(plugin-kanban,types): after batch #70 the view:kanban registry inputs still declares titleField while the zod arm refuses it — two published faces of one type key, opposite verdicts, and every pin stays green #8802)": true, the pending 8802-8257-8008 entry. "Only two test files still referred": true (round-1 count 2). Removes source, dist/KanbanEnhanced.d.ts(.map), @tanstack/react-virtual (base: package.json + KanbanEnhanced.tsx:10 only; head: 0 hits): true. "Neither the 17.6.0 exports map (. only) nor this release's (. and ./style.css) has a ./KanbanEnhanced entry": true (tarball; head package.json keys ['.', './style.css']). "Neither entry point exports the component by name": true (17.6.0 :1761; head index.tsx has 0 import/export lines naming it, exit 1). Typings had no .js beside them: true. KanbanCard/KanbanColumn "which the module re-exported" (base KanbanEnhanced.tsx:42 export type { KanbanCard, KanbanColumn } from './types') still exported (head index.tsx:197): true. Alias = KanbanConditionalFormattingRule (base :46): true. object-kanban is the one registered board (head kanbanComponents = { 'object-kanban': ObjectKanban }): true. style.css first ships via 4929-plugin-published-stylesheets.md (plugin-kanban: patch, ./style.css → dist/index.css); the three classes at base only in KanbanEnhanced.tsx (lines 262/267/285/296), 0 in the package at head: true. index.tsx tombstone: git diff -w base..head shows 0 changed lines not starting with *; the "only part … ever published, since the bundle never contained it" clause is gone, replaced by "Through 17.6.0 the component itself was also bundled into dist/index.js, behind the kanban-enhanced key". PR body: H1 now reads "confirmed for the source tree", with an explicit correction of the round-1 error; "Where the component was" matches the tarball point for point. "Never" sweep over added lines of the full diff: 3 hits, all the index.tsx specifier sentence (exports map / barrel / "never a resolvable specifier"), all true; PR body: 0 residual never-shipped/never-bundled claims.
  • FAIL item 2, fixed. git diff -w base..head -- complex.ts objectql.ts: 4 hunks (@@ -57, @@ -128, @@ -3725, @@ -3747), every changed line begins with *, 0 non-JSDoc lines. complex.ts:60 → "what KanbanImpl reads back (the one board since objectui#8932 deleted KanbanEnhanced)"; :132 → count kept and anchored: "measured at objectui#6939: 12 lines in KanbanImpl, and 8 in KanbanEnhanced until objectui#8932 deleted it"; objectql.ts:3728 → "what KanbanImpl consumes (the one board since objectui#8932 …)"; :3751 → "counted when there were two board implementations off … objectui#8932 later deleted KanbanEnhanced; KanbanImpl alone still reads all six members". Neither past count deleted; each names objectui#8932. The past-tense passages at complex.ts:163–164, :173 and objectql.ts:3996 are outside every hunk and byte-unchanged. "All six members" re-measured on head KanbanImpl.tsx: column.id (:534), column.title (:422), col.cards (:757), column.limit (:540), column.className (:568), col.collapsed (:742). New 8932-kanban-enhanced-types-jsdoc.md ('@object-ui/types': patch): "no longer names KanbanEnhanced as a board that reads" (present-tense readers now KanbanImpl only), "one kanban board since objectui#8932 deleted that module" (true as source-level implementation; the surviving entries all render KanbanImpl), "only comments change; no type moves" (-w evidence, Type Check success): true. Observation, not a defect: "the older counts … now carry a date" — they carry issue anchors (objectui#6939 / objectui#8932), not a calendar date; that is this repo's JSDoc idiom.
  • 8913 reconciliation. At base the entry said "before either board implementation sees one" and "exactly the members the two board implementations read" — present tense, two boards; the module still existed and read those members at base, so the deletion falsifies it. Head: both sentences scoped "at this change", plus ⚠️ Dated note, 2026-09-25 — one board implementation remains — objectui#8932. in the 10533/10540 form; frontmatter md5 base == head ecedb10c5189… ('@object-ui/types': minor). 8802… 9fa322a3796b… and 6172-markdown… d39978474714… also unchanged base == head.
  • Other pending entries. git grep -n -i "kanbanenhanced\|two board\|both board\|either board" refs/review/pr-10588 -- .changeset: 6939 (measurement anchored "on origin/main 78a3cc238"), 9628 (past tense, "was declared … and read by"), issue-9586 ("either board" = the two repos' deny arrays, not kanban), 8802 / 6172-markdown (already reconciled), 6172-kanban-trio-rename (kanban-enhanced key, stale since types: does 'kanban-enhanced' get a declared arm? — its registration reads onColumnToggle / enableVirtualScrolling / virtualScrollThreshold and no schema in @object-ui/types declares the type at all (split from #7742) #8257, not this PR's). No further entry is falsified by this deletion.
  • Nothing regressed. git diff --stat a843148be..head over the 9 round-1 PASS files (deletion, both test rewrites, pin, package.json, pnpm-lock.yaml, ratchet, 8802 and 6172-markdown reconciliations): empty. KanbanEnhanced.tsx absent at head (git cat-file -e exit 128). The index.tsx tombstone is a detached comment block between kanbanComponents (:427–429) and the next /** … */ docblock, so it is not emitted into dist/index.d.ts (17.6.0's index.d.ts:78 carries no preceding doc), consistent with the body's byte-identical claim surviving the rework.

② Semver level

  • plugin-kanban: patch — unchanged from round 1 and still right; the reachable surface (kanban-enhanced key + inlined component) retires under 8802-8257-8008's plugin-kanban: minor in this same release; this PR moves no supported specifier (exports ././style.css, no by-name export before or after).
  • types: patch — JSDoc-only edits emitted into typings; git diff -w shows 0 non-comment lines; no accept set or type moves. Changeset Declaration / Bump Policy / Fixed Group Check: success ("2 released package(s) … 2 changeset(s)").
  • Clause-②: no holds for both entries.

③ Boundary flags

Implemented-by: claude/issue-8932-retire-kanban-enhanced
Reviewed-by: session_014mXUNuFomfj24w7s1pZzhN

VERDICT: PASS


Generated by Claude Code

@objectstack-fleet
objectstack-fleet Bot marked this pull request as ready for review September 25, 2026 11:13
@objectstack-fleet
objectstack-fleet Bot added this pull request to the merge queue Sep 25, 2026
Merged via the queue into main with commit 58b7b3d Sep 25, 2026
47 checks passed
@objectstack-fleet
objectstack-fleet Bot deleted the claude/issue-8932-retire-kanban-enhanced branch September 25, 2026 11:25
akarma-synetal pushed a commit to akarma-synetal/objectui that referenced this pull request Sep 28, 2026
…te` for the verdict (objectui#10524) (objectstack-ai#10595)

Fixes objectstack-ai#10524
Clause-②: no

Wording only, on published text: a help string in `@object-ui/cli` and
six comments in five `@object-ui/types` files. No export, type, schema
or accept set moves. `check` itself is unchanged: objectui#6318 recorded
its behaviour as deliberate, and whether it should parse the files it
admits is that card's open question, not this one.

The house wording is the one PR objectui#10523 used for the two docs
pages: `check` sweeps a project's JSON files and recognises a file whose
root carries a structural key (`children`, `className`, `body`, …) by
that key alone, without parsing it against the schema (it is still read
as JSON). Only a file with none of those keys is parsed against the
schema. It is listed by name when its root `type` names a registered
component but the document does not validate, and that list is advisory:
`check` exits non-zero on unreadable JSON only. The verdict is `objectui
validate`'s.

## What changed

| file | change |
| --- | --- |
| `packages/cli/src/cli.ts` | H1. The `check` command's description
changes from "Validate schema files" to "Advisory JSON file sweep; run
objectui validate for a verdict" (61 characters; the longest sibling
description has 57). The line count does not change. |
| `packages/types/src/complex.ts` | H2. In the `ChatbotSchema.body`
tombstone docblock, the root-parse parenthetical now names only
`objectui validate`. A new sentence says `check` does not deliver the
refusal: `body` is a structural root key, and `check` never parses a
file it recognised that way against the schema. One line changed and
three added. `body?: never` and every other line are byte-identical. |
| `packages/types/src/layout.ts` | H3 hit. The `SemanticElementSchema`
docblock said the document "was refused by `objectui check`". It now
says `objectui validate`, whose refusal it was. One word changed. |
| `packages/types/src/zod/layout.zod.ts` | H3 hit. The same sentence in
the zod mirror's docblock ("REFUSED by `objectui check` … stop trusting
the validator") now names `objectui validate`. One word changed. |
| `packages/cli/src/__tests__/cli-bin.test.ts` | H5 pin, 2 cases. `check
--help` must not lead with the verb "validate", and it must name
`objectui validate`. Both are red on the base and green at the head
(evidence below). |
| `packages/types/src/zod/objectql.zod.ts` | Rework-round hits (contract
review, comment 5831281522). The `ObjectGanttSchema.gantt` comment
("reaches the CLI's `validate`/`check` … refused at authoring time") and
the `ObjectCalendarSchema` `sort` comment ("reaches the CLI's `validate`
/ `check` — `sort: 'name asc'` …") now name `validate` alone. These are
`//` comments, and they ship in `dist/zod/objectql.zod.js`. Two lines
changed; `git diff -w` shows no code line. |
| `packages/types/src/objectql.ts` | Rework-round hit, the source twin
of `.changeset/6475`. The `ObjectGanttSchema.gantt` comment ("therefore
the CLI's `validate` / `check` commands") now reads "the CLI's
`validate` command". One comment line changed, and it is source-only (a
`//` comment on an interface member is dropped from `.d.ts`). The seat
decided to fix it here; this seat's other PRs edit this file far from
this line. |
| `.changeset/10524-check-promise-text.md` | new: `'@object-ui/cli':
patch`, `'@object-ui/types': patch`. The rework rounds tightened it:
`check` skips the parse against the schema, not the JSON parse; it names
the three objectql comments; and its headline counts six comment sites.
|
| 11 pending `.changeset/*.md` | H4 reconciliations, listed below. Front
matter md5 is identical before and after for every file. |

## Measurement on the base `6ea68e63e`

The CLI's dependency closure was built with `pnpm
--workspace-concurrency=2 --filter "@object-ui/cli..." build`.

`objectui --help` listed `check Validate schema files`, and `objectui
check --help` printed `Validate schema files`.

Probe documents, one directory each:

| document | `objectui validate` | `objectui check` over its directory |
| --- | --- | --- |
| `{ "type": "chatbot", "messages": [], "body": { "tenant": "acme" } }`
| exit 1: `REFUSED (objectui#8572, ADR-0049)`, `Path: body` | exit 0.
The file is not mentioned, and the run ends with `✓ All checks passed`.
|
| `{ "type": "chatbot", "messages": "not-an-array" }` (control, no
structural key) | exit 1 | exit 0. The file is listed as `carries a
registered ObjectUI component type but did not validate`. |

So the card's premise holds at the base. `check` admits
`chatbot-body.json` by its `body` key and never parses it against the
schema. In `check`'s own output, `objectui validate FILE` stands for the
angle-bracket placeholder the CLI prints, because GitHub's body
sanitizer deletes that shape.

## H5: the pin is red on the base and green at the head

I committed the fix first (`dbbd2506e`). For the base leg,
`scripts/ablation-replace.mjs` (from the objectstack checkout, in wrap
mode, with a `trap … EXIT INT TERM` restore as a second guard) put the
base description back into `cli.ts`. It reported anchor `x1 -> x0`,
replacement `x0 -> x1` and blob `3b73365ae916 -> 165ca5b`. Then the
leg rebuilt `@object-ui/cli` and grepped `dist/cli.js`: new text 0 hits,
base text 1 hit.

- Base leg: `Tests 2 failed | 38 passed (40)`. The failures were
`expected 'Validate schema files' not to match /^\s*validates?\b/i` and
`expected 'Validate schema files' to contain 'objectui validate'`.
- Restore: the blob equals HEAD's `3b73365ae916` and `git diff HEAD` is
empty. After a rebuild, `dist/cli.js` has 1 hit for the new text and 0
for the base text.
- Head leg: `Test Files 1 passed (1)`, `Tests 40 passed (40)`, and both
`check --help does not present ... (objectui#10524)` cases pass. `git
status --porcelain` shows 0 lines.

The JSDoc edits carry no pin. They are comments, and I checked them in
the built output instead: `dist/complex.d.ts` has 1 hit for "`objectui
check` does not deliver it", `dist/layout.d.ts` has 1 for "refused by
`objectui validate`", `dist/zod/layout.zod.d.ts` has 1 for "REFUSED by
`objectui validate`", and the two layout files have 0 remaining hits for
`objectui check`. After the rework round, `dist/zod/objectql.zod.js` has
0 hits for `validate` / `check` in either spelling. Its positive
control, "reaches the CLI's `validate` — `sort: 'name asc'`", has 1 hit.

## H4: pending changesets that name `check`

I read every paragraph in `.changeset/` that names `check`: the literal
"objectui check", plus `check` in backticks and mentions wrapped across
a line break. The test I applied: does the sentence tell an author that
`check` gives a verdict (refuses, fails, delivers the refusal)? A
sentence that only says `check` calls `safeValidateSchema` or answers
green is true, so it stands.

**Reconciled (11).** Each file now names `objectui validate` for the
verdict and gains a `⚠️ **Dated note, 2026-09-25 — … —
objectui#10524.**` saying what `check` does. Round 3 tightened every
note: `check` "never parses against the schema" a file whose root
carries a structural key, because it still reads that file as JSON and
fails the run when the JSON is unreadable. Front matter is
byte-identical in all 12 changesets this PR touches:

- `10478-filter-condition-value-protocol-rule.md`: "now fails
`safeValidateSchema`, `objectui check` and `objectui validate`". Its
"answered green" sentence stays true of `check`, and the note says so.
- `6475-gantt-block-face-declared.md`: the heading's "validate/check
time" and "the CLI's `validate` and `check` commands … **refused**,
naming the missing field".
- `7694-chart-series-chart-type-alias-refusal.md`: "Authors meet it …
through the CLI's `objectui check` and `objectui validate` commands".
Because this file was touched anyway, its five cross-file `path:line`
citations became file names (AGENTS.md objectstack-ai#11). The "Before" bullet stands.
- `8466-calendar-color-allday-fields.md`: "refused … through
`safeValidateSchema`, the path the CLI's `validate` / `check` take".
- `8499-node-slot-registered-arms.md`: "renders correctly in the browser
and is refused by `objectui check`". Its "Downstream" paragraph is about
the advisory list and stands.
- `8505-grid-columns-breakpoint-narrowing.md`: "the JSON authoring face
— `os-ui validate` / `check` … now refuses `{ xxl: 6 }`". The command's
name is also corrected to `objectui validate` in the same clause.
- `8572-chatbot-body-retired.md`: "(`tsc`, `objectui validate`,
`objectui check`, …)". This is the changeset twin of the H2 docblock.
- `9239-object-calendar-data-array-arm.md`: "reached by
`safeValidateSchema` and so by the CLI's `validate` / `check` … refused
AT the key".
- `9511-record-id-is-a-string.md`: its "Delivery surface" paragraph
listed `objectui check` on the parse-time side.
- `9559-filter-operator-schema-protocol-set.md`: "(and `objectui check`
/ `objectui validate`) refused filters".
- `9746-render-path-not-a-validation-door.md` (empty front matter): "the
three doors that do validate (…; `objectui validate` / `objectui check`;
…)". Here the objectui#10533 "at this change" scoping is used, because
the section did say that at that change. The note records the later
correction by objectui#10416.

A deviation from H4 as dispatched: for the other ten I did not use "at
this change" scoping. Those sentences were never true of `check`, so
scoping them would assert a false history. The sentence is corrected
instead, and the dated note records the correction.

**Read, and left as they are.** Each of these is either true of `check`
or is not a verdict claim:

- `6074`: "judges, skips and prints exactly what it did before".
- `6075`: recognition by validation, and the advisory report.
- `6320`: the glob ignore list.
- `7004`: `.success` used as a boolean recogniser.
- `7113` ("the `chart: 2` entry in `objectui check`'s 28-file census")
and `6939` ("`objectui check` counts four for this row"): both are
counts of the advisory list. In the filter-builder case, the four leaf
fixtures carry no structural key and `search-interface.json` carries
`children` and `className`, so the count is right.
- `6051`, `7664`, `8344`: `check` calls `safeValidateSchema`. That is
true of the validity arm, and none of these three attributes a refusal
to `check`.
- `8516`: `check` "was passing documents `tsc` rejects", which is true.
- `8802` ("will NOT flag either namespaced spelling"), `9641` and
`unknown-component-type-case-suggestion-5247`: they describe the
unknown-type warning for recognised files.
- `check-schema-positive-marker-and-skip-count`: the marker gate.
- `6724`: `ctx.check` is the permissions API, not the CLI.
- `10393`, `8760`, `9533`: these describe the unknown-type warning, not
a validation verdict, so H4 does not cover them. Their bare-document
examples are the finding below.

## Other places that make the same promise (H3), swept again in the
rework round

The first sweep of package sources used only the literal `objectui
check`, so it missed three sentences written as the CLI's
`validate`/`check`. The rework sweep ran over `packages/cli` and
`packages/types` sources, excluding tests and CHANGELOGs, with three
passes:

1. `git grep` for the literal `objectui check`, backticked `check`, `/
check`, `check command(s)` and `'check'`.
2. `git grep` for `check` within 40 characters of `validate`, `CLI` or
`refus`.
3. A node scan across line breaks, for `validate` / `check` pairs
wrapped over a comment line, and `CLI's … check`.

On the head, pass 3 has 0 hits. Its positive control is the pre-fix
blobs of `objectql.zod.ts` and `objectql.ts`, which give 2 and 1 hits.
Every hit I read, with its verdict:

| hit | verdict |
| --- | --- |
| `zod/objectql.zod.ts`, the `ObjectGanttSchema.gantt` comment
("`validate`/`check` … refused at authoring time") | changed: names
`validate` alone |
| `zod/objectql.zod.ts`, the `ObjectCalendarSchema` `sort` comment
("`validate` / `check` — `sort: 'name asc'` … refused at authoring
time") | changed: names `validate` alone |
| `objectql.ts`, the `ObjectGanttSchema.gantt` comment ("the CLI's
`validate` / `check` commands … refused at authoring time") | changed:
names `validate` alone |
| `complex.ts`, the `ChatbotSchema.body` docblock | this PR's own
sentence ("`objectui check` does not deliver it") |
| `layout.ts` and `zod/layout.zod.ts`, the `SemanticElementSchema`
docblocks | changed in round 1 |
| `data-display.ts` `BarChartSchema` ("`objectui check` reports it as
unrecognised") and `zod/data-display.zod.ts` ("could only report it") |
stands: describes the advisory list, not a verdict |
| `form.ts` `CodeEditorSchema` ("the validator `objectui validate` and
`objectui check` read") | stands: `check` reads `AnyComponentSchema` as
its recogniser |
| `strict-authoring-face.ts` (wiring `objectui check` "is ruled to come
after") | stands: future wiring, no present claim |
| `zod/complex.zod.ts` (`safeValidateSchema`, `objectui check` and
`objectui validate` "answered green") | stands: true of `check`; the
file is held by another seat and not touched |
| `packages/cli/README.md`, the heading "`objectui check`, `objectui
doctor`, …" | stands: defers to `objectui --help` |
| `packages/cli/src/cli.ts`, `.command('check')` | the command
registration; its description is the H1 line |
| `check.ts`: "`objectui check` judged every root `type`", "the reason
`check` reports a third bucket", "the `objectui check` command passes",
"`objectui check` exited 1 in any TypeScript project" | stand: the
marker gate's history, the advisory bucket, the `cwd` parameter, and the
JSONC parse arm, all true |
| `known-schema-types.ts` ("`objectui check` uses it", "reports an
unrecognised type as a warning and never fails the run") | stands: true
|
| `known-type-case-suggestion.ts` ("Did you mean for `objectui check`",
"`check` still reports `Page` as an unknown schema type", "the
suggestion clause `objectui check` appends") | stands for this card: the
unknown-type warning, not a validation verdict. It has the same
recognised-files-only boundary as the finding below. It is an internal
comment. |
| `union-arm-diagnostics.ts` ("a DIFFERENT surface (`objectui check`)")
| stands: names the surface |
| `index.ts` `name:'check'`, `layout.ts` "`check`, `arrow-right`",
`zod/layout.zod.ts` `icon:'check'` (four lines) | not the CLI: the
lucide glyph name |
| `data-protocol.ts` "PRE-CHECK", `strict-authoring-face.ts` "such a
check can only ADD refusals", `zod/complex.zod.ts` "the type check (`id:
42` now refuses)", `zod/objectql.zod.ts` "`.check()` refusing
`kanban.groupBy`" and "Until this check" | not the CLI: refinements and
value checks |

## Gates

### Round 3, head `882c5e13e` (changeset text only)

`git diff --stat 1da91cb..882c5e1` lists 12 `.changeset/*.md` files,
12 insertions and 12 deletions, and nothing else. Front matter md5 is
identical before and after for all 12. `git merge-tree --write-tree HEAD
origin/main` (main at `ab7751321`) exits 0 with tree `dab078939`. None
of main's moved files is a file this PR touches.

| gate | verdict line | exit |
| --- | --- | --- |
| `node scripts/check-changeset-presence.mjs` | `✅ 7 source file(s) of 2
released package(s) changed, and this change declares 1 changeset(s):
.changeset/10524-check-promise-text.md.` | 0 |
| `node scripts/check-changeset-overwrite.mjs` (report-only) | `⚠️ This
change touches 11 changeset(s) it did not add`, with all 11
declared-at-base / declares-now pairs identical | 0 |
| `node scripts/check-changeset-fixed.mjs` | `✅ All workspace packages
are in the changeset fixed group.` | 0 |
| `node scripts/check-changeset-claims.mjs` (report-only) | `✅ Every
package declared across those 11 body(ies) is either not negated …`. It
lists 43 pending changesets naming a touched file; none is about
`check`, the gantt block refusal or the calendar `sort` clause. | 0 |
| `node scripts/check-new-cross-file-line-citations.mjs` | `VERDICT
new-cross-file-line-citations: 0 new citation(s), enforcement
report-only -> exit 0` | 0 |
| `node scripts/check-control-bytes.mjs` | `✅ check-control-bytes: OK
(scanned 8669 tracked text file(s); skipped 85 binary).` | 0 |

### Package gates, head `1da91cb5e` (no package file has changed since)

| gate | verdict line | exit |
| --- | --- | --- |
| `pnpm --filter "@object-ui/cli..." build` (closure, under the verify
lock) | `dist/cli.js` has 1 hit for the new text and 0 for the base text
| 0 |
| `pnpm --filter @object-ui/types type-check` (`tsc --noEmit && tsc -p
tsconfig.examples.json && tsc -p tsconfig.test.json`) | no diagnostics |
0 |
| `pnpm --filter @object-ui/cli type-check` (`tsc --noEmit`) | no
diagnostics | 0 |
| `pnpm exec vitest run packages/types/` | `Test Files 236 passed (236)`
· `Tests 5223 passed (5223)` | 0 |
| `pnpm exec vitest run packages/cli/` | `Test Files 20 passed (20)` ·
`Tests 279 passed (279)` | 0 |
| `node scripts/check-changeset-no-major.mjs` | `✅ No changeset declares
a `major` bump.` | 0 |

At that head, `git merge-tree` exited 0 against main (`a7df45ff1`),
against PR objectstack-ai#10588's head `313ca6321`, and against
`claude/issue-10518-object-chart-axis-config`.

Round-1 readings that the rework does not move stand at `bf809e6c5`: the
red-then-green pin (`cli.ts` and `cli-bin.test.ts` are unchanged since
then), the lint subset, `pnpm check`, the installed-pin and
pending-literal gates, the disk-reading tests, and the governed-surface
guard.

## Acceptance notes

These are not filed.

- Some test comments still say `check` refuses or validates: the header
of `node-slot-registered-arms-8499.test.ts`, one comment in
`filter-builder-mirror-6939.test.ts`, and the headers of
`filter-condition-value-protocol-rule-10478.test.ts` and
`chart-data-model-7113.test.ts`. Tests are not published, and no
assertion depends on those comments.
- `7546-chart-series-keys-declared.md` counts `objectui check` among the
consumers of the parse output. `check` reads only `.success`, so it
loses nothing. That sentence does not claim a verdict.
- `7773-kanban-adapter-groupfield-write.md` names `os check` / `os
validate`, which is not this CLI. It was not measured.
- `8516-8556-mirror-partial-record-narrowing.md` spells the CLI as
`os-ui validate`, and the bin is `objectui`. Its `check` clause is true.
- In `check.ts`, the inline comment "Schema validation: check for
ObjectUI schema patterns" is a code comment that ships in no user-facing
output. It is outside this file surface.

## For the seat

- File surface: `layout.ts`, `zod/layout.zod.ts`, `objectql.ts` and
`zod/objectql.zod.ts` are H3 hits inside `@object-ui/types`.
`objectql.ts` is here by seat decision. Each edit is confined to its
comment lines, away from the lines PR objectstack-ai#10588 and the objectui#10518
branch edit. `git merge-tree --write-tree` of this head against PR
objectstack-ai#10588's head `313ca6321` exits 0, and against
`claude/issue-10518-object-chart-axis-config` it also exits 0. The claim
comment's surface names only the `complex.ts` docblock, so it needs
these four paths appended.
- A finding outside this card:
`.changeset/8760-unfulfilled-chart-stubs.md` says `{ "type":
"line-chart" }` makes `objectui check` report `Unknown schema type
"line-chart"`, and
`.changeset/9533-dashboard-bare-key-converge-plugin-namespace.md` says
the same for `{ "type": "view:dashboard" }`. On the base, `check` over
those exact bare documents prints `Skipped 2 files with a root "type"
that no ObjectUI recogniser admitted.` and exits 0, with no unknown-type
line. The control `{ "type": "line-chart", "className": "h-64" }` prints
`⚠️ Unknown schema type "line-chart" in line-chart-structural.json`.
`10393-retire-bare-map-key.md`'s "so the check now flags it" has the
same boundary. This is a claim about how far a diagnostic reaches, not a
verdict claim, so the contract review graded it a different family with
its own card; the seat filed it as objectui#10606. That card can reuse
PR objectui#10523's recognition-gate wording.

Written by the dispatched dev for the `domain:ui` seat 2, session
`https://claude.ai/code/session_014mXUNuFomfj24w7s1pZzhN`.

---
_Generated by [Claude
Code](https://claude.ai/code/session_014mXUNuFomfj24w7s1pZzhN)_

---------

Co-authored-by: Claude <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

1 participant