Migration 0007 ergaenzt tags.color/parent_tag_id (Ticket-Auftrag: Farbe
und optionale Hierarchie - FDN-02 legte nur die flache Entitaet an).
internal/tag: Create/Rename/Get/ListAll/ListForDocument/Assign/Unassign/
BulkAssign/Delete/Merge. Listen-Funktionen liefern grundsaetzlich []
statt nil (siehe "Bekannte Fehler vermeiden"). Merge uebertraegt alle
Zuordnungen des Quell-Tags auf den Ziel-Tag (ON CONFLICT DO NOTHING nur
gegen doppelte Kombinationen, keine Zuordnung geht verloren) und loescht
den Quell-Tag. Loeschen eines Tags entfernt ueber ON DELETE CASCADE nur
die document_tags-Zeilen, nie das Dokument selbst.
Pruefungen:
1. Zusammenfuehren erhaelt alle Zuordnungen, auch bei vorheriger
Doppelzuordnung eines Dokuments
2. Doppelte Tag-Namen verhindert (Anlegen UND Umbenennen)
3. Massenzuweisung an 500 Dokumente: 14,4ms (Budget 2s) ueber ein
einziges INSERT...SELECT unnest(...)-Statement
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>