# 리뷰 리포트 — Job 2f19fe7f (PR #46, fix/issue-42 단계 1·2) - 리뷰어: planner-reviewer-claude-01 (claude) - 리뷰 identity: loop-20261003T222707Z-a0de27 / base 45d1621 / head 8d26106 / tree b579380 — 검증 경로에서 `git rev-parse HEAD 'HEAD^{tree}'` 로 일치 확인, 미커밋 변경 없음 - 커밋: 7670b41(단계 1·2), e6a46cd(R1: stop exit 1 이 stop 뒤에도 남), 8d26106(R2: passthrough 코드는 표에 있어야 함) ## 결론 요약 차단 결함 없음. 지운 (a) 블록 5개는 모두 진입 스크립트가 그대로 하는 일이고, 새 옵션·종료 코드 표와 "정정" 다섯 곳은 스크립트 코드 및 샌드박스 실행 결과와 일치한다. 제품 코드 변경 없음. 비차단 관찰 4건(아래 §6). ## 1. 분류의 정확성 ### resume Workflow (base resume SKILL.md:59-118) → resume_session.sh | 지운 단계 | 스크립트 위치 | |---|---| | 세션 ID 해석 (`resolve_session_id.sh --session`) | resume_session.sh:111-112 | | Class A fresh-spawn 폴백 / claude·grok exit 1 | :122-130 (spawn-spec :173-184) | | HERDR_SESSION_NAME·MAM_WS_LABEL 해석 | :132-144 | | herdr alive 분기 | :147-158 — **attach 하지 않고** `update_yaml_resumed.sh` 후 exit 0 | | CMD_FULL (에이전트별) | :185-197 (adapter resume-spec + 동일 표 폴백) | | 기동 | :237 `_herdr new-session` | | handle_startup_dialogs | :241 | | update_yaml_resumed.sh | :247-250 | | attach | **스크립트에 없음** | attach 만 스크립트에 없는 단계(= (b))인데, 문서는 이를 지우지 않고 "It never attaches; attaching is a separate step: `herdr agent attach `" 로 남겼다(resume SKILL.md Workflow 아래 문단, Case 3 정정). 따라서 절차 유실 없음. 문서에만 있던 `$CLAUDE_ID_FLAG`(정의되지 않은 변수)도 함께 사라졌다(인벤토리 mismatch R4) — 정정이 맞다. ### stop pre-flight (base stop:38-63) → stop_session.sh YAML 존재 :99(exit 1), 등록 확인 :127-143(exit 1), 이미 stopped no-op :184-188(exit 0). 문서에만 있던 `--force-no-yaml` 은 어떤 스크립트도 받지 않는다(:76-90 파서에 없음) — 삭제가 맞다. ### create pre-flight (base create:35-52) → create_session.sh 워크스페이스 :111, has_real_herdr :114, CLI in PATH :115, 인증 :117-157(선택된 에이전트만). B-3 함정(command -v / type -P) 설명은 산문으로 보존. ### create Workflow (base create:168-220) → create_session.sh 이미 존재 :166-168(**exit 3**, 문서는 1이었음), spawn-spec :207, spawn :252-276, TUI 대기 :361-398(exit 42), 롤백 trap :320-352(exit 43). `sleep 6` 하드코딩과 claude 무플래그 기동은 문서 쪽 오류였다. ### create YAML 수동 추가 (base create:226-252) 행 기록은 create_session.sh:491-610 heredoc 이 한다. lib.sh shim 주석은 Output format 아래 산문으로 이동. ### (b) 로 남은 블록 5개 create:217·resume:103·stop:127 (사후 확인), monitor:182 (에이전트 폴링 지침), status:30 (status.sh 에 has_real_herdr 검사가 없음 — status.sh:22 는 YAML 만). 각 스크립트를 grep 해 같은 명령을 제공하는 진입점이 없음을 확인했다. 3단계 입력으로 타당하다. ### 블록 수 대조 base 의 펜스 블록을 테스트의 `parse_blocks` 로 세면 37개(create 11, delegate-job 1, loop 5, monitor 7, orc-onboard 2, resume 2, status 4, stop 5). 지운 (a) 5개의 base_start/base_sha 는 모두 base 와 일치한다. 현재 33개 = 37 − 5(a) − 1 + 2(새 Workflow 호출 블록). 이 "− 1"은 관찰 O1 참고. ## 2. 옵션·종료 코드 표 대조 - create 옵션 표 ↔ 파서 create_session.sh:76-92: 12개 항목 모두 일치(별칭 `--name`, `--herdr-server` 포함; `--isolate` no-op :89-90; `--wrapper` 는 :257 에서 존재 여부와 무관하게 강제). - create 종료: 1 = :111-156 사전 검사 + :636·:659 (spawn 뒤 브리프/주입 실패, trap 롤백); 2 = :92-110 인자, :234 바인딩 거부, :245 공백; 3 = :168; 4 = heredoc `raise SystemExit(4)` :515 (중복 running 행, set -e 로 통과 → trap 롤백); 42 = :398; 43 = :348. - resume 옵션 표 ↔ :37-46 일치. 종료 0 = :150·:158(alive, attach 없음)·:227(dry-run)·정상 종료; 1 = :128·:204·:209 + update_yaml_resumed.sh:47; 2 = :46-56·:73·:77·:104·:221 + update_yaml_resumed.sh:42-46·:74. - stop 종료 0 = :188; 1 = :99·:142 + heredoc :310(R7); 2 = :86·:89·:95·:98·:121; 3 = :198; 4 = :281. - status `--json` 키: reconcile.sh:1081-1088 의 6개 최상위 키 + status.sh:213-232 의 sessions_detail 17개 키와 정확히 일치. resume_state 값 yes/MISSING/scan/no 도 status.sh 의 resume_on_disk 반환값과 일치. 샌드박스 실행(임시 HOME·WORKSPACE_ROOT·AGENT_SESSIONS_YAML, `env -i`, herdr 미호출 경로만): | 실행 | rc | 표 | |---|---|---| | stop `--purge-conversation` (no --yes) | 3 | 3 ✓ | | stop 미등록 세션 | 1 | 1 ✓ | | stop `--mode x` | 2 | 2 ✓ | | resume 원래 cwd 없음 `--dry-run` | 2 | 2 ✓ | | create 없는 워크스페이스 | 1 | 1 ✓ | | create `--agent foo` | 2 | 2 ✓ | 샌드박스 YAML 은 변경되지 않았다. ## 3. 문서만으로 같은 작업이 가능한가 - 세 진입점 모두 호출 한 줄에 필수 옵션이 표시되어 있고, 지운 절차는 전부 스크립트 안에 있으므로 호출 한 줄로 충분하다. - 사람이 판단할 지점은 보존·강화됐다: stop 예제가 `--purge-conversation --yes` 로 바뀌면서 "되돌릴 수 없다, 사용자가 확인한 뒤에만 `--yes`" 문장이 추가됐다(실제로 --yes 없으면 exit 3 이므로 이전 예제는 동작하지 않았다). - resume 은 spawn 뒤 실패 시 롤백하지 않는다는 점과 `multi-agent-mux-status` 로 먼저 확인하라는 복구 지침이 새로 들어갔다(resume_session.sh 에 trap 없음 — 사실과 일치). stop 표 아래 복구 문단도 같다. ## 4. 문서 가드 테스트 견고성 스크래치 사본에서 변이 시험: | 변이 | 결과 | |---|---| | create `exit 43`→`exit 44` | 2 failed ✓ | | create `exit 42` 제거(표 행이 낡음) | 2 failed ✓ | | 주석 `# exit 9` 추가 | 통과 ✓ (주석 제외 규칙) | | 실제 `exit 9` 추가 | 2 failed ✓ | | stop 표의 3 행 삭제 | 2 failed ✓ | | stop 예제의 `--yes` 제거 | 1 failed ✓ | | base 의 create pre-flight 블록 되살림 | 1 failed ✓ | | stop SKILL.md 블록 위에 산문 한 줄 추가(정상 편집) | 1 failed (관찰 O2) | | `$(( 1 << 2 ))` 뒤 `exit 9` | 통과 ✗ (관찰 O3) | 추출 규칙: `(?