3.5.3 (2026-08-06) {#353-2026-08-06}
Interne Verbesserungen {#internal-improvements}
core/log: Makro-Form haply_* mit verzögerter Formatierung hinzufügen (cf7dbfc), schließt #271core: Pivot- und compose/inverse-Transformationsprimitive hinzufügen (01080f6), schließt #283devices: 0xE4-Body-Orientierung zwischenspeichern und trigger_mode weiterleiten (#265) (4864700)devices: den 0xE4-IMU-Sensorrahmen serviceseitig kompensieren (#286) (e6d877c), schließt tapi-prototype-firmware#87devices: Body-Orientierung bei der Inkwell-Kalibrierung aktualisieren (#268) (89b190b), schließt #286 #286 #286devices: Live- (0x0C) und Referenz-Body-Orientierung (0xE4) aufteilen (#286 #315) (638487a), schließt #268 #266 #268http: Antworten bei nicht unterstütztem Protokoll auf 422 vereinheitlichen (e0e7638), schließt #293 #293 #295http: Transform-Echos und sdf-Eingaben auf euler-fähige Patches umstellen (#279, #280, #291) (bb29404)http: Geräte-Mount bei Delete scope=device zurücksetzen (#265) (f6bf26b), schließt #286modules::navigation: Clutch-Modus an der Bewegungssperre hinzufügen (gesteuert, standardmäßig aus) (4b69eed), schließt #308 #308 #283 #308modules::navigation: Button-Eingaben mit prevent_default; Clutch-force_scale; Bubble-Navigation per Halten (fb216aa), schließt #317 #318 #316 #317 #318modules::navigation: Clutch-Obergrenzen für max_motion/force_scale (a946088), schließt #316modules::navigation: gespiegelte Feature-Kill-Switches, beide standardmäßig aktiv (b6ee0c0), schließt #318modules::navigation: Einstellungs-Patches pro Eingabe auf inputs[]; Bubble sendet status.engaged (ba2058f), schließt #318protocol: Capability-Datei aufteilen, Dämpfungs-Gate, Base-Hoist (30d7d5d), schließt #293protocol: Capability-Tabelle und einzelner Emitter für nicht unterstützte Funktionen (289382e), schließt #293 #295protocol: home_return und pen_attached über die Tabelle absichern (8a05d20), schließt #293protocol: fw_version einführen und Versionsprüfungen migrieren (38c2cae), schließt #293serialization: Greiftasten-Maske in den v3.1-Session-Durchläufen anwenden (7b93e35), schließt #316serialization: euler bei config.mount-Rotationen unter euler.output ausgeben (#268) (f6b54a2)serialization: euler bei transform-Rotationen unter euler.output ausgeben (96c6cc9), schließt #283serialization: Workspace-Zoom um den Pivot über set_transform bereitstellen (#309) (c1d08fc), schließt #280serialization: config/body_orientation trigger_mode vereinheitlichen (#265) (8781b8a), schließt #268serialization: Transform-Regler in die pro Session geltenden serial_options überführen (#280) (03b2fd6)serialization: config/mount in scope + body_orientation aufteilen (#265) (5618839), schließt #280serialization: Session-Optionen durch die Ausgaben leiten und die verschachtelte Umformung absichern (#279, #280) (59984ce), schließt #265serialization: ws- und http-configure-Decodierung vereinheitlichen (#280) (6076917)sessions: generischen Bewegungssperr-Mechanismus mit Bake beim Disengage hinzufügen (c8d2a93), schließt #304sessions: live_motion-Fortschreibung der Bewegungssperre pro Tick hinzufügen (gesteuert) (d29013c), schließt #308 #304 #308sessions: Session-Observer auf Manager-Ebene mit Zustellung über die Hauptschleife hinzufügen (83e76ef), schließt #284sessions: Mount-Reparenting und Workspace-Zoom um den Pivot hinzufügen (294d6e8), schließt #265 297/#272 #304sessions: Ereignis-Scope config.body_orientation mit eigenem Namespace hinzufügen; Warnung bei veraltetem 'values'-Input (3f70047), schließt #320sessions: Vorschau-Quelle config/mount und Trigger-Routing hinzufügen (#265) (5d11dbf), schließt #268sessions: Geräte-Mount im Mount-Bereich speichern und laden (#265) (4cec178), schließt #292sessions: set_workspace_transform_around mit Pivot-Echo verallgemeinern (0b242a2), schließt #309sessions: Greiftasten-Maske und force_scale-Overlay-Mechanismen (836ef2f), schließt #316sessions: Tracy-Session-Plots mit Client-Profil beschriften (72a8f34), schließt #258sessions: Mount-Scope-Routing und Storage-Virtuals (#265) (9a4e7f4), schließt post-#286 #293sessions: force_scale-Ducking pro Session (Vorschau) (bff66ad)Fehlerbehebungen {#bug-fixes}
ci: Release-Toolchain fixieren, um Changelogs wiederherzustellen (72c6773), schließt #313Kompilierungsfehler mit neuem glaze behoben (e2c53d3)deps: Rust-Crate nix auf 0.31 aktualisieren (b3b9a84)devices: Safety-Config-Protokoll an der Sende-Engstelle absichern (b8e8401), schließt #295devices: Schreibvorgänge der Safety-Config abhängig von Firmware-Version und Kalibrierung absichern (5ad5128), schließt #295devices: inverse3-Verbindung während des Einschwingfensters nach dem Aufwachen aktiv halten (4afed45)devices: inverse3-Verbindung während des Einschwingfensters nach dem Aufwachen aktiv halten (79c2b66)devices: [secure]-Akkubenachrichtigung bei kabelgebundenen Verse-Griffen unterdrücken (ea54a1a), schließt #314http: Kalibrierung bei sitzungsbezogenen Safety-Schreibvorgängen prüfen (89f9cd7), schließt #295 #293http: euler-Rotationen gemäß Session-Konventionen zusammenführen (#288) (97cf203)inverse_ux: Verarbeitung durch calibration_notifier auf Minverse beschränken (418913f)Bereinigung der Lebenszyklen zur Vermeidung von Abstürzen (e7b3785)modules::inverse-ux: calibration-failed immer ausgeben, wenn die Firmware blockiert (3841d06)modules::inverse-ux: erneutes Pairing nach dem Austausch eines gekoppelten Geräts (cf85707), schließt #278modules::sdf: sdf-Transformations-Euler gemäß Session-Konventionen zusammenführen (#291) (9741ac6)modules::sdf: SDF-Formen im Client-Koordinatensystem ausrichten (c29e4f2), schließt #276protocol: Race-Conditions bei Timer-Lebenszyklen beseitigen, die den Dienst abstürzen lassen oder blockieren (0cb019b), schließt #303protocol: serielle Puffer beim Öffnen des Ports leeren, um im laufenden Betrieb getauschte Geräte zu erkennen (b8724d9)protocol: Firmware-Client-Callbacks gegen Race-Conditions bei der Zerstörung von Geräten absichern (3d795bb), schließt #303protocol: 0xE4-IMU-Orientierungs-API mit typisiertem enum und korrektem Wire-Format neu schreiben (8733ec0)Rückkehr in die Grundposition beim Aktivieren und Deaktivieren von inverse3x über den Hub (f435454)service: adaptives Dispatching standardmäßig deaktiviert (9415638)service: Herunterfahren des Dienstes geordnet, begrenzt und frei von Race-Conditions gestalten (ff888d7), schließt #303sessions: *_centered-Presets auf den tatsächlich erreichbaren Mittelpunkt zentrieren (ad6e726), schließt #321sessions: Siggraph-Auto-Push an der Workspace-Grenze bei Mount-Wechsel entfernen (2df1654)sessions: erzwungenes Leeren beim Schließen der Session für ein Gerät überspringen, das noch von einer aktiven Session gesteuert wird (e1f9ff7), schließt #324sessions: start() nicht mehr die beim Verbinden ausgehandelten serial_options zurücksetzen lassen (#290) (27e27d8)sessions: Workspace-Transformationsgeschwindigkeit nach set_transform auf null setzen (133c3ad), schließt #280websocket: Befehle gemäß den Konventionen der sendenden Session decodieren (#289) (1b24049), schließt #265Leistungsverbesserungen {#performance-improvements}
core/log: haply_*-Makros so absichern, dass fmt::format bei deaktiviertem Log übersprungen wird (672a87a), schließt #270modules::sdf: SDF bei der Erstellung einmalig vorberechnen statt pro Tick (15350c5), schließt #277