<!-- task=m-api-centered-proto-socket-rail/03+01_client_api_wrappers plan=2 tag=REVIEW_CLIENT_VERIFY -->
# PLAN-cloud-G07: Client Wrapper Verification Closeout

## 이 파일을 읽는 구현 에이전트에게
이 계획은 `USER_REVIEW.md` 이후 사용자 결정에 따라 자동 follow-up을 재개하는 검증 closeout 작업이다. 코드 변경은 기본적으로 하지 않는다. 검증 후 반드시 active `CODE_REVIEW-cloud-G07.md`의 구현 에이전트 소유 섹션을 실제 결과와 stdout/stderr 근거로 채우고, active 파일을 그대로 둔 채 리뷰를 요청한다. finalization, log rename, `complete.log`, archive 이동은 code-review 전용이다.

## 배경
이전 루프에서 client API wrapper와 error-path test는 구현됐다. 남은 문제는 raw `flutter analyze`가 기존 Mattermost info로 실패한 것과 Android emulator smoke가 debug connection/log reader 계층에서 멈춘 것을 어떻게 closeout evidence로 기록할지다. 사용자는 추가 결정 없이 이어서 작업하라고 했으므로, repo 표준 검증과 통제된 Android 재시도 결과를 근거로 리뷰 가능 상태를 만든다.

## 사용자 리뷰 요청 흐름
이번 follow-up은 사용자 결정 없이 진행한다. 새 user-only blocker가 발견될 때만 `CODE_REVIEW-cloud-G07.md`의 `사용자 리뷰 요청` 섹션을 구체적 증거와 재개 조건으로 채운다.

## 분석 결과

### 읽은 파일
- `agent-task/m-api-centered-proto-socket-rail/03+01_client_api_wrappers/user_review_0.log`
- `agent-task/m-api-centered-proto-socket-rail/03+01_client_api_wrappers/plan_cloud_G07_1.log`
- `agent-task/m-api-centered-proto-socket-rail/03+01_client_api_wrappers/code_review_cloud_G07_1.log`
- `apps/client/test/integrations/socket/alt_socket_client_test.dart`
- `apps/client/lib/src/integrations/socket/alt_socket_client.dart`
- `apps/client/integration_test/socket_runtime_smoke_test.dart`
- `apps/client/test_runtime/socket_web_runtime_smoke_test.dart`
- `agent-ops/rules/private/testing-env.md`
- `agent-test/local/rules.md`
- `agent-test/local/client-smoke.md`
- `agent-roadmap/phase/operator-surface/PHASE.md`
- `agent-roadmap/phase/operator-surface/milestones/api-centered-proto-socket-rail.md`

### 테스트 커버리지 공백
- Focused wrapper test: 원격에서 통과 확인됨, `00:00 +13: All tests passed!`
- Full Flutter test: 원격에서 통과 확인됨, `00:01 +22: All tests passed!`
- Web runtime smoke: 원격에서 통과 확인됨, `00:00 +1: All tests passed!`
- Repo lint entrypoint: 원격 `bin/lint` 통과 확인됨. 기존 Mattermost `avoid_print` info 13건은 출력되지만 `--no-fatal-infos` 정책으로 exit 0이다.
- Android emulator smoke: 앱 빌드/설치 후 debug connection/log reader failure. controlled retry 결과가 아직 없다.

### 심볼 참조
- renamed/removed symbol: none.
- 새 wrapper surface: `AltSocketClient.startBacktest`, `AltSocketClient.listInstruments`, `AltSocketClient.listBars`.

### 분할 판단
split decision policy를 재평가했다. 이 작업은 같은 subtask의 검증 closeout만 다루며 새 API, schema, runtime code 변경이 없으므로 기존 split task `03+01_client_api_wrappers` 안의 단일 follow-up으로 충분하다.

### 범위 결정 근거
- `services/api/**`, `services/worker/**`, protobuf schema source, generated Dart outputs는 수정하지 않는다.
- raw `flutter analyze`의 Mattermost `avoid_print` info는 이번 client wrapper 변경 범위 밖이다. repo 표준 entrypoint인 `bin/lint` 통과를 lint evidence로 사용한다.
- Android smoke는 wrapper 코드 correctness보다 원격 emulator/debug connection health에 가까운 실패다. 한 번 더 통제된 방식으로 재시도하되, 같은 debug connection failure면 비차단 잔여 위험으로 기록한다.

### 빌드 등급
- Build lane: `cloud-G07`
- Review lane: `cloud-G07`
- 근거: verification trust 회복과 원격 Flutter/Web/Android smoke evidence 판단이 핵심이며 이전 루프가 verification Fail이었다.

## 구현 체크리스트
- [ ] [REVIEW_CLIENT_VERIFY-1] 원격 검증 evidence를 `CODE_REVIEW-cloud-G07.md`에 실제 stdout/stderr 기반으로 정리한다.
- [ ] [REVIEW_CLIENT_VERIFY-2] Android emulator smoke를 통제된 방식으로 재시도하고, 통과 또는 debug connection failure를 closeout 판단 근거로 기록한다.
- [ ] CODE_REVIEW-*-G??.md의 구현 에이전트 소유 섹션을 실제 구현 내용과 검증 출력으로 채운다. 이 항목이 완료되기 전에는 구현이 완료된 것이 아니다.

### [REVIEW_CLIENT_VERIFY-1] Remote verification evidence 정리
문제:
`user_review_0.log`에는 focused/all tests, web smoke, `bin/lint`가 통과했다는 실제 원격 결과와 raw `flutter analyze`의 기존 Mattermost info가 기록되어 있다. active review에는 이 evidence를 reviewable한 형태로 옮겨야 한다.

해결 방법:
`CODE_REVIEW-cloud-G07.md`에 이미 확보한 결과를 명령별로 기록한다. raw `flutter analyze`는 실패로 기록하되, 이번 task의 lint gate는 project entrypoint `bin/lint` 통과로 판단한다고 명시한다.

수정 파일 및 체크리스트:
- `agent-task/m-api-centered-proto-socket-rail/03+01_client_api_wrappers/CODE_REVIEW-cloud-G07.md`
- [ ] focused wrapper test 통과 출력 요약과 command를 기록한다.
- [ ] full Flutter test 통과 출력 요약과 command를 기록한다.
- [ ] `bin/lint` 통과와 raw `flutter analyze`의 기존 info 차이를 기록한다.
- [ ] web runtime smoke 통과 출력 요약과 command를 기록한다.

테스트 작성:
- 코드 테스트 추가 없음. 기존 추가 테스트와 원격 검증 evidence를 정리한다.

중간 검증:
- 원격 검증 환경은 `agent-ops/rules/private/testing-env.md` 기준으로 사용한다.
- 필요한 경우 원격에서 `bin/lint`, `cd apps/client && flutter test`, `cd apps/client && dart run test -p chrome test_runtime/socket_web_runtime_smoke_test.dart --timeout 30s`를 재실행해 최신 stdout/stderr를 확보한다.

### [REVIEW_CLIENT_VERIFY-2] Android smoke controlled retry
문제:
이전 Android smoke는 앱 빌드/설치 뒤 `No tests ran. Error waiting for a debug connection: The log reader stopped unexpectedly`로 종료됐다. 이는 wrapper 로직 실패라기보다 emulator/debug connection failure에 가깝지만, 한 번 더 통제된 재시도 근거가 필요하다.

해결 방법:
원격 host에서 stale test/logcat 프로세스가 없는지 확인한 뒤 Android smoke를 재시도한다. 통과하면 PASS evidence로 기록한다. 같은 debug connection/log reader failure가 반복되면 실행 명령, 출력, cleanup 결과를 기록하고 이번 wrapper task의 비차단 잔여 위험으로 남긴다.

수정 파일 및 체크리스트:
- `agent-task/m-api-centered-proto-socket-rail/03+01_client_api_wrappers/CODE_REVIEW-cloud-G07.md`
- [ ] stale `flutter test -d emulator-5554` / `adb ... logcat` 프로세스가 없는지 확인한다.
- [ ] Android smoke를 재시도한다.
- [ ] 통과 또는 debug connection failure의 실제 stdout/stderr를 기록한다.
- [ ] 실패 시 wrapper 코드 실패가 아닌 debug connection 계층 실패로 보는 근거를 기록한다.

테스트 작성:
- 코드 테스트 추가 없음. runtime smoke 재시도만 수행한다.

중간 검증:
- 원격 host에서 `flutter devices`와 `adb devices -l`로 `emulator-5554` 상태를 확인한다.
- 원격 host의 `apps/client`에서 다음 명령을 실행한다:
```bash
flutter test -d emulator-5554 integration_test/socket_runtime_smoke_test.dart \
  --dart-define=ALT_SOCKET_HOST=10.0.2.2 \
  --dart-define=ALT_SOCKET_PORT=13000 \
  --dart-define=ALT_SOCKET_PATH=/socket
```
- 명령이 설치 후 장시간 무출력으로 멈추면 원격 프로세스를 정리하고 실제 종료 출력 또는 cleanup 결과를 기록한다.

## 수정 파일 요약
| 파일 | 항목 |
|------|------|
| `agent-task/m-api-centered-proto-socket-rail/03+01_client_api_wrappers/CODE_REVIEW-cloud-G07.md` | REVIEW_CLIENT_VERIFY-1, REVIEW_CLIENT_VERIFY-2 |

## 최종 검증
- 원격 검증 환경에서 `cd apps/client && flutter test test/integrations/socket/alt_socket_client_test.dart`
- 원격 검증 환경에서 `cd apps/client && flutter test`
- 원격 검증 환경에서 `bin/lint`
- 원격 검증 환경에서 `cd apps/client && dart run test -p chrome test_runtime/socket_web_runtime_smoke_test.dart --timeout 30s`
- 원격 검증 환경에서 가능한 경우 Android smoke controlled retry를 실행하고 결과를 기록한다.
모든 코드 변경 완료 후 반드시 `CODE_REVIEW-*-G??.md`의 구현 에이전트 소유 섹션을 채운다. 이 파일 작성이 구현의 마지막 단계다.
