### Features - DM screen: info sheet (85% height, FormSheet) with shared media grid (3-col), partner profile link, image lightbox - DM screen: avatar tap in header navigates to partner profile - DM screen: info icon (ℹ) in header opens info sheet - Coach: Instagram-style voice recording bar — trash (left) + waveform + timer (center) + send (right) - Coach: silence/speech detection via audio metering — dots when silent, animated bars when speaking - Coach: trash button flashes red briefly on cancel (Instagram-style) - iOS Layer 3: Screen Time Passcode setup flow — generate code, set in iOS Settings, stored on backend ### Fixes - Android: Force Stop bypass blocked — Samsung SubSettings/FrameLayout class detection fixed in a11y tamper lock - Android: Force Stop confirmation dialog now detected and blocked - Android: a11y service label corrected to "ReBreak — Schutz" (HIGH_CONFIDENCE_KEYWORD match) - Arabic STT: switched to Deepgram nova-3 (nova-2-general dropped Arabic support) - DM: scroll-to-bottom now reliable via scrollToOffset(999999) on Android (scrollToEnd miscalculates content height) - DM: voice recording timer uses Date.now() diff — eliminates Android setInterval jitter - DM: voice bars fill full width via flex:1 + space-evenly - DNS filter: own domains (rebreak.org, rebreak.app) bypass blocklist — fixes OAuth Google callback ### Backend - Mail classifier v1.2: FS-token +20pts, extreme-percent (≥100%) +20pts, casino in sender name +30pts, block threshold lowered 50→40 - Screen Time Passcode API: POST/GET /api/protection/screentime-passcode - mail_classification_samples row-cap cron: max 100k rows, daily pruning (prevents disk-full) ### Infrastructure - CI/CD: race condition fixed — deploy lock prevents webhook + GH-Actions colliding - CI/CD: health check retry loop (12×5s = 60s max) instead of single sleep 5 - Hetzner: 20GB block volume attached, Docker moved to /mnt/data (freed 14GB on root) - Deepgram nova-2-general → nova-3 for all languages