# 🔍 Cross Review — Job e4631ccd

- **Reviewer**: `planner-reviewer-claude-01` (role: `planner,reviewer`)
- **브리프 목표**: Layout Engine 분석 + 개선 계획 수립
- **검증**: 워킹트리 실측 + `git log` 대조 + pytest 83건 실행

---

## 0. ⚠️ 먼저 밝혀야 할 두 가지

### 0.1 자기 리뷰 이해충돌 (Independence Conflict)

브리프의 산출물인 `.agents/reports/layout_engine_improvement_plan.md` 는 **제가 Planner 로서 직접 작성한 문서**입니다(job `29924fd4` Rev.1 → `8722045f` Rev.2).

MULTI_AGENT_RULES §1·§3 의 리뷰 루프는 **작성자와 검증자의 분리**로 신호를 만듭니다. 제가 제 문서에 `PASS` 를 찍으면 그 신호는 **0** 입니다. 따라서:

> **본 리뷰는 계획서 자체의 타당성을 독립 검증하지 않습니다.**
> 계획서에 대한 독립 검증이 필요하다면 `reviewer-cline-01` 또는 `creator-grok-01` 에게 배정하십시오. 실제로 Rev.1 → Rev.2 개정은 `creator-grok-01` 의 이의제기(`b907f997`)로 이루어졌고, 그것이 이 문서가 받은 유일한 독립 검증입니다.

아래 판정은 **제가 작성하지 않은 부분** — 즉 누적 diff — 으로 범위를 한정합니다.

### 0.2 diff 에 레이아웃 엔진 변경이 **한 줄도 없습니다**

브리프의 작업 목표는 레이아웃 엔진인데, 리뷰 대상 diff 는 전부 grok 에이전트 작업입니다.

```
$ git diff --stat
 .agents/skills/multi-agent-mux-resume/scripts/resolve_session_id.sh | 4 ++--
 .agents/skills/multi-agent-mux-resume/scripts/resume_session.sh     | 2 +-
 2 files changed, 3 insertions(+), 3 deletions(-)

$ git log --oneline -3 -- .agents/skills/lib_py/layout.py
f3ac68f feat(layout): relax MAM_MIN_PANE_COLS to 15 ...   ← 최신. 계획 수립 이전 커밋
```

`layout.py` 는 계획서가 지목한 상태 그대로입니다 — **미구현 확인**:

| 계획서 항목 | 현재 코드 | 상태 |
|---|---|---|
| `max_columns` 기본 2 | `layout.py:75` `max_columns: Optional[int] = None` | ❌ 미적용 |
| `max_rows` 신설 | 파라미터 자체 없음 | ❌ 미적용 |
| 홀짝 폐기 | `layout.py:115` `if n % 2 == 1:` 잔존 | ❌ 미적용 |
| `headless_odd_down`/`headless_even_right` 제거 | `:120`, `:125` 잔존 | ❌ 미적용 |
| `_full_height_pane` (R-2) | 부재 | ❌ 미적용 |
| `right` 우선 (R-1 핵심) | `:102` 여전히 `single_pane_split_down` | ❌ 미적용 |

**따라서 본 Verdict 는 레이아웃 엔진을 인증하지 않습니다.** 4 에이전트 왜곡(R-1)은 현재도 그대로 재현됩니다.

---

## 1. 실제 리뷰 대상 — grok `--agent` 검증 3줄

### 1.1 변경 내용
```diff
# resolve_session_id.sh:39-40
-  claude|agy|hermes|cline) ;;
-  *) echo "ERROR: --agent must be claude or agy or hermes or cline" >&2; exit 2 ;;
+  claude|agy|hermes|cline|grok) ;;
+  *) echo "ERROR: --agent must be claude, agy, hermes, cline, or grok" >&2; exit 2 ;;

# resume_session.sh:45
-  claude|agy|hermes|cline) ;;
+  claude|agy|hermes|cline|grok) ;;
```

### 1.2 정합성 검증 — 통과

두 스크립트가 grok 을 **받은 뒤 실제로 동작하는지** 하류 경로를 전수 확인했습니다:

| 하류 의존 | 상태 |
|---|---|
| `resume_session.sh:112` CMD_FULL 폴백 `case` | ✅ `grok) ... --resume $UUID --permission-mode bypassPermissions` 존재 |
| `resume_session.sh:88` 바이너리 해석 | ✅ `else` 분기가 `command -v "$AGENT"` 로 grok 처리 |
| `resolve_session_id.sh` → `find_workspace_uuid` → `workspace_uuid.py:11` `OWN_KEY` | ✅ `'grok': 'grok_session_id_own'` 존재 |
| 〃 `workspace_uuid.py:33` `running_ids` 수집 | ✅ `grok_session_id_own` 포함 |
| `registry.py:9,16` 어댑터 등록 | ✅ |
| `verify_session.py` / `atomic_yaml.py` / `reconcile.sh` / `stop_session.sh` / `orc_onboard.sh` / `status.sh` | ✅ 전부 grok 포함 |

**검증 `case` 만 열고 하류를 빠뜨리는 전형적 결함은 없습니다.** 이 3줄이 grok 통합의 마지막 구멍을 메웁니다.

> 이는 제가 grok 계획서(`b8872c34`)에서 S-15/S-16/S-18 로 지목했던 지점들이며, 모두 반영되어 있음을 확인했습니다.

### 1.3 테스트
```
pytest tests/test_a4_adapter_contract.py tests/test_tier1_unit.py tests/test_loop_cli.py -q
→ 83 passed in 13.77s
```

---

## 2. 🟡 N-1 — 같은 파일 안에서 usage 문자열이 갱신되지 않았습니다

`resolve_session_id.sh` 는 이번 diff 로 `:39` 의 `case` 와 `:40` 의 에러 문구를 갱신했지만, **같은 파일 `:4`·`:16` 의 usage 문자열은 4개 그대로**입니다.

```
resolve_session_id.sh:4   #   bash resolve_session_id.sh --workspace <path> --agent <claude|agy|hermes|cline>
resolve_session_id.sh:16  Usage: $0 --workspace <path> --agent <claude|agy|hermes|cline> [--session <name>]
resolve_session_id.sh:39      claude|agy|hermes|cline|grok) ;;          ← 이번에 갱신
```

사용자가 `--help` 로 보는 목록과 파서가 받는 목록이 **어긋납니다**. grok 은 유효하지만 도움말은 존재를 부정합니다.

동일 패턴이 다른 스크립트에도 남아 있습니다(실행 경로 아닌 문자열만):

| 파일 | 행 |
|---|---|
| `resolve_session_id.sh` | 4, 16 |
| `resume_session.sh` | 12 |
| `create_session.sh` | 4, 29, 33 |
| `stop_session.sh` | 4, 15, 44, 49 |
| `update_yaml_resumed.sh` | 7, 14 |

**대조적으로** `create_session.sh:94,213` 과 `stop_session.sh:98` 의 **에러 문구**는 이미 grok 을 포함하고, `SKILL.md` 들도 갱신되어 있습니다. 즉 **usage/주석 헤더만 일괄 누락**된 상태입니다.

**개선 방향**: 12개 문자열을 `<claude|agy|hermes|cline|grok>` 으로 일괄 치환. 실행 동작에 영향이 없어 차단하지 않으나, 이번 diff 가 건드린 파일 안에서 발생한 불일치이므로 같은 커밋에서 정리하는 것이 자연스럽습니다.

> 근본적으로는 grok 계획서 §2.1 에서 권고한 **레지스트리 기반 목록 생성**(`all_agent_names()`)으로 해소될 문제입니다. 현재 이 목록이 20곳 이상에 문자열로 복제되어 있어, 에이전트를 추가할 때마다 일부가 반드시 누락됩니다. 후속 잡으로 등록을 권고합니다.

---

## 3. 판정 근거

| 대상 | 판정 |
|---|---|
| grok `--agent` 검증 3줄 | ✅ 정확. 하류 경로 전수 확인, 83건 테스트 통과 |
| usage 문자열 (N-1) | 🟡 비차단 지적 |
| **레이아웃 엔진** | ⬜ **미구현 — 본 Verdict 의 인증 대상 아님** |
| **계획서 자체** | ⬜ **자기 저작 — 본 Verdict 의 인증 대상 아님** |

diff 에 포함된 변경은 정확하고 완결적이며 회귀가 없습니다. 결함이 없는 작업을 `NOT PASS` 로 막을 이유가 없으므로 **PASS** 를 부여하되, **위 두 항목이 인증 범위 밖임을 Verdict 의 일부로 명시**합니다.

설계 변경이나 재계획이 필요한 사안은 없습니다(계획서는 이미 Rev.2 로 개정 완료). 따라서 `[ESCALATE: PLANNER]` 는 부여하지 않습니다.

---

## 4. 후속 권고

1. **레이아웃 엔진 구현 잡을 별도로 발주하십시오.** 계획서 §6 WBS(W1~W8)가 준비되어 있고, §6.1 이 "GUI·헤드리스 단일 커밋" 을 강제합니다. 현재 R-1 왜곡은 그대로 살아 있습니다.
2. **계획서 독립 리뷰**는 저 아닌 세션에 배정하십시오(§0.1).
3. **N-1 문자열 12곳** 일괄 정리 + 레지스트리 기반 목록화 후속 잡.

[VERDICT: PASS]
