<!-- task=m-socket-session-loop/01_client_socket_layer plan=3 tag=REVIEW_REVIEW_REVIEW_API -->

# Plan - REVIEW_REVIEW_REVIEW_API

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

`CODE_REVIEW-*-G??.md`의 구현 에이전트 소유 섹션을 채우는 것이 필수 마지막 단계다. 구현 후 검증을 실행하고 실제 출력, 계획 대비 변경, 설계 결정을 review stub에 기록한 뒤 active 파일을 유지하고 리뷰 준비를 보고한다. 사용자 결정, 외부 환경 준비, 범위 충돌 없이는 안전하게 진행할 수 없으면 review stub의 `사용자 리뷰 요청`에 정확한 증거를 남기고 중단한다. `USER_REVIEW.md`, archive, `complete.log` 작성은 code-review 전용이다.

## 배경

세 번째 리뷰도 `FAIL`이다. `protoc-gen-dart`, generation script, Dart/Flutter 분석과 테스트는 재현되었지만, G07 review stub의 verification evidence가 실제 재실행과 일치하지 않았다. 이번 후속은 소스 코드 변경보다 검증 기록의 사실성만 좁게 복구한다.

## 사용자 리뷰 요청 흐름

구현 중 차단 조건은 active `CODE_REVIEW-*-G??.md`의 `사용자 리뷰 요청` 섹션에 기록한다. code-review가 그 내용을 검증해 실제 `USER_REVIEW.md` 작성 여부를 결정한다.

## 분석 결과

### 읽은 파일

- `agent-task/m-socket-session-loop/01_client_socket_layer/code_review_cloud_G07_2.log`
- `agent-task/m-socket-session-loop/01_client_socket_layer/plan_cloud_G07_2.log`
- `../proto-socket/tools/generate_proto.sh`
- `apps/client/test/integrations/socket/alt_socket_client_test.dart`

### 실패 근거

- `rg -n "\\.\\.\\.|agent-ta##" agent-task/m-socket-session-loop/01_client_socket_layer/CODE_REVIEW-cloud-G07.md`가 실제로는 다수의 `...` 매치를 반환했지만, review stub은 `No matching lines found`라고 기록했다.
- `protoc-gen-dart --version`은 실제로 binary protobuf response bytes를 stdout에 쓰는데, review stub에는 실제 stdout/stderr 대신 설명문이 들어갔다.
- 코드/패키지 변경 자체는 현재 재실행한 검증에서 통과했다. 후속 범위는 verification trust 복구다.

### 빌드 등급

- build: `cloud-G07`, review: `cloud-G07`.
- verification trust 반복 실패이며 명령 출력/exit-status 계약을 다루므로 G07을 유지한다.

## 구현 체크리스트

- [ ] `protoc-gen-dart --version`의 실제 출력을 binary-safe 방식으로 기록한다. 검증: `command -v protoc-gen-dart`, `protoc-gen-dart --version >/tmp/protoc-gen-dart-version.bin; status=$?; wc -c /tmp/protoc-gen-dart-version.bin; xxd -g1 /tmp/protoc-gen-dart-version.bin; exit $status`.
- [ ] `...` 검증을 실제 목적에 맞게 고친다. Flutter runner가 출력한 `...`는 허용하고, 수동 축약을 금지하는 더 구체적인 검증과 그 근거를 `CODE_REVIEW-cloud-G07.md`에 기록한다. 검증: `rg -n "^\\s*\\.\\.\\.\\s*$|\\(output\\)|agent-ta##" agent-task/m-socket-session-loop/01_client_socket_layer/CODE_REVIEW-cloud-G07.md`.
- [ ] 최종 검증으로 generation, Dart, Flutter 명령을 재실행하고 출력은 실제 stdout/stderr와 일치하게 기록한다. 검증: `cd ../proto-socket && tools/generate_proto.sh`, `cd ../proto-socket/dart && dart analyze`, `cd ../proto-socket/dart && dart test`, `cd ../proto-socket/dart && dart compile js test/browser_ws_import_compile.dart -o /tmp/proto_socket_browser_ws_import_compile.js`, `cd apps/client && flutter test`, `cd apps/client && flutter analyze --no-fatal-infos`, `cd apps/client && flutter build web`.
- [ ] CODE_REVIEW-*-G??.md의 구현 에이전트 소유 섹션을 실제 구현 내용과 검증 출력으로 채운다. 이 항목이 완료되기 전에는 구현이 완료된 것이 아니다.

### [REVIEW_REVIEW_REVIEW_API-1] Record binary plugin output faithfully

문제: `protoc-gen-dart --version`은 사람이 읽는 version string을 출력하지 않는다. 이전 stub은 command가 성공한 설명으로 대체했지만, 실제 stdout/stderr와 다르다.

해결 방법:

- exact command는 exit status를 보존하면서 stdout을 `/tmp/protoc-gen-dart-version.bin`에 저장한다.
- `wc -c`와 `xxd -g1`로 stdout bytes를 사람이 검토 가능한 형태로 함께 기록한다.
- stderr가 있으면 같이 기록한다.

수정 파일 및 체크리스트:

- [ ] `agent-task/m-socket-session-loop/01_client_socket_layer/CODE_REVIEW-cloud-G07.md`

테스트 작성: 새 테스트 없음. command evidence 복구 작업이다.

중간 검증:

```bash
command -v protoc-gen-dart
protoc-gen-dart --version >/tmp/protoc-gen-dart-version.bin; status=$?; wc -c /tmp/protoc-gen-dart-version.bin; xxd -g1 /tmp/protoc-gen-dart-version.bin; exit $status
```

기대 결과: `command -v`는 실행 파일 경로를 출력하고, 두 번째 command는 exit 0과 byte dump를 기록한다.

### [REVIEW_REVIEW_REVIEW_API-2] Replace false ellipsis check

문제: `rg -n "\\.\\.\\.|agent-ta##"`는 Flutter test runner가 실제로 출력하는 축약 path/test description까지 잡는다. 이전 stub은 이 명령이 no-match라고 잘못 기록했다.

해결 방법:

- `...`가 실제 test runner output인지 수동 축약인지 구분한다.
- 수동 축약 placeholder는 단독 `...`, `(output)`, 손상 문자열 `agent-ta##` 위주로 검사한다.
- review stub에 왜 Flutter runner의 `...`는 허용했는지 짧게 기록한다.

수정 파일 및 체크리스트:

- [ ] `agent-task/m-socket-session-loop/01_client_socket_layer/CODE_REVIEW-cloud-G07.md`

테스트 작성: 새 테스트 없음.

중간 검증:

```bash
rg -n "^\\s*\\.\\.\\.\\s*$|\\(output\\)|agent-ta##" agent-task/m-socket-session-loop/01_client_socket_layer/CODE_REVIEW-cloud-G07.md
```

기대 결과: 구현 완료 후 아무 결과도 출력하지 않는다.

### [REVIEW_REVIEW_REVIEW_API-3] Re-run final verification

문제: 이전 스텁의 코드 검증은 대체로 통과했지만, verification trust 문제를 닫으려면 이번 active stub 기준으로 다시 실제 출력이 필요하다.

해결 방법:

- generation, Dart, Flutter 명령을 재실행한다.
- output은 test runner가 낸 그대로 붙이고 수동 축약하지 않는다.
- command가 길어도 `All tests passed`, `No issues found`, build success line까지 보존한다.

수정 파일 및 체크리스트:

- [ ] `agent-task/m-socket-session-loop/01_client_socket_layer/CODE_REVIEW-cloud-G07.md`

테스트 작성: 새 테스트 없음.

중간 검증:

```bash
cd ../proto-socket && tools/generate_proto.sh
cd ../proto-socket/dart && dart analyze
cd ../proto-socket/dart && dart test
cd ../proto-socket/dart && dart compile js test/browser_ws_import_compile.dart -o /tmp/proto_socket_browser_ws_import_compile.js
cd apps/client && flutter test
cd apps/client && flutter analyze --no-fatal-infos
cd apps/client && flutter build web
```

기대 결과: 모든 명령이 exit 0이고 실제 출력이 review stub에 남는다.

## 수정 파일 요약

| 파일 | 항목 |
|------|------|
| `agent-task/m-socket-session-loop/01_client_socket_layer/CODE_REVIEW-cloud-G07.md` | REVIEW_REVIEW_REVIEW_API-1, REVIEW_REVIEW_REVIEW_API-2, REVIEW_REVIEW_REVIEW_API-3 |

## 최종 검증

```bash
command -v protoc-gen-dart
protoc-gen-dart --version >/tmp/protoc-gen-dart-version.bin; status=$?; wc -c /tmp/protoc-gen-dart-version.bin; xxd -g1 /tmp/protoc-gen-dart-version.bin; exit $status
rg -n "^\\s*\\.\\.\\.\\s*$|\\(output\\)|agent-ta##" agent-task/m-socket-session-loop/01_client_socket_layer/CODE_REVIEW-cloud-G07.md
cd ../proto-socket && tools/generate_proto.sh
cd ../proto-socket/dart && dart analyze
cd ../proto-socket/dart && dart test
cd ../proto-socket/dart && dart compile js test/browser_ws_import_compile.dart -o /tmp/proto_socket_browser_ws_import_compile.js
cd apps/client && flutter test
cd apps/client && flutter analyze --no-fatal-infos
cd apps/client && flutter build web
```

기대 결과: `rg`는 no output/exit 1일 수 있으므로 no-match를 성공 조건으로 기록하고, 나머지는 exit 0이다.

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