본문으로 바로 가기

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/... 적용 대상: 힘 스케일 이득, 힘 게이트 이득, 제어 타임아웃, 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 버전에서 예정되어 있습니다.