diff --git a/docs_build/dev/reports/PR_26171_BETA_077-tts-profile-parent-child-table-manual-validation-notes.md b/docs_build/dev/reports/PR_26171_BETA_077-tts-profile-parent-child-table-manual-validation-notes.md new file mode 100644 index 000000000..b050febf8 --- /dev/null +++ b/docs_build/dev/reports/PR_26171_BETA_077-tts-profile-parent-child-table-manual-validation-notes.md @@ -0,0 +1,11 @@ +# PR_26171_BETA_077 Manual Validation Notes + +## Review +- Confirmed the TTS Profiles table keeps profile fields in the parent row. +- Confirmed Emotion Settings open below the selected profile as a child table. +- Confirmed Add Profile and Add Emotion controls render as table rows. +- Confirmed non-name parent table cells do not open Emotion Settings. +- Confirmed no separate Emotion Studio or duplicate left-column controls were introduced. + +## Manual Browser Coverage +- Covered by targeted Playwright validation for TTS Studio load, profile expansion, child emotion rows, inline add/edit, and speech preview. diff --git a/docs_build/dev/reports/PR_26171_BETA_077-tts-profile-parent-child-table-validation-report.md b/docs_build/dev/reports/PR_26171_BETA_077-tts-profile-parent-child-table-validation-report.md new file mode 100644 index 000000000..43ad39062 --- /dev/null +++ b/docs_build/dev/reports/PR_26171_BETA_077-tts-profile-parent-child-table-validation-report.md @@ -0,0 +1,17 @@ +# PR_26171_BETA_077 Validation Report + +## Commands +- PASS: node --check toolbox/text-to-speech/text2speech.js +- PASS: node --test tests/tools/Text2SpeechShell.test.mjs +- PASS: npx playwright test tests/playwright/tools/TextToSpeechFunctional.spec.mjs +- PASS: npm run test:workspace-v2 +- PASS: git diff --check + +## Targeted Results +- Text2Speech Node contract tests: 4 passed. +- Text To Speech Playwright tests: 3 passed. +- Project Workspace legacy validation: 5 passed. + +## Notes +- npm run test:workspace-v2 is a legacy command name; user-facing language remains Project Workspace. +- Standard generated validation-report churn was restored before staging this PR. diff --git a/docs_build/dev/reports/PR_26171_BETA_077-tts-profile-parent-child-table.md b/docs_build/dev/reports/PR_26171_BETA_077-tts-profile-parent-child-table.md new file mode 100644 index 000000000..3cafc0697 --- /dev/null +++ b/docs_build/dev/reports/PR_26171_BETA_077-tts-profile-parent-child-table.md @@ -0,0 +1,19 @@ +# PR_26171_BETA_077-tts-profile-parent-child-table + +## Team Ownership +- TEAM: BETA +- Ownership source: docs_build/dev/PROJECT_MULTI_PC.txt +- Scope confirmed: Text To Speech / TTS Studio work is owned by Team BETA. + +## Summary +- Converted the TTS Profile add action into an inline parent-table action row. +- Converted the Emotion Setting add action into an inline child-table action row. +- Restricted profile expansion to the Profile Name cell so non-control parent cells remain table data. +- Added keyboard support and aria-expanded state for the Profile Name accordion trigger. + +## Scope Guard +- Theme V2 only. +- External JS only. +- No inline styles, style blocks, inline handlers, page-local CSS, or tool-local CSS. +- No duplicate left-column controls added. +- Delivery and Preset values remain in the Emotion Settings child table. diff --git a/docs_build/dev/reports/codex_changed_files.txt b/docs_build/dev/reports/codex_changed_files.txt index b4ebfab2a..10f75398a 100644 --- a/docs_build/dev/reports/codex_changed_files.txt +++ b/docs_build/dev/reports/codex_changed_files.txt @@ -1,43 +1,8 @@ docs_build/dev/reports/codex_changed_files.txt docs_build/dev/reports/codex_review.diff -docs_build/dev/reports/coverage_changed_js_guardrail.txt -docs_build/dev/reports/dependency_gating_report.md -docs_build/dev/reports/dependency_hydration_reuse_report.md -docs_build/dev/reports/execution_graph_reuse_report.md -docs_build/dev/reports/failure_fingerprint_report.md -docs_build/dev/reports/filesystem_scan_reduction_report.md -docs_build/dev/reports/incremental_validation_report.md -docs_build/dev/reports/lane_compilation_report.md -docs_build/dev/reports/lane_deduplication_report.md -docs_build/dev/reports/lane_input_validation_report.md -docs_build/dev/reports/lane_manifests/workspace-contract.json -docs_build/dev/reports/lane_runtime_optimization_report.md -docs_build/dev/reports/lane_snapshot_report.md -docs_build/dev/reports/lane_snapshots/workspace-contract.json -docs_build/dev/reports/lane_warm_start_report.md -docs_build/dev/reports/lane_warm_starts/workspace-contract.json -docs_build/dev/reports/monolith_trigger_removal_report.md -docs_build/dev/reports/persistent_lane_manifest_report.md -docs_build/dev/reports/playwright_discovery_ownership_report.md -docs_build/dev/reports/playwright_discovery_scope_report.md -docs_build/dev/reports/playwright_structure_audit.md -docs_build/dev/reports/playwright_v8_coverage_report.txt -docs_build/dev/reports/PR_26171_BETA_075-tts-message-table-cleanup-instruction-compliance-checklist.md -docs_build/dev/reports/PR_26171_BETA_075-tts-message-table-cleanup-manual-validation-notes.md -docs_build/dev/reports/PR_26171_BETA_075-tts-message-table-cleanup-validation-report.md -docs_build/dev/reports/PR_26171_BETA_075-tts-message-table-cleanup.md -docs_build/dev/reports/retry_suppression_report.md -docs_build/dev/reports/slow_path_pruning_report.md -docs_build/dev/reports/static_validation_report.md -docs_build/dev/reports/targeted_file_manifest_report.md -docs_build/dev/reports/test_cleanup_performance_report.md -docs_build/dev/reports/test_cleanup_routing_report.md -docs_build/dev/reports/testing_lane_execution_report.md -docs_build/dev/reports/validation_cache_report.md -docs_build/dev/reports/zero_browser_preflight_report.md -tests/playwright/tools/MessagesTool.spec.mjs -tests/playwright/tools/RootToolsFutureState.spec.mjs +docs_build/dev/reports/PR_26171_BETA_077-tts-profile-parent-child-table-manual-validation-notes.md +docs_build/dev/reports/PR_26171_BETA_077-tts-profile-parent-child-table-validation-report.md +docs_build/dev/reports/PR_26171_BETA_077-tts-profile-parent-child-table.md tests/playwright/tools/TextToSpeechFunctional.spec.mjs -toolbox/messages/messages.js toolbox/text-to-speech/index.html toolbox/text-to-speech/text2speech.js diff --git a/docs_build/dev/reports/codex_review.diff b/docs_build/dev/reports/codex_review.diff index 193f13667..dfe97aba7 100644 --- a/docs_build/dev/reports/codex_review.diff +++ b/docs_build/dev/reports/codex_review.diff @@ -1,2186 +1,317 @@ -diff --git a/docs_build/dev/reports/PR_26171_BETA_075-tts-message-table-cleanup-instruction-compliance-checklist.md b/docs_build/dev/reports/PR_26171_BETA_075-tts-message-table-cleanup-instruction-compliance-checklist.md +diff --git a/docs_build/dev/reports/PR_26171_BETA_077-tts-profile-parent-child-table-manual-validation-notes.md b/docs_build/dev/reports/PR_26171_BETA_077-tts-profile-parent-child-table-manual-validation-notes.md new file mode 100644 -index 000000000..5a5c8e58d +index 000000000..b050febf8 --- /dev/null -+++ b/docs_build/dev/reports/PR_26171_BETA_075-tts-message-table-cleanup-instruction-compliance-checklist.md -@@ -0,0 +1,14 @@ -+# PR_26171_BETA_075 Instruction Compliance Checklist ++++ b/docs_build/dev/reports/PR_26171_BETA_077-tts-profile-parent-child-table-manual-validation-notes.md +@@ -0,0 +1,11 @@ ++# PR_26171_BETA_077 Manual Validation Notes + -+Team: BETA ++## Review ++- Confirmed the TTS Profiles table keeps profile fields in the parent row. ++- Confirmed Emotion Settings open below the selected profile as a child table. ++- Confirmed Add Profile and Add Emotion controls render as table rows. ++- Confirmed non-name parent table cells do not open Emotion Settings. ++- Confirmed no separate Emotion Studio or duplicate left-column controls were introduced. + -+- PASS: Started from `main`. -+- PASS: Pulled latest `origin/main` before branch creation. -+- PASS: Repository was clean before creating `pr/26171-BETA-075-tts-message-table-cleanup`. -+- PASS: PR name includes required TEAM token `BETA`. -+- PASS: `docs_build/dev/PROJECT_MULTI_PC.txt` assigns Messages, Text To Speech, and TTS work to Team BETA. -+- PASS: Active implementation paths are `toolbox/text-to-speech/` and `toolbox/messages/`. -+- PASS: No `tools/text2speech/` path was created. -+- PASS: Theme V2 only; no inline styles, style blocks, inline handlers, page-local CSS, or tool-local CSS were added. -+- PASS: Validation scope includes targeted TTS Studio, targeted Message Studio, and legacy `npm run test:workspace-v2`. -+- PASS: Required reports and repo ZIP under `tmp/` are required before completion. -diff --git a/docs_build/dev/reports/PR_26171_BETA_075-tts-message-table-cleanup-manual-validation-notes.md b/docs_build/dev/reports/PR_26171_BETA_075-tts-message-table-cleanup-manual-validation-notes.md ++## Manual Browser Coverage ++- Covered by targeted Playwright validation for TTS Studio load, profile expansion, child emotion rows, inline add/edit, and speech preview. +diff --git a/docs_build/dev/reports/PR_26171_BETA_077-tts-profile-parent-child-table-validation-report.md b/docs_build/dev/reports/PR_26171_BETA_077-tts-profile-parent-child-table-validation-report.md new file mode 100644 -index 000000000..2fab2dae1 +index 000000000..43ad39062 --- /dev/null -+++ b/docs_build/dev/reports/PR_26171_BETA_075-tts-message-table-cleanup-manual-validation-notes.md -@@ -0,0 +1,10 @@ -+# PR_26171_BETA_075 Manual Validation Notes -+ -+Team: BETA -+ -+- Reviewed `toolbox/text-to-speech/index.html` and confirmed no Named Sentence, Queue, or Output Summary surface remains. -+- Reviewed `toolbox/text-to-speech/text2speech.js` and confirmed preview playback uses TTS Profile plus Emotion Settings instead of a named-sentence queue. -+- Reviewed `toolbox/messages/messages.js` and confirmed Message Parts visible columns are Text, Emotion, TTS Profile, Status, and Actions. -+- Confirmed no inline styles, style blocks, inline event handlers, page-local CSS, or tool-local CSS were added. -+- Confirmed no `tools/text2speech/` path was created. -+- Confirmed required delta ZIP path: `tmp/PR_26171_BETA_075-tts-message-table-cleanup_delta.zip`. -diff --git a/docs_build/dev/reports/PR_26171_BETA_075-tts-message-table-cleanup-validation-report.md b/docs_build/dev/reports/PR_26171_BETA_075-tts-message-table-cleanup-validation-report.md -new file mode 100644 -index 000000000..09b7cba7a ---- /dev/null -+++ b/docs_build/dev/reports/PR_26171_BETA_075-tts-message-table-cleanup-validation-report.md -@@ -0,0 +1,25 @@ -+# PR_26171_BETA_075 Validation Report -+ -+Team: BETA ++++ b/docs_build/dev/reports/PR_26171_BETA_077-tts-profile-parent-child-table-validation-report.md +@@ -0,0 +1,17 @@ ++# PR_26171_BETA_077 Validation Report + +## Commands ++- PASS: node --check toolbox/text-to-speech/text2speech.js ++- PASS: node --test tests/tools/Text2SpeechShell.test.mjs ++- PASS: npx playwright test tests/playwright/tools/TextToSpeechFunctional.spec.mjs ++- PASS: npm run test:workspace-v2 ++- PASS: git diff --check + -+- PASS: `node --check toolbox/text-to-speech/text2speech.js` -+- PASS: `node --check toolbox/messages/messages.js` -+- PASS: `npx playwright test tests/playwright/tools/TextToSpeechFunctional.spec.mjs` -+ - Result: 3 passed. -+- PASS: `npx playwright test tests/playwright/tools/MessagesTool.spec.mjs --trace=off` -+ - Result: 2 passed after scoping the Message Parts table assertion. -+- PASS: `node --test tests/tools/Text2SpeechShell.test.mjs` -+ - Result: 4 passed. -+- PASS: `npm run test:workspace-v2` -+ - Result: 5 passed. -+ - Note: Command name is legacy; user-facing language is Project Workspace and Game Hub. -+- PASS: `git diff --check` -+ - Result: no whitespace errors; Git reported line-ending notices only. -+ -+## Validation Notes ++## Targeted Results ++- Text2Speech Node contract tests: 4 passed. ++- Text To Speech Playwright tests: 3 passed. ++- Project Workspace legacy validation: 5 passed. + -+- Initial `npm run test:workspace-v2` runs exposed stale root toolbox expectations for the current registered toolbox count, duplicate Game Hub entries, and Publish group visibility. -+- Those expectations were updated in the targeted workspace test file, then the legacy workspace command passed. -+- Node emitted experimental SQLite warnings during validation; no validation failed because of those warnings. -diff --git a/docs_build/dev/reports/PR_26171_BETA_075-tts-message-table-cleanup.md b/docs_build/dev/reports/PR_26171_BETA_075-tts-message-table-cleanup.md ++## Notes ++- npm run test:workspace-v2 is a legacy command name; user-facing language remains Project Workspace. ++- Standard generated validation-report churn was restored before staging this PR. +diff --git a/docs_build/dev/reports/PR_26171_BETA_077-tts-profile-parent-child-table.md b/docs_build/dev/reports/PR_26171_BETA_077-tts-profile-parent-child-table.md new file mode 100644 -index 000000000..0da2fe50c +index 000000000..3cafc0697 --- /dev/null -+++ b/docs_build/dev/reports/PR_26171_BETA_075-tts-message-table-cleanup.md -@@ -0,0 +1,42 @@ -+# PR_26171_BETA_075 TTS Message Table Cleanup ++++ b/docs_build/dev/reports/PR_26171_BETA_077-tts-profile-parent-child-table.md +@@ -0,0 +1,19 @@ ++# PR_26171_BETA_077-tts-profile-parent-child-table + -+Team: BETA ++## Team Ownership ++- TEAM: BETA ++- Ownership source: docs_build/dev/PROJECT_MULTI_PC.txt ++- Scope confirmed: Text To Speech / TTS Studio work is owned by Team BETA. + +## Summary ++- Converted the TTS Profile add action into an inline parent-table action row. ++- Converted the Emotion Setting add action into an inline child-table action row. ++- Restricted profile expansion to the Profile Name cell so non-control parent cells remain table data. ++- Added keyboard support and aria-expanded state for the Profile Name accordion trigger. + -+- Removed the duplicate center summary text `TTS Studio` from the Text To Speech summary row. -+- Removed the stale Text To Speech left-column Voice Filters, Presets, Delivery, and Named Sentence controls. -+- Removed the stale Text To Speech Queue and right-column Output Summary surfaces. -+- Kept voice, language, gender, and age editing in the TTS Profile inline table row. -+- Kept pitch, rate, volume, and preset editing in the Emotion Settings inline table row. -+- Updated Text To Speech preview playback to speak the current text through the selected TTS Profile and selected/neutral Emotion Setting. -+- Updated Message Studio Message Parts to show Text, Emotion, TTS Profile, Status, and Actions while preserving internal display order. -+- Updated focused Playwright tests and workspace count/group expectations to match the current registered toolbox surface. -+ -+## Requirement Checklist -+ -+- PASS: Removed duplicate center-column `TTS Studio` summary text. -+- PASS: Removed duplicate left-column items that belong to Profile or Emotion Settings rows. -+- PASS: Delivery values are owned by Emotion Settings through Pitch, Rate, and Volume fields. -+- PASS: Preset value is owned by Emotion Settings through the Preset field. -+- PASS: Removed right-column Output Summary. -+- PASS: Voice Filters are owned by the Profile row dropdowns. -+- PASS: Removed Named Sentence and queue UI. -+- PASS: Removed related dead HTML, JavaScript, and test code for the stale queue/output controls. -+- PASS: Message Studio child table uses the approved visible Message Parts columns. -+- PASS: Theme V2 only; no local CSS or inline handlers/styles were added. -+ -+## Validation -+ -+- PASS: `npx playwright test tests/playwright/tools/TextToSpeechFunctional.spec.mjs` -+- PASS: `npx playwright test tests/playwright/tools/MessagesTool.spec.mjs --trace=off` -+- PASS: `node --test tests/tools/Text2SpeechShell.test.mjs` -+- PASS: `npm run test:workspace-v2` -+- PASS: `git diff --check` -+ -+`npm run test:workspace-v2` is a legacy command name; the user-facing product language remains Project Workspace and Game Hub. -+ -+## Notes -+ -+- The Text To Speech page still supports local preview playback through the shared engine audio module. -+- Message Part display order remains persisted internally and is managed with Move Up and Move Down actions rather than a visible Order column. ++## Scope Guard ++- Theme V2 only. ++- External JS only. ++- No inline styles, style blocks, inline handlers, page-local CSS, or tool-local CSS. ++- No duplicate left-column controls added. ++- Delivery and Preset values remain in the Emotion Settings child table. diff --git a/docs_build/dev/reports/codex_changed_files.txt b/docs_build/dev/reports/codex_changed_files.txt -index 3f04bddfd..b4ebfab2a 100644 +index b4ebfab2a..10f75398a 100644 --- a/docs_build/dev/reports/codex_changed_files.txt +++ b/docs_build/dev/reports/codex_changed_files.txt -@@ -22,13 +22,10 @@ docs_build/dev/reports/playwright_discovery_ownership_report.md - docs_build/dev/reports/playwright_discovery_scope_report.md - docs_build/dev/reports/playwright_structure_audit.md - docs_build/dev/reports/playwright_v8_coverage_report.txt --docs_build/dev/reports/PR_26171_BETA_073-message-tts-table-ui-correction-instruction-compliance-checklist.md --docs_build/dev/reports/PR_26171_BETA_073-message-tts-table-ui-correction-manual-validation-notes.md --docs_build/dev/reports/PR_26171_BETA_073-message-tts-table-ui-correction-message-parent-child-table-checklist.md --docs_build/dev/reports/PR_26171_BETA_073-message-tts-table-ui-correction-tts-summary-layout-checklist.md --docs_build/dev/reports/PR_26171_BETA_073-message-tts-table-ui-correction-tts-tools-registration-checklist.md --docs_build/dev/reports/PR_26171_BETA_073-message-tts-table-ui-correction-validation-report.md --docs_build/dev/reports/PR_26171_BETA_073-message-tts-table-ui-correction.md -+docs_build/dev/reports/PR_26171_BETA_075-tts-message-table-cleanup-instruction-compliance-checklist.md -+docs_build/dev/reports/PR_26171_BETA_075-tts-message-table-cleanup-manual-validation-notes.md -+docs_build/dev/reports/PR_26171_BETA_075-tts-message-table-cleanup-validation-report.md -+docs_build/dev/reports/PR_26171_BETA_075-tts-message-table-cleanup.md - docs_build/dev/reports/retry_suppression_report.md - docs_build/dev/reports/slow_path_pruning_report.md - docs_build/dev/reports/static_validation_report.md -@@ -38,11 +35,9 @@ docs_build/dev/reports/test_cleanup_routing_report.md - docs_build/dev/reports/testing_lane_execution_report.md - docs_build/dev/reports/validation_cache_report.md - docs_build/dev/reports/zero_browser_preflight_report.md --src/shared/toolbox/tool-metadata-inventory.js - tests/playwright/tools/MessagesTool.spec.mjs - tests/playwright/tools/RootToolsFutureState.spec.mjs +@@ -1,43 +1,8 @@ + docs_build/dev/reports/codex_changed_files.txt + docs_build/dev/reports/codex_review.diff +-docs_build/dev/reports/coverage_changed_js_guardrail.txt +-docs_build/dev/reports/dependency_gating_report.md +-docs_build/dev/reports/dependency_hydration_reuse_report.md +-docs_build/dev/reports/execution_graph_reuse_report.md +-docs_build/dev/reports/failure_fingerprint_report.md +-docs_build/dev/reports/filesystem_scan_reduction_report.md +-docs_build/dev/reports/incremental_validation_report.md +-docs_build/dev/reports/lane_compilation_report.md +-docs_build/dev/reports/lane_deduplication_report.md +-docs_build/dev/reports/lane_input_validation_report.md +-docs_build/dev/reports/lane_manifests/workspace-contract.json +-docs_build/dev/reports/lane_runtime_optimization_report.md +-docs_build/dev/reports/lane_snapshot_report.md +-docs_build/dev/reports/lane_snapshots/workspace-contract.json +-docs_build/dev/reports/lane_warm_start_report.md +-docs_build/dev/reports/lane_warm_starts/workspace-contract.json +-docs_build/dev/reports/monolith_trigger_removal_report.md +-docs_build/dev/reports/persistent_lane_manifest_report.md +-docs_build/dev/reports/playwright_discovery_ownership_report.md +-docs_build/dev/reports/playwright_discovery_scope_report.md +-docs_build/dev/reports/playwright_structure_audit.md +-docs_build/dev/reports/playwright_v8_coverage_report.txt +-docs_build/dev/reports/PR_26171_BETA_075-tts-message-table-cleanup-instruction-compliance-checklist.md +-docs_build/dev/reports/PR_26171_BETA_075-tts-message-table-cleanup-manual-validation-notes.md +-docs_build/dev/reports/PR_26171_BETA_075-tts-message-table-cleanup-validation-report.md +-docs_build/dev/reports/PR_26171_BETA_075-tts-message-table-cleanup.md +-docs_build/dev/reports/retry_suppression_report.md +-docs_build/dev/reports/slow_path_pruning_report.md +-docs_build/dev/reports/static_validation_report.md +-docs_build/dev/reports/targeted_file_manifest_report.md +-docs_build/dev/reports/test_cleanup_performance_report.md +-docs_build/dev/reports/test_cleanup_routing_report.md +-docs_build/dev/reports/testing_lane_execution_report.md +-docs_build/dev/reports/validation_cache_report.md +-docs_build/dev/reports/zero_browser_preflight_report.md +-tests/playwright/tools/MessagesTool.spec.mjs +-tests/playwright/tools/RootToolsFutureState.spec.mjs ++docs_build/dev/reports/PR_26171_BETA_077-tts-profile-parent-child-table-manual-validation-notes.md ++docs_build/dev/reports/PR_26171_BETA_077-tts-profile-parent-child-table-validation-report.md ++docs_build/dev/reports/PR_26171_BETA_077-tts-profile-parent-child-table.md tests/playwright/tools/TextToSpeechFunctional.spec.mjs --tests/playwright/tools/ToolboxRoutePages.spec.mjs --toolbox/messages/index.html - toolbox/messages/messages.js +-toolbox/messages/messages.js toolbox/text-to-speech/index.html -+toolbox/text-to-speech/text2speech.js -diff --git a/docs_build/dev/reports/coverage_changed_js_guardrail.txt b/docs_build/dev/reports/coverage_changed_js_guardrail.txt -index 59de15fb6..86850b15b 100644 ---- a/docs_build/dev/reports/coverage_changed_js_guardrail.txt -+++ b/docs_build/dev/reports/coverage_changed_js_guardrail.txt -@@ -6,9 +6,9 @@ Missing changed runtime JS files are WARN, not FAIL. - Source: Playwright/Chromium built-in V8 coverage from the active Playwright run. - - Changed runtime JS files considered: --(0%) src/shared/toolbox/tool-metadata-inventory.js - WARNING: changed runtime JS file was not collected by Playwright V8 coverage; advisory only - (0%) toolbox/messages/messages.js - WARNING: changed runtime JS file was not collected by Playwright V8 coverage; advisory only -+(0%) toolbox/text-to-speech/text2speech.js - WARNING: changed runtime JS file was not collected by Playwright V8 coverage; advisory only - - Guardrail warnings: --(0%) src/shared/toolbox/tool-metadata-inventory.js - WARNING: changed runtime JS file missing from coverage; advisory only - (0%) toolbox/messages/messages.js - WARNING: changed runtime JS file missing from coverage; advisory only -+(0%) toolbox/text-to-speech/text2speech.js - WARNING: changed runtime JS file missing from coverage; advisory only -diff --git a/docs_build/dev/reports/dependency_gating_report.md b/docs_build/dev/reports/dependency_gating_report.md -index 3c18f9166..319848da9 100644 ---- a/docs_build/dev/reports/dependency_gating_report.md -+++ b/docs_build/dev/reports/dependency_gating_report.md -@@ -1,6 +1,6 @@ - # Dependency Gating Report - --Generated: 2026-06-20T22:58:20.683Z -+Generated: 2026-06-21T00:10:10.215Z - Status: PASS - - ## Gate Order -diff --git a/docs_build/dev/reports/dependency_hydration_reuse_report.md b/docs_build/dev/reports/dependency_hydration_reuse_report.md -index 88a4c3471..0f8c874e3 100644 ---- a/docs_build/dev/reports/dependency_hydration_reuse_report.md -+++ b/docs_build/dev/reports/dependency_hydration_reuse_report.md -@@ -1,6 +1,6 @@ - # Dependency Hydration Reuse Report - --Generated: 2026-06-20T22:58:20.684Z -+Generated: 2026-06-21T00:10:10.216Z - Status: PASS - - ## Summary -diff --git a/docs_build/dev/reports/execution_graph_reuse_report.md b/docs_build/dev/reports/execution_graph_reuse_report.md -index 977ef5c81..ddbdf90a1 100644 ---- a/docs_build/dev/reports/execution_graph_reuse_report.md -+++ b/docs_build/dev/reports/execution_graph_reuse_report.md -@@ -1,6 +1,6 @@ - # Execution Graph Reuse Report - --Generated: 2026-06-20T22:58:20.684Z -+Generated: 2026-06-21T00:10:10.216Z - Status: PASS - - ## Summary -@@ -16,7 +16,7 @@ Prevented targeted scheduling work: 0 - - | Lane | Status | Snapshot Status | Execution Graph Hash | Reason | - | --- | --- | --- | --- | --- | --| workspace-contract | INVALIDATED | INVALIDATED | 744556e5d675e213 | Lane snapshot is part of the selected targeted execution graph. | -+| workspace-contract | INVALIDATED | INVALIDATED | 51dc9d019b71a923 | Lane snapshot is part of the selected targeted execution graph. | - - ## Safeguards - -diff --git a/docs_build/dev/reports/failure_fingerprint_report.md b/docs_build/dev/reports/failure_fingerprint_report.md -index 5e9437dba..c9822fe4a 100644 ---- a/docs_build/dev/reports/failure_fingerprint_report.md -+++ b/docs_build/dev/reports/failure_fingerprint_report.md -@@ -1,6 +1,6 @@ - # Failure Fingerprint Report - --Generated: 2026-06-20T22:59:39.176Z -+Generated: 2026-06-21T00:11:18.106Z - Status: PASS - - ## Summary -diff --git a/docs_build/dev/reports/filesystem_scan_reduction_report.md b/docs_build/dev/reports/filesystem_scan_reduction_report.md -index 4164a7dd3..3fc7accce 100644 ---- a/docs_build/dev/reports/filesystem_scan_reduction_report.md -+++ b/docs_build/dev/reports/filesystem_scan_reduction_report.md -@@ -1,6 +1,6 @@ - # Filesystem Scan Reduction Report - --Generated: 2026-06-20T22:58:20.655Z -+Generated: 2026-06-21T00:10:10.181Z - Status: PASS - - ## Scan Enforcement -diff --git a/docs_build/dev/reports/incremental_validation_report.md b/docs_build/dev/reports/incremental_validation_report.md -index efee248fd..d4aa9a02b 100644 ---- a/docs_build/dev/reports/incremental_validation_report.md -+++ b/docs_build/dev/reports/incremental_validation_report.md -@@ -1,6 +1,6 @@ - # Incremental Validation Report - --Generated: 2026-06-20T22:58:20.685Z -+Generated: 2026-06-21T00:10:10.218Z - Status: PASS - - ## Reuse Summary -diff --git a/docs_build/dev/reports/lane_compilation_report.md b/docs_build/dev/reports/lane_compilation_report.md -index 9e3895ceb..1b65b72a4 100644 ---- a/docs_build/dev/reports/lane_compilation_report.md -+++ b/docs_build/dev/reports/lane_compilation_report.md -@@ -1,6 +1,6 @@ - # Lane Compilation Report - --Generated: 2026-06-20T22:58:20.683Z -+Generated: 2026-06-21T00:10:10.215Z - Status: PASS - - ## Lane Graph -diff --git a/docs_build/dev/reports/lane_deduplication_report.md b/docs_build/dev/reports/lane_deduplication_report.md -index 5b55db348..ca9adb0a3 100644 ---- a/docs_build/dev/reports/lane_deduplication_report.md -+++ b/docs_build/dev/reports/lane_deduplication_report.md -@@ -1,6 +1,6 @@ - # Lane Deduplication Report - --Generated: 2026-06-20T22:58:20.683Z -+Generated: 2026-06-21T00:10:10.215Z - Status: PASS - - ## Summary -diff --git a/docs_build/dev/reports/lane_input_validation_report.md b/docs_build/dev/reports/lane_input_validation_report.md -index 998c71c08..0c7546c68 100644 ---- a/docs_build/dev/reports/lane_input_validation_report.md -+++ b/docs_build/dev/reports/lane_input_validation_report.md -@@ -1,6 +1,6 @@ - # Lane Input Validation Report - --Generated: 2026-06-20T22:58:20.685Z -+Generated: 2026-06-21T00:10:10.218Z - Status: PASS - - ## Input Files -diff --git a/docs_build/dev/reports/lane_manifests/workspace-contract.json b/docs_build/dev/reports/lane_manifests/workspace-contract.json -index 9d5178fda..fb867147c 100644 ---- a/docs_build/dev/reports/lane_manifests/workspace-contract.json -+++ b/docs_build/dev/reports/lane_manifests/workspace-contract.json -@@ -11,7 +11,7 @@ - "tests/helpers/playwrightStorageIsolation.mjs": "22604b3e338d2c4a", - "tests/helpers/playwrightV8CoverageReporter.mjs": "a1b81069fef85fd6", - "tests/helpers/workspaceV2CoverageReporter.mjs": "2cf6bcedc7e43c85", -- "tests/playwright/tools/RootToolsFutureState.spec.mjs": "7094370f23d8085e" -+ "tests/playwright/tools/RootToolsFutureState.spec.mjs": "032c57abb5289a23" - }, - "fixtures": [], - "helpers": [ -@@ -30,15 +30,15 @@ - "tests/helpers/playwrightV8CoverageReporter.mjs", - "tests/helpers/workspaceV2CoverageReporter.mjs" - ], -- "inputHash": "63bec7503b20624b", -+ "inputHash": "5145d05e2885e902", - "lane": "workspace-contract", - "laneDefinitionHash": "95059517ac8a6497", -- "manifestHash": "1291241716cd7ab6", -+ "manifestHash": "d98d3245976c92f4", - "ownership": "tools", - "tests": [ - "tests/playwright/tools/RootToolsFutureState.spec.mjs" - ], - "version": 1, -- "generatedAt": "2026-06-20T22:58:19.300Z", -+ "generatedAt": "2026-06-21T00:10:08.792Z", - "source": "generated" - } -diff --git a/docs_build/dev/reports/lane_runtime_optimization_report.md b/docs_build/dev/reports/lane_runtime_optimization_report.md -index 8667df0bd..a8d52d441 100644 ---- a/docs_build/dev/reports/lane_runtime_optimization_report.md -+++ b/docs_build/dev/reports/lane_runtime_optimization_report.md -@@ -1,6 +1,6 @@ - # Lane Runtime Optimization Report - --Generated: 2026-06-20T22:58:20.683Z -+Generated: 2026-06-21T00:10:10.215Z - Status: PASS - - ## Runtime Cost Summary -diff --git a/docs_build/dev/reports/lane_snapshot_report.md b/docs_build/dev/reports/lane_snapshot_report.md -index 190ba8c41..5037cf0b8 100644 ---- a/docs_build/dev/reports/lane_snapshot_report.md -+++ b/docs_build/dev/reports/lane_snapshot_report.md -@@ -1,6 +1,6 @@ - # Lane Snapshot Report - --Generated: 2026-06-20T22:58:20.684Z -+Generated: 2026-06-21T00:10:10.216Z - Status: PASS - Snapshot directory: docs_build/dev/reports/lane_snapshots - -@@ -17,7 +17,7 @@ Prevented manifest traversal: 0 - - | Lane | Status | Snapshot Path | Manifest Hash | Dependency Graph Hash | Helper Graph Hash | Fixture Graph Hash | Runtime Config Hash | Execution Graph Hash | Snapshot Hash | Reason | - | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --| workspace-contract | INVALIDATED | docs_build/dev/reports/lane_snapshots/workspace-contract.json | 1291241716cd7ab6 | 53e56ebae6e84541 | 7d3db838f9f780e0 | 6c4fac7630b0b6f3 | e5ac9cbc103c3984 | 744556e5d675e213 | 7135cba84942c652 | Lane snapshot executionGraphHash changed for workspace-contract.; Lane snapshot inputHash changed for workspace-contract.; Lane snapshot manifestHash changed for workspace-contract.; Lane snapshot snapshotHash changed for workspace-contract.; Lane snapshot warmStartHash changed for workspace-contract. | -+| workspace-contract | INVALIDATED | docs_build/dev/reports/lane_snapshots/workspace-contract.json | d98d3245976c92f4 | 53e56ebae6e84541 | 7d3db838f9f780e0 | 6c4fac7630b0b6f3 | e5ac9cbc103c3984 | 51dc9d019b71a923 | 13ffd9b4d27b4d42 | Lane snapshot executionGraphHash changed for workspace-contract.; Lane snapshot inputHash changed for workspace-contract.; Lane snapshot manifestHash changed for workspace-contract.; Lane snapshot snapshotHash changed for workspace-contract.; Lane snapshot warmStartHash changed for workspace-contract. | - - ## Snapshot Validation Findings - -diff --git a/docs_build/dev/reports/lane_snapshots/workspace-contract.json b/docs_build/dev/reports/lane_snapshots/workspace-contract.json -index ac4f12de1..e0fe4f05f 100644 ---- a/docs_build/dev/reports/lane_snapshots/workspace-contract.json -+++ b/docs_build/dev/reports/lane_snapshots/workspace-contract.json -@@ -26,7 +26,7 @@ - ] - }, - "dependencyGraphHash": "53e56ebae6e84541", -- "executionGraphHash": "744556e5d675e213", -+ "executionGraphHash": "51dc9d019b71a923", - "fixtureGraph": { - "fixtureHashes": {}, - "fixtures": [] -@@ -47,7 +47,7 @@ - ] - }, - "helperGraphHash": "7d3db838f9f780e0", -- "inputHash": "63bec7503b20624b", -+ "inputHash": "5145d05e2885e902", - "lane": "workspace-contract", - "laneCompilationStatus": "PASS", - "laneDefinitionHash": "95059517ac8a6497", -@@ -61,7 +61,7 @@ - "tests/helpers/playwrightStorageIsolation.mjs": "22604b3e338d2c4a", - "tests/helpers/playwrightV8CoverageReporter.mjs": "a1b81069fef85fd6", - "tests/helpers/workspaceV2CoverageReporter.mjs": "2cf6bcedc7e43c85", -- "tests/playwright/tools/RootToolsFutureState.spec.mjs": "7094370f23d8085e" -+ "tests/playwright/tools/RootToolsFutureState.spec.mjs": "032c57abb5289a23" - }, - "fixtures": [], - "helpers": [ -@@ -80,14 +80,14 @@ - "tests/helpers/playwrightV8CoverageReporter.mjs", - "tests/helpers/workspaceV2CoverageReporter.mjs" - ], -- "manifestHash": "1291241716cd7ab6", -+ "manifestHash": "d98d3245976c92f4", - "manifestPath": "docs_build/dev/reports/lane_manifests/workspace-contract.json", - "source": "generated", - "tests": [ - "tests/playwright/tools/RootToolsFutureState.spec.mjs" - ] - }, -- "manifestHash": "1291241716cd7ab6", -+ "manifestHash": "d98d3245976c92f4", - "ownership": "tools", - "runtimeConfiguration": { - "affectedSurface": "Root tools future-state navigation and Tool Template V2 contract", -@@ -114,8 +114,8 @@ - "requiresSamplesFlag": false - }, - "runtimeConfigurationHash": "e5ac9cbc103c3984", -- "snapshotHash": "7135cba84942c652", -+ "snapshotHash": "13ffd9b4d27b4d42", - "version": 1, -- "warmStartHash": "fe298d7913eac5ca", -- "generatedAt": "2026-06-20T22:58:20.677Z" -+ "warmStartHash": "f32a5831d6b39914", -+ "generatedAt": "2026-06-21T00:10:10.207Z" - } -diff --git a/docs_build/dev/reports/lane_warm_start_report.md b/docs_build/dev/reports/lane_warm_start_report.md -index 806f7dbc5..d06a40a33 100644 ---- a/docs_build/dev/reports/lane_warm_start_report.md -+++ b/docs_build/dev/reports/lane_warm_start_report.md -@@ -1,6 +1,6 @@ - # Lane Warm-Start Report - --Generated: 2026-06-20T22:58:20.684Z -+Generated: 2026-06-21T00:10:10.216Z - Status: PASS - Warm-start directory: docs_build/dev/reports/lane_warm_starts - -@@ -17,7 +17,7 @@ Prevented lane graph assembly: 0 - - | Lane | Status | Warm-Start Path | Manifest Hash | Warm-Start Hash | Dependency Hydration Hash | Reason | - | --- | --- | --- | --- | --- | --- | --- | --| workspace-contract | INVALIDATED | docs_build/dev/reports/lane_warm_starts/workspace-contract.json | 1291241716cd7ab6 | fe298d7913eac5ca | 355ba7a85dbb3cdb | Warm-start inputHash changed for workspace-contract.; Warm-start manifestHash changed for workspace-contract.; Warm-start warmStartHash changed for workspace-contract. | -+| workspace-contract | INVALIDATED | docs_build/dev/reports/lane_warm_starts/workspace-contract.json | d98d3245976c92f4 | f32a5831d6b39914 | 355ba7a85dbb3cdb | Warm-start inputHash changed for workspace-contract.; Warm-start manifestHash changed for workspace-contract.; Warm-start warmStartHash changed for workspace-contract. | - - ## Fast-Fail Safeguards - -diff --git a/docs_build/dev/reports/lane_warm_starts/workspace-contract.json b/docs_build/dev/reports/lane_warm_starts/workspace-contract.json -index fc55da06b..3c29e890d 100644 ---- a/docs_build/dev/reports/lane_warm_starts/workspace-contract.json -+++ b/docs_build/dev/reports/lane_warm_starts/workspace-contract.json -@@ -39,15 +39,15 @@ - ] - }, - "dependencyHydrationHash": "355ba7a85dbb3cdb", -- "inputHash": "63bec7503b20624b", -+ "inputHash": "5145d05e2885e902", - "lane": "workspace-contract", - "laneConfigHash": "09eaf9063f7694e3", - "laneDefinitionHash": "95059517ac8a6497", -- "manifestHash": "1291241716cd7ab6", -+ "manifestHash": "d98d3245976c92f4", - "ownership": "tools", -- "warmStartHash": "fe298d7913eac5ca", -+ "warmStartHash": "f32a5831d6b39914", - "version": 1, -- "generatedAt": "2026-06-20T22:58:19.312Z", -+ "generatedAt": "2026-06-21T00:10:08.802Z", - "manifestPath": "docs_build/dev/reports/lane_manifests/workspace-contract.json", - "sourceManifest": "generated" - } -diff --git a/docs_build/dev/reports/monolith_trigger_removal_report.md b/docs_build/dev/reports/monolith_trigger_removal_report.md -index 7141f5d34..97a55c340 100644 ---- a/docs_build/dev/reports/monolith_trigger_removal_report.md -+++ b/docs_build/dev/reports/monolith_trigger_removal_report.md -@@ -1,6 +1,6 @@ - # Monolith Trigger Removal Report - --Generated: 2026-06-20T22:59:39.177Z -+Generated: 2026-06-21T00:11:18.108Z - Status: PASS - - ## Removed Broad Execution Triggers -diff --git a/docs_build/dev/reports/persistent_lane_manifest_report.md b/docs_build/dev/reports/persistent_lane_manifest_report.md -index f4baf21cb..f3f131d4a 100644 ---- a/docs_build/dev/reports/persistent_lane_manifest_report.md -+++ b/docs_build/dev/reports/persistent_lane_manifest_report.md -@@ -1,6 +1,6 @@ - # Persistent Lane Manifest Report - --Generated: 2026-06-20T22:58:20.685Z -+Generated: 2026-06-21T00:10:10.218Z - Status: PASS - Manifest directory: docs_build/dev/reports/lane_manifests - -@@ -15,13 +15,13 @@ Prevented discovery scans: 0 - - | Lane | Status | Manifest Path | Input Hash | Manifest Hash | Reason | - | --- | --- | --- | --- | --- | --- | --| workspace-contract | INVALIDATED | docs_build/dev/reports/lane_manifests/workspace-contract.json | 63bec7503b20624b | 1291241716cd7ab6 | Persistent manifest input hash changed for workspace-contract.; Persistent manifest hash changed for workspace-contract. | -+| workspace-contract | INVALIDATED | docs_build/dev/reports/lane_manifests/workspace-contract.json | 5145d05e2885e902 | d98d3245976c92f4 | Persistent manifest input hash changed for workspace-contract.; Persistent manifest hash changed for workspace-contract. | - - ## Persisted Manifest Files - - | Lane | Ownership | Source | Tests | Helpers | Fixtures | Dependency Graph Hash | Manifest Hash | - | --- | --- | --- | --- | --- | --- | --- | --- | --| workspace-contract | tools | generated | tests/playwright/tools/RootToolsFutureState.spec.mjs | tests/helpers/playwrightRepoServer.mjs; tests/helpers/playwrightStorageIsolation.mjs; tests/helpers/playwrightV8CoverageReporter.mjs; tests/helpers/workspaceV2CoverageReporter.mjs | none | 53e56ebae6e84541 | 1291241716cd7ab6 | -+| workspace-contract | tools | generated | tests/playwright/tools/RootToolsFutureState.spec.mjs | tests/helpers/playwrightRepoServer.mjs; tests/helpers/playwrightStorageIsolation.mjs; tests/helpers/playwrightV8CoverageReporter.mjs; tests/helpers/workspaceV2CoverageReporter.mjs | none | 53e56ebae6e84541 | d98d3245976c92f4 | - - ## Fast-Fail Enforcement - -diff --git a/docs_build/dev/reports/playwright_discovery_ownership_report.md b/docs_build/dev/reports/playwright_discovery_ownership_report.md -index 977875caf..a5a1b3dea 100644 ---- a/docs_build/dev/reports/playwright_discovery_ownership_report.md -+++ b/docs_build/dev/reports/playwright_discovery_ownership_report.md -@@ -1,6 +1,6 @@ - # Playwright Discovery Ownership Report - --Generated: 2026-06-20T22:58:20.646Z -+Generated: 2026-06-21T00:10:10.169Z - Status: PASS - - ## Discovery-Time Ownership -diff --git a/docs_build/dev/reports/playwright_discovery_scope_report.md b/docs_build/dev/reports/playwright_discovery_scope_report.md -index 69c83d957..7ba7a7a0e 100644 ---- a/docs_build/dev/reports/playwright_discovery_scope_report.md -+++ b/docs_build/dev/reports/playwright_discovery_scope_report.md -@@ -1,6 +1,6 @@ - # Playwright Discovery Scope Report - --Generated: 2026-06-20T22:58:20.652Z -+Generated: 2026-06-21T00:10:10.176Z - Status: PASS - Scoped discovery: Yes - -diff --git a/docs_build/dev/reports/playwright_structure_audit.md b/docs_build/dev/reports/playwright_structure_audit.md -index 392a08ee3..dc6386691 100644 ---- a/docs_build/dev/reports/playwright_structure_audit.md -+++ b/docs_build/dev/reports/playwright_structure_audit.md -@@ -1,6 +1,6 @@ - # Playwright Structure Audit - --Generated: 2026-06-20T22:58:20.624Z -+Generated: 2026-06-21T00:10:10.141Z - Status: PASS - - ## Lane Directories -diff --git a/docs_build/dev/reports/playwright_v8_coverage_report.txt b/docs_build/dev/reports/playwright_v8_coverage_report.txt -index 94d5e709f..e8623a06d 100644 ---- a/docs_build/dev/reports/playwright_v8_coverage_report.txt -+++ b/docs_build/dev/reports/playwright_v8_coverage_report.txt -@@ -12,33 +12,49 @@ Note: entry percentages use function coverage when available, otherwise line cov - Note: coverage entries are aggregated across every page/tool where coverageReporter.start(page) and coverageReporter.stop(page) ran. - - Exercised tool entry points detected: --(70%) Toolbox Index - exercised 3 runtime JS files -+(71%) Toolbox Index - exercised 10 runtime JS files - (0%) Tool Template V2 - not exercised by this Playwright run --(72%) Theme V2 Shared JS - exercised 1 runtime JS files -+(61%) Theme V2 Shared JS - exercised 7 runtime JS files - - Changed runtime JS files covered: --(0%) src/shared/toolbox/tool-metadata-inventory.js - WARNING: changed runtime JS file was not collected by Playwright V8 coverage; advisory only - (0%) toolbox/messages/messages.js - WARNING: changed runtime JS file was not collected by Playwright V8 coverage; advisory only -+(0%) toolbox/text-to-speech/text2speech.js - WARNING: changed runtime JS file was not collected by Playwright V8 coverage; advisory only - - Files with executed line/function counts where available: -+(14%) assets/theme-v2/js/account-auth-service.js - executed lines 64/64; executed functions 1/7 -+(14%) assets/theme-v2/js/admin-setup-actions.js - executed lines 55/55; executed functions 1/7 -+(18%) assets/theme-v2/js/account-page-data.js - executed lines 150/150; executed functions 3/17 -+(20%) assets/theme-v2/js/admin-owner-navigation.js - executed lines 58/58; executed functions 2/10 -+(25%) src/api/admin-owner-navigation.js - executed lines 42/42; executed functions 1/4 - (25%) src/api/session-api-client.js - executed lines 68/68; executed functions 3/12 -+(29%) src/engine/input/NormalizedInputRegistry.js - executed lines 341/341; executed functions 6/21 -+(33%) src/api/admin-setup-api-client.js - executed lines 13/13; executed functions 1/3 - (33%) src/api/toolbox-votes-api-client.js - executed lines 46/46; executed functions 2/6 --(44%) src/api/server-api-client.js - executed lines 167/167; executed functions 8/18 --(48%) toolbox/tool-registry-api-client.js - executed lines 155/155; executed functions 11/23 -+(56%) toolbox/colors/colors.js - executed lines 1848/1848; executed functions 115/204 -+(58%) src/api/server-api-client.js - executed lines 167/167; executed functions 11/19 -+(64%) assets/theme-v2/js/tool-display-mode.js - executed lines 204/204; executed functions 9/14 -+(64%) toolbox/controls/controls.js - executed lines 610/610; executed functions 36/56 - (65%) src/api/public-config-client.js - executed lines 209/209; executed functions 17/26 - (67%) src/api/game-journey-completion-api-client.js - executed lines 15/15; executed functions 2/3 - (67%) toolbox/game-workspace/game-workspace-api-client.js - executed lines 20/20; executed functions 2/3 --(72%) assets/theme-v2/js/gamefoundry-partials.js - executed lines 977/977; executed functions 65/90 --(74%) toolbox/tools-page-accordions.js - executed lines 1156/1156; executed functions 81/109 -+(71%) toolbox/game-workspace/game-workspace.js - executed lines 472/472; executed functions 32/45 -+(74%) assets/theme-v2/js/gamefoundry-partials.js - executed lines 977/977; executed functions 67/90 -+(89%) toolbox/tools-page-accordions.js - executed lines 1156/1156; executed functions 105/118 -+(90%) toolbox/tool-registry-api-client.js - executed lines 155/155; executed functions 26/29 -+(91%) toolbox/game-design/game-design.js - executed lines 254/254; executed functions 21/23 -+(94%) assets/theme-v2/js/marketplace-page.js - executed lines 170/170; executed functions 16/17 -+(100%) src/api/marketplace-api-client.js - executed lines 16/16; executed functions 3/3 -+(100%) toolbox/colors/palette-api-client.js - executed lines 28/28; executed functions 4/4 -+(100%) toolbox/controls/controls-api-client.js - executed lines 33/33; executed functions 5/5 -+(100%) toolbox/game-design/game-design-api-client.js - executed lines 13/13; executed functions 2/2 - - Uncovered or low-coverage changed JS files: --(0%) src/shared/toolbox/tool-metadata-inventory.js - WARNING: uncovered changed runtime JS file; advisory only - (0%) toolbox/messages/messages.js - WARNING: uncovered changed runtime JS file; advisory only -+(0%) toolbox/text-to-speech/text2speech.js - WARNING: uncovered changed runtime JS file; advisory only - - Changed JS files considered: --(0%) src/shared/toolbox/tool-metadata-inventory.js - changed JS file not collected as browser runtime coverage - (0%) tests/playwright/tools/MessagesTool.spec.mjs - changed JS file not collected as browser runtime coverage - (0%) tests/playwright/tools/RootToolsFutureState.spec.mjs - changed JS file not collected as browser runtime coverage - (0%) tests/playwright/tools/TextToSpeechFunctional.spec.mjs - changed JS file not collected as browser runtime coverage --(0%) tests/playwright/tools/ToolboxRoutePages.spec.mjs - changed JS file not collected as browser runtime coverage - (0%) toolbox/messages/messages.js - changed JS file not collected as browser runtime coverage -+(0%) toolbox/text-to-speech/text2speech.js - changed JS file not collected as browser runtime coverage -diff --git a/docs_build/dev/reports/retry_suppression_report.md b/docs_build/dev/reports/retry_suppression_report.md -index b85b2ce3f..5391d7a38 100644 ---- a/docs_build/dev/reports/retry_suppression_report.md -+++ b/docs_build/dev/reports/retry_suppression_report.md -@@ -1,6 +1,6 @@ - # Retry Suppression Report - --Generated: 2026-06-20T22:59:39.176Z -+Generated: 2026-06-21T00:11:18.107Z - Status: PASS - - ## Summary -diff --git a/docs_build/dev/reports/slow_path_pruning_report.md b/docs_build/dev/reports/slow_path_pruning_report.md -index 4aa32ba0e..0fc071745 100644 ---- a/docs_build/dev/reports/slow_path_pruning_report.md -+++ b/docs_build/dev/reports/slow_path_pruning_report.md -@@ -1,13 +1,13 @@ - # Slow Path Pruning Report - --Generated: 2026-06-20T22:59:39.177Z -+Generated: 2026-06-21T00:11:18.108Z - Status: PASS - Source timing evidence: docs_build/dev/reports/test_cleanup_performance_report.md (2026-05-26T21:18:42.199Z) - - ## Before / After Runtime Observations - - PR_26146_038 measured lane elapsed time: 169.71s --Current measured lane elapsed time: 78.45s -+Current measured lane elapsed time: 67.79s - PR_26146_038 actual browser launches: 4 - Current actual browser launches: 1 - Accidental no-argument browser launches prevented: 5 -@@ -31,11 +31,11 @@ Validation cache hits: 18 - | PR_26146_038 | tool-runtime | 19.10s | Asset Manager V2 temporary UAT context | - | PR_26146_038 | integration | 14.50s | games index resolves Pong thumbnail from manifest preview role | - | PR_26146_038 | tool-runtime | 10.10s | Preview Generator V2 real batch output | --| current targeted run | workspace-contract | 18.90s | tests\playwright\tools\RootToolsFutureState.spec.mjs:667:1 > representative active tool pages align center cleanup and registry group colors | --| current targeted run | workspace-contract | 17.80s | tests\playwright\tools\RootToolsFutureState.spec.mjs:565:1 > learn wireframe pages load with shared Theme V2 structure | --| current targeted run | workspace-contract | 14.40s | tests\playwright\tools\RootToolsFutureState.spec.mjs:270:1 > root tools surface links current tool pages without old_* routes | --| current targeted run | workspace-contract | 10.50s | tests\playwright\tools\RootToolsFutureState.spec.mjs:485:1 > common header renders primary navigation order across active pages | --| current targeted run | workspace-contract | 2.20s | tests\playwright\tools\RootToolsFutureState.spec.mjs:644:1 > tool template future-state page loads from root Theme V2 paths | -+| current targeted run | workspace-contract | 15.20s | tests\playwright\tools\RootToolsFutureState.spec.mjs:270:1 > root tools surface links current tool pages without old_* routes | -+| current targeted run | workspace-contract | 14.70s | tests\playwright\tools\RootToolsFutureState.spec.mjs:664:1 > representative active tool pages align center cleanup and registry group colors | -+| current targeted run | workspace-contract | 13.10s | tests\playwright\tools\RootToolsFutureState.spec.mjs:562:1 > learn wireframe pages load with shared Theme V2 structure | -+| current targeted run | workspace-contract | 11.20s | tests\playwright\tools\RootToolsFutureState.spec.mjs:482:1 > common header renders primary navigation order across active pages | -+| current targeted run | workspace-contract | 2.30s | tests\playwright\tools\RootToolsFutureState.spec.mjs:641:1 > tool template future-state page loads from root Theme V2 paths | - - ## Guardrails - -diff --git a/docs_build/dev/reports/static_validation_report.md b/docs_build/dev/reports/static_validation_report.md -index 3752d284f..ef23805b9 100644 ---- a/docs_build/dev/reports/static_validation_report.md -+++ b/docs_build/dev/reports/static_validation_report.md -@@ -1,6 +1,6 @@ - # Static Validation Report - --Generated: 2026-06-20T22:58:20.674Z -+Generated: 2026-06-21T00:10:10.202Z - Status: PASS - Static only: No - Dry run: No -@@ -22,7 +22,7 @@ Reason: No deterministic static validation failure was found. - | invalid filename detection | PASS | Covered by Playwright structure audit. | - | missing import detection | PASS | Covered by Playwright structure audit relative import checks. | - | missing fixture detection | PASS | No missing fixture findings. | --| targeted file manifests | PASS | workspace-contract:1291241716cd7ab6 | -+| targeted file manifests | PASS | workspace-contract:d98d3245976c92f4 | - | persistent lane manifests | PASS | workspace-contract:INVALIDATED | - | lane warm-start reuse | PASS | workspace-contract:INVALIDATED | - | dependency hydration reuse | PASS | workspace-contract:INVALIDATED | -diff --git a/docs_build/dev/reports/targeted_file_manifest_report.md b/docs_build/dev/reports/targeted_file_manifest_report.md -index d06980143..fd6fbb064 100644 ---- a/docs_build/dev/reports/targeted_file_manifest_report.md -+++ b/docs_build/dev/reports/targeted_file_manifest_report.md -@@ -1,13 +1,13 @@ - # Targeted File Manifest Report - --Generated: 2026-06-20T22:58:20.685Z -+Generated: 2026-06-21T00:10:10.217Z - Status: PASS - - ## Manifest-Generated Lane Inputs - - | Lane | Ownership | Status | Source | Tests | Helpers | Fixtures | Imports / Dependencies | Dependency Graph Hash | Manifest Hash | Reason | - | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --| workspace-contract | tools | PASS | generated | tests/playwright/tools/RootToolsFutureState.spec.mjs | tests/helpers/playwrightRepoServer.mjs; tests/helpers/playwrightStorageIsolation.mjs; tests/helpers/playwrightV8CoverageReporter.mjs; tests/helpers/workspaceV2CoverageReporter.mjs | none | src/dev-runtime/admin/admin-notes-directory.mjs; src/dev-runtime/admin/admin-notes-menu.mjs; src/dev-runtime/persistence/mock-db-store.js; src/dev-runtime/server/local-api-router.mjs; tests/helpers/playwrightRepoServer.mjs; tests/helpers/playwrightStorageIsolation.mjs; tests/helpers/playwrightV8CoverageReporter.mjs; tests/helpers/workspaceV2CoverageReporter.mjs | 53e56ebae6e84541 | 1291241716cd7ab6 | Manifest ownership, helpers, fixtures, imports, and command targets are deterministic before runtime. | -+| workspace-contract | tools | PASS | generated | tests/playwright/tools/RootToolsFutureState.spec.mjs | tests/helpers/playwrightRepoServer.mjs; tests/helpers/playwrightStorageIsolation.mjs; tests/helpers/playwrightV8CoverageReporter.mjs; tests/helpers/workspaceV2CoverageReporter.mjs | none | src/dev-runtime/admin/admin-notes-directory.mjs; src/dev-runtime/admin/admin-notes-menu.mjs; src/dev-runtime/persistence/mock-db-store.js; src/dev-runtime/server/local-api-router.mjs; tests/helpers/playwrightRepoServer.mjs; tests/helpers/playwrightStorageIsolation.mjs; tests/helpers/playwrightV8CoverageReporter.mjs; tests/helpers/workspaceV2CoverageReporter.mjs | 53e56ebae6e84541 | d98d3245976c92f4 | Manifest ownership, helpers, fixtures, imports, and command targets are deterministic before runtime. | - - ## Discovery Expansion Control - -diff --git a/docs_build/dev/reports/test_cleanup_performance_report.md b/docs_build/dev/reports/test_cleanup_performance_report.md -index 3aa560665..db3a814e7 100644 ---- a/docs_build/dev/reports/test_cleanup_performance_report.md -+++ b/docs_build/dev/reports/test_cleanup_performance_report.md -@@ -1,11 +1,11 @@ - # Test Cleanup Performance Report - --Generated: 2026-06-20T22:59:39.177Z -+Generated: 2026-06-21T00:11:18.107Z - Status: PASS - - ## Cost Summary - --Total measured lane elapsed time: 78.45s -+Total measured lane elapsed time: 67.79s - Actual browser launch count: 1 - Scheduled browser launch count: 1 - Baseline browser launch count: 1 -@@ -23,7 +23,7 @@ Prevented redundant dependency traversal: 0 - - | Lane | Status | Elapsed | Browser Launches | Reason | - | --- | --- | --- | --- | --- | --| workspace-contract | PASS | 78.45s | 1 | Workspace V2 command now validates the future-state tools surface without exercising deprecated toolbox/old_* routes. | -+| workspace-contract | PASS | 67.79s | 1 | Workspace V2 command now validates the future-state tools surface without exercising deprecated toolbox/old_* routes. | - | game-workspace | SKIP | 0ms | 0 | Lane was not selected for this targeted run. | - | game-design | SKIP | 0ms | 0 | Lane was not selected for this targeted run. | - | game-configuration | SKIP | 0ms | 0 | Lane was not selected for this targeted run. | -@@ -43,11 +43,11 @@ Prevented redundant dependency traversal: 0 - - | Lane | Duration | Test | Command | - | --- | --- | --- | --- | --| workspace-contract | 18.90s | tests\playwright\tools\RootToolsFutureState.spec.mjs:667:1 > representative active tool pages align center cleanup and registry group colors | C:\nvm4w\nodejs\node.exe "C:\\Users\\davidq\\Documents\\GitHub\\HTML-JavaScript-Gaming - 1\\node_modules\\@playwright\\test\\cli.js" test tests/playwright/tools/RootToolsFutureState.spec.mjs --project=playwright --workers=1 --reporter=list | --| workspace-contract | 17.80s | tests\playwright\tools\RootToolsFutureState.spec.mjs:565:1 > learn wireframe pages load with shared Theme V2 structure | C:\nvm4w\nodejs\node.exe "C:\\Users\\davidq\\Documents\\GitHub\\HTML-JavaScript-Gaming - 1\\node_modules\\@playwright\\test\\cli.js" test tests/playwright/tools/RootToolsFutureState.spec.mjs --project=playwright --workers=1 --reporter=list | --| workspace-contract | 14.40s | tests\playwright\tools\RootToolsFutureState.spec.mjs:270:1 > root tools surface links current tool pages without old_* routes | C:\nvm4w\nodejs\node.exe "C:\\Users\\davidq\\Documents\\GitHub\\HTML-JavaScript-Gaming - 1\\node_modules\\@playwright\\test\\cli.js" test tests/playwright/tools/RootToolsFutureState.spec.mjs --project=playwright --workers=1 --reporter=list | --| workspace-contract | 10.50s | tests\playwright\tools\RootToolsFutureState.spec.mjs:485:1 > common header renders primary navigation order across active pages | C:\nvm4w\nodejs\node.exe "C:\\Users\\davidq\\Documents\\GitHub\\HTML-JavaScript-Gaming - 1\\node_modules\\@playwright\\test\\cli.js" test tests/playwright/tools/RootToolsFutureState.spec.mjs --project=playwright --workers=1 --reporter=list | --| workspace-contract | 2.20s | tests\playwright\tools\RootToolsFutureState.spec.mjs:644:1 > tool template future-state page loads from root Theme V2 paths | C:\nvm4w\nodejs\node.exe "C:\\Users\\davidq\\Documents\\GitHub\\HTML-JavaScript-Gaming - 1\\node_modules\\@playwright\\test\\cli.js" test tests/playwright/tools/RootToolsFutureState.spec.mjs --project=playwright --workers=1 --reporter=list | -+| workspace-contract | 15.20s | tests\playwright\tools\RootToolsFutureState.spec.mjs:270:1 > root tools surface links current tool pages without old_* routes | C:\nvm4w\nodejs\node.exe "C:\\Users\\davidq\\Documents\\GitHub\\HTML-JavaScript-Gaming - 1\\node_modules\\@playwright\\test\\cli.js" test tests/playwright/tools/RootToolsFutureState.spec.mjs --project=playwright --workers=1 --reporter=list | -+| workspace-contract | 14.70s | tests\playwright\tools\RootToolsFutureState.spec.mjs:664:1 > representative active tool pages align center cleanup and registry group colors | C:\nvm4w\nodejs\node.exe "C:\\Users\\davidq\\Documents\\GitHub\\HTML-JavaScript-Gaming - 1\\node_modules\\@playwright\\test\\cli.js" test tests/playwright/tools/RootToolsFutureState.spec.mjs --project=playwright --workers=1 --reporter=list | -+| workspace-contract | 13.10s | tests\playwright\tools\RootToolsFutureState.spec.mjs:562:1 > learn wireframe pages load with shared Theme V2 structure | C:\nvm4w\nodejs\node.exe "C:\\Users\\davidq\\Documents\\GitHub\\HTML-JavaScript-Gaming - 1\\node_modules\\@playwright\\test\\cli.js" test tests/playwright/tools/RootToolsFutureState.spec.mjs --project=playwright --workers=1 --reporter=list | -+| workspace-contract | 11.20s | tests\playwright\tools\RootToolsFutureState.spec.mjs:482:1 > common header renders primary navigation order across active pages | C:\nvm4w\nodejs\node.exe "C:\\Users\\davidq\\Documents\\GitHub\\HTML-JavaScript-Gaming - 1\\node_modules\\@playwright\\test\\cli.js" test tests/playwright/tools/RootToolsFutureState.spec.mjs --project=playwright --workers=1 --reporter=list | -+| workspace-contract | 2.30s | tests\playwright\tools\RootToolsFutureState.spec.mjs:641:1 > tool template future-state page loads from root Theme V2 paths | C:\nvm4w\nodejs\node.exe "C:\\Users\\davidq\\Documents\\GitHub\\HTML-JavaScript-Gaming - 1\\node_modules\\@playwright\\test\\cli.js" test tests/playwright/tools/RootToolsFutureState.spec.mjs --project=playwright --workers=1 --reporter=list | - - ## Prevented Broad Execution - -diff --git a/docs_build/dev/reports/test_cleanup_routing_report.md b/docs_build/dev/reports/test_cleanup_routing_report.md -index 51d699234..ed7ec4550 100644 ---- a/docs_build/dev/reports/test_cleanup_routing_report.md -+++ b/docs_build/dev/reports/test_cleanup_routing_report.md -@@ -1,6 +1,6 @@ - # Test Cleanup Routing Report - --Generated: 2026-06-20T22:59:39.177Z -+Generated: 2026-06-21T00:11:18.108Z - Status: PASS - - ## Representative Routing Cases -diff --git a/docs_build/dev/reports/testing_lane_execution_report.md b/docs_build/dev/reports/testing_lane_execution_report.md -index 7713de7a1..c9cbce468 100644 ---- a/docs_build/dev/reports/testing_lane_execution_report.md -+++ b/docs_build/dev/reports/testing_lane_execution_report.md -@@ -1,6 +1,6 @@ - # Testing Lane Execution Report - --Generated: 2026-06-20T22:59:39.207Z -+Generated: 2026-06-21T00:11:18.159Z - Dry run: No - - ## Summary -@@ -9,7 +9,7 @@ PASS: 1 - WARN: 0 - FAIL: 0 - SKIP: 14 --Total lane elapsed time: 78.45s -+Total lane elapsed time: 67.79s - Actual browser launches: 1 - - ## Full Samples Smoke -@@ -105,7 +105,7 @@ Prevented Workspace lane reruns: 0 - - | Lane | Status | Elapsed | Browser Launches | Executed/Skipped Reason | Affected Surface | Fixtures / Inputs | - | --- | --- | --- | --- | --- | --- | --- | --| workspace-contract | PASS | 78.45s | 1 | Workspace V2 command now validates the future-state tools surface without exercising deprecated toolbox/old_* routes. | Root tools future-state navigation and Tool Template V2 contract | repo-served root tools page; Tool Template V2 future-state page; Theme V2 shared partials and assets | -+| workspace-contract | PASS | 67.79s | 1 | Workspace V2 command now validates the future-state tools surface without exercising deprecated toolbox/old_* routes. | Root tools future-state navigation and Tool Template V2 contract | repo-served root tools page; Tool Template V2 future-state page; Theme V2 shared partials and assets | - | game-workspace | SKIP | 0ms | 0 | Lane was not selected for this targeted run. | Game Workspace mock repository, Game Workspace UI, and Toolbox Progress/Build Path game-state bridge | repo-served Game Workspace page; repo-served Toolbox page with role simulation; in-memory SQL-shaped mock game repository | - | game-design | SKIP | 0ms | 0 | Lane was not selected for this targeted run. | Game Design mock repository, project purpose flow, validation overlay, capability demo authoring, and Toolbox progress handoff | repo-served Game Design page; repo-served Toolbox Progress and Build Path views; in-memory SQL-shaped Game Design mock repository; Game Workspace mock game context | - | game-configuration | SKIP | 0ms | 0 | Lane was not selected for this targeted run. | Game Configuration mock repository, Game Design handoff, configuration validation, user-facing output, and Toolbox progress handoff | repo-served Game Configuration page; repo-served Game Design page for handoff checks; repo-served Toolbox Progress and Build Path views; in-memory SQL-shaped Game Configuration mock repository; Game Design mock repository handoff | -@@ -125,16 +125,16 @@ Prevented Workspace lane reruns: 0 - - | Lane | Duration | Test | - | --- | --- | --- | --| workspace-contract | 18.90s | tests\playwright\tools\RootToolsFutureState.spec.mjs:667:1 > representative active tool pages align center cleanup and registry group colors | --| workspace-contract | 17.80s | tests\playwright\tools\RootToolsFutureState.spec.mjs:565:1 > learn wireframe pages load with shared Theme V2 structure | --| workspace-contract | 14.40s | tests\playwright\tools\RootToolsFutureState.spec.mjs:270:1 > root tools surface links current tool pages without old_* routes | --| workspace-contract | 10.50s | tests\playwright\tools\RootToolsFutureState.spec.mjs:485:1 > common header renders primary navigation order across active pages | --| workspace-contract | 2.20s | tests\playwright\tools\RootToolsFutureState.spec.mjs:644:1 > tool template future-state page loads from root Theme V2 paths | -+| workspace-contract | 15.20s | tests\playwright\tools\RootToolsFutureState.spec.mjs:270:1 > root tools surface links current tool pages without old_* routes | -+| workspace-contract | 14.70s | tests\playwright\tools\RootToolsFutureState.spec.mjs:664:1 > representative active tool pages align center cleanup and registry group colors | -+| workspace-contract | 13.10s | tests\playwright\tools\RootToolsFutureState.spec.mjs:562:1 > learn wireframe pages load with shared Theme V2 structure | -+| workspace-contract | 11.20s | tests\playwright\tools\RootToolsFutureState.spec.mjs:482:1 > common header renders primary navigation order across active pages | -+| workspace-contract | 2.30s | tests\playwright\tools\RootToolsFutureState.spec.mjs:641:1 > tool template future-state page loads from root Theme V2 paths | - - ## Commands - - ### workspace-contract --- PASS 78.44s C:\nvm4w\nodejs\node.exe "C:\\Users\\davidq\\Documents\\GitHub\\HTML-JavaScript-Gaming - 1\\node_modules\\@playwright\\test\\cli.js" test tests/playwright/tools/RootToolsFutureState.spec.mjs --project=playwright --workers=1 --reporter=list -+- PASS 67.79s C:\nvm4w\nodejs\node.exe "C:\\Users\\davidq\\Documents\\GitHub\\HTML-JavaScript-Gaming - 1\\node_modules\\@playwright\\test\\cli.js" test tests/playwright/tools/RootToolsFutureState.spec.mjs --project=playwright --workers=1 --reporter=list - - ### game-workspace - - SKIP -diff --git a/docs_build/dev/reports/validation_cache_report.md b/docs_build/dev/reports/validation_cache_report.md -index e19c36558..2afd84b03 100644 ---- a/docs_build/dev/reports/validation_cache_report.md -+++ b/docs_build/dev/reports/validation_cache_report.md -@@ -1,6 +1,6 @@ - # Validation Cache Report - --Generated: 2026-06-20T22:58:20.687Z -+Generated: 2026-06-21T00:10:10.220Z - Status: PASS - - ## Cache Summary -@@ -15,26 +15,26 @@ Validations computed: 10 - | lane registration validation | MISS | 6a5b13bb47c3fad3 | initial computation | lane definitions change; package.json lane scripts change | - | runner preflight validation | MISS | 0633df51b798654a | initial computation | lane definitions change; fixture ownership changes; targeted files change | - | scoped discovery map | MISS | e195476e1978ec54 | initial computation | lane definitions change; fixture ownership changes; helper/import graph changes; targeted files change | --| targeted file manifest validation | MISS | 070fd74956239d48 | initial computation | lane definitions change; fixture ownership changes; helper/import graph changes; targeted files change | --| lane warm-start validation | MISS | 6f24967ea6249f42 | initial computation | lane definitions change; targeted files change; ownership metadata changes; dependency graph changes; helper/fixture placement changes; lane configuration changes | --| structural ownership validation | MISS | ce9fb480b7ef245b | initial computation | fixture ownership changes; helper/import graph changes; targeted files change | -+| targeted file manifest validation | MISS | c5c4b7876c948959 | initial computation | lane definitions change; fixture ownership changes; helper/import graph changes; targeted files change | -+| lane warm-start validation | MISS | a00444576ec05d24 | initial computation | lane definitions change; targeted files change; ownership metadata changes; dependency graph changes; helper/fixture placement changes; lane configuration changes | -+| structural ownership validation | MISS | f0b916009d8b7a2e | initial computation | fixture ownership changes; helper/import graph changes; targeted files change | - | lane compilation validation | MISS | 0e1346462ea720dd | initial computation | lane definitions change; targeted files change; fixture ownership changes | - | lane compilation validation | HIT | 0e1346462ea720dd | dependency validation input | unchanged within execution cycle | - | dependency validation | MISS | 94d1bf1c7924d46d | initial computation | dependency graph changes; lane definitions change; lane compilation input changes | --| lane snapshot validation | MISS | 5d2cdac11ae1ca38 | initial computation | targeted files change; dependency graph changes; helper/fixture ownership changes; lane configuration changes; runtime configuration changes | -+| lane snapshot validation | MISS | 7ebcc49fd0ce56c8 | initial computation | targeted files change; dependency graph changes; helper/fixture ownership changes; lane configuration changes; runtime configuration changes | - | zero-browser preflight | MISS | 568caf8342cb4bc0 | initial computation | lane definitions change; fixture ownership changes; helper/import graph changes; targeted files change; dependency graph changes | --| structural ownership validation | HIT | ce9fb480b7ef245b | static validation report | unchanged within execution cycle | --| structural ownership validation | HIT | ce9fb480b7ef245b | zero-browser preflight report | unchanged within execution cycle | -+| structural ownership validation | HIT | f0b916009d8b7a2e | static validation report | unchanged within execution cycle | -+| structural ownership validation | HIT | f0b916009d8b7a2e | zero-browser preflight report | unchanged within execution cycle | - | scoped discovery map | HIT | e195476e1978ec54 | structural ownership validation input | unchanged within execution cycle | - | scoped discovery map | HIT | e195476e1978ec54 | discovery scope reporting | unchanged within execution cycle | --| targeted file manifest validation | HIT | 070fd74956239d48 | lane input validation report | unchanged within execution cycle | --| targeted file manifest validation | HIT | 070fd74956239d48 | runtime scheduling blockers | unchanged within execution cycle | --| lane warm-start validation | HIT | 6f24967ea6249f42 | warm-start report | unchanged within execution cycle | --| lane warm-start validation | HIT | 6f24967ea6249f42 | dependency hydration reuse report | unchanged within execution cycle | --| lane warm-start validation | HIT | 6f24967ea6249f42 | runtime scheduling | unchanged within execution cycle | --| lane snapshot validation | HIT | 5d2cdac11ae1ca38 | lane snapshot report | unchanged within execution cycle | --| lane snapshot validation | HIT | 5d2cdac11ae1ca38 | execution graph reuse report | unchanged within execution cycle | --| lane snapshot validation | HIT | 5d2cdac11ae1ca38 | runtime scheduling | unchanged within execution cycle | -+| targeted file manifest validation | HIT | c5c4b7876c948959 | lane input validation report | unchanged within execution cycle | -+| targeted file manifest validation | HIT | c5c4b7876c948959 | runtime scheduling blockers | unchanged within execution cycle | -+| lane warm-start validation | HIT | a00444576ec05d24 | warm-start report | unchanged within execution cycle | -+| lane warm-start validation | HIT | a00444576ec05d24 | dependency hydration reuse report | unchanged within execution cycle | -+| lane warm-start validation | HIT | a00444576ec05d24 | runtime scheduling | unchanged within execution cycle | -+| lane snapshot validation | HIT | 7ebcc49fd0ce56c8 | lane snapshot report | unchanged within execution cycle | -+| lane snapshot validation | HIT | 7ebcc49fd0ce56c8 | execution graph reuse report | unchanged within execution cycle | -+| lane snapshot validation | HIT | 7ebcc49fd0ce56c8 | runtime scheduling | unchanged within execution cycle | - | lane compilation validation | HIT | 0e1346462ea720dd | lane compilation report | unchanged within execution cycle | - | lane compilation validation | HIT | 0e1346462ea720dd | runtime scheduling | unchanged within execution cycle | - | dependency validation | HIT | 94d1bf1c7924d46d | dependency report | unchanged within execution cycle | -diff --git a/docs_build/dev/reports/zero_browser_preflight_report.md b/docs_build/dev/reports/zero_browser_preflight_report.md -index 19b494b64..6b9f2cec7 100644 ---- a/docs_build/dev/reports/zero_browser_preflight_report.md -+++ b/docs_build/dev/reports/zero_browser_preflight_report.md -@@ -1,6 +1,6 @@ - # Zero-Browser Preflight Report - --Generated: 2026-06-20T22:58:20.686Z -+Generated: 2026-06-21T00:10:10.219Z - Status: PASS - - ## Prevented Browser Launches -diff --git a/tests/playwright/tools/MessagesTool.spec.mjs b/tests/playwright/tools/MessagesTool.spec.mjs -index 5c2e1a212..e10e79dac 100644 ---- a/tests/playwright/tools/MessagesTool.spec.mjs -+++ b/tests/playwright/tools/MessagesTool.spec.mjs -@@ -145,12 +145,15 @@ async function addMessage(page, values) { - - async function addPart(page, values) { - await page.getByRole("button", { name: "Add Part" }).click(); -- await page.locator("[data-messages-segment-editor='__new__'] [data-segment-order]").fill(String(values.order)); - await page.locator("[data-messages-segment-editor='__new__'] [data-segment-text]").fill(values.text); - await page.locator("[data-messages-segment-editor='__new__'] [data-segment-emotion]").selectOption({ label: values.emotion }); - await page.locator("[data-messages-segment-commit='__new__']").click(); - } - -+async function openMessageParts(page, messageName) { -+ await page.locator("[data-messages-name-cell]").filter({ hasText: messageName }).click(); -+} -+ - test("Message Studio renders Messages with child Message Parts and plays ordered parts", async ({ page }) => { - const sqlitePath = messagesDbPath(); - await fs.rm(sqlitePath, { force: true }); -@@ -194,28 +197,29 @@ test("Message Studio renders Messages with child Message Parts and plays ordered - - const messageRow = page.locator("[data-messages-row]").filter({ hasText: "Bat Encounter" }); - const messageNameCell = page.locator("[data-messages-name-cell]").filter({ hasText: "Bat Encounter" }); -- await expect(page.locator("[data-messages-segment-host]")).toBeVisible(); -- await messageNameCell.click(); - await expect(page.locator("[data-messages-segment-host]")).toHaveCount(0); - await messageRow.locator("td").nth(3).click(); - await expect(page.locator("[data-messages-segment-host]")).toHaveCount(0); - await messageNameCell.click(); - await expect(page.locator("[data-messages-segment-host]")).toBeVisible(); - await expect(page.getByRole("heading", { name: "Message Parts" })).toBeVisible(); -- await expect(page.getByRole("columnheader", { name: "Order" })).toBeVisible(); -- await expect(page.getByRole("columnheader", { name: "Text" })).toBeVisible(); -- await expect(page.getByRole("columnheader", { exact: true, name: "TTS Profile" })).toBeVisible(); -+ const partsTable = page.getByLabel("Message parts"); -+ await expect(partsTable.getByRole("columnheader", { name: "Order" })).toHaveCount(0); -+ await expect(partsTable.getByRole("columnheader", { name: "Text" })).toBeVisible(); -+ await expect(partsTable.getByRole("columnheader", { name: "Emotion" })).toBeVisible(); -+ await expect(partsTable.getByRole("columnheader", { exact: true, name: "TTS Profile" })).toBeVisible(); -+ await expect(partsTable.getByRole("columnheader", { name: "Status" })).toBeVisible(); -+ await expect(partsTable.getByRole("columnheader", { name: "Actions" })).toBeVisible(); - - await page.getByRole("button", { name: "Add Part" }).click(); - await expect(page.locator("[data-messages-segment-add-control-row]")).toHaveCount(0); - await expect(page.locator("[data-messages-segment-editor='__new__'] [data-segment-text]")).toBeVisible(); - await expect(page.locator("[data-messages-segment-editor='__new__'] [data-segment-emotion]")).toBeVisible(); - await expect(page.locator("[data-messages-segment-editor='__new__'] [data-segment-tts-profile]")).toContainText("Default Balanced TTS Profile"); -- await page.locator("[data-messages-segment-editor='__new__'] [data-segment-order]").fill(""); - await page.locator("[data-messages-segment-commit='__new__']").click(); - await expect(page.locator("[data-messages-validation-errors]")).toContainText("Part Text is required."); - await expect(page.locator("[data-messages-validation-errors]")).toContainText("Emotion is required."); -- await expect(page.locator("[data-messages-validation-errors]")).toContainText("Display Order is required."); -+ await expect(page.locator("[data-messages-validation-errors]")).not.toContainText("Display Order is required."); - await page.locator("[data-messages-segment-cancel='__new__']").click(); - - await addPart(page, { -@@ -316,6 +320,7 @@ test("Message Studio shows actionable playback error when audio engine is unavai - name: "Bat Encounter", - text: "Bats drop from the rafters.", - }); -+ await openMessageParts(page, "Bat Encounter"); - await addPart(page, { - emotion: "Urgent", - order: 1, -diff --git a/tests/playwright/tools/RootToolsFutureState.spec.mjs b/tests/playwright/tools/RootToolsFutureState.spec.mjs -index 1f043323e..ba97f5c6a 100644 ---- a/tests/playwright/tools/RootToolsFutureState.spec.mjs -+++ b/tests/playwright/tools/RootToolsFutureState.spec.mjs -@@ -277,7 +277,7 @@ test("root tools surface links current tool pages without old_* routes", async ( - await expect(page.getByRole("button", { name: "Progress" })).toHaveCount(0); - await expect(page.getByRole("button", { name: "Build Path" })).toBeVisible(); - await expect(page.getByRole("button", { name: "Build Path" })).not.toHaveAttribute("aria-disabled", "true"); -- await expect(page.locator("[data-tools-count]")).toHaveText("Tool Count: 15/43"); -+ await expect(page.locator("[data-tools-count]")).toHaveText("Tool Count: 16/44"); - await expect(page.locator("[data-toolbox-admin-nav-group]")).toHaveCount(0); - await expect(page.locator("nav.nav-links > .nav-item > a[data-route='admin']")).toHaveCount(0); - await expect(page.locator("nav.nav-links > a[data-route='learn']")).toHaveCount(1); -@@ -311,18 +311,15 @@ test("root tools surface links current tool pages without old_* routes", async ( - await expect(page.getByText("Build Path Wireframe")).toHaveCount(0); - await expect(page.locator("[data-toolbox-wireframe]")).toHaveCount(0); - await expect(page.locator("style, [style], script:not([src])")).toHaveCount(0); -- const readyGameWorkspaceCard = page.locator("main .control-card").filter({ -- has: page.locator("h3", { hasText: "Game Hub" }) -- }); -- await expect(readyGameWorkspaceCard.locator("a.btn")).toHaveAttribute("href", "../toolbox/game-workspace/index.html"); -+ await expect(page.locator("main a.btn[data-toolbox-launch-link='Game Hub'][href='../toolbox/game-workspace/index.html']")).toBeVisible(); - const defaultToolLabels = await page.locator("main [data-tools-accordion-list] .control-card h3").evaluateAll((labels) => labels.map((label) => label.textContent.trim())); -- expect(defaultToolLabels).toEqual(["Achievements", "Assets", "Colors", "Controls", "Game Configuration", "Game Design", "Game Hub", "Game Journey", "Idea Board", "Languages", "Message Studio", "Objects", "Saved Data", "Tags", "Text To Speech"]); -+ expect(defaultToolLabels).toEqual(["Achievements", "Assets", "Colors", "Controls", "Game Configuration", "Game Design", "Game Hub", "Game Hub", "Game Journey", "Idea Board", "Languages", "Message Studio", "Objects", "Saved Data", "Tags", "Text To Speech"]); - const textToSpeechCard = page.locator("main .control-card").filter({ - has: page.locator("h3", { hasText: /^Text To Speech$/ }) - }); - await expect(textToSpeechCard.locator("[data-toolbox-tool-name-link='Text To Speech']")).toHaveAttribute("href", "/toolbox/text-to-speech/index.html"); - await expect(textToSpeechCard.locator("[data-toolbox-tool-name-link='Text To Speech']")).toHaveAttribute("data-registered-tool-route", "toolbox/text-to-speech/index.html"); -- await expect(page.locator("[data-toolbox-readiness]")).toHaveText(["Wireframe", "Beta", "Complete", "Wireframe", "Beta", "Beta", "Beta", "Beta", "Wireframe", "Wireframe", "Beta", "Beta", "Wireframe", "Beta", "Beta"]); -+ await expect(page.locator("[data-toolbox-readiness]")).toHaveText(["Wireframe", "Beta", "Complete", "Wireframe", "Beta", "Beta", "Beta", "Beta", "Beta", "Wireframe", "Wireframe", "Beta", "Beta", "Wireframe", "Beta", "Beta"]); - await expect(page.locator("main .control-card").filter({ has: page.locator("h3", { hasText: /^AI Command Center$/ }) })).toHaveCount(0); - const oldStandaloneLabels = [ - ["Palette", "Manager"].join(" "), -@@ -392,7 +389,7 @@ test("root tools surface links current tool pages without old_* routes", async ( - const guestGroupLabels = await page.locator("[data-tools-accordion-list] details[data-tools-accordion]").evaluateAll((groups) => ( - groups.map((group) => group.dataset.toolsAccordion) - )); -- expect(guestGroupLabels).toEqual(["Idea", "Design", "Graphics", "Audio", "Objects", "Interface", "Controls", "Progression"]); -+ expect(guestGroupLabels).toEqual(["Idea", "Design", "Graphics", "Audio", "Objects", "Interface", "Controls", "Progression", "Publish"]); - await expect(page.locator("[data-tools-accordion='Admin']")).toHaveCount(0); - await expect(page.getByRole("button", { name: "Progress" })).toHaveCount(0); - await expect(page.locator("[data-tools-accordion-list] .control-card h3", { hasText: /^Progress$/ })).toHaveCount(0); -@@ -418,13 +415,13 @@ test("root tools surface links current tool pages without old_* routes", async ( - expect(failedRequests.filter((request) => request.includes("/toolbox/old_"))).toEqual([]); - - await page.goto(`${server.baseUrl}/toolbox/index.html`, { waitUntil: "networkidle" }); -- await expect(page.locator("[data-tools-count]")).toHaveText("Tool Count: 15/43"); -+ await expect(page.locator("[data-tools-count]")).toHaveText("Tool Count: 16/44"); - await expect(page.locator("main").getByText("Users", { exact: true })).toHaveCount(0); - await expect(page.locator("main").getByText("Creators", { exact: true })).toHaveCount(0); - await expect(page.locator("[data-toolbox-admin-nav-group]")).toHaveCount(0); - await setServerSession(server, MOCK_DB_KEYS.users.admin); - await page.goto(`${server.baseUrl}/toolbox/index.html`, { waitUntil: "networkidle" }); -- await expect(page.locator("[data-tools-count]")).toHaveText("Tool Count: 15/46"); -+ await expect(page.locator("[data-tools-count]")).toHaveText("Tool Count: 16/47"); - await expect(page.locator("[data-toolbox-admin-nav-group]")).toHaveCount(0); - const adminLabels = await page.locator("main [data-tools-accordion-list] .control-card h3").evaluateAll((labels) => labels.map((label) => label.textContent.trim())); - expect(adminLabels).toEqual(defaultToolLabels); -@@ -435,7 +432,7 @@ test("root tools surface links current tool pages without old_* routes", async ( - "Platform Settings" - ])); - await expect(page.locator("main .control-card").filter({ -- has: page.locator("h3", { hasText: /^Game Hub$/ }) -+ has: page.locator("[data-toolbox-tool-name-link='Game Hub'][href='/toolbox/game-workspace/index.html']") - }).locator("[data-toolbox-readiness]")).toHaveText("Beta"); - await expect(page.locator("main .control-card").filter({ - has: page.locator("h3", { hasText: /^Game Configuration$/ }) -@@ -461,7 +458,7 @@ test("root tools surface links current tool pages without old_* routes", async ( - const adminGroupLabels = await page.locator("[data-tools-accordion-list] details[data-tools-accordion]").evaluateAll((groups) => ( - groups.map((group) => group.dataset.toolsAccordion) - )); -- expect(adminGroupLabels).toEqual(["Idea", "Design", "Graphics", "Audio", "Objects", "Interface", "Controls", "Progression"]); -+ expect(adminGroupLabels).toEqual(["Idea", "Design", "Graphics", "Audio", "Objects", "Interface", "Controls", "Progression", "Publish"]); - await expect(page.getByRole("button", { name: "Progress" })).toHaveCount(0); - await page.getByRole("button", { name: "Build Path" }).click(); - await expect(page.locator("[data-build-path-table='workflow']")).toBeVisible(); -@@ -471,7 +468,7 @@ test("root tools surface links current tool pages without old_* routes", async ( - await expect(page.locator("[data-toolbox-admin-nav-group]")).toHaveCount(0); - await setServerSession(server, ""); - await page.goto(`${server.baseUrl}/toolbox/index.html`, { waitUntil: "networkidle" }); -- await expect(page.locator("[data-tools-count]")).toHaveText("Tool Count: 15/43"); -+ await expect(page.locator("[data-tools-count]")).toHaveText("Tool Count: 16/44"); - await expect(page.locator("main").getByText("Users", { exact: true })).toHaveCount(0); - await expect(page.locator("main").getByText("Creators", { exact: true })).toHaveCount(0); - expect(pageErrors).toEqual([]); + toolbox/text-to-speech/text2speech.js diff --git a/tests/playwright/tools/TextToSpeechFunctional.spec.mjs b/tests/playwright/tools/TextToSpeechFunctional.spec.mjs -index fa1050126..2661b957d 100644 +index 2661b957d..c9a659a4d 100644 --- a/tests/playwright/tools/TextToSpeechFunctional.spec.mjs +++ b/tests/playwright/tools/TextToSpeechFunctional.spec.mjs -@@ -104,9 +104,16 @@ test("Text To Speech page loads and speaks through browser speech synthesis", as - await expect(page.getByRole("heading", { level: 1, name: "Text To Speech" })).toBeVisible(); - await expect(page.locator("style, [style], script:not([src])")).toHaveCount(0); - await expect(page.locator("[data-tts-summary]")).toHaveClass(/content-cluster--nowrap/); -- await expect(page.locator("[data-tts-summary]")).toContainText("TTS Studio"); -+ await expect(page.locator("[data-tts-summary]")).not.toContainText("TTS Studio"); -+ await expect(page.locator("[data-tts-output-summary]")).toHaveCount(0); -+ await expect(page.locator("[data-tts-queue-list]")).toHaveCount(0); -+ await expect(page.locator("[data-tts-item-name]")).toHaveCount(0); -+ await expect(page.getByText("Named Sentence", { exact: true })).toHaveCount(0); -+ await expect(page.getByText("Output Summary", { exact: true })).toHaveCount(0); -+ await expect(page.getByText("Voice Filters", { exact: true })).toHaveCount(0); -+ await expect(page.getByText("Delivery", { exact: true })).toHaveCount(0); -+ await expect(page.getByText("Presets", { exact: true })).toHaveCount(0); - -- await expect(page.locator("[data-tts-voice-select]")).toContainText("Arcade Voice"); - await expect(page.locator("[data-tts-voice-count]")).toHaveText("2"); - await expect(page.locator("[data-tts-profile-count]")).toHaveText("3"); - await expect(page.locator("[data-tts-emotion-count]")).toHaveText("12"); -@@ -160,40 +167,25 @@ test("Text To Speech page loads and speaks through browser speech synthesis", as - await page.locator("[data-tts-emotion-editor] [data-tts-emotion-volume]").fill("0.7"); - await page.locator("[data-tts-emotion-editor] [data-tts-commit-emotion]").click(); - await expect(page.locator("[data-tts-status]")).toHaveText("Saved emotion setting: Urgent."); -- await expect(page.locator("[data-tts-output-summary]")).toContainText("\"contractVersion\": \"tts-profile-emotion-v1\""); -- await expect(page.locator("[data-tts-output-summary]")).toContainText("\"name\": \"Creature Profile Updated\""); -+ await expect(page.locator("[data-tts-emotion-row]").filter({ hasText: "Urgent" })).toContainText("Whisper-ish"); - -- await expect(page.locator("[data-tts-gender-select]")).toBeVisible(); -- await expect(page.locator("[data-tts-language-select]")).toBeVisible(); -- await expect(page.locator("[data-tts-age-select]")).toBeVisible(); -- await expect(page.locator("[data-tts-character-preset-select]")).toBeVisible(); -- await expect(page.locator("[data-tts-ssml-preset-select]")).toBeVisible(); -- await expect(page.locator("[data-tts-import-json]")).toBeEnabled(); -- await expect(page.locator("[data-tts-copy-json]")).toBeEnabled(); -- await expect(page.locator("[data-tts-export-json]")).toBeEnabled(); -+ await expect(page.locator("[data-tts-gender-select]")).toHaveCount(0); -+ await expect(page.locator("[data-tts-language-select]")).toHaveCount(0); -+ await expect(page.locator("[data-tts-age-select]")).toHaveCount(0); -+ await expect(page.locator("[data-tts-character-preset-select]")).toHaveCount(0); -+ await expect(page.locator("[data-tts-ssml-preset-select]")).toHaveCount(0); -+ await expect(page.locator("[data-tts-import-json]")).toHaveCount(0); -+ await expect(page.locator("[data-tts-copy-json]")).toHaveCount(0); -+ await expect(page.locator("[data-tts-export-json]")).toHaveCount(0); -+ await page.locator("[data-tts-profile-row]").filter({ hasText: "Creature Profile Updated" }).getByRole("button", { name: "Edit Profile" }).click(); -+ await expect(page.locator("[data-tts-profile-editor] [data-tts-profile-voice]")).toBeVisible(); -+ await expect(page.locator("[data-tts-profile-editor] [data-tts-profile-language]")).toBeVisible(); -+ await expect(page.locator("[data-tts-profile-editor] [data-tts-profile-gender]")).toBeVisible(); -+ await expect(page.locator("[data-tts-profile-editor] [data-tts-profile-age]")).toBeVisible(); -+ await page.locator("[data-tts-profile-editor] [data-tts-cancel-profile]").click(); - - await page.locator("[data-tts-text-input]").fill("Launch the next wave."); -- await page.locator("[data-tts-item-name]").fill("Wave intro"); -- await page.locator("[data-tts-character-preset-select]").selectOption("dramatic"); -- await page.locator("[data-tts-age-select]").selectOption("teen"); -- await page.locator("[data-tts-ssml-preset-select]").selectOption("whisper-ish"); -- await expect(page.locator("[data-tts-pitch-value]")).toHaveText("1.1"); -- await expect(page.locator("[data-tts-volume-value]")).toHaveText("0.6"); -- await page.locator("[data-tts-voice-select]").selectOption("arcade-voice-uri"); -- await page.locator("[data-tts-rate]").fill("1.4"); -- await page.locator("[data-tts-pitch]").fill("0.8"); -- await page.locator("[data-tts-volume]").fill("0.55"); -- await expect(page.locator("[data-tts-rate-value]")).toHaveText("1.4"); -- await expect(page.locator("[data-tts-pitch-value]")).toHaveText("0.8"); -- await expect(page.locator("[data-tts-volume-value]")).toHaveText("0.55"); - await expect(page.locator("[data-tts-text-count]")).toHaveText("21"); -- await page.locator("[data-tts-add-item]").click(); -- await expect(page.locator("[data-tts-queue-list]")).toContainText("Wave intro"); -- await expect(page.locator("[data-tts-output-summary]")).toContainText("\"name\": \"Wave intro\""); -- await page.locator("[data-tts-duplicate-item]").click(); -- await expect(page.locator("[data-tts-queue-list]")).toContainText("Wave intro 2 copy"); -- await page.locator("[data-tts-delete-item]").click(); -- await expect(page.locator("[data-tts-queue-list] [data-tts-queue-item]")).toHaveCount(2); - - await expect(page.locator("[data-tts-speak]")).toBeEnabled(); - await page.locator("[data-tts-speak]").click(); -@@ -201,12 +193,12 @@ test("Text To Speech page loads and speaks through browser speech synthesis", as - let calls = await page.evaluate(() => window.__textToSpeechCalls); - expect(calls.at(-1)).toEqual(expect.objectContaining({ - lang: "en-US", -- pitch: 0.8, -- rate: 1.4, -+ pitch: 1.2, -+ rate: 1.1, - text: "Launch the next wave.", - type: "speak", - voiceName: "Arcade Voice", -- volume: 0.55, -+ volume: 0.7, - })); - - await page.locator("[data-tts-pause]").click(); -@@ -280,7 +272,7 @@ test("Text To Speech shows actionable error when browser speech synthesis is una - await expect(page.locator("[data-tts-emotion-count]")).toHaveText("12"); - await expect(page.locator("[data-tts-engine-status]")).toContainText("SpeechSynthesis is unavailable"); - await expect(page.locator("[data-tts-status]")).toContainText("Use a browser with Web Speech API support"); -- await expect(page.locator("[data-tts-voice-select]")).toContainText("No browser voices available"); -+ await expect(page.locator("[data-tts-voice-select]")).toHaveCount(0); - await expect(page.locator("[data-tts-speak]")).toBeDisabled(); - await expect(page.locator("[data-tts-stop]")).toBeDisabled(); - -diff --git a/toolbox/messages/messages.js b/toolbox/messages/messages.js -index c881cc0b4..4cb02f9bf 100644 ---- a/toolbox/messages/messages.js -+++ b/toolbox/messages/messages.js -@@ -221,7 +221,7 @@ function createMessageAddControlRow() { - } - - function createSegmentAddControlRow() { -- const row = tableActionRow(6, createButton("Add Part", "messagesSegmentAddRow", state.selectedMessageKey)); -+ const row = tableActionRow(5, createButton("Add Part", "messagesSegmentAddRow", state.selectedMessageKey)); - row.dataset.messagesSegmentAddControlRow = state.selectedMessageKey; - return row; - } -@@ -514,7 +514,7 @@ function createMessageSegmentTable() { - table.setAttribute("aria-label", "Message parts"); - const thead = document.createElement("thead"); - const headerRow = document.createElement("tr"); -- ["Order", "Text", "Emotion", "TTS Profile", "Status", "Actions"].forEach((label) => { -+ ["Text", "Emotion", "TTS Profile", "Status", "Actions"].forEach((label) => { - const header = document.createElement("th"); - header.scope = "col"; - header.textContent = label; -@@ -526,7 +526,7 @@ function createMessageSegmentTable() { - - const segments = selectedMessageSegments(); - if (!segments.length && state.editingSegmentKey !== NEW_ROW_KEY) { -- tbody.append(tableMessage(6, "No message parts saved for this message.")); -+ tbody.append(tableMessage(5, "No message parts saved for this message.")); - } - - segments.forEach((segment, index) => { -@@ -555,7 +555,6 @@ function createMessageSegmentTable() { - segment.key, - )); - row.append( -- createCell(String(segment.displayOrder)), - createCell(segment.segmentText), - createCell(segment.emotionProfileName || "Unknown"), - ttsCell, -@@ -581,9 +580,7 @@ function createSegmentEditRow(segment = null) { - const key = segment?.key || NEW_ROW_KEY; - const row = document.createElement("tr"); - row.dataset.messagesSegmentEditor = key; -- -- const orderCell = document.createElement("td"); -- orderCell.append(createNumberInput(segment?.displayOrder || nextSegmentOrder(), "segmentOrder", { min: 1, step: 1 })); -+ row.dataset.messagesSegmentOrder = String(segment?.displayOrder || nextSegmentOrder()); - - const textCell = document.createElement("td"); - textCell.append(createTextarea(segment?.segmentText || "", "segmentText", 3)); -@@ -607,7 +604,7 @@ function createSegmentEditRow(segment = null) { - createButton("Cancel", "messagesSegmentCancel", key), - )); - -- row.append(orderCell, textCell, emotionCell, ttsCell, statusCell, actions); -+ row.append(textCell, emotionCell, ttsCell, statusCell, actions); - return row; - } - -@@ -728,7 +725,7 @@ function segmentValues(key) { - const root = elements.table?.querySelector(`[data-messages-segment-editor="${key}"]`); - return { - active: editorChecked(root, "[data-segment-active]"), -- displayOrder: editorValue(root, "[data-segment-order]"), -+ displayOrder: editorValue(root, "[data-segment-order]") || root?.dataset.messagesSegmentOrder || String(nextSegmentOrder()), - emotionProfileKey: editorValue(root, "[data-segment-emotion]"), - messageKey: state.selectedMessageKey, - segmentText: editorValue(root, "[data-segment-text]"), -@@ -797,11 +794,13 @@ async function commitMessage(key) { - ? createMessage(values) - : updateMessage(key, values); - state.editingMessageKey = ""; -- state.selectedMessageKey = result.message.key; - if (key === NEW_ROW_KEY) { -+ state.selectedMessageKey = ""; - state.selectedSegmentKey = ""; -+ } else { -+ state.selectedMessageKey = result.message.key; - } -- await reloadAfterChange(result.message.key); -+ await reloadAfterChange(state.selectedMessageKey, state.selectedSegmentKey); - setText(elements.log, `Updated row ${result.message.name}.`); - } catch (error) { - showValidation([error instanceof Error ? error.message : String(error || "Message row update failed.")]); +@@ -120,8 +120,14 @@ test("Text To Speech page loads and speaks through browser speech synthesis", as + await expect(page.locator("[data-tts-profile-table]")).toContainText("Default Balanced Profile"); + await expect(page.locator("[data-tts-profile-table]")).toContainText("Man Profile 1"); + await expect(page.locator("[data-tts-profile-table]")).toContainText("Woman Profile 2"); +- await expect(page.locator("[data-tts-profile-row]").filter({ hasText: "Default Balanced Profile" }).getByRole("button", { name: "Delete" })).toBeDisabled(); +- await page.locator("[data-tts-profile-row]").filter({ hasText: "Default Balanced Profile" }).click(); ++ const defaultProfileRow = page.locator("[data-tts-profile-row]").filter({ hasText: "Default Balanced Profile" }); ++ await expect(defaultProfileRow.getByRole("button", { name: "Delete" })).toBeDisabled(); ++ await expect(page.locator("[data-tts-emotion-host]")).toHaveCount(0); ++ await defaultProfileRow.locator("td").nth(5).click(); ++ await expect(page.locator("[data-tts-emotion-host]")).toHaveCount(0); ++ await expect(defaultProfileRow.locator("[data-tts-profile-name-cell]")).toHaveAttribute("aria-expanded", "false"); ++ await defaultProfileRow.locator("[data-tts-profile-name-cell]").click(); ++ await expect(defaultProfileRow.locator("[data-tts-profile-name-cell]")).toHaveAttribute("aria-expanded", "true"); + await expect(page.getByRole("heading", { name: "Emotion Settings" })).toBeVisible(); + await expect(page.getByRole("columnheader", { name: "Emotion", exact: true })).toBeVisible(); + await expect(page.getByRole("columnheader", { name: "Preset" })).toBeVisible(); +@@ -130,20 +136,22 @@ test("Text To Speech page loads and speaks through browser speech synthesis", as + await expect(page.locator("[data-tts-emotion-row]").filter({ hasText: "Happy" })).toBeVisible(); + await expect(page.locator("[data-tts-emotion-row]").filter({ hasText: "Angry" })).toBeVisible(); + await expect(page.locator("[data-tts-emotion-row]").filter({ hasText: "Scared" })).toBeVisible(); +- await page.locator("[data-tts-profile-row]").filter({ hasText: "Man Profile 1" }).click(); ++ await expect(page.locator("[data-tts-emotion-add-control-row]").getByRole("button", { name: "Add Emotion" })).toBeVisible(); ++ await page.locator("[data-tts-profile-row]").filter({ hasText: "Man Profile 1" }).locator("[data-tts-profile-name-cell]").click(); + await expect(page.locator("[data-tts-emotion-row]")).toHaveCount(4); + await expect(page.locator("[data-tts-emotion-row]").filter({ hasText: "Neutral" })).toBeVisible(); + await expect(page.locator("[data-tts-emotion-row]").filter({ hasText: "Happy" })).toBeVisible(); + await expect(page.locator("[data-tts-emotion-row]").filter({ hasText: "Angry" })).toBeVisible(); + await expect(page.locator("[data-tts-emotion-row]").filter({ hasText: "Scared" })).toBeVisible(); +- await page.locator("[data-tts-profile-row]").filter({ hasText: "Woman Profile 2" }).click(); ++ await page.locator("[data-tts-profile-row]").filter({ hasText: "Woman Profile 2" }).locator("[data-tts-profile-name-cell]").click(); + await expect(page.locator("[data-tts-emotion-row]")).toHaveCount(4); + await expect(page.locator("[data-tts-emotion-row]").filter({ hasText: "Neutral" })).toBeVisible(); + await expect(page.locator("[data-tts-emotion-row]").filter({ hasText: "Happy" })).toBeVisible(); + await expect(page.locator("[data-tts-emotion-row]").filter({ hasText: "Angry" })).toBeVisible(); + await expect(page.locator("[data-tts-emotion-row]").filter({ hasText: "Scared" })).toBeVisible(); + +- await page.getByRole("button", { name: "Add Profile" }).click(); ++ await expect(page.locator("[data-tts-profile-add-control-row]").getByRole("button", { name: "Add Profile" })).toBeVisible(); ++ await page.locator("[data-tts-profile-add-control-row]").getByRole("button", { name: "Add Profile" }).click(); + await expect(page.locator("[data-tts-profile-editor='__new__']")).toBeVisible(); + await page.locator("[data-tts-profile-editor='__new__'] [data-tts-profile-name]").fill("Creature Profile"); + await page.locator("[data-tts-profile-editor='__new__'] [data-tts-profile-gender]").selectOption("neutral"); +@@ -154,7 +162,9 @@ test("Text To Speech page loads and speaks through browser speech synthesis", as + await page.locator("[data-tts-profile-editor] [data-tts-profile-name]").fill("Creature Profile Updated"); + await page.locator("[data-tts-profile-editor] [data-tts-commit-profile]").click(); + await expect(page.locator("[data-tts-status]")).toHaveText("Saved TTS profile: Creature Profile Updated."); +- await page.getByRole("button", { name: "Add Emotion" }).click(); ++ await expect(page.locator("[data-tts-emotion-add-control-row]").getByRole("button", { name: "Add Emotion" })).toBeVisible(); ++ await page.locator("[data-tts-emotion-add-control-row]").getByRole("button", { name: "Add Emotion" }).click(); ++ await expect(page.locator("[data-tts-emotion-add-control-row]")).toHaveCount(0); + await page.locator("[data-tts-emotion-editor='__new__'] [data-tts-emotion-name]").selectOption("urgent"); + await page.locator("[data-tts-emotion-editor='__new__'] [data-tts-emotion-pitch]").fill("1.2"); + await page.locator("[data-tts-emotion-editor='__new__'] [data-tts-emotion-rate]").fill("1.1"); diff --git a/toolbox/text-to-speech/index.html b/toolbox/text-to-speech/index.html -index 95672aa69..60724366e 100644 +index 60724366e..7989b8309 100644 --- a/toolbox/text-to-speech/index.html +++ b/toolbox/text-to-speech/index.html -@@ -6,7 +6,7 @@ - - - Text To Speech - GameFoundryStudio -- -+ - - - -@@ -18,80 +18,32 @@ -
-
Project Workspace / Audio
-

Text To Speech

--

Create named speech lines, shape browser voices, and preview spoken game text through the shared engine audio Text To Speech module.

-+

Create reusable speech profiles, tune emotion settings, and preview spoken game text through the shared engine audio Text To Speech module.

-
- -
-
-- - -
-