274afb0677
Custom fonts (and textures) disappeared a few seconds after opening a book when logged into cloud sync. Under the replica layer's CRDT remove-wins semantics, deleting a font writes a server-side tombstone that a plain field upsert cannot revive — only a reincarnation token whose HLC beats the tombstone does. Re-uploading the same file (same contentId) cleared `deletedAt` locally but published the upsert with no token, so the tombstone survived and the next pull (boot/periodic/book-open/visibility) re-applied the soft-delete via softDeleteByContentId, making the font vanish. Logging out stopped the pull, which is why it only reproduced while signed in. addFont/addTexture now mint a reincarnation token when re-adding an existing entry that is either soft-deleted or still-live with the same contentId (and has no token yet), preserving any existing token. This mirrors the dictionary's reincarnation handling (dictionaryService) and OPDS's token style, fixing both the local re-import-after-delete case and the multi-device stale-local race. The token is inert when there is no tombstone, so live re-imports remain safe. Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>