<!-- task=m-live-trading-boundary/01_broker_port plan=2 tag=REVIEW_REVIEW_LIVE_PORT -->

# Plan - REVIEW_REVIEW_LIVE_PORT

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

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

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

## 배경

2차 리뷰에서 live capability 구현 자체와 주요 검증은 통과했다. 남은 항목은 follow-up plan이 요구한 exact test coverage와 scope 분리다. 이 plan은 새 기능을 추가하지 않고 review findings만 닫는다.

## Roadmap Targets

- Milestone: `agent-roadmap/phase/trading-expansion/milestones/live-trading-boundary.md`
- Task ids:
  - `broker-port`: broker adapter port가 paper/live 공통 경계를 갖는다.
- Completion mode: check-on-pass

## 리뷰 근거

- Archived plan: `agent-task/m-live-trading-boundary/01_broker_port/plan_local_G07_1.log`
- Archived review: `agent-task/m-live-trading-boundary/01_broker_port/code_review_cloud_G06_1.log`
- Verdict: FAIL

## 범위 결정 근거

이 follow-up은 API live timeout test, API capability sync assertion, tracked roadmap diff 분리, verification artifact 보강만 다룬다. 실제 live order/account/risk/audit 동작, protobuf schema 변경, generated contract 재생성은 범위 밖이다.

## 구현 체크리스트

- [x] [REVIEW_REVIEW_LIVE_PORT-1] API live handler가 worker call timeout을 별도 테스트로 검증한다.
  - 구현: `services/api/internal/socket/live_test.go`에 `TestHandleGetLiveBrokerCapabilitiesWorkerCallTimeout` 추가
  - 검증: `go test -count=1 ./services/api/internal/socket` 통과
- [x] [REVIEW_REVIEW_LIVE_PORT-2] API `TestCapabilitiesAndHandlersSync`가 live handler와 `"live-trading"` capability 동기화를 직접 검증한다.
  - 구현: `services/api/internal/socket/server_test.go`의 `TestCapabilitiesAndHandlersSync`에 live handler/capability sync assertion (check #5) 추가
  - 검증: `go test -count=1 ./services/api/internal/socket` 통과
- [x] [REVIEW_REVIEW_LIVE_PORT-3] tracked roadmap diff가 implementation-owned이면 범위에서 제거하고, user-owned/pre-existing이면 review artifact에 명확히 제외 근거를 기록한다.
  - 구현: `PHASE.md`와 `live-trading-boundary.md` 변경 확인 결과 user-owned/pre-existing (workspace-port-env-standardization 미션)으로 판정
  - 기록: active `CODE_REVIEW-cloud-G06.md`의 "계획 대비 변경 사항"에 제외 근거 명시
  - 검증: `git diff -- agent-roadmap/phase/trading-expansion/PHASE.md agent-roadmap/phase/trading-expansion/milestones/live-trading-boundary.md` 확인
- [x] [REVIEW_REVIEW_LIVE_PORT-4] 최종 검증 출력에 `go test -count=1 ./apps/cli/...` stdout/stderr를 포함한다.
  - 구현: active `CODE_REVIEW-cloud-G06.md` 최종 검증 섹션에 실제 stdout/stderr 포함
  - 검증: 모든 최종 검증 명령 exit code 0
- [x] CODE_REVIEW-*-G??.md의 구현 에이전트 소유 섹션을 실제 구현 내용과 검증 출력으로 채운다. 이 항목이 완료되기 전에는 구현이 완료된 것이 아니다.
  - 구현 항목별 완료 여부 테이블에 REVIEW_REVIEW_LIVE_PORT-1~4 완료 표시
  - 구현 체크리스트에 REVIEW_REVIEW_LIVE_PORT-1~4 완료 표시
  - 계획 대비 변경 사항에 tracked roadmap diff out-of-scope 근거 포함
  - 검증 결과 전체 섹션을 실제 최종 검증 출력으로 갱신

### [REVIEW_REVIEW_LIVE_PORT-1] Worker Call Timeout Test

#### 문제

`services/api/internal/socket/live_test.go`의 timeout test는 `connectErr: workerclient.ErrTimeout`만 사용해 Connect failure mapping을 검증한다. 이전 plan은 worker call 자체가 `workerclient.ErrTimeout`을 반환하는 case를 요구했다.

#### 해결 방법

`fakeWorkerClient{err: workerclient.ErrTimeout, isConnected: true}`로 `handleGetLiveBrokerCapabilities`를 호출하는 테스트를 추가하고 `backtestErrorTimeout`을 assert한다. 기존 connect timeout test는 유지해도 된다.

#### 중간 검증

```bash
go test -count=1 ./services/api/internal/socket
```

### [REVIEW_REVIEW_LIVE_PORT-2] API Capability Sync Test

#### 문제

`services/api/internal/socket/server_test.go`의 `TestCapabilitiesAndHandlersSync`는 market/backtest/paper만 확인하고 live handler/capability sync를 직접 검증하지 않는다.

#### 해결 방법

`registered[protoSocket.TypeNameOf(&altv1.GetLiveBrokerCapabilitiesRequest{})]`가 true이면 `capSet["live-trading"]`도 true인지 확인하는 assertion을 추가한다.

#### 중간 검증

```bash
go test -count=1 ./services/api/internal/socket
```

### [REVIEW_REVIEW_LIVE_PORT-3] Roadmap Diff Separation

#### 문제

이 task의 active diff에 `agent-roadmap/phase/trading-expansion/PHASE.md`와 `agent-roadmap/phase/trading-expansion/milestones/live-trading-boundary.md` 변경이 섞여 있다. 현재 follow-up 범위는 roadmap 상태 변경을 제외한다고 명시했다.

#### 해결 방법

`git diff -- agent-roadmap/phase/trading-expansion/PHASE.md agent-roadmap/phase/trading-expansion/milestones/live-trading-boundary.md`를 확인한다. 이 변경이 이번 implementation-owned drift라면 `apply_patch`로 범위에서 제거한다. 사용자 또는 다른 작업이 만든 pre-existing 변경이라면 되돌리지 말고 `CODE_REVIEW-cloud-G06.md`의 `계획 대비 변경 사항`에 “tracked roadmap diff는 user-owned/pre-existing out-of-scope로 남겼으며 이 task의 구현으로 판정하지 않는다”는 근거를 남긴다. `agent-roadmap/current.md`는 git 추적 제외 로컬 포인터이므로 이 task에서 수정하지 않는다.

#### 중간 검증

```bash
git diff -- agent-roadmap/phase/trading-expansion/PHASE.md agent-roadmap/phase/trading-expansion/milestones/live-trading-boundary.md
```

### [REVIEW_REVIEW_LIVE_PORT-4] Verification Artifact

#### 문제

2차 review artifact의 최종 검증에는 `go test -count=1 ./apps/cli/...` 출력이 빠져 있다.

#### 해결 방법

최종 검증 결과에 `go test -count=1 ./apps/cli/...` 실제 stdout/stderr를 포함한다. `bin/lint` analyzer info는 exit code가 0이면 그대로 통과 evidence로 둔다.

## 최종 검증

```bash
bin/contracts-check
go test -count=1 ./packages/domain/...
go test -count=1 ./packages/contracts/gen/go/...
go test -count=1 ./services/worker/...
go test -count=1 ./services/api/...
go test -count=1 ./apps/cli/...
cd apps/client && flutter test test/contracts/alt_contracts_test.dart
command -v flutter
bin/lint
git diff --check
cd apps/client && dart format --output=none --set-exit-if-changed lib/src/contracts/alt_contracts.dart test/contracts/alt_contracts_test.dart
```

기대 결과: 모든 명령 exit code 0. `bin/lint`가 analyzer info를 출력해도 exit code가 0이면 그 출력을 실제 stdout/stderr로 기록한다.
