---
status: completed
task_id: task-2076+1
type: implementation
scope: scripts/codex_gate_check.py
---

# 맥락 노트: task-2076+1

## 근본 원인 분석

### 원인 1: config.toml 모델 deprecated (이미 수정 완료)
- `~/.codex/config.toml`에 `model = "gpt-5.2-codex"` → 지원 중단
- 아누가 `model = "gpt-5.4"`로 직접 수정 완료

### 원인 2: stdin "-" 전달 버그 (이번 작업 대상)
- codex-companion.mjs의 `readTaskPrompt()` 함수에서:
  - `positionalPrompt = positionals.join(" ")` 먼저 실행
  - `-`가 positional로 들어가면 `positionalPrompt = "-"` → truthy
  - `readStdinIfPiped()`가 호출되지 않음 → stdin 프롬프트 무시
  - Codex가 "-"를 프롬프트로 받아 "I'm ready. Send the task..."로 응답

## 3 Step Why

### 1st Why: "왜 --prompt-file 방식이 필요한가?"
A: subprocess.run의 positional argument로 prompt를 직접 전달하면 OS ARG_MAX 한도(~2MB)에 걸릴 수 있다. 코드 리뷰 프롬프트는 여러 파일 내용을 포함하여 매우 길어질 수 있으므로 파일 기반 전달이 안전하다.

### 2nd Why: "왜 A(파일 기반)가 최선의 접근인가?"
B: codex-companion.mjs가 `--prompt-file` 옵션을 네이티브로 지원하므로 추가 구현 없이 사용 가능. stdin pipe 방식(readStdinIfPiped)은 subprocess.run의 input= 파라미터로 전달 시 isTTY 판정 등의 edge case가 있어 불안정할 수 있다.

### 3rd Why: "왜 B가 다른 대안보다 나은가?"
C: 대안 1(positional 직접 전달)은 ARG_MAX 한도 위험. 대안 2(stdin pipe 수정)는 codex-companion.mjs 내부의 readStdinIfPiped가 positional 우선순위를 가지므로 `-` 제거만으로는 해결 가능하지만, subprocess.run의 input=으로 전달 시 isTTY=false인지 보장하기 어렵다. --prompt-file은 이 모든 문제를 우회한다.

## _ensure_env_keys_loaded() 제거 근거
- ChatGPT 계정(로그인 기반)을 사용하므로 OPENAI_API_KEY 환경변수가 필요없음
- `codex` CLI는 브라우저 로그인 세션을 통해 인증
- API 키 관련 로직이 실제로는 동작하지 않는 dead code
