<!-- task=m-codex-app-server-streaming-migration/02+01_session_events plan=2 tag=REVIEW_REVIEW_REFACTOR -->
# Codex App Server Turn Start Request Follow-up Plan

## 이 파일을 읽는 구현 에이전트에게
이 PLAN을 끝까지 읽은 뒤 구현한다. 이 작업은 `code_review_cloud_G07_1.log`의 Required 이슈만 해결한다. 사용자 결정, 사용자 소유 외부 환경/secret/서비스 준비, 또는 plan 범위 변경이 필요한 경우에만 `CODE_REVIEW-cloud-G07.md`의 `사용자 리뷰 요청` 섹션을 실제 내용으로 채우고 중단한다. 직접 사용자에게 질문하거나 선택지를 제시하지 않는다.

## 배경
이전 follow-up은 app-server 응답과 notification shape를 바로잡았지만, `turn/start` 요청의 `input` payload가 실제 `TurnStartParams`/`UserInput` 계약과 아직 다르다. `TurnStartParams.input`은 필수이고 text `UserInput`에는 `text_elements`가 필수다.

## Roadmap Targets

- Milestone: `agent-roadmap/phase/automation-runtime-bridge/milestones/codex-app-server-streaming-migration.md`
- Task ids:
  - `session-thread`: IOP `session_id`별 app-server thread를 재사용하고 `/terminate-session`에서 해당 세션을 정리한다.
  - `event-map`: `item/agentMessage/delta`를 `RuntimeEvent{Type: delta}`로 전달하고, `turn/completed`는 complete, app-server error와 failed turn은 error로 매핑한다.
- Completion mode: check-on-pass

## 범위 결정 근거
새 app-server 동작 추가가 아니라 기존 `turn/start` request builder를 실제 protocol contract에 맞추는 보정 작업이다. 기본 profile 전환과 실제 smoke는 sibling subtask 범위에 둔다.

## 구현 체크리스트
- [ ] `turn/start` request가 `input`을 항상 포함하고 text item에 `text_elements: []`를 포함하도록 수정한다.
- [ ] `codexAppServerTurnStart` 요청 capture 테스트를 추가해 `threadId`, `input[0].type`, `input[0].text`, `input[0].text_elements`를 검증한다.
- [ ] 빈 prompt일 때의 request shape도 실제 계약에 맞는지 테스트 또는 명시적 설계 결정으로 검증한다.
- [ ] CODE_REVIEW-*-G??.md의 구현 에이전트 소유 섹션을 실제 구현 내용과 검증 출력으로 채운다. 이 항목이 완료되기 전에는 구현이 완료된 것이 아니다.

### [REVIEW_REVIEW_REFACTOR-1] `turn/start` request input shape 보정
문제: `codexAppServerTurnStart`는 prompt가 있으면 `{"type":"text","text":prompt}`만 보내고, prompt가 없으면 `input`을 생략한다. 실제 `/tmp/iop-codex-appserver-ts/v2/TurnStartParams.ts`는 `input`을 필수로 정의하고, `/tmp/iop-codex-appserver-ts/v2/UserInput.ts`의 text variant는 `text_elements`를 필수로 정의한다.

해결 방법: request builder가 `input`을 항상 계약에 맞는 배열로 구성하게 한다. prompt가 비어 있을 때도 app-server가 받아들일 명시적 shape를 선택하고 테스트에 고정한다. text input에는 최소 `{"type":"text","text":prompt,"text_elements":[]}`를 사용한다.

수정 파일:
- `apps/node/internal/adapters/cli/codex_app_server.go`
- `apps/node/internal/adapters/cli/codex_app_server_internal_test.go`

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

## 최종 검증
```bash
test -f agent-task/archive/2026/06/m-codex-app-server-streaming-migration/01_appserver_rpc_client/complete.log
go test ./apps/node/internal/adapters/cli -run 'TestCodexAppServer' -count=1
go test ./apps/node/internal/adapters/cli -count=1
go test ./apps/node/... -count=1
```

## 리뷰어 체크포인트
- `/tmp/iop-codex-appserver-ts/v2/TurnStartParams.ts`와 `/tmp/iop-codex-appserver-ts/v2/UserInput.ts`의 필수 필드가 request capture 테스트에 반영됐는지 확인한다.
- `turn/start` response shape와 notification mapping 회귀 테스트가 그대로 통과하는지 확인한다.
- 이번 follow-up이 `turn/start` request shape 밖의 동작을 불필요하게 바꾸지 않았는지 확인한다.
