src/main/character-dictionary-runtime.ts is now one of the largest live production files in the repo and combines AniList transport, name normalization, snapshot/image shaping, cache management, and zip packaging. That file will keep growing as character-dictionary features evolve. Split it into focused modules so the runtime surface becomes orchestration instead of a catch-all implementation blob.
Acceptance Criteria
#1 AniList fetch/parsing logic, dictionary-entry building, and snapshot/cache/zip persistence no longer live in one giant file.
#2 The public runtime API stays behavior-compatible for current callers.
#3 The top-level runtime/orchestration file becomes materially smaller and easier to review.
#4 Existing character-dictionary tests still pass, and new focused tests cover the extracted modules where needed.
Implementation Plan
Identify the dominant concern boundaries inside src/main/character-dictionary-runtime.ts.
Extract fetch/transform/persist modules with narrow interfaces, keeping data-shape ownership explicit.
Leave the exported runtime API stable for current main-process callers.
Verify with the maintained character-dictionary/runtime test lane plus bun run typecheck.
Implementation Notes
Split src/main/character-dictionary-runtime.ts into focused modules under src/main/character-dictionary-runtime/ (fetch, build, cache, plus helper modules). The orchestrator stayed as a compatibility shim/API surface with delegated module functions. Added focused tests for cache snapshot semantics and term rebuild + collapsible-open-state behavior in the new modules. Updated runtime architecture docs in docs/architecture/domains.md and docs-site/architecture.md.
Final Summary
Task completed with commit 5b06579e (refactor: split character dictionary runtime modules). Runtime refactor landed with regression coverage and verification including runtime-compat lanes, and all changed behavior was validated as API-compatible for callers.