ADR 0195: Voice input — harness ear (PTT / VAD), не «слушай N секунд» в ходе агента¶
Статус: Accepted
Дата: 2026-07-27
Tags: #cdp #sense #voice #ptt #vad #whisper #webcam #harness #autonomy #kokoro #openvoice #adr #cascade-ide
Связанные ADR¶
| ADR | Роль |
|---|---|
| 0185 | Wake / enqueue completion после локального события (utterance ready) |
| 0184 | Mute / «беруши» — голос-вход тоже должен уважать mute |
| 0187 | Outlet ≠ in-proc sense; ухо не парковать в guest MCP |
| 0166 | Не жечь токены на «агент слушает»; ear вне FM |
| 0048 | Исторический Cursor MCP surface (webcam / kokoro) |
| 0034 | Opt-in сенсоры; privacy / presence — соседний контур |
| 0181 | Sense payload в ход — opt-in, не всегда vision/audio dump |
Резюме¶
- Паттерн Cursor «скажи слушай 10с → агент пишет mic → Whisper → отвечает Kokoro» — костыль модели хода, не дефект микрофона.
- В харнессе (CDP / CIDE) ухо живёт в локальном органе: Push-to-talk (P0) или VAD (P1) → in-proc
audio+transcribe→ в ход агента уже текст (опционально path к wav). - Агент не держит continuous listen между тиками и не спрашивает длительность у оператора.
- Sense stack in-proc (
cdp_webcam): запись/Whisper уже есть (V0 autonomy); TTS out — отдельный контур (цель OpenVoiceTts; Kokoro interim).
Контекст¶
Как было в Cursor (до CDP desk)¶
Оператор хотел сказать агенту голосом. Единственный рабочий контракт:
- В чате: «слушай, 10 секунд» (или аналог).
- Агент вызывает MCP
capture_audio/ WaveIn на фиксированныйduration_sec. transcribe_audio_whisper→ текст в контекст.- Ответ — часто через
kokoro-tts-mcp.
Это работало, но UX плохой: надо заранее угадать длительность; тишина в конце окна; нельзя естественно «договорить мысль».
Почему так вышло¶
Composer / ACP-агент живёт тиками: после конца хода нет фонового процесса «уха». Continuous listen внутри FM-тика = privacy + CPU + всё равно обрыв на end-of-turn. Поэтому «N секунд» было вынужденным API хода, а не архитектурой sense.
Что изменилось (V0 sense desk)¶
In-proc cdp_webcam / go=webcam_desk (ship 0.5.233): audio, transcribe, av, … — capture/analysis parity без outlet guest. Автономия ARM (cdp_ignite) будит агента, но не заменяет голосовой вход оператора.
Нужно зафиксировать, где живёт ухо в своём харнессе.
Решение¶
Разделение ролей¶
| Слой | Ответственность |
|---|---|
| Harness ear (орган desk / hotkey / UI) | Старт/стоп записи, VAD, mute, privacy gate |
Sense primitives (cdp_webcam op=audio|transcribe|av) |
WaveIn / Whisper in-proc — вызываются органом, не «из промпта длительности» |
Wake / inject (0185, cdp_ignite) |
После готового utterance — enqueue ход с текстом (+ optional audio_path) |
| Voice out | Отдельный organ (цель: OpenVoiceTts; Kokoro — interim, не канон) |
Канон входа (порядок внедрения)¶
P0 — Push-to-talk (PTT)
- Hotkey / кнопка desk: down → начать запись, up → stop.
- Орган: op=audio с duration = пока зажато (или start/stop API), затем op=transcribe.
- Результат: transcript (+ file_path) → inject в Intercom / Composer / CCR как user message (или structured utterance event).
- Агент отвечает текстом; TTS out — по политике канала (не обязателен в том же тике).
P1 — Voice activity (VAD)
- Орган armed/disarmed явно (default disarmed; уважает 0184).
- Речь → буфер; тишина ≥ порога → конец фразы → тот же pipeline, что PTT.
- Без «скажи длительность».
P2 — Wake word (опционально)
- Поверх VAD: активация только после ключевой фразы. Не блокер P0/P1.
Контракт utterance (черновик)¶
utterance_ready:
transcript: string
audio_path?: path under workspace # optional; агент может не читать wav
language?: string
source: "ptt" | "vad" | "wake"
started_utc / ended_utc
device_number?: int
В ход агента по умолчанию кладём transcript; сырой audio — по opt-in (аналог vision opt-in 0181).
Cursor dogfood (escape)¶
Пока пилотим в Cursor Composer: допускается legacy «слушай Nс» как fallback (нет PTT UI). Не считать это каноном харнесса. Цель dogfood — проверить sense primitives; канон UX — PTT/VAD в CDP/CIDE.
Privacy / safety¶
- Mic: явный armed / PTT; нет always-on без opt-in.
- Mute канала (0184) глушит ear.
- Не путать с presence/liveness webcam (0034) — другой контракт.
Последствия¶
- UX: естественная речь без угадывания секунд.
- Экономика: Whisper/TTS локально; в FM только текст utterance → меньше токенов, чем «агент крутит audio tool вслепую».
- Архитектура: sense остаётся in-proc desk organ; ear — orchestration над ним + wake.
- Нужна реализация: hotkey/PTT UI + start/stop (или duration-from-hold) + VAD later; wire в ignite/Intercom.
Отклонённые альтернативы¶
| Вариант | Почему нет |
|---|---|
| Continuous listen внутри агентского хода / FM | Нет фонового уха между тиками; privacy; обрыв на end-of-turn |
| Оставить «слушай Nс» каноном в CIDE | Плохой UX; костыль Cursor, не цель харнесса |
| Снова outlet webcam-*/kokoro MCP как primary ear/mouth | Против in-proc sense desk; Kokoro не целевой TTS |
| Always-on VAD без armed | Ложные срабатывания; privacy |
Связь с V0 webcam autonomy¶
Flight flight-webcam-autonomy-v0: in-proc ops frame|burst|av|screen|audio|transcribe|ocr|analyze ship 0.5.233. Этот ADR — следующий слой: не новый sense op, а как оператор говорит в контур, используя уже зелёный audio/transcribe.
История изменений¶
| Дата | Изменение |
|---|---|
| 2026-07-27 | Accepted: PTT P0 / VAD P1; ear вне FM; Cursor N-sec = fallback only |