<!-- task=m-control-plane-jenkins-aligned-layout-pass/01_definition_shell_foundation plan=2 tag=REVIEW_REVIEW_LAYOUT -->

# Plan - REVIEW_REVIEW_LAYOUT Remote Runner Verification Trust Recovery

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

`CODE_REVIEW-*-G??.md`의 구현 에이전트 소유 섹션 작성은 필수다. 구현 후 검증을 실행하고 실제 변경 내용, 설계 결정, 명령 출력, 체크리스트를 채운 뒤 active 파일을 그대로 둔 상태로 리뷰 준비를 보고한다. 최종 판정, log rename, `complete.log`, archive 이동은 code-review 전용이다.

선택된 Milestone `구현 잠금 > 결정 필요` 항목 때문에 막힌 경우에만 review stub의 `사용자 리뷰 요청` 섹션을 정확한 연결 근거와 함께 채우고 멈춘다. 구현 중 사용자에게 직접 묻거나, 선택지를 제시하거나, `request_user_input`을 호출하거나, `USER_REVIEW.md`/`complete.log`를 만들지 않는다. 환경/secret/service 차단, 일반 범위 변경, 검증 evidence 공백은 사용자 리뷰 요청이 아니라 검증 결과 또는 follow-up 대상이다.

## 배경

`LAYOUT` 구현 코드는 로컬 보조 검증을 통과했지만, 원격 runner 기준 검증 계약은 두 번 연속 실패했다. 최신 리뷰 재실행에서도 local HEAD는 `8de7822`, 원격 checkout은 `7e51ef9`였고, 원격 worktree는 dirty였으며 `command -v flutter`가 exit 1이었다. 이 follow-up은 제품 코드 재작업이 아니라 원격 runner 검증 신뢰를 비파괴적으로 회복하거나, 회복 불가 사유를 더 좁고 결정적인 evidence로 남기는 작업이다.

## Roadmap Targets

- Milestone: `agent-roadmap/phase/control-plane-product-surface/milestones/control-plane-jenkins-aligned-layout-pass.md`
- Task ids:
  - `layout-definition`: Jenkins reference baseline, view/component Target Layout Delta, status=`계획` 정합성 고정
  - `shell-layout`: `console-shell`과 `console-rail`을 Jenkins refreshed header/action context와 운영 destination grouping에 맞춰 재배치
- Completion mode: check-on-pass

## Archive Evidence Snapshot

- Archived plan logs:
  - `agent-task/m-control-plane-jenkins-aligned-layout-pass/01_definition_shell_foundation/plan_local_G06_0.log`
  - `agent-task/m-control-plane-jenkins-aligned-layout-pass/01_definition_shell_foundation/plan_local_G06_1.log`
- Archived review logs:
  - `agent-task/m-control-plane-jenkins-aligned-layout-pass/01_definition_shell_foundation/code_review_local_G06_0.log`
  - `agent-task/m-control-plane-jenkins-aligned-layout-pass/01_definition_shell_foundation/code_review_local_G06_1.log`
- Latest verdict: FAIL
- Required summary:
  - 원격 runner 기준 Flutter 검증 계약 미충족. 원격 checkout은 이번 구현 HEAD(`8de7822`)와 동기화되지 않았고, 원격 worktree는 dirty이며, 원격 PATH에서 Flutter를 찾지 못했다.
  - `packages/flutter/oto_console`와 `apps/client`의 원격 `flutter analyze && flutter test`는 실행되지 않았다. 로컬 보조 검증은 PASS지만 이 task의 completion evidence를 대체할 수 없다.
- Review rerun evidence:
  - `ssh -o BatchMode=yes -o ConnectTimeout=10 toki@toki-labs.com 'cd /Users/toki/agent-work/oto && ... && command -v flutter && flutter --version | head -n 1'`: `branch=master`, `head=7e51ef9`, dirty worktree, `ssh_exit=1`.
  - `git rev-parse --short HEAD && git diff --check`: `8de7822`; `git diff --check` PASS, no output.
  - agent-ui layout target status check: `agent-ui layout target docs ok`.
  - `/sdk/flutter/bin/flutter analyze && /sdk/flutter/bin/flutter test` in `packages/flutter/oto_console`: `No issues found!`; `All tests passed!`.
  - `/sdk/flutter/bin/flutter analyze && /sdk/flutter/bin/flutter test` in `apps/client`: `No issues found!`; `All tests passed!`.
- Affected files:
  - `packages/flutter/oto_console/lib/src/oto_console_shell.dart`
  - `packages/flutter/oto_console/test/oto_console_test.dart`
  - `apps/client/test/widget_test.dart`
  - `agent-ui/definition/views/{overview,runners,pipelines,executions,artifacts,settings}/index.md`
  - `agent-ui/definition/components/{console-shell,console-rail,section-surface}/index.md`
- Roadmap carryover: same Roadmap Targets remain active; no `Agent UI Completion` status update is claimed in this follow-up.
- User-review gate: not triggered. Milestone `구현 잠금` is `해제`, `결정 필요` is `없음`; the blocker is remote runner source/PATH verification evidence.
- Allowed archive reread for this follow-up: only the four archived files listed above if exact previous context is needed.

## 범위 결정 근거

후속 범위는 원격 runner 검증 신뢰 회복 하나다. Dirty 원격 checkout을 `reset`, `clean`, `checkout --`, `pull --rebase` 등으로 덮어쓰지 않는다. 제품 코드와 agent-ui 문서는 원격 analyze/test가 현재 HEAD 기준 실제 코드 오류를 보고할 때만 최소 수정한다. Flutter가 원격에 없거나 현재 HEAD를 안전하게 검증할 수 없으면 PASS를 주장하지 말고, 더 좁은 차단 evidence를 남긴다.

## 구현 체크리스트

- [ ] local HEAD, local dirty 상태, 원격 checkout branch/head/status, 원격에 현재 HEAD(`8de7822`) commit 객체가 있는지, 원격 Flutter 후보 탐색 결과를 실제 stdout/stderr로 기록한다.
- [ ] 원격 dirty checkout을 훼손하지 않는 검증 경로를 확보한다. 가능한 경우 현재 HEAD(`8de7822`) 기준의 깨끗한 원격 checkout 또는 worktree와 Flutter binary 경로를 명시한다. 불가능하면 어떤 조건 때문에 불가능한지 명령 출력으로 기록한다.
- [ ] 원격 runner의 `packages/flutter/oto_console`에서 현재 HEAD 기준 `flutter analyze`와 `flutter test`를 실행하고 실제 stdout/stderr를 기록한다. 실행 불가 시 source sync 또는 Flutter PATH 차단 사유를 그대로 기록하되 PASS로 표시하지 않는다.
- [ ] 원격 runner의 `apps/client`에서 현재 HEAD 기준 `flutter analyze`와 `flutter test`를 실행하고 실제 stdout/stderr를 기록한다. 실행 불가 시 source sync 또는 Flutter PATH 차단 사유를 그대로 기록하되 PASS로 표시하지 않는다.
- [ ] agent-ui layout target 문서가 계속 `계획` 상태인지 확인하고, `git diff --check`를 재실행해 결과를 기록한다.
- [ ] 로컬 보조 검증(`/sdk/flutter/bin/flutter analyze && /sdk/flutter/bin/flutter test`)을 `packages/flutter/oto_console`와 `apps/client`에서 재실행하고 결과를 기록한다. 로컬 PASS는 원격 PASS의 대체 evidence가 아님을 명시한다.
- [ ] CODE_REVIEW-*-G??.md의 구현 에이전트 소유 섹션을 실제 검증 출력으로 채운다. 이 항목이 완료되기 전에는 구현이 완료된 것이 아니다.

## 의존 관계 및 구현 순서

이 subtask는 predecessor가 없다. PASS 후 `02+01_primary_views`와 `03+01,02_execution_artifact_views`가 이 shell foundation을 기준으로 구현한다.

### [REVIEW_REVIEW_LAYOUT-1] Remote Runner Source/Flutter Verification Recovery

#### 문제

원격 runner 검증 계약이 충족되지 않았다. 현재 원격 기본 checkout은 local HEAD `8de7822`가 아니고, dirty worktree가 있으며, Flutter가 PATH에 없어 원격 analyze/test가 실행되지 않았다.

#### 해결 방법

원격 상태를 비파괴적으로 진단한다. 원격에 현재 HEAD commit 객체와 Flutter binary가 존재하면 dirty checkout을 건드리지 않는 깨끗한 검증 checkout/worktree에서 `packages/flutter/oto_console`와 `apps/client`의 analyze/test를 실행한다. commit 객체나 Flutter binary가 없으면 어떤 조건이 부족한지 실제 출력으로 좁혀 기록하고 PASS를 주장하지 않는다.

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

- [ ] `agent-task/m-control-plane-jenkins-aligned-layout-pass/01_definition_shell_foundation/CODE_REVIEW-cloud-G07.md`: 원격 source/Flutter discovery, 원격 analyze/test, local 보조 검증의 실제 출력 기록.
- [ ] 코드 파일: 원격 analyze/test가 현재 HEAD 기준 실제 코드 오류를 보고할 때만 최소 수정.

#### 테스트 작성

새 테스트를 작성하지 않는다. 이 follow-up은 기존 Flutter analyze/test를 원격 runner에서 신뢰 가능한 evidence로 실행 또는 차단 증명하는 작업이다.

#### 중간 검증

```bash
git rev-parse --short HEAD && git status --short && git diff --check
```

```bash
ssh -o BatchMode=yes -o ConnectTimeout=10 toki@toki-labs.com 'cd /Users/toki/agent-work/oto && printf "workdir=%s\n" "$PWD" && printf "branch=" && git rev-parse --abbrev-ref HEAD && printf "head=" && git rev-parse --short HEAD && printf "status-start\n" && git status --short && printf "status-end\n" && printf "has-current-head=" && (git cat-file -e 8de7822^{commit} && echo yes || echo no) && printf "flutter-candidates-start\n" && (command -v flutter || true) && for p in /opt/homebrew/bin/flutter /usr/local/bin/flutter /Users/toki/flutter/bin/flutter /Users/toki/development/flutter/bin/flutter; do [ -x "$p" ] && printf "%s\n" "$p"; done && printf "flutter-candidates-end\n"'
```

#### 최종 검증

기본 명령은 아래와 같다. 원격 dirty checkout을 건드리지 않기 위해 깨끗한 checkout/worktree 또는 full Flutter path가 필요하면, 정확한 대체 명령과 이유를 `계획 대비 변경 사항`에 기록한다.

```bash
ssh -o BatchMode=yes -o ConnectTimeout=10 toki@toki-labs.com 'cd /Users/toki/agent-work/oto/packages/flutter/oto_console && flutter analyze && flutter test'
```

```bash
ssh -o BatchMode=yes -o ConnectTimeout=10 toki@toki-labs.com 'cd /Users/toki/agent-work/oto/apps/client && flutter analyze && flutter test'
```

```bash
python3 - <<'PY'
from pathlib import Path
targets = [
  'agent-ui/definition/views/overview/index.md',
  'agent-ui/definition/views/runners/index.md',
  'agent-ui/definition/views/pipelines/index.md',
  'agent-ui/definition/views/executions/index.md',
  'agent-ui/definition/views/artifacts/index.md',
  'agent-ui/definition/views/settings/index.md',
  'agent-ui/definition/components/console-shell/index.md',
  'agent-ui/definition/components/console-rail/index.md',
  'agent-ui/definition/components/section-surface/index.md',
]
for p in targets:
    text = Path(p).read_text()
    if 'status: 계획' not in text and 'Status: `계획`' not in text:
        raise SystemExit(f'layout target status drift: {p}')
print('agent-ui layout target docs ok')
PY
```

```bash
(cd packages/flutter/oto_console && /sdk/flutter/bin/flutter analyze && /sdk/flutter/bin/flutter test)
(cd apps/client && /sdk/flutter/bin/flutter analyze && /sdk/flutter/bin/flutter test)
```
