3.5.3 (06.08.2026) {#353-2026-08-06}
Interne Verbesserungen {#internal-improvements}
core/log: Makro-Form haply_* mit verzögerter Formatierung hinzufügen (cf7dbfc), schließt #271Kern: Pivot- und Compose-/Inverse-Transformationsprimitive hinzufügen (01080f6), schließt #283 abGeräte: 0xE4 – Körperausrichtung zwischenspeichern und trigger_mode weiterleiten (#265) (4864700)Geräte: Den 0xE4-IMU-Sensorrahmen serviceseitig kompensieren (#286) (e6d877c), schließt tapi-prototype-firmware#87 abGeräte: Körperausrichtung bei der Inkwell-Kalibrierung aktualisieren (#268) (89b190b), schließt #286 #286 #286Geräte: Live- (0x0C) und Referenz-Body-Ausrichtung (0xE4) aufteilen (#286 #315) (638487a), schließt #268 #266 #268 einhttp: Antworten bei nicht unterstütztem Protokoll einheitlich auf 422 setzen (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“ zur Bewegungssperre hinzufügen (gesteuert, standardmäßig deaktiviert) (4b69eed), schließt #308 #308 #283 #308 einmodules::navigation: Button-Eingaben mit „prevent_default“; „Clutch-force_scale“; Bubble-Navigation durch Halten (fb216aa), schließt #317 #318 #316 #317 #318 einmodules::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 in inputs[]; Bubble sendet status.engaged (ba2058f), schließt #318Protokoll: Capability-Datei aufteilen, Dämpfungs-Gate, Base-Hoist (30d7d5d), schließt #293Protokoll: Capability-Tabelle und einzelne Emitter für nicht unterstützte Funktionen (289382e), schließt #293 und #295 einProtokoll: „home_return“ und „pen_attached“ über die Tabelle absichern (8a05d20), schließt #293Protokoll: „fw_version“ einführen und Versionsprüfungen migrieren (38c2cae), schließt #293Serialisierung: Greiftasten-Maske in den v3.1-Sitzungsdurchläufen anwenden (7b93e35), schließt #316Serialisierung: Euler bei „config.mount“-Rotationen unter „euler.output“ ausgeben (#268) (f6b54a2)Serialisierung: Euler-Werte bei Transformationsrotationen unter „euler.output“ ausgeben (96c6cc9), schließt #283 abSerialisierung: „Workspace-Zoom“ um den Pivot über „set_transform“ bereitstellen (#309) (c1d08fc), schließt #280 abSerialisierung: „config/body_orientation“ und „trigger_mode“ vereinheitlichen (#265) (8781b8a), schließt #268 abSerialisierung: Transform-Regler in die pro Sitzung geltenden serial_options übertragen (#280) (03b2fd6)Serialisierung: „config/mount“ im Geltungsbereich + „body_orientation“ aufteilen (#265) (5618839), schließt #280 abSerialisierung: Session-Optionen durch die Ausgaben leiten und die verschachtelte Umwandlung absichern (#279, #280) (59984ce), schließt #265 abSerialisierung: Vereinheitlichung der WS- und HTTP-Konfigurations-Dekodierung (#280) (6076917)Sitzungen: Hinzufügen eines generischen Mechanismus zur Bewegungssperre mit Bake beim Disengage (c8d2a93), schließt #304 abSitzungen: live_motion – Fortschreibung der Bewegungssperre pro Tick hinzufügen (gesteuert) (d29013c), schließt #308 #304 #308Sitzungen: Session-Observer auf Manager-Ebene mit Zustellung über die Hauptschleife hinzufügen (83e76ef), schließt #284Sitzungen: „Mount-Reparenting“ und „Workspace-Zoom“ um den Pivot hinzufügen (294d6e8), schließt #265, 297, #272 und #304 abSitzungen: Ereignis-Scope „config.body_orientation“ mit eigenem Namespace hinzufügen; Warnung bei veraltetem „values“-Input (3f70047), schließt #320 abSitzungen: Vorschau-Quelle „config/mount“ und Trigger-Routing hinzufügen (#265) (5d11dbf), schließt #268 abSitzungen: Geräte-Mount im Mount-Bereich speichern und laden (#265) (4cec178), schließt #292Sitzungen: set_workspace_transform_around mit Pivot-Echo verallgemeinern (0b242a2), schließt #309Sitzungen: Greiftasten-Maske und „force_scale“-Overlay-Mechanismen (836ef2f), schließt #316Sitzungen: Tracy-Session-Diagramme mit Client-Profil beschriften (72a8f34), schließt #258Sitzungen: Mount-Scope-Routing und Storage-Virtuals (#265) (9a4e7f4), schließt an #286 und #293 anSessions: force_scale-Ducking pro Session (Vorschau) (bff66ad)Fehlerbehebungen {#bug-fixes}
ci: Release-Toolchain festlegen, um Changelogs wiederherzustellen (72c6773), schließt #313Kompilierungsfehler mit neuem Glaze behoben (e2c53d3)deps: Rust-Crate nix auf 0.31 aktualisieren (b3b9a84)Geräte: „Safety-Config-Protokoll“ an der Sende-Engstelle absichern (b8e8401), schließt #295Geräte: Schreibvorgänge der Safety-Config je nach Firmware-Version und Kalibrierung absichern (5ad5128), schließt #295Geräte: inverse3-Verbindung während des Einschwingfensters nach dem Aufwachen aktiv halten (4afed45)Geräte: inverse3-Verbindung während des Einschwingfensters nach dem Aufwachen aktiv halten (79c2b66)Geräte: [secure] – Akkubenachrichtigung bei kabelgebundenen Verse-Griffen unterdrücken (ea54a1a), schließt #314http: Überprüfung der Kalibrierung bei sitzungsbezogenen Safety-Schreibvorgängen (89f9cd7), schließt #295 #293http: Euler-Rotationen gemäß den Session-Konventionen zusammenführen (#288) (97cf203)inverse_ux: Verarbeitung durch calibration_notifier auf Minverse beschränken (418913f)Anpassung der Lebenszyklen zur Vermeidung von Abstürzen (e7b3785)modules::inverse-ux: „calibration-failed“ immer ausgeben, wenn die Firmware blockiert ist (3841d06)modules::inverse-ux: Erneutes Pairing nach dem Austausch eines gekoppelten Geräts (cf85707), schließt #278modules::sdf: sdf-Transformations-Euler gemäß den Session-Konventionen zusammenführen (#291) (9741ac6)modules::sdf: SDF-Formen im Client-Koordinatensystem ausrichten (c29e4f2), schließt #276Protokoll: Beseitigung von Race-Conditions bei Timer-Lebenszyklen, die zum Absturz oder zur Blockierung des Dienstes führen (0cb019b), schließt #303Protokoll: Serielle Puffer beim Öffnen des Ports leeren, um im laufenden Betrieb ausgetauschte Geräte zu erkennen (b8724d9)Protokoll: Firmware-Client-Callbacks gegen Race-Conditions beim Ausschalten von Geräten absichern (3d795bb), schließt #303Protokoll: 0xE4-IMU-Orientierungs-API mit typisierter Enum und korrektem Wire-Format neu schreiben (8733ec0)Rückkehr in die Ausgangsposition beim Aktivieren und Deaktivieren von „inverse3x“ über den Hub (f435454)Dienst: „adaptives Dispatching“ standardmäßig deaktiviert (9415638)service: Das Herunterfahren des Dienstes geordnet, begrenzt und frei von Race-Conditions gestalten (ff888d7), schließt #303Sitzungen: *_zentriert*- Voreinstellungen auf den tatsächlich erreichbaren Mittelpunkt zentrieren (ad6e726), schließt #321Sitzungen: Siggraph-Auto-Push an der Workspace-Grenze bei Mount-Wechsel entfernen (2df1654)Sitzungen: Das erzwungene Leeren beim Schließen der Sitzung für ein Gerät überspringen, das noch von einer aktiven Sitzung gesteuert wird (e1f9ff7), schließt #324Sitzungen: start() darf die beim Verbindungsaufbau ausgehandelten serial_options nicht mehr zurücksetzen (#290) (27e27d8)Sitzungen: Arbeitsbereichs-Transformationsgeschwindigkeit nach „set_transform“ auf Null setzen (133c3ad), schließt #280WebSocket: Befehle gemäß den Konventionen der sendenden Sitzung dekodieren (#289) (1b24049), schließt #265 abLeistungsverbesserungen {#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