macOS 키체인 헬퍼의 조회 경로와 테스트가 Windows CI에서 올바르게 동작합니다. macOS 설치 위치(OmO.app 런타임과 헬퍼 복사본)는 모든 호스트에서 POSIX 구분자로 구성되며, #11262의 키체인 헬퍼 테스트는 플랫폼에 맞는 경로를 사용하므로 dev의 Windows 테스트 레그가 다시 통과합니다. (#12690, #11262의 일부)
수정됨: 첫 번째 장치 목록 조회가 로그아웃되었거나 지원되지 않는 장치마다 약 10초씩 기다리지 않습니다. bunshin SDK는 이런 장치의 도구 목록을 설명하려고 시도하지 않고 즉시 빈 목록으로 응답합니다. (#12680)
내부 변경: 번들된 bunshin SDK가 고정된 typebox를 패키지 이름 대신 omo-senpi의 #bunshin-ts-dep/ 임포트를 통해 가져오므로, senpi의 확장 레지스트리가 다른 typebox를 전달할 수 없습니다. 사용자에게 보이는 변경은 없습니다. (#12676) (#12680)
다른 장치의 스레드 작업은 릴레이 왕복 횟수가 줄었습니다. 세션의 attach가 작업 간에 유지되고, 세션의 모델 카탈로그를 그 세션에 보관하므로, 해당 카탈로그에 있는 정확한 provider/id로의 모델 전환은 set_model 한 번으로 끝납니다. 실행되었을 수도 있는 설정 요청은 여전히 idempotency_uncertain으로 보고되며, 거부된 요청은 카탈로그를 다시 읽고 새 카탈로그를 조회했을 때와 같이 응답합니다. 상태 및 트랜스크립트 읽기(get_state, get_messages)는 attach에 기록 없이 엔진의 인메모리 상태가 바뀌기 때문에 매번 장치로 요청합니다. (#12672)
omo를 시작할 때 응답이 느린 실행 중인 장치 서비스를 더 이상 재설치하고 재시작하지 않습니다. macOS와 Linux에서 핸드셰이크 타임아웃은 한 번 재시도한 뒤 중지된 서비스로 취급하지 않고 degraded로 보고합니다. (#12665)
엔진이 turn ID 없이 started를 응답하는(senpi 2026.11.2) 다른 장치의 스레드로 보낸 메시지는, idempotency_uncertain 대신 get_state가 보고하는 실행 중인 turn으로 확인됩니다. (#12660)
수정됨: 다른 장치의 스레드를 닫을 때 uncertain(reply_lost) 대신 closed로 응답합니다. 닫기는 그 장치에서 적용되었지만, 다른 장치가 세션의 attachment를 종료하면서 응답이 누락되었기 때문입니다. (#12655)
수정됨: 다른 장치에서 생성된 스레드(device를 지정한 thread_create 또는 그 장치에서의 fork)는 해당 장치가 목록에 표시하는 ID로 이름이 지정됩니다. 그래서 읽기, 메시지 전송, 중단, 모델 전환, 닫기가 session_not_found 응답 대신 정상 동작합니다. (#12651)
내부 변경: knip이 닫힌 장치 로그인 프리로드 픽스처(--preload 테스트 파일이며 아무도 임포트하지 않음)를 무시합니다. 동작 변경은 없습니다. (#12648)
위임된 하위 세션의 모델 체인에 연결된 프로바이더가 없으면, 이제 체인의 모든 모델과 정확한 해결 방법을 담은 하나의 메시지로 실패합니다. 불투명한 "no available model" 대신, 체인의 각 모델이 필요로 하는 프로바이더와 함께 순서대로 나열되며, 거부 메시지에는 연결되지 않은 프로바이더가 명시되고, 앱의 설정 편집기가 기록하는 키(카테고리는 categories.<name>.model, 에이전트는 agents.<name>.model)가 표시됩니다. 따라서 부모 세션은 죽은 바인딩을 재시도하는 대신 첫 줄에 따라 조치할 수 있습니다. 이 머신의 레지스트리가 제공하지 않는 모델에 고정된 레인도 같은 거부 메시지로 처리되며, 고정된 모델과 설정 키를 알려줍니다. 아무것도 대체되지 않으며 하위 세션도 생성되지 않습니다. (#12634). (#12636)
내부 변경(테스트 전용): omo 네이티브 trust-stage TLS 프로브에서 채널이 멈추면 이제 false 대신 "timeout"을 보고하므로, 멈춤이 TLS 거부를 기대하는 assertion을 통과할 수 없습니다. (#12629)
스킬 감사의 세 번째 패스에서 배포된 스킬의 검색 명령 3개와 폐기된 카테고리 이름 1개를 수정했습니다 (#12525).
rg -iE를 사용한 rg 예시 3개가 있었습니다. ripgrep에서 -E는 패턴 타입 플래그가 아니라 --encoding이므로, 결합된 형태는 다음 인수를 소비해 예시가 주장한 대로 동작하지 않았습니다. 이제 rg -i를 사용합니다.refactor 가이드라인 한 줄이 에이전트에게 deep에서 폴백하라고 지시했습니다. 해당 카테고리가 deep-low / deep-high로 분리되었으므로, 이제 deep-high를 명시합니다. (#12615)refactor-squad 멤버 프롬프트는 team_send_message + team_task_update를 유지합니다. 팀 모드 인터페이스는 멤버에게 task_send를 노출하지 않으므로, 이 프롬프트를 task_send({ to: "lead" })로 다시 쓰던 이전 초안은 잘못된 것이었으며 여기서 되돌렸습니다. (#12615)
스킬 감사의 두 번째 패스에서, 배포된 텍스트가 코드와 어긋나던 24곳을 추가로 수정했습니다. 591행짜리 커뮤니티 감사에서 213행이 "partial"로 남았고, 현재 소스와 대조해 다시 읽었으며, 이전 패스에서 거부되었던 83개 참조 행도 함께 검토해 실제 문제 몇 가지를 찾았습니다 (#12525). ast-grep 예시는 이제 검색 경로를 --lang 앞에 둡니다(헬퍼는 기본 macOS에 탑재된 Python 3.9에서 뒤에 오는 것을 거부합니다). 그리고 $$$를 실제 ast-grep 0.51의 지연 매처(lazy matcher)로 설명합니다. refactor의 ast-grep 호출 지점은 이제 헬퍼가 ast-grep 스킬에 있다고 설명하고, mass-ulw의 그래프 예시는 평가 커널에 없는 glob() 대신 new Bun.Glob(...)을 사용합니다. 한 표면 내부의 모순도 해소되었습니다. refactor 트리거 임계값, browser의 WAF 라우팅, ulw-loop의 서로 다른 목표 및 자기 실행 규칙, ulw-plan의 리뷰 라운드 수와 git 카테고리, ulw-execute의 다음 웨이브 amend, mass-ulw의 SDK 표면과 전달 게이트 목록, ulw-research의 sum 컨텍스트 필드, visual-qa의 1920 캡처, debugging의 정리 후 증거 라인, 두 개의 기본 색상에 대한 강조색 라인, 그리고 git-master의 커밋 게이트와 커밋을 의무화하는 워크플로 간의 충돌이 모두 해결되었습니다. (#12614)
배포된 스킬이 더 이상 에이전트에게 모순된 지시를 내리거나, 동작하지 않는 명령을 설명하지 않습니다. 설치된 스킬에 대한 커뮤니티 감사는 두 스킬 간, 또는 스킬과 코드 간에 불일치하는 591곳을 나열했습니다. 두 모델 계열이 이 저장소에서 118개의 근본 원인을 확인했고, 그중 117개가 수정되었습니다 (#12525). ultrawork 검증 게이트는 이제 계획 파일만 검토하는 plan-reviewer 대신 omo-native-gate-reviewer를 생성합니다. ulw-execute --make-pr는 PR URL과 함께 인계하며 요청이 있을 때만 병합하고, --ship은 병합합니다. ultrawork, review-work, ulw-execute, ulw-loop는 이제 최종 QA를 누가 수행하는지에 대해 일치합니다. 스킬은 이제 실제 task_send({ to }) 형태, codexGoalJson, 세션 범위의 .omo/ulw-loop/<session-id>/ 경로, lsp_* 도구 이름, 각 하네스가 읽는 LSP 설정 경로, ast-grep이 허용하는 ast-grep 명령과 규칙 형태, dag SDK의 결과 envelope를 사용합니다. 250줄 분할 규칙, 버그 수정과 레거시 코드에 대한 리팩터링 금지 규칙, Miri 배포 게이트, SIZE_OK 및 catch 옵트아웃 마커, ulw-research 게이트 순서, visual-qa의 간격 및 모션 검사가 더 이상 서로 모순되지 않습니다. (#12528)
컴퓨터 사용 기능이 분할 세션의 도구 측면에 대비되었습니다. 이 경우 감사 파일은 장치에서 호출 소유자의 감사 디렉터리로 전달되고, 감사 레코드에는 호출한 세션의 ID가 포함되며, 캡처 크기는 장치에 없는 모델이 아니라 호출과 함께 전송된 정책을 따릅니다. 로컬 세션은 이전과 완전히 동일하게 동작합니다. (#12452)
macOS에서 omo-senpi 세션이 HOME의 모든 파일 쓰기마다 깨어나지 않습니다. 설정 감시는 cwd와 HOME까지의 모든 상위 디렉터리에 대해 "여기에 .omo가 나타날 수 있음" 대상을 추가했고, macOS의 디렉터리 감시는 그 아래의 모든 변경을 받으므로, 각 세션이 HOME의 모든 쓰기를 처리했습니다. 이제 이러한 생성 대상은 프로젝트 루트(.git을 가진 첫 번째 상위 디렉터리)에서 멈추며, 사용자 설정 디렉터리의 상위 디렉터리(HOME, 이미 사용자 설정 대상이 포함하고 있음), 그것을 포함하는 모든 디렉터리, 파일 시스템 루트는 절대 포함하지 않습니다. 이미 존재하는 .omo 디렉터리는 여전히 HOME까지 감시되며, 프로젝트 루트 위에 새로 생긴 .omo는 다음 세션 시작 시 감지됩니다. (#12397)
omo remote attach는 모든 엔진 명령을 원격 세션으로 전달하고, 엔진 자체의 응답을 표시합니다. attach 뷰는 더 이상 허용된 명령 목록을 자체적으로 관리하지 않습니다. 핸드셰이크를 제외하고, attach TUI가 보내는 모든 레코드는 변경 없이 원격 장치로 전달되며, 그 장치의 엔진이 처리를 결정합니다. 엔진의 응답은 같은 요청으로 데이터와 함께 돌아오고(큰 응답은 먼저 재조립되어 검증됩니다), 거부는 원격 측이 명시한 그대로 표시되며, 엔진이 그 명령에 대해 보내는 대화상자와 이벤트는 TUI에 도달합니다. 장치 서비스 클라이언트는 현재 로컬 API를 사용합니다. 명령당 하나의 엔진 레코드, 위임된 명령 채널, session.endpoints, 종류와 상위 항목이 포함된 목록 행, 그리고 새로운 거부 및 분리 사유를 지원합니다. (#12261)
데스크톱 메모리 동기화가 이제 CLI 대신 데스크톱의 계정을 사용합니다. 데스크톱이 실행한 엔진은 시작 시 전용 memory-sync 채널을 확보하고, 부트스트랩 핸드셰이크로 응답하며, 데스크톱을 통해 동기화 계정을 해석합니다. 이 채널 없이 실행된 경우에는 omo login이 유지하는 계정을 계속 사용하며, 선언된 채널이 실패하면 CLI 자격 증명으로 대체하지 않고 메모리 동기화를 사용 불가로 보고합니다. Windows는 pipe-pair 경로가 도입될 때까지 이 채널을 계속 거부합니다. (#12008) (#12064)
데스크톱 메모리 동기화가 이제 Windows에서 연결됩니다. 엔진의 수신기가 win32를 더 이상 거부하지 않으며, 선언된 memory-sync 채널에 대해 senpi가 넘겨주는 스트림을 사용합니다. senpi는 상속 플래그가 이미 해제된 두 개의 단방향 파이프로 이를 구성하므로, omo 측은 디스크립터를 열지도 않고 아무것도 생성하지 않습니다. senpi가 채택하지 않은 선언된 채널은 여전히 메모리 동기화를 사용 불가로 보고하며, CLI 자격 증명으로 대체하지 않습니다. 이는 #12008에서 언급된 Windows 거부를 대체합니다. (#12025) (#12064)
macOS 로그인이 서명된 키체인 소유자의 클라이언트 측을 확보합니다. 새 모듈은 키체인 헬퍼의 Developer ID 서명을 검사하고(서명되지 않았거나 ad-hoc 서명된 사본은 절대 실행하지 않음), 검증된 사본을 찾고, 세션 락 아래에서 통신하며, 프로세스당 하나의 승인을 유지합니다. 로그인은 아래의 키체인 저장소를 통해 이 모듈을 사용합니다. (#11586, #11262의 일부) (#11613)
세션 락을 단일 호출 동안 자식 프로세스에 넘길 수 있습니다. withLock이 이제 콜백에 lease를 제공합니다. handOver(pid)는 자식을 락의 활성 보유자로 만들고, restore()는 이를 되돌려 받으며, 그 사이 락이 바뀌었다면 임계 구역을 중단합니다. macOS 키체인 헬퍼는 키체인 변경이 반영되는 동안 다른 쓰기 주체가 진입하지 못하도록 이 기능을 사용합니다. (#11578, #11262의 일부) (#11613)
macOS 로그인에서 키체인 접근을 반복해서 묻지 않습니다. OmO의 서명된 키체인 헬퍼가 설치되어 있으면, 로그인 항목은 토큰이 처음 사용될 때 헬퍼로 이동하며, 그 이후의 읽기에는 대화상자가 필요하지 않습니다. 다른 앱이 만든 항목은 머신당 최대 한 번, 일반 대화상자로만 묻고 비밀번호 대화상자는 절대 띄우지 않습니다. Windows와 Linux는 변경되지 않습니다. (#11589, #11262의 일부) (#11613)
omo doctor가 macOS 키체인 헬퍼를 검사합니다. 헬퍼가 없거나 손상된 경우 경고로 보고하며(로그인은 이전 경로를 통해 계속 동작), OmO 데스크톱 앱이 만든 항목은 CLI가 키체인 접근을 요청하기 전에 앱 자체가 헬퍼로 옮깁니다. (#11613, #11262의 일부)
thread_send 및 thread_handoff가 프롬프트 전에 세션 상태를 더 이상 읽지 않습니다. 프롬프트가 먼저 후속 메시지로 전송되고, 다른 장치의 엔진이 turn을 시작할지 실행 중인 turn 뒤에서 대기할지 결정합니다. 현재 엔진에서 전송은 세 번이 아니라 순차적인 릴레이 왕복 두 번이 걸립니다. 프롬프트를 보내고, 이후 시작된 turn의 ID(유휴 세션) 또는 대기열 위치(사용 중인 세션)를 위해 상태를 한 번 읽습니다. 다른 장치의 엔진이 senpi#6135(senpi#5999를 수정함)를 포함하면, turn을 시작하는 전송은 한 번의 왕복으로 줄어듭니다. 다른 세션이 turn을 점유했지만 아직 시작하지 않은 상태에서 도착한 전송은 이제 unsupported로 실패하는 대신 queued로 응답합니다. steer는 여전히 먼저 세션 상태를 읽습니다. (#12679)visualize, data-scientist, frontend 스킬이 이제 답변 옆에 인라인으로 표시되는 차트 페이지를 만드는 방법을 설명합니다. 수치는 원천에서 계산됩니다(데이터가 있는 데이터베이스의 SQL, 파일에 대한 DuckDB 또는 Polars). 인라인 차트는 matplotlib PNG 대신 HTML로 그려지며, light-dark() 폴백이 테마를 따르도록 :root { color-scheme: light dark; }를 사용합니다. 막대는 고정 높이 컨테이너 안의 HTML 요소이며, 첫 번째와 마지막 축 레이블은 차트 가장자리에 맞춰져 390px에서도 잘리지 않고, 날짜는 독자의 시간대로 구분되며 부분적인 날은 별도의 막대로 표시되고, 한 수치는 두 번째 출처와 교차 검증됩니다. 미리보기 단계는 이제 답변 너비와 390px에서 다크 모드와 라이트 모드의 각 차트 최대 막대 및 범례 색상을 측정합니다. frontend는 인라인 페이지를 DESIGN.md 게이트, Lighthouse 감사, 리서치 레인에서 면제합니다. visualize는 이미 이를 전제로 하고 있었습니다. (#12612)omo login --device와 omo login --no-browser는 이제 OmO 계정이 아직 닫혀 있어도 로그인할 수 있습니다. 따라서 브라우저나 데스크톱 앱이 없는 컴퓨터(예: SSH로 접속하는 서버)도 다른 장치에서 코드를 승인하여 로그인할 수 있습니다. 일반 omo login, omo logout, omo whoami는 여전히 데스크톱 앱을 안내합니다. (#12640)service-auth 릴리스 단계는 엄격한 ed25519 키 집합이 아닌 키 세트를 거부하며, 사용 가능한 키가 없는 빌드는 현재 사용자에게 업데이트하라고 알리는 대신 빌드 결함을 보고합니다. (#12602)process snapshot failed: <reason> 형식)이며, 테이블을 반드시 요구하지 않습니다 (#12145). (#12545)onboarding 스킬을 명시하며, 스킬 목록이 이를 이름으로 해석합니다 (#12150). (#12544)onboarding이어서 스킬 목록에서 내장 스킬을 가리면, 투어는 그 가리는 스킬을 말없이 따르는 대신 내장 스킬의 절대 경로로 폴백합니다. 새 포인터 텍스트에 맞춰 EQ 골든 파일을 다시 기록했습니다 (#12544 리뷰). (#12544)disabled_skills에 onboarding이 있으면, 투어는 숨겨진 스킬의 이름을 노출하는 대신 내장 경로로 폴백합니다 (#12544 리뷰). (#12544)~/.omo, ~/.omo/memory 또는 메모리 영역 위의 다른 폴더에 대한 ls, find, grep, glob이 Finder나 탐색기가 남긴 .DS_Store 또는 desktop.ini가 있어도 "다른 메모리 ID에 속함"이라는 이유로 더 이상 거부되지 않습니다. 이제 가드는 메모리 영역 위에서의 검색을, 그곳에 다른 ID의 디렉터리(영속적, 저장소 없음, 또는 실행 중인 작업)가 존재할 때만 거부하며, 거부 메시지는 그 디렉터리를 찾았다는 사실만 말하고 이름은 밝히지 않습니다. (#12301) (#12476)스레드 도구는 설정 없이 모든 세션에서 기본으로 이 장치의 장치 서비스를 사용해 다른 장치에 접근합니다. 장치 서비스가 없는 장치는 기존의 로컬 동작을 유지합니다. (#12336, #12320의 일부)
스레드 도구는 스레드의 계정 전체 별칭과 생성할 스레드의 device를 받습니다. 이는 로그인된 다른 장치에 접근하기 위한 기반입니다. 모든 호출은 이 장치에서와 정확히 같이 응답하며, Free 계정에는 명확한 오류가 표시됩니다. 다른 장치에 접근하는 기능은 이후에 추가될 장치 서비스 연결과 함께 제공됩니다. 새로운 thread_close는 이 장치 또는 다른 장치의 세션을 해당 세션을 가진 모든 클라이언트에 대해 종료합니다. 라이브 세션이 없는 스레드는 closed: false로 응답하며, 터미널의 자체 세션은 그 터미널에 남습니다. (#12335, #12320의 일부)
헤드리스 데스크톱 가짜 백엔드(senpi-desktop-backend-fake)는 창 식별 및 식별 변경, 키 프라이밍 포커스 읽기 및 포커스 레코드 결과, 히트 읽기, 최상위 pid를 포함한 시간 기반 사용자 입력 이력, 접근성 기한과 밀집 트리 설정, epoch 이벤트, 디스플레이 변경, 중지 마커를 스크립트로 제어할 수 있습니다. 새 훅마다 싱크 작업이 기록되고, 모든 필드의 기본값은 현재 동작이며, 절대 발생할 수 없는 타임라인(nth: 0, 한 시간 이상 뒤의 누르기)은 로드 시 거부됩니다. (#12313, #12232의 일부)
데스크톱 엔진 프로토콜은 프로토콜 1에서 선택적 액션 보고 어휘를 추가합니다. 버전이나 ABI는 변경되지 않습니다. engine.hello는 features: ["action-report"]를 나열하며, reportMode: "object"로 열린 세션은 모든 변경 요청마다 ActionReport를 받습니다. 보고서는 입력이 대상에 도달했는지와 재시도가 안전한지를 알려주며, 일곱 가지 {delivery, retry} 쌍 중 하나로 표현됩니다. 이러한 요청의 오류에는 동일한 disposition이 포함됩니다. 옵트인하지 않은 세션은 새로운 features 목록을 제외하고 이전과 같은 응답을 받습니다. 프로토콜에는 AmbiguousTarget, CaptureConsentRequired, ProtectedProcess 오류 코드, epoch.changed 알림, 그리고 이후 변경에서 채워질 선택적 창 식별 및 접근성 증거 필드도 추가되었습니다. 프레임 ID는 이제 엔진 프로세스마다 고유하므로, 세션 재오픈 이전의 프레임 ID가 새 캡처와 일치할 수 없습니다. (#12260, #12234의 일부)
omo 네이티브 eval 셀이 bunshin TypeScript SDK를 통해 이 사용자의 머신에 접근할 수 있습니다. 플러그인은 @sisyphuslabs/bunshin-ts와 @sisyphuslabs/bunshin-ts-relay(파일별로 고정된 벤더링 빌드 결과물이며, npm 의존성이 아님)를 runtime/bunshin-ts/sdk.js로 번들하고, 활성화 시 해당 디렉터리를 OMO_BUNSHIN_TS_SDK_ROOT로 공개하며, 설치 프로그램이 이를 요구합니다. pickTransport(BUNSHIN_TS_TRANSPORT = auto, relay, hub)는 연결됨을 보고하는 경우 로컬 장치 서비스를 사용하며, 이 빌드에는 hub 전송이 포함되지 않습니다. 릴레이를 통해서는 machine.describe가 느리거나, 오프라인이거나, 거부된 장치 하나 때문에 모든 머신에 대해 connect(), listMachines(), fanout()이 실패하지 않습니다. 해당 장치는 unsupported로 나열되고 attention에 이유와 대기 시간이 표시되며, fanout은 이를 건너뜁니다. 셀이 실행되는 장치도 나열됩니다(서비스가 자기 장치에서는 머신 작업을 실행하지 않으므로 unsupported). bunshin 스킬 안내와 제거된 도구 힌트가 이 임포트 방법을 알려줍니다. (#12258, #12251 수정)
629f2ad PR #12690 병합 (code-yeongyu/fix/11262-windows-keychain-tests 브랜치)
e655775 PR #12544 병합 (surlymochan/fix/12150-onboarding-context-install-path 브랜치)
3dae0cd PR #12736 병합 (cynkai/fix/12733-registrant-wait-diagnostics 브랜치)
80cb4ab test(device-service-core): 레코더 대기가 시간 초과될 때 확인된 등록자 이벤트를 명시 (참조 #12733)
208502f PR #12727 병합 (cynkai/fix/12693-redact-pem-time-bound 브랜치)
fb81108 PR #12653 병합 (code-yeongyu/feat/omodev-renewal-draft 브랜치)
b2fe6ed test(memory-core): 잘못된 형식의 PEM 스캔이 벽시계 시간 한도 대신 선형으로 확장되는지 검증 (#12693)
a21b4b0 PR #12726 병합 (cynkai/fix/12609-audit-skip-changes-md 브랜치)
45c66fa test(memory-core): 부하가 걸린 러너를 위해 잘못된 형식의 PEM 가리기 시간 한도에 여유를 부여 (#12693)
a4fd0b2 fix(audit): changes.md 로그를 에이전트 명령 문자열 검사에서 제외 (#12609)
51085f9 PR #12679 병합 (code-yeongyu/perf/remote-send-one-rtt 브랜치)
c5932ec PR #12680 병합 (code-yeongyu/chore/revendor-bunshin-ts-696 브랜치)
b1941d4 origin/dev 원격 추적 브랜치를 feat/omodev-renewal-draft에 병합
8b1baeb origin/dev 원격 추적 브랜치를 fix/11262-windows-keychain-tests에 병합
cacd346 PR #12697 병합 (code-yeongyu/fix/12694-memory-selection-test-win32-paths 브랜치)
9948ae3 origin/dev 원격 추적 브랜치를 gh-feed-regen-12544a에 병합
2b589cd PR #12545 병합 (surlymochan/fix/12145-exec-timeout-diagnostics-flake 브랜치)
7667172 origin/dev 원격 추적 브랜치를 gh-feed-regen-12545b에 병합
cd26f01 origin/dev 원격 추적 브랜치를 feat/omodev-renewal-draft에 병합
1dc315f PR #12672 병합 (code-yeongyu/feat/remote-thread-one-rtt 브랜치)
6e87f2f origin/dev 원격 추적 브랜치를 perf/remote-send-one-rtt에 병합
fa658d9 origin/dev 원격 추적 브랜치를 chore/revendor-bunshin-ts-696에 병합
d990289 feat/remote-thread-one-rtt에 dev 병합 (생성된 번들 재생성)
3fb0bbc test(memory): 세 개의 POSIX 상속 소켓 케이스를 POSIX에서만 실행 (#12694, win32 버전은 #12698)
분량 관계로 이후 내용은 번역에서 제외했습니다. 전체 내용은 위 원문 링크에서 확인하세요.