3.5.3 (2026-08-06) {#353-2026-08-06}
내부 개선 {#internal-improvements}
core/log: 지연 포맷 haply_* 매크로 형태 추가 (cf7dbfc), closes #271core: pivot 및 compose/inverse 변환 프리미티브 추가 (01080f6), closes #283devices: 0xE4 body orientation 캐시 및 trigger_mode 라우팅 (#265) (4864700)devices: 서비스 측에서 0xE4 IMU 센서 프레임 보정 (#286) (e6d877c), closes tapi-prototype-firmware#87devices: inkwell 캘리브레이션 시 body_orientation 갱신 (#268) (89b190b), closes #286 #286 #286devices: 실시간(0x0C)과 기준(0xE4) body orientation 분리 (#286 #315) (638487a), closes #268 #266 #268http: 지원되지 않는 프로토콜 응답을 422로 통일 (e0e7638), closes #293 #293 #295http: transform 에코 및 sdf 입력을 euler 지원 패치로 마이그레이션 (#279, #280, #291) (bb29404)http: Delete scope=device 시 장치 마운트 초기화 (#265) (f6bf26b), closes #286modules::navigation: 모션 잠금에 clutch 모드 추가 (게이트 적용, 기본값 꺼짐) (4b69eed), closes #308 #308 #283 #308modules::navigation: prevent_default 적용 버튼 입력; clutch force_scale; bubble hold-to-navigate 지원 (fb216aa), closes #317 #318 #316 #317 #318modules::navigation: clutch max_motion/force_scale 상한 설정 (a946088), closes #316modules::navigation: 미러링된 기능 킬 스위치, 둘 다 기본값 활성화 (b6ee0c0), closes #318modules::navigation: inputs[]에 대한 입력별 설정 패치; bubble이 status.engaged를 발행 (ba2058f), closes #318protocol: capability 파일 분리, damping 게이트, base 호이스팅 (30d7d5d), closes #293protocol: capability 테이블 + 단일 unsupported 발행기 (289382e), closes #293 #295protocol: 테이블을 통해 home_return 및 pen_attached 게이트 적용 (8a05d20), closes #293protocol: fw_version 도입 및 버전 검사 마이그레이션 (38c2cae), closes #293serialization: v3.1 세션 패스에 grip 버튼 마스크 적용 (7b93e35), closes #316serialization: euler.output 하위 config.mount 회전값에 euler 값 발행 (#268) (f6b54a2)serialization: euler.output 하위 transform 회전값에 euler 값 발행 (96c6cc9), closes #283serialization: set_transform에 workspace zoom-about-pivot 노출 (#309) (c1d08fc), closes #280serialization: config/body_orientation trigger_mode 평탄화 (#265) (8781b8a), closes #268serialization: transform 노브를 세션별 serial_options로 승격 (#280) (03b2fd6)serialization: config/mount를 scope와 body_orientation으로 분리 (#265) (5618839), closes #280serialization: 세션 옵션을 출력 전반에 전달하고 중첩된 reshape에 게이트 적용 (#279, #280) (59984ce), closes #265serialization: ws 및 http configure 디코딩 통일 (#280) (6076917)sessions: disengage bake를 포함한 범용 모션 잠금 메커니즘 추가 (c8d2a93), closes #304sessions: live_motion 추가: 틱 단위 모션 잠금 진행 (게이트 적용) (d29013c), closes #308 #304 #308sessions: 메인 루프 전달 방식의 매니저 수준 세션 옵저버 추가 (83e76ef), closes #284sessions: 마운트 reparent 및 workspace zoom-about-pivot 추가 (294d6e8), closes #265 297/#272 #304sessions: 네임스페이스가 적용된 config.body_orientation 이벤트 스코프 추가; 레거시 'values' 입력에 대해 경고 (3f70047), closes #320sessions: 미리보기 config/mount 소스 및 트리거 라우팅 추가 (#265) (5d11dbf), closes #268sessions: mount 공간에서 장치 마운트 저장/불러오기 (#265) (4cec178), closes #292sessions: pivot echo 포함 set_workspace_transform_around 일반화 (0b242a2), closes #309sessions: grip 버튼 마스크 + force_scale 오버레이 메커니즘 (836ef2f), closes #316sessions: 클라이언트 프로필 기준으로 Tracy 세션 플롯에 라벨 추가 (72a8f34), closes #258sessions: mount scope 라우팅 및 storage virtuals (#265) (9a4e7f4), closes post-#286 #293sessions: 세션별 force_scale 덕킹 (미리보기) (bff66ad)버그 수정 {#bug-fixes}
ci: changelog 복원을 위해 릴리스 툴체인 고정 (72c6773), closes #313새 glaze 대응 컴파일 수정 (e2c53d3)deps: rust crate nix를 0.31로 업데이트 (b3b9a84)devices: 전송 병목 지점에서 safety-config 프로토콜에 게이트 적용 (b8e8401), closes #295devices: fw 버전 및 캘리브레이션 기준으로 safety-config 쓰기 보호 (5ad5128), closes #295devices: 웨이크업 안정화 구간 동안 inverse3 wire 연결 유지 (4afed45)devices: 웨이크업 안정화 구간 동안 inverse3 wire 연결 유지 (79c2b66)devices: 유선 verse grip에서 [secure] 배터리 알림 억제 (ea54a1a), closes #314http: 세션 범위 safety 쓰기 시 캘리브레이션 확인 (89f9cd7), closes #295 #293http: 세션 규약에 따라 euler 회전값 통합 (#288) (97cf203)inverse_ux: calibration_notifier 처리를 Minverse로 제한 (418913f)크래시 방지를 위한 lifetime 정리 (e7b3785)modules::inverse-ux: 펌웨어가 차단할 때 항상 calibration-failed 발행 (3841d06)modules::inverse-ux: 페어링된 장치 하나를 교체한 뒤 재페어링 (cf85707), closes #278modules::sdf: 세션 규약에 따라 sdf transform euler 통합 (#291) (9741ac6)modules::sdf: SDF 도형을 클라이언트 좌표계에 맞춰 방향 설정 (c29e4f2), closes #276protocol: 서비스를 크래시시키거나 멈추게 하는 타이머 lifetime 경쟁 상태 제거 (0cb019b), closes #303protocol: 포트 열 때 시리얼 버퍼 플러시로 핫스왑 장치 인식 (b8724d9)protocol: 장치 소멸 경쟁 상태에 대비해 펌웨어 클라이언트 콜백 보호 (3d795bb), closes #303protocol: 타입이 지정된 enum과 올바른 wire 포맷으로 0xE4 IMU orientation API 재작성 (8733ec0)inverse3x enable/disable bia hub에 대해 홈으로 복귀 (f435454)service: 적응형 디스패치 기본값 비활성화 (9415638)service: 서비스 종료를 순서 보장, bounded, 경쟁 상태 없음 방식으로 개선 (ff888d7), closes #303sessions: 실제로 도달 가능한 중심에 맞춰 *_centered 프리셋 중앙 정렬 (ad6e726), closes #321sessions: 마운트 변경 시 siggraph 워크스페이스 경계 자동 푸시 제거 (2df1654)sessions: 라이브 세션에서 아직 구동 중인 장치의 경우 종료 중 세션의 force drain 건너뛰기 (e1f9ff7), closes #324sessions: start()가 연결 시점에 협상된 serial_options를 지우는 문제 수정 (#290) (27e27d8)sessions: set_transform 이후 workspace transform 속도를 0으로 설정 (133c3ad), closes #280websocket: 발신 세션의 규약에 따라 명령 디코딩 (#289) (1b24049), closes #265성능 개선 {#performance-improvements}
core/log: 비활성화 시 fmt::format을 건너뛰도록 haply_* 매크로에 게이트 적용 (672a87a), closes #270modules::sdf: 틱마다가 아닌 생성 시 한 번만 SDF bake (15350c5), closes #277