# 제공자 호환 안내

## Codex

- 위임 도구의 함수 이름은 `spawn_agent`이고, 호출 수신자 표기는 `functions.collaboration.spawn_agent`다. 검증자별로 분리된 읽기 전용 작업을 이 도구로 생성한다.
- 실제 입력 필드는 `task_name`, `message`, `model`, `fork_turns`, `reasoning_effort`다. 다른 이름의 위임 도구나 필드가 기억에 떠올라도 쓰지 않는다. 호출 기록에서 확인된 이름만 쓴다.
- `model`과 `reasoning_effort`는 선택 필드다. 검증자는 `gpt-5.6-luna`와 `high`를 함께 넘긴다.
- 전체 이력 fork는 부모의 모델과 추론 강도를 상속하고 오버라이드를 받지 않는다. 두 값을 지정하려면 `fork_turns`를 `"none"` 또는 양의 정수 문자열로 함께 줘야 한다.
- 이 도구의 반환값에는 실행 모델이 없다. 반환값만으로 Luna 실행을 확정하지 않는다.
- 모델 지정이 거부되거나 위임 기능이 없거나 실제 모델 식별이 불가능하면 직접 검증·다른 모델·Claude 검증으로 폴백하지 않는다. 재시도 한 번까지 허용하고, 그래도 확인되지 않으면 `Luna 검증 불가` 또는 `Luna 모델 미확인`으로 기록하고 중단한다.
- 수정과 직접 검증이 끝나면 서로 다른 관점의 Luna 검증자 2개 이상을 병렬로 생성한다. 큰 변경은 3~4개로 늘리고, 확정 문제를 수정한 뒤에는 전체 검증자 묶음을 다시 병렬 실행한다.
- 동시 실행 슬롯은 자신을 포함해 4개다. 이 경로에서 한 번에 띄울 검증자는 3개까지이며, 범위가 4개면 3개를 먼저 띄우고 남은 하나를 이어서 실행한다.
- 오류·시간 초과·상태 미확인·모델 미확인은 같은 범위의 Luna 검증자로 한 번만 재시도한다. 재시도도 실패하면 대체 없이 중단한다.

## Claude

- Claude provider에는 Luna를 직접 실행할 모델 선택지가 없다. Claude 계열 서브에이전트로 검증자를 만들지 않고, Codex CLI를 자식 프로세스로 실행해 교차 제공자로 위임한다.
- 위임 수단은 셸에서 실행하는 `codex exec`다. 검증자 하나가 명령 한 번이고, 병렬 검증은 같은 명령을 검증자 수만큼 동시에 띄워 얻는다.

  ```bash
  codex exec -m gpt-5.6-luna -c model_reasoning_effort="high" \
    -s read-only --skip-git-repo-check \
    -C <저장소 경로> -o <결과 파일> --json - < <요청문 파일>
  ```

- 파일을 수정하기 전에 같은 명령의 짧은 형태로 게이트를 확인한다.
- 종료 코드는 모델 호출이 400으로 실패해도 0이 나온다. 성공 판정은 항상 최상위 이벤트 유형으로 한다.

  ```bash
  grep -o '^{"type":"[a-z._]*"' <로그 파일> | sort -u
  ```

- `turn.completed`가 있고 `error`·`turn.failed`가 없어야 통과다. 로그 전체를 문자열로 검색하면 검증자가 읽은 문서 본문이 실패 신호로 오탐되므로 줄 시작 기준으로만 본다.
- `--ephemeral`은 세션 기록을 남기지 않아 실행 모델 확인을 막으므로 검증 실행에 쓰지 않는다.
- 출력의 `thread_id`를 기록해 두고 아래 `실행 모델 확인` 절차로 실제 모델을 확정한다.
- `-s read-only`가 검증자의 파일 수정을 호스트 차원에서 막는다. 이 옵션을 빼거나 승인 우회 옵션으로 바꾸지 않으며, 요청문에도 파일 수정 금지를 함께 명시한다.
- Codex CLI가 설치돼 있지 않거나 인증되지 않았거나 셸 실행이 허용되지 않으면 `Luna 검증 불가`로 기록하고 파일을 수정하지 않는다.

## 추론 강도

검증 깊이가 제공자에 따라 달라지지 않도록 검증자는 항상 `high`로 실행한다.

- 새 프로세스로 띄우면 추론 강도가 설정 기본값인 `low`로 잡히므로, 실행마다 `-c model_reasoning_effort="high"`를 함께 넘긴다.
- 위임 도구로 띄울 때는 `reasoning_effort`를 `"high"`로 넘기고, 오버라이드가 가능하도록 `fork_turns`를 함께 지정한다.
- 실제 적용값은 아래 `실행 모델 확인`의 같은 명령으로 확인한다. 추출된 값이 `high`가 아니면 해당 범위를 미완료로 기록한다.
- 셸로 띄운 검증자는 강도가 기록으로 확인된다. 위임 도구로 띄운 검증자의 기록에는 강도가 남지 않을 수 있으며, 확인하지 못하면 `미확인`으로 남기고 통과로 판정하지 않는다.

## 실행 모델 확인

호출 수단은 제공자별로 다르지만 확인 규칙은 하나다. 실제 실행 모델은 로컬 세션 기록에서만 확정한다.

- 검증자에게 모델 이름을 물어 받은 답은 근거가 아니다. 실제로 Luna로 띄운 검증자가 자신을 `GPT-5 (Codex)`로 답한다.
- 세션 기록은 `$CODEX_HOME/sessions/<연>/<월>/<일>/rollout-*.jsonl`에 남는다. 기본 위치는 사용자 홈의 `.codex`다.
- 근거가 되는 레코드는 `turn_context`와 `world_state`뿐이다. 파일 전체를 검색하면 첫 줄 `session_meta`의 부모 모델과 요청문에 들어간 모델 문자열까지 섞여 오판한다.

  ```bash
  grep -o '"type":"turn_context".*\|"type":"world_state".*' <rollout 파일> \
    | grep -o '"model":"[^"]*"\|"reasoning_effort":"[^"]*"' | sort -u
  ```

- 추출된 모델 값이 모두 `gpt-5.6-luna`여야 통과다. 다른 값이 하나라도 섞이면 미완료로 기록한다.
- Claude에서는 실행 출력의 `thread_id`가 그대로 파일 이름에 들어가므로 해당 파일을 바로 찾을 수 있고, 모델과 강도가 `turn_context`에 남는다.
- Codex에서는 서브에이전트가 별도 세션 파일로 기록된다. 부모의 `thread_id`로 자식 파일을 찾고, 모델은 `world_state`에서 확인한다.

  ```bash
  grep -l '"parent_thread_id":"<부모 thread_id>"' <세션 디렉터리>/*.jsonl
  ```

- 기록에서 `gpt-5.6-luna`를 확인하지 못하면 해당 범위를 `Luna 모델 미확인`으로 남기고 통과로 판정하지 않는다.

## 공통 제한

- 제공자가 무엇이든 검증자는 파일을 수정하지 않는다. 수정은 주 편집자 하나가 수행한다.
- 서로 다른 제공자의 결과가 충돌하면 양쪽 결과를 사실로 합치지 말고 원본 코드와 실행 결과로 재판정한다.
- 모델을 호출하지 못한 상태와 접근 불가한 실행 환경은 Luna 검증 불가로 기록하고 완료하지 않는다. 기준선 실패는 Luna 실행 결과와 별도 한계로 기록한다.
