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