Proposed execution roadmap. This document sequences three implementation-ready plans:
The roadmap is intentionally outcome-based. Week ranges are sequencing guides, not release promises. Each feature must pass its own rollout gate before the next dependency is treated as available.
Move SpeakTrue from a collection of speech tools toward a dependable communication workspace:
The existing TTS, STT, STS, Soundboard, artifact, auth, and entitlement paths remain the foundation. The roadmap adds workflow continuity around them rather than replacing their contracts.
live_interpreter) is the account-synced default across iOS, Android, and web.sts-realtime-finalize is the artifact handoff and preserves artifact_id, artifact_path, audio_path, download_path, transcribed_text, and clip_metadata.soundboard_clips is the canonical reusable audio record. It supports categories, transcript text, generation metadata, ordering, and offline availability, but it has no first-class favorites, tags, or cross-category search.bash scripts/verify_android_ci_local.sh before commit or push.| Outcome | User-visible proof | Release measure |
|---|---|---|
| Conversation continuity | A user completes several Turn-Based STS turns, replays any turn, leaves, and resumes the conversation | At least 95% of accepted turns attach to a conversation; attach failures are recoverable and idempotent |
| Speech retrieval | A user searches all clips, filters favorites or sources, and plays a result without opening its folder first | Median signed-in retrieve-to-play time under 3 seconds on a warm network path |
| Fast accessible speech | A user opens Quick Speak, enters or selects a phrase, and hears it with one primary action; a platform voice remains available offline | Local fallback success above 99% in device tests; no phrase content in telemetry |
| Cross-platform contract stability | Web, iOS, and Android decode the same new fields while old clients continue to function | Contract tests and per-surface gates pass with old fields remaining valid |
Metrics are proposed targets. Baseline measurement must precede any claim that a target has been met.
Exit gate: each concept is demoable without a new durable schema, and user-flow observations confirm that the chosen interaction is worth persisting.
soundboard_clips.Exit gate: an old client still completes STS and loads Soundboard; a new web client can resume a conversation and search/favorite clips.
Exit gate: all native slices pass focused tests; Android passes its complete local gate; manual device tests demonstrate network failure recovery.
Exit gate: the three plans form one flow—complete a turn, save or pin it, find it later, and speak it quickly.
docs/index.md when each plan changes from proposed to active or implemented.Exit gate: rollback has been rehearsed, support diagnostics do not contain content, and no compatibility client is forced onto a new contract.
flowchart LR
C0["STS semantics and ephemeral timeline"] --> C1["Persistent conversations"]
C1 --> I1["Save a turn with provenance"]
L0["Unified Library query"] --> L1["Favorites and tags"]
L1 --> I1
Q0["Native local Quick Speak"] --> Q1["System speech fallback"]
Q1 --> Q2["Synced pinned phrases"]
L1 --> Q2
Q2 --> Q3["App shortcuts"]
I1 --> R["Integrated staged release"]
Q3 --> R
Conversation persistence and the library read path can proceed in parallel after their contracts are fixed. Shortcut work depends on stable phrase identity. Quick Speak’s local MVP does not depend on the Unified Library.
Use separate flags so one feature can roll back without disabling another:
conversation_workspace_enabledspeech_library_enabledquick_speak_enabledquick_speak_system_fallback_enabledquick_speak_shortcuts_enabledFlags belong in server-controlled settings or the existing app configuration boundary. Do not use compile-time-only flags for staged production rollout.
Record only operational metadata:
Do not record transcript text, phrase text, clip filenames, storage paths, signed URLs, voice samples, or provider credentials. Product events must be distinguishable from billable provider usage_events so experimentation does not alter quota accounting.
Proposed event names:
conversation_started, conversation_turn_finalized, conversation_resumed;library_query_completed, library_item_played, library_favorite_changed;quick_speak_opened, quick_speak_playback_started, quick_speak_fallback_used.Every slice runs the narrowest relevant checks first, then the full surface gate when required:
# Backend contracts and migrations
npx -y deno@latest test backend/supabase/functions/<touched-function>/*_test.ts
bash scripts/coverage_backend_contracts.sh
bash scripts/regression_migration_paths.sh
# Web
web/python-web-app/venv/bin/pytest <focused-test-files>
node --check web/python-web-app/static/js/<touched-file>.js
node web/python-web-app/tests/js/<focused-runtime-check>.mjs
# iOS
xcodebuild test -project ios/SpeakTrue.xcodeproj -scheme SpeakTrue \
-destination 'platform=iOS Simulator,name=iPhone 17' \
-only-testing:SpeakTrueTests/<FocusedTestClass>
# Android, mandatory for any Android-facing slice before commit/push
bash scripts/verify_android_ci_local.sh
# Every slice
git diff --check
git status --short
Migration slices also require a rollback rehearsal and a live Supabase smoke against an allowlisted test account before broad rollout.
Live Interpreter as a historical mode label or rename it to Turn-Based Revoice until true translation exists.docs/index.md, operator docs, schema snapshots, and Obsidian project notes match deployed behavior.