From 0e75245205e89e60576608b14f765917b2c35da3 Mon Sep 17 00:00:00 2001 From: claude Date: Tue, 4 Aug 2026 22:25:28 +0400 Subject: [PATCH] qa plan: push-to-talk runs without a mic, and a spoken turn is 30s of reasoning (V-287) Session 1 step 2 no longer needs a person. POST /api/ptt takes raw PCM16 16kHz mono, so the committed STT fixtures stand in for a microphone. Three fixtures pass end to end: 200, real speech back, right intent. Step 9 gets a cause. A spoken turn is 32-34s, of which one phrasing call is 30.0s. Both interactive calls decoded exactly 512 tokens, the chat cap, and were truncated. The resident model is a Thinking variant and llamaArgs never passes the enable_thinking:false that deploy/mavgpud.json passes for the workstation. Filed as V-531. Steps 7 and 8 cannot run. The morning routine is the only nudge source and the dispatcher drops it on presence=away every time, which is V-15. 287's own ten QA steps were rewritten in Vikunja: all ten were mavwaked, which does not run on homesrv by decision (V-463). Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_011x5DgnExQ5XZy8TZPs5bot --- docs/qa.md | 42 +++++++++++++++++++++++++++++++++++++++--- 1 file changed, 39 insertions(+), 3 deletions(-) diff --git a/docs/qa.md b/docs/qa.md index 1573f8a..d187b94 100644 --- a/docs/qa.md +++ b/docs/qa.md @@ -1,6 +1,6 @@ # QA plan: checking Maven properly -*Last verified: 2026-08-04 @ a4d5155. Living doc: correct it in place, do not append.* +*Last verified: 2026-08-04 @ 8d816f4. Living doc: correct it in place, do not append.* Written 2026-08-01, after the 35-PR stack landed and the box came back up. Refreshed 2026-08-02 against the live list, after PRs #85-#90. @@ -88,8 +88,29 @@ session quality), **321** steps 3-5 (quiet mode), **288** (STT golden audio). **288 is not blocked.** The fixtures are committed under `cmd/mavsttd/testdata/` and `make test-stt-golden` runs today. This plan said otherwise until 02-08-2026. -Steps 1 and 3-6 were run on 02-08-2026 and pass. Steps 2 and 7-9 still need a -person at the box, because they need a microphone or a nudge to arrive. +Steps 1 and 3-6 were run on 02-08-2026 and pass. + +**Step 2 no longer needs a person, and step 9 has a number now** (04-08-2026). +`POST /api/ptt` takes raw PCM16 16kHz mono and answers with audio plus an +`X-Reply-Text` header, so the committed STT fixtures stand in for a microphone: + +```sh +tail -c +45 cmd/mavsttd/testdata/ru_query.wav > /tmp/q.pcm +curl -s --noproxy '*' -D /tmp/h -o /tmp/reply.pcm -X POST \ + http://127.0.0.1:9201/api/ptt --data-binary @/tmp/q.pcm \ + -H 'Content-Type: application/octet-stream' -m 180 +``` + +That covers audio in → STT → router → phrasing → TTS audio out. It leaves only +browser microphone capture needing a person, and the wake path needing a machine. +Do not post `en_act.wav` without deciding first: it is a mutating act. + +**Steps 7 and 8 cannot run at all**, and the reason is not the microphone. They +need a nudge to arrive, and the only rule that fires is the morning routine, +which the dispatcher drops every time: `dropped morning:утро (sev1, +presence=away)`. No `desk_active` fact has ever been written, so presence never +reads present. That is **15**, and it blocks these two steps as hard as it blocks +the presence half of session 3. Steps 1 and 3-6 do not need a browser. `POST /api/chat` takes a form-encoded `text=` field and a cookie jar, and answers with the rendered `/chat` page: @@ -112,6 +133,11 @@ turns look misaligned when they are not. back. This covers browser mic to STT to core to TTS as one path. It does **not** cover the wake word or the voice-activity gate, and no step here does — see below. + **Passes below the browser** (04-08-2026, three fixtures through `/api/ptt`): + HTTP 200, `audio/l16;rate=16000;channels=1`, and real speech back. `ru_query` + answered `на 04.08.2026 ничего нет.` in 3.82s of audio at RMS 3865, `ru_fact` + answered `отметила: water = выпил`, `ru_reminder` answered `хорошо, напомню.` + at `intent=reminder`. Only `getUserMedia` and the button are still unproven. 3. Say `тихий режим`. Expect `тихий режим включён. буду реже напоминать.` **Passes.** 4. Say `выключи тихий режим`. Expect `тихий режим выключен.` Negation must win. **Passes.** 5. Say `в комнате тихо`. Quiet mode must NOT flip. Confirm on `/history` that no @@ -132,6 +158,16 @@ turns look misaligned when they are not. **First evidence, in text** (02-08-2026): nothing breaks, but answers wander and stitch unrelated topics. Asked whether he should move flats, she opened with the weather. That is 287, and it is a phrasing problem, not a loop problem. + **The slowness now has a cause and a number** (04-08-2026). A spoken turn + takes 32 to 34 seconds. One phrasing call is 30.0s of that. STT is 1.0s + and routing is under 10ms. Both interactive calls decoded exactly 512 tokens, + which is the `chat` cap. So both ran to the cap and were truncated, to + produce a 16-character reply. The resident model is a Thinking variant and nothing + tells it to skip reasoning. `deploy/mavgpud.json` already passes + `--chat-template-kwargs {"enable_thinking":false}` for the workstation and + `llamaArgs` does not. Filed as **531**, which also asks whether that gap + inflates the workstation comparison. + The wandering is a second thing and stays on 287. **The wake path cannot be checked here, and that is now the decision rather than a gap.** `mavwaked` and `mavenclient` appear in no compose file and run as