Diff
1diff --git a/README.md b/README.md
2index dd0e345085089924218eb6ced2b5c6a729262de4..6e995e18570f4cb51b215a9aa1d23b64b035d82f 100644
3--- a/README.md
4+++ b/README.md
5@@ -13,7 +13,9 @@ downloads a model for any of them. You run those services yourself (see
6 ## Requirements
7
8 - Go 1.27+
9-- `arecord` (ALSA) for microphone capture, or your own recorder command that
10+- `arecord` (ALSA) for microphone capture. The default bare `arecord` records in
11+ system-default format; set `--record-command "arecord -f S16_LE -r 16000 -c 1"`
12+ to get the required 16 kHz mono S16_LE WAV. Any command works as long as it
13 writes a 16 kHz mono S16_LE WAV file to the path given as its last argument
14 - Three external model services, all run by you:
15 - **LLM** — OpenAI-compatible chat completions (`POST /chat/completions`)
16@@ -44,7 +46,7 @@ local setup.
17 | TTS base URL | `--tts-url` | `JP_TTS_BASE_URL` | `http://127.0.0.1:8080/v1` | `POST /audio/speech` |
18 | STT inference URL | `--stt-url` | `JP_STT_URL` | `http://127.0.0.1:8178/inference` | multipart `POST` |
19 | STT language | `--stt-language` | `JP_STT_LANGUAGE` | `auto` | optional Whisper request language |
20-| Recorder command | `--record-command` | — | `arecord -f S16_LE -r 16000 -c 1 -d 10` | 16 kHz mono S16_LE WAV capture |
21+| Recorder command | `--record-command` | — | `arecord` | 16 kHz mono S16_LE WAV capture (see note above) |
22
23 Content paths:
24
25@@ -65,14 +67,17 @@ operator-run reference commands. The game never invokes `llama-server`,
26
27 ## Controls
28
29-- Move: arrow keys (or `h`/`j`/`k`/`l`)
30-- Start recording (push-to-talk): `space`
31-- Stop and send the turn: `enter`
32-- Cancel the current action: `esc`
33+- Move: arrow keys or `w`/`a`/`s`/`d`
34+- Push-to-talk: `space` or `enter` (one toggle key: press to start recording,
35+ press again to stop and send the turn)
36+- Reveal NPC romaji: `r`
37+- Reveal NPC English (only after `r`): `t`
38+- Quit: `q` or `esc`
39
40-Each spoken turn is graded by a judge that stays separate from NPC dialogue.
41-The judge scores your attempt; NPCs behave as ordinary people, not language
42-teachers.
43+Movement, talk, and reveal keys are ignored while a turn is recording or
44+processing. Each spoken turn is graded by a judge that stays separate from NPC
45+dialogue: the judge scores your attempt in the learning panel; NPCs behave as
46+ordinary people, not language teachers.
47
48 ## Development
49
50@@ -84,3 +89,26 @@ go test ./internal/ui/ ./internal/game/ ./internal/tts/ -race
51
52 Automated tests use fake HTTP services only. Only an operator may prepare live
53 services for manual integration testing.
54+
55+## Manual end-to-end check
56+
57+Prerequisites, all run by you (the game never starts or stops them):
58+
59+- llama.cpp serving the Unsloth Qwen3 model on port 8081
60+- whisper-server with `ggml-large-v3-turbo` on `127.0.0.1:8178`
61+- audio.cpp serving Qwen3-TTS on `127.0.0.1:8080`
62+
63+Exact reference commands are in [`docs/services.md`](docs/services.md).
64+
65+1. Run `jp run`. The TUI appears immediately; each service line flips from
66+ `checking` to `up` as its probe result arrives.
67+2. Walk to the ramen shop marker and confirm it is marked active in the legend.
68+3. Press `space`, speak a Japanese line, press `space` again. Your transcript
69+ appears as romaji only (`You said: ...`).
70+4. The learning panel shows the judge score and feedback.
71+5. The NPC voice plays while its text stays hidden.
72+6. Press `r` to reveal the NPC romaji, then `t` to reveal the stored English
73+ translation. No second translation request is made.
74+7. Repeat at the station and tourist information locations.
75+8. Confirm from your own process view that the game started and stopped no
76+ model processes.