Calltranscript: live-route via sessieconsent + provenance uit sources.json (#2530) #2597

Merged
brenno merged 1 commit from feat/call-transcript-2530 into main 2026-10-26 23:16:20 +00:00
Owner

Samenvatting

Sluit #2530 — live én definitief transcript van een OciDeck-call via de bestaande #2522/#2511-pipeline.

  • Live-route = sessieconsent: CallRecordingSection toont dezelfde LiveServerOptIn als de mic-dialoog (probe bewijst vosk-ws-1 eerst); het vinkje wordt ServerConsent.liveSession(host) en gaat via CallRecordingNotifier.start({liveConsent}) naar RecordingSessionNotifier.start. Het placeholder-hek (asrUploadAllowed/forwardedChunks/mayForwardCallAudioToServer/setAsrUploadAllowed) is weg — er zijn geen bytes meer die 'mochten' vertrekken.
  • Lokaal zonder vinkje: geen consent → lokale engine, liveSessionHost null, geen socket. "Opnemen en later transcriberen" werkt altijd.
  • Verloren live-route: serverbreuk → LiveServerStatus.lost terwijl de duurzame opname doortelt; herstel vraagt een nieuwe consent (bestaande reconnect-knop in de strook).
  • Provenance: readCallSources (io-helft, versie-gated) leest sources.json naast recording.wav; missingCallAudio somt positieve silenceTicks (20 ms-ticks). De bewaardialoog noemt de vergadering + ontbrekende stukken; TranscribeFileDialog zet Bron: vergadering + een Ontbrekend:-regel in het transcript — nooit voor een los bestand en nooit sprekersnamen uit de roster.
  • Bugfix: ChannelMicPort.freeBytes vangt FlutterError (geen binding) — onmeetbaar = null, zoals een afwezige plugin.

Testplan

  • recording_live_session_test: callaudio + consent bereikt de loopback-socket en geeft voorlopige tekst terug; zonder consent geen socket én wél duurzame wav + manifest
  • call_recording_test: consent benoemt host; falende endpoint → lost terwijl opname doortelt; zonder consent off
  • transcribe_file_dialog_test: manifest → vergaderingsprovenance + ontbrekend-regel in het document; los bestand → Bron: bestand
  • call_audio_manifest_io_test + missingCallAudio-eenheden: versie/vorm-validatie, geen claim zonder bewijs
  • make check groen (format, analyse, conventies, 14k+ tests, coverage, goldens), make check-secrets + make sast schoon

Generated with Devin

## Samenvatting Sluit #2530 — live én definitief transcript van een OciDeck-call via de bestaande #2522/#2511-pipeline. - **Live-route = sessieconsent**: `CallRecordingSection` toont dezelfde `LiveServerOptIn` als de mic-dialoog (probe bewijst `vosk-ws-1` eerst); het vinkje wordt `ServerConsent.liveSession(host)` en gaat via `CallRecordingNotifier.start({liveConsent})` naar `RecordingSessionNotifier.start`. Het placeholder-hek (`asrUploadAllowed`/`forwardedChunks`/`mayForwardCallAudioToServer`/`setAsrUploadAllowed`) is weg — er zijn geen bytes meer die 'mochten' vertrekken. - **Lokaal zonder vinkje**: geen consent → lokale engine, `liveSessionHost` null, geen socket. "Opnemen en later transcriberen" werkt altijd. - **Verloren live-route**: serverbreuk → `LiveServerStatus.lost` terwijl de duurzame opname doortelt; herstel vraagt een nieuwe consent (bestaande reconnect-knop in de strook). - **Provenance**: `readCallSources` (io-helft, versie-gated) leest `sources.json` naast `recording.wav`; `missingCallAudio` somt positieve `silenceTicks` (20 ms-ticks). De bewaardialoog noemt de vergadering + ontbrekende stukken; `TranscribeFileDialog` zet `Bron: vergadering` + een `Ontbrekend:`-regel in het transcript — nooit voor een los bestand en nooit sprekersnamen uit de roster. - **Bugfix**: `ChannelMicPort.freeBytes` vangt `FlutterError` (geen binding) — onmeetbaar = `null`, zoals een afwezige plugin. #### Testplan - [x] `recording_live_session_test`: callaudio + consent bereikt de loopback-socket en geeft voorlopige tekst terug; zonder consent geen socket én wél duurzame wav + manifest - [x] `call_recording_test`: consent benoemt host; falende endpoint → `lost` terwijl opname doortelt; zonder consent `off` - [x] `transcribe_file_dialog_test`: manifest → vergaderingsprovenance + ontbrekend-regel in het document; los bestand → `Bron: bestand` - [x] `call_audio_manifest_io_test` + `missingCallAudio`-eenheden: versie/vorm-validatie, geen claim zonder bewijs - [x] `make check` groen (format, analyse, conventies, 14k+ tests, coverage, goldens), `make check-secrets` + `make sast` schoon Generated with [Devin](https://devin.ai)
De callopname hangt aan dezelfde live/finale pipeline als de microfoon:
de Start-knop geeft een ServerConsent.liveSession door als de opt-in de
host benoemde — zonder vinkje blijft de voorlopige route lokaal en gaat
niets weg. Het tijdelijke uploadhek (asrUploadAllowed/forwardedChunks)
is weg: de bewezen opt-in is de consent, niet een aparte teller.

Een duurzame wav in een sessiemap met sources.json is geen "bestand"
maar een vergadering: de bewaardialoog noemt de vergadering en de
ontbrekende bronstukken, en de definitieve pass schrijft die als
Ontbrekend-regel in het transcript — alleen op versie-gated bewijs,
een vreemde sources.json claimt niets.

ChannelMicPort.freeBytes vangt nu ook een ontbrekende binding af —
onmeetbaar is hetzelfde antwoord als een afwezige plugin.

Generated with [Devin](https://devin.ai)

Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
brenno merged commit 46d47ec253 into main 2026-10-26 23:16:20 +00:00
Sign in to join this conversation.
No description provided.