v3.5.1
3.5.1은 안정화 및 품질 개선 릴리스입니다. 주요 테마는 다음과 같습니다: 1↔1 Inverse3 + 그립 구성의 자동 페어링, 열린 WebSocket 세션이 없어도 GET /devices/{id}의 최신 모션 상태 제공, 힘/위치 모드 전환 시 발생하던 삐걱거림(screech) 제거, 지속적인 부하 상황에서 스스로 조정되는 서비스 틱 스케줄러.
하이라이트
- 1↔1 Inverse3 + 그립 설치의 자동 페어링. Inverse3 1개와 그립 1개가 준비되면 SDK가 페어링을 자동으로 등록합니다. 다중 장치 구성에서
pen_attached및 Minverse 캘리브레이션 잠금 해제가 잘못 라우팅되던 문제가 해결되었습니다. - 열린 세션 없이도 최신
GET /devices/{id}스냅샷 제공. 펌웨어 v7.5 이상의 Inverse3 / Inverse3x / Minverse는 이제 WebSocket 활동과 관계없이 20 Hz로 모션 상태를 폴링합니다. v7.5 이전 펌웨어는 폴링을 건너뛰고 경고를 한 번 출력합니다. - 힘/위치 전환 시 삐걱거림 제거.
set_cursor_force↔set_cursor_position전환은 슬롯 배타 방식으로 동작하므로, 틱 사이에는 장치별로 가장 최근 값만 남습니다. HARP의 200 ms 유휴 간격 우회 처리는 더 이상 필요하지 않습니다. - 자가 조정 틱 스케줄러. 메인 루프가 부하에 따라 디스패치 속도를 조정하므로, 느린 틱이 발생해도 명령 큐가 무제한으로 커지지 않습니다.
- 부하 상황에서의 1-in-1-out 스트리밍 응답. WS 메시지별 스트리밍 응답은 세션당 1/ms로 제한됩니다. 제한에 걸리면 이전 버퍼가 재생되므로 sim 루프가
recv()에서 블로킹되지 않습니다.
내부 개선 사항
장치
- 장치별 Inverse3 ↔ VerseGrip 페어링 레지스트리.
GET|POST|DELETE /devices/{sel}/paired_with는 장치별 1:1 매핑입니다.POST는 양쪽 중 어느 쪽이든 충돌하는 기존 항목을 제거(evict)하고,DELETE는 선택된 항목을 지우며, 선택자는 반드시 하나의 ID로 해석되어야 합니다. - 펌웨어 v7.5 이상의 20 Hz 모션 상태 폴링.
GET /devices/{id}는 50 ms마다 최신cursor_position,cursor_velocity,angular_position,angular_velocity값을 반환하며, 활성 세션에는 영향을 주지 않습니다. - 무선 VerseGrip
set_extension_data속도 제어. 오래된 값은 버리고 유휴 시 반복 전송하는 파이프라인이 서비스 틱에서 처리됩니다. 과도하게 전송해도 무선 링크가 포화되지 않으며, 전송이 부족해도 오래된 값이 남지 않습니다.
세션
- 제어 전용 배치(힘/위치)를 위한 새로운 WS 수신 고속 경로가 추가되어 구성 인식 파이프라인을 건너뜁니다.
configure/set_profile/ 커스텀 명령은 여전히 경합 조건(race) 수정 경로를 거칩니다.
관측성 (Observability)
- 감지 로그 빈도는 포트별로 관리되며 지속 발생 여부를 고려합니다. 블랙리스트에 등록된 각 포트는 독립적으로 제어됩니다. 반복되는
"...blacklisted: skipping"로그 줄에는 이제 실행 사이에 억제된 틱 수를 나타내는(×N)이 표시됩니다. - 비-WVG 장치를 탐지할 때 무선 VerseGrip 감지가 더 이상 로그를 과도하게 채우지 않습니다.
수정 사항
POST /device.config.preset에defaults또는arm_front를 지정하면 이제 장치 마운트가 공장 프리셋으로 재설정됩니다(이전에는 조용히 무시되던 동작).basis는 유지되므로 앱에서 설정한 베이스는 마운트 프리셋을 변경해도 그대로 남습니다.force_render_full_state가 일치하는 configure 요청과 같은 WS 메시지로 도착했을 때 더 이상config블록이 누락된 스냅샷을 반환하지 않습니다 — configure 경로가 스냅샷 전에 동기적으로 먼저 처리됩니다.- 교차 세션
force_render_full_state는 대상의 전체 스냅샷을 반환합니다. 이제 A와 B 모두 전체 페이로드를 받습니다(이전에는 A가 스트리밍 데이터만 받았음). - 알 수 없는
target_session_id를 가진 교차 세션 명령이 더 이상 요청-응답 루프를 멈추지 않습니다. 요청자는 자신의 스냅샷과session-command-dropped이벤트(cross-session-unknown-target)를 받습니다. - Minverse 다중 장치 캘리브레이션 잠금 해제가 잘못 라우팅되지 않습니다. Minverse A를 캘리브레이션해도 Minverse B가 잠금 해제되지 않으며, inkwell-success 헤딩 브로드캐스트에도 같은 수정이 적용되었습니다.
- HTTP 장치 선택자는 장치 ID로
#1234와1234를 모두 허용합니다. 선택자 클래스(inverse3,verse_grip)도 인덱스와 함께 사용할 수 있으며, 404 메시지에는 원래 선택자 식이 그대로 표시됩니다. - 무선 VerseGrip
ready플래그는 이제 초기 장치 정보 핸드셰이크 이후에만 설정됩니다. 이전에는 특정 재연결 경로에서 장치가 자신을 완전히 알리기 전에 이 플래그가 변경될 수 있었습니다. - 키 기반 레이트 게이트 설정의 런타임 변경 사항은 다음 히트부터 적용됩니다(이전에는 첫 emplace 시점에 고정되어, 새 세션에서만 변경 사항이 반영되었습니다).
잠재적인 호환성 파괴 변경 (Breaking Changes)
- HTTP 404 문자열 통일 —
basis,preset,mount,transform,force_gate전반에서"{type} device #{id} not found"→"no device matches selector '{expr}'"로 변경되었습니다. 세션 404도 동일하게 통일되었습니다. - 설정 glob
devices/inverse*/...→devices/*inverse/...적용 대상: force-scale gain, force-gate gain, control timeout,safeties/expose_in_snapshot. 기존 리터럴을 사용하는 3.5.0 설정 파일은 바인딩에 실패합니다. - 설정: 직렬화 전역 항목이
session/serialization/*로 이동되었습니다(explicit_fields,force_complete_transforms,preview/*). 기존serialization/*경로는 지원 중단된 별칭을 통해 계속 해석되며, 4.0에서 제거될 예정입니다. - 동작 변경: 지속적인 트래픽 상황에서 메시지별 WS 응답을 틱 동기화 핸드셰이크로 사용하는 클라이언트는 세션당 1ms에 최대 한 번의 응답만 받게 됩니다. 구성 변경 시의 전체 스냅샷은 영향을 받지 않습니다.
지원 중단 (Deprecations)
3.5.1에는 지원 중단 항목이 없습니다. preview 마스터 스위치는 다가오는 3.6의 무음 → 경고 전환 파이프라인을 위한 지원 중단 기반 구조이며, 첫 번째 지원 중단 적용은 3.5.2에 예정되어 있습니다.