OMO 5.0.0-beta.13 — 복구 가능한 그래프, 사이드 대화, 그리고 더 빠른 Senpi 2026.8.20-2
중심 개념: 실패한 DAG 실행은 더 이상 완전한 손실이 아니며, /btw는 메인 컨텍스트를 소모하지 않고 두 번째 대화를 제공하고, 번들로 제공되는 Senpi 2026.8.20-2 엔진은 대규모 성능 + Cursor 정확성 개선을 포함합니다.
🕸️ mass-ulw: 라이브 그래프 재시도, 조향, 수정
불안정한 도구 호출로 인해 하나의 노드를 잃은 그래프는 전체를 다시 실행해야 했고 모든 자식에 대해 다시 비용을 지불해야 했습니다. 이제 더 이상 그렇지 않습니다:
- **
dag retry**는 실패, 취소, 스킵 종속된 노드를 새로운 시도로 반환하면서 모든 완료된 노드는 캐시된 결과를 유지합니다. 프롬프트 수정 재시도(retry + prompt)는 정확히 하나의 노드에 대해 지원됩니다.
- **
dag send**는 메시지를 한 노드의 자식으로 실제 전달 의미론과 함께 라우팅합니다 — steer로 실행 중인 자식으로 들어가고, revive로 완료되었지만 상주하는 자식을 컨텍스트 그대로 복구하고, queued로 자식이 아직 받을 수 없을 때 내구성 있는 큐 위치에 배치합니다. 계속 불가능한 자식은 타입화된 거부를 받습니다(node_not_continuable, node_has_no_task; 알 수 없는 노드는 node_not_found를 받습니다).
- **
dag amend**는 같은 실행에 대해 편집된 정의를 수락하고, SHA-256-지문-diff로 모든 노드를 비교하고, 변경 + 추가된 노드와 그들의 전이적 종속 노드만 다시 실행합니다. load_skills는 의도적으로 지문 밖에 있어서 기술만 편집하면 아무것도 다시 실행되지 않습니다.
- 노드별 결과 아티팩트는 원자적으로 작성되므로(임시 파일 + fsync + 이름 변경), 재시도 중 충돌이 더 이상 읽기 권한이 있는 잘린 결과를 남길 수 없습니다.
- 세 가지 새로운 저널 이벤트 유형 —
dag.node.retried, dag.node.steered, dag.definition.amended — 모든 의도적 재실행과 수정을 저널에 명시적으로 기록합니다. 모두 엄격하게 추가 전용: schemaVersion은 1로 유지되며, docs/reference/mass-ulw-protocol.md에 문서화되어 명시적 무중단 보장이 있습니다.
- 상태 위젯은 재실행 노드에
x<attempt> 배지를 표시합니다; /dag는 amended x<n>을 표시하고 노드 오류 앞에 오류 코드를 접두사로 붙입니다. 잃어버린 수정 경쟁은 이제 실행이 저널 재생에서 멈추는 대신 깔끔한 run_still_active 거부입니다.
- JS SDK는
retry, send, amend 래퍼를 획득하고, mass-ulw 기술은 전체 거부 매트릭스를 문서화합니다.
💬 /btw — 메인 스레드를 오염시키지 않고 부수 질문하기
/btw <question>(별칭 /side)은 같은 모델과 에이전트로 임시 세션을 엽니다. Ctrl+/은 메인과 사이드 사이를 전환합니다; 빈 사이드 작성기에서 Ctrl+C를 누르면 닫힙니다. 사이드 스레드는 최근 메인 컨텍스트를 읽기 전용 배경(64개 메시지 / 64 KiB로 제한, 사이드 모델이 명시적으로 요청하지 않는 한 파일과 부에이전트에 손을 대지 않도록 하는 경계 뒤에 있음)으로 보고, 그 Q&A는 메인 기록에 들어가지 않습니다. 부모 삭제, 충돌 재입양, BTW-in-BTW 중첩, 취소 순서 지정은 모두 명시적으로 처리되어 사이드 세션이 누출되지 않습니다. 가이드: docs/guide/btw.md.
🔁 모델 폴백이 더 이상 조용해지지 않습니다 (#6579)
커뮤니티 수정 by @MoerAI (#6611):
반복 오류 정지는 근본에서 고정되었습니다: 재시도-중복 제거 키는 실패한 모델을 포함하지 않았으므로 다른 모델의 같은 오류는 중복처럼 보였고 버려졌습니다 — 세션이 조용해졌습니다. 이제:
- 중복 제거 키는 모델당 범위가 지정됩니다; 건너뛴 재시도는 키를 반환하는 대신 영원히 소모하지 않습니다.
- 내부 폴백 재시도는 명시적 마커를 포함하여 합성 트래픽으로 버려지는 것을 중지합니다.
- 모델 식별은 제공자/모델 플러스 변형으로 전체 폴백 경로를 통해 이동합니다 — 추론 노력 선택은 폴백과 복구를 생존합니다.
- 감시견 타이머는 생성 범위이므로 버려진 시도의 타이머는 나중의 차례를 하이재킹할 수 없습니다.
- 수동 모델 변경은 폴백 감시견, 비행 중 재시도 플래그, 재시도 키 세트를 재설정합니다.
🖼️ 트랜스크립트 전체의 단일 공지 언어
폴백 아키텍트 공지, 팁, 작업 완료 카드, 팀 멤버 라이브니스 경고, 모든 메모리 공지(성찰, 건강, 영혼 업데이트, 쓰기 영수증, 넛지)는 이제 하나의 공유 패딩된 공지 상자를 통해 렌더링됩니다. 완료 카드는 톤 글리프(●/✗/⚠/◐)와 작업 이름으로 시작하고, 두 번째 행에 id · target/model · duration · tokens · tools · tps를 흐리게 유지하고, 확장 뒤에 계속 힌트를 보관합니다.
🩺 /doctor 성찰 건강이 결정론적입니다
성찰 건강 심각도는 벽시계의 함수였습니다 — [warn]은 순수한 시간 경과로 [ok]로 감소했습니다. 검사는 이제 주입 가능한 시계를 읽으므로 판정은 성찰 데이터의 순수 함수입니다.
🧪 CI와 테스트가 더 이상 거짓을 말하지 않습니다
Senpi 어댑터는 이제 기계 시행 증거 경로 계약이 있는 첫 등급 필수 QA 표면입니다. 두 DAG wait 행(상주 한도 포화, 구독 설정 중 종료)은 경계 회귀 테스트로 고정됩니다. 메모리 테스트 정리는 EFAULT에만 좁게 재시도하고, 세 개의 Windows 느린 스위트는 대기가 이벤트 기반으로 유지되는 정직한 한계를 받았습니다.
🧰 Bun 1.4.0 stable, 모든 곳에서
Bun 1.4가 오늘 stable이 되었고, 이 릴리즈 트레인이 끝에서 끝까지 탈 것입니다:
- omo: 모든 CI, 게시, 플랫폼 빌드 워크플로우는 Bun 1.3.14에서 1.4.0로 이동했습니다(캐시 키 포함), 커밋된 omo-senpi 확장 번들은 stable 1.4.0 아래에서 재생성되었으므로 CI 신선도 게이트와 설치된 확장이 바이트 단위로 일치합니다.
- senpi 2026.8.20-2 (2026.8.20 위의 같은 날 재릴리즈): 컴파일된
senpi 바이너리는 이제 Bun 1.4.0 stable로 구축됩니다(1.3.14였음), npm 게시는 Bun 카나리 채널에서 stable 1.4로 졸업했습니다.
- 안전 종속성 새로 고침이 함께 탑승합니다 — omo: posthog-node 5.49, puppeteer-core 25.8, @clack/prompts 1.7, MCP SDK 1.30, js-yaml 4.3.1, picomatch 4.0.5, bun-types 1.4.0; senpi: Biome 2.5.9, @types/node 26.2.0, vitest + coverage 4.1.11, AWS Bedrock/Smithy 패치, protobuf 2.14.0. 의도적으로 제외됨: 주요 버전, Anthropic SDK들(OAuth 민감성), @google/genai, @mistralai.
⚙️ 번들 Senpi 2026.8.20-2 — 엔진 웨이브
모든 곳에서 더 빠름
/resume이 더 이상 큰 세션에서 정지하지 않습니다: 정확한 바이트 경계 스트리밍 요약이 변경되지 않은 파일에 대해 재사용되고, 보이는 트랜스크립트 끝이 먼저 그려지며 이전 메시지는 점진적으로 데우어집니다.
- 시작이 680개 모듈을 버립니다: 1.2 MB Claude Agent SDK 번들과 jsdom/Readability/turndown HTML 스택이 부팅 시가 아닌 처음 사용할 때 로드합니다(14,203 → 13,523개 모듈).
- 실행당 하나의 프로세스가 더 가볍습니다:
cli.ts는 Inspector 옵션 또는 사용자 정의 exec 인수가 정말로 자식이 필요하지 않는 한 에이전트를 인프로세스로 실행합니다(측정 -75 ms, -help에서 -6.2%).
- 온디스크 컴파일 캐시: Node의
enableCompileCache()가 CLI 항목과 자식에 게시된 모두에 켜져 있으므로 두 번째 시작이 엔진 그래프 다시 컴파일을 건너뜁니다.
- 핫 리로드가 중요 경로에서 벗어납니다: 재귀 구성 감시자는 macOS에서도 워커 스레드에서 실행되고, 감시자 정리는 리로드 경로를 떠나(1.5–62초의 종료 정지 제거), MCP 재연결은 더 이상 리로드를 차단하지 않습니다.
- 감시 범위 고정됨: 재귀 감시 대상은 이제 범위 내 디렉토리당 하나의 비재귀 구독을 엽니다 —
node_modules를 포함하는 확장 디렉토리는 더 이상 fseventsd를 123% CPU 및 다중 GB RSS로 구동하지 않습니다.
- 재시도 스피너 조절은 1,000개 이상의 지속 항목이 있는 세션에서 조절합니다; 카운트다운은 유지됩니다.
TUI가 더 이상 정지하지 않습니다
- 목표 바닥글 틱커는 오래된 확장 컨텍스트에서 자신을 은퇴합니다 — "목표 추구" 레이블과 계속 카운트다운은 더 이상 리로드 후 세션을 정지하지 않습니다.
- TUI 모드 전환이 라이브 컴포넌트를 폐기하는 대신 분리합니다; 스피너와 위젯 간격은 전환을 생존합니다.
- 거부된 또는 실패한
/reload는 더 이상 라이브 확장 바닥글과 작업 위젯을 파괴하지 않습니다.
- 마지막 도구 호출 후에 도착하는 어시스턴트 텍스트는 도구 카드 아래에 렌더링되므로 승인 질문이 보이는 상태로 유지됩니다.
claude-sdk-oauth: $1,084 재시도 폭풍 수정 (#723)
스트림 시작 타임아웃 재시도는 이제 전체 대화를 다시 보내는 대신 마지막 어시스턴트 경계에서 SDK 대화를 포크합니다 — 각 재시도는 접두사 캐시 읽기에서 자신의 차례만 다시 청구합니다. 이전: 캐시 쓰기는 ~8K/시도, $25/6분, 워커 디스패치에서 $1,084/3일로 증가했습니다.
- 0-토큰
resource_exhausted는 오버플로우로 취급됩니다: 첫 실패에 표면 → 회전 전에 압축; 회전은 에이전트 디렉토리 아래에 지속되고 TUI 재시작을 생존합니다; 3-회전 상한에서의 회전 건너뛰기는 세션을 중독시키는 대신 새 와이어 id를 리민트합니다.
- 다른 제공자로 폴백하는 대신 리민트/압축 후 같은 모델 재시도; 너무 작은 오버플로우 압축은 마지막 사용자 차례로 떨어집니다; 그럴듯하지 않은 청구
cacheRead(라이브 윈도우의 3×/8×)는 더 이상 쓸모없는 압축을 강제할 수 없습니다.
- 미드턴 압축은 네이티브 Run이 라이브인 동안 거부하므로
conversationId는 비행 중에 중독될 수 없습니다.
- 대기 중인 toolCall로 끝나는 차례는
toolUse로 계속됩니다; 완료된 도구 후에 유휴인 차례는 유휴 타임아웃까지 행(hang)하는 대신 정상으로 끝납니다.
- ANTML invoke 복구는
cursor-agent에서 건너뛰어지므로 Claude 명명 Cursor 모델이 병렬 도구 시작을 거부하는 것을 중지합니다.
- 네이티브
todo 호출은 서버가 로컬 op 없이 해결할 때에도 지속됩니다; 늦은 tool_execution_end 이벤트는 결과를 고아로 남기는 대신 카드를 그립니다; 스트리밍된 작업 인수는 빈 {}완료를 생존합니다.
- 명시적 생각 수준은 네이티브 및 CLI 레인 모두에서 카탈로그 접미사 변형 id로 해결됩니다(
claude-fable-5-thinking-low) — 더 이상 Connect error not_found 없습니다.
- Exec-브리지 소유권은 밀폐됨: 핸들러는 소유 실행의 중단 신호에 바인딩하고, 캡처된 실행 없이 폐쇄되고, 승인 프롬프트 후 소유권을 다시 확인하고,
tool_execution_end 오류를 내보내므로 아무것도 미달(dangle)되지 않습니다.
- 세션 제목은 세션 모델의 자체 요약 인증을 사용합니다 — 명시적 압축 모델 아래에서 더 이상
unauthenticated 제목 호출 없습니다.
장기 실행 세션이 더 이상 돈을 소모하지 않습니다
- 목표 계속은 추가 전용입니다: 요청별 기록 재작성이 제공자의 캐시 접두사를 무효화했으므로 긴 팀 모드 세션은 모든 차례마다 전체 캐시되지 않은 읽기를 지불했고 429 폭풍으로 자신을 몰았습니다.
- 같은 모델 429 재시도는 지수 일정으로 모든 대기를 바닥합니다 — 같은 작은
retry-after 힌트로 답변하는 제공자는 더 이상 케이던스를 밀리초 단위로 핀할 수 없습니다.
공유 에이전트 디렉토리 설정에서 구성 리로드가 작동합니다 (@Indosaram 감사, #1006)
다른 세션에서의 루틴 선호도 저장(defaultModel 같은)은 더 이상 리로드를 캐스케이드하지 않습니다; 핸드오프 스냅샷은 requestReload()가 정착 후 무조건 지워지므로 오래된 평문 설정 스냅샷은 생존할 수 없습니다.
확장 저자용
공지 상자 기본 요소는 이제 공개 API입니다: buildNoticeBox, noticeMessageRenderer, noticeEntryRenderer, 그리고 NoticeSpec/NoticeLine/NoticeTone 타입 — 공유 시각 가족에서 트랜스크립트 공지를 렌더링하는 대신 다시 구현하지 않습니다.
전체 엔진 변경 로그: senpi v2026.8.20 (+ v2026.8.20-2, 같은 날 Bun 1.4 재릴리즈)
- 5d2742b Merge pull request #7075 from code-yeongyu/fix/omo-ci-bun-1314-until-windows-tail
- b4d52a8 fix(test): build the absent-store fixture absent instead of deleting it back out
- 3d91936 fix(test): give the Windows setup fixtures a real absent store and a real home
- 3809286 fix(test): let win32 teardown leak an OS-owned temp root instead of failing
- 8cff720 fix(test): widen the Windows EBUSY teardown budget with escalating backoff
- f92deb8 fix(test): make the Windows suites correct under bun 1.4
- 3a6fa0f test(omo-opencode): pin ResolveMessage identity instead of its prototype for bun 1.4
- 8d6a66f Merge pull request #7074 from code-yeongyu/fix/btw-parent-remote-revalidation
- 8aee394 test(qa): check in BTW revalidation evidence
- fc2c5aa fix(opencode): require remote BTW parent confirmation
- aff84c7 fix(qa): keep resolver imports side-effect free
- d92429e Merge pull request #7071 from code-yeongyu/feat/dag-node-resume-steer
- 37c5d6e Merge pull request #7068 from code-yeongyu/test/dag-happy-timeout-contract
- 5a6f21d docs(omo): state the additive compatibility stance for dag node-control events
- 1bbc2aa docs(omo): mass-ulw protocol additions for per-node retry/steer/amend
- 26b2506 Merge pull request #7067 from code-yeongyu/fix/tui-notice-block-style
- 56df6d7 Merge pull request #7066 from code-yeongyu/fix/dag-wait-residency-regression
- 8134492 Merge pull request #6611 from MoerAI/fix/6579-runtime-fallback-dedup
- 3932c9c fix(runtime-fallback): mark reused internal retry parts
- b401eb4 fix(runtime-fallback): clear first skipped retry key
- 51573a1 fix(runtime-fallback): scope retry marker to fallback generation
- 2305720 fix(runtime-fallback): recover skipped retry status keys
- d5c5918 test(qa): verify PR 6611 after dev rebase
- 2ad216f test(qa): record pre-push fork head
- 4868449 test(qa): record PR 6611 fallback evidence
- fc1c631 fix(opencode): route only marked fallback retries
- b7ee41a fix(runtime-fallback): preserve explicit retry effort
- 62491bd fix(runtime-fallback): restore effective primary variants
- 3aba9d1 fix(runtime-fallback): index registered category models
- 891937e fix(runtime-fallback): bind timeouts to state generations
- f603b5b fix(runtime-fallback): own queued retry generations
- 0b097b7 fix(runtime-fallback): reject stale timeout generations
- f4517c4 fix(runtime-fallback): acknowledge synthetic retries
- 0616cd6 fix(runtime-fallback): align created fallback identity
- 8bcfcc6 fix(runtime-fallback): retain queued fallback state
- 88d7cb4 test(lsp): isolate Windows compatibility checks
- 671f69b fix(runtime-fallback): honor explicit retry variants
- 895b9d4 fix(runtime-fallback): align retry reasoning state
- 06eab0f fix(runtime-fallback): isolate retry generations
- 3e24b39 fix(runtime-fallback): preserve effective retry state
- c09d258 test(runtime-fallback): wire generation acknowledgment
- c42be3e fix(runtime-fallback): align fallback generations
- 9af2747 fix(runtime-fallback): scope model-less retry dedupe
- 8c465e4 fix(runtime-fallback): preserve variant lifecycle state
- a5f5fee fix(runtime-fallback): persist effective fallback variant
- 8310d91 fix(runtime-fallback): preserve fallback variants
- f015363 fix(runtime-fallback): read variant from chat output
- 5f7b005 test(runtime-fallback): prove source-current OpenCode QA
- bee9021 test(runtime-fallback): record variant reset QA
- e6fa807 fix(runtime-fallback): reset retry keys on variant change
- b586cef fix(runtime-fallback): reset retry keys on manual model change
- 26a2a8f fix(runtime-fallback): retain active retry keys
- 5e3a12e fix(runtime-fallback): distinguish retry variants
- 11798f8 fix(runtime-fallback): dedupe model-less retry statuses
- 6174009 fix(runtime-fallback): prevent repeated-error stalls (fixes #6579)
- e676fef Merge pull request #7062 from code-yeongyu/refactor/doctor-health-clock-thread
- b8b7b09 Merge pull request #7060 from code-yeongyu/test/memory-teardown-efault-retry
- 9dc8116 Merge pull request #7058 from code-yeongyu/feat/btw-codex-side-ui
- 6eb7e8c fix(opencode): revalidate BTW parents
- 198a196 docs(opencode): update BTW hook inventory
- 1280716 fix(opencode): preserve BTW cancellation semantics
- 28284f2 fix(opencode): reject deleted pending BTW
- e4ce3f6 docs(opencode): index BTW feature module
- bc2f496 fix(opencode): preserve BTW route ownership
- 1be1102 fix(opencode): own every BTW cleanup
- 786d195 fix(opencode): await pending BTW creation
- b174d98 fix(opencode): await BTW cleanup on dispose
- cdc1061 fix(opencode): close final BTW boundary gaps
- ed86828 fix(opencode): propagate BTW classification failures
- 369be36 fix(opencode): retry BTW session classification
- f3a3c0b fix(opencode): restrict unverified BTW sessions
- 399ddb8 fix(opencode): retry persisted BTW adoption
- e015f8e fix(opencode): validate persisted BTW parents
- 8b423d9 fix(opencode): enforce BTW execution bounds
- 113b493 fix(opencode): bound BTW prompt inheritance
- 6809736 fix(opencode): block orphaned BTW nesting
- baf7d92 fix(opencode): reject deleted BTW parents
- b3f4f0b fix(opencode): re-adopt persisted BTW sessions
- 3cbeeeb fix(opencode): cancel BTW on parent deletion
- a3981b9 fix(opencode): discard stale BTW adoption
- 4586d13 fix(opencode): cancel pending BTW navigation
- 960947c fix(opencode): harden BTW deletion lifecycles
- 559b3e2 fix(opencode): address BTW review feedback
- b5eb048 feat(opencode): align BTW side conversation with Codex
- ec3d5af Merge pull request #7057 from code-yeongyu/fix/beta12-lockfile-sync
- 23db3d9 fix(deps): sync bun.lock with the v5.0.0-beta.12 version bump
- 65f8540 Merge pull request #7056 from code-yeongyu/fix/windows-team-idle-wake-budget
1명의 커뮤니티 기여자에게 감사합니다:
- @MoerAI:
- feat(opencode): align BTW side conversation with Codex
- fix(opencode): address BTW review feedback
- fix(opencode): harden BTW deletion lifecycles
- fix(opencode): cancel pending BTW navigation
- fix(opencode): discard stale BTW adoption
- fix(opencode): cancel BTW on parent deletion
- fix(opencode): re-adopt persisted BTW sessions
- fix(opencode): reject deleted BTW parents
- fix(opencode): block orphaned BTW nesting
- fix(opencode): bound BTW prompt inheritance
- fix(opencode): enforce BTW execution bounds
- fix(opencode): validate persisted BTW parents
- fix(opencode): retry persisted BTW adoption
- fix(opencode): restrict unverified BTW sessions
- fix(opencode): retry BTW session classification
- fix(opencode): propagate BTW classification failures
- fix(opencode): close final BTW boundary gaps
- fix(opencode): await BTW cleanup on dispose
- fix(opencode): await pending BTW creation
- fix(opencode): own every BTW cleanup
- fix(opencode): preserve BTW route ownership
- docs(opencode): index BTW feature module
- fix(opencode): reject deleted pending BTW
- fix(opencode): preserve BTW cancellation semantics
- docs(opencode): update BTW hook inventory
- fix(opencode): revalidate BTW parents
- Merge pull request #7058 from code-yeongyu/feat/btw-codex-side-ui
- fix(runtime-fallback): prevent repeated-error stalls (fixes #6579)
- fix(runtime-fallback): dedupe model-less retry statuses
- fix(runtime-fallback): distinguish retry variants
- fix(runtime-fallback): retain active retry keys
- fix(runtime-fallback): reset retry keys on manual model change
- fix(runtime-fallback): reset retry keys on variant change
- test(runtime-fallback): record variant reset QA
- test(runtime-fallback): prove source-current OpenCode QA
- fix(runtime-fallback): read variant from chat output
- fix(runtime-fallback): preserve fallback variants
- fix(runtime-fallback): persist effective fallback variant
- fix(runtime-fallback): preserve variant lifecycle state
- fix(runtime-fallback): scope model-less retry dedupe
- fix(runtime-fallback): align fallback generations
- test(runtime-fallback): wire generation acknowledgment
- fix(runtime-fallback): preserve effective retry state
- fix(runtime-fallback): isolate retry generations
- fix(runtime-fallback): align retry reasoning state
- fix(runtime-fallback): honor explicit retry variants
- test(lsp): isolate Windows compatibility checks
- fix(runtime-fallback): retain queued fallback state
분량 관계로 이후 내용은 번역에서 제외했습니다. 전체 내용은 위 원문 링크에서 확인하세요.