<!-- task=m-flutter-console-skeleton/01_preview_flow plan=1 tag=REVIEW_UI -->

# Code Review Reference - REVIEW_UI

> **[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.
> Do not ask the user directly, present choices in chat, or call `request_user_input` during implementation; record the needed decision in `사용자 리뷰 요청` and stop for code-review.
> 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-16
task=m-flutter-console-skeleton/01_preview_flow, plan=1, tag=REVIEW_UI

## Roadmap Targets

- Milestone: `agent-roadmap/phase/control-plane-product-surface/milestones/flutter-console-skeleton.md`
- Task ids:
  - `preview-flow`: 원격 preview 명령 `make client-run-web OTO_SERVER_HTTP_URL=http://toki-labs.com:18020` 기준으로 첫 화면이 Core API endpoint와 UI 스켈레톤을 안정적으로 렌더링한다.
- Completion mode: check-on-pass

## Archive Evidence Snapshot

- Current archived plan: `agent-task/m-flutter-console-skeleton/01_preview_flow/plan_cloud_G07_0.log`
- Current archived review: `agent-task/m-flutter-console-skeleton/01_preview_flow/code_review_cloud_G07_0.log`
- Verdict: FAIL
- Required summary:
  - Required 1: `make client-run-web OTO_SERVER_HTTP_URL=http://toki-labs.com:18020` was replaced with `flutter run -d web-server`; reviewer rerun of the Makefile target failed with `No supported devices found with name or id matching 'chrome'`.
  - Required 2: first-screen evidence was replaced with HTML shell and JS asset serving; no screenshot or UI-tree evidence proves `Build Operations Overview` and the Runners/Pipelines/Executions/Artifacts/Settings skeleton rendered in a browser.
- Affected files:
  - `Makefile`
  - `apps/client/lib/src/app/oto_client_app.dart`
  - `apps/client/lib/src/app/core_connection_client.dart`
  - `apps/client/pubspec.yaml`
  - `apps/client/pubspec.lock`
  - `apps/client/test/widget_test.dart`
  - `packages/flutter/oto_console/lib/src/oto_console_contract.dart`
  - `packages/flutter/oto_console/lib/src/oto_console_overview.dart`
  - `packages/flutter/oto_console/lib/src/oto_console_shell.dart`
  - `packages/flutter/oto_console/test/oto_console_test.dart`
- Verification evidence:
  - Core preflight passed: `curl -fsS http://toki-labs.com:18020/healthz && printf '\n' && curl -fsS http://toki-labs.com:18020/readyz && printf '\n'` -> `OK`, `OK`
  - Reviewer rerun passed: `cd apps/client && flutter pub get`
  - Reviewer rerun passed: `cd apps/client && flutter analyze` -> `No issues found!`
  - Reviewer rerun passed: `cd apps/client && flutter test` -> `All tests passed!`
  - Reviewer rerun passed: `cd packages/flutter/oto_console && flutter pub get`
  - Reviewer rerun passed: `cd packages/flutter/oto_console && flutter analyze` -> `No issues found!`
  - Reviewer rerun passed: `cd packages/flutter/oto_console && flutter test` -> `All tests passed!`
  - Reviewer rerun failed as expected in current container: `timeout 45s make client-run-web OTO_SERVER_HTTP_URL=http://toki-labs.com:18020` -> exit code 2, Chrome device unavailable
- Roadmap/spec carryover:
  - Roadmap target remains `preview-flow`.
  - No Spec Targets.
- Allowed narrow reread paths:
  - `agent-task/m-flutter-console-skeleton/01_preview_flow/plan_cloud_G07_0.log`
  - `agent-task/m-flutter-console-skeleton/01_preview_flow/code_review_cloud_G07_0.log`

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

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

각 항목의 구현을 실제 소스 파일과 대조하고, `검증 결과` 섹션의 출력이 코드와 일치하는지 확인하세요.
리뷰 완료는 아래 순서까지 끝난 상태를 의미합니다.

1. 판정을 append한다.
2. `CODE_REVIEW-cloud-G07.md` -> `code_review_cloud_G07_N.log`, `PLAN-cloud-G07.md` -> `plan_cloud_G07_M.log`로 아카이브한다.
3. PASS이면 `complete.log` 작성 후 active task 디렉터리를 `agent-task/archive/YYYY/MM/m-flutter-console-skeleton/01_preview_flow/`로 이동한다. WARN/FAIL이면 user-review gate를 확인한 뒤 다음 active plan/review 파일 또는 `USER_REVIEW.md`를 작성한다. `USER_REVIEW.md`가 사용자 결정으로 완료/PASS 해소되면 code-review가 `USER_REVIEW.md`를 해소 상태로 갱신하고 `complete.log` 작성 후 archive 이동한다.
4. PASS이고 task group이 `m-flutter-console-skeleton`이면 완료 이벤트 메타데이터를 보고한다. roadmap 상태 체크와 `update-roadmap` 호출은 런타임 책임이다.
5. 적용 가능한 `코드리뷰 전용 체크리스트` 항목을 최종 `.log` 위치에서 체크한 뒤 보고한다.

---

## 구현 항목별 완료 여부

| 항목 | 완료 여부 |
|------|---------|
| [REVIEW_UI-1] Chrome Preview Command Recovery | [BLOCKED — 사용자 리뷰 요청 참조] |
| [REVIEW_UI-2] First Screen Evidence Recovery | [BLOCKED — 사용자 리뷰 요청 참조] |
| [REVIEW_UI-3] Regression Verification And Cleanup | [x] |

## 구현 체크리스트

- [x] 원격 Core endpoint preflight로 `http://toki-labs.com:18020/healthz`와 `/readyz`가 HTTP 200 `OK`를 반환하는지 기록한다.
- [ ] Chrome-capable 환경에서 `make client-run-web OTO_SERVER_HTTP_URL=http://toki-labs.com:18020`를 실행하고 `/tmp/oto-client-run-web.log`와 `/tmp/oto-client-run-web.pid`를 남긴다. — **BLOCKED: 사용자 리뷰 요청 참조**
- [ ] 실행 중인 Chrome preview에서 첫 화면 screenshot 또는 UI-tree evidence를 수집하고 `OTO_SERVER_HTTP_URL`, `Build Operations Overview`, `Runners`, `Pipelines`, `Executions`, `Artifacts`, `Settings` 확인 결과와 증거 경로를 기록한다. — **BLOCKED: 사용자 리뷰 요청 참조**
- [ ] preview 프로세스를 종료하고 cleanup 로그를 기록한다. — **BLOCKED: Chrome preview 미실행**
- [x] `apps/client`와 `packages/flutter/oto_console`의 setup/analyze/test 검증을 실행하고 실제 stdout/stderr를 기록한다.
- [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_{review_lane}_GNN_N.log`로 아카이브한다.
- [x] active `PLAN-*-G??.md`를 `plan_{build_lane}_GNN_M.log`로 아카이브한다.
- [x] `.gitignore`의 Agent-Ops 관리 block이 `agent-task/**/*.md`와 `agent-task/**/*.log`를 unignore하고 `agent-roadmap/current.md`를 ignore하는지 확인한다.
- [x] PASS이면 `agent-ops/skills/common/code-review/templates/complete-log-template.md` 기준으로 `complete.log`를 작성하고 active `.md` 파일을 남기지 않는다.
- [x] PASS이면 active task 디렉터리 `agent-task/m-flutter-console-skeleton/01_preview_flow/`를 `agent-task/archive/YYYY/MM/m-flutter-console-skeleton/01_preview_flow/`로 이동하고 최종 archive 경로에서 이 체크리스트를 갱신한다.
- [x] PASS이고 task group이 `m-<milestone-slug>`이면 런타임이 읽을 완료 이벤트 메타데이터를 보고하고, roadmap 수정이나 `update-roadmap` 직접 호출을 하지 않는다.
- [x] PASS split 작업이면 이동 후 빈 active parent `agent-task/m-flutter-console-skeleton/`를 제거하거나, 남은 sibling/file이 있어 유지했다고 확인한다.
- [ ] WARN/FAIL이고 user-review gate가 트리거되지 않았으면 다음 active `PLAN-{build_lane}-GNN.md`와 `CODE_REVIEW-{review_lane}-GNN.md`를 작성하고 `complete.log`를 작성하지 않는다.
- [x] USER_REVIEW이면 `agent-ops/skills/common/code-review/templates/user-review-template.md` 기준으로 `USER_REVIEW.md`를 작성하고 active `PLAN-*.md`, `CODE_REVIEW-*.md`, `complete.log`를 남기지 않는다.
- [x] USER_REVIEW가 사용자 결정으로 완료/PASS 해소되면 `USER_REVIEW.md`를 해소 상태로 갱신하고 `complete.log`를 작성한 뒤 task directory를 archive로 이동한다.

## 계획 대비 변경 사항

- REVIEW_UI-1 중간 검증 명령(`bash -lc 'set -euo pipefail; ... make client-run-web ...'`)은 컨테이너 Chrome 부재로 실행 불가. 원격 Mac에서 대체 방법을 3회 시도했으나 모두 실패(아래 참조).
- REVIEW_UI-2 스크린샷 수집: headless Chrome CDP(90초 대기), Mac `open -a "Google Chrome"` + `screencapture`, osascript 3경로 모두 실패.
- 계획 fallback 지시(`사용자 소유 환경 준비가 필요한지 사용자 리뷰 요청에 기록한다`)에 따라 `사용자 리뷰 요청`을 작성하고 REVIEW_UI-1/2를 BLOCKED 처리한다.

## 주요 설계 결정

1. **Flutter web headless 한계 확인**: headless Chrome에서 `document.querySelector("flt-glass-pane,canvas,flt-scene")` 90초 polling → 항상 `found=false`. Flutter SkWasm/DDC 렌더링 파이프라인은 실제 GPU/display context 없이는 초기화되지 않는다.
2. **macOS SSH display 차단 확인**: Mac에서 `screencapture -x` 및 `osascript -e "do shell script \"screencapture...\""` → `could not create image from display`. macOS 26이 SSH 세션에서 screen capture API를 차단한다.
3. **Mac flutter devices에 Chrome 확인**: `flutter devices` 출력에 `Chrome (web) • chrome • web-javascript • Google Chrome 149.0.7827.104` 존재 — Chrome 자체는 설치돼 있으나 SSH에서 GUI 렌더링/스크린샷 불가.
4. **Mac 기존 web server 상태**: PID 38227에서 `flutter run -d web-server --web-port=13020 --dart-define=OTO_SERVER_HTTP_URL=http://toki-labs.com:18020` 실행 중 (구 코드). 사용자 소유 프로세스이므로 임의 종료 금지.
5. **커밋된 코드 UI 검증**: git diff 확인 결과 "Build Operations Overview" 텍스트는 이미 커밋된 버전에도 존재하며 Runners/Pipelines/Executions/Artifacts/Settings 네비게이션 레일도 커밋된 코드에 있음. 단, `OtoCoreConnectionSnapshot` 통합은 현재 컨테이너의 uncommitted 변경에만 있음.

## 사용자 리뷰 요청

- 상태: **차단됨**
- 사유 유형: 사용자 소유 외부 환경 — Chrome-capable display context 접근 불가
- 결정 필요: 아래 재개 조건 중 하나를 사용자가 선택하여 실행

### 차단 근거

**컨테이너 환경:**
```
$ flutter devices
Found 1 connected device:
  Linux (desktop) • linux • linux-arm64 • Ubuntu 24.04.4 LTS

$ command -v google-chrome
NOT FOUND: google-chrome
$ command -v chromium
NOT FOUND: chromium
$ command -v chromium-browser
NOT FOUND: chromium-browser
```
컨테이너에 Chrome/Chromium 없음. `make client-run-web` → `No supported devices found with name or id matching 'chrome'`.

**원격 Mac (toki@toki-labs.com) 환경:**
```
$ flutter --version | head -1
Flutter 3.44.0 • channel stable

$ flutter devices
Found 3 connected devices:
  sdk gphone64 arm64 (mobile) • emulator-5554 • android-arm64  • Android 14 (API 34) (emulator)
  macOS (desktop)             • macos         • darwin-arm64   • macOS 26.0.1 25A362 darwin-arm64
  Chrome (web)                • chrome        • web-javascript • Google Chrome 149.0.7827.104

$ ls "/Applications/Google Chrome.app/Contents/MacOS/Google Chrome"
/Applications/Google Chrome.app/Contents/MacOS/Google Chrome
CHROME_OK
```
Chrome 설치돼 있고 `flutter devices`에 Chrome device 존재. 단:
- PID 38227이 구 코드로 `flutter run -d web-server --web-port=13020`을 점유 중 (사용자 소유 프로세스)
- `screencapture -x /tmp/...` → `could not create image from display` (macOS 26 SSH 보안 정책)
- `osascript -e "do shell script \"screencapture...\""` → 동일 오류
- CDP headless Chrome 90초 polling → `{"found":false,"tag":"none","children":1}`, 4939 bytes blank PNG

### 실행한 검증/명령

1. `curl http://toki-labs.com:18020/healthz`, `/readyz` → `OK`, `OK` ✅
2. `cd apps/client && flutter pub get && flutter analyze && flutter test` → `No issues found!`, `All tests passed!` ✅
3. `cd packages/flutter/oto_console && flutter pub get && flutter analyze && flutter test` → `No issues found!`, `All tests passed!` ✅
4. 컨테이너 `make client-run-web OTO_SERVER_HTTP_URL=http://toki-labs.com:18020` → Chrome device 없음으로 실패
5. Mac에 `flutter_wait_render.py` (CDP headless, 90초 polling) → `hasFlutter=false` 지속, 4939 bytes
6. Mac SSH `open -a "Google Chrome" "http://localhost:13020"` → exit 0 (Chrome 열림)
7. Mac SSH `screencapture -x /tmp/oto_chrome_screen.png` → `could not create image from display`
8. Mac SSH `osascript -e "do shell script \"screencapture -x /tmp/oto_chrome_as.png\""` → 동일 오류

### 자동 후속 불가 이유

- 컨테이너에 Chrome 없음 → `make client-run-web` 불가
- Mac SSH에서 macOS 26이 display/screen capture API를 차단 → 스크린샷 취득 불가
- Mac PID 38227 (사용자 소유) 종료 없이 포트 13020 재사용 불가
- 구 코드로는 `OtoCoreConnectionSnapshot` 통합 증거 미포함

### 재개 조건

다음 중 하나를 사용자가 수행하면 후속 에이전트가 `make client-run-web` 로그와 스크린샷을 채울 수 있다:

**Option A (권장): 사용자가 Mac 터미널에서 직접 실행**
```bash
# Mac 터미널에서 실행 (SSH 아님)
cd /Users/toki/agent-work/oto
# 기존 서버 종료 (선택)
kill 38227 2>/dev/null || true
# 최신 코드 반영 (git pull or git stash drop)
git pull  # 또는 컨테이너에서 git push 후
make client-run-web OTO_SERVER_HTTP_URL=http://toki-labs.com:18020
```
Chrome이 열리면 스크린샷을 `/tmp/oto-preview-first-screen.png`으로 저장하여 에이전트에 제공.

**Option B: Container에 Chromium 설치**
```bash
# Container root 권한 확보 후
apt-get install -y chromium
# 또는 snap install chromium
```
설치 후 `make client-run-web`이 자동으로 작동함.

**Option C: 코드를 push/commit 후 Mac에서 git pull + 실행**
현재 uncommitted 변경을 push하고 Mac에서 `git pull` 후 위 Option A 실행.

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

- `make client-run-web OTO_SERVER_HTTP_URL=http://toki-labs.com:18020` 또는 동일 Makefile target이 Chrome device로 실행됐는지 확인한다.
- first screen evidence가 HTML shell이 아니라 실제 browser screenshot 또는 UI-tree evidence인지 확인한다.
- evidence가 `OTO_SERVER_HTTP_URL`, `Build Operations Overview`, `Runners`, `Pipelines`, `Executions`, `Artifacts`, `Settings` 확인 결과를 포함하는지 확인한다.
- Chrome/device 부재가 반복되면 사용자 리뷰 요청이 충분한 command evidence와 재개 조건을 갖췄는지 확인한다.

## 검증 결과

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

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

### REVIEW_UI-1 중간 검증

```bash
$ curl -fsS http://toki-labs.com:18020/healthz && printf '\n' && curl -fsS http://toki-labs.com:18020/readyz && printf '\n'
OK
OK
```

```bash
$ bash -lc 'set -euo pipefail; rm -f /tmp/oto-client-run-web.log /tmp/oto-client-run-web.pid; make client-run-web OTO_SERVER_HTTP_URL=http://toki-labs.com:18020 > /tmp/oto-client-run-web.log 2>&1 & echo $! > /tmp/oto-client-run-web.pid; ...'
# BLOCKED — 컨테이너에 Chrome device 없음. 실행 시 동일한 오류 발생:
# cd apps/client && flutter run -d chrome --web-port=13020 --dart-define=OTO_SERVER_HTTP_URL=http://toki-labs.com:18020
# Error: No supported devices found with name or id matching 'chrome'.
# flutter devices (container): Found 1 connected device: Linux (desktop) • linux • linux-arm64 • Ubuntu 24.04.4 LTS
```

원격 Mac에서의 시도 결과 (대체 방법, 모두 실패):
```
# 시도 1: CDP headless Chrome (Mac SSH, /tmp/flutter_wait_render.py, 90s polling)
Ready 1s
Polling for Flutter render (90s max)...
  5s: {'found': False, 'tag': 'none', 'children': 1}
  ...
  90s: {'found': False, 'tag': 'none', 'children': 1}
Flutter elements not found after 90s, taking screenshot anyway
OK: /tmp/oto-preview-final.png (4939 bytes)   ← blank PNG

# 시도 2: Mac에서 Chrome 열기 + screencapture
$ ssh toki@toki-labs.com 'open -a "Google Chrome" "http://localhost:13020"'
open_status=0   ← Chrome 열림
$ ssh toki@toki-labs.com 'sleep 25 && screencapture -x /tmp/oto_chrome_screen.png'
could not create image from display   ← macOS 26 SSH 보안 정책

# 시도 3: osascript screencapture
$ ssh toki@toki-labs.com 'osascript -e "do shell script \"screencapture -x /tmp/oto_chrome_as.png\""'
0:57: execution error: could not create image from display (1)   ← 동일
```

Mac `flutter devices` 출력 (참조용):
```
Flutter 3.44.0 • channel stable • https://github.com/flutter/flutter.git
Found 3 connected devices:
  sdk gphone64 arm64 (mobile) • emulator-5554 • android-arm64  • Android 14 (API 34)
  macOS (desktop)             • macos         • darwin-arm64   • macOS 26.0.1 25A362 darwin-arm64
  Chrome (web)                • chrome        • web-javascript • Google Chrome 149.0.7827.104
/Applications/Google Chrome.app/Contents/MacOS/Google Chrome  ← CHROME_OK
```

Mac 기존 실행 프로세스:
```
PID 38227: dartvm ... flutter_tools.snapshot run -d web-server
    --web-hostname=0.0.0.0 --web-port=13020
    --dart-define=OTO_SERVER_HTTP_URL=http://toki-labs.com:18020
    (구 코드, /Users/toki/agent-work/oto/apps/client)
```

### REVIEW_UI-2 중간 검증

```bash
$ bash -lc 'test -f /tmp/oto-client-run-web.pid && kill -0 ...'
# BLOCKED — Chrome preview 프로세스 미실행
```

Screenshot/UI-tree evidence path:

```text
BLOCKED — 사용자 리뷰 요청 참조.
수집 불가 이유:
  - 컨테이너: Chrome device 없음
  - Mac headless Chrome: hasFlutter=false (90초 polling 후에도 Flutter 렌더링 초기화 안됨)
  - Mac GUI Chrome: open_status=0로 Chrome 열렸으나 SSH에서 screencapture 불가
    (macOS 26 SSH 세션 display 접근 차단)
```

### REVIEW_UI-3 중간 검증

```bash
$ cd apps/client && flutter pub get && flutter analyze && flutter test
Resolving dependencies...
Got dependencies!
Analyzing client...
No issues found! (ran in 6.5s)
00:00 +0: loading /config/workspace/oto/apps/client/test/widget_test.dart
00:00 +0: OTO client hosts embeddable console widgets
00:00 +1: All tests passed!
```

```bash
$ cd packages/flutter/oto_console && flutter pub get && flutter analyze && flutter test
Resolving dependencies...
Got dependencies!
Analyzing oto_console...
No issues found! (ran in 2.6s)
00:00 +0: loading /config/workspace/oto/packages/flutter/oto_console/test/oto_console_test.dart
00:00 +0: exports console contract models without shell dependency
00:00 +1: renders embeddable OTO console shell
00:01 +2: renders section surfaces with empty states
00:01 +3: All tests passed!
```

```bash
$ bash -lc 'if test -f /tmp/oto-client-run-web.pid; then kill ...; fi; tail -120 /tmp/oto-client-run-web.log'
# /tmp/oto-client-run-web.pid 미생성 — Chrome preview 미실행으로 cleanup 대상 없음
```

### 최종 검증

```bash
$ cd /config/workspace/oto && curl -fsS http://toki-labs.com:18020/healthz && printf '\n' && curl -fsS http://toki-labs.com:18020/readyz && printf '\n'
OK
OK
```

```bash
$ cd /config/workspace/oto/apps/client && flutter pub get && flutter analyze && flutter test
Got dependencies!
No issues found! (ran in 6.5s)
All tests passed!
```

```bash
$ cd /config/workspace/oto/packages/flutter/oto_console && flutter pub get && flutter analyze && flutter test
Got dependencies!
No issues found! (ran in 2.6s)
All tests passed!
```

```bash
$ cd /config/workspace/oto && bash -lc '... make client-run-web OTO_SERVER_HTTP_URL=http://toki-labs.com:18020 ...'
# BLOCKED — Chrome device 없음 (컨테이너). 사용자 리뷰 요청 참조.
```

```bash
$ cd /config/workspace/oto && bash -lc 'test -f /tmp/oto-client-run-web.pid && ...'
# BLOCKED — Chrome preview 프로세스 미실행.
```

```bash
$ cd /config/workspace/oto && bash -lc 'if test -f /tmp/oto-client-run-web.pid; then kill ...; fi; ...'
# /tmp/oto-client-run-web.pid 없음 — cleanup 대상 없음.
```

---

> **[IMPLEMENTING AGENT — BEFORE SAVING] Have you filled in every implementation-owned section: completion table, implementation checklist, changes from plan, design decisions, and verification output?**
> If anything is blank, go back and fill it in before saving this file.
> Leave review-agent-only sections unchanged.

## Ownership

| Section | Owner | Note |
|---------|-------|------|
| Header comment, 개요, 리뷰 에이전트 지시 | Fixed at stub creation | Implementing agent must not modify or execute these |
| Roadmap Targets | Follow-up plan에서 복사 | Implementing agent must not modify; code-review copies it into `complete.log` as `Roadmap Completion` only on PASS |
| Archive Evidence Snapshot | Follow-up plan에서 복사 | Implementing agent may use only listed archive paths for narrow reread |
| 구현 항목별 완료 여부 | Implementing agent | Check completed items only |
| 구현 체크리스트 | Implementing agent | Check completed items only; final checkbox is mandatory before saving |
| 코드리뷰 전용 체크리스트 | Review agent only | Implementing agent must not modify or check |
| 계획 대비 변경 사항, 주요 설계 결정 | Implementing agent | Replace placeholder text with actual content |
| 사용자 리뷰 요청 | Implementing agent | Keep `상태: 없음` unless user input is required |
| 리뷰어를 위한 체크포인트 | Fixed at stub creation | Pre-filled from plan |
| 검증 결과 | Implementing agent | Fill actual stdout/stderr and evidence paths |
| 코드리뷰 결과 | Review agent appends | Not included in stub |

## 코드리뷰 결과

- 종합 판정: FAIL
- 차원별 평가:
  - correctness: Fail
  - completeness: Fail
  - test coverage: Pass
  - API contract: Pass
  - code quality: Pass
  - plan deviation: Pass
  - verification trust: Fail
- 발견된 문제:
  - Required: `CODE_REVIEW-cloud-G07.md:91`, `CODE_REVIEW-cloud-G07.md:167`, `PLAN-cloud-G07.md:75` - `preview-flow`의 필수 증거인 Chrome preview 실행과 first-screen screenshot/UI-tree evidence가 아직 없다. 다만 구현 에이전트가 컨테이너 Chrome 부재, 원격 Mac SSH `screencapture` 실패, 원격 기존 process 점유를 실제 명령 출력으로 기록했고, 리뷰어 재확인에서도 컨테이너는 일반 사용자이며 sudo 설치가 불가하고 원격 Mac `screencapture`는 `could not create image from display`로 실패했다. 사용자 소유 GUI/display 환경 준비 후 `make client-run-web OTO_SERVER_HTTP_URL=http://toki-labs.com:18020`와 첫 화면 증거를 다시 수집해야 한다.
- 리뷰어 재검증:
  - `curl -fsS http://toki-labs.com:18020/healthz && printf '\n' && curl -fsS http://toki-labs.com:18020/readyz && printf '\n'` -> `OK`, `OK`
  - `id` -> `uid=1000(abc)`, sudo non-interactive 권한 없음
  - `command -v google-chrome/chromium/chromium-browser` -> 모두 없음
  - `flutter devices` -> `Linux (desktop)`만 감지
  - 원격 Mac `/Applications/Google Chrome.app/...` -> `CHROME_OK`
  - 원격 Mac PID `38227` -> `/Users/toki/SDK/flutter/... flutter_tools.snapshot run -d web-server --web-port=13020 ...`
  - 원격 Mac `screencapture -x /tmp/oto_review_probe.png` -> `could not create image from display`
- 다음 단계: USER_REVIEW. 사용자 소유 Chrome/display 환경 또는 컨테이너 Chromium 설치 조건이 준비될 때까지 자동 follow-up을 중단한다.
