-
Notifications
You must be signed in to change notification settings - Fork 0
Legacy board assignment-save guard is last-event-wins across column lanes #3308
Copy link
Copy link
Closed
Labels
Priority IIThe active direction's next tranche: wedge capabilities, significant defects, near-term hardening.The active direction's next tranche: wedge capabilities, significant defects, near-term hardening.bugSomething isn't workingSomething isn't workingfrontendPrimary implementation impact in Vue/TypeScript UI and client runtime.Primary implementation impact in Vue/TypeScript UI and client runtime.testingTest coverage, harnesses, regression prevention, and verification pipeline work.Test coverage, harnesses, regression prevention, and verification pipeline work.
Description
Activity
Metadata
Metadata
Assignees
Labels
Priority IIThe active direction's next tranche: wedge capabilities, significant defects, near-term hardening.The active direction's next tranche: wedge capabilities, significant defects, near-term hardening.bugSomething isn't workingSomething isn't workingfrontendPrimary implementation impact in Vue/TypeScript UI and client runtime.Primary implementation impact in Vue/TypeScript UI and client runtime.testingTest coverage, harnesses, regression prevention, and verification pipeline work.Test coverage, harnesses, regression prevention, and verification pipeline work.
Projects
- StatusShow more project fieldsDone
Summary
The Legacy board carries
CardModalassignment-save state from eachColumnLanethroughBoardCanvasinto one route-level Boolean (legacyCardEditorSaving).BoardCanvascurrently forwards each lane'strue/falseevent unchanged, so the last lane to emit owns the global guard even when another lane still has an unanswered PUT.Confirmed race
true.false—for example its clean modal closes;ColumnLane.handleModalCloseemitsfalseunconditionally.BoardViewsetslegacyCardEditorSaving = false.beforeunloadis now allowed while column A's request is still in flight, despite the UI contract that submitted assignment changes cannot be discarded or cancelled.The component graph permits one modal owner per lane, while the route guard stores only one last-event Boolean. The existing tests cover one lane only.
Expected contract
BoardCanvastracks assignment-save ownership independently per column lane.truewhen the first lane starts saving and tofalseonly when the final active lane settles.falsefrom one lane cannot clear another lane's owner.true/falseevents are idempotent and do not generate misleading aggregate transitions.BoardViewand the route-guard contract remain unchanged.A lane disappearing while it owns an unanswered request is a distinct lifecycle boundary; do not silently weaken this fix by treating unrelated lane events as its settlement.
Acceptance
Audit provenance
Found during the 2026-09-20 recent-development integrity pass while tracing async store ownership and the Legacy navigation-save protections.