Split out of the QA run objectstack-ai/objectstack#7439 (records-forms FULL area, kanban-drag-persistence FAIL — reproduced 3×, switcher + dedicated Board view). Filed here because the fix lands in this repo (file-at-destination rule). Filed by the triage seat; unassigned.
Symptom
An illegal Kanban drag (Backlog → In Progress) is correctly rejected server-side (PATCH 400 invalid_transition, toast shown, server value stays backlog), but the card stays stuck in the target column until a manual reload.
Repro (from the QA run, showcase app): showcase_task → Kanban view; drag a Backlog card onto In Progress. Expected: card returns to Backlog when the 400 lands. Actual: card remains in In Progress for more than 5 s, until reload.
Root cause (verified at origin/main @ 92c0b1f)
packages/plugin-kanban/src/ObjectKanban.tsx:589 — handleCardMove's failure path performs the optimistic-state revert only inside if (!hasExternalData) { … }. The ListView-hosted (console) path supplies externalData, so hasExternalData is true (:132) and the rollback is skipped; the comment-level assumption is "parent handles refresh" (:147), but the parent does not re-render on a rejected move.
Direction
On a rejected move, either perform the revert regardless of data ownership, or surface the failure to the host so the external-data owner can refresh. The revert path already exists for the internal-data case.
Dedup
Searched open issues (kanban): #4025 (the $top: 100 dead key) is the only open kanban card — different defect. No duplicate.
本评论来自分诊座位 Routine(#5474 试点),不构成认领。
Split out of the QA run objectstack-ai/objectstack#7439 (records-forms FULL area,
kanban-drag-persistenceFAIL — reproduced 3×, switcher + dedicated Board view). Filed here because the fix lands in this repo (file-at-destination rule). Filed by the triage seat; unassigned.Symptom
An illegal Kanban drag (Backlog → In Progress) is correctly rejected server-side (
PATCH400invalid_transition, toast shown, server value staysbacklog), but the card stays stuck in the target column until a manual reload.Repro (from the QA run, showcase app): showcase_task → Kanban view; drag a Backlog card onto In Progress. Expected: card returns to Backlog when the 400 lands. Actual: card remains in In Progress for more than 5 s, until reload.
Root cause (verified at
origin/main@92c0b1f)packages/plugin-kanban/src/ObjectKanban.tsx:589—handleCardMove's failure path performs the optimistic-state revert only insideif (!hasExternalData) { … }. The ListView-hosted (console) path suppliesexternalData, sohasExternalDatais true (:132) and the rollback is skipped; the comment-level assumption is "parent handles refresh" (:147), but the parent does not re-render on a rejected move.Direction
On a rejected move, either perform the revert regardless of data ownership, or surface the failure to the host so the external-data owner can refresh. The revert path already exists for the internal-data case.
Dedup
Searched open issues (
kanban): #4025 (the$top: 100dead key) is the only open kanban card — different defect. No duplicate.本评论来自分诊座位 Routine(#5474 试点),不构成认领。