<!-- task=m-paper-trading-readiness/03+01,02_contract_api_cli_monitoring plan=1 tag=REVIEW_PAPER_MONITOR -->

# Plan - REVIEW_PAPER_MONITOR

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

이 plan은 직전 code review의 Required 이슈만 고치는 follow-up이다. 범위를 넓히지 말고 Flutter client contract parser map과 해당 테스트만 수정한다.

구현 완료의 마지막 단계는 active `CODE_REVIEW-*-G??.md`의 구현 에이전트 소유 섹션을 실제 구현 내용과 검증 출력으로 채우는 것이다. 검증 명령을 실행하고 실제 stdout/stderr를 붙여 넣은 뒤 active 파일을 그대로 두고 리뷰 준비를 보고한다. 최종 판정, log rename, `complete.log`, archive 이동은 code-review-skill 전용이다.

구현 중 사용자 결정, 사용자 소유 외부 환경/secret/서비스 준비, 또는 범위 충돌 없이는 안전하게 진행할 수 없으면 review stub의 `사용자 리뷰 요청` 섹션을 증거와 함께 채우고 중단한다. 사용자에게 직접 질문하거나 선택지를 제시하지 않는다.

## 배경

직전 구현은 paper trading protobuf/API/worker/CLI surface를 추가했고 `bin/contracts-gen`으로 Dart generated 파일도 생성했다. 그러나 Flutter client의 `altParserMap()`은 새 paper generated messages를 등록하지 않아, client socket parser가 paper response type을 decode할 수 없다. 이 follow-up은 contract parser map과 그 테스트만 맞춘다.

## Roadmap Targets

- Milestone: `agent-roadmap/phase/trading-expansion/milestones/paper-trading-readiness.md`
- Task ids:
  - `paper-monitor`: API/command workflow에서 paper state를 모니터링할 수 있다.
- Completion mode: check-on-pass

## 분석 결과

- Archived review: `agent-task/m-paper-trading-readiness/03+01,02_contract_api_cli_monitoring/code_review_cloud_G07_0.log`
- Archived plan: `agent-task/m-paper-trading-readiness/03+01,02_contract_api_cli_monitoring/plan_cloud_G07_0.log`
- Required 이슈:
  - `apps/client/lib/src/contracts/alt_contracts.dart`가 `paper_trading.pb.dart`를 import/register하지 않는다.
  - `apps/client/test/contracts/alt_contracts_test.dart`가 paper messages를 expected parser list에 포함하지 않아 누락을 잡지 못한다.

## 범위 결정 근거

- Include: Flutter client contract parser map registration and parser map test.
- Exclude: Flutter UI, repository layer, new screen, Go API/worker/CLI behavior, protobuf schema changes, generated code regeneration.
- `alt_api_result.dart`나 typed `AltSocketClient` paper helper는 이번 Required 이슈의 직접 수정 범위가 아니다. parser decode contract를 먼저 복구한다.

## 구현 체크리스트

- [ ] `apps/client/lib/src/contracts/alt_contracts.dart`에 `paper_trading.pb.dart` import를 추가하고 `StartPaperTradingRequest`, `StartPaperTradingResponse`, `GetPaperTradingStateRequest`, `GetPaperTradingStateResponse`, `PaperTradingState` parser를 등록한다.
- [ ] `apps/client/test/contracts/alt_contracts_test.dart`의 expected message list와 parser count를 paper messages 포함 기준으로 갱신한다.
- [ ] `cd apps/client && flutter test test/contracts/alt_contracts_test.dart`, `bin/test`, `git diff --check`를 실행한다.
- [ ] CODE_REVIEW-*-G??.md의 구현 에이전트 소유 섹션을 실제 구현 내용과 검증 출력으로 채운다. 이 항목이 완료되기 전에는 구현이 완료된 것이 아니다.

## [REVIEW_PAPER_MONITOR-1] Client Parser Map Registration

### 문제

`apps/client/lib/src/generated/alt/v1/paper_trading.pb.dart`가 생성됐지만 `altParserMap()`은 paper messages를 모른다. Flutter socket client가 paper response를 받으면 parser lookup이 실패할 수 있다.

### 해결 방법

`apps/client/lib/src/contracts/alt_contracts.dart`에 `paper_trading.pb.dart` import를 추가하고 아래 messages를 map에 등록한다.

- `StartPaperTradingRequest`
- `StartPaperTradingResponse`
- `GetPaperTradingStateRequest`
- `GetPaperTradingStateResponse`
- `PaperTradingState`

### 수정 파일

- `apps/client/lib/src/contracts/alt_contracts.dart`

### 중간 검증

```bash
cd apps/client && flutter test test/contracts/alt_contracts_test.dart
```

Expected: exit 0.

## [REVIEW_PAPER_MONITOR-2] Parser Map Test Coverage

### 문제

`apps/client/test/contracts/alt_contracts_test.dart`는 기존 19개 messages만 기대해 paper parser 누락을 통과시킨다.

### 해결 방법

테스트에 `paper_trading.pb.dart` import를 추가하고 expected message list에 paper messages 5개를 넣는다. parser count는 새 total에 맞춘다. 기존 round-trip assertion 패턴을 유지한다.

### 수정 파일

- `apps/client/test/contracts/alt_contracts_test.dart`

### 중간 검증

```bash
cd apps/client && flutter test test/contracts/alt_contracts_test.dart
```

Expected: exit 0.

## 최종 검증

```bash
cd apps/client && flutter test test/contracts/alt_contracts_test.dart
bin/test
git diff --check
```

Expected: all commands exit 0.

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