Highlights
docked stylus is set to moved from 135 to 180 degrees. This is the single expected visible
difference from 3.5.6 in an otherwise unchanged default session — ungated, no opt-in, every user
on handle firmware 1.3.1 or above. Detailed under Fixes.
state.body_orientation tracks the device at20 Hz instead of freezing as soon as an application starts driving it (Inverse3 / Minverse
firmware 7.9 or newer, on by default).
DELETE onconfig/torque_scaling, config/gravity_compensation and config/handedness returns the value
the device powers up with instead of a factory constant compiled into the service — so a
left-handed device saved as left-handed no longer resets to right-handed.
one shared mount or body-orientation write used to emit a session-updated per holding session,
none of them naming the device; every holding session still refreshes from its next snapshot.
Internal improvements
devices/*inverse/body_orientation_poll_interval_ms setting (default 50 ms, 0 disables,range 0–5000) tunes the live orientation read; the 50 ms device motion timer is an effective
floor.
devices/*inverse/query_orientation_on_idle on against old firmware tells you the knob is inert
instead of staying silent.
its last good value forever; the held value itself is unchanged, so the device stays usable.
config/mount or config/body_orientation write still announces on thedefault events channel exactly as before — only the device-scope cause was withdrawn, and
handedness, torque_scaling and gravity_compensation keep their per-session announcements.
Fixes
stylus is set to on inkwell calibration moved from 135 to 180 degrees, and the value became the
setting devices/*inverse/inkwell/dock_heading_deg. Measured 2026-09-22 on a Minverse with a
stylus at handle firmware 1.3.1: the old 135 degrees left the docked pen 45 degrees short, so the
yaw estimator had to drift it back (+42 to +50 degrees observed); the residual is now within about
5 degrees. Not stage-gated — the dock-calibration path always runs — so a docked pen's
published orientation changes by 45 degrees for every user on handle firmware 1.3.1 or above.
Below that floor the firmware ignores the value and snaps the full pose, so those users see no
change.
state.body_orientation was only refreshed while the device sat idle, so it froze the instant anapplication started streaming forces and every consumer read a stale handshake snapshot. It is now
polled on the existing motion timer and is live in-session.
DELETE on config/torque_scaling, config/gravity_compensation and config/handedness wrote acompiled-in factory constant over the device's own stored configuration, so "reset to default"
and the device's real power-on state diverged — config/handedness always snapped to right
regardless of what the device had been saved as. All three now restore the stored value, falling
back to the old constant only for a field that was never read from the device.
the payload carries only session_id, profile and scope — no device identifier — so a
subscriber could neither attribute a copy nor deduplicate the set. The device-scope announcement
is withheld pending a device-addressed replacement; the per-session refresh is untouched.
Potential breaking changes
DELETE config/torque_scaling, config/gravity_compensation and config/handedness change whata reset means: the reply and the written value are now the device's stored configuration rather
than a fixed service-side constant. Response shapes are unchanged and the values only differ on a
device whose stored configuration differs from the factory constant — but an integration that
asserted the literal constants (false / {enabled: true, scaling_factor: 0.0} / right) will
see different values.
state.body_orientation keeps its exact shape and tier but changes value semantics: a field thatwas effectively static for a streaming client now moves at 20 Hz. A consumer that treated it as
constant-after-attach sees new behaviour with no opt-in.
:10020 subscriber with no opt-in no longer receives session-updated for config.mount orconfig.body_orientation when the cause is a device-scope write, and the deprecated flat
body_orientation scope follows the same lane rather than leaking back to the default channel.
Migration: stop treating the event as the refresh trigger and read the value from the session
snapshot — it still refreshes on every holding session with no opt-in at all. The equivalent
session-scope events, and the handedness / torque_scaling / gravity_compensation
announcements, are unaffected.
bug fix and is published under Highlights and Fixes. Recorded here because the observable value
moves with no opt-in for every user on handle firmware 1.3.1 or above, so anyone who calibrated
their own application against the old 135-degree datum has real migration work. No shape changes.
Deprecations
devices/*inverse/query_orientation_on_idle becomes redundantwhenever the new poll interval is non-zero, but it is deliberately not flagged deprecated in
3.5.7 — that deprecation is scheduled for 3.6.
