[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M70FW4J2Z9BYYRC73YNPG4SM":3,"skill-same:01M70FW4J2Z9BYYRC73YNPG4SM":68},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":28,"publishedAt":42,"linkOnly":43,"markdownContent":44,"markdownBody":45,"frontMatter":46,"refName":47,"commitSha":48,"skillDirectory":49,"forksCount":50,"repositoryHtmlUrl":51,"repositoryHomepageUrl":6,"ownerHtmlUrl":52,"ownerBlogUrl":6,"ownerDescription":6,"updatedAt":53,"install":54,"resources":67},"01M70FW4J2Z9BYYRC73YNPG4SM","codex-ask",null,"Codex CLI second opinion 모드. 리뷰 증거 미발급, resume --last 금지, 매번 새 세션으로 독립 관점 확보. brainstorm 반박 \u002F spec sanity \u002F refactor tradeoff 이중 검증에 사용.","JayJihyunKim\u002Frein","JayJihyunKim","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F9338574?v=4","01M70FV3CW5XEZGG6GS341V6J6","flyingcat4","01M70FV3DSX4YES0CN14AFJT2T",1,"MIT","https:\u002F\u002Fgithub.com\u002FJayJihyunKim\u002Frein\u002Fblob\u002Fmain\u002Fplugins\u002Frein-core\u002Fskills\u002Fcodex-ask\u002FSKILL.md",[18,23],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000007","代码审查","SCENARIO","使用场景",{"categoryNo":24,"categoryName":25,"taxonomyType":26,"taxonomyTypeDesc":27},"01JBSEEDCAT000000000000038","人力资源","PROFESSION","适用职业",[29,30,31,32,33,34,35,36,37,38,39,40,41],"codex","codex ask","ask","sanity","resume","codex cli","last","second opinion","cli","second","spec","brainstorm","refactor","2026-11-10 10:12:30",false,"---\nname: codex-ask\ndescription: \"Codex CLI second opinion 모드. 리뷰 증거 미발급, resume --last 금지, 매번 새 세션으로 독립 관점 확보. brainstorm 반박 \u002F spec sanity \u002F refactor tradeoff 이중 검증에 사용.\"\n---\n\n# Codex Ask Skill (Mode B)\n\n## 1. 목적\n\nSecond opinion 전용 — Claude 주 세션의 컨텍스트와 **독립적** 인 외부 관점을 얻기 위한 스킬. `\u002Fcodex-ask` 슬래시 명령으로 호출한다.\n\n대표 사용처:\n\n- **brainstorm 반박** — \"이 선택지들 중에 숨은 리스크는?\" \u002F \"Option B 기각이 진짜 맞나?\"\n- **spec sanity check** — \"이 설계에 기술적 구멍은?\" \u002F \"이 접근이 over-engineering 은 아닌가?\"\n- **refactor tradeoff 이중 검증** — \"이 refactor 가 제 3 시각에서 합리적?\"\n- Claude 세션 컨텍스트에 오염되지 않은 **독립 관점** 이 필요한 모든 경우\n\n이 스킬은 리뷰 **게이트가 아니다**. 리뷰 게이트 (v2 증거 발급) 가 필요하면 `\u002Fcodex-review` 를 사용한다.\n\n---\n\n## 2. Running a Task\n\n1. 사용자 의도 확인 — 무엇에 대한 second opinion 인지, 어떤 관점을 원하는지.\n2. 모델 \u002F 강도는 단일 출처(`plugins\u002Frein-core\u002Fconfig\u002Fcodex-models.sh`)에서 읽는다 — 분석 역할은 **3계층 프로필** 중 하나를 질문 성격으로 선택한다. 모델을 사용자에게 묻지 않는다(역할 고정 + tier 는 호출자 판단). 사용자가 강도를 명시하면 그 값을 존중한다(기존 규칙 유지).\n\n   ### 3계층 프로필 선택\n\n   | tier | 용도 판정 기준 | 변수 |\n   |---|---|---|\n   | **fast** | 기계적 추출·분류·요약 (판단 여지 낮음) | `ANALYSIS_FAST_MODEL` \u002F `ANALYSIS_FAST_EFFORT` |\n   | **default** | 일반 second opinion — **판단이 애매하면 이 tier** | `ANALYSIS_DEFAULT_MODEL` \u002F `ANALYSIS_DEFAULT_EFFORT` |\n   | **deep** | 고위험·모호 판단, 설계 반박, 보안\u002F게이트 관련 | `ANALYSIS_DEEP_MODEL` \u002F `ANALYSIS_DEEP_EFFORT` |\n\n   - 호출자(Claude)가 질문 성격으로 tier 를 선택한다. 어느 tier 인지 판단이 안 서면 **default**.\n   - **ultra 는 기본 미사용** — 사용자가 명시적으로 요청한 경우에만 허용하며, 그 경우에도 도장 미생성(second opinion 본질, §3) 불변.\n   - legacy alias `ANALYSIS_MODEL`\u002F`ANALYSIS_EFFORT` 는 default tier 를 가리키는 하위 호환 참조일 뿐이다 — 신규 호출은 tier 변수를 직접 쓴다.\n3. Sandbox 는 항상 `--sandbox read-only`. Second opinion 은 파일 편집 권한이 불필요하다.\n4. **새 `codex exec` 세션** 으로 실행 (resume 금지 — §4 참조):\n   ```bash\n   # 모델명은 codex-models.sh 한 곳에서 관리 (모델 rename 시 그 파일만 수정).\n   source \"${CLAUDE_PLUGIN_ROOT:-plugins\u002Frein-core}\u002Fconfig\u002Fcodex-models.sh\"\n   # tier 선택: 질문 성격에 따라 FAST \u002F DEFAULT \u002F DEEP 중 하나 (애매하면 DEFAULT).\n   codex exec \\\n     -m \"$ANALYSIS_DEFAULT_MODEL\" \\\n     --config model_reasoning_effort=\"$ANALYSIS_DEFAULT_EFFORT\" \\\n     --sandbox read-only \\\n     --full-auto \\\n     -C \u003Cworkdir>\n   ```\n5. 출력을 Claude 주 컨텍스트에 반영 후, 사용자에게 summary + 필요 시 의사결정 질문으로 요약 보고.\n6. 추가 질의가 필요하면 **또 다른 새 세션** 으로 시작. 기존 세션 resume 하지 않는다.\n\n### Quick Reference\n\n| Use case                   | Sandbox mode | Key flags                |\n| -------------------------- | ------------ | ------------------------ |\n| Second opinion (초회)      | `read-only`  | `--sandbox read-only`    |\n| Second opinion (추가 질의) | `read-only`  | **새 세션**, resume 금지 |\n| 다른 디렉토리에서 실행     | `read-only`  | `-C \u003CDIR>` 추가          |\n\n### 실행 모드 — Bash 도구로 호출 시 foreground 전용\n\nBash 도구로 `codex exec` 를 호출할 때는 **foreground + TTY 등가 조건**이 반드시 성립해야 한다. 아래는 `plugins\u002Frein-core\u002Frules\u002Fbackground-jobs.md` 예외 절의 codex 계열 규칙이다. 실패 시 codex 가 sandbox\u002Fauth 초기화에서 hang (증상: 네트워크 연결 0개, CPU 0, `~\u002F.codex\u002Fsessions\u002F` 에 세션 파일 미생성).\n\n- `run_in_background: false` 명시 — Bash 도구의 장기 실행 auto-background 전환을 막는다\n- timeout 상한: `low ≤120s`, `medium ≤180s`, `high ≤300s`. 600s harness limit 을 넘어가면 prompt 를 쪼갠다\n- 출력은 `> \u003Cfile> 2>&1` 로 직접 파일에 쓰고 `Read` 로 확인한다. `| tail -N` 금지 — EOF 까지 버퍼링되어 부분 출력이 안 보이고 hang 디버깅도 막힌다\n- stdin 은 `\u003C \u002Fdev\u002Fnull` 로 명시 close (codex 가 stdin 을 대기하지 않도록)\n\n올바른 호출 예:\n\n```bash\nsource \"${CLAUDE_PLUGIN_ROOT:-plugins\u002Frein-core}\u002Fconfig\u002Fcodex-models.sh\"\n# tier 는 질문 성격에 따라 선택 (§2 3계층 프로필 선택 표) — 예시는 default tier.\ncodex exec -m \"$ANALYSIS_DEFAULT_MODEL\" --config model_reasoning_effort=\"$ANALYSIS_DEFAULT_EFFORT\" \\\n  --sandbox read-only --full-auto \\\n  -C \u002FUsers\u002Fjihyun\u002FLocal_Projects\u002Fclaude-code-ai-native \\\n  \"\u003Cprompt>\" \u003C \u002Fdev\u002Fnull > \u002Ftmp\u002Fcodex-ask.out 2>&1\n# 이후 Read \u002Ftmp\u002Fcodex-ask.out\n```\n\nHang 감지 시: `lsof -p \u003Cpid> -i` 결과가 비어 있거나 (`ps -o %cpu` 가 0 인 채 sleep 상태) → kill 후 재호출. 재호출은 동일 조건으로 foreground.\n\n---\n\n## 3. 리뷰 증거 \u002F DoD 자발 생성 금지\n\n**의도적으로 생성하지 않는다**. Second opinion 은 \"관점 제공\" 이지 \"승인 게이트\" 가 아니다.\n\n- `bin\u002Frein issue-evidence code_review ...` 를 **절대 호출하지 않는다** (v2 code_review 증거를 발급하지 않는다).\n- 다른 어떤 리뷰 marker 도 touch 하지 않는다 (legacy marker 는 Phase 7 웨이브 3 ③-d 로 이미 제거되어 대상 자체가 없다 — `.spec-reviews\u002F*` 등 존속하는 marker 도 건드리지 않는다).\n- `trail\u002Fdod\u002Fdod-*.md` 같은 **DoD 파일도 자발적으로 생성하지 않는다**. DoD 는 주 세션의 작업 기준 문서이며, second opinion 세션이 자동으로 만들면 주 세션 라우팅\u002F승인 흐름을 건너뛰게 된다.\n\n리뷰 게이트가 필요한 경우 (테스트\u002F커밋 통과가 목적) 는 반드시 `\u002Fcodex-review` (Mode A) 를 사용한다. 실수로 `\u002Fcodex-ask` 결과로 v2 code_review 증거를 발급하면 리뷰 없이 커밋이 통과되어 `pre-bash-commit-review-gate.sh`(구 `pre-bash-test-commit-gate.sh` 후속, ③-c 삭제 완료) 의 게이트가 무력화된다. DoD 를 자발 생성하면 `pre-edit-discipline-gate.sh`(구 `pre-edit-dod-gate.sh` 후속, ③-b 삭제 완료) 가 요구하는 주 세션 routing 단계가 생략된 채 편집 권한이 생기는 우회 경로가 된다.\n\n---\n\n## 4. Resume 금지 규칙\n\n**`codex exec resume --last` 는 절대 사용 금지**.\n\n이유: resume 하면 이전 세션의 대화 컨텍스트가 주입되어, 새 질문에 대한 **독립 관점** 이 이전 논의의 결론이나 가정에 오염된다. Second opinion 의 핵심 가치는 \"선입견 없는 별도의 시각\" 이므로 매 호출마다 반드시 새 `codex exec` 세션을 띄운다.\n\n여러 번 질문해야 할 경우에도 각 호출마다 **새 세션** — 이전 답변과 연결하려는 목적이면 `\u002Fcodex-review` 로 목적 자체를 재정의하거나, Claude 주 세션에서 문맥을 명시적으로 prompt 에 포함해 새 `codex-ask` 를 띄운다.\n\n### Mode 대비\n\n| 항목          | Mode A (`\u002Fcodex-review`)     | Mode B (`\u002Fcodex-ask`)   |\n| ------------- | ---------------------------- | ----------------------- |\n| 용도          | 리뷰 게이트                  | Second opinion          |\n| 리뷰 결과 기록 | 검토 대상이 있으면 **필수** (v2 code_review 증거 발급) | **절대 금지**           |\n| Resume --last | 래퍼는 매번 새 세션 (codex-review §7) | **금지** — 매번 새 세션 |\n| Sandbox       | 상황별 (기본 read-only)      | 항상 `read-only`        |\n| **Fallback**  | codex 실행 **실패** 시에만 Sonnet\u002Fcode-reviewer\u002Fhuman fallback 허용 | **same-session Claude fallback 금지**. 독립 reviewer 부재 시 degraded \u002F no-second-opinion 으로 명시 |\n\nFallback 정책 비대칭 이유는 `.claude\u002Fskills\u002Fcodex-review\u002FSKILL.md` §1 Mode 대비 절 참조. 요지: Mode A 는 검토 대상이 있는 변경이면 v2 증거 발급 자체가 게이트 통과 조건이므로 차순위 reviewer 허용, Mode B 는 \"독립 관점\" 이 본질이므로 same-session Claude 대체 불가.\n\n---\n\n## 5. 전형적 사용 예\n\n### 5.1 Brainstorm 결론 반박\n\n사용자: \"brainstorming 에서 Option B 는 기각됐는데, 진짜 기각이 맞는지 독립 관점으로 반박해줘.\"\n\n→ `\u002Fcodex-ask` 로 새 세션 실행. brainstorm 요약을 prompt 에 포함 (Claude 의 현재 세션 문맥을 독립 세션에 전달). codex 가 Option B 지지 논거 또는 기각 논거의 허점을 제시.\n\n### 5.2 Spec Sanity Check\n\n사용자: \"이 spec 의 X 결정이 실제로 기술적으로 말이 되는지 독립 시각으로 점검해줘.\"\n\n→ `\u002Fcodex-ask` 로 새 세션. spec 의 관련 섹션을 prompt 에 포함. codex 가 숨은 가정·엣지 케이스·기술적 모순을 지적.\n\n### 5.3 Refactor Tradeoff 이중 검증\n\n사용자: \"이 refactor 가 over-engineering 인지 제 3 시각으로 판단해줘.\"\n\n→ `\u002Fcodex-ask` 로 새 세션. 변경 diff + 동기를 prompt 에 포함. codex 가 복잡도 추가 대비 이점·대안 경량 접근·YAGNI 관점에서 평가.\n\n### 5.4 사용처가 아닌 경우\n\n- **리뷰 게이트 통과가 필요** → `\u002Fcodex-review` (v2 증거 발급 필수 경로)\n- **이전 `\u002Fcodex-ask` 답변에 이어서 물어보고 싶음** → 이어서 resume 하지 말고, 새 `\u002Fcodex-ask` 에 이전 답변 요약을 prompt 에 포함\n- **구현 편집이 필요** → `\u002Fcodex-ask` 아님. workspace-write 가 필요한 작업은 별도 경로\n\n---\n\n## 6. Error Handling\n\n- `codex exec` 가 non-zero exit → 사용자에게 보고 후 재시도 여부 질의. **폴백 없음** — Second opinion 은 리뷰 게이트가 아니므로 실패해도 작업 차단이 발생하지 않는다.\n- **모델 거부 감지 (fail-soft)**: codex 출력에 `is not supported` \u002F `invalid_request_error` \u002F `model_not_found` 가 보이면 모델명이 변경된 것이다(codex upstream rename). `${CLAUDE_PLUGIN_ROOT:-plugins\u002Frein-core}\u002Fconfig\u002Fcodex-models.sh` 에서 **사용한 tier 의 변수**(`ANALYSIS_FAST_MODEL` \u002F `ANALYSIS_DEFAULT_MODEL` \u002F `ANALYSIS_DEEP_MODEL` 중 해당하는 것)를 최신 모델명으로 갱신하도록 사용자에게 안내하고 재시도한다. (second opinion 은 게이트가 아니므로 작업 차단은 없다.)\n  - **Same-session Claude fallback 금지**: codex 가 실패했을 때 \"그럼 Claude 가 직접 second opinion 을 내겠다\" 는 경로는 **본질 위반**. Mode B 의 가치는 주 세션과 독립된 외부 관점이며, same-session Claude 는 정의상 독립 reviewer 가 아니다.\n  - **차순위 옵션**: (a) 시간을 두고 Mode B 재시도 (b) 호출자가 결과 없이 작업을 계속하되 \"second opinion 부재\" 사실을 의식적으로 인지 (c) 사용자에게 직접 검토 요청. (a)\u002F(b)\u002F(c) 어느 쪽도 v2 증거나 marker 를 만들지 않는다.\n  - Mode A (`\u002Fcodex-review`) 와의 비대칭: Mode A 는 검토 대상이 있는 변경이면 v2 증거 발급 자체가 게이트 통과 조건이라 codex 실패 시 Sonnet\u002Fcode-reviewer\u002Fhuman fallback 으로 그 증거를 발급할 수 있다. Mode B 는 증거 발급 경로가 아예 없으므로 fallback 의 동기 자체가 다르다.\n- 고위험 플래그는 기본적으로 사용하지 않는다. `\u002Fcodex-ask` 는 `--sandbox read-only` 고정이므로 `--sandbox danger-full-access` \u002F `--full-auto` 의 위험 조합이 발생하지 않는다.\n- 출력에 경고나 부분 결과가 포함되면 요약 후 `AskUserQuestion` 으로 다음 질의 방향 확인.\n- **Hang 증상 탐지** (§2 실행 모드 절 참고):\n  - `codex` 프로세스가 수 분 이상 진행 없음 + CPU 0 + 네트워크 연결 0개 → auth\u002Fsandbox 초기화 단계에서 멈춤\n  - 체크: `lsof -p \u003Cpid> -i` 결과 비어있으면 API 요청조차 못 보낸 상태. `ps -o stat,%cpu,etime -p \u003Cpid>` 로 Sleep 상태 확인\n  - 대응: kill 후 **foreground + stdin close + 직접 파일 출력** 형태로 재호출 (`> \u002Ftmp\u002Fout 2>&1 \u003C \u002Fdev\u002Fnull`, `run_in_background: false`)\n  - 배경: Bash 도구 auto-background 전환 시 stdin 이 unix socket 으로 붙어 codex 초기화 실패. 근거: `plugins\u002Frein-core\u002Frules\u002Fbackground-jobs.md` 예외 절 + `trail\u002Fdod\u002Fdod-2026-04-22-codex-foreground-policy.md`\n\n---\n\n## 7. 사용자 안내\n\nMode B 의 결과를 사용자에게 보고할 때 다음 짧은 형식을 **먼저** 출력한다 (운영자\u002F디테일 codex 본문은 그 다음에 그대로 이어 붙인다). 형식은 한 문장 또는 두 문장 — 결과 1줄 + 다음 액션 1줄.\n\n**Sanity check \u002F 반박 결과 — codex 가 invalid 지적 또는 빠진 변수 짚음**:\n> codex 가 [지적 핵심 — 예: \"질문 초안에서 빠진 결정 변수 N개\" 또는 \"Option B 기각 근거의 허점 1건\"] 을 짚어줬어요. [다음 액션 — 질문 재작성 \u002F 결정 재고려 \u002F 사용자 결정 받기].\n\n**Sanity check 통과 \u002F 권고 수렴**:\n> codex 가 결론을 인정했습니다. [핵심 권고 한 줄, 있으면]. 다음 단계로 진행하세요.\n\n**codex 실행 실패 (No fallback)**:\n> codex 가 떠지지 않아 second opinion 을 받지 못했어요. Mode B 는 fallback 없습니다 — 시간을 두고 재시도하거나 사용자가 직접 검토하세요.\n\n이 짧은 안내 후에 기존 codex 본문을 그대로 emit 한다. **v2 증거 발급 금지** — Mode B 는 §3 에 따라 어떤 review marker 도 만들지 않는다.\n","# Codex Ask Skill (Mode B)\n\n## 1. 목적\n\nSecond opinion 전용 — Claude 주 세션의 컨텍스트와 **독립적** 인 외부 관점을 얻기 위한 스킬. `\u002Fcodex-ask` 슬래시 명령으로 호출한다.\n\n대표 사용처:\n\n- **brainstorm 반박** — \"이 선택지들 중에 숨은 리스크는?\" \u002F \"Option B 기각이 진짜 맞나?\"\n- **spec sanity check** — \"이 설계에 기술적 구멍은?\" \u002F \"이 접근이 over-engineering 은 아닌가?\"\n- **refactor tradeoff 이중 검증** — \"이 refactor 가 제 3 시각에서 합리적?\"\n- Claude 세션 컨텍스트에 오염되지 않은 **독립 관점** 이 필요한 모든 경우\n\n이 스킬은 리뷰 **게이트가 아니다**. 리뷰 게이트 (v2 증거 발급) 가 필요하면 `\u002Fcodex-review` 를 사용한다.\n\n---\n\n## 2. Running a Task\n\n1. 사용자 의도 확인 — 무엇에 대한 second opinion 인지, 어떤 관점을 원하는지.\n2. 모델 \u002F 강도는 단일 출처(`plugins\u002Frein-core\u002Fconfig\u002Fcodex-models.sh`)에서 읽는다 — 분석 역할은 **3계층 프로필** 중 하나를 질문 성격으로 선택한다. 모델을 사용자에게 묻지 않는다(역할 고정 + tier 는 호출자 판단). 사용자가 강도를 명시하면 그 값을 존중한다(기존 규칙 유지).\n\n   ### 3계층 프로필 선택\n\n   | tier | 용도 판정 기준 | 변수 |\n   |---|---|---|\n   | **fast** | 기계적 추출·분류·요약 (판단 여지 낮음) | `ANALYSIS_FAST_MODEL` \u002F `ANALYSIS_FAST_EFFORT` |\n   | **default** | 일반 second opinion — **판단이 애매하면 이 tier** | `ANALYSIS_DEFAULT_MODEL` \u002F `ANALYSIS_DEFAULT_EFFORT` |\n   | **deep** | 고위험·모호 판단, 설계 반박, 보안\u002F게이트 관련 | `ANALYSIS_DEEP_MODEL` \u002F `ANALYSIS_DEEP_EFFORT` |\n\n   - 호출자(Claude)가 질문 성격으로 tier 를 선택한다. 어느 tier 인지 판단이 안 서면 **default**.\n   - **ultra 는 기본 미사용** — 사용자가 명시적으로 요청한 경우에만 허용하며, 그 경우에도 도장 미생성(second opinion 본질, §3) 불변.\n   - legacy alias `ANALYSIS_MODEL`\u002F`ANALYSIS_EFFORT` 는 default tier 를 가리키는 하위 호환 참조일 뿐이다 — 신규 호출은 tier 변수를 직접 쓴다.\n3. Sandbox 는 항상 `--sandbox read-only`. Second opinion 은 파일 편집 권한이 불필요하다.\n4. **새 `codex exec` 세션** 으로 실행 (resume 금지 — §4 참조):\n   ```bash\n   # 모델명은 codex-models.sh 한 곳에서 관리 (모델 rename 시 그 파일만 수정).\n   source \"${CLAUDE_PLUGIN_ROOT:-plugins\u002Frein-core}\u002Fconfig\u002Fcodex-models.sh\"\n   # tier 선택: 질문 성격에 따라 FAST \u002F DEFAULT \u002F DEEP 중 하나 (애매하면 DEFAULT).\n   codex exec \\\n     -m \"$ANALYSIS_DEFAULT_MODEL\" \\\n     --config model_reasoning_effort=\"$ANALYSIS_DEFAULT_EFFORT\" \\\n     --sandbox read-only \\\n     --full-auto \\\n     -C \u003Cworkdir>\n   ```\n5. 출력을 Claude 주 컨텍스트에 반영 후, 사용자에게 summary + 필요 시 의사결정 질문으로 요약 보고.\n6. 추가 질의가 필요하면 **또 다른 새 세션** 으로 시작. 기존 세션 resume 하지 않는다.\n\n### Quick Reference\n\n| Use case                   | Sandbox mode | Key flags                |\n| -------------------------- | ------------ | ------------------------ |\n| Second opinion (초회)      | `read-only`  | `--sandbox read-only`    |\n| Second opinion (추가 질의) | `read-only`  | **새 세션**, resume 금지 |\n| 다른 디렉토리에서 실행     | `read-only`  | `-C \u003CDIR>` 추가          |\n\n### 실행 모드 — Bash 도구로 호출 시 foreground 전용\n\nBash 도구로 `codex exec` 를 호출할 때는 **foreground + TTY 등가 조건**이 반드시 성립해야 한다. 아래는 `plugins\u002Frein-core\u002Frules\u002Fbackground-jobs.md` 예외 절의 codex 계열 규칙이다. 실패 시 codex 가 sandbox\u002Fauth 초기화에서 hang (증상: 네트워크 연결 0개, CPU 0, `~\u002F.codex\u002Fsessions\u002F` 에 세션 파일 미생성).\n\n- `run_in_background: false` 명시 — Bash 도구의 장기 실행 auto-background 전환을 막는다\n- timeout 상한: `low ≤120s`, `medium ≤180s`, `high ≤300s`. 600s harness limit 을 넘어가면 prompt 를 쪼갠다\n- 출력은 `> \u003Cfile> 2>&1` 로 직접 파일에 쓰고 `Read` 로 확인한다. `| tail -N` 금지 — EOF 까지 버퍼링되어 부분 출력이 안 보이고 hang 디버깅도 막힌다\n- stdin 은 `\u003C \u002Fdev\u002Fnull` 로 명시 close (codex 가 stdin 을 대기하지 않도록)\n\n올바른 호출 예:\n\n```bash\nsource \"${CLAUDE_PLUGIN_ROOT:-plugins\u002Frein-core}\u002Fconfig\u002Fcodex-models.sh\"\n# tier 는 질문 성격에 따라 선택 (§2 3계층 프로필 선택 표) — 예시는 default tier.\ncodex exec -m \"$ANALYSIS_DEFAULT_MODEL\" --config model_reasoning_effort=\"$ANALYSIS_DEFAULT_EFFORT\" \\\n  --sandbox read-only --full-auto \\\n  -C \u002FUsers\u002Fjihyun\u002FLocal_Projects\u002Fclaude-code-ai-native \\\n  \"\u003Cprompt>\" \u003C \u002Fdev\u002Fnull > \u002Ftmp\u002Fcodex-ask.out 2>&1\n# 이후 Read \u002Ftmp\u002Fcodex-ask.out\n```\n\nHang 감지 시: `lsof -p \u003Cpid> -i` 결과가 비어 있거나 (`ps -o %cpu` 가 0 인 채 sleep 상태) → kill 후 재호출. 재호출은 동일 조건으로 foreground.\n\n---\n\n## 3. 리뷰 증거 \u002F DoD 자발 생성 금지\n\n**의도적으로 생성하지 않는다**. Second opinion 은 \"관점 제공\" 이지 \"승인 게이트\" 가 아니다.\n\n- `bin\u002Frein issue-evidence code_review ...` 를 **절대 호출하지 않는다** (v2 code_review 증거를 발급하지 않는다).\n- 다른 어떤 리뷰 marker 도 touch 하지 않는다 (legacy marker 는 Phase 7 웨이브 3 ③-d 로 이미 제거되어 대상 자체가 없다 — `.spec-reviews\u002F*` 등 존속하는 marker 도 건드리지 않는다).\n- `trail\u002Fdod\u002Fdod-*.md` 같은 **DoD 파일도 자발적으로 생성하지 않는다**. DoD 는 주 세션의 작업 기준 문서이며, second opinion 세션이 자동으로 만들면 주 세션 라우팅\u002F승인 흐름을 건너뛰게 된다.\n\n리뷰 게이트가 필요한 경우 (테스트\u002F커밋 통과가 목적) 는 반드시 `\u002Fcodex-review` (Mode A) 를 사용한다. 실수로 `\u002Fcodex-ask` 결과로 v2 code_review 증거를 발급하면 리뷰 없이 커밋이 통과되어 `pre-bash-commit-review-gate.sh`(구 `pre-bash-test-commit-gate.sh` 후속, ③-c 삭제 완료) 의 게이트가 무력화된다. DoD 를 자발 생성하면 `pre-edit-discipline-gate.sh`(구 `pre-edit-dod-gate.sh` 후속, ③-b 삭제 완료) 가 요구하는 주 세션 routing 단계가 생략된 채 편집 권한이 생기는 우회 경로가 된다.\n\n---\n\n## 4. Resume 금지 규칙\n\n**`codex exec resume --last` 는 절대 사용 금지**.\n\n이유: resume 하면 이전 세션의 대화 컨텍스트가 주입되어, 새 질문에 대한 **독립 관점** 이 이전 논의의 결론이나 가정에 오염된다. Second opinion 의 핵심 가치는 \"선입견 없는 별도의 시각\" 이므로 매 호출마다 반드시 새 `codex exec` 세션을 띄운다.\n\n여러 번 질문해야 할 경우에도 각 호출마다 **새 세션** — 이전 답변과 연결하려는 목적이면 `\u002Fcodex-review` 로 목적 자체를 재정의하거나, Claude 주 세션에서 문맥을 명시적으로 prompt 에 포함해 새 `codex-ask` 를 띄운다.\n\n### Mode 대비\n\n| 항목          | Mode A (`\u002Fcodex-review`)     | Mode B (`\u002Fcodex-ask`)   |\n| ------------- | ---------------------------- | ----------------------- |\n| 용도          | 리뷰 게이트                  | Second opinion          |\n| 리뷰 결과 기록 | 검토 대상이 있으면 **필수** (v2 code_review 증거 발급) | **절대 금지**           |\n| Resume --last | 래퍼는 매번 새 세션 (codex-review §7) | **금지** — 매번 새 세션 |\n| Sandbox       | 상황별 (기본 read-only)      | 항상 `read-only`        |\n| **Fallback**  | codex 실행 **실패** 시에만 Sonnet\u002Fcode-reviewer\u002Fhuman fallback 허용 | **same-session Claude fallback 금지**. 독립 reviewer 부재 시 degraded \u002F no-second-opinion 으로 명시 |\n\nFallback 정책 비대칭 이유는 `.claude\u002Fskills\u002Fcodex-review\u002FSKILL.md` §1 Mode 대비 절 참조. 요지: Mode A 는 검토 대상이 있는 변경이면 v2 증거 발급 자체가 게이트 통과 조건이므로 차순위 reviewer 허용, Mode B 는 \"독립 관점\" 이 본질이므로 same-session Claude 대체 불가.\n\n---\n\n## 5. 전형적 사용 예\n\n### 5.1 Brainstorm 결론 반박\n\n사용자: \"brainstorming 에서 Option B 는 기각됐는데, 진짜 기각이 맞는지 독립 관점으로 반박해줘.\"\n\n→ `\u002Fcodex-ask` 로 새 세션 실행. brainstorm 요약을 prompt 에 포함 (Claude 의 현재 세션 문맥을 독립 세션에 전달). codex 가 Option B 지지 논거 또는 기각 논거의 허점을 제시.\n\n### 5.2 Spec Sanity Check\n\n사용자: \"이 spec 의 X 결정이 실제로 기술적으로 말이 되는지 독립 시각으로 점검해줘.\"\n\n→ `\u002Fcodex-ask` 로 새 세션. spec 의 관련 섹션을 prompt 에 포함. codex 가 숨은 가정·엣지 케이스·기술적 모순을 지적.\n\n### 5.3 Refactor Tradeoff 이중 검증\n\n사용자: \"이 refactor 가 over-engineering 인지 제 3 시각으로 판단해줘.\"\n\n→ `\u002Fcodex-ask` 로 새 세션. 변경 diff + 동기를 prompt 에 포함. codex 가 복잡도 추가 대비 이점·대안 경량 접근·YAGNI 관점에서 평가.\n\n### 5.4 사용처가 아닌 경우\n\n- **리뷰 게이트 통과가 필요** → `\u002Fcodex-review` (v2 증거 발급 필수 경로)\n- **이전 `\u002Fcodex-ask` 답변에 이어서 물어보고 싶음** → 이어서 resume 하지 말고, 새 `\u002Fcodex-ask` 에 이전 답변 요약을 prompt 에 포함\n- **구현 편집이 필요** → `\u002Fcodex-ask` 아님. workspace-write 가 필요한 작업은 별도 경로\n\n---\n\n## 6. Error Handling\n\n- `codex exec` 가 non-zero exit → 사용자에게 보고 후 재시도 여부 질의. **폴백 없음** — Second opinion 은 리뷰 게이트가 아니므로 실패해도 작업 차단이 발생하지 않는다.\n- **모델 거부 감지 (fail-soft)**: codex 출력에 `is not supported` \u002F `invalid_request_error` \u002F `model_not_found` 가 보이면 모델명이 변경된 것이다(codex upstream rename). `${CLAUDE_PLUGIN_ROOT:-plugins\u002Frein-core}\u002Fconfig\u002Fcodex-models.sh` 에서 **사용한 tier 의 변수**(`ANALYSIS_FAST_MODEL` \u002F `ANALYSIS_DEFAULT_MODEL` \u002F `ANALYSIS_DEEP_MODEL` 중 해당하는 것)를 최신 모델명으로 갱신하도록 사용자에게 안내하고 재시도한다. (second opinion 은 게이트가 아니므로 작업 차단은 없다.)\n  - **Same-session Claude fallback 금지**: codex 가 실패했을 때 \"그럼 Claude 가 직접 second opinion 을 내겠다\" 는 경로는 **본질 위반**. Mode B 의 가치는 주 세션과 독립된 외부 관점이며, same-session Claude 는 정의상 독립 reviewer 가 아니다.\n  - **차순위 옵션**: (a) 시간을 두고 Mode B 재시도 (b) 호출자가 결과 없이 작업을 계속하되 \"second opinion 부재\" 사실을 의식적으로 인지 (c) 사용자에게 직접 검토 요청. (a)\u002F(b)\u002F(c) 어느 쪽도 v2 증거나 marker 를 만들지 않는다.\n  - Mode A (`\u002Fcodex-review`) 와의 비대칭: Mode A 는 검토 대상이 있는 변경이면 v2 증거 발급 자체가 게이트 통과 조건이라 codex 실패 시 Sonnet\u002Fcode-reviewer\u002Fhuman fallback 으로 그 증거를 발급할 수 있다. Mode B 는 증거 발급 경로가 아예 없으므로 fallback 의 동기 자체가 다르다.\n- 고위험 플래그는 기본적으로 사용하지 않는다. `\u002Fcodex-ask` 는 `--sandbox read-only` 고정이므로 `--sandbox danger-full-access` \u002F `--full-auto` 의 위험 조합이 발생하지 않는다.\n- 출력에 경고나 부분 결과가 포함되면 요약 후 `AskUserQuestion` 으로 다음 질의 방향 확인.\n- **Hang 증상 탐지** (§2 실행 모드 절 참고):\n  - `codex` 프로세스가 수 분 이상 진행 없음 + CPU 0 + 네트워크 연결 0개 → auth\u002Fsandbox 초기화 단계에서 멈춤\n  - 체크: `lsof -p \u003Cpid> -i` 결과 비어있으면 API 요청조차 못 보낸 상태. `ps -o stat,%cpu,etime -p \u003Cpid>` 로 Sleep 상태 확인\n  - 대응: kill 후 **foreground + stdin close + 직접 파일 출력** 형태로 재호출 (`> \u002Ftmp\u002Fout 2>&1 \u003C \u002Fdev\u002Fnull`, `run_in_background: false`)\n  - 배경: Bash 도구 auto-background 전환 시 stdin 이 unix socket 으로 붙어 codex 초기화 실패. 근거: `plugins\u002Frein-core\u002Frules\u002Fbackground-jobs.md` 예외 절 + `trail\u002Fdod\u002Fdod-2026-04-22-codex-foreground-policy.md`\n\n---\n\n## 7. 사용자 안내\n\nMode B 의 결과를 사용자에게 보고할 때 다음 짧은 형식을 **먼저** 출력한다 (운영자\u002F디테일 codex 본문은 그 다음에 그대로 이어 붙인다). 형식은 한 문장 또는 두 문장 — 결과 1줄 + 다음 액션 1줄.\n\n**Sanity check \u002F 반박 결과 — codex 가 invalid 지적 또는 빠진 변수 짚음**:\n> codex 가 [지적 핵심 — 예: \"질문 초안에서 빠진 결정 변수 N개\" 또는 \"Option B 기각 근거의 허점 1건\"] 을 짚어줬어요. [다음 액션 — 질문 재작성 \u002F 결정 재고려 \u002F 사용자 결정 받기].\n\n**Sanity check 통과 \u002F 권고 수렴**:\n> codex 가 결론을 인정했습니다. [핵심 권고 한 줄, 있으면]. 다음 단계로 진행하세요.\n\n**codex 실행 실패 (No fallback)**:\n> codex 가 떠지지 않아 second opinion 을 받지 못했어요. Mode B 는 fallback 없습니다 — 시간을 두고 재시도하거나 사용자가 직접 검토하세요.\n\n이 짧은 안내 후에 기존 codex 본문을 그대로 emit 한다. **v2 증거 발급 금지** — Mode B 는 §3 에 따라 어떤 review marker 도 만들지 않는다.\n",{"name":5,"description":7},"main","8e6e9ee16c5c7343c6f0db55f6c8b37d5ef6f1d0","plugins\u002Frein-core\u002Fskills\u002Fcodex-ask",0,"https:\u002F\u002Fgithub.com\u002FJayJihyunKim\u002Frein","https:\u002F\u002Fgithub.com\u002FJayJihyunKim","2026-10-15 08:31:34",{"source":8,"skillName":5,"commands":55,"prompt":65,"zipAvailable":66},[56,59,62],{"tool":57,"command":58},"npx","npx skills add JayJihyunKim\u002Frein --skill codex-ask",{"tool":60,"command":61},"bunx","bunx skills add JayJihyunKim\u002Frein --skill codex-ask",{"tool":63,"command":64},"pnpm","pnpm dlx skills add JayJihyunKim\u002Frein --skill codex-ask","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FJayJihyunKim\u002Frein\u002Fblob\u002Fmain\u002Fplugins\u002Frein-core\u002Fskills\u002Fcodex-ask\u002FSKILL.md",true,[],[69,80,91,102,114,121],{"skillNo":70,"name":71,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":72,"categories":73,"keywords":77,"publishedAt":42},"01M70FX2WFS12FG002RNTCSXC7","sample-skill","https:\u002F\u002Fgithub.com\u002FJayJihyunKim\u002Frein\u002Fblob\u002Fmain\u002Ftests\u002Fscripts\u002Ffixtures\u002Frein-template-min\u002F.claude\u002Fskills\u002Fsample-skill\u002FSKILL.md",[74],{"categoryNo":75,"categoryName":76,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000023","Skill与智能体开发",[78,79],"sample","sample skill",{"skillNo":81,"name":82,"nameZh":6,"description":83,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":84,"categories":85,"keywords":86,"publishedAt":42},"01M70FX0BT6WSNZKFF60KTZ5H9","repo-audit","저장소 전체 상태 점검. 오래된 규칙, 누락 테스트, 비활성 에이전트, trail 일관성 확인.","https:\u002F\u002Fgithub.com\u002FJayJihyunKim\u002Frein\u002Fblob\u002Fmain\u002Fplugins\u002Frein-core\u002Fskills\u002Frepo-audit\u002FSKILL.md",[],[87,88,89,90],"repo","repo audit","audit","trail",{"skillNo":92,"name":93,"nameZh":6,"description":94,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":95,"categories":96,"keywords":98,"publishedAt":42},"01M70FWXCWRZEJSDQGTNDEKF2G","promote-agent","에이전트 후보를 정식 에이전트로 승격. 사람 승인 이후에만 실행.","https:\u002F\u002Fgithub.com\u002FJayJihyunKim\u002Frein\u002Fblob\u002Fmain\u002Fplugins\u002Frein-core\u002Fskills\u002Fpromote-agent\u002FSKILL.md",[97],{"categoryNo":75,"categoryName":76,"taxonomyType":21,"taxonomyTypeDesc":22},[99,100,101],"promote agent","promote","incidents",{"skillNo":103,"name":104,"nameZh":6,"description":105,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":106,"categories":107,"keywords":108,"publishedAt":42},"01M70FWTP0QPQN09VJR8DNKWZS","pr-review-fixer","PR 리뷰 코멘트를 읽고 수정 사항을 자동으로 적용한다","https:\u002F\u002Fgithub.com\u002FJayJihyunKim\u002Frein\u002Fblob\u002Fmain\u002Fplugins\u002Frein-core\u002Fskills\u002Fpr-review-fixer\u002FSKILL.md",[],[109,110,111,112,113],"pr","review","pr review","pr review fixer","fixer",{"skillNo":115,"name":116,"nameZh":6,"description":117,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":118,"categories":119,"keywords":120,"publishedAt":42},"01M70FWR0TC5NDF12D9E5ETBAW","persona","페르소나 프리셋 선택·해제 + 질문-답변 커스텀 프리셋 생성. \"페르소나 골라줘\u002F만들어줘\u002F바꿔줘\u002F꺼줘\" 류 요청에서 호출.","https:\u002F\u002Fgithub.com\u002FJayJihyunKim\u002Frein\u002Fblob\u002Fmain\u002Fplugins\u002Frein-core\u002Fskills\u002Fpersona\u002FSKILL.md",[],[116],{"skillNo":122,"name":123,"nameZh":6,"description":124,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":125,"categories":126,"keywords":127,"publishedAt":42},"01M70FWKFPNVC4M5ECZE1F0WS6","parallel-execute","활성 plan 의 `## 실행 전략`(depends_on\u002Fmode\u002Fscope v2) 을 읽어 의존 위상정렬로 웨이브를 유도하고, 각 웨이브의 독립 edit_only 태스크를 같은 작업 트리에서 서브에이전트로 병렬 실행, mutating·의존 태스크는 순차 실행한다. 부모(메인 세션)가 웨이브 단위로 검증·테스트·커밋. 호스트가 병렬 dispatch 불가 시 순차 fallback 으로 degrade.","https:\u002F\u002Fgithub.com\u002FJayJihyunKim\u002Frein\u002Fblob\u002Fmain\u002Fplugins\u002Frein-core\u002Fskills\u002Fparallel-execute\u002FSKILL.md",[],[128,129,130,131,132,133,134,135,136,137],"parallel","execute","parallel execute","edit","fallback","mode","dispatch","scope","plan","only"]