feat(meetings): natieve calls F3 — land flutter_webrtc + de mediakern-naad (F3.4a) #1138

Merged
brenno merged 10 commits from feat/native-calls-f3-jitsi-signaling into main 2026-08-02 19:19:57 +00:00
Owner

De eerste media-slice van fase F3 (F3.4a): flutter_webrtc landen + de mediakern-naad, achter de standaard-uit Videovergaderingen-module. Dit is het fundament onder de echte media-join (F3.4b); deze slice opent zelf geen media.

Wat

  • flutter_webrtc 1.5.2 toegevoegd (ketenkeuring-voorwaarde 2): make licenses groen (permissief; lichte transitieve boom: dart_webrtc/webrtc_interface/js/logger/synchronized), SBOM geregenereerd, plugin-registranten (macOS/Linux/Windows) mee.
  • lib/meetings/meeting_media_core.dart — de naad die een adapter aandrijft. mediaE2eeFor(platform) is het pure, geteste E2EE-feit: uit op iOS/macOS (flutter_webrtc-frame-cryptor-crash, Bevinding 6/flutter-webrtc#2135), anders unknown — nooit een claim die OciDeck niet kan verifiëren.
  • lib/meetings/meeting_media_core_webrtc.dart — de enige echte libwebrtc-binding (WebrtcMediaCore), bewust dun. selfTest() haalt de stack op en sluit hem — met lege iceServers, geen offer/tracks: raakt geen netwerk.
  • MediaPreflightTile in de modulekaart — eerlijke bekendmaking: het E2EE-feit vooraf, en op verzoek of de WebRTC-stack op dit apparaat laadt. Injecteerbare mediakern → widget-getest zonder echte stack.

Ketenkeuring-voorwaarden (assurance/ketenkeuring-flutter-webrtc.md)

  1. Spine — al genomen. 2. Licentie/SBOM — groen (empirisch). 3. Netwerkbeheersing gedocumenteerd — het WebRTC-media-NetGuard-gat staat nu expliciet in SECURITY.md (ICE/STUN/TURN/SRTP buiten NetGuard, libwebrtc niet de http-client), met de begrenzing (media volgt de gevalideerde signalering, alleen goedgekeurde TURN/SFU, module standaard-uit, fail-closed — afgedwongen wáár de adapter ICE configureert, F3.4b). 4. Belofte + standaard-uitARCHITECTURE.md eerlijk bijgewerkt; de module is default-off, de mediacode onbereikbaar met de module uit.

Dekkingsdiscipline (gebruiker-akkoord)

De libwebrtc-binding kan niet in een headless VM draaien. Met jouw akkoord is er een nieuwe, expliciet gedocumenteerde categorie 'untestbare native-binding' in uncoveredBaseline (los van de platformhelften). Het E2EE-feit dat de binding delegeert is direct op de pure mediaE2eeFor bewezen; selfTest is de untestbare kern; geen beslislogica verstopt.

Eén gerelateerde poortwijziging (transparant): de per-bestand-dekkingsvloer sloeg uncoveredBaseline als enige dekkingscheck níet over. Dat gaf tot nu niet — de baseline bevatte alleen platform-andere-helften die op de io-test-VM nooit gecompileerd worden. De native-media-binding is anders: hij wordt op élk platform gecompileerd, dus een import (via de preflight-tile) zet hem op 0% in het lcov-rapport en de vloer trigt. Ik heb de per-bestand-vloer daarom consistent gemaakt met de andere twee dekkingschecks (_checkInstrumented + de gemiddelde vloer) door óók uncoveredBaseline over te slaan. Zonder die fix zou de goedgekeurde exemptie door juist die ene vloer worden tenietgedaan.

Reviews

Beveiligingsarchitect GO (selfTest raakt aantoonbaar geen netwerk — geen offer/tracks/iceCandidatePoolSize → geen ICE-gathering/mDNS; NetGuard-gat-doc accuraat; E2EE-feit correct; geen omzeilpad). Kernwaardenbewaker GO (standaard-uit, gat eerlijk erkend, E2EE nooit groter dan de code, formaat/soevereiniteit onaangetast). Drie docs-precisie-punten + de comment-anker-nota doorgevoerd.

Wat jij live moet toetsen

Deze slice is structureel volledig getest en opent geen media, dus er is nog geen echte call om te verifiëren. Het enige apparaat-specifieke: klik in de module op "Media-stack testen" om te bevestigen dat libwebrtc op jouw platform laadt. De echte join (media-tracks, ICE/TURN, camera/mic — met docker-jitsi-meet + twee clients) komt in F3.4b.

Poortstand

Op verse origin/main gerebased. make check volledig groen — alle statische poorten, de SBOM-/notices-/licentiepoort, de volledige testsuite én beide dekkingsvloeren. Ratchet-trend exit 0; secrets (gitleaks/trufflehog) en SAST (semgrep) schoon.

De eerste media-slice van fase F3 (F3.4a): **`flutter_webrtc` landen + de mediakern-naad**, achter de standaard-uit Videovergaderingen-module. Dit is het fundament onder de echte media-join (F3.4b); deze slice **opent zelf geen media**. ## Wat - **`flutter_webrtc 1.5.2`** toegevoegd (ketenkeuring-voorwaarde 2): `make licenses` groen (permissief; lichte transitieve boom: `dart_webrtc`/`webrtc_interface`/`js`/`logger`/`synchronized`), SBOM geregenereerd, plugin-registranten (macOS/Linux/Windows) mee. - **`lib/meetings/meeting_media_core.dart`** — de naad die een adapter aandrijft. `mediaE2eeFor(platform)` is het **pure, geteste E2EE-feit**: uit op iOS/macOS (`flutter_webrtc`-frame-cryptor-crash, Bevinding 6/flutter-webrtc#2135), anders `unknown` — nooit een claim die OciDeck niet kan verifiëren. - **`lib/meetings/meeting_media_core_webrtc.dart`** — de **enige** echte libwebrtc-binding (`WebrtcMediaCore`), bewust dun. `selfTest()` haalt de stack op en sluit hem — met lege `iceServers`, geen offer/tracks: **raakt geen netwerk**. - **`MediaPreflightTile`** in de modulekaart — eerlijke bekendmaking: het E2EE-feit vooraf, en op verzoek of de WebRTC-stack op dit apparaat laadt. Injecteerbare mediakern → widget-getest zonder echte stack. ## Ketenkeuring-voorwaarden (assurance/ketenkeuring-flutter-webrtc.md) 1. **Spine** — al genomen. 2. **Licentie/SBOM** — groen (empirisch). 3. **Netwerkbeheersing gedocumenteerd** — het WebRTC-media-NetGuard-gat staat nu expliciet in `SECURITY.md` (ICE/STUN/TURN/SRTP buiten NetGuard, libwebrtc niet de http-client), met de begrenzing (media volgt de gevalideerde signalering, alleen goedgekeurde TURN/SFU, module standaard-uit, fail-closed — afgedwongen wáár de adapter ICE configureert, F3.4b). 4. **Belofte + standaard-uit** — `ARCHITECTURE.md` eerlijk bijgewerkt; de module is default-off, de mediacode onbereikbaar met de module uit. ## Dekkingsdiscipline (gebruiker-akkoord) De libwebrtc-binding kan niet in een headless VM draaien. Met jouw akkoord is er een **nieuwe, expliciet gedocumenteerde categorie 'untestbare native-binding'** in `uncoveredBaseline` (los van de platformhelften). Het E2EE-feit dat de binding delegeert is direct op de pure `mediaE2eeFor` bewezen; `selfTest` is de untestbare kern; geen beslislogica verstopt. **Eén gerelateerde poortwijziging (transparant):** de **per-bestand-dekkingsvloer** sloeg `uncoveredBaseline` als enige dekkingscheck níet over. Dat gaf tot nu niet — de baseline bevatte alleen platform-*andere*-helften die op de io-test-VM nooit gecompileerd worden. De native-media-binding is anders: hij wordt op élk platform gecompileerd, dus een import (via de preflight-tile) zet hem op 0% in het lcov-rapport en de vloer trigt. Ik heb de per-bestand-vloer daarom consistent gemaakt met de andere twee dekkingschecks (`_checkInstrumented` + de gemiddelde vloer) door óók `uncoveredBaseline` over te slaan. Zonder die fix zou de goedgekeurde exemptie door juist die ene vloer worden tenietgedaan. ## Reviews Beveiligingsarchitect **GO** (selfTest raakt aantoonbaar geen netwerk — geen offer/tracks/iceCandidatePoolSize → geen ICE-gathering/mDNS; NetGuard-gat-doc accuraat; E2EE-feit correct; geen omzeilpad). Kernwaardenbewaker **GO** (standaard-uit, gat eerlijk erkend, E2EE nooit groter dan de code, formaat/soevereiniteit onaangetast). Drie docs-precisie-punten + de comment-anker-nota doorgevoerd. ## Wat jij live moet toetsen Deze slice is structureel volledig getest en opent geen media, dus er is nog **geen echte call om te verifiëren**. Het enige apparaat-specifieke: klik in de module op **"Media-stack testen"** om te bevestigen dat libwebrtc op jouw platform laadt. De echte join (media-tracks, ICE/TURN, camera/mic — met `docker-jitsi-meet` + twee clients) komt in **F3.4b**. ## Poortstand Op verse `origin/main` gerebased. **`make check` volledig groen** — alle statische poorten, de SBOM-/notices-/licentiepoort, de volledige testsuite én beide dekkingsvloeren. Ratchet-trend exit 0; secrets (gitleaks/trufflehog) en SAST (semgrep) schoon.
Ketenkeuring-voorwaarde 2 (assurance/ketenkeuring-flutter-webrtc.md):
flutter_webrtc 1.5.2 toegevoegd, make licenses groen (permissief, lichte
transitieve boom: dart_webrtc/webrtc_interface/js/logger/synchronized),
SBOM geregenereerd.

De mediakern-naad: MeetingMediaCore (interface) + mediaE2eeFor(platform)
— het pure, geteste E2EE-feit (uit op iOS/macOS per Bevinding 6, anders
'unknown', nooit een claim die OciDeck niet kan verifiëren). De ENE echte
libwebrtc-binding (WebrtcMediaCore) is bewust dun en niet headless te
draaien; hij staat als expliciet-gedocumenteerde nieuwe categorie
'untestbare native-binding' in uncoveredBaseline (gebruiker-akkoord), los
van een platformhelft. Alle beslislogica staat en is gedekt in de naad.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
MediaPreflightTile toont het E2EE-feit vooraf en test op verzoek of de
native WebRTC-stack op dit apparaat laadt (WebrtcMediaCore.selfTest, raakt
geen netwerk). Injecteerbare mediakern → widget-test zonder echte stack.
Maakt de mediakern + binding bereikbaar voor de dode-code-poort.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Voorwaarde 3: het WebRTC-media-NetGuard-gat expliciet in SECURITY.md —
ICE/STUN/TURN/SRTP loopt buiten NetGuard (libwebrtc, geen http-client),
maar begrensd (media volgt de gevalideerde signalering-origin, alleen
goedgekeurde TURN/SFU-origins, module standaard-uit, fail-closed op
signalering). Voorwaarde 4: ARCHITECTURE-belofte eerlijk bijgewerkt (het
media-vlak als netwerkstack buiten de wacht). SOURCE_MAP: de nieuwe naad +
binding + preflight.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Bewaker + beveiligingsarchitect:
- ARCHITECTURE: de bounded-egress stond in tegenwoordige tijd terwijl
  joinen nog niet bestaat; nu gedateerd als ontwerp dat met de media-join
  landt (deze slice opent geen media).
- SECURITY: 'MeetingProviderProfile' (bestaat alleen in ontwerp-docs)
  vervangen door de echte waarborg (NetGuard.resolveConfigured + pinning
  in xmpp_frame_transport_io.dart); het profiel benoemd als geplande vorm.
- uncoveredBaseline-comment aangescherpt: alleen selfTest is untestbaar;
  de constructor + mediaE2ee-getter zijn triviale delegaties naar de
  geteste pure functie — nu ook expliciet getest op een echte
  WebrtcMediaCore, zodat de uitzondering enkel selfTest dekt.
- Binding: comment-anker dat de 'geen netwerk'-invariant op vier
  voorwaarden rust (security-architect: geen test bewaakt het).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Bijgewerkt door `flutter pub get` bij het toevoegen van flutter_webrtc:
de native plugin-registratie voor macOS/Linux/Windows.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
De volledigheidspoort (third_party_notices_test) eist elke directe dep in
de notices; flutter_webrtc (MIT) toegevoegd bij de media-deps.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
De WebrtcMediaCore.mediaE2ee-test gaf de binding gedeeltelijke dekking
(~33%), en de per-bestand-vloer slaat uncoveredBaseline NIET over voor een
geïnstrumenteerd bestand → viel net onder 34%. Test teruggetrokken zodat
geen test het bestand importeert (buiten het lcov-rapport). De comment nu
accuraat: het E2EE-feit is direct op mediaE2eeFor bewezen; selfTest is de
untestbare kern; geen logica verstopt.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
fix(coverage): per-bestand-vloer respecteert uncoveredBaseline (consistent)
All checks were successful
scans / scans (pull_request) Successful in 6m8s
static-gate / static-gate (pull_request) Successful in 33m18s
81babddd1d
De per-bestand-vloer sloeg uncoveredBaseline als enige dekkingscheck NIET
over. Dat maakte tot nu niet uit — de baseline bevatte alleen platform-
*andere*-helften (een _web-helft op deze io-VM), die hier nooit gecompileerd
worden en dus geen rapport-record hadden. De F3-native-media-binding is
anders: hij wordt op élk platform gecompileerd, dus een import (via de
preflight-tile) zet hem op 0% in het rapport. Zonder deze skip zou de
door de gebruiker goedgekeurde exemptie door juist deze ene vloer worden
tenietgedaan. Nu consistent met _checkInstrumented en de gemiddelde vloer.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
brenno merged commit 702bd2f047 into main 2026-08-02 19:19:57 +00:00
Sign in to join this conversation.
No description provided.