Foundation H: retire Read while preserving text and shared audio foundations
Maintainers usually reply within 1 day
Nobody has claimed this yet.
Assessment
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Newbie friendliness
- 25/100
Research direction
Read the canonical brief at docs/mac-foundation.md and the decision in PR #278 first. Then trace the named entry points, especially AppModel, Core.swift, VoicePreferences/main.swift, and scripts/release/preview.py; follow actual callers rather than filename matches. Run the affected tests and packaged-bundle checks. Done means Read is removed, dormant state and exact legacy text are preserved, and the listed shared audio, Dictate, and prompt-insertion behaviors still work.
Written by the indexing model from the issue text.
Description
Retire Read, Workbench's owned text-to-speech capability, from the focused Mac product. This is the decided result of the adversarial review in PR #278, not another Read refinement or an assertion that all its existing code is broken. The ordinary listening job has a capable native Mac route; a distinct recurring Workbench listening/export job has not been established. Package H remains under #7.
Removal boundary
- Read is route
speak, toolbar.read, shortcut id 6. Remove its page/sidebar, panel/toolbar/current-work entries, Window menu, shortcut catalogue and registration of previously enabled keys. Safely translate old toolbar modes/routes. Do not renumber other shortcuts. - Remove contextual Read aloud from History, Library and assistant results. Keep visual answer inspection, labeled Review result, Copy, export and original records.
- Remove selected-text Services registration/admission in both edition bundles. Update
scripts/release/preview.pyand its tests, which currently require that service. Keep general Services, signing and identity checks. - Remove TTS provider/voice/model-download setup and public promises. Stop startup/activation voice enumeration, TTS Keychain status probing, catalogue requests, neural discovery/load/download, preview, render/export and production developer-command admission. Stale callbacks/Services/preferences cannot restart it.
- No Advanced Read switch, contextual-only TTS, replacement Listen tool, permanent legacy page or automatic invocation of macOS speech. Brief help may point to Apple's native Read & Speak and explain its differing selection behavior.
Preserve narrowly
Core.SavedStatestores reading text/voice/rate alongside Dictate draft/original text, History, corrections and unresolved delivery. Keep compatible decoding and round-trip dormant fields.- For a nonempty old
speechText, preserve the exact Unicode text in one ordinary Library-linked UTF-8 file, with idempotent identity, atomic writes and file/reference readback. Keep the original field. Do not truncate, normalize, overwrite Dictate, fabricate a transcript or duplicate the item on relaunch. A failed migration preserves source with a contextual Library retry; empty/fresh profiles get no legacy UI. - Read permits one million characters; Library prompts only 50,000. Use a file resource, not a prompt or new reading archive.
- Keep explicitly exported audio files untouched. Generated audio is transient in inspected source; do not scan arbitrary folders or preserve every temp file. Use existing update/shutdown admission for owned generation/export and reject late completions.
- Inert TTS preferences/keys/caches may stay without a management panel. Do not read/send/delete credentials as incidental cleanup. Cache deletion is optional and only the verified inactive Pocket TTS subtree, never the shared FluidAudio parent or system voices.
Shared foundations that stay
ReadbackModel/ReadbackView, route readback and shortcut id 5 are Snap & Talk, not Read. Keep them, Dictate/Meetings recognition, Parakeet/FluidAudio, original meeting/narration playback, VoiceOver, clipboard/text delivery and prompt insertion. The existing update-busy projection groups prompt insertion with reading; preserve the surviving guard. No broad audio/plugin-framework rewrite.
Starting points: AppModel, Core.swift, ReadSelectionService, WorkbenchHome/Views, WorkbenchControlTool/toolbar projections, HistorySelectionControls, DemoLibraryView, VoicePreferences/main.swift, ReadingProviderView/NeuralVoiceViews, scripts/Info.plist, scripts/release/preview.py. Trace actual callers, not filename matches.
Acceptance X3
Fresh and upgraded signed bundles have no Read action, provider work, model download or Service admission. Upgrade a fixture with enabled id 6, old toolbar mode, selected online/neural provider and a large Unicode draft; the exact text is in one normal Library file through two relaunches. Inject file/Library save failure and verify no false completion or source loss. Unrelated original text/history/recovery and exported audio remain intact. Dictate, Meetings original playback, Snap & Talk id 5, VoiceOver and prompt-insertion update deferral still work. Check actual packaged Service metadata, negative dispatch and late callbacks as well as registry/gallery. Replace obsolete feature-success tests with removal/preservation tests in the same bounded change.
Hold Read-only #267 from the refinement batch; preserve its history and independently useful shared fixes. Reconcile #17/#161/#173 as superseded Read acceptance or preservation work, never as fixed by documentation. Coordinate AppModel, Library, main and toolbar edits with #279/#280/#281; one writer per shared file. This can release independently once its affected acceptance passes and does not wait for Present hardware.
Decision and evidence: spec PR #278, canonical brief, adversarial research.
- Dominant language
- Swift
- Stars
- 0
- Forks
- 1
- Avg merge
- 8h 5m
- Merged PRs (30d)
- 215
Getting set up
- No Dockerfile or Docker Compose file
- Has a pull request template
- Read the contributing guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
More from Ship-Work/workbench
-
bug
Difficulty 2/5 1-3 hours Newbie friendliness 76/100
Maintainers usually reply within 1 day
-
bug
Difficulty 2/5 1-3 hours Newbie friendliness 72/100
Maintainers usually reply within 1 day
-
Difficulty 2/5 1-3 hours Newbie friendliness 70/100
Maintainers usually reply within 1 day
-
documentation good first issue help wanted
Difficulty 2/5 Half a day Newbie friendliness 74/100
Ship-Work/workbench#29 · 1 comment ·
Maintainers usually reply within 1 day
-
bug
Difficulty 2/5 1-3 hours Newbie friendliness 55/100
Maintainers usually reply within 1 day
All issues in Ship-Work/workbench
Similar issues
-
Difficulty 2/5 1-3 hours Newbie friendliness 72/100
SwiftKickMobile/skai#84 ·
-
Difficulty 2/5 1-3 hours Newbie friendliness 78/100
raullenchai/Rapid-MLX#4889 ·
Maintainers usually reply within 1 day
-
Difficulty 1/5 Under an hour Newbie friendliness 75/100
Maintainers usually reply within 1 day
-
iOS-2026
Difficulty 2/5 1-3 hours Newbie friendliness 66/100
mozilla-mobile/firefox-ios#36150 ·
Maintainers usually reply within 1 day
-
Difficulty 2/5 1-3 hours Newbie friendliness 83/100