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

# Plan - Review Follow-up: Focused Handoff Guard Execution

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

이 plan은 직전 code review FAIL을 해소하기 위한 좁은 후속 지시서다. 구현 완료 전 active `CODE_REVIEW-*-G??.md`의 구현 에이전트 소유 섹션을 실제 내용과 검증 출력으로 채운다. 최종 판정, archive 이동, `complete.log` 작성은 code-review-skill 전용이다. 사용자-only blocker가 있으면 review stub의 `사용자 리뷰 요청` 섹션을 채우고 멈춘다.

## 배경

G06 구현은 handoff matrix의 `invalid_request_matrix` key를 실제 fixture의 `error_code`/`error_message`와 맞추고, matrix-driven key-contract 테스트를 추가했다. 하지만 definitive 테스트 이름이 `Handoff`를 포함하지 않아 plan의 focused verification인 `go test ./apps/cli/internal/operator -run Handoff -count=1`에서 실행되지 않았다. 전체 CLI 테스트는 통과하지만, 이 task의 focused handoff guard가 이전 `code` 회귀를 잡는다는 검증 계약은 아직 충족되지 않았다.

## 사용자 리뷰 요청 흐름

구현 중 사용자-only blocker는 active review stub의 `사용자 리뷰 요청` 섹션에 기록한다. code-review가 이를 검증하고 실제 `USER_REVIEW.md` 작성 여부를 결정한다.

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

## 분석 결과

### 읽은 파일

- `agent-task/m-command-first-operator-workflow/05+03,04_operator_handoff/plan_local_G06_1.log`
- `agent-task/m-command-first-operator-workflow/05+03,04_operator_handoff/code_review_local_G06_1.log`
- `apps/cli/internal/operator/handoff_test.go`
- `apps/cli/testdata/operator/headless_validation.md`
- `apps/cli/testdata/operator/expected/invalid_request_matrix.jsonl`
- `agent-test/local/rules.md`
- `agent-test/local/operations-smoke.md`
- `agent-ops/rules/project/domain/operations/rules.md`

### 실패 요약

- `apps/cli/internal/operator/handoff_test.go`의 `TestExpectedFixturesWithMatrixPromisedKeys`가 핵심 matrix-driven key-contract 테스트지만, 이름에 `Handoff`가 없어 `go test ./apps/cli/internal/operator -run Handoff -count=1`에서 실행되지 않는다.
- 리뷰 재실행 결과 `-run Handoff -v`는 `TestHeadlessValidationHandoffCoversRequiredScenarios`, `TestHandoffMatrixDocumentsCommandFirstColumns`, `TestHandoffDocumentedScenarioFixturesExist`만 실행했다.
- 따라서 `invalid_request_matrix` row에 `code`를 재도입하면 focused handoff test가 실패해야 한다는 G06 checklist 검증 조건이 충족되지 않았다.

### 테스트 환경 규칙

- test_env: `local`.
- Matched profile: `operations-smoke`.
- Applied commands: focused handoff test with `-v`, CLI package tests, key-test name grep, `git diff --check`.

### 범위 결정 근거

- 포함: handoff key-contract 테스트 이름과 focused verification evidence 정렬.
- 제외: handoff matrix 내용 변경, expected JSONL fixture content 변경, command behavior 변경, Flutter UI/wireframe/layout 확정, roadmap 상태 갱신 또는 archive 이동.

### 빌드 등급

- build=`local-G06`, review=`local-G06`: 실패 원인은 명시적이고 deterministic한 test routing/evidence gap이다. 같은 local grade에서 좁게 수정 가능하다.

## 구현 체크리스트

- [ ] [REVIEW_REVIEW_DOCS-1] Rename the definitive matrix-promised key-contract test so it is executed by `go test ./apps/cli/internal/operator -run Handoff -count=1`, and keep the secondary promised-key guard aligned if it should be part of the same focused suite. 검증: the focused command with `-v` lists the matrix-promised key test.
- [ ] [REVIEW_REVIEW_DOCS-2] Run focused and package CLI verification plus key-test name grep and `git diff --check`, recording actual stdout/stderr.
- [ ] CODE_REVIEW-*-G??.md의 구현 에이gen트 소유 섹션을 실제 구현 내용과 검증 출력으로 채운다. 이 항목이 완료되기 전에는 구현이 완료된 것이 아니다.

## [REVIEW_REVIEW_DOCS-1] Focused Handoff Guard Execution

### 문제

`apps/cli/internal/operator/handoff_test.go`의 `TestExpectedFixturesWithMatrixPromisedKeys`는 matrix row의 `Expected output keys`를 fixture와 대조하는 핵심 guard다. 하지만 focused handoff verification command는 `-run Handoff`이고, 현재 테스트 이름에는 `Handoff`가 없어 실행되지 않는다.

### 해결 방법

Rename the definitive test to include `Handoff`, for example:

- before: `TestExpectedFixturesWithMatrixPromisedKeys`
- after: `TestHandoffExpectedFixturesWithMatrixPromisedKeys`

If the secondary hardcoded-map guard should remain in the focused suite, rename it similarly, for example `TestHandoffExpectedFixturesContainPromisedKeys`. Do not weaken the matrix-driven assertions and do not change fixture contents unless a real contract mismatch is discovered.

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

- [x] `apps/cli/internal/operator/handoff_test.go`: rename the matrix-driven key-contract test so `-run Handoff` executes it.
- [x] `apps/cli/internal/operator/handoff_test.go`: keep comments and review evidence consistent with the renamed test.

### 테스트 작성

No new assertion is required beyond keeping the existing matrix-driven key-contract test active in the focused suite.

### 중간 검증

```bash
go test ./apps/cli/internal/operator -run Handoff -count=1 -v
```

Expected: output includes the renamed matrix-promised key test, and the command exits 0.

## [REVIEW_REVIEW_DOCS-2] Verification

### 문제

The previous evidence reported focused handoff verification, but the output did not prove that the key-contract guard ran.

### 해결 방법

Record the focused test output with `-v` so the executed test list is visible, then run package-level CLI tests, grep for the renamed test, and run whitespace drift check.

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

- [ ] No extra source files beyond `apps/cli/internal/operator/handoff_test.go`.

### 테스트 작성

No additional tests.

### 중간 검증

```bash
rg --sort path -n 'func TestHandoff.*ExpectedFixtures' apps/cli/internal/operator/handoff_test.go
```

Expected: the renamed promised-key test appears in the grep output.

## 수정 파일 요약

| 파일 | 항목 |
|------|------|
| `apps/cli/internal/operator/handoff_test.go` | REVIEW_REVIEW_DOCS-1, REVIEW_REVIEW_DOCS-2 |

## 최종 검증

```bash
go test ./apps/cli/internal/operator -run Handoff -count=1 -v
go test ./apps/cli/... -count=1
rg --sort path -n 'func TestHandoff.*ExpectedFixtures' apps/cli/internal/operator/handoff_test.go
git diff --check
```

Expected: all commands exit 0, and the focused handoff output lists the matrix-promised key-contract test.

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