Segment-level life event spoiler filtering, suggest-links improvements, and test fixes
Segment-level life event spoiler filtering - life events on all entity pages (character, book, series, universe, group, author) now support segment-level spoiler filtering for currently-reading books. Previously, life events were filtered at book level only - a reader at chapter 5 would see all events scoped to that book, even spoilers from chapter 20. Now, life events with an optional segmentId are hidden beyond the reader's current position, matching the behaviour of appearances, states, and other character data. The curator form includes a cascading segment picker below the spoiler book field. API routes validate that the selected segment belongs to the specified book, and auto-clear the segment when the book is removed.
Author surname matching in suggest-links - the suggest-links text scanner now generates surname candidates for author entities, so references like "Hobb" match "Robin Hobb" and "Sanderson" matches "Brandon Sanderson". Surnames are marked as medium confidence (alias). Common English words and short surnames are excluded.
Common-word title confidence downgrade - non-character entities with titles that reduce to a single common English word after stripping leading articles (e.g. "The Truth", "The Road", "Drive") are now medium confidence instead of high. Reduces false positive matches in prose where the word appears naturally.
Description textarea height - all entity create/edit form description fields increased by 50% (4 to 6 rows for most entities, 6 to 9 rows for books, authors, and genres) for better readability when writing longer descriptions.
Entity name trimming in suggest-links - defensive .trim() added to all entity name fields in the suggest-links candidate loader. Prevents leading or trailing whitespace in database values from breaking text matching.
Duplicate life event toast fix - removed duplicate success toast when updating life events on the curator management page. The useFormDrawer hook already shows a success toast; the page's onSuccess callback was firing a second one.
Pre-existing test failures resolved - fixed 4 slug test failures (assertions updated to match current SlugCollisionError message format) and 3 query test failures (added missing characterAliases table mock to test database setup). Full test suite now passes: 276 files, 4924 tests, zero failures.
Stale backlog cleanup - marked the character aliases migration as done in docs/features.md (the parseAliases utility and JSON column were already removed in a prior session). Added chapter summaries backlog entry to the reader-facing features section.
Empty state for book pages with no appearances - book detail pages with no character or group appearances now show a dedicated notice explaining that appearances are the mechanism for character/group tracking, with a link to the adding-appearances support guide. Replaces the previous behaviour where those sections were simply absent, giving readers no indication that contribution is possible.
Reading profile link styling - "Add to reading profile" and "Manage reading profile" links on book detail pages restyled from plain text to outline buttons with the BookOpenText icon (consistent with the dashboard sidebar). Copy shortened from "reading progress" to "reading profile" to match the dashboard naming.