# task-2076+1 완료 보고서: Codex 게이트 stdin 전달 버그 수정

## SCQA

**S**: codex_gate_check.py가 codex-companion.mjs를 호출하여 G1 설계 게이트 검증을 수행하지만, 실제로는 항상 마아트 폴백으로 전환되어 AI 리뷰가 이루어지지 않고 있었다.

**C**: 근본 원인은 subprocess 호출 시 `"-"` positional argument가 stdin 읽기가 아닌 프롬프트 텍스트 자체로 인식되어, Codex가 "I'm ready. Send the task..."로 응답하고 rawOutput에 JSON이 없어 폴백되는 것이었다. 또한 `_ensure_env_keys_loaded()` 등 OPENAI_API_KEY 관련 코드가 ChatGPT 계정 인증 환경에서 불필요한 dead code로 존재했다.

**Q**: codex-companion.mjs에 프롬프트를 올바르게 전달하여 `source: codex_companion`으로 실제 AI 리뷰를 받을 수 있는가?

**A**: `--prompt-file` 임시 파일 방식으로 전환하여 해결. 실제 실행 시 `source: codex_companion`으로 4개 리뷰 리스크(high 1, medium 2, low 1)를 포함한 AI 리뷰 결과를 정상 수신 확인. 39개 테스트 전체 PASS(0.14s).

## 수정 파일 목록

| 파일 | 변경 내용 | grep 검증 | 상태 |
|------|-----------|-----------|------|
| scripts/codex_gate_check.py:147-185 | `_run_codex_companion()` — `"-"` → `--prompt-file` 임시 파일 방식 전환 | grep "prompt-file" OK (2건) | verified |
| scripts/codex_gate_check.py:21-53 (삭제) | `_ensure_env_keys_loaded()` 함수 + 호출 + `_ENV_KEYS_PATH` 상수 제거 | grep "_ensure_env_keys_loaded" 0건 OK | verified |
| scripts/codex_gate_check.py:309-312 (삭제) | OPENAI_API_KEY 사전 검사 4줄 제거 | grep "OPENAI_API_KEY" 0건 OK | verified |
| scripts/codex_gate_check.py:14 | `import tempfile` 추가 | grep "import tempfile" OK | verified |
| scripts/tests/test_codex_gate_check.py:524-546 | `TestCallersContext` — stdin input 캡처 → `--prompt-file` 파일 내용 캡처 방식 | grep "captured_prompt_files" OK | verified |
| scripts/tests/test_codex_gate_check.py:731-746 | `TestApiKeyValidation` — 즉시 폴백 → companion 시도 후 폴백 테스트로 변경 | grep "still_attempts_companion" OK | verified |

## 테스트 결과
- pytest: 39/39 PASS (0.14s)
- pyright: tempfile import 관련 일시적 경고 1건 (실제 사용 중, 무시 가능)

## L1 스모크테스트 결과
- 서버 재시작: 해당없음 (스크립트 실행 작업)
- API 응답 확인: 실제 `python3 scripts/codex_gate_check.py --task-id task-2076+1 --task-file memory/tasks/task-2076+1.md --affected-files scripts/codex_gate_check.py` 실행
  - `source: "codex_companion"` — 마아트 폴백이 아닌 실제 AI 리뷰 확인
  - `pass: true`, `risks: 4개`, `fallback_reason: null`
- 스크린샷: 해당없음

## 발��� 이슈 및 해결

1. **codex-companion.mjs의 readTaskPrompt() 우선순위**: `positionals.join(" ")`가 먼저 평가되므로 `-`가 positional로 들어가면 `readStdinIfPiped()`가 호출되지 않음. `--prompt-file` 옵션으로 우회하여 해결.

2. **Pyright tempfile 미사용 경고**: 상단 import 후 L155에서 사용 중이나 Pyright가 일시적으로 미사용 감지. 실제로는 사용 중이므로 문제 없음.

3. **AST 스크립트 타임아웃**: 실제 실행 시 `ast_dependency_map.py`가 30s 타임아웃 발생. 이는 기존 이슈이며 본 작업 범위 외 (codex companion 호출 자체는 정상 동작).

## 모델 사용 기록
- 쿠쿨칸(백엔드): sonnet — codex_gate_check.py 코드 수정
- 카마소츠(테스터): sonnet — 테스트 수정
- 이쉬첼(프론트엔드): 미사용 (프론트 작업 없음)
- 아쿠인(UX/UI): 미사용 (UI 작업 없음)

## 3 Step Why 결과
- 1st Why: subprocess positional arg가 OS ARG_MAX 한도에 걸릴 수 있어 파일 기반 전달 필요
- 2nd Why: codex-companion.mjs가 `--prompt-file` 네이티브 지원하므로 추가 구현 불필요
- 3rd Why: stdin pipe는 isTTY 판정 edge case 존재, --prompt-file이 모든 문제 우회

## 셀프 QC
- [x] 1. 영향 파일: codex_gate_check.py, test_codex_gate_check.py (2개)
- [x] 2. 엣지 케이스: 매우 긴 프롬프트 → tempfile로 안전 전달, 임시 파일 삭제 → finally 블록
- [x] 3. 작업 지시와 정확히 일치
- [x] 4. 보안: 임시 파일에 PII 없음 (설계 문서 + 코드만), finally에서 삭제
- [x] 5. 테스트 39/39 PASS
- [x] 6. 발견 이슈 3건 모두 해결 또는 범위 외 명시
- [x] 7. SOLID/DRY 위반 없음
- [x] 8. 인터페이스 변경: _run_codex_companion 내부 구현만 변경, 외부 인터페이스 동일
- [x] 11. 3문서 업데이트 완료 (plan.md: completed, checklist.md: 100%)
- [x] 12. 3 Step Why: context-notes.md에 기록 완료
- [x] 13. L1 스모크테스트: 실제 실행으로 source: codex_companion 확인
