<!-- task=m-api-centered-proto-socket-rail/05+02_market_rail plan=1 tag=REVIEW_MARKET -->
# PLAN-cloud-G07: Market Rail Review Evidence Recovery

## 이 파일을 읽는 구현 에이전트에게
이 계획은 market rail 코드 변경 자체보다 이전 review 산출물의 completeness/verification trust 실패를 회복하는 후속 루프다. 코드 변경이 필요 없으면 active `CODE_REVIEW-cloud-G07.md`만 채우고, 검증 실패가 repo-owned market rail 문제를 드러낼 때만 해당 범위 안에서 최소 수정한다. 구현 에이전트는 검증을 실행하고 실제 stdout/stderr를 붙인 뒤 active 파일을 그대로 두고 리뷰 요청만 한다. finalization, log rename, `complete.log`, archive 이동은 code-review 전용이다.

## 배경
이전 루프는 `ListInstruments`/`ListBars` API -> worker proto-socket rail 구현을 완료했다고 기록했지만, active review 파일에는 현재 code-review 계약의 구현 체크리스트와 실제 검증 출력이 없었다. 원격 검증 PASS 요약만으로는 contracts/API/worker/client generated surface의 결과를 재현하거나 신뢰할 수 없다.

## 사용자 리뷰 요청 흐름
구현 중 사용자 결정, 사용자 소유 외부 환경/secret/서비스 준비, 또는 범위 충돌 없이는 `USER_REVIEW.md`를 만들지 않는다. 그런 blocker가 있으면 active review stub의 `사용자 리뷰 요청` 섹션에 exact evidence와 재개 조건을 기록하고 멈춘다. 검증 증거 공백은 후속 에이전트가 명령 재실행으로 해소할 수 있으므로 사용자 리뷰 요청 사유가 아니다.

## 분석 결과
### 읽은 파일
- `agent-ops/rules/project/rules.md`
- `agent-ops/rules/private/rules.md`
- `agent-ops/rules/common/rules-roadmap.md`
- `agent-roadmap/current.md`
- `agent-ops/skills/common/router.md`
- `agent-ops/skills/common/code-review/SKILL.md`
- `agent-ops/skills/common/plan/SKILL.md`
- `agent-ops/skills/common/_templates/implementation-user-review-request-section.md`
- `agent-test/local/rules.md`
- `agent-test/local/contracts-smoke.md`
- `agent-test/local/api-smoke.md`
- `agent-test/local/worker-smoke.md`
- `agent-test/local/client-smoke.md`
- `agent-ops/rules/project/domain/contracts/rules.md`
- `agent-ops/rules/project/domain/api/rules.md`
- `agent-ops/rules/project/domain/worker/rules.md`
- `agent-ops/rules/project/domain/client/rules.md`
- `agent-task/m-api-centered-proto-socket-rail/05+02_market_rail/plan_cloud_G07_0.log`
- `agent-task/m-api-centered-proto-socket-rail/05+02_market_rail/code_review_cloud_G07_0.log`
- `agent-task/archive/2026/05/m-api-centered-proto-socket-rail/02+01_worker_socket_rail/complete.log`
- `packages/contracts/proto/alt/v1/market.proto`
- `packages/contracts/gen/go/alt/v1/market.pb.go`
- `apps/client/lib/src/generated/alt/v1/market.pb.dart`
- `apps/client/lib/src/generated/alt/v1/market.pbjson.dart`
- `apps/client/lib/src/contracts/alt_contracts.dart`
- `apps/client/lib/src/integrations/socket/alt_socket_client.dart`
- `apps/client/test/integrations/socket/alt_socket_client_test.dart`
- `services/api/internal/contracts/parser_map.go`
- `services/api/internal/socket/server.go`
- `services/api/internal/socket/handlers.go`
- `services/api/internal/socket/market.go`
- `services/api/internal/socket/market_test.go`
- `services/api/internal/socket/backtest_test.go`
- `services/api/internal/workerclient/client.go`
- `services/api/internal/workerclient/client_test.go`
- `services/api/cmd/alt-api/main.go`
- `services/worker/cmd/alt-worker/main.go`
- `services/worker/internal/contracts/parser_map.go`
- `services/worker/internal/socket/server.go`
- `services/worker/internal/socket/handlers.go`
- `services/worker/internal/socket/backtest.go`
- `services/worker/internal/socket/backtest_mapping.go`
- `services/worker/internal/socket/market.go`
- `services/worker/internal/socket/market_mapping.go`
- `services/worker/internal/socket/market_test.go`
- `services/worker/internal/socket/market_mapping_test.go`
- `services/worker/internal/storage/ports.go`
- `services/worker/internal/storage/postgres/store.go`

### 테스트 환경 규칙
- 선택 env: `local`.
- `agent-test/local/rules.md`는 존재하고 읽었다. 이 파일은 로컬 테스트/검증 실행을 금지하고 기본 검증 환경을 원격으로 본다.
- 매칭 profile: contracts/API/worker/client smoke를 모두 읽었다.
- 적용 명령: 원격 검증 환경에서만 `go test -count=1 ./services/api/...`, `go test -count=1 ./services/worker/...`, `bin/contracts-check`, `go test -count=1 ./packages/contracts/gen/go/...`, `cd apps/client && flutter test`, `bin/lint`.
- 현재 리뷰 에이전트는 로컬 금지 규칙 때문에 위 명령을 실행하지 않았다. 다음 구현 에이전트는 원격 검증 환경에서 실제 stdout/stderr를 기록해야 한다.

### 테스트 커버리지 공백
- API handler forwarding, validation, worker error mapping: `services/api/internal/socket/market_test.go`에 테스트가 있다.
- worker handler filtering, validation, unavailable/not_found mapping: `services/worker/internal/socket/market_test.go`에 테스트가 있다.
- domain -> proto response mapping: `services/worker/internal/socket/market_mapping_test.go`에 테스트가 있다.
- contracts/generated drift와 Flutter generated/client wrapper 영향: 명령 출력이 없어서 검증 신뢰도 공백이 남아 있다.
- review 산출물 자체: 이전 `code_review_cloud_G07_0.log`에 구현 체크리스트와 실제 stdout/stderr가 없어 현재 루프에서 보강해야 한다.

### 심볼 참조
- 제거/rename 심볼: 없음.
- 추가/확장 심볼 참조:
  - `ListInstrumentsRequest`, `ListInstrumentsResponse`, `ListBarsRequest`, `ListBarsResponse`: parser maps, API/worker handlers, Go/Dart generated files, client parser/wrapper tests에서 사용된다.
  - `ErrorInfo error = 2`: market response schema와 Go/Dart generated outputs에 반영되어 있다.
  - `WorkerClient.ListInstruments`, `WorkerClient.ListBars`: API market handlers와 fake worker client tests가 사용한다.

### 분할 판단
- 기존 split task `05+02_market_rail`의 follow-up이며 새 sibling split은 만들지 않는다.
- predecessor `02+01_worker_socket_rail`은 `agent-task/archive/2026/05/m-api-centered-proto-socket-rail/02+01_worker_socket_rail/complete.log`로 충족되어 있다.
- 이번 후속은 검증 산출물과 review stub 회복이 한 단위라서 같은 subtask directory에 단일 follow-up plan을 둔다.

### 범위 결정 근거
- 원칙적으로 market rail source code는 고치지 않는다.
- 명령 실패가 repo-owned market rail 회귀를 드러내면 실패 원인에 직접 필요한 파일만 수정한다.
- local 검증 실행, roadmap 상태 갱신, archive 이동, `complete.log` 작성은 이번 구현 에이전트 범위가 아니다.
- 이전 plan에 `Roadmap Targets`가 없었으므로 이번 follow-up도 PASS 시 roadmap Task 체크를 주장하지 않는다.

### 빌드 등급
- Build lane: `cloud-G07`
- Review lane: `cloud-G07`
- 근거: 이전 review가 verification trust Fail이고, 성공 조건이 원격 명령 stdout/stderr 수집과 다중 도메인 contract/API/worker/client 검증에 걸려 있다.

## 구현 체크리스트
- [ ] `CODE_REVIEW-cloud-G07.md`의 `구현 항목별 완료 여부`와 `구현 체크리스트`를 현재 템플릿 구조로 유지하고, MARKET-1/2/3 완료 상태를 실제 소스 기준으로 표시한다.
- [ ] 원격 검증 환경에서 `go test -count=1 ./services/api/...`, `go test -count=1 ./services/worker/...`, `bin/contracts-check`, `go test -count=1 ./packages/contracts/gen/go/...`, `cd apps/client && flutter test`, `bin/lint`를 실행하고 실제 stdout/stderr를 `검증 결과`에 붙인다.
- [ ] 검증 실패가 repo-owned market rail 문제이면 최소 수정 후 실패한 명령과 관련 최종 명령을 재실행하고, 사용자 소유 환경 문제이면 `사용자 리뷰 요청`에 명령/출력/재개 조건을 기록한다.
- [ ] CODE_REVIEW-*-G??.md의 구현 에이전트 소유 섹션을 실제 구현 내용과 검증 출력으로 채운다. 이 항목이 완료되기 전에는 구현이 완료된 것이 아니다.

### [REVIEW_MARKET-1] Review 산출물 completeness 회복
문제:
`code_review_cloud_G07_0.log:1`의 이전 active review 산출물에는 현재 템플릿의 `구현 항목별 완료 여부`, 계획과 동일한 `구현 체크리스트`, review-only checklist가 없었다.

해결 방법:
새 `CODE_REVIEW-cloud-G07.md`의 고정 템플릿을 유지하고, 구현 에이전트 소유 영역만 채운다. MARKET-1/2/3의 완료 여부는 실제 파일 기준으로 판단한다.

수정 파일 및 체크리스트:
- `agent-task/m-api-centered-proto-socket-rail/05+02_market_rail/CODE_REVIEW-cloud-G07.md`
- [ ] `구현 항목별 완료 여부` 표의 REVIEW_MARKET-1/2를 `[x]`로 갱신한다.
- [ ] `구현 체크리스트`의 모든 구현 에이전트 항목을 실제 수행 후 `[x]`로 갱신한다.
- [ ] `계획 대비 변경 사항`과 `주요 설계 결정` placeholder를 실제 내용으로 교체한다.

테스트 작성:
- 별도 테스트 작성 없음. 이 항목은 task artifact completeness 회복이다.

중간 검증:
- `rg --sort path -n "구현 항목별 완료 여부|구현 체크리스트|검증 결과|코드리뷰 전용 체크리스트" agent-task/m-api-centered-proto-socket-rail/05+02_market_rail/CODE_REVIEW-cloud-G07.md`

### [REVIEW_MARKET-2] 원격 검증 stdout/stderr 수집
문제:
`code_review_cloud_G07_0.log:7`은 원격 검증 PASS를 요약하지만 실제 stdout/stderr가 없어 code-review가 결과를 대조할 수 없다.

해결 방법:
원격 검증 환경에서 계약된 명령을 그대로 실행하고 출력 전체를 review stub에 붙인다. 출력이 너무 길면 repo 밖 경로에 저장하고, review stub에는 저장 경로와 파일을 만든 정확한 명령을 기록한다.

수정 파일 및 체크리스트:
- `agent-task/m-api-centered-proto-socket-rail/05+02_market_rail/CODE_REVIEW-cloud-G07.md`
- market rail 소스 파일: 명령 실패가 repo-owned 문제를 드러낼 때만 최소 수정
- [ ] 각 명령의 실제 stdout/stderr를 붙인다.
- [ ] `bin/lint`의 기존 `avoid_print` info처럼 허용할 잔여 항목은 실제 출력과 함께 기존 여부를 설명한다.
- [ ] 명령 실패 시 실패 원인, 수정 파일, 재실행 결과를 `계획 대비 변경 사항`과 `검증 결과`에 남긴다.

테스트 작성:
- 새 테스트는 명령 실패가 실제 커버리지 공백을 드러낼 때만 추가한다. 현재 계획의 기본 목적은 기존 테스트/검증의 실제 출력 수집이다.

중간 검증:
- 원격 검증 환경에서만 `go test -count=1 ./services/api/...`
- 원격 검증 환경에서만 `go test -count=1 ./services/worker/...`
- 원격 검증 환경에서만 `bin/contracts-check`
- 원격 검증 환경에서만 `go test -count=1 ./packages/contracts/gen/go/...`
- 원격 검증 환경에서만 `cd apps/client && flutter test`
- 원격 검증 환경에서만 `bin/lint`

## 수정 파일 요약
| 파일 | 항목 |
|------|------|
| `agent-task/m-api-centered-proto-socket-rail/05+02_market_rail/CODE_REVIEW-cloud-G07.md` | REVIEW_MARKET-1, REVIEW_MARKET-2 |
| market rail 관련 source/test files | REVIEW_MARKET-2 실패가 repo-owned 문제를 드러낼 때만 |

## 최종 검증
- 원격 검증 환경에서만 `go test -count=1 ./services/api/...`
- 원격 검증 환경에서만 `go test -count=1 ./services/worker/...`
- 원격 검증 환경에서만 `bin/contracts-check`
- 원격 검증 환경에서만 `go test -count=1 ./packages/contracts/gen/go/...`
- 원격 검증 환경에서만 `cd apps/client && flutter test`
- 원격 검증 환경에서만 `bin/lint`
모든 코드 변경 완료 후 반드시 `CODE_REVIEW-*-G??.md`의 구현 에이전트 소유 섹션을 채운다. 이 파일 작성이 구현의 마지막 단계다.
