resolve() / resolve_many() (batch, used by the suggestion read path),
idempotent create, remove, list_all. Category-scoped so 'naruto' as
character vs copyright map to different canonicals. Tests marked
integration (real DB).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>