- remove racy watch(loading)+loadIfSentinelVisible fallback that fired before RecycleScroller set virtual height
- add hasMore guard and total reset in useBookQuery for defensive correctness
- drop tags field and bookTags fan-out query from all BookCard paths
- drop metadataScore from BookCard select (only used in BookDetail)
- fix durationSeconds: was never selected in DB; derive audiobook badge from file format using FORMAT_TO_GROUP instead
- replace broken HSL approach with pure JS oklch-to-hex using exact --primary L/C from accents.css
- remove --chart-1..10 and --chart-icon-* CSS tokens
- remove dead --color-chart-* Tailwind bridge aliases
- inline CSS relative color syntax in ChartCard and StatisticsSummaryCard
- fix MetadataScoreDistributionChart mark area to rgba (ECharts-compatible)
- resolve all 69 client type-checking errors for stricter TS compliance
- remove obsolete type-check baseline scripts and files
- overhaul project root with updated README.md and new DEVELOPMENT.md
- migrate to unified baseline migration strategy and cleanup docker configs
- remove redundant production and dev-specific shell scripts
- replace fixed RateLimiter with passive timestamp tracker exposing windowResetMs()
- record throttle in ProviderThrottleTracker on 420 with exact time until hourly window resets
- inject ProviderThrottleTracker into ComicVineProvider; catch ProviderThrottleError in search and lookupById
- add unit tests for comicvine.client and comicvine.provider (49 tests)
- replace shared 'providerId' key in pickedSources with provider-specific
field names (googleBooksId, goodreadsId, etc.) so each provider's ID
pick is independent and not overwritten when switching tabs
- extract candidate relevance scoring into candidate-relevance.ts with
Levenshtein-based title/author scoring, ISBN exact match, and junk
title filtering; remove duplicate inline scoring from goodreads provider