diff --git a/assets/theme-v2/partials/header-nav.html b/assets/theme-v2/partials/header-nav.html
index 3e15e46dd..f2c805256 100644
--- a/assets/theme-v2/partials/header-nav.html
+++ b/assets/theme-v2/partials/header-nav.html
@@ -66,9 +66,9 @@
MIDIMusicParticles
+ Text To SpeechVideosVoice Capture
- Voice OutputVoices
diff --git a/docs_build/dev/reports/PR_26171_037-text2speech-functional-tool-rebuild-manual-validation.md b/docs_build/dev/reports/PR_26171_037-text2speech-functional-tool-rebuild-manual-validation.md
new file mode 100644
index 000000000..46ad44610
--- /dev/null
+++ b/docs_build/dev/reports/PR_26171_037-text2speech-functional-tool-rebuild-manual-validation.md
@@ -0,0 +1,12 @@
+# PR_26171_037 Manual Validation Notes
+
+## Manual Review
+- Reviewed the rebuilt active page at `toolbox/text-to-speech/index.html`.
+- Confirmed the page uses Theme V2 paths and shared toolbox partials.
+- Confirmed the creator workflow exposes text input, voice selection, rate, pitch, volume, Speak, and Stop controls.
+- Confirmed the page copy no longer blocks browser preview behind provider-not-implemented behavior.
+- Confirmed unavailable speech synthesis has visible actionable status text.
+- Confirmed the incorrect `tools/text2speech/` path is absent.
+
+## Environment Note
+Audio output was validated through a Playwright Web Speech API stub that records `speak` and `cancel` calls. Physical speaker playback was not audited in this headless validation environment.
diff --git a/docs_build/dev/reports/PR_26171_037-text2speech-functional-tool-rebuild-requirements.md b/docs_build/dev/reports/PR_26171_037-text2speech-functional-tool-rebuild-requirements.md
new file mode 100644
index 000000000..694044c12
--- /dev/null
+++ b/docs_build/dev/reports/PR_26171_037-text2speech-functional-tool-rebuild-requirements.md
@@ -0,0 +1,22 @@
+# PR_26171_037 Requirement Checklist
+
+| Requirement | Result | Notes |
+| --- | --- | --- |
+| Use archive `old_text2speech-V2` as behavior reference only | PASS | Reviewed archive controls and engine behavior; rebuilt in current architecture. |
+| Active tool path is `toolbox/text-to-speech/` | PASS | Page and module live under the active toolbox path. |
+| Restore browser TTS capability | PASS | Browser preview uses `TextToSpeechEngine` and Web Speech API. |
+| Creator can enter text | PASS | Textarea is wired into preview request creation. |
+| Creator can select available browser voice | PASS | Voice select is populated from browser voices and handles empty state. |
+| Creator can adjust rate, pitch, and volume | PASS | Sliders update visible values and preview request options. |
+| Speak/Preview can call browser TTS | PASS | Playwright confirms `speechSynthesis.speak` path is called when available. |
+| Stop speech | PASS | Playwright confirms Stop calls cancel. |
+| Visible actionable unavailable-engine error | PASS | Missing Web Speech API shows an unavailable status and disables preview actions. |
+| Do not block browser TTS behind provider not implemented | PASS | Browser provider is implemented locally; paid providers remain planning only. |
+| Remove placeholder-only provider behavior | PASS | Placeholder generation/export shell behavior was removed from active preview path. |
+| JavaScript external only | PASS | Page references external scripts only. |
+| No inline script/style/event handlers | PASS | Targeted static validation passed. |
+| Theme V2 only | PASS | Page references Theme V2 stylesheet and shared partials. |
+| No fake generation | PASS | No fake audio generation added. |
+| No database tables | PASS | No schema or database table changes made. |
+| No external paid provider integration | PASS | Paid provider adapters are planning metadata only. |
+| Remove incorrect `tools/text2speech` path | PASS | Static check confirms the path is absent. |
diff --git a/docs_build/dev/reports/PR_26171_037-text2speech-functional-tool-rebuild-validation.md b/docs_build/dev/reports/PR_26171_037-text2speech-functional-tool-rebuild-validation.md
new file mode 100644
index 000000000..65263eb9a
--- /dev/null
+++ b/docs_build/dev/reports/PR_26171_037-text2speech-functional-tool-rebuild-validation.md
@@ -0,0 +1,27 @@
+# PR_26171_037 Validation Report
+
+## Commands
+- `node --test tests\tools\Text2SpeechShell.test.mjs` - PASS
+- `npx playwright test tests/playwright/tools/TextToSpeechFunctional.spec.mjs --project=playwright --workers=1 --reporter=list` - PASS
+- Targeted static Text To Speech validation script - PASS
+- `git diff --check` - PASS
+- `npm run test:workspace-v2` - FAIL
+
+## Targeted Coverage
+- Page loads from `toolbox/text-to-speech/index.html`.
+- Text input updates the preview model.
+- Voice select renders the available browser voice list and empty/unavailable state.
+- Rate, pitch, and volume sliders update visible values.
+- Speak calls the browser TTS path when Web Speech API support is available.
+- Stop calls `speechSynthesis.cancel()` through the engine.
+- Missing Web Speech API support shows a visible actionable error.
+- No inline scripts, style blocks, inline styles, or inline event handlers were detected.
+- `tools/text2speech/` was absent.
+
+## Project Workspace Command Note
+`npm run test:workspace-v2` is the legacy command name for Project Workspace validation. The command ran and failed in `tests/playwright/tools/RootToolsFutureState.spec.mjs` on five broad root/toolbox expectations:
+- Root tools list expected `[data-tools-accordion-list] .control-card` entries but found none.
+- Common header test did not find `header.site-header` on one active page.
+- Learn/tool template/representative tool tests reported failed requests to `http://127.0.0.1:5501/api/...`.
+
+The targeted Text To Speech unit, static, and Playwright validations passed after the functional rebuild.
diff --git a/docs_build/dev/reports/PR_26171_037-text2speech-functional-tool-rebuild.md b/docs_build/dev/reports/PR_26171_037-text2speech-functional-tool-rebuild.md
new file mode 100644
index 000000000..da30e7bcb
--- /dev/null
+++ b/docs_build/dev/reports/PR_26171_037-text2speech-functional-tool-rebuild.md
@@ -0,0 +1,23 @@
+# PR_26171_037 Text To Speech Functional Tool Rebuild
+
+## Purpose
+- Rebuilt Text To Speech as a functional browser TTS tool in the active path `toolbox/text-to-speech/`.
+- Used `archive/v1-v2/tools/old_text2speech-V2` as behavior reference material only.
+- Kept browser Web Speech API as the local functional engine for this PR.
+
+## Implementation
+- Replaced the placeholder-only Text To Speech page with a Theme V2 / Tool Template V2 aligned workspace surface.
+- Added creator text entry, browser voice selection, rate, pitch, and volume controls with visible values.
+- Wired Speak and Stop actions through the existing `TextToSpeechEngine` Web Speech API wrapper.
+- Added visible actionable unavailable-engine messaging when `speechSynthesis` is not present.
+- Removed provider-not-implemented blocking behavior from the browser preview path.
+- Kept future paid provider adapters as planning metadata only.
+- Updated current toolbox registration and shared navigation labels from `Voice Output` to `Text To Speech`.
+- Confirmed `tools/text2speech/` does not exist.
+
+## Scope Notes
+- No archived implementation was copied directly.
+- No fake generation was added.
+- No database tables were added.
+- No external paid provider integration was added.
+- JavaScript remains external with no inline script blocks, style blocks, inline styles, or inline event handlers.
diff --git a/docs_build/dev/reports/codex_changed_files.txt b/docs_build/dev/reports/codex_changed_files.txt
index d61247095..a81ca9de5 100644
--- a/docs_build/dev/reports/codex_changed_files.txt
+++ b/docs_build/dev/reports/codex_changed_files.txt
@@ -1,34 +1,32 @@
# git status --short
-M docs_build/dev/reports/codex_changed_files.txt
- M docs_build/dev/reports/codex_review.diff
+M assets/theme-v2/partials/header-nav.html
+ M src/dev-runtime/admin/header-nav.local.html
+ M src/dev-runtime/persistence/tool-repositories/game-journey-mock-repository.js
+ M src/dev-runtime/server/local-api-router.mjs
+ M src/shared/toolbox/tool-metadata-inventory.js
+ M tests/tools/Text2SpeechShell.test.mjs
M toolbox/text-to-speech/index.html
-?? docs_build/dev/reports/PR_26171_027-text2speech-rebuild-foundation.md
-?? docs_build/dev/reports/PR_26171_029-text2speech-tool-shell.md
-?? docs_build/dev/reports/PR_26171_031-text2speech-message-model.md
-?? docs_build/dev/reports/PR_26171_033-text2speech-generation-workflow.md
-?? docs_build/dev/reports/PR_26171_035-text2speech-provider-adapter-plan.md
-?? docs_build/dev/reports/PR_26171_text2speech-manual-validation.md
-?? docs_build/dev/reports/PR_26171_text2speech-toolbox-path-correction.md
-?? docs_build/dev/reports/PR_26171_text2speech-validation.md
-?? docs_build/dev/reports/PR_26171_text2speech-zip-verification.md
-?? tests/tools/Text2SpeechShell.test.mjs
-?? toolbox/text-to-speech/text2speech.js
+ M toolbox/text-to-speech/text2speech.js
+?? docs_build/dev/reports/PR_26171_037-text2speech-functional-tool-rebuild-manual-validation.md
+?? docs_build/dev/reports/PR_26171_037-text2speech-functional-tool-rebuild-requirements.md
+?? docs_build/dev/reports/PR_26171_037-text2speech-functional-tool-rebuild-validation.md
+?? docs_build/dev/reports/PR_26171_037-text2speech-functional-tool-rebuild.md
+?? tests/playwright/tools/TextToSpeechFunctional.spec.mjs
# git ls-files --others --exclude-standard
-docs_build/dev/reports/PR_26171_027-text2speech-rebuild-foundation.md
-docs_build/dev/reports/PR_26171_029-text2speech-tool-shell.md
-docs_build/dev/reports/PR_26171_031-text2speech-message-model.md
-docs_build/dev/reports/PR_26171_033-text2speech-generation-workflow.md
-docs_build/dev/reports/PR_26171_035-text2speech-provider-adapter-plan.md
-docs_build/dev/reports/PR_26171_text2speech-manual-validation.md
-docs_build/dev/reports/PR_26171_text2speech-toolbox-path-correction.md
-docs_build/dev/reports/PR_26171_text2speech-validation.md
-docs_build/dev/reports/PR_26171_text2speech-zip-verification.md
-tests/tools/Text2SpeechShell.test.mjs
-toolbox/text-to-speech/text2speech.js
+docs_build/dev/reports/PR_26171_037-text2speech-functional-tool-rebuild-manual-validation.md
+docs_build/dev/reports/PR_26171_037-text2speech-functional-tool-rebuild-requirements.md
+docs_build/dev/reports/PR_26171_037-text2speech-functional-tool-rebuild-validation.md
+docs_build/dev/reports/PR_26171_037-text2speech-functional-tool-rebuild.md
+tests/playwright/tools/TextToSpeechFunctional.spec.mjs
# git diff --stat
-docs_build/dev/reports/codex_changed_files.txt | 40 +-
- docs_build/dev/reports/codex_review.diff | 1428 ++++++++++++++++++++++--
- toolbox/text-to-speech/index.html | 76 +-
- 3 files changed, 1406 insertions(+), 138 deletions(-)
\ No newline at end of file
+assets/theme-v2/partials/header-nav.html | 2 +-
+ src/dev-runtime/admin/header-nav.local.html | 2 +-
+ .../game-journey-mock-repository.js | 2 +-
+ src/dev-runtime/server/local-api-router.mjs | 13 +-
+ src/shared/toolbox/tool-metadata-inventory.js | 27 ++-
+ tests/tools/Text2SpeechShell.test.mjs | 36 ++-
+ toolbox/text-to-speech/index.html | 78 ++++---
+ toolbox/text-to-speech/text2speech.js | 260 +++++++++++++++++----
+ 8 files changed, 309 insertions(+), 111 deletions(-)
\ No newline at end of file
diff --git a/docs_build/dev/reports/codex_review.diff b/docs_build/dev/reports/codex_review.diff
index 74763f05d..c3ccc02a0 100644
--- a/docs_build/dev/reports/codex_review.diff
+++ b/docs_build/dev/reports/codex_review.diff
@@ -1,2043 +1,957 @@
-diff --git a/docs_build/dev/reports/codex_changed_files.txt b/docs_build/dev/reports/codex_changed_files.txt
-index 58b5f9aa4..402777616 100644
---- a/docs_build/dev/reports/codex_changed_files.txt
-+++ b/docs_build/dev/reports/codex_changed_files.txt
-@@ -1,6 +1,34 @@
--docs_build/dev/PROJECT_INSTRUCTIONS.md
--docs_build/dev/reports/PR_26171_025-codex-git-workflow-ownership.md
--docs_build/dev/reports/PR_26171_025-codex-git-workflow-ownership-validation.md
--docs_build/dev/reports/PR_26171_025-codex-git-workflow-ownership-manual-validation.md
--docs_build/dev/reports/codex_review.diff
--docs_build/dev/reports/codex_changed_files.txt
-+# git status --short
-+M docs_build/dev/reports/codex_changed_files.txt
-+ M docs_build/dev/reports/codex_review.diff
-+ M toolbox/text-to-speech/index.html
-+?? docs_build/dev/reports/PR_26171_027-text2speech-rebuild-foundation.md
-+?? docs_build/dev/reports/PR_26171_029-text2speech-tool-shell.md
-+?? docs_build/dev/reports/PR_26171_031-text2speech-message-model.md
-+?? docs_build/dev/reports/PR_26171_033-text2speech-generation-workflow.md
-+?? docs_build/dev/reports/PR_26171_035-text2speech-provider-adapter-plan.md
-+?? docs_build/dev/reports/PR_26171_text2speech-manual-validation.md
-+?? docs_build/dev/reports/PR_26171_text2speech-toolbox-path-correction.md
-+?? docs_build/dev/reports/PR_26171_text2speech-validation.md
-+?? docs_build/dev/reports/PR_26171_text2speech-zip-verification.md
-+?? tests/tools/Text2SpeechShell.test.mjs
-+?? toolbox/text-to-speech/text2speech.js
-+
-+# git ls-files --others --exclude-standard
-+docs_build/dev/reports/PR_26171_027-text2speech-rebuild-foundation.md
-+docs_build/dev/reports/PR_26171_029-text2speech-tool-shell.md
-+docs_build/dev/reports/PR_26171_031-text2speech-message-model.md
-+docs_build/dev/reports/PR_26171_033-text2speech-generation-workflow.md
-+docs_build/dev/reports/PR_26171_035-text2speech-provider-adapter-plan.md
-+docs_build/dev/reports/PR_26171_text2speech-manual-validation.md
-+docs_build/dev/reports/PR_26171_text2speech-toolbox-path-correction.md
-+docs_build/dev/reports/PR_26171_text2speech-validation.md
-+docs_build/dev/reports/PR_26171_text2speech-zip-verification.md
-+tests/tools/Text2SpeechShell.test.mjs
-+toolbox/text-to-speech/text2speech.js
-+
-+# git diff --stat
-+docs_build/dev/reports/codex_changed_files.txt | 16 +-
-+ docs_build/dev/reports/codex_review.diff | 740 ++++++++++++++++++++-----
-+ toolbox/text-to-speech/index.html | 76 ++-
-+ 3 files changed, 689 insertions(+), 143 deletions(-)
-\ No newline at end of file
-diff --git a/docs_build/dev/reports/codex_review.diff b/docs_build/dev/reports/codex_review.diff
-index 937e4526c..89effeec9 100644
---- a/docs_build/dev/reports/codex_review.diff
-+++ b/docs_build/dev/reports/codex_review.diff
-@@ -1,131 +1,1321 @@
--diff --git a/docs_build/dev/PROJECT_INSTRUCTIONS.md b/docs_build/dev/PROJECT_INSTRUCTIONS.md
--index 055919ceb..8ec5d3681 100644
----- a/docs_build/dev/PROJECT_INSTRUCTIONS.md
--+++ b/docs_build/dev/PROJECT_INSTRUCTIONS.md
--@@ -1890,3 +1890,46 @@ Rules:
-- - Do not introduce new report/test prose that describes the current user-facing experience as `Workspace V2`.
-- - Existing package scripts such as `npm run test:workspace-v2`, legacy lane identifiers, and historical test suite names may remain until renamed by a dedicated cleanup PR.
-- - When a report invokes a legacy command name such as `npm run test:workspace-v2`, the report must explain that the command name is legacy and the user-facing product language is `Game Hub`.
--+
--+## CODEX GIT WORKFLOW OWNERSHIP
--+
--+Codex owns Git execution for implementation PRs.
--+
--+Required workflow:
--+1. Verify current branch.
--+2. Checkout main.
--+3. Pull latest main.
--+4. Verify clean repository.
--+5. Create PR branch.
--+6. Implement changes.
--+7. Stage only scoped files.
--+8. Commit.
--+9. Push branch to GitHub.
--+10. Create Pull Request automatically.
--+11. Resolve merge conflicts if encountered.
--+12. Re-run validation after conflict resolution.
--+13. Merge PR.
--+14. Return to main.
--+15. Pull latest main.
--+16. Continue to next approved PR.
--+
--+Rules:
--+- Do not ask the user if a PR should be created.
--+- Do not ask the user if a branch should be pushed.
--+- Treat PR creation as required.
--+- Treat branch push as required.
--+- Treat merge as required after validation passes.
--+- If GitHub prompts `Would you like to create a Pull Request?`, answer YES automatically.
--+- If merge conflicts occur:
--+ - preserve latest main
--+ - preserve PR scope
--+ - avoid unrelated cleanup
--+ - revalidate before merge
--+
--+Required Git workflow report fields:
--+- current branch
--+- created branch
--+- push result
--+- PR URL
--+- merge result
--+- final main commit
--diff --git a/docs_build/dev/reports/PR_26171_025-codex-git-workflow-ownership-manual-validation.md b/docs_build/dev/reports/PR_26171_025-codex-git-workflow-ownership-manual-validation.md
-+diff --git a/docs_build/dev/reports/codex_changed_files.txt b/docs_build/dev/reports/codex_changed_files.txt
-+index 58b5f9aa4..4939322ca 100644
-+--- a/docs_build/dev/reports/codex_changed_files.txt
-++++ b/docs_build/dev/reports/codex_changed_files.txt
-+@@ -1,6 +1,12 @@
-+-docs_build/dev/PROJECT_INSTRUCTIONS.md
-+-docs_build/dev/reports/PR_26171_025-codex-git-workflow-ownership.md
-+-docs_build/dev/reports/PR_26171_025-codex-git-workflow-ownership-validation.md
-+-docs_build/dev/reports/PR_26171_025-codex-git-workflow-ownership-manual-validation.md
-+-docs_build/dev/reports/codex_review.diff
-++docs_build/dev/reports/PR_26171_027-text2speech-rebuild-foundation.md
-++docs_build/dev/reports/PR_26171_029-text2speech-tool-shell.md
-++docs_build/dev/reports/PR_26171_031-text2speech-message-model.md
-++docs_build/dev/reports/PR_26171_033-text2speech-generation-workflow.md
-++docs_build/dev/reports/PR_26171_035-text2speech-provider-adapter-plan.md
-++docs_build/dev/reports/PR_26171_text2speech-manual-validation.md
-++docs_build/dev/reports/PR_26171_text2speech-validation.md
-+ docs_build/dev/reports/codex_changed_files.txt
-++docs_build/dev/reports/codex_review.diff
-++tests/tools/Text2SpeechShell.test.mjs
-++tools/text2speech/index.html
-++tools/text2speech/text2speech.js
-+diff --git a/docs_build/dev/reports/codex_review.diff b/docs_build/dev/reports/codex_review.diff
-+index 937e4526c..31471e965 100644
-+--- a/docs_build/dev/reports/codex_review.diff
-++++ b/docs_build/dev/reports/codex_review.diff
-+@@ -1,131 +1,621 @@
-+-diff --git a/docs_build/dev/PROJECT_INSTRUCTIONS.md b/docs_build/dev/PROJECT_INSTRUCTIONS.md
-+-index 055919ceb..8ec5d3681 100644
-+---- a/docs_build/dev/PROJECT_INSTRUCTIONS.md
-+-+++ b/docs_build/dev/PROJECT_INSTRUCTIONS.md
-+-@@ -1890,3 +1890,46 @@ Rules:
-+- - Do not introduce new report/test prose that describes the current user-facing experience as `Workspace V2`.
-+- - Existing package scripts such as `npm run test:workspace-v2`, legacy lane identifiers, and historical test suite names may remain until renamed by a dedicated cleanup PR.
-+- - When a report invokes a legacy command name such as `npm run test:workspace-v2`, the report must explain that the command name is legacy and the user-facing product language is `Game Hub`.
-+-+
-+-+## CODEX GIT WORKFLOW OWNERSHIP
-+-+
-+-+Codex owns Git execution for implementation PRs.
-+-+
-+-+Required workflow:
-+-+1. Verify current branch.
-+-+2. Checkout main.
-+-+3. Pull latest main.
-+-+4. Verify clean repository.
-+-+5. Create PR branch.
-+-+6. Implement changes.
-+-+7. Stage only scoped files.
-+-+8. Commit.
-+-+9. Push branch to GitHub.
-+-+10. Create Pull Request automatically.
-+-+11. Resolve merge conflicts if encountered.
-+-+12. Re-run validation after conflict resolution.
-+-+13. Merge PR.
-+-+14. Return to main.
-+-+15. Pull latest main.
-+-+16. Continue to next approved PR.
-+-+
-+-+Rules:
-+-+- Do not ask the user if a PR should be created.
-+-+- Do not ask the user if a branch should be pushed.
-+-+- Treat PR creation as required.
-+-+- Treat branch push as required.
-+-+- Treat merge as required after validation passes.
-+-+- If GitHub prompts `Would you like to create a Pull Request?`, answer YES automatically.
-+-+- If merge conflicts occur:
-+-+ - preserve latest main
-+-+ - preserve PR scope
-+-+ - avoid unrelated cleanup
-+-+ - revalidate before merge
-+-+
-+-+Required Git workflow report fields:
-+-+- current branch
-+-+- created branch
-+-+- push result
-+-+- PR URL
-+-+- merge result
-+-+- final main commit
-+-diff --git a/docs_build/dev/reports/PR_26171_025-codex-git-workflow-ownership-manual-validation.md b/docs_build/dev/reports/PR_26171_025-codex-git-workflow-ownership-manual-validation.md
-++diff --git a/docs_build/dev/reports/PR_26171_027-text2speech-rebuild-foundation.md b/docs_build/dev/reports/PR_26171_027-text2speech-rebuild-foundation.md
-+ new file mode 100644
-+-index 000000000..66dca5470
-++index 0000000..b691791
-+ --- /dev/null
-+-+++ b/docs_build/dev/reports/PR_26171_025-codex-git-workflow-ownership-manual-validation.md
-+-@@ -0,0 +1,15 @@
-+-+# PR_26171_025 Manual Validation Notes
-+-+
-+-+## Manual Review
-+-+- Confirmed `docs_build/dev/PROJECT_INSTRUCTIONS.md` contains a new `CODEX GIT WORKFLOW OWNERSHIP` section.
-+-+- Confirmed the section states that Codex owns Git execution for implementation PRs.
-+-+- Confirmed the required 16-step workflow is present.
-+-+- Confirmed branch push, Pull Request creation, and merge are documented as required.
-+-+- Confirmed the GitHub prompt instruction says to answer YES automatically.
-+-+- Confirmed merge conflict handling preserves latest `main`, preserves PR scope, avoids unrelated cleanup, and requires revalidation before merge.
-+-+- Confirmed required reporting fields are listed.
-+-+
-+-+## Out Of Scope Confirmed
-+-+- No runtime implementation was added.
-+-+- No UI behavior was changed.
-+-+- No database behavior was changed.
-+-diff --git a/docs_build/dev/reports/PR_26171_025-codex-git-workflow-ownership-validation.md b/docs_build/dev/reports/PR_26171_025-codex-git-workflow-ownership-validation.md
-+++++ b/docs_build/dev/reports/PR_26171_027-text2speech-rebuild-foundation.md
-++@@ -0,0 +1,39 @@
-+++# PR_26171_027 Text2Speech Rebuild Foundation
-+++
-+++## Reference source
-+++- Reviewed `archive/v1-v2/tools/old_text2speech-V2` as historical reference only.
-+++- No archived implementation, CSS, event handlers, or runtime code was copied.
-+++
-+++## Feature inventory
-+++- Script/message text entry and review.
-+++- Voice/profile selection concepts.
-+++- Emotion or delivery tuning concepts.
-+++- Preview/generate/export workflow concepts.
-+++- Provider choice as a future integration seam.
-+++
-+++## UX inventory
-+++- Creator needs a clear distinction between design-owned message text and audio-owned generated voice assets.
-+++- Creator needs workflow state labels before provider integration exists.
-+++- Creator needs visible blocked states instead of silent fallback behavior.
-+++- Creator needs future provider readiness notes without exposing fake generation.
-+++
-+++## Data model notes
-+++- Message: design-owned text, language, emotion, status, metadata, and optional project linkage.
-+++- Emotion: named delivery intent with safe scalar settings.
-+++- Voice Profile: creator-facing desired voice/provider settings; generated output remains audio-owned.
-+++- Language: BCP-47-style language code and display name.
-+++- Status: draft, ready for preview, pending generation, generated, exported, blocked, archived.
-+++- Audio ownership: generated clips, files, provider artifacts, and export bundles belong to Audio.
-+++
-+++## Gap analysis
-+++- Current hidden Voice Output shell has no creator workflow model.
-+++- Current Message Studio speech testing is browser preview oriented and not a generated-audio pipeline.
-+++- Provider adapters require planning before any external service implementation.
-+++- Export requires explicit generated asset references; no browser-owned product data should be persisted.
-+++
-+++## Rebuild plan
-+++1. Create a Theme V2 text2speech shell under `/tools/text2speech`.
-+++2. Add a TTS message model foundation with explicit ownership boundaries.
-+++3. Add preview/generate/export shell states with blocked provider behavior.
-+++4. Add provider adapter plan for future OpenAI, ElevenLabs, Azure, and local providers.
-+++5. Keep implementation provider-free until a later scoped PR adds a real adapter.
-++diff --git a/docs_build/dev/reports/PR_26171_029-text2speech-tool-shell.md b/docs_build/dev/reports/PR_26171_029-text2speech-tool-shell.md
-+ new file mode 100644
-+-index 000000000..36314e518
-++index 0000000..dbbd19e
-+ --- /dev/null
-+-+++ b/docs_build/dev/reports/PR_26171_025-codex-git-workflow-ownership-validation.md
-+-@@ -0,0 +1,17 @@
-+-+# PR_26171_025 Validation Report
-+-+
-+-+## Validation Performed
-+-+- PASS: `npm run test:playwright:static`
-+-+
-+-+## Result
-+-+- Static/docs validation completed successfully.
-+-+- No browser Playwright validation was run because this PR is docs-only governance.
-+-+
-+-+## Scope Control
-+-+- Runtime implementation validation was skipped because no runtime files were intentionally changed for PR_26171_025.
-+-+- UI validation was skipped because no UI files were intentionally changed for PR_26171_025.
-+-+- Database validation was skipped because no database files or runtime persistence behavior were intentionally changed for PR_26171_025.
-+-+
-+-+## Repository State Note
-+-+- The working tree had pre-existing unrelated changes and unresolved generated report conflicts in `codex_changed_files.txt` and `codex_review.diff` before this PR_025 work began.
-+-+- PR_26171_025 reports and standard Codex report files were regenerated for the governance change.
-+-diff --git a/docs_build/dev/reports/PR_26171_025-codex-git-workflow-ownership.md b/docs_build/dev/reports/PR_26171_025-codex-git-workflow-ownership.md
-+++++ b/docs_build/dev/reports/PR_26171_029-text2speech-tool-shell.md
-++@@ -0,0 +1,3 @@
-+++# PR_26171_029 Text2Speech Tool Shell
-+++
-+++Created `/tools/text2speech` with a Theme V2 page shell, current shared partials, ToolDisplayMode host usage, and Project Workspace-facing copy. No inline styles, style blocks, inline event handlers, page-local CSS, or tool-local CSS were added.
-++diff --git a/docs_build/dev/reports/PR_26171_031-text2speech-message-model.md b/docs_build/dev/reports/PR_26171_031-text2speech-message-model.md
-++new file mode 100644
-++index 0000000..fd778be
-++--- /dev/null
-+++++ b/docs_build/dev/reports/PR_26171_031-text2speech-message-model.md
-++@@ -0,0 +1,3 @@
-+++# PR_26171_031 Text2Speech Message Model
-+++
-+++Added a provider-free Text2Speech model foundation for Message, Emotion Profile, Voice Profile, Language, Status, and creator metadata. Message data is marked Design-owned. Generated voice/audio ownership is explicitly marked Audio-owned.
-++diff --git a/docs_build/dev/reports/PR_26171_033-text2speech-generation-workflow.md b/docs_build/dev/reports/PR_26171_033-text2speech-generation-workflow.md
-++new file mode 100644
-++index 0000000..57cdc3a
-++--- /dev/null
-+++++ b/docs_build/dev/reports/PR_26171_033-text2speech-generation-workflow.md
-++@@ -0,0 +1,3 @@
-+++# PR_26171_033 Text2Speech Generation Workflow
-+++
-+++Added preview/generate/export workflow shell functions and UI controls. Preview validates readiness. Generate is blocked because no provider adapter is implemented. Export is blocked until an Audio-owned generated asset exists. No fake generation or silent fallback was added.
-++diff --git a/docs_build/dev/reports/PR_26171_035-text2speech-provider-adapter-plan.md b/docs_build/dev/reports/PR_26171_035-text2speech-provider-adapter-plan.md
-+ new file mode 100644
-+-index 000000000..dd6d449d5
-++index 0000000..991fa4f
-+ --- /dev/null
-+-+++ b/docs_build/dev/reports/PR_26171_025-codex-git-workflow-ownership.md
-+-@@ -0,0 +1,30 @@
-+-+# PR_26171_025 Codex Git Workflow Ownership
-+-+
-+-+## Summary
-+-+- Added the `CODEX GIT WORKFLOW OWNERSHIP` governance section to `docs_build/dev/PROJECT_INSTRUCTIONS.md`.
-+-+- Established that Codex owns Git execution for implementation PRs.
-+-+- Documented the required branch, pull, clean-status, PR branch, scoped staging, commit, push, automatic Pull Request creation, conflict resolution, validation rerun, merge, return-to-main, and continuation flow.
-+-+
-+-+## Scope
-+-+- Docs-only governance update.
-+-+- No runtime implementation.
-+-+- No UI changes.
-+-+- No database changes.
-+-+
-+-+## Governance Intent
-+-+- Codex should not ask the user whether to push a branch or create a Pull Request for implementation PRs.
-+-+- Branch push, Pull Request creation, and merge after passing validation are required implementation PR workflow steps.
-+-+- Merge conflicts must preserve latest `main`, preserve PR scope, avoid unrelated cleanup, and revalidate before merge.
-+-+
-+-+## Required Git Workflow Report Fields
-+-+- current branch
-+-+- created branch
-+-+- push result
-+-+- PR URL
-+-+- merge result
-+-+- final main commit
-+-+
-+-+## Current Execution Notes
-+-+- Current branch at validation time: `main`.
-+-+- This PR_025 task was docs-only and did not create runtime changes.
-+-+- The repository already contained unrelated staged changes and unresolved generated report conflicts before this PR_025 edit began; those unrelated files were preserved.
-+++++ b/docs_build/dev/reports/PR_26171_035-text2speech-provider-adapter-plan.md
-++@@ -0,0 +1,3 @@
-+++# PR_26171_035 Text2Speech Provider Adapter Plan
-+++
-+++Added future provider planning entries for OpenAI, ElevenLabs, Azure AI Speech, and local providers. Entries document boundaries and required capabilities only; no provider implementation or external network integration was added.
-++diff --git a/docs_build/dev/reports/PR_26171_text2speech-manual-validation.md b/docs_build/dev/reports/PR_26171_text2speech-manual-validation.md
-++new file mode 100644
-++index 0000000..59723df
-++--- /dev/null
-+++++ b/docs_build/dev/reports/PR_26171_text2speech-manual-validation.md
-++@@ -0,0 +1,6 @@
-+++# Text2Speech Manual Validation Notes
-+++
-+++- Reviewed `/tools/text2speech/index.html` for Theme V2 stylesheet usage only.
-+++- Confirmed no inline styles, style blocks, inline event handlers, page-local CSS, or tool-local CSS were introduced.
-+++- Confirmed archived `old_text2speech-V2` code was treated as reference material only and not copied.
-+++- Browser screenshot was not captured because Playwright Chromium is not installed in this environment.
-++diff --git a/docs_build/dev/reports/PR_26171_text2speech-validation.md b/docs_build/dev/reports/PR_26171_text2speech-validation.md
-++new file mode 100644
-++index 0000000..27a843d
-++--- /dev/null
-+++++ b/docs_build/dev/reports/PR_26171_text2speech-validation.md
-++@@ -0,0 +1,11 @@
-+++# Text2Speech Validation Report
-+++
-+++## Commands
-+++- `node --test tests/tools/Text2SpeechShell.test.mjs` — passed.
-+++- `npm test -- tests/tools/Text2SpeechShell.test.mjs` — failed during existing shared extraction guard pretest before the targeted test ran; unexpected baseline violations are reported in existing files outside this change.
-+++- `npm run test:workspace-v2` — blocked by missing Playwright Chromium executable at `/root/.cache/ms-playwright/chromium-1217/chrome-linux64/chrome`.
-+++
-+++## Targeted assertions
-+++- Model ownership boundary is Design for messages/profiles and Audio for generated voice assets.
-+++- Preview/generate/export shell does not silently fall back.
-+++- Future provider adapter list is planning-only for OpenAI, ElevenLabs, Azure, and local providers.
-++diff --git a/docs_build/dev/reports/codex_changed_files.txt b/docs_build/dev/reports/codex_changed_files.txt
-++index 58b5f9a..1c28b63 100644
-++--- a/docs_build/dev/reports/codex_changed_files.txt
-+++++ b/docs_build/dev/reports/codex_changed_files.txt
-++@@ -1,6 +1,11 @@
-++-docs_build/dev/PROJECT_INSTRUCTIONS.md
-++-docs_build/dev/reports/PR_26171_025-codex-git-workflow-ownership.md
-++-docs_build/dev/reports/PR_26171_025-codex-git-workflow-ownership-validation.md
-++-docs_build/dev/reports/PR_26171_025-codex-git-workflow-ownership-manual-validation.md
-++-docs_build/dev/reports/codex_review.diff
-+++docs_build/dev/reports/PR_26171_027-text2speech-rebuild-foundation.md
-+++docs_build/dev/reports/PR_26171_029-text2speech-tool-shell.md
-+++docs_build/dev/reports/PR_26171_031-text2speech-message-model.md
-+++docs_build/dev/reports/PR_26171_033-text2speech-generation-workflow.md
-+++docs_build/dev/reports/PR_26171_035-text2speech-provider-adapter-plan.md
-+++docs_build/dev/reports/PR_26171_text2speech-manual-validation.md
-+++docs_build/dev/reports/PR_26171_text2speech-validation.md
-++ docs_build/dev/reports/codex_changed_files.txt
-+++docs_build/dev/reports/codex_review.diff
-+++tests/tools/Text2SpeechShell.test.mjs
-+++tools/
-++diff --git a/docs_build/dev/reports/codex_review.diff b/docs_build/dev/reports/codex_review.diff
-++index 937e452..0fd11f5 100644
-++--- a/docs_build/dev/reports/codex_review.diff
-+++++ b/docs_build/dev/reports/codex_review.diff
-++@@ -1,131 +0,0 @@
-++-diff --git a/docs_build/dev/PROJECT_INSTRUCTIONS.md b/docs_build/dev/PROJECT_INSTRUCTIONS.md
-++-index 055919ceb..8ec5d3681 100644
-++---- a/docs_build/dev/PROJECT_INSTRUCTIONS.md
-++-+++ b/docs_build/dev/PROJECT_INSTRUCTIONS.md
-++-@@ -1890,3 +1890,46 @@ Rules:
-++- - Do not introduce new report/test prose that describes the current user-facing experience as `Workspace V2`.
-++- - Existing package scripts such as `npm run test:workspace-v2`, legacy lane identifiers, and historical test suite names may remain until renamed by a dedicated cleanup PR.
-++- - When a report invokes a legacy command name such as `npm run test:workspace-v2`, the report must explain that the command name is legacy and the user-facing product language is `Game Hub`.
-++-+
-++-+## CODEX GIT WORKFLOW OWNERSHIP
-++-+
-++-+Codex owns Git execution for implementation PRs.
-++-+
-++-+Required workflow:
-++-+1. Verify current branch.
-++-+2. Checkout main.
-++-+3. Pull latest main.
-++-+4. Verify clean repository.
-++-+5. Create PR branch.
-++-+6. Implement changes.
-++-+7. Stage only scoped files.
-++-+8. Commit.
-++-+9. Push branch to GitHub.
-++-+10. Create Pull Request automatically.
-++-+11. Resolve merge conflicts if encountered.
-++-+12. Re-run validation after conflict resolution.
-++-+13. Merge PR.
-++-+14. Return to main.
-++-+15. Pull latest main.
-++-+16. Continue to next approved PR.
-++-+
-++-+Rules:
-++-+- Do not ask the user if a PR should be created.
-++-+- Do not ask the user if a branch should be pushed.
-++-+- Treat PR creation as required.
-++-+- Treat branch push as required.
-++-+- Treat merge as required after validation passes.
-++-+- If GitHub prompts `Would you like to create a Pull Request?`, answer YES automatically.
-++-+- If merge conflicts occur:
-++-+ - preserve latest main
-++-+ - preserve PR scope
-++-+ - avoid unrelated cleanup
-++-+ - revalidate before merge
-++-+
-++-+Required Git workflow report fields:
-++-+- current branch
-++-+- created branch
-++-+- push result
-++-+- PR URL
-++-+- merge result
-++-+- final main commit
-++-diff --git a/docs_build/dev/reports/PR_26171_025-codex-git-workflow-ownership-manual-validation.md b/docs_build/dev/reports/PR_26171_025-codex-git-workflow-ownership-manual-validation.md
-++-new file mode 100644
-++-index 000000000..66dca5470
-++---- /dev/null
-++-+++ b/docs_build/dev/reports/PR_26171_025-codex-git-workflow-ownership-manual-validation.md
-++-@@ -0,0 +1,15 @@
-++-+# PR_26171_025 Manual Validation Notes
-++-+
-++-+## Manual Review
-++-+- Confirmed `docs_build/dev/PROJECT_INSTRUCTIONS.md` contains a new `CODEX GIT WORKFLOW OWNERSHIP` section.
-++-+- Confirmed the section states that Codex owns Git execution for implementation PRs.
-++-+- Confirmed the required 16-step workflow is present.
-++-+- Confirmed branch push, Pull Request creation, and merge are documented as required.
-++-+- Confirmed the GitHub prompt instruction says to answer YES automatically.
-++-+- Confirmed merge conflict handling preserves latest `main`, preserves PR scope, avoids unrelated cleanup, and requires revalidation before merge.
-++-+- Confirmed required reporting fields are listed.
-++-+
-++-+## Out Of Scope Confirmed
-++-+- No runtime implementation was added.
-++-+- No UI behavior was changed.
-++-+- No database behavior was changed.
-++-diff --git a/docs_build/dev/reports/PR_26171_025-codex-git-workflow-ownership-validation.md b/docs_build/dev/reports/PR_26171_025-codex-git-workflow-ownership-validation.md
-++-new file mode 100644
-++-index 000000000..36314e518
-++---- /dev/null
-++-+++ b/docs_build/dev/reports/PR_26171_025-codex-git-workflow-ownership-validation.md
-++-@@ -0,0 +1,17 @@
-++-+# PR_26171_025 Validation Report
-++-+
-++-+## Validation Performed
-++-+- PASS: `npm run test:playwright:static`
-++-+
-++-+## Result
-++-+- Static/docs validation completed successfully.
-++-+- No browser Playwright validation was run because this PR is docs-only governance.
-++-+
-++-+## Scope Control
-++-+- Runtime implementation validation was skipped because no runtime files were intentionally changed for PR_26171_025.
-++-+- UI validation was skipped because no UI files were intentionally changed for PR_26171_025.
-++-+- Database validation was skipped because no database files or runtime persistence behavior were intentionally changed for PR_26171_025.
-++-+
-++-+## Repository State Note
-++-+- The working tree had pre-existing unrelated changes and unresolved generated report conflicts in `codex_changed_files.txt` and `codex_review.diff` before this PR_025 work began.
-++-+- PR_26171_025 reports and standard Codex report files were regenerated for the governance change.
-++-diff --git a/docs_build/dev/reports/PR_26171_025-codex-git-workflow-ownership.md b/docs_build/dev/reports/PR_26171_025-codex-git-workflow-ownership.md
-++-new file mode 100644
-++-index 000000000..dd6d449d5
-++---- /dev/null
-++-+++ b/docs_build/dev/reports/PR_26171_025-codex-git-workflow-ownership.md
-++-@@ -0,0 +1,30 @@
-++-+# PR_26171_025 Codex Git Workflow Ownership
-++-+
-++-+## Summary
-++-+- Added the `CODEX GIT WORKFLOW OWNERSHIP` governance section to `docs_build/dev/PROJECT_INSTRUCTIONS.md`.
-++-+- Established that Codex owns Git execution for implementation PRs.
-++-+- Documented the required branch, pull, clean-status, PR branch, scoped staging, commit, push, automatic Pull Request creation, conflict resolution, validation rerun, merge, return-to-main, and continuation flow.
-++-+
-++-+## Scope
-++-+- Docs-only governance update.
-++-+- No runtime implementation.
-++-+- No UI changes.
-++-+- No database changes.
-++-+
-++-+## Governance Intent
-++-+- Codex should not ask the user whether to push a branch or create a Pull Request for implementation PRs.
-++-+- Branch push, Pull Request creation, and merge after passing validation are required implementation PR workflow steps.
-++-+- Merge conflicts must preserve latest `main`, preserve PR scope, avoid unrelated cleanup, and revalidate before merge.
-++-+
-++-+## Required Git Workflow Report Fields
-++-+- current branch
-++-+- created branch
-++-+- push result
-++-+- PR URL
-++-+- merge result
-++-+- final main commit
-++-+
-++-+## Current Execution Notes
-++-+- Current branch at validation time: `main`.
-++-+- This PR_025 task was docs-only and did not create runtime changes.
-++-+- The repository already contained unrelated staged changes and unresolved generated report conflicts before this PR_025 edit began; those unrelated files were preserved.
-++diff --git a/tests/tools/Text2SpeechShell.test.mjs b/tests/tools/Text2SpeechShell.test.mjs
-++new file mode 100644
-++index 0000000..addc8ae
-++--- /dev/null
-+++++ b/tests/tools/Text2SpeechShell.test.mjs
-++@@ -0,0 +1,49 @@
-+++import assert from "node:assert/strict";
-+++import test from "node:test";
-+++
-+++import {
-+++ TTS_MESSAGE_STATUSES,
-+++ TTS_PROVIDER_ADAPTER_PLAN,
-+++ createEmotionProfile,
-+++ createTtsMessage,
-+++ createVoiceProfile,
-+++ exportTtsMessage,
-+++ generateTtsMessage,
-+++ previewTtsMessage,
-+++} from "../../tools/text2speech/text2speech.js";
-+++
-+++test("Text2Speech message model separates Design and Audio ownership", () => {
-+++ const message = createTtsMessage({ text: "Hello", metadata: { tags: ["intro"] } });
-+++ const emotion = createEmotionProfile({ intensity: 2 });
-+++ const voice = createVoiceProfile({ providerKey: "openai" });
-+++
-+++ assert.equal(message.owner, "Design");
-+++ assert.equal(message.audioOwner, "Audio");
-+++ assert.equal(message.generatedAudio, null);
-+++ assert.deepEqual(message.metadata.tags, ["intro"]);
-+++ assert.equal(emotion.owner, "Design");
-+++ assert.equal(emotion.intensity, 1);
-+++ assert.equal(voice.owner, "Design");
-+++ assert.equal(voice.generatedAudioOwner, "Audio");
-+++ assert.ok(TTS_MESSAGE_STATUSES.includes("blocked"));
-+++});
-+++
-+++test("Text2Speech workflow blocks missing provider and missing generated asset without silent fallback", () => {
-+++ const ready = createTtsMessage({ text: "Welcome" });
-+++ const empty = createTtsMessage();
-+++
-+++ assert.equal(previewTtsMessage(ready).ok, true);
-+++ assert.equal(previewTtsMessage(empty).status, "blocked");
-+++ assert.equal(generateTtsMessage(ready).ok, false);
-+++ assert.match(generateTtsMessage(ready).message, /no TTS provider adapter/i);
-+++ assert.equal(exportTtsMessage(ready).ok, false);
-+++ assert.match(exportTtsMessage(ready).message, /Audio-owned voice asset/i);
-+++});
-+++
-+++test("Text2Speech provider adapter plan names expected future providers only", () => {
-+++ assert.deepEqual(
-+++ TTS_PROVIDER_ADAPTER_PLAN.map((provider) => provider.key),
-+++ ["openai", "elevenlabs", "azure", "local"],
-+++ );
-+++ assert.ok(TTS_PROVIDER_ADAPTER_PLAN.every((provider) => provider.status === "planned"));
-+++});
-++diff --git a/tools/text2speech/index.html b/tools/text2speech/index.html
-++new file mode 100644
-++index 0000000..e0d3ef8
-++--- /dev/null
-+++++ b/tools/text2speech/index.html
-++@@ -0,0 +1,112 @@
-+++
-+++
-+++
-+++