plan(slice-3): OpenAI Realtime brain implementation plan (spec §1.1)
11-task TDD plan; mirrors slice-2/slice-1's plan shape (header,
global constraints extracted verbatim from spec §1.1, file-structure
delta on slice-2, task-to-file mapping, per-task TDD steps with
failing-test-first / verify red / implement / verify green / commit).
Tasks:
1. Workspace deps + rutster-brain-realtime crate skeleton.
2. Tap protocol additive v1 extensions (speech_started/stopped,
function_call, function_call_output, tools.update) - 6 TDD tests.
3. API-key loader (env var + file-path override) - 5 TDD tests.
4. Translator (tap <-> OpenAI Realtime event mapping) - 8 TDD tests
incl. the S4 turn-ownership assertion.
5. OpenAI wss client pump (session.update with turn_detection: null
on handshake, select! over tap input + OpenAI input).
6. Tool trait + registry + HangupTool (FOB-boundary dispatch) - 5 TDD
tests.
7. TapClient function_call arms + TapConn extension (side-channel
mpsc pair; the seam test preserved - TapEngine's structure
unchanged, only new mpsc halflings threaded through).
8. session_map tool-call side-channel drain (the FOB dispatch
becomes end-to-end live; drive_all_sessions mirrors slice-2's
flush_rx drain pattern).
9. Brain binary (ws server on :8082 + OpenAI client glue;
--features=mock uses run_mock_brain stub for now).
10. MockRealtimeBrain + integration test (no real OpenAI creds).
11. Python reference brain + LEARNING.md + README dev loop.
Spec self-review: every spec section mapped to a task; no TBD
placeholders; type consistency verified (FunctionCallEvent,
ToolResult, Tool, ToolRegistry, HangupTool, run_mock_brain,
load_api_key, TranslateError, OpenAiClientError, and the 6
translator fn names all appear consistently).