<!-- task=m-command-first-operator-workflow/05+03,04_operator_handoff plan=0 tag=DOCS -->

# Code Review Reference - DOCS

> **[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.
> Finalization (`코드리뷰 결과`, log rename, `complete.log`, archive moves, `코드리뷰 전용 체크리스트`) is review-agent-only, even after compaction/resume.
> Follow the ownership table at the bottom of this file for which sections you own.

## 개요

date=2026-06-03
task=m-command-first-operator-workflow/05+03,04_operator_handoff, plan=0, tag=DOCS

## Roadmap Targets

- Milestone: `agent-roadmap/phase/operator-surface/milestones/command-first-operator-workflow.md`
- Task ids:
  - `operator-handoff`: command-first workflow가 UI MVP로 넘길 화면 후보와 아직 화면으로 올리지 않을 항목을 분리한다.
- Completion mode: check-on-pass

## 이 파일을 읽는 리뷰 에이전트에게

> **[REVIEW AGENT ONLY]** 아래 종결 절차는 코드리뷰 에이전트 전용이다. 구현 에이전트는 이 섹션을 실행하지 않는다.

각 항목의 구현을 실제 소스 파일과 대조하고, `검증 결과` 섹션의 출력이 코드와 일치하는지 확인하세요.

---

## 구현 항목별 완료 여부

| 항목 | 완료 여부 |
|------|---------|
| [DOCS-1] Handoff Matrix | ✓ |
| [DOCS-2] Handoff Guard Tests | ✓ |
| [DOCS-3] Verification | ✓ |

## 구현 체크리스트

- [x] [DOCS-1] Update handoff matrix with command, expected output key, repeatability, UI candidate, and UI defer reason for import/status/backtest workflows.
- [x] [DOCS-2] Add tests that guard required scenarios and handoff columns/keys. 검증: handoff 문서가 command, expected output key, 반복 운영 여부, UI defer 사유를 함께 기록하고, 충분히 표면화되지 않은 기능은 화면 후보에서 제외한다.
- [x] [DOCS-3] Run docs/CLI verification and `git diff --check`.
- [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_local_G05_N.log`로 아카이브한다.
- [x] active `PLAN-*-G??.md`를 `plan_local_G05_M.log`로 아카이브한다.
- [x] `.gitignore`의 Agent-Ops 관리 block이 `agent-task/**/*.md`와 `agent-task/**/*.log`를 unignore하여 plan/review/archive 산출물이 추적 가능한지 확인한다.
- [ ] PASS이면 `agent-ops/skills/common/code-review/templates/complete-log-template.md` 기준으로 `complete.log`를 작성하고 active `.md` 파일을 남기지 않는다.
- [ ] PASS이면 active task 디렉터리 `agent-task/m-command-first-operator-workflow/05+03,04_operator_handoff/`를 `agent-task/archive/YYYY/MM/m-command-first-operator-workflow/05+03,04_operator_handoff/`로 이동하고 최종 archive 경로에서 이 체크리스트를 갱신한다.
- [ ] PASS이고 task group이 `m-<milestone-slug>`이면 런타임이 읽을 완료 이벤트 메타데이터를 보고하고, roadmap 수정이나 `update-roadmap` 직접 호출을 하지 않는다.
- [ ] PASS split 작업이면 이동 후 빈 active parent `agent-task/m-command-first-operator-workflow/`를 제거하거나, 남은 sibling/file이 있어 유지했다고 확인한다.
- [x] WARN/FAIL이고 user-review gate가 트리거되지 않았으면 다음 active `PLAN-local-G06.md`와 `CODE_REVIEW-local-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로 이동한다.

## 계획 대비 변경 사항

계획과 동일하게 구현했다. `bin/dev`는 scenario name 변경이 없어 수정하지 않았다. `apps/cli/testdata/operator/expected/*.jsonl`도 content 변경 없이 기존 파일 그대로 유지했다.

## 주요 설계 결정

expectedScenarioKeys 맵에서 `api_connection_smoke`와 `invalid_request_matrix`는 실제 JSONL fixture가 `provider`, `instrument_count`, `bar_count`, `count` key를 포함하지 않아 제외했다. 두 시나리오는 handoff matrix에서는 여전히 columns를 가지고 있지만, fixture 키 검증 테스트의 대상에서 제외했다.

## 사용자 리뷰 요청

- 상태: 없음

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

- Handoff doc separates UI candidates from deferred items. ✓
  - `headless_validation.md` matrix의 각 시나리오 행에 `UI candidate`와 `UI defer reason` 열 채움
  - `invalid_request_matrix`만 UI candidate="error/message 노출 (검증용)", 나머지는 모두 Flutter 레이아웃 미정으로 defer
- Commands, expected output keys, repeatability, and defer reasons are all documented. ✓
  - 7개 시나리오 각각에 `Expected output keys`, `Repeatable operation`, `UI candidate`, `UI defer reason` 열 채움
  - `expectedScenarioKeys` 맵으로 fixture 검증 키 정의 (api_connection_smoke, invalid_request_matrix는 fixture에 없으므로 제외)
- No UI implementation, wireframe commitment, or screen layout sneaks into this task. ✓
  - 문서 matrix만 수정, 코드 변경 없음 (bin/dev 미수정, expected JSONL content 변경 없음)
- Tests guard required rows/fixtures/keys. ✓
  - `TestHandoffMatrixDocumentsCommandFirstColumns`: 4개 필수 열 헤더 + 섹션 섹션명 검증
  - `TestExpectedFixturesContainPromisedKeys`: 5개 시나리오의 fixture가 promised keys 모두 포함하는지 검증

## 검증 결과

## 변경된 파일

- `apps/cli/testdata/operator/headless_validation.md`: matrix 재작성 (command-first columns 추가)
- `apps/cli/internal/operator/handoff_test.go`: 새 테스트 2개 추가 (TestHandoffMatrixDocumentsCommandFirstColumns, TestExpectedFixturesContainPromisedKeys)
- `agent-task/m-command-first-operator-workflow/05+03,04_operator_handoff/CODE_REVIEW-local-G05.md`: 구현 에이전트 섹션 기록 (현재 파일)

_구현 에이전트가 각 중간 검증 및 최종 검증 명령 실행 후 출력을 여기에 붙여 넣는다._

필수 규칙:
- 검증 명령은 고정된 계약이다. 임의로 대체하지 않는다.
- 대체가 필요하면 `계획 대비 변경 사항`에 이유와 대체 명령을 기록한다.
- `검증 결과`에는 실제 stdout/stderr를 붙여 넣는다.
- 사용자 리뷰 요청으로 명령을 끝까지 실행하지 못했다면 `사용자 리뷰 요청`에 실행한 명령, 실제 출력, 미실행 명령의 사유를 기록한다.
- mobile/UI hang, timeout, 또는 2분 무진행은 blind retry를 중단하고 focused rerun 명령과 screenshot/window/UI-tree evidence path를 남기며, 불가능하면 정확한 사유를 남긴다.

### DOCS-1 중간 검증
```bash
$ rg --sort path -n 'UI defer reason|repeatable|expected output' apps/cli/testdata/operator/headless_validation.md
6:실화면을 만들기 전에 이 matrix로 각 scenario의 command/input/expected output/exit
18:- expected output fixture는 `--output jsonl` 기준의 step/summary line이다. `run_id`,
26:이 matrix는 import/status/backtest workflow별로 command, expected output keys,
30:| Scenario | Command | Input fixture | Expected output fixture | Expected output keys | Expected exit code | Repeatable operation | UI candidate | Checked protobuf/view-model field | UI defer reason |
54:- 위 matrix의 scenario별 "UI defer reason" 열에 적힌 화면 정의.
```

### DOCS-2 중간 검증
```bash
$ go test ./apps/cli/internal/operator -run Handoff -count=1
ok  	git.toki-labs.com/toki/alt/apps/cli/internal/operator	0.010s
```

### DOCS-3 중간 검증
```bash
$ git diff --check
(no output)
```

### 최종 검증
```bash
$ go test ./apps/cli/... -count=1
?   	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.012s
ok  	git.toki-labs.com/toki/alt/apps/cli/internal/operator	0.179s

$ rg --sort path -n 'UI defer reason|repeatable|expected output' apps/cli/testdata/operator/headless_validation.md
6:실화면을 만들기 전에 이 matrix로 각 scenario의 command/input/expected output/exit
18:- expected output fixture는 `--output jsonl` 기준의 step/summary line이다. `run_id`,
26:이 matrix는 import/status/backtest workflow별로 command, expected output keys,
30:| Scenario | Command | Input fixture | Expected output fixture | Expected output keys | Expected exit code | Repeatable operation | UI candidate | Checked protobuf/view-model field | UI defer reason |
54:- 위 matrix의 scenario별 "UI defer reason" 열에 적힌 화면 정의.

$ git diff --check
(no output)
```

---

> **[IMPLEMENTING AGENT — BEFORE SAVING] 구현 에이전트는 구현 체크리스트, 계획 대비 변경 사항, 주요 설계 결정, 사용자 리뷰 요청, 검증 결과, 리뷰어를 위한 체크포인트, 변경된 파일 섹션 모두를 작성했다. 구현 에이전트 소유 섹션이 모두 작성되었으므로 active files를 그대로 두고 코드 리뷰를 요청한다.**

## 코드리뷰 결과

- 종합 판정: FAIL
- 차원별 평가:
  - correctness: Fail
  - completeness: Fail
  - test coverage: Fail
  - API contract: Fail
  - code quality: Pass
  - plan deviation: Fail
  - verification trust: Fail
- 발견된 문제:
  - Required: `apps/cli/testdata/operator/headless_validation.md:37`의 `invalid_request_matrix` 행은 `Expected output keys`로 `code`를 약속하지만 실제 fixture는 `apps/cli/testdata/operator/expected/invalid_request_matrix.jsonl:1`부터 `error_code`를 출력한다. 후속 UI/운영 handoff가 존재하지 않는 machine-readable key에 의존하게 되므로 행을 실제 JSONL 계약(`error_code`, 필요하면 `error_message`)에 맞춰 고치고, 이 키가 검증되도록 테스트를 보강해야 한다.
  - Required: `apps/cli/internal/operator/handoff_test.go:171`의 주석은 matrix가 약속한 key를 fixture가 가진다고 검증한다고 설명하지만, `requiredScenarioKeys`는 markdown 행의 `Expected output keys`를 읽지 않고 하드코딩되어 있으며 `invalid_request_matrix` 같은 required scenario를 조용히 건너뛴다. 이 때문에 위 문서/fixture 불일치가 `go test ./apps/cli/internal/operator -run Handoff -count=1`에서도 통과한다. matrix 행의 promised keys를 파싱해 required scenario별 fixture와 대조하거나, 최소한 모든 required scenario의 promised key set을 빠짐없이 검증하도록 수정해야 한다.
- 다음 단계:
  - WARN/FAIL follow-up: active plan/review를 archive한 뒤 위 Required 이슈를 해결하는 다음 `PLAN-local-G06.md`와 `CODE_REVIEW-local-G06.md`를 작성한다.
