diff --git a/CHANGELOG.md b/CHANGELOG.md
index 8594757..7449c49 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -8,6 +8,10 @@ Follows [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) · versioned wi
## [Unreleased]
### Changed
+- **Rehearser stage extraction.** Stage font scaling, cast-sidebar collapse state, cast filtering/sorting, and cast-strip
+ rendering now live in `rehearser-stage.js`, reducing the main Rehearser module while preserving its legacy globals.
+- **Release cache-busting.** Bumped the app version and HTML stylesheet/loader URLs to `1.24.25` so the extracted module
+ manifest and current frontend assets are not hidden behind stale browser caches.
- **Rehearser library extraction.** SQLite persistence helpers and the one-time IndexedDB migration now live in
`rehearser-library.js`, loaded with the Rehearser/Reader/Library lazy groups; behavior remains global-compatible.
- **Expanded resource diagnostics.** The Performance panel now reports bounded browser cache counters, container
@@ -27,9 +31,9 @@ Follows [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) · versioned wi
- **Section-scoped feature loading.** The shared module manifest now builds a 17-module foundation bundle and loads
Rehearser, Reader/Audiobook, Library/Characters, and Studio code only when their sections are opened. Repeated
navigation reuses loaded modules, while deep links load their group before activation.
-- **P1 Roadmap status.** Documented the completed namespace/manifest foundations and durable background artifacts,
- while keeping true lazy feature loading, responsibility-level frontend extraction, provider-health consolidation,
- full workload measurements, and browser image-cache eviction explicitly open.
+- **P1 Roadmap status.** Documented the completed namespace/manifest foundations, section-scoped lazy loading,
+ durable background artifacts, provider-health consolidation, workload measurements, image-cache eviction, and
+ the first Rehearser responsibility extraction; remaining frontend splits stay explicitly open.
### Added
- **Bounded Rehearser Audio Cache.** Decoded/synthesized line audio now uses a 128-entry LRU cache so long scripts
diff --git a/TODO.md b/TODO.md
index 6738be1..cf967fd 100644
--- a/TODO.md
+++ b/TODO.md
@@ -116,6 +116,7 @@ architecture change: the larger Audiobook/Rehearser/style split.
## P1 — Modular frontend architecture
- [ ] Split `audiobook.js`, `rehearser.js`, and `style.css` by responsibility.
+- [x] Extract Rehearser stage display and cast-sidebar controls into `rehearser-stage.js`.
- [ ] Replace broad globals with namespaces such as `window.TTVC.audiobook`; a compatibility namespace bridge now
exposes the existing Audiobook, Rehearser, and job APIs while responsibility-by-responsibility migration continues.
- [x] Generate the feature-module list for `loader.js` and `scripts/minify.mjs` from one shared manifest;
diff --git a/VERSION b/VERSION
index 5f4c2c9..80dd64f 100644
--- a/VERSION
+++ b/VERSION
@@ -1 +1 @@
-1.24.24
+1.24.25
diff --git a/docs/ARCHITECTURE.md b/docs/ARCHITECTURE.md
index c35dca0..2f6e22b 100644
--- a/docs/ARCHITECTURE.md
+++ b/docs/ARCHITECTURE.md
@@ -31,7 +31,7 @@ The global scope + monkey-patching is the root cause of the recurring "wiring/ti
Done incrementally as global-scope ordered files (no ES-module change needed) — each loaded before `rehearser.js` in `loader.js` + added to the bundle list in `scripts/minify.mjs`, verified by `tests/rehearser.spec.js` (parse → cast) and the smoke suite:
- ✅ `rehearser-parse.js` — `parseScript`, `detectCharacters` (pure; only call-time `SPEAKER_COLORS`).
- ⬜ `rehearser-cast.js` — `renderCastList`, sort/filter, online voice picker, character research.
-- ⬜ `rehearser-stage.js` — playback, synth cache, pre-decode window, transport.
+- ✅ `rehearser-stage.js` — stage font/cast sidebar controls and cast-strip rendering; playback and transport remain in `rehearser.js`.
- ⬜ `rehearser-train.js` — mic record / STT compare.
- ✅ `rehearser-library.js` — SQLite persistence helpers and IndexedDB migration; import/export and auto-save remain
in `rehearser.js` until their UI/event-handler dependencies are isolated.
diff --git a/static/index.html b/static/index.html
index 88a88d7..09fedb4 100644
--- a/static/index.html
+++ b/static/index.html
@@ -10,7 +10,7 @@
-
+
@@ -27,7 +27,7 @@
-
+
@@ -392,7 +392,7 @@ window.toggleNavTree = function(treeId, chevronId) {
-
+