# description
Source-of-truth JSON Schema for client-emitted user events, client-session context, and typed user preferences. Generates contracts/observe/user/events.generated.ts (zod) via scripts/codegen/forward/workspace/zod/user.mjs; Go structs at services/backend/api/internal/handler/telemetry/events.go must keep field tags in sync.

# $comment
$defs library schema — top-level shape is intentionally absent (no `type`/`oneOf` at root); strictness lives on each `$defs` member individually via their own `additionalProperties: false`.

# $defs.VoiceConsentPrefs.description
GDPR-shaped consent block. Each toggle is opt-in by default (false). Backend voice handlers MUST consult these before persisting recordings, accepting clone enrollments, or performing passive voice-print capture.

# $defs.VoiceConsentPrefs.properties.recording.description
Persist call audio + transcripts for memory recall.

# $defs.VoiceConsentPrefs.properties.cloning.description
Allow F5-TTS clone enrollment from a reference sample.

# $defs.VoiceConsentPrefs.properties.passiveEnrollment.description
Allow background diarizer to auto-enroll speaker prints from session audio.

# $defs.VoicePrefs.description
Mirrors voxpb.v1.SynthesizeRequest defaults plus a small consent block. Backend / voice bridge resolve the voice pipeline from these prefs before every Synthesize / Transcribe call. `threadOverrides` lets a single thread pin a different voice without touching the global default (e.g. clone for the user's own thread, Bella for a shared meeting).

# $defs.VoicePrefs.properties.style.description
Orpheus emotion tag (e.g. 'neutral', 'excited'). Ignored by Kokoro / F5-TTS.

# $defs.VoicePrefs.properties.sttLanguage.description
BCP-47 hint for VoxService.Transcribe; empty = auto-detect.

# $defs.VoicePrefs.properties.threadOverrides.description
Per-thread voiceId override keyed by thread id.