<!-- task=m-codex-app-server-streaming-migration/03+02_default_profile plan=0 tag=API -->
# Codex Default Profile Switch Plan

## 이 파일을 읽는 구현 에이전트에게
이 PLAN을 끝까지 읽은 뒤 구현한다. 먼저 선행 작업 `02+01_session_events/complete.log`가 있는지 확인한다. 없으면 구현하지 말고 선행 작업을 완료한다. 구현 완료 전 `CODE_REVIEW-local-G05.md`의 구현 에이전트 소유 섹션을 실제 변경 내용과 검증 출력으로 채운다.

## 배경
작은 작업인 `[exec-fallback]`은 이미 `configs/edge.yaml`에 `codex-exec` 프로필을 추가해 처리했다. 이 plan은 app-server 실행 경로가 준비된 뒤 기본 `codex` 프로필을 app-server mode로 바꾸고, 기존 exec 경로는 `codex-exec` fallback으로 유지하는 작업이다.

## 사용자 리뷰 요청 흐름
설정 전환 자체는 사용자 결정 없이 진행한다. 단, 실제 Codex 계정/인증 문제로 smoke가 막히면 구현을 멈추지 말고 가능한 local 검증을 먼저 수행한 뒤, 외부 환경 소유권이 명확할 때만 리뷰 요청을 남긴다.

## Roadmap Targets

- Milestone: `agent-roadmap/phase/automation-runtime-bridge/milestones/codex-app-server-streaming-migration.md`
- Task ids:
  - `default-profile`: `configs/edge.yaml`의 기본 `codex` profile을 app-server mode로 전환한다. 검증: `console.target`과 CLI profile key가 모두 `codex`인 상태에서 기본 Codex 실행이 app-server 경로를 사용한다.
- Completion mode: check-on-pass

## 의존 관계 및 구현 순서
- 현재 subtask: `03+02_default_profile`
- 선행 index `02`: `agent-task/m-codex-app-server-streaming-migration/02+01_session_events/complete.log`가 현재 없음. 구현 전 선행 작업 완료가 필요하다.

## 분석 결과
### 읽은 파일
- 설정: `configs/edge.yaml`, `configs/edge-compose.yaml.tmpl`, `packages/go/config/config.go`, `packages/go/config/config_test.go`
- 실행 스크립트: `scripts/dev/edge.sh`, `scripts/dev/node.sh`, `Makefile`, `scripts/e2e-smoke.sh`
- 코드: `apps/node/internal/adapters/cli/cli.go`, `apps/node/internal/adapters/cli/codex_exec.go`
- 선행 plan: `agent-task/m-codex-app-server-streaming-migration/02+01_session_events/PLAN-cloud-G07.md`

### 테스트 환경 규칙
- 환경 미지정은 local로 본다.
- 선행 완료 확인: `test -f agent-task/m-codex-app-server-streaming-migration/02+01_session_events/complete.log`
- 설정 검증: `go test ./packages/go/config -count=1`
- adapter smoke: `go test ./apps/node/internal/adapters/cli -count=1`

### 테스트 커버리지 공백
- `configs/edge.yaml`의 `codex` 기본 target이 app-server mode로 바뀌는지 직접 검증하는 테스트가 없다.
- `configs/edge-compose.yaml.tmpl`과 real config의 mode가 의도대로 일치하는지 검증이 없다.

### 심볼 참조
- 기존 설정 구조체 변경 없음.
- `CLIProfileConf.Mode`, `Args`, `Persistent`, `Terminal`, `OutputFormat` 로딩 경로를 그대로 사용한다.

### 분할 판단
분할 정책을 평가했고 공유 task group은 `agent-task/m-codex-app-server-streaming-migration/`이다. sibling subtask는 `01_appserver_rpc_client`(선행 없음), `02+01_session_events`(`01` 의존), `03+02_default_profile`(`02` 의존), `04+03_stream_smoke`(`03` 의존)이다. 현재 작업의 predecessor index `02`는 active `complete.log`가 없어서 미충족이다.

### 범위 결정 근거
설정 전환과 fallback 보존만 다룬다. event mapping이나 e2e full-cycle은 각각 선행/후속 plan에서 다룬다.

### 빌드 등급
`local-G05`: 설정과 config loader 중심 작업이므로 local Go test로 대부분 검증 가능하다. 실제 CLI account smoke는 후속 stream smoke에서 담당한다.

## 구현 체크리스트
- [ ] 선행 `02+01_session_events/complete.log`를 확인한다.
- [ ] `configs/edge.yaml`의 기본 `codex` profile을 app-server mode로 전환한다.
- [ ] `codex-exec` fallback profile을 유지하고 기존 사용자 변경을 덮어쓰지 않는다.
- [ ] `configs/edge-compose.yaml.tmpl`의 codex profile도 동일한 기본값으로 전환한다.
- [ ] config loader 테스트에 app-server mode와 fallback profile 검증을 추가한다.
- [ ] CODE_REVIEW-*-G??.md의 구현 에이전트 소유 섹션을 실제 구현 내용과 검증 출력으로 채운다. 이 항목이 완료되기 전에는 구현이 완료된 것이 아니다.

### [API-1] 기본 `codex` profile을 app-server로 전환
문제: 현재 `configs/edge.yaml`의 `codex` profile은 exec 기반이며, 후속 기본 경로를 app-server로 검증할 수 없다. 현재 파일에는 `codex-exec` fallback이 이미 추가되어 있으므로 이를 보존해야 한다.

해결 방법: `codex` profile의 `args`를 app-server stdio 실행에 맞게 바꾸고 `mode: "codex-app-server"`를 설정한다. `persistent`와 `terminal` 값은 adapter mode가 관리하는 방향으로 유지하되, 선행 구현의 기대값과 맞춘다.

수정 파일 및 체크리스트:
- [ ] `configs/edge.yaml`
- [ ] `configs/edge-compose.yaml.tmpl`

테스트 작성:
- [ ] `TestLoadEdge_CodexAppServerDefaultProfile`
- [ ] fallback `codex-exec` profile이 계속 로드되는지 검증

중간 검증:
```bash
test -f agent-task/m-codex-app-server-streaming-migration/02+01_session_events/complete.log
go test ./packages/go/config -run 'TestLoadEdge_CodexAppServerDefaultProfile|TestLoadEdge_CLIProfileMode' -count=1
```

### [API-2] compose template과 dev scripts 영향 확인
문제: `configs/edge-compose.yaml.tmpl`에는 별도 codex profile 예시가 있어 real config와 어긋날 수 있다. `scripts/e2e-smoke.sh`는 real profile을 읽어 검증하므로 profile 이름과 mode가 유지되어야 한다.

해결 방법: compose template의 `codex`도 app-server mode로 전환하고, e2e script가 `codex-exec` fallback을 선택하지 않는지 확인한다. 스크립트 수정은 profile 추출이 app-server mode를 오판할 때만 한다.

수정 파일 및 체크리스트:
- [ ] `configs/edge-compose.yaml.tmpl`
- [ ] 필요 시에만 `scripts/e2e-smoke.sh`

테스트 작성:
- [ ] config package에 template 관련 fixture가 있으면 추가한다.
- [ ] fixture가 없으면 config 로드 테스트와 e2e dry validation으로 대체한다.

중간 검증:
```bash
go test ./packages/go/config -count=1
go test ./apps/node/internal/adapters/cli -run TestExecutorForMode -count=1
```

## 수정 파일 요약
| 파일 | 항목 |
| --- | --- |
| `configs/edge.yaml` | API-1 |
| `configs/edge-compose.yaml.tmpl` | API-1, API-2 |
| `packages/go/config/config_test.go` | API-1 |
| `scripts/e2e-smoke.sh` | API-2, 필요 시 |

## 최종 검증
```bash
test -f agent-task/m-codex-app-server-streaming-migration/02+01_session_events/complete.log
go test ./packages/go/config -count=1
go test ./apps/node/internal/adapters/cli -count=1
```

**모든 코드 변경 완료 후 반드시 `CODE_REVIEW-*-G??.md`의 구현 에이전트 소유 섹션을 채운다. 이 파일 작성이 구현의 마지막 단계다.**
