<!-- task=m-openai-compatible-raw-tunnel-sideband-passthrough/01_node_relay plan=2 tag=REVIEW_REVIEW_API -->

# Plan - REVIEW_REVIEW_API

## 이 파일을 읽는 구현 에이전트에게

`CODE_REVIEW-local-G04.md`의 구현 에이전트 소유 섹션을 채우는 것이 구현의 마지막 단계다. 검증 명령은 실제로 실행하고 stdout/stderr를 붙인다. 선택된 Milestone `구현 잠금 > 결정 필요` 항목이 실구현을 막을 때만 review stub의 `사용자 리뷰 요청`을 채우고, 사용자에게 직접 질문하지 않는다. 환경/secret/service blocker나 evidence gap은 사용자 리뷰가 아니라 검증 결과 또는 follow-up으로 기록한다.

## 배경

이 follow-up은 `node-relay`의 두 번째 FAIL 리뷰를 닫기 위한 좁은 test/evidence 보강 작업이다. error/cancel ordered ERROR semantics와 duplicate Node ERROR 방지는 통과했지만, SDD S03이 요구한 Gemma content/tool-call raw byte comparison fixture가 `TunnelProvider` 테스트에 없다.

## 사용자 리뷰 요청 흐름

사용자 리뷰 요청은 선택된 Milestone lock decision이 실구현을 차단할 때만 active review stub에 기록한다. 직접 채팅 질문, 선택지 제시, `request_user_input`, `USER_REVIEW.md` 작성, archive/complete.log 작성은 금지한다.

## Roadmap Targets

- Milestone: `agent-roadmap/phase/routing-policy-model-orchestration/milestones/openai-compatible-raw-tunnel-sideband-passthrough.md`
- Milestone link: [Milestone 문서](agent-roadmap/phase/routing-policy-model-orchestration/milestones/openai-compatible-raw-tunnel-sideband-passthrough.md)
- Task ids:
  - `node-relay`: Node는 OpenAI-compatible provider HTTP/SSE response를 열고 provider가 보낸 chunk를 tunnel frame으로 relay한다.
- Completion mode: check-on-pass

## Archive Evidence Snapshot

- Archived plan: `agent-task/m-openai-compatible-raw-tunnel-sideband-passthrough/01_node_relay/plan_local_G07_1.log`
- Archived review: `agent-task/m-openai-compatible-raw-tunnel-sideband-passthrough/01_node_relay/code_review_local_G07_1.log`
- Verdict: FAIL
- Required summary:
  - R1: SDD S03과 원 plan의 Gemma content/tool-call raw byte comparison evidence가 `TunnelProvider` 테스트에 없다.
- Affected files:
  - `apps/node/internal/adapters/vllm/vllm_test.go`
- Verification evidence from review:
  - `gofmt -l ...` was empty after review-agent formatting repair.
  - `git diff --check` PASS.
  - `go test -count=1 ./apps/node/internal/transport ./apps/node/internal/node ./apps/node/internal/adapters/openai_compat ./apps/node/internal/adapters/vllm` PASS.
  - `go test -count=1 ./apps/edge/internal/transport ./proto/gen/iop` PASS.
  - `make proto` PASS.
- Roadmap carryover: `node-relay` remains incomplete until S03 Gemma content/tool-call raw byte fixture evidence is present.
- Narrow archive reread allowed if needed: the archived plan/review files listed above, plus prior `plan_local_G07_0.log` only for the original S02/S03 fixture wording.

## 범위 결정 근거

- 포함: `TunnelProvider` raw byte relay test fixture for Gemma-style content/tool-call chunks and exact body byte comparison evidence.
- 제외: production relay behavior changes unless the new test exposes a real bug, Edge OpenAI HTTP passthrough integration, response mode parsing, sideband/transformed mode, external provider field smoke.
- `USER_REVIEW.md`는 만들지 않는다. 문제는 deterministic unit test evidence로 해소 가능하다.

## 구현 체크리스트

- [ ] `apps/node/internal/adapters/vllm/vllm_test.go`의 raw tunnel success coverage에 Gemma-style content/tool-call SSE chunks fixture를 추가한다.
- [ ] 추가 fixture가 `ProviderTunnelFrame.body` concatenation과 원본 provider bytes의 exact equality를 검증하게 한다.
- [ ] `gofmt -l apps/node/internal/adapters/vllm/vllm_test.go`를 실행하고 출력이 비어 있음을 기록한다.
- [ ] `go test -count=1 ./apps/node/internal/adapters/vllm -run 'TestVllmTunnelProvider'`를 실행한다.
- [ ] `go test -count=1 ./apps/node/internal/transport ./apps/node/internal/node ./apps/node/internal/adapters/openai_compat ./apps/node/internal/adapters/vllm`를 실행한다.
- [ ] CODE_REVIEW-*-G??.md의 구현 에이전트 소유 섹션을 실제 구현 내용과 검증 출력으로 채운다. 이 항목이 완료되기 전에는 구현이 완료된 것이 아니다.

### [REVIEW_REVIEW_API-1] S03 Gemma Tool-Call Raw Fixture

문제: `TestVllmTunnelProvider`는 content-only SSE body를 raw relay하는지만 검증한다. SDD S03과 원 plan은 Gemma content/tool-call chunk가 parser/normalization 없이 raw tunnel frame body로 byte-identical하게 전달되는 증거를 요구한다.

해결 방법:

- 기존 `TestVllmTunnelProvider`를 table-driven fixture로 확장하거나 새 `TestVllmTunnelProvider_GemmaContentToolCallRawBytes` 테스트를 추가한다.
- fixture에는 최소한 content chunk와 split `tool_calls` arguments chunk, `[DONE]` marker를 포함한다.
- 테스트는 `frames[1:len(frames)-1]` body concatenation이 fixture string과 정확히 같은지 확인하고, frame kind/sequence/end checks를 유지한다.
- behavior code 변경은 새 테스트가 실패할 때만 최소로 수행한다.

수정 파일 및 체크리스트:

- [ ] `apps/node/internal/adapters/vllm/vllm_test.go`

중간 검증:

```bash
go test -count=1 ./apps/node/internal/adapters/vllm -run 'TestVllmTunnelProvider'
```

## 수정 파일 요약

| 파일 | 항목 |
|------|------|
| `apps/node/internal/adapters/vllm/vllm_test.go` | REVIEW_REVIEW_API-1 |

## 최종 검증

```bash
gofmt -l apps/node/internal/adapters/vllm/vllm_test.go
go test -count=1 ./apps/node/internal/transport ./apps/node/internal/node ./apps/node/internal/adapters/openai_compat ./apps/node/internal/adapters/vllm
```

기대 결과: `gofmt -l` 출력 없음, Go tests PASS. 모든 코드 변경 완료 후 반드시 `CODE_REVIEW-*-G??.md`의 구현 에이전트 소유 섹션을 채운다. 이 파일 작성이 구현의 마지막 단계다.
