<!-- task=m-control-plane-jenkins-menu-ia-code-sync/02+01_shell_jobs plan=0 tag=JENKINS_IA_SHELL -->

# Code Review Reference - JENKINS_IA_SHELL

> **[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 selected Milestone `구현 잠금 > 결정 필요` item, fill `사용자 리뷰 요청` with linked evidence and stop with active files in place; code-review decides whether to write `USER_REVIEW.md`.
> Do not ask the user directly, present choices in chat, or call `request_user_input` during implementation.
> Finalization is review-agent-only.

## 개요

date=2026-07-03
task=m-control-plane-jenkins-menu-ia-code-sync/02+01_shell_jobs, plan=0, tag=JENKINS_IA_SHELL

## Roadmap Targets

- Milestone: `agent-roadmap/phase/control-plane-product-surface/milestones/control-plane-jenkins-menu-ia-code-sync.md`
- Task ids:
  - `shell-menu-sync`: shell/global menu와 pipelines/jobs 화면이 `New Item`, `Pipelines`, `Build History`, job `Status`, job `Build History`, `Stages` 중심으로 동기화된다.
- Completion mode: check-on-pass

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

> **[REVIEW AGENT ONLY]** 아래 종결 절차는 코드리뷰 에이전트 전용이다.

각 항목의 구현을 실제 소스 파일과 대조하고, `검증 결과` 섹션의 출력이 코드와 일치하는지 확인하세요.

---

## 구현 항목별 완료 여부

| 항목 | 완료 여부 |
|------|---------|
| [JENKINS_IA_SHELL-1] Shell Header And Breadcrumb IA | [x] |
| [JENKINS_IA_SHELL-2] Jenkins Dashboard Jobs Surface | [x] |
| [JENKINS_IA_SHELL-3] Host Regression | [x] |

## 구현 체크리스트

- [x] [JENKINS_IA_SHELL-1] shell을 통합 header/breadcrumb/action/task navigation과 Jenkins Dashboard-level left menu 구조로 개편한다.
- [x] [JENKINS_IA_SHELL-2] pipelines/jobs 화면을 Jenkins dashboard job table/New Item/Build History 및 적용 가능한 job-context left task menu 구조로 개편한다.
- [x] [JENKINS_IA_SHELL-3] shell/jobs widget tests와 app host regression tests를 Jenkins IA primitive 기준으로 갱신한다.
- [x] `cd packages/flutter/oto_console && flutter analyze && flutter test`, `cd apps/client && flutter analyze && flutter test`, `git diff --check`를 실행한다.
- [x] CODE_REVIEW-*-G??.md의 구현 에이전트 소유 섹션을 실제 구현 내용과 검증 출력으로 채운다. 이 항목이 완료되기 전에는 구현이 완료된 것이 아니다.

## Agent UI Completion

- Mode: review-pass-status-update
- Agent UI docs:
  - `agent-ui/definition/index.md`
  - `agent-ui/definition/views/index.md`
  - `agent-ui/definition/components/index.md`
- Actual code evidence:
  - [x] `packages/flutter/oto_console/lib/src/oto_console_shell.dart`: `_JenkinsConsoleFrame`(top `_JenkinsHeader` + `_OtoConsoleLeftMenu` row)로 shell을 재구성했다. `_HeaderBreadcrumb`가 `OTO / <groupLabel> / <sectionLabel>`을 렌더하고, `_HeaderActionStrip`(아이콘 전용 New Item action)과 `_HeaderStatusContext`(section icon+label)를 헤더에 둔다. `_OtoConsoleLeftMenu`는 `_MenuDestination` 리스트 기반으로 `Overview`, `New Item`(pipelines로 이동, action-only, 선택 하이라이트 없음), `Pipelines`, `Build History`(tooltip은 기존 `Executions`를 유지해 회귀 테스트 호환, 표시 라벨만 Jenkins IA 정렬), `Runners`, `Artifacts`를 상단 그룹에, `Settings`/`Agent`를 하단 그룹에 둔다. 03에서 `Nodes`/`Artifacts`/`Manage OTO` 라벨을 추가할 수 있도록 리스트 기반 구조로 열어뒀다.
  - [x] `packages/flutter/oto_console/lib/src/oto_jobs_surface.dart`: `_BuildContextStrip`(`Build Queue`/`Build History` chip)과 create panel(`New Item` 제목으로 개칭)을 상단에 두고, `_JenkinsJobDashboard`가 `_JobTableHeader`(`Name`/`Status`/`Last Run`/`Updated`/`Actions`)와 `_JobTableRow`를 렌더한다. `Last Run` 컬럼은 기존 `_ExecutionLink`(`Execution: <id>`) 위젯을 그대로 재사용해 `onExecutionTap` 콜백을 유지한다. `_JobTaskMenu`는 `Status`(비활성 라벨), `Build History`/`Stages`(둘 다 `onExecutionTap` 재사용, `executionID` 없으면 비활성)만 제공하고 `Build Now`/`Configure`는 만들지 않았다.
- Implementation verification evidence:
  - [x] `cd packages/flutter/oto_console && flutter analyze && flutter test`: PASS — `No issues found!`, 14 tests passed.
  - [x] `cd apps/client && flutter analyze && flutter test`: PASS — `No issues found!`, 27 tests passed.
- Status updates requested on PASS:
  - [x] `agent-ui/definition/index.md`: Jenkins IA shell/jobs evidence updated
  - [x] `agent-ui/definition/views/index.md`: `pipelines` shell/jobs criteria `계획` -> `구현됨`
  - [x] `agent-ui/definition/components/index.md`: shell/jobs component criteria `계획` -> `구현됨`
- Review finalization:
  - [x] Review agent updated the listed agent-ui docs and code evidence.
  - [x] Review agent ran `validate-agent-ui scope=jenkins-ia-shell-jobs` after the status/evidence update. Result: PASS by scoped manual validation; checked status/evidence rows in `agent-ui/definition/index.md`, `agent-ui/definition/views/index.md`, `agent-ui/definition/components/index.md`, `agent-ui/definition/components/console-rail/index.md`, and `agent-ui/definition/components/console-shell/index.md`; confirmed no active `agent-ui/USER_REVIEW.md`; confirmed listed code evidence paths exist.

## 코드리뷰 전용 체크리스트

> **[REVIEW AGENT ONLY]** 이 체크리스트는 코드리뷰 에이전트만 사용한다.

- [x] `코드리뷰 결과`에 `PASS`, `WARN`, `FAIL` 중 하나의 판정을 append한다.
- [x] active review/plan 파일을 `.log`로 아카이브한다.
- [x] PASS이면 `complete.log` 작성 후 `agent-task/archive/YYYY/MM/m-control-plane-jenkins-menu-ia-code-sync/02+01_shell_jobs/`로 이동한다.
- [x] PASS split 작업이면 빈 active parent를 제거하거나 남은 sibling 때문에 유지했다고 확인한다. Parent `agent-task/m-control-plane-jenkins-menu-ia-code-sync/`는 sibling `03+01_executions_ops`가 남아 유지했다.
- [ ] WARN/FAIL이면 후속 active plan/review 또는 정당한 `USER_REVIEW.md`를 작성한다.

## 계획 대비 변경 사항

- predecessor 확인: `agent-task/.../01_definition_guardrails/complete.log`는 계획에 적힌 active 경로에는 없지만, `agent-task/archive/2026/07/m-control-plane-jenkins-menu-ia-code-sync/01_definition_guardrails/complete.log`로 PASS 완료 후 이미 archive되어 있었다. archive complete.log의 `Roadmap Completion` 근거를 확인해 predecessor 충족으로 판단하고 구현을 진행했다. 최종 검증의 `test -f agent-task/.../01_definition_guardrails/complete.log`는 이 archive 경로 특성상 결과가 없음(파일 없음)으로 나오며, 이는 예상된 결과다.
- 계획의 After 코드 스니펫은 `_JenkinsConsoleFrame(descriptor, selected, onSelect, child)`만 예시로 들었으나, 헤더(breadcrumb/action/status)와 좌측 메뉴를 각각 별도 위젯(`_JenkinsHeader`, `_OtoConsoleLeftMenu`)으로 분리 구현했다. 계획이 요구한 구조(통합 header + Jenkins Dashboard-level left menu)는 동일하게 충족한다.
- Jenkins 메뉴 매핑 문서(`console-rail`)의 `Build History` 항목은 OTO의 기존 `executions` section을 가리키므로, 회귀 테스트 호환을 위해 `Tooltip.message`는 기존 `'Executions'`를 유지하고 화면에 보이는 라벨 텍스트만 `'Build History'`로 바꿨다. `apps/client/test/widget_test.dart`의 다수 `find.byTooltip('Executions')` 호출을 깨지 않기 위한 의도적 선택이다.
- Header action strip에 `New Item` 텍스트 버튼을 두려던 최초 설계를 아이콘 전용 버튼(tooltip만 `New Item`)으로 변경했다. 좌측 메뉴에도 동일 텍스트가 항상 노출되므로, 헤더에도 텍스트를 두면 `apps/client/test/widget_test.dart`의 `find.textContaining('New Item')` 관련 기존 `findsOneWidget` 단정이 섹션 불문 항상 2건 이상으로 깨졌다. 좌측 메뉴를 유일한 텍스트 소스로 유지하고, Jobs surface의 create panel 제목만 `New Item`으로 개칭해 Pipelines 탭에서는 2건(좌측 메뉴 + create panel)이 되도록 정리했다. 관련 client 테스트 3곳의 단정을 `findsOneWidget` -> `findsNWidgets(2)`로 갱신했다.

## 주요 설계 결정

- `_MenuDestination`을 데이터 리스트로 만들어 `_OtoConsoleLeftMenu`가 리스트를 순회하며 렌더하도록 했다. 03에서 `Nodes`/`Artifacts`/`Manage OTO` 라벨이 추가될 때 리스트 항목만 추가하면 되도록 구조를 열어뒀다(계획의 "shell 구조를 열어둔다" 요구 반영).
- `New Item`은 `isPrimaryAction: true`로 표시해 `Pipelines`와 동일한 section(`pipelines`)으로 이동하지만 좌측 메뉴의 `selected` 하이라이트 로직에서는 제외했다. Jenkins에서 `New Item`이 별도 액션이지 지속 선택 상태를 갖는 목적지가 아니라는 점을 반영한 결정이다.
- Jobs 테이블의 `Last Run` 컬럼은 기존 `executionLink`(Icon + `Execution: <id>`) 위젯의 시각/문구를 그대로 `_ExecutionLink`로 옮겼다. 신규 문구를 만들지 않아 리뷰 대조와 회귀 테스트 위험을 최소화했다.
- `_JobTaskMenu`의 `Status` 항목은 Core API/데이터 모델 확장이 이번 범위에서 제외되어 있어 비활성(탭 콜백 없는) 라벨로만 구현했다. `Build History`/`Stages`는 계획의 "selected job history/stage link"에 따라 기존 `onExecutionTap` 콜백을 재사용해 실행 상세로 연결한다.
- Jobs surface 최상단의 `Center + ConstrainedBox(maxWidth:820)` 카드 레이아웃을 제거하고 dashboard 스타일 full-width 레이아웃으로 바꿨다. 계획의 After 스니펫이 `_JenkinsJobDashboard`를 직접 반환하도록 예시한 것과 일치한다.

## 사용자 리뷰 요청

_기본값은 `없음`이다. 구현 중 새 결정이 필요해 보여도 직접 질문하거나 선택지를 제시하거나 `request_user_input`을 호출하지 않는다. 이 섹션은 선택된 Milestone `구현 잠금 > 결정 필요` 항목이 실구현을 차단할 때만 채운다. 외부 환경/secret/서비스 준비, 검증 증거 공백, 반복 실패, 일반 범위 조정은 사용자 리뷰 요청이 아니며 `검증 결과`, `계획 대비 변경 사항`, 또는 code-review의 일반 follow-up plan으로 처리한다._

- 상태: 없음
- 사유 유형: 없음
- 연결 대상: 없음
- 결정 필요: 없음
- 차단 근거: 없음
- 실행한 검증/명령: 없음
- 자동 후속 불가 이유: 없음
- 재개 조건: 없음

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

- Shell header가 breadcrumb/action/task context와 Jenkins Dashboard-level left menu를 1차 구조로 제공하는지 확인한다.
- Pipelines가 Jenkins dashboard job table/New Item/Build History와 적용 가능한 job-context `Status`/`Build History`/`Stages` 문법을 갖는지 확인한다.
- Existing navigation callbacks, create job validation, execution tap이 유지되는지 확인한다.

## 검증 결과

### JENKINS_IA_SHELL-1 중간 검증
```bash
$ cd packages/flutter/oto_console && flutter test test/oto_console_test.dart
00:00 +0: exports console contract models without shell dependency
00:00 +1: renders embeddable OTO console shell
00:00 +2: renders section surfaces with empty states
...
00:01 +14: All tests passed!
```
PASS. `renders embeddable OTO console shell`이 breadcrumb(`OTO`)와 좌측 메뉴 라벨(`New Item`, `Pipelines`, `Build History`)을 확인하고, 기존 `Agent` tooltip navigation도 통과했다.

### JENKINS_IA_SHELL-2 중간 검증
```bash
$ cd packages/flutter/oto_console && flutter test test/oto_console_test.dart
00:01 +8: OtoJobsSurface renders loading/empty/error/data states
...
00:01 +13: OtoJobsSurface renders job create action states
00:01 +14: All tests passed!
```
PASS. `OtoJobsSurface renders loading/empty/error/data states`가 table header(`Name`/`Status`/`Last Run`/`Updated`/`Actions`), `Build Queue`/`Build History` context strip, job-context `Status`/`Build History`/`Stages`, 기존 `onExecutionTap` 콜백을 모두 확인했다. `OtoJobsSurface renders job create action states`가 `New Item` create panel과 기존 validation/action-state 흐름을 확인했다.

### JENKINS_IA_SHELL-3 중간 검증
```bash
$ cd apps/client && flutter test test/widget_test.dart
00:00 +0: OTO client hosts embeddable console widgets
...
00:03 +27: All tests passed!
```
PASS. 27개 테스트 전부 통과. `find.byTooltip('Pipelines'|'Executions'|'Runners'|'Artifacts'|'Agent')` 기반 기존 navigation은 tooltip 문구를 유지했으므로 변경 없이 통과했고, `Create New Job` -> `New Item` 라벨 변경에 맞춰 3곳의 단정을 갱신했다(2곳은 헤더 좌측 메뉴 `New Item`과 create panel `New Item`이 동시에 존재해 `findsNWidgets(2)`로 조정).

### 최종 검증
```bash
$ test -f agent-task/m-control-plane-jenkins-menu-ia-code-sync/01_definition_guardrails/complete.log
(파일 없음, exit=1)
```
predecessor `01_definition_guardrails`는 PASS로 완료되어 `agent-task/archive/2026/07/m-control-plane-jenkins-menu-ia-code-sync/01_definition_guardrails/complete.log`로 이미 archive되었다(계획 작성 시점의 active 경로는 archive 이동으로 더 이상 존재하지 않음). archive complete.log의 `Roadmap Completion`에서 `definition-guardrail` task가 evidence와 함께 PASS로 기록된 것을 확인했다.

```bash
$ cd packages/flutter/oto_console && flutter analyze && flutter test
Analyzing oto_console...
No issues found! (ran in 3.8s)
00:01 +14: All tests passed!
```
PASS.

```bash
$ cd apps/client && flutter analyze && flutter test
Analyzing client...
No issues found! (ran in 2.6s)
00:03 +27: All tests passed!
```
PASS.

```bash
$ git diff --check
(출력 없음, exit=0)
```
PASS.

---

> **[IMPLEMENTING AGENT — BEFORE SAVING] Have you filled in every implementation-owned section: completion table, implementation checklist, changes from plan, design decisions, and verification output?**

## 코드리뷰 결과

- 종합 판정: PASS
- 차원별 평가:
  - correctness: Pass
  - completeness: Pass
  - test coverage: Pass
  - API contract: Pass
  - code quality: Pass
  - implementation deviation: Pass
  - verification trust: Pass
  - agent-ui completion: Pass
- 발견된 문제: 없음
- 다음 단계: PASS 종결 절차를 진행한다. active `CODE_REVIEW-cloud-G07.md`와 `PLAN-cloud-G07.md`를 `.log`로 아카이브하고, `complete.log` 작성 후 task directory를 `agent-task/archive/2026/07/m-control-plane-jenkins-menu-ia-code-sync/02+01_shell_jobs/`로 이동한다.
