---
read_when:
    - Codex 세션 검색, 계속 진행 또는 보관 동작 설계
    - 네이티브 세션 카탈로그 UI 또는 Gateway RPC 변경하기
    - 페어링된 Node 전반으로 Codex 감독 확장하기
summary: OpenClaw에서 네이티브 Codex 세션을 감독하기 위한 아키텍처 및 제품 경계.
title: Codex 감독
x-i18n:
    generated_at: "2026-07-12T15:45:28Z"
    model: gpt-5.6
    postprocess_version: locale-links-v1
    prompt_version: 15
    provider: openai
    source_hash: 78528afd31c18fc84e0adb6479a688da7df6d0a5c04e539d253c84d3a17a5f53
    source_path: specs/codex-supervision.md
    workflow: 16
---

# Codex 감독

## 목표

Codex 감독을 통해 OpenClaw 운영자는 네이티브 Codex 세션을 검색하고,
안전한 경우 일반 OpenClaw Chat 화면을 통해 로컬 브랜치를 생성할 수 있습니다.
Codex App Server는 계속해서 스레드와 모델 루프를 소유합니다. OpenClaw는
플릿 카탈로그, 인증된 운영자 UI, 세션 바인딩 및 채널 전달을 제공합니다.

이 기능은 공식 `codex` Plugin에 속합니다. 별도의
감독자 Plugin이나 두 번째 Codex 프로토콜 구현은 없습니다.

## 제품 경계

Codex Plugin이 활성화되어 있으면 카탈로그가 등록됩니다. 에이전트용
감독 도구를 활성화하려면 다음을 설정하십시오.

```text
plugins.entries.codex.config.supervision.enabled = true
```

현재 초기 제품의 범위는 장기적인 플릿 계획보다 의도적으로 작습니다.

- 보관되지 않은 Codex 스레드만 나열합니다.
- 로컬 행과 참여하도록 설정된 페어링 Node 행을 안정적인 호스트 ID별로 그룹화합니다.
- 저장되었거나 유휴 상태인 Gateway 로컬 스레드에서 모델이 고정된 일반 Chat 브랜치를 생성하고, 첫 번째 턴에 전체 Codex 하네스 스레드를 시작하거나, 이전 브랜치용으로 생성된 Chat을 엽니다.
- 다른 실행자가 없다는 명시적인 확인을 받은 후에만 저장되었거나 유휴 상태인 Gateway 로컬 스레드를 보관합니다.
- 기존의 감독 대상 Chat은 계속 열 수 있도록 하면서, 활성 로컬 소스에는 새 브랜치 또는 보관 컨트롤을 표시하지 않습니다.
- 기본 사이드바에는 호스트별 최신 행을 표시하고, 세션 페이지에는 전체 카탈로그를 유지하며, 로컬 및 페어링 Node 행에 대해 제한된 크기의 커서 페이지네이션 방식 트랜스크립트 읽기를 제공합니다.
- 카탈로그 장애를 호스트별로 격리합니다.

카탈로그는 보관되지 않은 항목의 모음입니다. 카탈로그 내의 행은 여전히
유휴, 활성, `notLoaded` 또는 오류 턴 상태일 수 있습니다.

에이전트용 감독 기능은 계속 옵트인 방식입니다. 안내형 온보딩은 네이티브 Codex 설치 감지에 성공하고 선택한 추론 백엔드가 실시간 검사를 통과하면, 사용자가 어떤 기본 백엔드를 선택했는지와 관계없이 이를 설치하고 활성화하려고 시도합니다. 감독 기능은 이러한 기회적 Plugin 설정이 성공한 경우에만 활성화됩니다. 명시적으로 비활성화된 Plugin, 정책 차단 또는
`supervision.enabled: false`는 감독 도구에 대해 계속 우선 적용되지만,
운영자 세션 카탈로그를 비활성화하지는 않습니다.

## 소유권

`codex` Plugin은 모든 Codex App Server 동작을 소유합니다.

- 엔드포인트 검색 및 연결 수명 주기
- 프로토콜 초기화 및 버전 검사
- 스레드 목록 조회, 읽기, 재개, 보관 및 이벤트 처리
- 승인 및 사용자 입력 브리지
- 네이티브 스레드와 OpenClaw 세션 간 바인딩
- 연속 실행 이후 Codex 전용 모델 및 하네스 강제 적용

Control UI와 Gateway는 Plugin이 소유한 이 서비스를 사용합니다. Codex 롤아웃 파일을
직접 읽지 않으며 별도의 App Server 클라이언트를 구현하지 않습니다.

기본 로컬 토폴로지는 다음과 같습니다.

```text
Codex Desktop -> 비공개 stdio App Server -> 사용자 Codex 홈
                                             ^
OpenClaw Codex Plugin -> 감독 App Server 연결
  (기본값은 관리형 사용자 홈 stdio이며, 명시적인 appServer 설정을 따름)
  -> 수동 소스 카탈로그 및 읽기
  -> 스냅샷 고정 -> 정규 appServer 소스 브랜치
  -> 표시 가능한 기록 삽입 및 이후의 모든 감독 대상 Chat 턴

일반 OpenClaw Codex 세션 -> 기본적으로 관리형 에이전트 홈 stdio
  -> 일반 전체 하네스 스레드 -> OpenClaw Chat 및 채널 전달
```

감독 기능을 활성화해도 일반 Codex 하네스는 변경되지 않으며, 기본적으로
에이전트 범위로 유지됩니다. 별도의 감독 연결은 기본적으로 관리형 사용자 홈
stdio를 사용하므로 해당 카탈로그 및 스냅샷 작업에서 네이티브 저장 스레드를
확인할 수 있습니다. 명시적인 `appServer` 연결 설정을 따릅니다.
`homeScope`가 설정되지 않은 경우 감독 연결은 stdio 또는 Unix에 대해 이를
`"user"`로, WebSocket에 대해 `"agent"`로 해석합니다. 일반 하네스도
네이티브 Codex 홈을 공유해야 하는 경우에만 `appServer.homeScope: "user"`를
명시적으로 설정하십시오. Codex 사이드바 그룹에서 채택된 Chat은 예외입니다.
이 Chat의 비공개 감독 바인딩은 소스 읽기, 정규 브랜치 생성 및 이후 턴이
감독 연결에서 계속 이루어지도록 합니다. 실시간 상태와 소유권은 계속
프로세스 로컬로 유지됩니다. Codex Desktop이 스레드를 활발하게 실행 중이더라도
OpenClaw의 감독 프로세스에 알려지지 않은 스레드는 `notLoaded`입니다.

Codex에는 별도의 설치 프로그램 관리형 부트스트랩 계약을 사용하는 실험적
정규 로컬 데몬이 있습니다. 이 기능은 해당 데몬을 암묵적으로 부트스트랩하거나,
소유권을 주장하거나, 존재한다고 가정해서는 안 됩니다.

## 카탈로그 흐름

일반 Gateway 메서드 `sessions.catalog.list`는 항상 `archived: false`와
대화형 `cli` 및 `vscode` 소스 종류를 요청하는 `codex`
카탈로그 제공자에 디스패치합니다. 다음을 결합합니다.

1. 감독 App Server의 Gateway 로컬 `thread/list` 결과입니다.
   기본적으로 관리되는 사용자 홈 stdio를 사용합니다.
2. 연결되어 있고 사용에 동의한 각 Node의 `codex.appServer.threads.list.v1` 결과입니다.

트랜스크립트 선택은 로컬에서 `itemsView: "full"`을 사용하는 `thread/turns/list`를
사용하거나, 선택한 Node에서 버전이 지정된
`codex.appServer.thread.turns.list.v1` 명령을 사용합니다. 모든 응답에는 최대 20개의
영구 저장된 턴과 불투명한 정방향/역방향 커서가 포함됩니다. Control UI는 최신순으로
페이지를 요청하고, 각 페이지를 시간순으로 렌더링하며, 이전 페이지를 앞에 추가합니다.
제한이 없는 `thread/read`로 대체하지 않습니다. 또한 OpenClaw는 직렬화된 항목 페이지가
Node 또는 Gateway 전송 계층을 통과하기 전에 20 MiB를 초과하면 거부합니다.

네이티브 macOS 페어링 Node 구현은 설정되지 않은 값/기본값 또는 명시적인
`appServer.transport: "stdio"`만 지원하며, 감독 범위는 설정되지 않은 값/기본값이거나
명시적인 `appServer.homeScope: "user"`여야 합니다. 구성된 `command`, `args` 및
정규화된 `clearEnv`를 자식 프로세스로 전달합니다. `"unix"`, `"websocket"` 또는
명시적인 `homeScope: "agent"`를 사용하면 카탈로그 기능과 명령을 모두 알리지 않으며,
직접 호출도 실패 시 차단됩니다. 에이전트 범위 구성에서 사용자 Codex 홈을 노출하거나
명시적인 엔드포인트 대신 로컬 stdio를 사용해서는 안 됩니다.

카탈로그 프로젝션은 식별자, 제목, cwd, 상태, 활성 대기 플래그, 타임스탬프, 소스,
모델 제공자, Codex 버전 및 Git 브랜치를 정규화합니다. 트랜스크립트 미리 보기, 턴,
롤아웃 경로, Codex 홈 경로, Git 원격 저장소, 커밋 SHA, 원시 엔드포인트 또는 원시
App Server 오류는 반환하지 않습니다. 트랜스크립트 응답에는 명시적으로 요청된
App Server 항목 페이지와 해당 불투명 커서만 포함됩니다.

호스트 장애는 각 호스트 결과에만 국한됩니다. 오프라인 Node 또는 사용할 수 없는
로컬 App Server 때문에 정상 호스트가 페이지에서 제거되지는 않습니다. 연결 상태는
스레드 상태가 아니라 호스트 속성입니다. 실패한 호스트 결과에는 최신 세션 행이
포함되지 않으며 네이티브 스레드에 `offline`을 프로젝션하지 않습니다.

카탈로그 검색은 수동적입니다. 메타데이터를 나열하거나 읽을 때
`thread/resume`을 호출하거나, OpenClaw 클라이언트를 실시간 스레드 요청에
구독시키거나, 승인을 응답해서는 안 됩니다.

검색은 제목만을 대상으로 하며 대소문자를 구분하지 않습니다. 반환되는 각 카탈로그
페이지에 대해 Gateway와 페어링된 Mac은 쿼리를 App Server에 전달하지 않고 제한된
수의 네이티브 페이지를 스캔합니다. 네이티브 검색은 트랜스크립트 미리 보기와도
일치할 수 있기 때문입니다. 반환된 네이티브 커서를 사용하여 호출자가 스캔을
계속할 수 있습니다.

## 운영자 CLI 경계

Plugin은 Gateway를 기반으로 하는 셸 명령 세 개를 등록합니다:

```text
openclaw codex sessions [--search <text>] [--host <id>] [--limit <count>] [--cursor <cursor>] [--json] [gateway-options]
openclaw codex continue <thread-id> [--json] [gateway-options]
openclaw codex archive <thread-id> --confirm-no-other-runner [--json] [gateway-options]
```

`[gateway-options]`는 `--url <url>`, `--token <token>`, `--timeout <ms>` 및
상속된 `--expect-final` 스위치입니다. 세션 목록의 기본값은 75,000 ms이고,
계속 및 보관의 기본값은 30,000 ms입니다.
이러한 단항 RPC에서 `--expect-final`은 추가적인 효과가 없습니다. 세션 검색은
제목만을 대상으로 하며 대소문자를 구분하지 않습니다. 각 응답은 제한된 기본 페이지
체인을 스캔하며, `--cursor`는 더 오래된 결과부터 계속합니다. 제한은 호스트당 기본값이 50이고
1부터 100까지 허용되며, 커서를 사용하려면 하나의 고정된 `--host`
대상이 필요합니다. 어떤 명령도
보관됨/보관됨 포함 옵션을 허용하지 않습니다. `sessions`만 페어링된 호스트를 대상으로 지정할 수 있으며,
`continue`와 `archive`는 항상 `hostId: "gateway:local"`을 전송하고, 보관에는
명시적인 확인 플래그가 필요합니다.

셸 네임스페이스는 채팅 내 `/codex` 런타임 네임스페이스가 아닙니다. 특히
`/codex sessions --host <node>`는 한 Node의 Codex CLI 세션 파일을 나열하고,
`/codex threads`는 현재 대화 연결의 App Server 스레드를 나열하며,
`/codex resume` 또는 `/codex bind`는 해당 대화의
바인딩을 변경합니다. 이러한 명령은 `sessions.catalog.continue`를 대체하지 않으며,
`/codex continue` 또는 `/codex archive` 런타임 명령은
없습니다.

## 로컬 계속

저장되었거나 유휴 상태인 Gateway 로컬 행에 대해 UI는
`sessions.catalog.continue`를 `catalogId: "codex"` 및 호스트와 스레드
ID와 함께 호출합니다. Plugin은 다음을 수행합니다.

1. 소스에 기존 감독 대상 Chat이 이미 있으면 이를 재사용합니다.
2. 그렇지 않으면 소스의 마지막으로 터미널 상태가 영구 저장된 턴(완료, 중단 또는 실패)까지의 제한된 사용자 및 어시스턴트 기록을 새 OpenClaw Chat에 투영하고 대기 중인 하네스 브랜치를 기록합니다.
3. 구체적인 모델 또는 제공자 선택이 아니라 대기 중인 Codex 전용 모델 잠금 정책과 비공개 감독 연결 범위를 저장하고 OpenClaw `sessionKey`를 반환합니다.

기록 투영은 표시 가능한 사용자 및 어시스턴트 메시지 중 가장 최신 부분을 선택하며, 최대 메시지 수는 200개, UTF-8 텍스트의 총크기는 512 KiB, 메시지당 크기는 64 KiB로 엄격히 제한됩니다. 이미지 및 로컬 이미지 입력은 `[Image attachment]`로 대체하고 이미지 페이로드나 경로는 절대 복사하지 않으며 추론, 도구 호출 및 도구 결과는 생략합니다.

UI는 해당 세션 키를 사용하여 일반 Chat으로 이동합니다. 아직 정식 하네스 스레드는 존재하지 않습니다. 첫 번째 일반 Chat 턴에서 하네스는 실제 Codex 승인, 정보 요청, 이벤트 및 전달 핸들러를 설치한 후 다음을 수행합니다:

1. 감독 연결을 사용하여 모델 또는 공급자 재정의 없이 네이티브 `thread/fork`를 호출하고 영구 저장된 소스 스냅샷을 고정합니다. Codex의 현재 `ConfigManager` 상태가 모델과 공급자를 선택하며, 포크 응답은 실제 쌍을 보고합니다. 모델이 소스에 마지막으로 기록된 모델과 다르면 Codex는 일반적인 모델 차이 경고를 표시합니다.
2. 동일한 연결에서 `threadSource: "appServer"`, OpenClaw의 cwd, 정책, 구성, 환경, 전체 OpenClaw 하네스 도구 표면, 그리고 이 최초 시작을 위해 포크가 반환한 모델과 공급자를 정확히 사용하여 정식 전체 Codex 하네스 스레드를 시작합니다.
3. 해당 연결을 통해 범위가 제한된 사용자 및 어시스턴트의 표시 가능한 기록을 주입하고, 감독 범위를 유지한 채 정식 바인딩을 커밋하며, 턴을 실행하고, 임시 포크를 보관합니다.

첫 번째 턴 전에는 Chat이 표시 가능한 기록 미러를 포함한 잠긴 대기 브랜치입니다. 이후에는 모든 모델 턴이 감독 연결의 정식 Codex 하네스 스레드를 통해 실행됩니다. 이 브랜치는 완전한 네이티브 롤아웃 복제본이 아닙니다. 소스 추론, 도구 호출 및 도구 결과는 의도적으로 생략됩니다. 스냅샷 고정 또는 정식 스레드 생성에 실패하면 대기 브랜치는 재시도 가능한 상태로 유지됩니다. 바인딩 경합, 비활성화된 감독, 또는 사용할 수 없거나 일치하지 않는 감독 연결이 발생하면 일반적인 에이전트 홈 하네스로 대체하지 않고 턴 실행 전에 실패하도록 닫힙니다.

이는 소스의 과거 모델 보존이 아니라 Codex 소유의 선택을 보장합니다. 포크가 반환한 쌍은 정식 스레드 시작에 사용되며, Codex는 해당 스레드의 네이티브 모델과 공급자를 영구 저장합니다. 이후 재개에서는 OpenClaw 모델 및 공급자 재정의를 생략하므로 Codex가 영구 저장된 쌍을 복원합니다. 별도의 네이티브 Codex 제어가 정식 스레드를 변경하면 OpenClaw는 네이티브로 영구 저장된 해당 선택을 수락합니다. 외부 OpenClaw 모델 및 폴백 체인은 이를 절대 대체하지 않습니다.

감독되는 모델 잠금 채팅에서는 모델 변경, 세션 삭제, 세션 재설정/새로 만들기 작업이 안전하게 차단됩니다. 바인딩을 교체하거나 지우기 때문에 `/codex model <model>`, `/codex
bind`, `/codex resume`(Node `--bind here` 포함), `/codex detach` 또는
`/codex unbind` 변경 작업도 안전하게 차단됩니다. `/codex model` 조회와 `/codex fast`, `/codex permissions`, `/codex
threads`는 계속 사용할 수 있습니다. `codex_threads` 에이전트 도구는 새 포크를 연결하거나 바인딩된 네이티브 스레드를 보관할 수 없습니다. 목록 및 메타데이터 전용 읽기는 계속 사용할 수 있습니다. 트랜스크립트 필드에는 `supervision.allowRawTranscripts`가 필요하며, 이름 변경, 보관 해제, 분리된 포크 및 관련 없는 스레드의 보관에는 `supervision.allowWriteControls`가 필요합니다. 어느 옵션도 잠긴 바인딩을 교체할 수 없습니다.
그렇지 않고 OpenClaw 항목을 삭제하거나 재설정하면 네이티브 바인딩이 폐기되고 Codex처럼 보이는 세션 뒤에 일반 스레드가 생성되거나 허용될 수 있습니다.
따라서 보존 유지 관리는 모델 잠금 항목이 일반적인 기간, 개수 또는 디스크 예산 한도를 초과하더라도 이를 보존합니다. 소유 Plugin을 비활성화하거나 제거해도 잠금 및 Plugin 소유권 마커는 유지됩니다. 동일한 Plugin을 다시 활성화할 때까지 채팅을 사용할 수 없으며 안전하게 차단됩니다. 정리 작업은 이를 일반 모델 세션으로 변환하지 않습니다.

이 작업은 소스를 재개하거나 변경하지 않습니다. 임시 포크는 스냅샷을 고정하며, 지속적인 후속 작업 스레드가 아닙니다. 첫 번째 턴에 별도의 정식 하네스 스레드를 시작하면 프로세스 로컬 상태가 Desktop 소유 턴을 확인하지 못했다는 이유만으로 OpenClaw가 소스와 경쟁하는 작성자가 되는 것을 방지할 수 있습니다. 표시 기록 미러와 고정된 스냅샷에는 활성 소스에서 아직 완료되지 않은 작업이 누락될 수 있습니다. 원래 CLI 또는 VS Code 소스는 네이티브 카탈로그와 OpenClaw 카탈로그 모두에 계속 포함될 수 있습니다. 정식 브랜치는 감독 저장소에서 네이티브 Codex 스레드로 유지되지만, 네이티브 클라이언트가 해당 `appServer` 소스 종류를 필터링할 수 있으므로 Codex Desktop 표시 여부는 계약 사항이 아닙니다.

## 보관 동작

저장되었거나 유휴 상태인 Gateway 로컬 행에서 `catalogId: "codex"`를 사용하는 `sessions.catalog.archive`에는 명시적인 `confirmNoOtherRunner: true`가 필요합니다. 이 작업은 현재 프로세스 로컬 상태를 새로 읽고, 상태가 `idle` 또는 `notLoaded`인 경우에만 진행하며, 네이티브 `thread/archive`를 호출하고 Codex가 작업을 수락한 후에만 성공을 반환합니다. 그러면 해당 행은 보관되지 않은 카탈로그에서 제외됩니다.

새로 읽은 상태가 활성 또는 오류이면 보관이 거부됩니다. 소스에서 감독되는 브랜치가 초기화 중이거나 대기 중인 경우에도 거부됩니다. 소스를 보관하려면 먼저 첫 번째 채팅 턴에서 정식 브랜치를 구체화해야 합니다. 정확한 대상에 대해 알려진 활성 OpenClaw 바인딩 소유자가 있거나 보관되지 않은 생성된 하위 항목이 있어도 보관이 거부됩니다. OpenClaw는 Codex의 실험적 `thread/list ancestorThreadId` 관계에 페이지네이션을 적용하며, 요청 또는 응답 오류, 커서 또는 스레드 순환, 안전 한도 소진 시 안전하게 차단합니다. 네이티브 보관은 로드된 상위 및 하위 작업을 종료할 수 있으므로 보관은 중단을 위한 우회 수단이 아닙니다. 읽기, 하위 항목 열거 및 보관 호출은 원자적이지 않습니다.
독립 클라이언트가 로컬에서 유휴 또는 `notLoaded`로 보이는 행을 계속 소유하거나 해당 행에서 작업을 시작할 수 있습니다. 다른 실행기가 없다는 확인은 Codex에 조건부 보관 또는 프로세스 간 임대가 제공될 때까지 알려지지 않은 클라이언트와 해당 경합을 포괄합니다.
페어링된 Node의 보관은 금지됩니다.

Codex 카탈로그에는 보관된 항목 보기가 없습니다. 소유자가 승인한 다른 Codex 화면에서 `thread/unarchive`로 복원한 스레드는 보관되지 않은 카탈로그에 다시 포함될 수 있습니다.

## 활성 스레드 안전성

Codex는 하나의 앱 서버에 연결된 클라이언트 간에 스레드 변경 작업을 직렬화하지만, 독점적인 프로세스 간 실행기 또는 승인 소유자 임대를 제공하지 않습니다.
독립적인 stdio 앱 서버는 동일한 롤아웃에 추가할 수 있지만, 각 서버는 자체 메모리 내 상태만 확인합니다. 승인 요청도 한 서버의 모든 구독자에게 전달될 수 있으며, 첫 번째 유효 응답으로 요청이 완료됩니다.

따라서 다음이 적용됩니다.

- 수동 카탈로그 클라이언트는 승인을 구독하거나 자동 거부하지 않습니다
- 현재 활성 상태로 보고된 행에서는 새 브랜치와 보관을 모두 제공하지 않습니다
- 매핑되지 않은 소스는 표시 기록 브랜치가 되며, 해당 정식 하네스 스레드는 소스를 절대 재개하지 않습니다
- `notLoaded`는 활동 알 수 없음으로 표시되며, 다른 실행기가 없다는 사실을 숙지하고 확인한 후에만 보관할 수 있습니다
- 로컬 보관에는 해당 확인과 새로 읽은 `idle` 또는 `notLoaded` 상태가 필요하며, 읽기와 보관 사이의 프로토콜 경합을 인정해야 합니다

중단 및 다중 클라이언트 인계는 향후 제품 결정 사항입니다. 활성 행을 표시한다고 해서 이러한 기능이 암시되지는 않습니다.

## 페어링된 Node 경계

현재 Node 호출은 요청/응답만 지원합니다. 제한된 카탈로그 메타데이터 및 트랜스크립트 턴 페이지를 안전하게 반환할 수 있지만, Codex 하네스 실행에 필요한 장기 이벤트 스트림, 승인 요청, 도구 호출, 취소 및 어시스턴트 델타는 전달할 수 없습니다.

따라서 Node 계약은 목록 및 트랜스크립트 턴 페이지를 지원합니다. 원격 행은 계속 읽을 수 있지만 유휴 상태와 관계없이 **계속** 및 **보관**을 사용할 수 없습니다. 실제 원격 후속 작업에는 로컬 하네스와 동일한 승인 및 바인딩 불변 조건을 보존하는 Node 측 실행기와 스트리밍 브리지가 필요합니다.

## 권한

각 컴퓨터에서 로컬로 사용을 선택해야 합니다. Gateway를 활성화해도 다른 Node가 해당 컴퓨터의 Codex 메타데이터를 읽을 권한을 부여하지 않습니다. Node 기능은 일반적인 페어링 및 명령 정책 승인을 통과해야 합니다.

플릿 목록 및 트랜스크립트 보기에는 페어링된 Node를 호출하므로 `operator.write` Gateway 범위를 사용합니다. 로컬 후속 작업 및 보관은 인증된 운영자 작업이며 호스트 및 상태 검사의 적용을 계속 받습니다.

자율 에이전트 및 독립형 MCP 액세스는 별개입니다. 제공되는 `codex_endpoint_probe`, `codex_sessions_list`, `codex_session_read`,
`codex_session_send`, `codex_session_interrupt` 도구 계약은 계속 `codex` Plugin이 소유합니다. 감독을 활성화하면 원시 `codex_threads` 트랜스크립트 읽기 및 트랜스크립트에서 파생된 목록 필드에도 `supervision.allowRawTranscripts`가 필요합니다. 모든 `codex_threads` 포크, 이름 변경, 보관 또는 보관 해제에는 `supervision.allowWriteControls`가 필요합니다. 두 정책은 모두 기본적으로 비활성화됩니다.

## 호환성

`openclaw doctor --fix`는 엔드포인트 및 트랜스크립트/쓰기 정책과 Plugin 허용/거부 참조를 포함하여 배포된 `plugins.entries.codex-supervisor` 구성을 `plugins.entries.codex.config.supervision`으로 마이그레이션합니다. 충돌 시 명시적인 정식 대상 값이 우선합니다. 런타임 코드는 마이그레이션 후 정식 `codex` Plugin 형태만 사용합니다.

공식 Plugin은 정확히 다섯 개의 Supervisor 호환성 도구를 유지합니다.
`codex_endpoint_probe`, `codex_sessions_list`, `codex_session_read`,
`codex_session_send`, `codex_session_interrupt`입니다. 세션 목록은 기본적으로 로드된 항목만 포함하며 `loaded_only` 매개변수는 없습니다. `include_stored: true`를 사용하면 보관되지 않은 상태 데이터베이스 행이 추가되며, 엔드포인트별로 `max_stored_sessions`(기본값 200, 허용 범위 1~1,000)의 제한을 받습니다. 로드된 행은 이 설정의 제한을 받지 않습니다. 트랜스크립트에서 파생된 필드 및 읽기는 계속 `allowRawTranscripts`의 제어를 받으며, 보내기 및 중단은 계속 `allowWriteControls`의 제어를 받습니다.

호환성 보내기는 유휴 스레드를 시작하거나 재개하지 않습니다. `mode: "start"`는 항상 거부되며, `"auto"`와 `"steer"`는 읽을 수 있는 활성 턴만 조정합니다.
중단도 읽을 수 있는 활성 턴이 필요합니다. 유휴 후속 작업은 네이티브 Codex 카탈로그로 라우팅되어 전체 하네스가 승인, 도구 및 바인딩을 소유하도록 합니다.
독립형 레거시 MCP 어댑터는 공식 Plugin에서 동일한 도구를 확인하며, 유지된 레거시 정책 환경 변수를 준수하는 유일한 경로입니다.

7월 카탈로그 UI, Gateway 메서드, Node 기능 및 CLI 등록은 이전 Plugin ID로 배포되지 않았습니다. 이러한 항목은 두 번째 런타임 퍼사드 없이 `codex` 소유권으로 직접 이동합니다.

## 향후 작업

- 원격 후속 작업을 위한 Node 측 스트리밍 실행기 및 이벤트 브리지
- 동시 클라이언트 인계를 위한 명시적인 실행기 및 승인 소유자 임대
- 실행기 소유권 임대 또는 이에 상응하는 펜싱이 제공된 후 원격 보관
- 중단 및 더 풍부한 활성 세션 관찰
- Codex Desktop, CLI 및 OpenClaw 간의 감사 가능한 인계

보관된 항목 탐색은 계획된 감독 사이드바의 일부가 아닙니다. 보관된 스레드의 복구 경로는 계속 네이티브 Codex 화면입니다.

## 인수 테스트

- 감독을 활성화하면 보관되지 않은 로컬 세션이 나열됩니다.
- 보관된 세션은 카탈로그 응답이나 UI에 절대 표시되지 않습니다.
- 다른 호스트에 장애가 발생해도 정상 호스트는 계속 표시됩니다. 사용할 수 없는 호스트는 오프라인 세션 상태를 임의로 만들지 않고 새 행을 반환하지 않습니다.
- 저장되었거나 유휴 상태인 로컬 행은 Codex 전용 모델/런타임 잠금이 적용된 채팅 미러를 생성합니다. 첫 번째 턴은 임시 스냅샷을 고정하고 정식 전체 하네스 스레드를 시작하며, 계속을 다시 실행하면 기존 채팅이 열립니다.
- Codex가 현재 모델이 소스에 마지막으로 기록된 모델과 다르다고 경고하더라도, 첫 번째 턴은 스냅샷 포크에서 모델/제공자 재정의를 생략하고 정식 시작을 Codex가 반환한 정확한 쌍에 고정합니다.
- 대기 중이거나 커밋된 감독 바인딩은 소스 액세스, 정식 브랜치 생성 및 이후 모든 턴에 감독 연결을 사용합니다. 일반 Codex 세션은 계속 에이전트 범위에 속합니다.
- 이후 재개는 OpenClaw 모델/제공자 재정의를 생략하고, Codex의 정식 영구 선택을 보존하며, 해당 스레드에 대한 별도의 네이티브 변경을 수락하고, 외부 OpenClaw 모델 또는 폴백 체인으로 절대 대체하지 않습니다.
- 감독을 비활성화하거나 바인딩/연결 수명 주기를 잃으면 채팅을 일반 에이전트 홈 하네스로 이동하는 대신 안전하게 차단합니다.
- 감독되는 모델 잠금 채팅은 네이티브 바인딩을 보호하는 동안 삭제할 수 없습니다.
- 채팅은 사용자 및 어시스턴트 메시지를 최대 200개, 총 512 KiB, 메시지당 64 KiB까지 미러링합니다. 이미지는 자리표시자가 되며, 소스 추론, 도구 호출, 도구 결과, 이미지 페이로드 및 로컬 경로는 복제되지 않습니다.
- 브랜치 흐름은 소스 스레드를 절대 재개하지 않습니다.
- 원래 소스는 두 카탈로그 모두에 계속 포함될 수 있습니다. 정식 네이티브 브랜치는 `appServer` 소스 종류를 사용하며 Codex Desktop에 표시된다고 보장되지 않습니다.
- 활성 로컬 소스는 브랜치를 생성하거나 보관할 수 없습니다. 기존 감독 채팅은 계속 열 수 있습니다.
- 활동 알 수 없음 행은 확인 없이 브랜치할 수 있지만, 보관하려면 다른 실행기가 없다는 명시적인 확인이 필요합니다.
- 감독되는 브랜치가 초기화 중이거나 대기 중인 소스는 첫 번째 채팅 턴에서 정식 브랜치를 구체화할 때까지 보관할 수 없습니다.
- 정확한 대상에 대해 알려진 활성 바인딩 소유자가 있거나 보관되지 않은 생성된 하위 항목이 있으면 보관이 차단됩니다. 하위 항목 열거 실패 시 안전하게 차단되며, 알려지지 않은 클라이언트와 상태 확인부터 보관까지의 경합은 계속 명시적 확인의 책임입니다.
- 확인된 저장 상태 또는 유휴 상태의 로컬 보관은 네이티브 작업이 성공한 후 행을 제거합니다.
- 페어링된 Node 행은 계속 또는 보관 없이 계속 표시됩니다.
- 수동 목록 조회는 스레드 승인을 구독하거나 응답하지 않습니다.
- 레거시 Supervisor 구성은 정식 Codex 구성 형태로 마이그레이션됩니다.
- 레거시 목록은 기본적으로 로드된 항목만 포함하고, 저장된 항목 열거는 엔드포인트별 한도를 준수하며, 호환성 보내기는 유휴 스레드를 시작하거나 재개하지 않습니다.
