<!-- task=m-live-trading-boundary/04+01_account_sync plan=1 tag=REVIEW_LIVE_ACCOUNT -->

# Plan - REVIEW_LIVE_ACCOUNT

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

이 계획은 이전 리뷰 `code_review_cloud_G05_0.log`의 Required 항목만 해소한다. 구현 후 검증을 실행하고 실제 변경 내용, 설계 결정, 명령 출력(stdout/stderr)을 `CODE_REVIEW-*-G??.md`의 구현 에이전트 소유 섹션에 기록한 뒤 active 파일을 그대로 두고 리뷰 준비를 보고한다. 최종 판정, 로그 rename, `complete.log`, archive 이동은 code-review 전용이다.

구현 중 사용자만 결정할 수 있는 사항, 사용자 소유 외부 환경/secret, 또는 계획 범위 충돌 없이는 안전하게 진행할 수 없으면 active review stub의 `사용자 리뷰 요청` 섹션에 정확한 결정, 근거, 실행 명령/출력, 재개 조건을 기록하고 중단한다. 구현 에이전트는 사용자에게 직접 묻거나 선택지를 제시하거나 `request_user_input`을 호출하지 않는다. 후속 에이전트가 명령 재실행이나 산출물 수집으로 해소할 수 있는 검증 증거 공백은 사용자 리뷰 요청이 아니다.

## Roadmap Targets

- Milestone: `agent-roadmap/phase/trading-expansion/milestones/live-trading-boundary.md`
- Task ids:
  - `account-sync`: 계좌/포지션 동기화 경계가 있다.
- Completion mode: check-on-pass

## 배경

첫 리뷰는 account sync worker/API/CLI 흐름 자체보다 contract parser completeness에서 FAIL했다. 새 protobuf account sync surface는 client-facing runtime surface이므로 Go API/worker/CLI parser maps와 Flutter client parser map/test가 모두 새 메시지를 decode할 수 있어야 한다.

## 이전 리뷰 요약

- `code_review_cloud_G05_0.log`
  - Required: Flutter `altParserMap()`이 새 account sync 메시지를 등록하지 않는다.
  - Required: Go API/worker/CLI parser maps가 `LivePositionSnapshot`을 누락하고 parser map tests가 새 account sync 메시지를 요구하지 않는다.

## 범위 결정 근거

이 follow-up은 parser registration과 parser coverage만 수정한다. protobuf schema, generated output, worker service behavior, API forwarding behavior, CLI scenario output semantics는 변경하지 않는다.

## 빌드 등급

Build lane `local-G06`, review lane `local-G06`. 실패 원인이 명확하고 deterministic parser/test 보강으로 한정된다.

## 구현 체크리스트

- [ ] [REVIEW_LIVE_ACCOUNT-1] Flutter client parser map과 contract parser test가 account sync 메시지를 모두 포함한다.
- [ ] [REVIEW_LIVE_ACCOUNT-2] Go API/worker/CLI parser maps와 parser coverage가 account sync 메시지를 모두 포함한다.
- [ ] CODE_REVIEW-*-G??.md의 구현 에이전트 소유 섹션을 실제 구현 내용과 검증 출력으로 채운다. 이 항목이 완료되기 전에는 구현이 완료된 것이 아니다.

### [REVIEW_LIVE_ACCOUNT-1] Flutter Parser Coverage

#### 문제

`apps/client/lib/src/contracts/alt_contracts.dart`는 generated Dart account sync messages가 생겼는데도 `altParserMap()`에 `SyncLiveAccountRequest`, `SyncLiveAccountResponse`, `GetLiveAccountSnapshotRequest`, `GetLiveAccountSnapshotResponse`, `LiveAccountSnapshot`, `LiveCashBalance`, `LivePositionSnapshot`을 등록하지 않는다. `apps/client/test/contracts/alt_contracts_test.dart`도 expected list/count가 stale이라 누락을 잡지 못한다.

#### 해결 방법

Flutter parser map에 account sync messages를 추가하고, contract parser test의 expected list와 parser count를 새 메시지 수에 맞게 갱신한다.

#### 수정 파일 및 체크리스트

- [ ] `apps/client/lib/src/contracts/alt_contracts.dart`에 account sync parser entries를 추가한다.
- [ ] `apps/client/test/contracts/alt_contracts_test.dart`의 expected messages와 count를 갱신한다.

#### 테스트 작성

작성한다. 기존 round-trip parser test가 새 메시지 전체를 포함하도록 보강한다.

#### 중간 검증

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

기대 결과: exit code 0.

### [REVIEW_LIVE_ACCOUNT-2] Go Parser Coverage

#### 문제

Go parser maps는 `LiveAccountSnapshot`과 `LiveCashBalance`를 등록했지만 `LivePositionSnapshot`을 빠뜨렸다. 또한 독립 coverage tests가 account sync request/response/snapshot/cash/position messages를 요구하지 않아 누락이 통과된다.

#### 해결 방법

API/worker/CLI parser maps에 `LivePositionSnapshot`을 추가한다. API/worker contracts parser tests와 CLI parser map test에 account sync request/response, `LiveAccountSnapshot`, `LiveCashBalance`, `LivePositionSnapshot`을 모두 추가한다.

#### 수정 파일 및 체크리스트

- [ ] `services/api/internal/contracts/parser_map.go`에 `LivePositionSnapshot` parser를 추가한다.
- [ ] `services/worker/internal/contracts/parser_map.go`에 `LivePositionSnapshot` parser를 추가한다.
- [ ] `apps/cli/internal/operator/parser_map.go`에 `LivePositionSnapshot` parser를 추가한다.
- [ ] `services/api/internal/contracts/parser_map_test.go`의 independent required list를 account sync messages로 갱신한다.
- [ ] `services/worker/internal/contracts/parser_map_test.go`의 independent required list를 account sync messages로 갱신한다.
- [ ] `apps/cli/internal/operator/parser_map_test.go`의 independent required list를 account sync messages로 갱신한다.

#### 테스트 작성

작성한다. Parser map tests가 누락 시 실패하도록 source factory list와 독립된 expected list에 새 메시지를 명시한다.

#### 중간 검증

```bash
go test ./services/api/internal/contracts ./services/worker/internal/contracts ./apps/cli/internal/operator
```

기대 결과: exit code 0.

## 최종 검증

```bash
bin/contracts-check
go test ./services/api/internal/contracts ./services/worker/internal/contracts ./apps/cli/internal/operator
cd apps/client && flutter test test/contracts/alt_contracts_test.dart
bin/lint
```

기대 결과: 모든 명령 exit code 0. `bin/lint`가 기존 `mattermost_auth_service.dart`의 `avoid_print` info만 출력한다면 계획 대비 변경 사항에 pre-existing lint info로 기록한다.

## 수정 파일 요약

| 파일 | 항목 |
|------|------|
| `apps/client/lib/src/contracts/alt_contracts.dart` | REVIEW_LIVE_ACCOUNT-1 |
| `apps/client/test/contracts/alt_contracts_test.dart` | REVIEW_LIVE_ACCOUNT-1 |
| `services/api/internal/contracts/parser_map.go` | REVIEW_LIVE_ACCOUNT-2 |
| `services/api/internal/contracts/parser_map_test.go` | REVIEW_LIVE_ACCOUNT-2 |
| `services/worker/internal/contracts/parser_map.go` | REVIEW_LIVE_ACCOUNT-2 |
| `services/worker/internal/contracts/parser_map_test.go` | REVIEW_LIVE_ACCOUNT-2 |
| `apps/cli/internal/operator/parser_map.go` | REVIEW_LIVE_ACCOUNT-2 |
| `apps/cli/internal/operator/parser_map_test.go` | REVIEW_LIVE_ACCOUNT-2 |
