You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Drop the side panel: host the conversation in the page, speech-only
The product is voice-in/voice-out; the panel existed mainly to give the
speech APIs a document and the captions a home. Move the whole session
into the content script instead:
- The orchestrator, conversation machine, and STT now run in the puzzle
page. The mic prompt/grant belongs to nytimes.com, and the session
dies with the page on reload/navigation — both accepted by design.
- TTS stays on chrome.tts (immune to page autoplay rules), which
content scripts can't call, so speak/cancel are relayed to the
service worker over the session port (new speech/remote-tts-port.js,
unit-tested against a fake port).
- No visual UI at all: captions are replaced by page-console
diagnostics ([CrosswordChat] lines). REQ-SPCH-007/008 rewritten
accordingly; no DOM injection, no server logging (REQ-NFR-001).
- Icon click on an NYT page without the content script (article pages)
now gets the "I don't see a crossword" line spoken by the service
worker itself, since there is no panel to explain.
- The selector probe stays reachable via a cc:probe message from the
service-worker console (MT-01 updated with the one-liner).
- Requirements, manual tests, architecture, feasibility, and README
updated to match; sidepanel/ sources and manifest entries removed.
Verified: 121 unit/integration tests + trace green (82/82 covered);
Playwright smoke test of the built extension against the offline
fixture exercises start → clue readout via the tts relay → listen →
retry-once → session end with badge cleanup.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01QDWV85h1F7E7tosX5RAtCF
|`tests/fixtures/fake-nyt/`| A faithful miniature of the NYT crossword page (same classes, same keyboard model) — integration-test target and offline demo stage. |
38
40
|`tools/trace.mjs`| Requirements-coverage enforcer (`npm run trace`). |
39
41
|[`docs/RELEASING.md`](docs/RELEASING.md)| Versioning (current: **0.9.0**), CI workflows, release process, Chrome Web Store deployment setup. |
## 6. Testing architecture (the executable-requirements machinery)
134
140
@@ -150,7 +156,7 @@ NYT subscription.
150
156
151
157
| # | Decision | Why | Revisit when |
152
158
|---|---|---|---|
153
-
| D1 | MV3 + side panel hosts the conversation| Speech needs a document; panel persists; captions UI | Popup/offscreen if panel UX annoys |
159
+
| D1 | MV3 + the content script hosts the conversation, speech-only (rev. 2 — originally the side panel) | Speech recognition needs a document and the page is one; no UI wanted (captions dropped for console diagnostics); session dying with the page is desired | Offscreen document if page-lifetime coupling or the nytimes.com mic grant annoys |
154
160
| D2 |`chrome.tts` primary for output | Immune to page autoplay rules | speechSynthesis-only if voice quality disappoints |
155
161
| D3 | Synthetic click+keydown for writing | Matches user behavior; per-cell addressing beats cursor settings | MT-02 fails → fallbacks in FEASIBILITY §3 |
156
162
| D4 | Pure reducer for dialog policy | The spec is mostly dialog policy; reducers make it assertable | — |
0 commit comments