c4d4ade4da
#243 normalised the incoming path but compared it against the value read raw from the database, so a root stored with a trailing separator never compared equal. Every edit of it -- a policy change included -- took the relocation branch, where each planned destination is its own source and the pre-check refuses. That root could not be edited at all. `update` now normalises both sides, and hands `relocate_root` the normalised stored value. `path_is_free` normalises the stored side in SQL and `create` goes through it too, so `/mnt/x` and `/mnt/x/` cannot be two roots for one directory -- the unique index compares raw strings and cannot see that. Migration 0031 strips the separator from rows already written. It skips any row whose stripped form another row would also hold, rather than tripping the unique index: a migration that cannot apply stops the daemon booting, which is worse than two roots naming one directory. Also from the same review: `undo` recorded only the leaf directory, so a failed move into `/mnt/media-v2/tv/kids` left `tv` behind. It now records every level `create_dir_all` materialised, deepest first, and still never touches one that was already on disk. Refs #244. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>