<!-- task=m-backtest-multi-timeframe-coverage/01_monthly_worker_core plan=0 tag=API -->
# Code Review - API

## 구현 항목별 완료 여부

| 항목 | 상태 | 근거 |
| --- | --- | --- |
| Contract request/response and generated outputs | 대기 | 구현 전 |
| Worker monthly aggregation service | 대기 | 구현 전 |
| Worker socket handler and capability wiring | 대기 | 구현 전 |
| API worker-client and socket forwarding | 대기 | 구현 전 |
| Parser-map and focused regression tests | 대기 | 구현 전 |

## 구현 체크리스트

- [ ] Contract proto and generated files are updated through the repo generator.
- [ ] API and worker parser-map tests cover the new request/response.
- [ ] Worker aggregation persists monthly bars through the existing bar store.
- [ ] Worker socket tests cover success, invalid request, and no-data behavior.
- [ ] API tests prove forwarding preserves success and typed errors.
- [ ] Existing daily import/list behavior remains covered.

## 리뷰 전용 체크리스트

- [ ] Contract fields are stable and do not expose worker-only internals.
- [ ] Aggregation is deterministic for the same stored daily inputs.
- [ ] Partial writes are avoided or explicitly tested on validation failure.
- [ ] Monthly bars remain timeframe-separated from daily bars.
- [ ] Capability behavior matches missing dependency behavior.

## 계획 대비 변경 사항

- 없음. 구현 전 stub이다.

## 주요 설계 결정

- 예정: existing daily bar storage plus `AggregateDailyToMonthly` should remain the aggregation source of truth.
- 예정: operator handoff and roadmap checkbox are deferred to `02+01_monthly_operator_handoff`.

## 사용자 리뷰 요청

_기본값은 `없음`이다. 구현 중 새 결정이 필요해 보여도 직접 질문하거나 선택지를 제시하거나 `request_user_input`을 호출하지 않는다. 이 섹션은 선택된 SDD 결정 또는 선택된 Milestone `구현 잠금 > 결정 필요` 항목이 실구현을 차단할 때만 채운다. 외부 환경/secret/서비스 준비, 검증 증거 공백, 반복 실패, 일반 범위 조정은 사용자 리뷰 요청이 아니며 `검증 결과`, `계획 대비 변경 사항`, 또는 code-review의 일반 follow-up plan으로 처리한다._

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

## 리뷰어 체크포인트

- The new API operation should be narrow: aggregate stored daily bars into stored monthly bars and return provenance.
- The implementation should not fetch fresh provider bars as a side effect.
- Generated files should match the proto change and contract checks.

## 검증 결과

- 미실행. 계획 생성 단계이다.

## 코드리뷰 결과

- 종합 판정: FAIL
- 차원별 평가:
  - correctness: Fail
  - completeness: Fail
  - test coverage: Fail
  - API contract: Fail
  - code quality: Warn
  - plan deviation: Fail
  - verification trust: Fail
  - spec conformance: Fail
- 발견된 문제:
  - Required: `packages/contracts/proto/alt/v1/market.proto:107`의 `MonthlyProvenance`가 계획의 provenance 계약을 충족하지 못한다. `PLAN-local-G07.md:49`는 provenance entry에 source/target timeframe을 포함하라고 요구하지만 proto에는 `source_timeframe`/`target_timeframe`이 없어서 client/API/worker가 월봉 provenance의 핵심 source/target을 wire format으로 전달할 수 없다. `Timeframe source_timeframe`과 `Timeframe target_timeframe`을 additive field로 추가하고 Go/Dart generated output과 모든 parser map을 재생성/갱신해야 한다.
  - Required: `apps/client/lib/src/contracts/alt_contracts.dart:19` 이후 client parser map이 `AggregateMonthlyBarsRequest`, `AggregateMonthlyBarsResponse`, `MonthlyProvenance`를 등록하지 않는다. 새 generated Dart message는 생겼지만 client runtime parser가 빠져 있어 API에서 이 response를 받는 client가 해당 payload를 파싱할 수 없다. client parser map과 해당 parser-map 테스트를 추가해야 한다.
  - Required: `services/api/internal/contracts/parser_map_test.go:16`, `services/worker/internal/contracts/parser_map_test.go:12`, `services/api/internal/socket/market_test.go:239`의 독립 required 목록이 새 monthly request/response/provenance 및 API handler registration을 포함하지 않는다. 구현 파일에는 parser/handler가 추가됐지만 회귀 테스트는 messageFactories/sessionHandlers와 독립적으로 새 runtime surface를 고정하지 못한다. 각 required list에 새 메시지와 handler를 추가하고 실패하는 regression을 닫아야 한다.
  - Required: `services/worker/internal/marketdata/aggregation/aggregator.go:61`에서 `GetBars` 오류를 `continue`로 삼켜 일부 instrument 실패를 성공 응답으로 바꾼다. 계획은 invalid/error path에서 typed error와 partial-write 회피를 요구한다. instrument별 storage read 실패는 즉시 error로 반환하거나, 사전에 모두 검증한 뒤 쓰기 단계로 넘어가도록 바꿔야 한다.
  - Required: `services/worker/internal/marketdata/aggregation/aggregator.go:67`은 매칭 instrument가 있어도 daily bar가 전혀 없으면 0-count 성공을 반환한다. 계획은 worker socket tests가 no-data behavior를 커버해야 한다고 했고, acceptance는 matching stored daily bars가 있을 때 success라고 한정한다. no-data를 typed error로 반환하거나 명시적으로 success 계약을 정하고 테스트로 고정해야 한다.
  - Required: `services/worker/internal/marketdata/aggregation/aggregator.go:145`의 provider symbol 매칭이 `inst.ProviderSymbols[ps]`를 조회한다. `ProviderSymbols`의 key는 provider 이름이므로 요청 symbol 값으로 key lookup을 하면 provider-specific symbol 요청이 매칭되지 않는다. `inst.ProviderSymbols[string(req.Provider)]` 값을 요청 symbol set과 비교하도록 고쳐야 한다.
  - Required: `services/worker/internal/marketdata/aggregation/aggregator.go:76` 이후 실제 `Aggregator.AggregateMonthlyBars`가 monthly bars를 `TimeframeMonthly`로 저장하고 기존 `GetBars/ListBars` 경로로 daily와 분리 조회되는지 검증하는 테스트가 없다. socket success test는 fake aggregator만 사용한다. in-memory store 또는 postgres store test로 persistence, queryability, daily/monthly separation, no-data/error path를 직접 검증해야 한다.
  - Required: `services/api/internal/socket/market.go:227`의 새 API forwarding path에 대한 success, validation, worker error/nil response, socket registration 테스트가 없다. fake worker method만 추가되어 plan의 “API tests prove forwarding preserves success and typed errors”를 충족하지 못한다. `handleAggregateMonthlyBars`와 socket round-trip/registration tests를 추가해야 한다.
  - Required: `CODE_REVIEW-local-G07.md:8` 이후 구현 완료표, 구현 체크리스트, 계획 대비 변경 사항, 주요 설계 결정, 검증 결과가 모두 구현 전 상태로 남아 있다. 현재 리뷰 에이전트가 별도로 검증을 수행했지만 구현 에이전트의 mandatory evidence가 없으므로 이 루프의 완료 artifact는 신뢰할 수 없다. 후속 구현에서 모든 implementation-owned section을 실제 변경/명령 출력으로 채워야 한다.
  - Suggested: `services/worker/internal/marketdata/aggregation/aggregator.go:9`가 marketdata service에서 socket package types를 직접 import하게 만들어 service layer가 transport handler package에 의존한다. 동작을 막는 결함은 아니지만 worker aggregation request/result DTO를 aggregation package에 두고 socket에서 변환하면 경계가 더 자연스럽고 재사용 가능한 구조가 된다.
- 다음 단계: WARN/FAIL 후속 `PLAN-local-G07.md`와 `CODE_REVIEW-local-G07.md`를 생성한다.

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

- [x] `코드리뷰 결과`에 `PASS`, `WARN`, `FAIL` 중 하나의 판정을 append했다.
- [x] 판정과 `차원별 평가`, Required/Suggested/Nit 분류가 서로 일치한다.
- [x] active `CODE_REVIEW-local-G07.md`를 `code_review_local_G07_0.log`로 아카이브했다.
- [x] active `PLAN-local-G07.md`를 `plan_local_G07_0.log`로 아카이브했다.
- [x] `.gitignore`의 Agent-Ops 관리 block이 `agent-task/**/*.md`와 `agent-task/**/*.log`를 unignore하고 `agent-roadmap/current.md`를 ignore하는지 확인했다.
- [x] WARN/FAIL이고 user-review gate가 트리거되지 않아 다음 active `PLAN-local-G07.md`와 `CODE_REVIEW-local-G07.md`를 작성했고 `complete.log`를 작성하지 않았다.
- [ ] PASS 전용 `complete.log` 작성 및 task directory archive 이동은 적용하지 않는다.
- [ ] USER_REVIEW 전용 stop state 작성은 적용하지 않는다.
