<!-- task=m-paper-trading-command-workflow/04+01,02,03_ui_handoff plan=1 tag=REVIEW_PAPER_HANDOFF -->

# Plan - REVIEW_PAPER_HANDOFF

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

이 plan은 `code_review_local_G04_0.log`의 Required 2건만 해결한다. 사용자에게 직접 질문하지 않는다. 사용자만 결정할 수 있는 UI 우선순위나 범위 충돌이 드러나면 `CODE_REVIEW-local-G05.md`의 `사용자 리뷰 요청` 섹션에 근거와 재개 조건을 기록하고 중단한다.

## 배경

G04 구현은 `paper_trading_state` handoff row와 key 검증을 추가했지만, predecessor `03+02_order_lifecycle`가 만든 `paper_order_lifecycle` command/fixture key를 matrix에 반영하지 못했고, 테스트가 paper row의 command/repeatable/UI defer cell을 row 단위로 강제하지 못했다.

## Roadmap Targets

- Milestone: `agent-roadmap/phase/trading-expansion/milestones/paper-trading-command-workflow.md`
- Task ids:
  - `paper-ui-handoff`: paper UI handoff
- Completion mode: check-on-pass

## 분석 결과

### 읽은 파일

- `agent-task/m-paper-trading-command-workflow/04+01,02,03_ui_handoff/code_review_local_G04_0.log`
- `agent-task/m-paper-trading-command-workflow/04+01,02,03_ui_handoff/plan_local_G04_0.log`
- `apps/cli/testdata/operator/headless_validation.md`
- `apps/cli/internal/operator/handoff_test.go`
- `apps/cli/testdata/operator/paper_order_lifecycle.yaml`
- `apps/cli/testdata/operator/expected/paper_order_lifecycle.jsonl`
- `apps/cli/testdata/operator/paper_trading_state.yaml`
- `apps/cli/testdata/operator/expected/paper_trading_state.jsonl`

### 테스트 환경 규칙

`test_env=local`, operations smoke. Focused verification is `go test -count=1 ./apps/cli/internal/operator`; final smoke is `bin/test`.

### 범위 결정 근거

Flutter screen implementation is still out of scope. Do not invent dashboard layout. Only document command-first handoff evidence and strengthen matrix drift tests for the paper command workflow rows.

## 구현 체크리스트

- [ ] [REVIEW_PAPER_HANDOFF-1] `apps/cli/testdata/operator/headless_validation.md`에 `paper_order_lifecycle` row를 추가하고 command, input fixture, expected fixture, expected output keys, exit code, repeatable operation, UI candidate, checked field, UI defer reason을 문서화한다.
- [ ] [REVIEW_PAPER_HANDOFF-2] `apps/cli/internal/operator/handoff_test.go`가 `paper_trading_state`와 `paper_order_lifecycle` row의 command/input fixture/expected fixture/expected output keys/repeatable operation/UI candidate/UI defer reason을 row 단위로 검증하게 한다.
- [ ] [REVIEW_PAPER_HANDOFF-3] Flutter 파일을 변경하지 않고 `go test -count=1 ./apps/cli/internal/operator`, `bin/test`, `git diff --check`를 실행해 결과를 기록한다.
- [ ] CODE_REVIEW-local-G05.md의 구현 에이전트 소유 섹션을 실제 구현 내용과 검증 출력으로 채운다. 이 항목이 완료되기 전에는 구현이 완료된 것이 아니다.

## REVIEW_PAPER_HANDOFF-1

### 문제

G04 handoff matrix는 `paper_trading_state`만 추가해서 predecessor order lifecycle command evidence를 빠뜨렸다.

### 해결 방법

`paper_order_lifecycle` row를 추가한다. Expected output keys는 `expected/paper_order_lifecycle.jsonl`의 실제 key를 기준으로 `scenario`, `status`, `type`, `action`, `account_id`, `run_id`, `run_status`, `cash`, `equity_point_count`, `fill_count`, `latest_equity`, `position_count`, `risk`, `order_id`, `order_status`, `fill_price`를 포함한다. UI candidate/defer reason은 화면 확정이 아니라 후속 UI 후보와 미정 사유만 적는다.

### 수정 파일 및 체크리스트

- [ ] `apps/cli/testdata/operator/headless_validation.md`

### 테스트 작성

`handoff_test.go`의 matrix-driven checks가 새 row와 promised keys를 강제하게 한다.

### 중간 검증

`go test -count=1 ./apps/cli/internal/operator`

## REVIEW_PAPER_HANDOFF-2

### 문제

현재 테스트는 Expected output keys 중심이고, 계획이 요구한 paper command, 반복 운영 여부, UI defer reason 검증은 row 단위로 강제하지 않는다.

### 해결 방법

Markdown table parser가 `Scenario`, `Command`, `Input fixture`, `Expected output fixture`, `Expected output keys`, `Repeatable operation`, `UI candidate`, `UI defer reason` column을 읽어 paper rows를 구조적으로 검증하게 한다. `paper_trading_state`와 `paper_order_lifecycle` 각각에 대해 expected command/path, non-empty key set, repeatable operation 값, non-empty UI candidate/defer reason을 확인한다.

### 수정 파일 및 체크리스트

- [ ] `apps/cli/internal/operator/handoff_test.go`

### 테스트 작성

누락된 paper row, command/path drift, 비어 있는 repeatable/UI candidate/UI defer reason, promised key 누락이 실패하게 한다.

### 중간 검증

`go test -count=1 ./apps/cli/internal/operator`

## REVIEW_PAPER_HANDOFF-3

### 문제

G04 review artifact에는 최종 `bin/test` 출력이 없었고, 이번 follow-up은 전체 smoke 결과를 명시적으로 기록해야 한다.

### 해결 방법

focused test, full smoke, whitespace check를 실행하고 `CODE_REVIEW-local-G05.md`에 실제 stdout/stderr를 기록한다.

### 수정 파일 및 체크리스트

- [ ] `agent-task/m-paper-trading-command-workflow/04+01,02,03_ui_handoff/CODE_REVIEW-local-G05.md`

### 테스트 작성

추가 테스트는 REVIEW_PAPER_HANDOFF-2에 포함된다.

### 중간 검증

`go test -count=1 ./apps/cli/internal/operator`

## 의존 관계 및 구현 순서

1. `headless_validation.md`에 `paper_order_lifecycle` row를 추가한다.
2. `handoff_test.go`의 matrix parsing/row assertions를 보강한다.
3. focused/full verification을 실행하고 review stub을 채운다.

## 수정 파일 요약

| 파일 | 항목 |
|---|---|
| `apps/cli/testdata/operator/headless_validation.md` | REVIEW_PAPER_HANDOFF-1 |
| `apps/cli/internal/operator/handoff_test.go` | REVIEW_PAPER_HANDOFF-2 |
| `agent-task/m-paper-trading-command-workflow/04+01,02,03_ui_handoff/CODE_REVIEW-local-G05.md` | REVIEW_PAPER_HANDOFF-3 |

## 최종 검증

```bash
go test -count=1 ./apps/cli/internal/operator
bin/test
git diff --check
```

모든 코드 변경 완료 후 반드시 `CODE_REVIEW-local-G05.md`의 구현 에이전트 소유 섹션을 채운다. 이 파일 작성이 구현의 마지막 단계다.
