Zum Inhalt springen

Modul XVI — Voice- & Echtzeit-Agenten

Modul XVI regelt konversationelle und Echtzeit-Agenten. Es ist eine Observe-and-Govern-Ebene: Es implementiert kein Voice-SDK neu (Realtime API, WebRTC, ASR oder TTS) und öffnet selbst nie einen Media-Stream. Es entscheidet, wer eine Voice-Session öffnen darf, mit welchem Modell und Provider, unter welcher Policy, und verfolgt die Metadaten dieser Session — nie ihren Inhalt.

Das Öffnen einer Voice-Schnittstelle wird als privilegierte Aktion behandelt, nicht als freie Operation. Die Policy ist default-DENY: Eine Session ohne erlaubende Policy wird verweigert. Ein Öffnen ist zweiphasig und human-in-the-loop-gegated über das Approval-Gate; es ist an einen plan_hash gebunden, sodass eine Genehmigung nicht still auf ein stärkeres Modell hochgestuft werden kann (Anti-TOCTOU), wird dem realen Principal auditiert (nie system) und append-only belegt. Das Modul selbst ruft nie einen Provider auf — die Actuation verlässt es über eine separate Dispatch-Naht.

Die andere Hälfte ist Beobachtung: Das Modul verfolgt ausschließlich Session-Metadaten — abgeleiteter Zustand (live/idle/ended, zur Lesezeit aus der Aktualität der Aktivität berechnet, ohne gespeicherte Lifecycle-Spalte), Turn-Zählungen, Dauer, Latenz (ehrlicher Durchschnitt und Maximum aus realen Samples) und BCP-47-Sprache. Daraus erhebt es Governance-Findings: eine Policy-Verletzung, wenn die Telemetrie einen Agenten/ein Modell/einen Provider nennt, den keine Policy erlaubt, ein Degraded-Latency-Finding, wenn die Latenz eine Policy-SLA überschreitet, und ein Ungoverned-Open-Finding, wenn ein Öffnen ohne verdrahtetes Gate versucht wird — die Lücke wird sichtbar gemacht und das Öffnen wird dennoch verweigert.

Das Modul deklariert drei Entitäten im gemeinsamen Datenmodell:

EntitätVeränderbarkeitZweck
sessionveränderlich (Upsert)Session-Metadaten; null Inhalt
policyveränderlichGovernance-Deklaration — wer mit welchem Modell/Provider öffnen darf (default-DENY)
decisionappend-onlyunveränderliches Ledger der Öffnungs-/Schließungs-Entscheidungen

Eine Policy matcht auf Agent, erlaubtes Modell und erlaubten Provider (jeweils spezifisch oder Wildcard), mit optionalen Session-Minuten- und Latenz-SLA-Grenzen. Keine matchende Policy bedeutet DENY. Das decision-Ledger erfasst jedes open_request, open und close mit seinem Policy-Verdikt, Gate-Status und Ergebnis-Status. Lesezugriff ist die Viewer-Rolle und höher; das Deklarieren einer Policy und das Öffnen einer Session sind administrative, mandantengebundene und auditierte Aktionen. Diese Modulrouten werden in der separaten Beta- Modulrouten-Referenz veröffentlicht, nicht im stabilen Kernvertrag — ihre feldgenauen Formen leben in den typisierten Interfaces des Produkts. Geldbeträge stehen nicht hier; FinOps (Modul XI) besitzt Kosten.

Das Modul besitzt eine deny-closed-Ingestion-Naht — sein eigenes voice.telemetry.observed-Event — über das eine In-Process-Sonde Session-Metadaten einspeisen würde. Die Leitung ist datenminimal per Konstruktion: Der Telemetrie-Parser trägt eine Allow-List und verwirft das gesamte Event, wenn er einen verbotenen Schlüssel sieht, sodass niemals Audio, Transkript-Text, ASR/TTS-Text, Prompt-/Response-Inhalt oder Sprecher-PII persistiert werden kann. Das einzige gehaltene Transkript-Signal ist ein Einweg-Hash eines externen Transkript-Locators — Beleg, dass ein Transkript existiert, niemals das Transkript. Governance-Findings werden als finding.reported mit gehashtem Detail nach Commit emittiert.

Ein Governed-Open versendet live: Sobald ein Voice-Dispatcher vom Betreiber bereitgestellt ist, prägt ein genehmigtes Öffnen ein serverseitiges, ephemeres Credential und gibt nur dieses Credential plus Verbindungskoordinaten zurück — Modell, Stimme, Tools und Turn-Detection werden aus der Policy festgelegt, nie vom Client, und der Master-Key des Providers verlässt nie den Server. Ohne diese Bereitstellung ist die Dispatch-Naht deny-closed: Ein genehmigtes Öffnen wird ehrlich als „deklariert, nicht geöffnet” festgehalten, statt vorgetäuscht zu werden.