Skip to content

Legacy board assignment-save guard is last-event-wins across column lanes #3308

Description

@Chris0Jeky

Summary

The Legacy board carries CardModal assignment-save state from each ColumnLane through BoardCanvas into one route-level Boolean (legacyCardEditorSaving). BoardCanvas currently forwards each lane's true/false event unchanged, so the last lane to emit owns the global guard even when another lane still has an unanswered PUT.

Confirmed race

  1. A card editor in column A begins an assignment save and emits true.
  2. Another mounted lane emits false—for example its clean modal closes; ColumnLane.handleModalClose emits false unconditionally.
  3. BoardView sets legacyCardEditorSaving = false.
  4. Route leave / same-view board navigation / beforeunload is 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

  • BoardCanvas tracks assignment-save ownership independently per column lane.
  • It emits the aggregate transition to true when the first lane starts saving and to false only when the final active lane settles.
  • A false from one lane cannot clear another lane's owner.
  • Duplicate true/false events are idempotent and do not generate misleading aggregate transitions.
  • BoardView and 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

  • Focused component regression with two columns: A true, B true, A false remains globally true, B false clears.
  • Duplicate events remain idempotent.
  • Existing Legacy assignment-save navigation tests stay green.
  • Frontend lint, typecheck, build, full tests, and exact-head hosted CI pass.

Audit provenance

Found during the 2026-09-20 recent-development integrity pass while tracing async store ownership and the Legacy navigation-save protections.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    Priority IIThe active direction's next tranche: wedge capabilities, significant defects, near-term hardening.bugSomething isn't workingfrontendPrimary implementation impact in Vue/TypeScript UI and client runtime.testingTest coverage, harnesses, regression prevention, and verification pipeline work.

    Projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions