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 !
The rule stage's guard now accepts the card where a saved move of the
SAME rule plan put it (maintainer decision of 2026-10-02), so the rule's
later actions act on the moved card once. Each move is a saved command
with Card.move's effects: the update, the position History row, the
legacy undo row, the attachments' placement and the moveCard activity.
moveAllCardsInList saves one unit per card. Moves, copies and links to
another board stay on the direct path.
Thanks to xet7 !