POST /api/record/stop wartete auf den kompletten loudnorm-Encode: gemessen
~1,4 s pro aufgenommener Minute (#114: 35,5 min -> 50,9 s). Sichtbar war
davon nichts als ein ausgegrauter Knopf; der Reiterwechsel baute den Knopf
per render() wieder klickbar auf und der zweite Klick lief in
"not recording", weil stopAndSave() current sofort auf null setzt.
- recorder.js: encodeMp3() ohne await, schreibt <name>.mp3.part und
benennt erst danach um. MP3_ARGS + "-f mp3" (ffmpeg leitet den Muxer aus
der Endung ab und scheitert an .part).
- web/src/main.js: state.stopping ueberlebt render() -> Knopf bleibt
gesperrt, Uhr friert ein, Toast mit geschaetzter Wartezeit, zweiter Klick
verworfen, "not recording" kein roter Fehler. Player laedt nach, solange
/media 404 liefert (#mp3wait, 5-s-Retry, Abbruch nach 5 min).
- server.js: sweepOrphans erkennt rec_*.mp3.part.
Gegenprobe: 0,033 s / 0,044 s Stop-Antwort, "mp3 fertig" ~2 s spaeter,
64 kbit CBR / 48 kHz / mono ohne Xing-Tabelle, /media 200.
Doku: Kapitel 03 (neuer Abschnitt + Vorher/Nachher-Sequenzdiagramm),
Changelog 2026-08-20.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>