fix(board): aggregate Legacy assignment-save owners - #3309
Conversation
Codex Review SummaryThis comment shows the latest Codex review activity on this pull request.
ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings. |
Chris0Jeky
left a comment
There was a problem hiding this comment.
Fresh-context review of the complete two-file diff: stable column IDs and an idempotent Set correctly aggregate concurrent lane saves; an idle or duplicate event cannot clear another lane's unanswered PUT. Both regressions exercise emitted aggregate transitions. No blocker in this focused fix.
The longer-lived owner needed when a rendered lane disappears is explicitly not solved here and is already implemented separately in child #3313 for #3311. That existing follow-up must be reconciled and qualified against main after this parent lands, not replaced by a duplicate PR.
Re-read exact-head CI 35523913988, Self-Test 35523913884, and Extended 35523913985/35529843949: all successful. Codex completed at 76e590b without findings. Normal expected-head merge under the current maintainer instruction; no local frontend execution is claimed.
Summary
Fixes the Legacy board navigation guard’s save ownership across multiple
ColumnLaneinstances:BoardCanvas;BoardCanvasaggregates active owners by stable column id;falseover another lane’s pending assignment PUT;true/falseevents are idempotent and the parent emits only aggregate state transitions.Tests
BoardCanvasSaveOwnership.spec.tsproves:Verification
Exact head:
76e590bbef559a9f9aab8675815bb0c2fab3313c35523913884: success35523913985: success35523913988: success across frontend lint/typecheck/build/tests on Ubuntu and Windows, backend unit/API integration, architecture, migrations, containers, security scans, docs governance and E2E smoke.Residual
A lane removed by an authoritative remote refresh while its request remains pending needs an owner that outlives the rendered child; that separate cross-component lifecycle case is tracked in #3311 rather than being “fixed” by prematurely pruning the active owner.
Closes #3308