<!-- task=m-external-integration/01_iop_responses_surface plan=2 tag=REVIEW_REVIEW_IOP_RESP -->

# Plan: Review Follow-up - Restore OpenAI Smoke Contract

## 작업 범위

이 follow-up은 `code_review_cloud_G07_1.log`의 Required 이슈만 닫는다. IOP flat metadata parser 자체는 통과했으므로 유지하고, 현재 IOP 작업트리에서 축소된 `iop-edge smoke openai` command 계약과 실패하는 `scripts/e2e-openai-ollama.sh` evidence를 복구한다.

## Roadmap Targets

- Milestone: `agent-roadmap/phase/external-integration/milestones/external-integration.md`
- 완료 대상 Task id: 없음. 이 subtask는 선행 IOP 표면 구현이며, 최종 `[iop-responses]` 체크는 `02+01_nomadcode_core_iop_smoke`에서 원격 Core enqueue smoke까지 통과한 뒤 주장한다.

## 범위 결정 근거

- `agent-test/local/edge-smoke.md`는 OpenAI-compatible 경계 변경 시 `/healthz`, `/v1/models`, `/v1/chat/completions`, `/v1/responses` 확인을 요구한다.
- 현재 IOP diff는 `apps/edge/internal/edgecmd/smoke_openai.go`에서 chat completions smoke를 제거하고 `apps/edge/cmd/edge/main_test.go`의 기대값도 three-step으로 줄였다.
- 그 결과 `scripts/e2e-openai-ollama.sh`는 실제 재실행에서 exit 1로 실패한다. trace상 `iop-edge smoke openai` 출력에서 `Step 4: Checking /v1/responses ... [OK]`를 찾지 못한다.
- 이 follow-up은 smoke command/test/e2e evidence 복구만 다룬다. flat `metadata.task_id/source` alias parser와 NomadCode Core flat metadata 송신 코드는 되돌리지 않는다.

## 구현 계획

1. `/config/workspace/iop`의 작업트리를 먼저 확인하고 unrelated 변경은 건드리지 않는다.
2. `apps/edge/internal/edgecmd/smoke_openai.go`에서 `iop-edge smoke openai`를 four-step diagnostics로 복원한다.
3. Step 3에서 `/v1/chat/completions` non-streaming request를 보내고, non-empty assistant content를 검증한다.
4. Step 4에서 `/v1/responses` non-streaming request를 유지한다. 가능하면 Responses command payload에도 flat `metadata.task_id/source` alias를 넣어 command smoke가 같은 compatibility shape를 직접 덮게 한다.
5. `apps/edge/cmd/edge/main_test.go`에서 success output expectation을 Step 3 chat + Step 4 responses로 되돌리고, chat completions non-200 및 empty assistant content failure coverage를 복원한다.
6. `scripts/e2e-openai-ollama.sh`는 direct curl의 flat NomadCode metadata payload를 유지하고, command smoke Step 4 assertion이 실제 출력과 맞는지 확인한다. Step 4 assertion을 단순히 Step 3으로 낮춰 실패를 숨기지 않는다.
7. active `CODE_REVIEW-cloud-G07.md`의 구현 에이전트 소유 섹션에 실제 변경, 검증 출력, 남은 위험을 기록한다.

## 구현 체크리스트

- [ ] IOP `iop-edge smoke openai` again verifies `/healthz`, `/v1/models`, `/v1/chat/completions`, and `/v1/responses` in that order, keeping Responses as Step 4.
- [ ] `apps/edge/cmd/edge/main_test.go` restores chat completions success output and failure coverage while retaining Responses success/failure coverage.
- [ ] `scripts/e2e-openai-ollama.sh` passes with flat NomadCode metadata in the direct Responses request and the command-smoke Step 4 assertion.
- [ ] Flat metadata alias parser/test behavior from `code_review_cloud_G07_1.log` remains intact.
- [ ] IOP edge command/openai/service tests, IOP edge package tests, IOP OpenAI Ollama smoke, and NomadCode core adapter/scheduler tests are rerun with actual stdout/stderr recorded.
- [ ] CODE_REVIEW-*-G??.md의 구현 에이전트 소유 섹션을 실제 구현 내용과 검증 출력으로 채운다. 이 항목이 완료되기 전에는 구현이 완료된 것이 아니다.

## 검증 계획

- `cd /config/workspace/iop && go test -count=1 ./apps/edge/internal/edgecmd ./apps/edge/cmd/edge`
- `cd /config/workspace/iop && go test -count=1 ./apps/edge/internal/openai ./apps/edge/internal/service`
- `cd /config/workspace/iop && go test -count=1 ./apps/edge/...`
- `cd /config/workspace/iop && ./scripts/e2e-openai-ollama.sh`
- `cd /config/workspace/nomadcode/services/core && go test -count=1 ./internal/adapters/openai ./internal/scheduler`

## 위험과 주의점

- chat completions smoke 복원은 기존 OpenAI-compatible baseline 회귀 방지용이다. `/v1/responses` 추가 검증을 제거하거나 약화하지 않는다.
- smoke output step number를 바꿔서 script만 통과시키는 방식은 이번 Required 이슈를 닫지 못한다.
- flat metadata alias 지원과 structured metadata precedence는 유지해야 한다.
- NomadCode Core remote enqueue smoke 완료는 계속 dependent subtask `02+01_nomadcode_core_iop_smoke` 범위다.
