<!-- task=m-operator-headless-workflow-validation/03+02_backtest_workflows plan=3 tag=REVIEW_REVIEW_REVIEW_OPS -->

# Plan - REVIEW_REVIEW_REVIEW_OPS Matrix Assertion Finalization

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

`CODE_REVIEW-*-G??.md`의 구현 에이전트 소유 섹션을 실제 구현 내용과 검증 출력으로 채우는 것이 필수다. 구현 후 검증을 실행하고 실제 stdout/stderr를 붙여 넣은 뒤 active 파일을 그대로 두고 리뷰 준비를 보고한다. 사용자 결정, 사용자 소유 외부 환경/secret/서비스 준비, 또는 계획 범위 충돌로 막히면 review stub의 `사용자 리뷰 요청` 섹션에 근거를 채우고 멈춘다. 후속 에이전트가 명령 재실행이나 산출물 수집으로 해소할 수 있는 검증 증거 공백은 사용자 리뷰 요청이 아니다.

## 배경

세 번째 리뷰에서 runtime/dry-run matrix coverage와 JSONL non-zero path는 대부분 보강되었다. 남은 문제는 `start_backtest_missing_strategy` row의 expected marker가 row별로 검증되지 않는 점과, active review까지 포함한 `git diff --check`가 clean이 아니었던 점이다.

## 사용자 리뷰 요청 흐름

구현 중 blocker는 active review stub의 `사용자 리뷰 요청` 섹션에 `agent-ops/skills/common/_templates/implementation-user-review-request-section.md` 형식으로 기록한다. code-review가 해당 요청을 검증하고 실제 `USER_REVIEW.md` 작성 여부를 결정한다.

## Roadmap Targets

- Milestone: `agent-roadmap/phase/operator-surface/milestones/operator-headless-workflow-validation.md`
- Task ids:
  - `backtest-check`: backtest list/detail/result/start 관련 결과를 화면 없이 확인할 수 있다.
  - `error-output`: unavailable/error/disconnected 상태가 화면 없이도 판별 가능한 출력으로 남는다.
- Completion mode: check-on-pass

## 분석 결과

### 읽은 파일

- `agent-ops/skills/common/code-review/SKILL.md`
- `agent-task/m-operator-headless-workflow-validation/03+02_backtest_workflows/plan_cloud_G07_2.log`
- `agent-task/m-operator-headless-workflow-validation/03+02_backtest_workflows/code_review_cloud_G07_2.log`
- `apps/cli/internal/operator/runner_error_test.go`
- `apps/cli/internal/operator/scenario_test.go`
- `apps/cli/testdata/operator/invalid_request_matrix.yaml`
- `apps/cli/internal/operator/output.go`
- `apps/cli/internal/operator/runner.go`

### 테스트 환경 규칙

- `test_env=local`.
- 현재 shell 직접 테스트는 금지이며, 검증은 원격 테스트 host의 ALT checkout root에서 실행한다.
- 적용 profile: operations smoke because `apps/cli/**` and task artifacts changed.
- 리뷰 중 원격 code-server 컨테이너에서 exact focused command, `(cd apps/cli && go test -count=1 ./...)`, `bin/test`를 재실행했다.
- exact focused command의 Go test는 통과했지만 `git diff --check`는 active `CODE_REVIEW-cloud-G07.md` EOF blank line으로 실패했다.

### 테스트 커버리지 공백

- `TestInvalidRequestMatrixOutputsExpectedErrors` does not prove the `start_backtest_missing_strategy` row's expected `error_code`.
- `git diff --check` clean output is not currently reproducible with the active review file.

### 심볼 참조

- renamed/removed symbol: none.

### 분할 판단

- 기존 split subtask `03+02_backtest_workflows` 안의 리뷰 보완이며 새 sibling subtask를 만들지 않는다.
- predecessor `02`는 `agent-task/archive/2026/06/m-operator-headless-workflow-validation/02+01_api_market/complete.log`로 이미 충족되어 있다.

### 범위 결정 근거

- Runtime behavior, API/worker/contracts, Flutter UI는 수정하지 않는다.
- Test assertion and verification artifact cleanliness only.

### 빌드 등급

- build lane: `cloud-G07`, review lane: `cloud-G07`.
- 이유: terminal scenario matrix and stdout/exit-status contract evidence를 마무리한다.

## 구현 체크리스트

- [ ] `start_backtest_missing_strategy` runtime matrix row의 `status`와 `error_code`를 row-specific assertion으로 검증한다.
- [ ] active review file까지 포함해 `git diff --check`가 clean이 되도록 task artifact whitespace를 정리한다.
- [ ] 원격 ALT checkout root에서 focused CLI test, `git diff --check`, `(cd apps/cli && go test -count=1 ./...)`, `bin/test`를 실행한다.
- [ ] CODE_REVIEW-*-G??.md의 구현 에이전트 소유 섹션을 실제 구현 내용과 검증 출력으로 채운다. 이 항목이 완료되기 전에는 구현이 완료된 것이 아니다.

### [REVIEW_REVIEW_REVIEW_OPS-1] Row-Specific Matrix Assertion

#### 문제

`apps/cli/internal/operator/runner_error_test.go:247` checks only the `start_backtest_missing_strategy` step marker. The expected `not_found` marker is already covered by `compare_missing_runs`, so this row can regress without test failure.

#### 해결 방법

- Parse JSONL step events or otherwise assert row-specific substrings that include `step`, `status`, and `error_code`.
- Avoid global `strings.Contains(out, "\"error_code\":\"not_found\"")` as the only proof for multiple rows.

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

- [ ] `apps/cli/internal/operator/runner_error_test.go`: row-specific assertion 추가.

#### 테스트 작성

- Update: `TestInvalidRequestMatrixOutputsExpectedErrors`
  - Assert `start_backtest_missing_strategy` has `status=ok` for expected typed error handling and `error_code=not_found`, or equivalent JSONL-decoded fields.

#### 중간 검증

원격 ALT checkout root 기준:

```bash
(cd apps/cli && go test -count=1 ./internal/operator -run 'TestInvalidRequestMatrix')
```

기대 결과: exit code 0.

### [REVIEW_REVIEW_REVIEW_OPS-2] Verification Cleanliness

#### 문제

`git diff --check` failed on the active review artifact despite the review stub recording `(clean)`.

#### 해결 방법

- Remove trailing blank lines from the active `CODE_REVIEW-cloud-G07.md` before review handoff.
- Run `git diff --check` after the review stub is filled and paste the actual clean command output. If the command prints no stdout, record `(no output; exit code 0)`.

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

- [ ] `agent-task/m-operator-headless-workflow-validation/03+02_backtest_workflows/CODE_REVIEW-cloud-G07.md`: final EOF cleanliness 확인.
- [ ] Any touched Go file: run gofmt if needed.

#### 테스트 작성

- No new code test. This is verification artifact cleanliness.

#### 중간 검증

원격 ALT checkout root 기준:

```bash
git diff --check
```

기대 결과: exit code 0.

## 수정 파일 요약

| 파일 | 항목 |
|------|------|
| `apps/cli/internal/operator/runner_error_test.go` | REVIEW_REVIEW_REVIEW_OPS-1 |
| `agent-task/m-operator-headless-workflow-validation/03+02_backtest_workflows/CODE_REVIEW-cloud-G07.md` | REVIEW_REVIEW_REVIEW_OPS-2 |

## 최종 검증

원격 ALT checkout root 기준으로 실행한다. CLI output/exit code tests should be fresh; use `-count=1`.

```bash
(cd apps/cli && go test -count=1 ./internal/operator -run 'TestInvalidRequestMatrix|TestJSONLSummaryIncludesExitCode')
git diff --check
(cd apps/cli && go test -count=1 ./...)
bin/test
```

기대 결과: 모든 명령 exit code 0.

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