SEO fixes, broken link audit, group membership updates, curator search disambiguation
SEO and indexing fixes - soft-deleted entity pages were returning HTTP 200 with a "removed" message, causing Google to flag them as soft 404s. These now return a proper 404 status. Fixed a sitemap build failure caused by two glossary entries with string timestamps instead of integers.
Broken entity link audit - built and ran a full audit of every [[type:id|name]] entity link across all text fields in the database (59,987 links scanned). Found and fixed 134 broken links outside audit logs: 108 repointed to the correct current entity (merged characters, deleted groups converted to glossary entries), 10 stripped to plain text where no valid target exists, and 16 fixed via slug-based lookups. Also fixed genre link preview cards that weren't appearing on slug-based genre links.
Curator search disambiguation - glossary entries with the same name in different universes (e.g. "The North" in both First Law and ASOIAF) now show the universe name in parentheses in curator search results and the entity link picker. Curator glossary URLs now use the entry ID instead of slug to prevent collisions, since glossary slugs are only unique within a universe.
Group membership updates - audited all groups for missing members. Logen's Crew expanded from 5 to 10 (added Jezal, Bayaz, Malacus Quai, Brother Longfoot, Yoru Sulfur, Harding Grim; removed Friendly who belongs to a different book). Thorin's Company expanded from 2 to 15 (all 13 dwarves plus Gandalf). Added Radagast to The Istari. Removed The Lord Ruler from Steel Inquisitors (he commands them but isn't one). Added Mraize and Iyatil to the Ghostbloods. Expanded The Inquisition and The Practicals with First Law operatives. Removed two nation-scale groups that only had single members (The Aiel, Edema Ruh). All memberships use valid lookup roles with book-aware start dates.
Book scope selector fix - the group create/edit forms were only showing 24 of 252 books in the scope selector because the books API uses perPage (max 100) not limit. Now fetches all books across multiple pages.