<!-- task=m-operator-client-api-core-integration/04+02,03_backtest_error plan=1 tag=REVIEW_API -->

# Code Review Reference - REVIEW_API

> **[IMPLEMENTING AGENT — READ FIRST] Filling in this file is the mandatory final step of implementation.**
> The task is NOT complete until every implementation-owned section below is filled in.
> Complete the `구현 체크리스트`; the final checklist item is mandatory before saving.
> Fill implementation-owned sections, then stop with active files in place and report ready for review.
> If implementation is blocked by a user-only decision, user-owned external environment prerequisite, or scope conflict, fill `사용자 리뷰 요청` with evidence and stop with active files in place; code-review decides whether to write `USER_REVIEW.md`. Evidence gaps that a follow-up agent can close by rerunning commands or collecting artifacts are normal follow-up issues, not user-review blockers by themselves.
> Finalization (`코드리뷰 결과`, log rename, `complete.log`, archive moves, `코드리뷰 전용 체크리스트`) is review-agent-only, even after compaction/resume.

## 개요

date=2026-06-02
task=m-operator-client-api-core-integration/04+02,03_backtest_error, plan=1, tag=REVIEW_API

### 선행 작업 의존성 검증 결과 (Predecessors)
- **Predecessor 02+01_socket_state Complete Log**: `agent-task/archive/2026/06/m-operator-client-api-core-integration/02+01_socket_state/complete.log`
- **Predecessor 03+01_market_repository Complete Log**: `agent-task/archive/2026/06/m-operator-client-api-core-integration/03+01_market_repository/complete.log`

## Roadmap Targets

- Milestone: `agent-roadmap/phase/operator-surface/milestones/operator-client-api-core-integration.md`
- Task ids:
  - `backtest-call`: backtest list/detail/result/start 기본 API 호출을 client core에서 수행할 수 있다.
  - `error-core`: unavailable/error/disconnected 상태가 UI copy가 아닌 안정적인 client state로 남는다.
- Completion mode: check-on-pass

## 이 파일을 읽는 리뷰 에이전트에게

> **[REVIEW AGENT ONLY]** 아래 종결 절차는 코드리뷰 에이전트 전용이다. 구현 에이전트는 이 섹션을 실행하지 않는다.

각 항목의 구현을 실제 소스 파일과 대조하고, `검증 결과` 섹션의 출력이 코드와 일치하는지 확인하세요.

## 구현 항목별 완료 여부

| 항목 | 완료 여부 |
|------|---------|
| [API-1] Scope cleanup | [x] |

## 구현 체크리스트

- [x] `BacktestRepository.compareBacktestRuns` method를 제거하고 list/detail/result/start repository surface만 남긴다.
- [x] `compareBacktestRuns success flows` test와 이 테스트만을 위한 compare request/response assertion을 제거한다.
- [x] `cd apps/client && flutter test test/features/backtest/backtest_repository_test.dart`를 실행해 list/detail/result/start success, typed `ErrorInfo`, timeout, decode failure, disconnected 검증이 통과함을 확인한다.
- [x] `cd apps/client && flutter test`를 실행한다.
- [x] CODE_REVIEW-*-G??.md의 구현 에이전트 소유 섹션을 실제 구현 내용과 검증 출력으로 채운다. 이 항목이 완료되기 전에는 구현이 완료된 것이 아니다.

## 코드리뷰 전용 체크리스트

- [x] PASS/WARN/FAIL 판정을 append한다.
- [x] active files를 log로 archive한다.
- [x] PASS이면 `complete.log` 작성 후 archive 이동한다.
- [x] roadmap은 직접 수정하지 않는다.

## 계획 대비 변경 사항

- **비교(Compare) API 범위 제외**: 1차 리뷰에서 지적받은 대로 계획의 범위 결정 근거를 엄격하게 지키기 위해, `BacktestRepository`와 관련 테스트 코드에서 `compareBacktestRuns` API surface를 전면 제거하였습니다.
- **순수 4대 백테스트 API 및 에러 처리 집중**: `listBacktestRuns`, `getBacktestRunDetail`, `getBacktestResult`, `startBacktest` 4개 API 호출 및 typed error mapping(`ErrorInfo`), transport failure(Timeout, Disconnected, Decode failure) 상태 매핑만을 유지하고 철저히 검증했습니다.

## 주요 설계 결정

- **범위 엄수(Scope Enforcement)**: ALT 프로젝트 규칙인 "요청 범위를 넘는 변경을 하지 않는다"를 철저히 지키기 위하여, 구현이 비교적 수월한 부분이어도 명시적으로 배제된 surface(`compare backtests`)는 완벽히 도려내어 계획의 일관성과 순수성을 유지하도록 결정하였습니다.

## 사용자 리뷰 요청

- 상태: 없음
- 사유 유형: 없음
- 결정 필요: 없음
- 차단 근거: 없음
- 실행한 검증/명령: 없음
- 자동 후속 불가 이유: 없음
- 재개 조건: 없음

## 리뷰어를 위한 체크포인트

- `BacktestRepository`에 list/detail/result/start 외 compare repository surface가 남아 있지 않은가
- focused test가 compare success case 없이도 네 개 기본 API와 error core를 검증하는가
- UI 화면, chart view model, API server/worker 변경이 섞이지 않았는가

## 검증 결과

### API-1 중간 검증
```text
$ cd apps/client && flutter test test/features/backtest/backtest_repository_test.dart
00:00 +0: .../apps/client/test/features/backtest/backtest_repository_test.dart
00:01 +0: .../apps/client/test/features/backtest/backtest_repository_test.dart
00:01 +0: BacktestRepository tests listBacktestRuns success flows
00:01 +1: BacktestRepository tests listBacktestRuns success flows
00:01 +1: BacktestRepository tests getBacktestRunDetail success flows
00:01 +2: BacktestRepository tests getBacktestRunDetail success flows
00:01 +2: BacktestRepository tests getBacktestResult success flows
00:01 +3: BacktestRepository tests getBacktestResult success flows
00:01 +3: BacktestRepository tests startBacktest success flows
00:01 +4: BacktestRepository tests startBacktest success flows
00:01 +4: BacktestRepository ... maps correctly to AltApiFailure across calls
00:01 +5: BacktestRepository ... maps correctly to AltApiFailure across calls
00:01 +5: ... tests timeout maps correctly to AltTransportKind.timeout
00:01 +6: ... tests timeout maps correctly to AltTransportKind.timeout
00:01 +6: ... type mismatch maps correctly to AltTransportKind.decodeFailure
00:01 +7: ... type mismatch maps correctly to AltTransportKind.decodeFailure
00:01 +7: ... tests client not alive returns AltTransportKind.disconnected
00:01 +8: ... tests client not alive returns AltTransportKind.disconnected
00:01 +8: All tests passed!
```

### 최종 검증
```text
$ cd apps/client && flutter test
00:00 +0: ... /config/workspace/alt/apps/client/test/app/bootstrap_test.dart
00:01 +0: ... /config/workspace/alt/apps/client/test/app/bootstrap_test.dart
00:02 +0: ... /config/workspace/alt/apps/client/test/app/bootstrap_test.dart
00:02 +0: ... does not call Firebase or Mattermost and returns null
00:02 +1: ... does not call Firebase or Mattermost and returns null
00:02 +1: ... bootstrapAltClient initializes Firebase and Mattermost push host
...
00:03 +15: ... BacktestRepository tests listBacktestRuns success flows
00:03 +16: ... BacktestRepository tests getBacktestRunDetail success flows
00:03 +17: ... BacktestRepository tests getBacktestResult success flows
00:03 +18: ... BacktestRepository tests startBacktest success flows
00:03 +19: ... tests ErrorInfo maps correctly to AltApiFailure across calls
00:03 +20: ... tests timeout maps correctly to AltTransportKind.timeout
00:03 +22: ... type mismatch maps correctly to AltTransportKind.decodeFailure
00:03 +22: ... tests client not alive returns AltTransportKind.disconnected
...
00:04 +60: All tests passed!
```

## 코드리뷰 결과

- 종합 판정: PASS
- 차원별 평가:
  - correctness: Pass
  - completeness: Pass
  - test coverage: Pass
  - API contract: Pass
  - code quality: Pass
  - plan deviation: Pass
  - verification trust: Pass
- 발견된 문제:
  - Nit: `apps/client/lib/src/features/backtest/data/backtest_repository.dart:7`의 class doc comment가 아직 `comparisons`를 언급합니다. 실제 compare repository surface는 제거됐으므로 동작 문제는 아니지만, 후속 정리 때 문구에서 빼면 더 정확합니다.
- 다음 단계: PASS로 `complete.log` 작성 후 task archive를 진행한다.
