As decided on 2026-10-03, after a rule moved its card to another board, a
later action that names the rule's own board works where the card is now,
in the ordinary engine and in durable Sync alike:
- RulesHelper.ruleBoards gives the board the card is on and the board an
action works on. A move to the top or bottom, a sort and a move-all
resolve their list and swimlane names there; the write-access check
covers that board. Before this, a move to "*" after a move to another
board took the card's new list and swimlane but the old board, leaving
the card split across two boards.
- The durable move, sort, move-all and archive commands find the card
through ruleCardNow and save the board it is on as `onBoard`, written
only when it is not the plan's, so every command saved before still
validates; the archive's cascade takes the children on that board.
- These actions may now follow a move to another board, so such a plan
stays durable. An email still may not, nor a second move to yet another
board.
The archive reservation and follower guards follow the decision; the
cross-board move test now expects sorting and archiving to follow and
refuses an email instead, and a new server test runs the whole chain
durably and with the ordinary engine on a twin card, with the same result.
Thanks to xet7 !
A sortList rule re-sorts the cards of the rule card's list, or a named
list on the same board, and gives each card its index as its sort; the
hook records one position History row per changed card and there is no
activity. It now has a saved command: the order is decided once, by the
same sort keys the ordinary action uses (moved to the pure
models/lib/ruleSortList.js so the two cannot drift), and each changed
card is a unit written conditionally on its saved sort with its planned
position row. Replays change nothing more.
Thanks to xet7 !