feat(m2): repository layer
- Data models: ColumnModel, CardModel (tags loaded), TagModel
- PathComparer: platform-parameterized path normalization
(case rule injected, trailing separator trimmed, roots kept)
- WorkspaceRepository: column/card/tag CRUD, card moves, tag
assignment; single-transaction edit confirmation with atomic
rollback; no-change confirmations write nothing; move refreshes
last_edited_at but not card updated_at; write-through to app.db
after every successful data write
- WorkspaceConnectionPool: fixed-capacity LRU session pool
(lock + repository); eviction releases resources only; typed
folder state errors; sidebar registry registration on open
- 35 new unit tests: cascade chains, atomicity, timestamp rules,
LRU behavior, lock conflicts, path equivalence