<!-- task=m-control-plane-separation-migration/01_runner_app plan=1 tag=REVIEW_MONOREPO_RUNNER -->

# Implementation Plan - REVIEW_MONOREPO_RUNNER

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

`CODE_REVIEW-local-G05.md`의 구현 에이전트 소유 섹션을 실제 구현 내용과 검증 출력으로 채우는 것이 마지막 단계다. 검증을 실행하고, active 파일은 그대로 둔 채 리뷰 준비 상태를 보고한다. 사용자 결정, 사용자 소유 외부 환경/secret, 또는 범위 충돌 없이는 안전하게 진행할 수 없으면 review stub의 `사용자 리뷰 요청` 섹션에 근거를 남기고 중단한다. 구현 에이전트는 `USER_REVIEW.md`, archive log, `complete.log`를 만들지 않는다.

## 배경

이 후속 작업은 `code_review_cloud_G07_0.log`의 Required finding을 해결한다. runner package는 `apps/runner`로 이동했지만, tracked VS Code launch 설정은 여전히 제거된 root `./bin/main.dart`를 실행 대상으로 가리킨다.

## 사용자 리뷰 요청 흐름

구현 중 사용자 결정이 필요한 경우 active `CODE_REVIEW-local-G05.md`의 `사용자 리뷰 요청` 섹션에 기록한다. 해당 섹션은 `agent-ops/skills/common/_templates/implementation-user-review-request-section.md` 형식을 따른다. code-review가 요청을 검증하고 실제 `USER_REVIEW.md` 작성 여부를 결정한다.

## Roadmap Targets

- Milestone: `agent-roadmap/phase/independent-control-plane/milestones/control-plane-separation-migration.md`
- Task ids:
  - `runner-app`: 현재 OTO CLI/runtime 소스, 테스트, pubspec, 실행 entrypoint가 `apps/runner` 기준으로 이동되어 기존 로컬 CLI 실행이 유지된다.
- Completion mode: check-on-pass

## 분석 결과

### 읽은 파일

- `agent-task/m-control-plane-separation-migration/01_runner_app/plan_cloud_G07_0.log`
- `agent-task/m-control-plane-separation-migration/01_runner_app/code_review_cloud_G07_0.log`
- `.vscode/launch.json`
- `apps/runner/bin/main.dart`

### 범위 결정 근거

- 이 plan은 `.vscode/launch.json`의 stale runner entrypoint 참조만 수정한다.
- root helper, root README, Makefile, root-level delegation은 `04+01,02,03_root_entrypoints` 범위이므로 여기서 만들지 않는다.
- 코드, package manifest, Dart tests는 수정하지 않는다.

### 빌드 등급

- `local-G05`: tracked JSON launch 설정의 deterministic path 보정이며 grep과 runner CLI smoke로 검증 가능하다.

## 구현 체크리스트

- [ ] `.vscode/launch.json`의 OTO CLI launch entries가 제거된 root `./bin/main.dart` 대신 runner entrypoint를 사용한다.
- [ ] runner launch entries가 `apps/runner` package context에서 실행되도록 `cwd` 또는 동등한 설정을 포함한다.
- [ ] stale `./bin/main.dart` launch program 참조가 tracked VS Code 설정에서 사라졌음을 grep으로 확인한다.
- [ ] runner CLI smoke를 실행해 보정한 package context가 실제 CLI 실행과 호환됨을 확인한다.
- [ ] CODE_REVIEW-*-G??.md의 구현 에이전트 소유 섹션을 실제 구현 내용과 검증 출력으로 채운다. 이 항목이 완료되기 전에는 구현이 완료된 것이 아니다.

### [REVIEW_MONOREPO_RUNNER-1] Repair VS Code Runner Launch Paths

문제: `.vscode/launch.json`의 여러 launch entry가 `"program": "./bin/main.dart"`를 사용한다. `01_runner_app` 구현은 root `bin/main.dart`를 `apps/runner/bin/main.dart`로 이동했기 때문에, tracked launch 설정이 제거된 파일을 가리킨다.

해결 방법:

Before (`.vscode/launch.json:11`):
```json
"program": "./bin/main.dart"
```

After example:
```json
"cwd": "${workspaceFolder}/apps/runner",
"program": "${workspaceFolder}/apps/runner/bin/main.dart"
```

수정 지침:
- [ ] `.vscode/launch.json`에서 OTO CLI를 실행하는 모든 `"program": "./bin/main.dart"` entry를 runner entrypoint로 갱신한다.
- [ ] 각 entry가 runner package 기준으로 실행되도록 `cwd`를 `${workspaceFolder}/apps/runner`로 둔다. 동등하게 안전한 VS Code Dart launch 설정을 쓰는 경우 `계획 대비 변경 사항`에 이유를 남긴다.
- [ ] 기존 args는 이 후속 작업에서 새 root helper semantics로 재설계하지 않는다. 명백히 package-relative로만 해석되어야 하는 값은 runner `cwd` 기준을 유지한다.

테스트 작성: JSON launch 설정 보정이라 신규 Dart test는 만들지 않는다.

중간 검증:
```bash
if git grep -n '"program": "./bin/main.dart"' -- .vscode/launch.json; then exit 1; else echo "no stale launch program refs"; fi
```
예상 결과: `no stale launch program refs`.

## 수정 파일 요약

| 파일 | 항목 |
|------|------|
| `.vscode/launch.json` | REVIEW_MONOREPO_RUNNER-1 |

## 최종 검증

```bash
cd apps/runner && dart run bin/main.dart catalog --json
```
예상 결과: command catalog JSON이 stdout에 출력되고 exit code 0으로 종료한다.

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