diff --git a/CHANGELOG.md b/CHANGELOG.md
index 059e159..c190889 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -8,6 +8,8 @@ Follows [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) · versioned wi
## [Unreleased]
### Changed
+- **Rehearser voice-matching extraction.** Local voice matching, preview-line selection, fish.audio search/import,
+ and candidate assignment now live in `rehearser-voice-picker.js`; DOM event registration remains timing-safe.
- **Audiobook/Reader stylesheet extraction.** Reader controls, Audiobook casting, page layout, character overlays,
and confidence/recast styles now live in `static/css/audiobook.css` with release cache busting.
- **Rehearser stylesheet extraction.** The main Rehearser layout, cast, stage, training, library, and script-view
diff --git a/TODO.md b/TODO.md
index 5c8fe16..2f067b1 100644
--- a/TODO.md
+++ b/TODO.md
@@ -129,7 +129,8 @@ architecture change: the larger Audiobook/Rehearser/style split.
larger responsibility splits remain.
- [x] Add a dependency-free frontend syntax and top-level declaration collision gate (`npm run check:frontend`);
a full style/lint policy remains a follow-up.
-- [ ] Extract Rehearser voice matching and voice design.
+- [x] Extract Rehearser voice matching and voice design; matching/import helpers now live with the voice-picker module,
+ while timing-sensitive DOM wiring remains in the cast renderer.
- [x] Extract Rehearser voice-picker presentation and preview state into `rehearser-voice-picker.js`.
- [x] Extract Rehearser cast view, sorting, filtering, and toolbar wiring into `rehearser-cast.js`.
- [x] Extract Rehearser training transcript comparison helpers into `rehearser-train.js`.
diff --git a/VERSION b/VERSION
index eb6fac4..ffb8153 100644
--- a/VERSION
+++ b/VERSION
@@ -1 +1 @@
-1.24.46
+1.24.47
diff --git a/docs/ARCHITECTURE.md b/docs/ARCHITECTURE.md
index cb4962b..221e5ce 100644
--- a/docs/ARCHITECTURE.md
+++ b/docs/ARCHITECTURE.md
@@ -33,7 +33,7 @@ Done incrementally as global-scope ordered files (no ES-module change needed)
- ✅ `rehearser-parse.js` — `parseScript`, `detectCharacters` (pure; only call-time `SPEAKER_COLORS`).
- ✅ `rehearser-cast.js` — `renderCastList`, sort/filter, online voice picker, and character research.
- ✅ `rehearser-stage.js` — stage font/cast sidebar controls and cast-strip rendering; playback and transport remain in `rehearser.js`.
-- ✅ `rehearser-voice-picker.js` — voice preview state and matched-choice presentation; import and assignment actions remain in `rehearser.js`.
+- ✅ `rehearser-voice-picker.js` — voice preview state, local matching, fish.audio search/import, and candidate assignment; DOM event registration remains in `rehearser-cast.js`.
- ✅ `rehearser-cast.js` — cast view, full cast-card rendering, sort/filter state handlers, and delegated cast toolbar wiring.
- ✅ `rehearser-voice-design.js` — character development, backend selection, and backend-refresh synchronization.
- ✅ `audiobook-segmentation.js` — quote segmentation, conservative turn-taking, and dialogue-piece validation.
diff --git a/static/index.html b/static/index.html
index 92c5e67..9360cf7 100644
--- a/static/index.html
+++ b/static/index.html
@@ -10,7 +10,7 @@
-
+
@@ -27,12 +27,12 @@
-
-
-
-
-
-
+
+
+
+
+
+
@@ -397,7 +397,7 @@ window.toggleNavTree = function(treeId, chevronId) {
-
+