Every editor close rebuilt all columns, so opening a card and cancelling
reset each column's scroll position. The editor now reports whether it
saved the card or created a tag in the nested picker, and the board only
refreshes in that case.
PLAN 5.4 says an unchanged confirmation writes nothing, but the shortcut
applied only to existing cards, so OK on a blank new-card editor added an
empty card. A new card with no title, content or tags is now not created.
A failed read on a UI path (sort change, clear, refresh after a write, opening a
card, the tag picker, the tags tab) used to escape as an unhandled exception.
Reads now run before the view is cleared and report Error_Read_* instead; the
active filter changes only once its query has run. DataWritten and TagsChanged
fire only after a successful refresh, so a broken database shows one dialog.
- board: columns in id order, per-column sort via config, column width presets (240/320/480) and custom 160-720
- column header new-card and edit/delete menu; card menu delete and move-to-column
- card editor as one unit of work with dirty check and discard confirmation; nested tag picker writes new tags immediately
- schema constraint violations mapped to typed exceptions and shown inside the modal
- dialog service with owner stack so nested modals center on their parent and get FlowDirection
- repository: filtered GetCards, CountCards; view-model tests