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

# Code Review Reference - REVIEW_REVIEW_LIVE_PORT

> **[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.
> Do not ask the user directly, present choices in chat, or call `request_user_input` during implementation; record the needed decision in `사용자 리뷰 요청` and stop for code-review.
> Finalization (`코드리뷰 결과`, log rename, `complete.log`, archive moves, `코드리뷰 전용 체크리스트`) is review-agent-only, even after compaction/resume.

## 개요

date=2026-06-07
task=m-live-trading-boundary/01_broker_port, plan=2, tag=REVIEW_REVIEW_LIVE_PORT

## 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

## 구현 항목별 완료 여부

| 항목 | 완료 여부 |
|------|---------|
| [REVIEW_REVIEW_LIVE_PORT-1] API live handler가 worker call timeout을 별도 테스트로 검증한다. | [x] |
| [REVIEW_REVIEW_LIVE_PORT-2] API `TestCapabilitiesAndHandlersSync`가 live handler와 `"live-trading"` capability 동기화를 직접 검증한다. | [x] |
| [REVIEW_REVIEW_LIVE_PORT-3] tracked roadmap diff가 implementation-owned면 범위에서 제거하고, user-owned/pre-existing이면 review artifact에 명확히 제외 근거를 기록한다. | [x] |
| [REVIEW_REVIEW_LIVE_PORT-4] 최종 검증 출력에 `go test -count=1 ./apps/cli/...` stdout/stderr를 포함한다. | [x] |

## 구현 체크리스트

- [x] [REVIEW_REVIEW_LIVE_PORT-1] API live handler가 worker call timeout을 별도 테스트로 검증한다.
- [x] [REVIEW_REVIEW_LIVE_PORT-2] API `TestCapabilitiesAndHandlersSync`가 live handler와 `"live-trading"` capability 동기화를 직접 검증한다.
- [x] [REVIEW_REVIEW_LIVE_PORT-3] tracked roadmap diff가 implementation-owned면 범위에서 제거하고, user-owned/pre-existing이면 review artifact에 명확히 제외 근거를 기록한다.
- [x] [REVIEW_REVIEW_LIVE_PORT-4] 최종 검증 출력에 `go test -count=1 ./apps/cli/...` stdout/stderr를 포함한다.
- [x] CODE_REVIEW-*-G??.md의 구현 에이전트 소유 섹션을 실제 구현 내용과 검증 출력으로 채운다. 이 항목이 완료되기 전에는 구현이 완료된 것이 아니다.

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

> **[REVIEW AGENT ONLY]** 이 체크리스트는 코드리뷰 에이전트만 사용한다.
> 구현 에이전트는 이 섹션을 수정하거나 체크하지 않는다.

- [x] `코드리뷰 결과`에 `PASS`, `WARN`, `FAIL` 중 하나의 판정을 append한다.
- [x] 판정과 `차원별 평가`, Required/Suggested/Nit 분류가 서로 일치한다.
- [x] active `CODE_REVIEW-*-G??.md`를 `code_review_cloud_G06_N.log`로 아카이브한다.
- [x] active `PLAN-*-G??.md`를 `plan_local_G07_M.log`로 아카이브한다.
- [x] `.gitignore`의 Agent-Ops 관리 block이 `agent-task/**/*.md`와 `agent-task/**/*.log`를 unignore하고 `agent-roadmap/current.md`를 ignore하는지 확인한다.
- [x] PASS이면 `agent-ops/skills/common/code-review/templates/complete-log-template.md` 기준으로 `complete.log`를 작성하고 active `.md` 파일을 남기지 않는다.
- [x] PASS이면 active task 디렉터리 `agent-task/m-live-trading-boundary/01_broker_port/`를 `agent-task/archive/YYYY/MM/m-live-trading-boundary/01_broker_port/`로 이동하고 최종 archive 경로에서 이 체크리스트를 갱신한다.
- [x] PASS이고 task group이 `m-<milestone-slug>`이면 런타임이 읽을 완료 이벤트 메타데이터를 보고하고, roadmap 수정이나 `update-roadmap` 직접 호출을 하지 않는다.
- [x] PASS split 작업이면 이동 후 빈 active parent `agent-task/m-live-trading-boundary/`를 제거하거나, 남은 sibling/file이 있어 유지했다고 확인한다.
- [ ] WARN/FAIL이고 user-review gate가 트리거되지 않았으면 다음 active `PLAN-local-G07.md`와 `CODE_REVIEW-cloud-G06.md`를 작성하고 `complete.log`를 작성하지 않는다.
- [ ] USER_REVIEW이면 `agent-ops/skills/common/code-review/templates/user-review-template.md` 기준으로 `USER_REVIEW.md`를 작성하고 active `PLAN-*.md`, `CODE_REVIEW-*.md`, `complete.log`를 남기지 않는다.
- [ ] USER_REVIEW가 사용자 결정으로 완료/PASS 해소되면 `USER_REVIEW.md`를 해소 상태로 갱신하고 `complete.log`를 작성한 뒤 task directory를 archive로 이동한다.

## 계획 대비 변경 사항

1. `services/api/internal/socket/live_test.go`에 `TestHandleGetLiveBrokerCapabilitiesWorkerCallTimeout`을 추가해 `fakeWorkerClient{err: workerclient.ErrTimeout, isConnected: true}` 경로가 `backtestErrorTimeout`으로 매핑되는지 검증했다. 기존 `connectErr: workerclient.ErrTimeout` 테스트는 Connect failure 경로 검증으로 유지했다.
2. `services/api/internal/socket/server_test.go`의 `TestCapabilitiesAndHandlersSync`에 `GetLiveBrokerCapabilitiesRequest` handler 등록과 `"live-trading"` capability 동기화 assertion을 추가했다.
3. `agent-roadmap/phase/trading-expansion/PHASE.md`와 `agent-roadmap/phase/trading-expansion/milestones/live-trading-boundary.md`의 tracked diff는 workspace-port-env-standardization 미션 및 roadmap 상태 결정에서 온 user-owned/pre-existing out-of-scope 변경으로 남겼다. 이 task의 reviewable implementation diff로 판정하지 않는다.
4. 리뷰 중 `dart format --output=none --set-exit-if-changed`가 `apps/client/lib/src/contracts/alt_contracts.dart`, `apps/client/test/contracts/alt_contracts_test.dart` 포맷 드리프트를 보고해, 비동작성 포맷만 정리한 뒤 format check와 Flutter contract test를 재확인했다.

## 주요 설계 결정

1. API live timeout coverage는 Connect failure와 worker call failure를 분리한다. 같은 timeout code라도 handler가 worker method call까지 도달했는지 call count로 확인한다.
2. Capability sync 검증은 Hello response expected map만 보지 않고, 등록된 handler map과 `capabilitiesForSession` 결과를 직접 대조한다.
3. Roadmap 상태 diff는 이 subtask의 구현 산출물로 취급하지 않는다. m-task PASS finalization은 runtime completion metadata만 보고하고 roadmap 수정은 직접 수행하지 않는다.

## 사용자 리뷰 요청

_기본값은 `없음`이다. 구현 중 사용자 결정, 사용자 소유 외부 환경/secret/서비스 준비, 또는 계획 범위 변경 없이는 안전하게 진행할 수 없으면 아래 항목을 실제 내용으로 교체하고, 구현을 중단한 뒤 active 파일을 그대로 둔 채 리뷰를 요청한다. 구현 에이전트는 사용자에게 직접 질문하거나 선택지를 제시하거나 `request_user_input`을 호출하지 않는다. 후속 에이전트가 명령 재실행이나 산출물 수집으로 해소할 수 있는 검증 증거 공백만으로는 사용자 리뷰 요청을 작성하지 않는다._

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

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

- API live timeout test가 `connectErr`가 아니라 worker call `err` path를 검증하는지 확인한다.
- `TestCapabilitiesAndHandlersSync`가 live handler/capability sync를 직접 확인하는지 확인한다.
- tracked roadmap diff가 제거됐거나 user-owned/pre-existing으로 명확히 제외 기록됐는지 확인한다.
- 최종 검증에 `go test -count=1 ./apps/cli/...` 출력이 포함됐는지 확인한다.

## 검증 결과

아래 출력은 구현/리뷰 중 재확인한 실제 stdout/stderr 및 exit code 기록이다.

### REVIEW_REVIEW_LIVE_PORT-1/2 중간 검증
```text
$ go test -count=1 ./services/api/internal/socket
ok  	git.toki-labs.com/toki/alt/services/api/internal/socket	0.010s
Exit code: 0
```

### REVIEW_REVIEW_LIVE_PORT-3 중간 검증
```text
$ git diff -- agent-roadmap/phase/trading-expansion/PHASE.md agent-roadmap/phase/trading-expansion/milestones/live-trading-boundary.md
diff --git a/agent-roadmap/phase/trading-expansion/PHASE.md b/agent-roadmap/phase/trading-expansion/PHASE.md
@@
-[진행중] Live Trading Boundary
+[진행중] 워크스페이스 포트/환경 표준화
+[계획] Live Trading Boundary
diff --git a/agent-roadmap/phase/trading-expansion/milestones/live-trading-boundary.md b/agent-roadmap/phase/trading-expansion/milestones/live-trading-boundary.md
@@
-[진행중]
+[계획]
@@
-- 상태: 잠금
+- 상태: 해제
Exit code: 0
```

### 최종 검증
```text
$ bin/contracts-check
(no output)
Exit code: 0

$ go test -count=1 ./packages/domain/...
ok  	git.toki-labs.com/toki/alt/packages/domain/backtest	0.002s
ok  	git.toki-labs.com/toki/alt/packages/domain/market	0.002s
ok  	git.toki-labs.com/toki/alt/packages/domain/trading	0.002s
Exit code: 0

$ go test -count=1 ./packages/contracts/gen/go/...
?   	git.toki-labs.com/toki/alt/packages/contracts/gen/go/alt/v1	[no test files]
Exit code: 0

$ go test -count=1 ./services/worker/...
ok  	git.toki-labs.com/toki/alt/services/worker/cmd/alt-worker	0.011s
?   	git.toki-labs.com/toki/alt/services/worker/cmd/alt-worker-data-check	[no test files]
ok  	git.toki-labs.com/toki/alt/services/worker/cmd/alt-worker-migrate	0.012s
ok  	git.toki-labs.com/toki/alt/services/worker/internal/backtest	0.004s
ok  	git.toki-labs.com/toki/alt/services/worker/internal/config	0.003s
ok  	git.toki-labs.com/toki/alt/services/worker/internal/contracts	0.012s
ok  	git.toki-labs.com/toki/alt/services/worker/internal/jobs	0.006s
ok  	git.toki-labs.com/toki/alt/services/worker/internal/marketdata/datacheck	0.008s
ok  	git.toki-labs.com/toki/alt/services/worker/internal/marketdata/importer	0.006s
ok  	git.toki-labs.com/toki/alt/services/worker/internal/papertrading	0.005s
ok  	git.toki-labs.com/toki/alt/services/worker/internal/providers/kis	0.035s
ok  	git.toki-labs.com/toki/alt/services/worker/internal/rediskeys	0.008s
ok  	git.toki-labs.com/toki/alt/services/worker/internal/socket	0.075s
?   	git.toki-labs.com/toki/alt/services/worker/internal/storage	[no test files]
ok  	git.toki-labs.com/toki/alt/services/worker/internal/storage/postgres	0.148s
?   	git.toki-labs.com/toki/alt/services/worker/internal/storage/postgres/sqlc	[no test files]
Exit code: 0

$ go test -count=1 ./services/api/...
?   	git.toki-labs.com/toki/alt/services/api/cmd/alt-api	[no test files]
ok  	git.toki-labs.com/toki/alt/services/api/internal/config	0.002s
ok  	git.toki-labs.com/toki/alt/services/api/internal/contracts	0.007s
ok  	git.toki-labs.com/toki/alt/services/api/internal/socket	0.010s
ok  	git.toki-labs.com/toki/alt/services/api/internal/workerclient	0.413s
Exit code: 0

$ go test -count=1 ./apps/cli/...
?   	git.toki-labs.com/toki/alt/apps/cli/cmd/alt	[no test files]
ok  	git.toki-labs.com/toki/alt/apps/cli/internal/cli	0.007s
ok  	git.toki-labs.com/toki/alt/apps/cli/internal/operator	0.174s
Exit code: 0

$ cd apps/client && flutter test test/contracts/alt_contracts_test.dart
00:00 +0: loading /config/workspace/alt/apps/client/test/contracts/alt_contracts_test.dart
00:00 +0: ALT contracts parser map helper tests altParserMap contains all expected parsers and passes round-trip parsing
00:00 +1: All tests passed!
Exit code: 0

$ command -v flutter
/sdk/flutter/bin/flutter
Exit code: 0

$ bin/lint
13 analyzer info entries for avoid_print in lib/src/integrations/mattermost/mattermost_auth_service.dart.
Exit code: 0

$ git diff --check
(no output)
Exit code: 0

$ cd apps/client && dart format --output=none --set-exit-if-changed lib/src/contracts/alt_contracts.dart test/contracts/alt_contracts_test.dart
Formatted 2 files (0 changed) in 0.01 seconds.
Exit code: 0
```

---

> **[IMPLEMENTING AGENT — BEFORE SAVING] Have you filled in every implementation-owned section: completion table, implementation checklist, changes from plan, design decisions, and verification output?**
> If anything is blank, go back and fill it in before saving this file.
> Leave review-agent-only sections unchanged.

## 코드리뷰 결과

- 종합 판정: PASS
- 차원별 평가:
  - Correctness: Pass
  - Completeness: Pass
  - Test coverage: Pass
  - API contract: Pass
  - Code quality: Pass
  - Plan deviation: Pass
  - Verification trust: Pass
- 발견된 문제: 없음
- 리뷰 메모:
  - `services/api/internal/socket/live_test.go`의 worker call timeout test가 `connectErr`가 아닌 worker call `err: workerclient.ErrTimeout` 경로를 검증한다.
  - `services/api/internal/socket/server_test.go`의 sync test가 live handler registration과 `"live-trading"` capability를 직접 대조한다.
  - tracked roadmap diff는 active review artifact에 user-owned/pre-existing out-of-scope로 기록됐으므로 이 task 구현 diff로 판정하지 않았다.
  - 리뷰 중 Dart contract helper/test 포맷 드리프트만 정리했고, `dart format --output=none --set-exit-if-changed`, Flutter contract test, API socket test, `git diff --check`를 재확인했다.
- 다음 단계: PASS finalization으로 `complete.log` 작성 및 task archive 이동을 수행한다.
