<!-- task=m-codex-app-server-streaming-migration/04+03_stream_smoke plan=1 tag=REVIEW_TEST -->
# Codex App Server Stream Smoke Follow-up Plan

## 이 파일을 읽는 구현 에이전트에게
이 PLAN을 끝까지 읽은 뒤 구현한다. 사용자에게 직접 질문하거나 선택지를 제시하지 않는다. 구현 중 사용자 소유 외부 계정/secret/서비스 준비가 실제로 필요하면 `CODE_REVIEW-cloud-G07.md`의 `사용자 리뷰 요청` 섹션에 명령, 실제 stdout/stderr, 자동 후속 불가 이유, 재개 조건을 채우고 active 파일을 그대로 둔 채 멈춘다.

## 배경
이전 리뷰는 FAIL이다. `go test ./apps/node/... ./apps/edge/... -count=1`와 mock `./scripts/e2e-smoke.sh`는 통과했지만, 실제 `codex` profile smoke가 app-server 초기화에서 실패했다.

재현 명령:
```bash
IOP_E2E_PROFILE=codex IOP_E2E_RUN_TIMEOUT=45 IOP_E2E_STATUS_TIMEOUT=45 ./scripts/e2e-smoke.sh
```

관찰된 핵심 오류:
```text
cli adapter: codex app-server init: thread/start: rpc error -32600: Invalid request: missing field `params`
```

## Roadmap Targets

- Milestone: `agent-roadmap/phase/automation-runtime-bridge/milestones/codex-app-server-streaming-migration.md`
- Task ids:
  - `stream-smoke`: `./scripts/dev/edge.sh`와 `./scripts/dev/node.sh` 시작 후 `codex` target으로 2-message 왕복에서 델타 스트림이 관찰된다. 검증: 두 메시지가 같은 logical session에서 완료되고, 적어도 한 turn에서 app-server delta event가 IOP delta로 relay된다.
- Completion mode: check-on-pass

## 리뷰 실패 요약

- Required 1: [apps/node/internal/adapters/cli/codex_app_server.go](/config/workspace/iop/apps/node/internal/adapters/cli/codex_app_server.go:594)의 `thread/start` 요청이 `params` 필드를 생략해 실제 Codex app-server JSON-RPC 계약과 맞지 않는다.
- Required 2: 최종 `IOP_E2E_PROFILE=codex ./scripts/e2e-smoke.sh` 검증이 계정 blocker가 아니라 repo-owned RPC 계약 오류로 실패했으므로, 수정 후 실제 smoke stdout/stderr를 다시 기록해야 한다.

## 범위 결정 근거
이번 follow-up은 실제 app-server smoke를 막는 JSON-RPC 계약 불일치와 검증 신뢰도 회복만 다룬다. smoke 스크립트 구조 개편, console 출력 포맷 변경, 기본 profile 재설계는 범위 밖이다.

## 빌드 등급
`cloud-G07`: 실제 `codex app-server` 프로세스와 Edge/Node smoke 검증이 포함되어 있고, 단위 테스트 통과 후 real profile smoke 실패를 진단해야 한다.

## 구현 체크리스트
- [ ] `thread/start` app-server 요청에 `params` 필드를 포함하도록 수정한다.
- [ ] fake app-server/unit test가 `thread/start`의 `params` 필드를 요구하고 누락 시 실패하도록 보강한다.
- [ ] `go test ./apps/node/internal/adapters/cli -run 'TestCodexAppServer.*' -count=1`를 실행하고 실제 출력 기록.
- [ ] `go test ./apps/node/... ./apps/edge/... -count=1`와 `./scripts/e2e-smoke.sh`를 실행하고 실제 출력 기록.
- [ ] `IOP_E2E_PROFILE=codex IOP_E2E_RUN_TIMEOUT=120 IOP_E2E_STATUS_TIMEOUT=120 ./scripts/e2e-smoke.sh`를 실행하고 실제 stdout/stderr를 기록한다.
- [ ] CODE_REVIEW-*-G??.md의 구현 에이전트 소유 섹션을 실제 구현 내용과 검증 출력으로 채운다. 이 항목이 완료되기 전에는 구현이 완료된 것이 아니다.

### [REVIEW_TEST-1] `thread/start` params 계약 수정
문제: 실제 Codex app-server가 `thread/start` 요청에 `params` 필드를 요구한다. 현재 코드는 `p.send(ctx, "thread/start", nil)`을 호출하고 `appServerRequest.Params`가 `omitempty`라 JSON에서 필드가 빠진다.

해결 방법: `thread/start`에 빈 object라도 `params`가 직렬화되도록 수정한다. 필요하면 `appServerRequest`의 omitempty 정책보다 호출부에서 `map[string]any{}`를 넘기는 방식으로 변경 범위를 최소화한다.

수정 파일 및 체크리스트:
- [ ] `apps/node/internal/adapters/cli/codex_app_server.go`
- [ ] `apps/node/internal/adapters/cli/codex_app_server_internal_test.go`

테스트 작성:
- [ ] `codexAppServerInit` fake server가 `thread/start` 요청의 `params` field 존재를 검증한다.
- [ ] `params` 누락이 다시 발생하면 관련 테스트가 실패한다.

중간 검증:
```bash
go test ./apps/node/internal/adapters/cli -run 'TestCodexAppServer.*' -count=1
```

### [REVIEW_TEST-2] 실제 `codex` smoke 증거 회복
문제: 이전 구현 기록은 실제 `codex` smoke 미실행을 외부 계정 리스크로 기록했지만, 리뷰 재현에서는 `codex` 바이너리가 있고 실패 원인은 app-server RPC 계약 오류였다.

해결 방법: 수정 후 real profile smoke를 다시 실행한다. auth/login/quota 같은 사용자 소유 blocker가 새로 드러나는 경우에만 `사용자 리뷰 요청`에 `command -v codex`, 실행 명령, 실제 stdout/stderr, blocker 근거, 재개 조건을 기록한다. `thread/start` params 오류가 남아 있으면 사용자 리뷰 요청이 아니라 구현 실패다.

수정 파일 및 체크리스트:
- [ ] `CODE_REVIEW-cloud-G07.md`
- [ ] 필요 시 `scripts/e2e-smoke.sh` (검증 분기 자체가 틀린 경우만)

테스트 작성:
- [ ] mock smoke가 계속 통과하는지 확인한다.
- [ ] real `codex` smoke가 app-server init을 통과해 start/delta-or-message/complete, `/sessions`, `/terminate-session` 결과를 남기는지 확인한다.

중간 검증:
```bash
command -v codex
IOP_E2E_PROFILE=codex IOP_E2E_RUN_TIMEOUT=120 IOP_E2E_STATUS_TIMEOUT=120 ./scripts/e2e-smoke.sh
```

## 최종 검증
```bash
test -f agent-task/archive/2026/06/m-codex-app-server-streaming-migration/03+02_default_profile/complete.log
go test ./apps/node/internal/adapters/cli -run 'TestCodexAppServer.*' -count=1
go test ./apps/node/... ./apps/edge/... -count=1
./scripts/e2e-smoke.sh
IOP_E2E_PROFILE=codex IOP_E2E_RUN_TIMEOUT=120 IOP_E2E_STATUS_TIMEOUT=120 ./scripts/e2e-smoke.sh
```

## 수정 파일 요약
| 파일 | 항목 |
| --- | --- |
| `apps/node/internal/adapters/cli/codex_app_server.go` | REVIEW_TEST-1 |
| `apps/node/internal/adapters/cli/codex_app_server_internal_test.go` | REVIEW_TEST-1 |
| `CODE_REVIEW-cloud-G07.md` | REVIEW_TEST-2 |
| `scripts/e2e-smoke.sh` | REVIEW_TEST-2, 필요 시 |

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