ulw-research는 소스를 가져오지 않고 사용자의 브라우저에서 직접 읽습니다. Phase 0 브리프는 이제 하나의 규칙으로 Collection: search-only | browser를 결정합니다(검색 결과 스니펫만으로 모든 축이 해결될 때만 search-only). 웹 워커는 모든 후보를 browser 스킬에 연결된 엔진을 통해 읽습니다. 워커마다 이름 있는 세션 하나, 소스마다 탭 하나를 사용하고, 비교할 때는 여러 탭을 나란히 열며, 상위 소스마다 전체 페이지 스크린샷을 남깁니다. webfetch는 원시 파일에만 사용하고, 브라우저로 열 수 없는 호스트는 출처 정보와 함께 ultimate-browsing으로 넘깁니다. 팀 멤버는 load_skills를 사용할 수 없으므로 팀 멤버에게 전달하는 브리프에는 읽기에 쓸 browser 스킬을 명시합니다. ultimate-browsing은 더 이상 리서치 브라우징 경로로 소개되지 않으며, browser 스킬도 일반 페이지 읽기를 다른 곳으로 보내지 않습니다. (#9958, #9959)
첫 실제 프롬프트가 세션 열기가 아니라 온보딩을 시작합니다. 첫 실행 컨텍스트는 이제 실제로 보낸 첫 프롬프트에 함께 전달되며, 별도의 모델 턴은 없습니다. 에이전트는 먼저 요청에 답한 뒤 투어를 제안합니다. 백그라운드, 미리보기, 헤드리스 세션은 더 이상 온보딩을 소모하지 않고, TUI는 무언가를 묻기 전까지 정적인 환영 화면을 보여 줍니다. 첫 턴이 실패하거나 중단되면 온보딩이 다시 시도할 수 있도록 풀립니다. --onboard는 여전히 TUI에서 즉시 투어를 시작하며, RPC에서는 첫 실제 프롬프트에 적용됩니다. (#9905, #9907)
커스텀 카테고리 모델은 백그라운드 작업이 시작되거나 재개될 때 자체 추론 설정을 유지합니다. 모델 오버라이드나 models 체인이 있는 카테고리는 더 이상 내장 카테고리의 variant를 상속하지 않습니다. 추론 설정은 디스패치 전에 실제로 선택된 모델을 기준으로 결정되며, reasoning이 reasoningEffort와 레거시 variant보다 우선합니다. 재개된 작업은 해당 모델의 생성 설정을 그대로 유지합니다. 내장 카테고리는 기존 기본값을 그대로 유지합니다. 감사합니다, @MoerAI, @willowite, @pointfish6660. (#8510, #9013)
OmO 계정을 위한 기반 작업: omo login, omo whoami, omo logout이 아직 출시되지 않은 계정 서비스보다 먼저 제공됩니다. 서비스가 출시되기 전까지 omo login은 먼저 서비스를 확인하고, 브라우저를 열거나 대기하는 대신 서비스 주소를 명시한 한 줄짜리 오류를 출력하며 즉시 중단합니다. omo whoami는 로그인되어 있지 않다고 알려 줍니다. 서비스가 출시되면 로그인은 브라우저 흐름 또는 헤드리스 디바이스 코드 흐름(--device 또는 --no-browser)을 사용합니다. 자격 증명과 디바이스 키는 운영체제의 자격 증명 저장소(macOS는 Keychain, Linux는 Secret Service, Windows는 Credential Manager)에만 보관하며 평문 대체 저장은 하지 않습니다. 연결 실패와 브라우저 실행 실패가 발생해도 로그인 상태를 유지합니다. (#9829, #9811, #9831, #9833)
부모 종료 중에 멈춘 자식이 더 이상 잠깐 자신의 실패로 보고되지 않습니다. 예기치 않은 종료는 이제 2초 확인 기간 동안 보류됩니다. 소유 매니저가 살아 있으면 실제 실패로 보고하고, 소유자가 먼저 종료하면 복구 과정에서 중단된 작업을 재실행하지 않고 lost로 기록합니다. 또한 복구는 다른 살아 있는 소유자에게 넘겨 두었던 자식도, 그 소유자가 종료된 뒤 다시 확인하므로 해당 기록이 방치되지 않습니다. (#9715, #9884)
task 호출 한 번으로 16개를 넘는 자식 작업을 제출할 수 있습니다. 호출당 배치 상한이 검증과 실행 양쪽에서 모두 제거되었습니다. 동시에 실행되는 자식 수는 여전히 전역, 프로바이더, 모델별 동시성 제한이 결정하며, 나머지는 대기열에 들어갔다가 슬롯이 비면 시작됩니다. 동기 배치 결과는 여전히 입력 순서대로 반환됩니다. (#9854, #9859)
unspecified-low는 OpenAI 경로에서 medium 추론으로 GPT-6.1 Sol을 사용합니다. 기본 체인은 OpenAI API와 ChatGPT Subscription에 대해 기존 GPT 대체 모델 앞에 gpt-6.1-sol을 추가합니다. GPT-5.6 Terra는 medium 추론의 GPT-5.6 Sol로 대체되며, GitHub Copilot, OpenCode, 그리고 6.1 Sol이 없는 카탈로그를 위해 지원되는 대체 모델을 유지합니다. 다른 카테고리는 기본값을 그대로 유지합니다. (#9844, #9845)
Windows에서 훅 명령과 플러그인 업데이트가 더 이상 추가 콘솔 창을 열지 않습니다. Claude 호환 훅과 헬퍼 프로브가 자식 콘솔을 숨기므로, GUI로 실행한 세션은 훅마다 터미널이 깜빡이거나 포커스를 빼앗는 창이 뜨지 않습니다. 공통 Bun 스폰 경로도 같은 설정을 적용하며, OmO의 Codex 플러그인은 백그라운드 업데이트, 버전 확인, 수동 업데이트 명령에서 콘솔을 숨깁니다. (#7144, #9837, #9840, #9841, #9838, #9839)
OpenCode 세션 도구가 현재 서버 디렉터리에만 머물지 않고 프로젝트 전체에서 세션을 찾을 수 있습니다. 세션 목록 조회와 세션 간 검색은 사용 가능한 경우 페이지네이션되는 전역 세션 엔드포인트를 사용하고, 프로젝트 및 날짜 필터는 그대로 유지합니다. 엔드포인트가 없으면 기존 세션 목록으로 대체합니다. 검색이 스캔하는 세션 수 상한은 그대로 유지됩니다. 감사합니다, @MoerAI. (#5810, #9023)
Computer use가 메뉴 경로로 macOS 메뉴 막대 명령을 조회하고 선택할 수 있습니다. win.menu.items(path?)는 제목, 경로, 활성/체크 상태, 하위 메뉴, 단축키를 나열하고, win.menu.select(path)는 모호하지 않고 활성화된 최하위 명령 하나를 실행합니다. 선택할 때는 디스패치 직전에 대상 창과 명령을 다시 확인하고, 이후 키보드 컨텍스트를 복원합니다. 모호한 레이블, 비활성화된 항목, 하위 메뉴만 있는 대상은 거부되며, macOS에서 창이 여러 개인 앱은 잘못된 창을 조작할 위험이 있으므로 거부됩니다. API는 크로스 플랫폼이지만, 이번 릴리즈의 네이티브 지원은 macOS에만 있습니다. (#9875, #9881, #9886)
macOS 팝업에 값을 설정할 때 무시된 쓰기를 성공으로 보고하지 않고 실제로 옵션을 선택합니다. el.setValue(text)는 팝업 메뉴를 열고, 정확히 일치하는 옵션을 선택한 뒤 결과를 확인합니다. 옵션이 없거나, 모호하거나, 비활성화된 경우에는 사용 가능한 선택지와 함께 거부됩니다. 호출이 연 메뉴는 선택에 성공하든 실패하든 다시 닫히고, 이미 열려 있던 메뉴는 그대로 둡니다. 풀다운 팝업은 아직 지원되지 않습니다. (#9852)
Computer use가 macOS 날짜 및 시간 컨트롤에 ISO-8601 값을 쓸 수 있습니다. el.setValue(text)는 이제 네이티브 날짜를 쓰고 다시 읽어 검증합니다. 날짜만 있는 값은 현재 시각을 유지하고, 로컬 날짜-시간은 시스템 시간대를 사용하며, Z 또는 숫자 오프셋이 있는 값은 정확한 시점으로 해석합니다. 잘못된 입력과 일광 절약 시간제로 건너뛰거나 반복되는 로컬 시각은 조용히 옮기지 않고 거부합니다. (#9853)
Computer use 타임아웃 메시지가 데스크톱 엔진이 응답을 멈춘 지점을 보여 줍니다. 시작 프로브가 실패하면 핸드셰이크 단계를 명시합니다. 아직 아무 응답도 없음, engine.hello는 응답했지만 capabilities가 대기 중임, capabilities는 응답했지만 engine.hello가 대기 중임. 모든 타임아웃이 같아 보이지 않으므로 멈춘 엔진을 더 쉽게 진단할 수 있습니다. 감사합니다, @MoerAI. (#9720, #9742, #9916)
포그라운드 computer use에는 이제 사용자의 명시적인 승인이 필요합니다. 모델이 포그라운드에서 타이핑하거나 클릭하거나 창을 올리기 전에, 컴퓨터 코드는 desktop.control.acquire({ reason })를 호출하고, OmO는 그 이유와 함께 사용자에게 확인을 요청합니다. 명시적인 '예'만 제어 권한을 부여합니다. 거부하거나, 45초 프롬프트 시간이 초과되도록 두거나, 헤드리스 실행 또는 읽기 전용 실행이면 권한은 부여되지 않습니다. 권한은 모델이 해제하거나, 실행이 끝나거나 실패하거나, 중지 단축키를 누르거나, 세션이 닫히면 종료되며, 재개해도 복원되지 않습니다. 한 세션의 권한을 다른 세션이 가져갈 수 없습니다. 백그라운드 전달은 변경되지 않았으며 여전히 기본값입니다. (#9899, #9908)
스레드 바인딩이 WhatsApp을 네이티브 플랫폼으로 받아들입니다. thread_bind와 세션 게이트웨이 저장소가 이제 whatsapp을 받아들이므로 커넥터의 첫 메시지가 거부되지 않으며, 저장소가 업그레이드되는 동안 기존 바인딩도 유지됩니다. 이는 WhatsApp 커넥터에 필요한 핵심 바인딩 지원이며, 커넥터 자체를 설치하거나 연결하지는 않습니다. (#9871)
워크플로 노드 ID를 결과 저장 전에 검사합니다. 빈 ID, .과 .., 경로 구분자, 콜론, NUL 바이트는 결과 경로를 만드는 데 쓰이기 전에 invalid_node_id로 거부되며, 결과 저장소도 안전하지 않은 경로를 거부합니다. 이 문자가 포함된 노드 ID를 가진 기존 실행은 업그레이드 후 저장된 결과를 이어서 사용할 수 없습니다. 노드 이름을 바꾼 뒤 실행을 다시 시작하세요. 감사합니다, @DeryFerd. (#9869)
Mass-ulw가 인접한 전체 연결(all-to-all) 웨이브들을 하나의 리뷰 노드로 연결합니다. 계획 가이드는 모든 생산자에서 소비자로 가는 엣지를 그리는 대신, 두 완전한 웨이브 사이에 검증 노드 하나를 둡니다. 발견 사항은 지목된 생산자만 다시 실행하며, 한 브랜치만 필요한 소비자는 그 브랜치의 리뷰만 기다립니다. (#9866)
omo.dev 다운로드 통계가 매시간 갱신되도록 설정되었습니다. 다운로드 워커는 롤업을 매시 17분에 실행하도록 예약되므로, 분석 자격 증명으로 워커가 실행되면 공개 통계가 정기적으로 갱신됩니다. 로컬 설치에는 변화가 없습니다. (#9827)
omo는 senpi 2026.10.11에서 실행되며, 작업 샤드는 소유 세션이 종료된 직후 멈춥니다. 작업 샤드는 이제 senpi의 호출자 수명 소유권으로 시작되므로, 소유 세션이 끝난 뒤에도 여러 GB 규모의 p-* 샤드 호스트가 전체 유휴 시간 동안 메모리에 남지 않습니다. 피어와 실행 중인 턴은 여전히 호스트를 살려 둡니다. 엔진은 중지된 호스트를 해제하기 전에 호스트 자식 프로세스가 실제로 종료될 때까지 기다리며, 필수 컴팩션이 안전하지 않은 최신 메시지에서 멈추지 않습니다. 긴 세션은 매 턴 프롬프트 캐시를 다시 쓰지 않습니다. 컨텍스트 축소는 큰 단계 사이에서 안정적인 프리픽스를 유지하며 재시작 후에도 유지됩니다. Responses 호환 게이트웨이 뒤의 OpenAI 모델은 더 이상 모든 턴에서 Invalid value: 'allowed_tools'로 실패하지 않습니다. 푸터에 여유가 있으면 추론 모델의 수준을 변경하는 키(기본값 shift+tab) 옆에 effort <level>로 표시됩니다. 세션을 다시 불러와도 이전 확장 러너가 메모리에 남지 않으며, 첫 실행에서 만드는 런타임 스냅샷에서는 의존성 개발 트리와 중복 TypeScript 소스가 제외됩니다. 전체 엔진 변경 사항은 senpi 2026.10.10-12와 senpi 2026.10.11을 참고하세요. (code-yeongyu/senpi#3044, code-yeongyu/senpi#3054, code-yeongyu/senpi#3060, code-yeongyu/senpi#900, code-yeongyu/senpi#3080, code-yeongyu/senpi#3090, code-yeongyu/senpi#3066, code-yeongyu/senpi#3083, #9876, #9976)
일시 중단된 자식 작업이 더 이상 작업 목록에 남지 않으며, 각 작업은 스스로 재개되거나 종료됩니다. 실행할 수 없어서 일시 중단되었던 자식은 실행 가능해지는 즉시 다시 살아나거나, 제한된 복구 기간 안에 최종 결과 하나와 함께 종료되므로 suspended 상태로 작업 목록에 머물지 않습니다. 그동안 보낸 메시지는 대기열에 쌓였다가 재개될 때 순서대로 전달됩니다. 재개할 수 없으면 부모는 하나의 결과로 전달되지 못한 메시지 수를 알게 되며, 이후 task_output은 원래 상태 대신 error를 표시합니다. (#9861, #9868)
분량 관계로 이후 내용은 번역에서 제외했습니다. 전체 내용은 위 원문 링크에서 확인하세요.