Skip to content

fix(plugin-kanban): the board stops showing a card order it persists nowhere (objectui#8826) - #9640

Merged
os-justin merged 2 commits into
mainfrom
claude/issue-8826-kanban-same-column-reorder-honesty
Sep 17, 2026
Merged

os-justin merged 2 commits into
mainfrom
claude/issue-8826-kanban-same-column-reorder-honesty

Conversation

@os-justin

Copy link
Copy Markdown
Collaborator

Fixes #8826

Ruled on the card as batch #141 item 3, letter B, maintainer 「同意」: the board stops claiming a capability it does not have. The fence the ruling asked this body to carry, verbatim: 「order persistence is not a capability of this board; a spec card would be its entry」.

What changed

KanbanImpl's handleDragEnd:

  • Same-column drop — the branch no longer reorders local state. The card returns to its position. Nothing is persisted, so nothing is shown as persisted.
  • Cross-column move — the membership change stays and is still persisted through persistCardMove. The landing index is still computed and still handed to onCardMove, where it is still discarded; what changed is that it is no longer painted. The branch appends to the target column instead of splicing at the slot the card was released over, so the board claims membership and says nothing about position.

No new prop, no new persistence path, no new authorable key — Clause-②: no holds, and this is a strict narrowing of a claim rather than a widening of any surface.

Two README bullets advertised in-column reordering as a feature. They now say what is true. Letter C was refused for formalising the false success; leaving it in the docs would have been letter C by the back door.

⚠️ One mechanism claim in the ruling was falsified — the file, not the mechanism

The ruling's execution note reads 「ObjectKanban.tsx: the same-column branch of handleDragEnd …」. Re-derived by symbol (git grep -nw handleDragEnd): ObjectKanban.tsx has no handleDragEnd. The drag handler and the optimistic reorder live in KanbanImpl.tsx; ObjectKanban.tsx owns handleCardMove, whose _newIndex parameter and void _newIndex discard are exactly where the ruling says they are and are unchanged by this branch. Everything the ruling asked for is done, one file over from where it says.

KanbanImpl's mirror-sync timing (objectui#8534 / PR #8825) is untouched. The mirror itself stays — the cross-column optimistic write still needs it, which is now what defends it in that card's pin.

The two pins — both legs, in one file

packages/plugin-kanban/src/__tests__/sameColumnDropIsNotClaimed-8826.test.tsx, on the recorder objectui#8826 was measured with (a module mock of KanbanImpl capturing the columns prop per render, plus a capture of the board's real onDragEnd):

  • LEG 1 — a same-column drop leaves DOM order equal to the DATA order, on both data ownerships, records no new columns snapshot and reaches no update.
  • LEG 2, the lit control — a cross-column move still emits the new membership snapshot and still writes it, with an exact-body assertion (update('task', 'a', { status: 'in_progress' })). Without this leg, LEG 1 would read green on a board whose drag path was broken outright.

The fixture puts two cards in the source column and asks for their reverse order, so "did not move" is distinguishable from "nothing was driven".

Reverse verification — two arms, mutation proven on disk, restore proven by hash

Run from the committed fix (1f1ec56); every arm restores with git checkout HEAD -- under a trap with absolute paths, and each restore is verified by the blob hash plus an empty git diff HEAD, never by an exit code.

arm mutation result
same-column re-add the optimistic reorder this card removed exit 1 — 3 failed / 5 passed. The failures are exactly LEG 1 (internal), LEG 1 (external) and the sibling control in columnsReachDomSameCommit-8534. LEG 2 stayed green, so the instrument distinguishes the defect from a dead board.
cross-column splice at the drop index again exit 1 — 1 failed / 9 passed. The single failure is the external-path assertion in crossColumnLandingPosition-8826; LEG 1 and everything else stayed green.

KanbanImpl.tsx HEAD blob 5cd6f3b0eaf34acafa223271f8619b4de09366e1; mutated blobs 7a93f0098ec53e68f839bf8fb4fc8823040b3575 and 3f9b95415364fc026770ba297b4c30a76f2c3dea; restored blob reproduces the HEAD blob byte for byte on both arms, and the tree was verified clean afterwards. The mutation scripts assert their anchor is present exactly once before writing, so a no-op edit aborts instead of passing as a run.

Verification

All run at 1f1ec56, exit codes captured to files before being read, never through a pipe. Heavy runs serialized through the shared verify lock with OS_VERIFY_LOCK_SLOT=objectui-8826, verdicts read from its printed VERDICT command-exit line.

check exit reading
pnpm exec vitest run packages/plugin-kanban/ (repo ROOT) 0 56 files / 358 tests passed
pnpm --filter @object-ui/plugin-kanban type-check 0 both legs — tsc --noEmit and tsc -p tsconfig.test.json, the second being what covers the test files
pnpm --filter @object-ui/plugin-kanban lint 0 0 errors; this diff contributes 0 of the package's 216 pre-existing warnings
check:changeset-presence 0 1 changeset declared for 5 published source files across 2 packages
check:doc-snippets · check:doc-examples · check:readme-exports 0 · 0 · 0 these three read package READMEs, and all three first exited non-zero as PREREQUISITE NOT MET; re-run to a real 0 after the scoped build the gates name
check:doc-types · check:doc-fences · check:doc-example-ids 0 —
check:control-bytes · check:new-line-citations · check:test-path-roots · check:unreferenced-sources 0 —
check:vi-mock-specifiers · -inherit · -override-shape 0 run because this diff adds two vi.mock call sites
check:changeset-claims · check:changeset-no-major · check:handler-key-reads 0 —
check-governed-queue-guard --test 0 NOT GOVERNED — 4 paths checked against 5 governed surfaces, none matched

A dependency-closure build (--filter '@object-ui/plugin-kanban^...' build) and the doc gates' own 35-task scoped build were both run to a real 0 first; the type-check and the three README/doc gates were failing only for want of them.

Acceptance notes

  • Q3 was already answered, contrary to the brief. The dispatch carried the card's question 3 as unmeasured. It was answered and merged on 2026-09-10 by PR test(plugin-kanban): characterize the cross-column landing position (objectui#8826 Q3) #8975, whose characterization pin is in the tree. Re-derived rather than cited: that instrument was run on the pristine base at the start of this work and passed, so the reading stands — the cross-column landing position is lost on both ownerships. The fix surface is therefore the wider one, and this branch covers both halves.
  • What "appended" is, and is not. The board cannot compute the target column's record-order position from the columns prop alone: each column's cards are a record-ordered subsequence, and nothing carries their global interleaving. Appending is therefore the only slot the board can offer without claiming to know where the round-trip will sort the card — it is not itself a promise that the card will stay last. On the ownership that re-renders, the prop-driven re-sync corrects it inside the same commit; on the external ownership, the card sits at the end of the target column until the parent reflows. What is removed is the claim that the user's drop slot was honoured. ⚠️ The test(plugin-kanban): characterize the cross-column landing position (objectui#8826 Q3) #8975 fixture cannot distinguish "appended" from "record order" — its moved card is last in the record array either way — and its assertion now says so in place.
  • noted, not filed — KanbanEnhanced.tsx carries a byte-for-byte twin of the removed reorder. Left alone deliberately: it has zero non-test importers, its registry key was retired by objectui#8257, and the package exports publishes only . and ./style.css, so it is unreachable from outside this package. Dead code is not a fileable class. Successor: none — no open PR touches this package.
  • noted, not filed — the exported useQuickAddReorder hook keeps its own local-order state. It is a published export with no in-repo consumer and is not on this board's drag path. Successor: none.
  • Deviation from the claimed file surface, declared. The claim named packages/plugin-kanban/src/. This branch also touches packages/plugin-kanban/README.md, packages/components/src/renderers/complex/README-KANBAN.md and .changeset/. The changeset is mechanically required. The two README bullets are the docs half of this very behaviour change (AGENTS.md commandment Add automated testing infrastructure and CI/CD workflows #2), and each was a one-line claim of the exact capability the ruling removes; shipping them unchanged would leave the board advertising in-column reordering in print.

Generated by Claude Code

…re (objectui#8826)

Dragging a card inside its own column reordered the board on the spot and
recorded that order nowhere: the same-column branch notified no one, the
mover returns early when the source and target columns are equal, and the
write body carries the grouped field and no positional key. The next data
round-trip re-synced the mirror from `columns` and put the card back, with
no error, no toast and no rollback animation — a success the user watched
happen and then watched disappear.

Ruled letter B: the board stops claiming a capability it does not have.

- same-column drop: no optimistic reorder; the card returns to its position.
- cross-column move: the membership change stays and is still persisted; the
  landing index is still handed to `onCardMove` and still discarded there, but
  it is no longer painted — the branch appends instead of splicing at the
  dropped slot, so no position is claimed that the round-trip cannot reproduce.

Letter A (persist the order) was refused as a STARTING POINT, not on the
merits: there is no declared ordering slot in `@objectstack/spec` to write one
to, and inventing a UI-local one is Prime Directive 5's workaround. Letter C
(document the false success) was refused as formalising it — the two README
lines that advertised in-column reordering say what is true instead.

Pins, both legs, in `sameColumnDropIsNotClaimed-8826.test.tsx`: a same-column
drop leaves DOM order equal to the data order on both data ownerships, and the
lit control shows a cross-column move still emitting the new membership
snapshot and still reaching the wire.

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

github-actions Bot commented Sep 16, 2026 •

Copy link
Copy Markdown
Contributor

changeset-claim-re-read

⚠️ 3 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/6172-markdown-kanban-one-authority.md

  • names KanbanImpl.tsx → packages/plugin-kanban/src/KanbanImpl.tsx — edited by this change

    KanbanCard / KanbanColumn — the three in-package copies converged to one. KanbanImpl.tsx and KanbanEnhanced.tsx each redeclared both names. A TypeScript-AST comparison found them strict-SUBSET copies of ./types with nothing typed differently, so their extra members moved onto the one declaration and both files now re-point at it.

.changeset/6939-kanban-column-cards.md

  • names KanbanImpl.tsx → packages/plugin-kanban/src/KanbanImpl.tsx — 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/9342-kanban-oncardmove-prop.md

  • names src/renderers/complex/README-KANBAN.md → packages/components/src/renderers/complex/README-KANBAN.md — edited by this change

    src/renderers/complex/README-KANBAN.md taught an object-kanban document carrying "onCardMove": "(event) => …" — a function spelled as a string, accepted and silently dropped on the day it was written and refused by name from now on. It teaches the React prop instead, and its prop table spells the key never.

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 claim that was born false (a changeset this change adds is excluded by construction), a claim spelled as a symbol or a package rather than a backticked file name, and a file named ambiguously.

Compared the checked-out tree with 15f01223d (merge-base with origin/main): 6 file(s) changed outside .changeset/, read against 1106 pending declaration(s) that publish a body (1610 pending in total). · run

@os-justin os-justin added the bug Something isn't working label Sep 16, 2026 — with Claude
@github-actions

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

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

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


📦 Bundle Size Report

Package Size Gzipped
app-shell (consoleActionDispatch.js) 0.20KB 0.19KB
app-shell (index.js) 16.69KB 6.21KB
app-shell (runtime-config.js) 20.68KB 7.36KB
app-shell (types.js) 0.01KB 0.04KB
app-shell (urlParams.js) 10.06KB 3.86KB
auth (ActiveOrganizationStorage.js) 25.05KB 9.16KB
auth (AuthContext.js) 0.31KB 0.24KB
auth (AuthGuard.js) 2.07KB 1.00KB
auth (AuthProvider.js) 40.18KB 10.59KB
auth (AuthShell.js) 3.49KB 1.40KB
auth (ForgotPasswordForm.js) 12.21KB 3.45KB
auth (LoginForm.js) 18.15KB 5.39KB
auth (PreviewBanner.js) 0.90KB 0.50KB
auth (RegisterForm.js) 6.65KB 2.22KB
auth (SocialSignInButtons.js) 9.61KB 3.89KB
auth (UserMenu.js) 3.41KB 1.23KB
auth (auth-gate-events.js) 1.29KB 0.66KB
auth (authStyles.js) 5.04KB 1.72KB
auth (createAuthClient.js) 40.21KB 10.80KB
auth (createAuthenticatedFetch.js) 8.46KB 3.43KB
auth (index.js) 3.19KB 1.44KB
auth (invitation-status.js) 1.22KB 0.70KB
auth (org-roles.js) 6.66KB 2.78KB
auth (phone-identifier.js) 1.11KB 0.66KB
auth (types.js) 0.59KB 0.35KB
auth (useAuth.js) 5.30KB 1.02KB
auth (useWorkspaceAdminStatus.js) 11.08KB 4.58KB
collaboration (CommentThread.js) 26.08KB 7.56KB
collaboration (LiveCursors.js) 3.17KB 1.27KB
collaboration (PresenceAvatars.js) 6.49KB 2.64KB
collaboration (PresenceProvider.js) 2.79KB 1.13KB
collaboration (index.js) 1.68KB 0.73KB
collaboration (useCollaborationTranslation.js) 6.05KB 2.52KB
collaboration (useCommentSearch.js) 1.98KB 0.88KB
collaboration (useConflictResolution.js) 7.75KB 1.86KB
collaboration (useMentionNotifications.js) 1.81KB 0.68KB
collaboration (usePresence.js) 6.33KB 1.84KB
collaboration (useRealtimeSubscription.js) 7.91KB 2.01KB
components (index.js) 544.93KB 130.50KB
core (index.js) 8.94KB 3.59KB
create-plugin (index.js) 27.94KB 9.51KB
data-objectstack (index.js) 215.98KB 59.97KB
fields (index.js) 249.35KB 62.93KB
i18n (LocalizationContext.js) 1.76KB 0.96KB
i18n (builtinAggregateLabels.js) 0.86KB 0.49KB
i18n (currency.js) 1.22KB 0.64KB
i18n (fallbackInterpolation.js) 6.25KB 2.77KB
i18n (i18n.js) 8.87KB 3.64KB
i18n (index.js) 5.22KB 2.26KB
i18n (pickLocalized.js) 9.86KB 3.95KB
i18n (provider.js) 32.15KB 10.49KB
i18n (useDisplayLocale.js) 2.85KB 1.45KB
i18n (useObjectLabel.js) 34.34KB 9.17KB
i18n (useSafeTranslation.js) 5.60KB 2.33KB
layout (index.js) 38.83KB 10.95KB
mobile (MobileProvider.js) 0.92KB 0.49KB
mobile (ResponsiveContainer.js) 0.94KB 0.38KB
mobile (breakpoints.js) 1.51KB 0.70KB
mobile (createOfflineDataSource.js) 5.61KB 1.75KB
mobile (index.js) 1.99KB 0.87KB
mobile (offlineQueue.js) 3.91KB 1.35KB
mobile (pwa.js) 0.97KB 0.49KB
mobile (serviceWorker.js) 1.48KB 0.62KB
mobile (serviceWorkerSource.js) 3.41KB 1.48KB
mobile (useBreakpoint.js) 1.54KB 0.65KB
mobile (useGesture.js) 6.96KB 1.98KB
mobile (useOfflineSync.js) 1.99KB 0.72KB
mobile (usePullToRefresh.js) 2.53KB 0.85KB
mobile (useResponsive.js) 0.72KB 0.42KB
mobile (useSpecGesture.js) 4.39KB 1.66KB
mobile (useTouchTarget.js) 1.01KB 0.54KB
permissions (MePermissionsProvider.js) 13.52KB 4.88KB
permissions (PermissionContext.js) 0.31KB 0.25KB
permissions (PermissionGuard.js) 0.89KB 0.45KB
permissions (PermissionProvider.js) 6.24KB 2.16KB
permissions (discardProofCache.js) 1.04KB 0.55KB
permissions (evaluator.js) 8.39KB 3.10KB
permissions (index.js) 0.93KB 0.41KB
permissions (store.js) 0.91KB 0.42KB
permissions (useFieldPermissions.js) 1.28KB 0.53KB
permissions (usePermissions.js) 4.83KB 2.27KB
plugin-ai (index.js) 14.81KB 3.63KB
plugin-calendar (index.js) 49.99KB 14.24KB
plugin-charts (index.js) 71.33KB 19.90KB
plugin-chatbot (index.js) 195.34KB 46.51KB
plugin-dashboard (index.js) 131.44KB 34.65KB
plugin-designer (index.js) 215.94KB 44.33KB
plugin-detail (index.js) 252.65KB 65.65KB
plugin-editor (index.js) 2.23KB 1.05KB
plugin-form (index.js) 136.71KB 34.16KB
plugin-gantt (index.js) 167.62KB 41.26KB
plugin-grid (index.js) 212.64KB 57.91KB
plugin-kanban (index.js) 46.41KB 14.49KB
plugin-list (index.js) 112.67KB 27.68KB
plugin-map (index.js) 21.48KB 6.99KB
plugin-markdown (index.js) 13.88KB 4.80KB
plugin-report (index.js) 43.41KB 11.93KB
plugin-timeline (index.js) 30.07KB 8.74KB
plugin-tree (index.js) 10.58KB 3.72KB
plugin-view (index.js) 84.98KB 20.99KB
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) 104.82KB 34.67KB
react (data-invalidation.js) 5.05KB 2.08KB
react (index.js) 4.63KB 2.18KB
react (schema-input.js) 4.25KB 2.04KB
react (spec-input.js) 0.20KB 0.18KB
sdui-parser (codegen.js) 6.58KB 2.74KB
sdui-parser (dashboard-widget-options.js) 3.08KB 1.30KB
sdui-parser (index.js) 5.66KB 2.50KB
sdui-parser (input-type.js) 2.84KB 1.40KB
sdui-parser (kanban-quick-add.js) 3.89KB 1.87KB
sdui-parser (parse.js) 25.28KB 7.80KB
sdui-parser (provenance.js) 3.66KB 1.82KB
sdui-parser (types.js) 0.28KB 0.23KB
sdui-parser (validate.js) 14.82KB 4.99KB
types (ai.js) 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) 4.73KB 2.28KB
types (navigation.js) 0.20KB 0.18KB
types (objectql.js) 0.20KB 0.18KB
types (overlay.js) 0.20KB 0.18KB
types (permissions.js) 0.20KB 0.18KB
types (plugin-scope.js) 0.20KB 0.18KB
types (record-components.js) 0.20KB 0.19KB
types (record-semantics.js) 1.28KB 0.67KB
types (registry.js) 0.20KB 0.18KB
types (reports.js) 0.20KB 0.18KB
types (select-option.js) 0.20KB 0.19KB
types (spec-report.js) 5.05KB 1.93KB
types (spec-ui-namespace.js) 0.20KB 0.19KB
types (strict-authoring-face.js) 14.04KB 5.36KB
types (system-fields.js) 3.33KB 1.54KB
types (theme.js) 6.28KB 2.87KB
types (ui-action.js) 8.11KB 3.32KB
types (views.js) 0.20KB 0.18KB
types (widget.js) 0.20KB 0.18KB

Size Limits

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

@github-actions

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

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

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


📦 Bundle Size Report

Package Size Gzipped
app-shell (consoleActionDispatch.js) 0.20KB 0.19KB
app-shell (index.js) 16.69KB 6.21KB
app-shell (runtime-config.js) 20.68KB 7.36KB
app-shell (types.js) 0.01KB 0.04KB
app-shell (urlParams.js) 10.06KB 3.86KB
auth (ActiveOrganizationStorage.js) 25.05KB 9.16KB
auth (AuthContext.js) 0.31KB 0.24KB
auth (AuthGuard.js) 2.07KB 1.00KB
auth (AuthProvider.js) 40.18KB 10.59KB
auth (AuthShell.js) 3.49KB 1.40KB
auth (ForgotPasswordForm.js) 12.21KB 3.45KB
auth (LoginForm.js) 18.15KB 5.39KB
auth (PreviewBanner.js) 0.90KB 0.50KB
auth (RegisterForm.js) 6.65KB 2.22KB
auth (SocialSignInButtons.js) 9.61KB 3.89KB
auth (UserMenu.js) 3.41KB 1.23KB
auth (auth-gate-events.js) 1.29KB 0.66KB
auth (authStyles.js) 5.04KB 1.72KB
auth (createAuthClient.js) 40.21KB 10.80KB
auth (createAuthenticatedFetch.js) 8.46KB 3.43KB
auth (index.js) 3.19KB 1.44KB
auth (invitation-status.js) 1.22KB 0.70KB
auth (org-roles.js) 6.66KB 2.78KB
auth (phone-identifier.js) 1.11KB 0.66KB
auth (types.js) 0.59KB 0.35KB
auth (useAuth.js) 5.30KB 1.02KB
auth (useWorkspaceAdminStatus.js) 11.08KB 4.58KB
collaboration (CommentThread.js) 26.08KB 7.56KB
collaboration (LiveCursors.js) 3.17KB 1.27KB
collaboration (PresenceAvatars.js) 6.49KB 2.64KB
collaboration (PresenceProvider.js) 2.79KB 1.13KB
collaboration (index.js) 1.68KB 0.73KB
collaboration (useCollaborationTranslation.js) 6.05KB 2.52KB
collaboration (useCommentSearch.js) 1.98KB 0.88KB
collaboration (useConflictResolution.js) 7.75KB 1.86KB
collaboration (useMentionNotifications.js) 1.81KB 0.68KB
collaboration (usePresence.js) 6.33KB 1.84KB
collaboration (useRealtimeSubscription.js) 7.91KB 2.01KB
components (index.js) 544.93KB 130.50KB
core (index.js) 8.94KB 3.59KB
create-plugin (index.js) 27.94KB 9.51KB
data-objectstack (index.js) 215.98KB 59.97KB
fields (index.js) 249.35KB 62.93KB
i18n (LocalizationContext.js) 1.76KB 0.96KB
i18n (builtinAggregateLabels.js) 0.86KB 0.49KB
i18n (currency.js) 1.22KB 0.64KB
i18n (fallbackInterpolation.js) 6.25KB 2.77KB
i18n (i18n.js) 8.87KB 3.64KB
i18n (index.js) 5.22KB 2.26KB
i18n (pickLocalized.js) 9.86KB 3.95KB
i18n (provider.js) 32.15KB 10.49KB
i18n (useDisplayLocale.js) 2.85KB 1.45KB
i18n (useObjectLabel.js) 34.34KB 9.17KB
i18n (useSafeTranslation.js) 5.60KB 2.33KB
layout (index.js) 38.83KB 10.95KB
mobile (MobileProvider.js) 0.92KB 0.49KB
mobile (ResponsiveContainer.js) 0.94KB 0.38KB
mobile (breakpoints.js) 1.51KB 0.70KB
mobile (createOfflineDataSource.js) 5.61KB 1.75KB
mobile (index.js) 1.99KB 0.87KB
mobile (offlineQueue.js) 3.91KB 1.35KB
mobile (pwa.js) 0.97KB 0.49KB
mobile (serviceWorker.js) 1.48KB 0.62KB
mobile (serviceWorkerSource.js) 3.41KB 1.48KB
mobile (useBreakpoint.js) 1.54KB 0.65KB
mobile (useGesture.js) 6.96KB 1.98KB
mobile (useOfflineSync.js) 1.99KB 0.72KB
mobile (usePullToRefresh.js) 2.53KB 0.85KB
mobile (useResponsive.js) 0.72KB 0.42KB
mobile (useSpecGesture.js) 4.39KB 1.66KB
mobile (useTouchTarget.js) 1.01KB 0.54KB
permissions (MePermissionsProvider.js) 13.52KB 4.88KB
permissions (PermissionContext.js) 0.31KB 0.25KB
permissions (PermissionGuard.js) 0.89KB 0.45KB
permissions (PermissionProvider.js) 6.24KB 2.16KB
permissions (discardProofCache.js) 1.04KB 0.55KB
permissions (evaluator.js) 8.39KB 3.10KB
permissions (index.js) 0.93KB 0.41KB
permissions (store.js) 0.91KB 0.42KB
permissions (useFieldPermissions.js) 1.28KB 0.53KB
permissions (usePermissions.js) 4.83KB 2.27KB
plugin-ai (index.js) 14.81KB 3.63KB
plugin-calendar (index.js) 49.99KB 14.24KB
plugin-charts (index.js) 71.33KB 19.90KB
plugin-chatbot (index.js) 195.34KB 46.51KB
plugin-dashboard (index.js) 131.44KB 34.65KB
plugin-designer (index.js) 215.94KB 44.33KB
plugin-detail (index.js) 252.65KB 65.65KB
plugin-editor (index.js) 2.23KB 1.05KB
plugin-form (index.js) 136.71KB 34.16KB
plugin-gantt (index.js) 167.62KB 41.26KB
plugin-grid (index.js) 212.64KB 57.91KB
plugin-kanban (index.js) 46.41KB 14.49KB
plugin-list (index.js) 112.67KB 27.68KB
plugin-map (index.js) 21.48KB 6.99KB
plugin-markdown (index.js) 13.88KB 4.80KB
plugin-report (index.js) 43.41KB 11.93KB
plugin-timeline (index.js) 30.07KB 8.74KB
plugin-tree (index.js) 10.58KB 3.72KB
plugin-view (index.js) 84.98KB 20.99KB
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) 104.82KB 34.67KB
react (data-invalidation.js) 5.05KB 2.08KB
react (index.js) 4.63KB 2.18KB
react (schema-input.js) 4.25KB 2.04KB
react (spec-input.js) 0.20KB 0.18KB
sdui-parser (codegen.js) 6.58KB 2.74KB
sdui-parser (dashboard-widget-options.js) 3.08KB 1.30KB
sdui-parser (index.js) 5.66KB 2.50KB
sdui-parser (input-type.js) 2.84KB 1.40KB
sdui-parser (kanban-quick-add.js) 3.89KB 1.87KB
sdui-parser (parse.js) 25.28KB 7.80KB
sdui-parser (provenance.js) 3.66KB 1.82KB
sdui-parser (types.js) 0.28KB 0.23KB
sdui-parser (validate.js) 14.82KB 4.99KB
types (ai.js) 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) 4.73KB 2.28KB
types (navigation.js) 0.20KB 0.18KB
types (objectql.js) 0.20KB 0.18KB
types (overlay.js) 0.20KB 0.18KB
types (permissions.js) 0.20KB 0.18KB
types (plugin-scope.js) 0.20KB 0.18KB
types (record-components.js) 0.20KB 0.19KB
types (record-semantics.js) 1.28KB 0.67KB
types (registry.js) 0.20KB 0.18KB
types (reports.js) 0.20KB 0.18KB
types (select-option.js) 0.20KB 0.19KB
types (spec-report.js) 5.05KB 1.93KB
types (spec-ui-namespace.js) 0.20KB 0.19KB
types (strict-authoring-face.js) 14.04KB 5.36KB
types (system-fields.js) 3.33KB 1.54KB
types (theme.js) 6.28KB 2.87KB
types (ui-action.js) 8.11KB 3.32KB
types (views.js) 0.20KB 0.18KB
types (widget.js) 0.20KB 0.18KB

Size Limits

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

@os-justin
os-justin marked this pull request as ready for review September 17, 2026 00:26
@os-justin
os-justin added this pull request to the merge queue Sep 17, 2026
Merged via the queue into main with commit f20a111 Sep 17, 2026
38 checks passed
@os-justin
os-justin deleted the claude/issue-8826-kanban-same-column-reorder-honesty branch September 17, 2026 00:46
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

bug Something isn't working documentation Improvements or additions to documentation package: components plugin: kanban plugin tests

Projects

None yet

Development

Successfully merging this pull request may close these issues.

bug(plugin-kanban): 同列内拖拽重排**从不被持久化到任何地方** —— 用户看见它动了,下一次 prop 变化时它悄悄退回去

2 participants