<!-- task=m-operator-client-api-core-integration/03+01_market_repository plan=0 tag=API -->

# Plan - Market Repository Calls

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

구현 후 active `CODE_REVIEW-*-G??.md`의 구현 소유 섹션을 실제 구현 내용과 검증 출력으로 채운다. 최종 archive, `complete.log`, roadmap 수정은 수행하지 않는다.

## 배경

`AltSocketClient`는 `listInstruments`와 `listBars` wrapper를 갖고 있지만, provider/repository 경계에서 request payload, parsed result, typed error를 검증하는 client core가 없다. 화면 구현 전에 market data status/list 계열 호출을 repository level에서 증명해야 한다.

## 사용자 리뷰 요청 흐름

사용자 전용 blocker만 review stub의 `사용자 리뷰 요청`에 기록한다. 재실행 가능한 evidence gap은 일반 후속 이슈로 남긴다.

## Roadmap Targets

- Milestone: `agent-roadmap/phase/operator-surface/milestones/operator-client-api-core-integration.md`
- Task ids:
  - `market-call`: market data status/list 기본 API 호출을 client core에서 수행할 수 있다.
- Completion mode: check-on-pass

## 분석 결과

### 읽은 파일

- `agent-test/local/rules.md`
- `agent-test/local/client-smoke.md`
- `agent-ops/rules/project/domain/client/rules.md`
- `apps/client/lib/src/integrations/socket/alt_socket_client.dart`
- `apps/client/test/integrations/socket/alt_socket_client_test.dart`
- `apps/client/lib/src/contracts/alt_contracts.dart`
- `packages/contracts/proto/alt/v1/market.proto`
- `packages/contracts/proto/alt/v1/common.proto`
- `apps/client/pubspec.yaml`

### 테스트 환경 규칙

`test_env=local`; client-smoke 적용. 작은 client 변경은 `cd apps/client && flutter test`; socket runtime smoke는 fake socket/repository unit test로 검증하고 실제 API 연결은 후속 runtime smoke로 남긴다.

### 테스트 커버리지 공백

low-level `AltSocketClient` request/response loop는 `alt_socket_client_test.dart:379`와 `:419`에서 있다. repository result mapping, typed `ErrorInfo`, status key extraction은 없다.

### 심볼 참조

renamed/removed symbol: none.

### 분할 판단

dependent split plan이다. predecessor `01_contract_mapping` PASS `complete.log`가 필요하다. `02_socket_state`와는 병렬 가능하므로 dependency는 `+01`만 둔다.

### 범위 결정 근거

market repository만 다룬다. backtest 호출, dashboard UI, API server handler, generated contract 수정은 제외한다.

### 빌드 등급

build=`cloud-G06`, review=`cloud-G06`. repository API와 typed error semantics가 후속 UI에 영향을 준다.

## 의존 관계 및 구현 순서

디렉터리명 `03+01_market_repository`에 따라 sibling `01_contract_mapping` PASS `complete.log`가 필요하다. 구현 시작 전 경로를 review에 기록한다.

## 구현 체크리스트

- [ ] market repository/provider boundary를 추가하고 `listInstruments`, `listBars`를 `AltApiResult`로 반환한다. 검증: `cd apps/client && flutter test test/features/market/market_repository_test.dart`
- [ ] fake client로 request payload와 parsed result/status key를 확인한다. 검증: `cd apps/client && flutter test test/features/market/market_repository_test.dart`
- [ ] typed `ErrorInfo`가 `AltApiError`로 보존되는 test를 추가한다.
- [ ] `cd apps/client && flutter test`를 실행한다.
- [ ] CODE_REVIEW-*-G??.md의 구현 에이전트 소유 섹션을 실제 구현 내용과 검증 출력으로 채운다. 이 항목이 완료되기 전에는 구현이 완료된 것이 아니다.

### [API-1] Market repository 추가

#### 문제

`apps/client/lib/src/integrations/socket/alt_socket_client.dart:95`와 `:105`는 raw protobuf response만 반환한다. provider/repository 경계에서 status key와 typed error를 보존하지 않는다.

```dart
// apps/client/lib/src/integrations/socket/alt_socket_client.dart:95
Future<ListInstrumentsResponse> listInstruments(
```

#### 해결 방법

`apps/client/lib/src/features/market/data/market_repository.dart` 또는 기존 패턴에 맞는 경로를 추가한다. socket client abstraction을 constructor로 받고 `Future<AltApiResult<ListInstrumentsResponse>> listInstruments(...)`, `Future<AltApiResult<ListBarsResponse>> listBars(...)`를 제공한다.

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

- [ ] `apps/client/lib/src/features/market/data/market_repository.dart`
- [ ] `apps/client/test/features/market/market_repository_test.dart`

#### 테스트 작성

작성한다. fake client가 받은 `ListInstrumentsRequest.market/provider`, `ListBarsRequest.instrumentId/timeframe`를 assert하고, success/error result를 모두 확인한다.

#### 중간 검증

`cd apps/client && flutter test test/features/market/market_repository_test.dart` exit code 0.

## 수정 파일 요약

| 파일 | 항목 |
|------|------|
| `apps/client/lib/src/features/market/data/market_repository.dart` | API-1 |
| `apps/client/test/features/market/market_repository_test.dart` | API-1 |

## 최종 검증

```bash
cd apps/client && flutter test
```

기대 결과: exit code 0. 실제 API 연결 smoke는 이 plan의 pass 조건이 아니며 fake client payload/result 검증으로 제한한다.

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