5.2 KiB
5.2 KiB
리뷰 리포트 — Job 20a83d73
- 리뷰 대상: 커밋
f79fd99—create_session.sh/resume_session.sh에 에이전트 바이너리 절대 경로 해석(command -v) 및 macOS 격리 속성 해제(xattr -d com.apple.quarantine) 추가로 macOS 타임아웃 오류 수정 - 리뷰어: claude (planner-reviewer)
- 리뷰 방식: 정적 분석(bash -n, shellcheck 기준선 대비) + 격리 tmux 서버에서의 실제 실행 재현 검증
1. 설계 타당성 — 실행으로 검증함
macOS에서의 실제 고장 메커니즘은 "tmux 서버가 축소된 PATH로 기동 → pane에서 claude/agy 미발견 → pane 즉사 → wait_for_tui_ready 타임아웃"이다. 이 메커니즘과 수정 효과를 Linux에서 격리 tmux 서버(-L mam_rev_20a83d73, env -i PATH=/usr/bin:/bin)로 직접 재현했다:
- Case A (수정 전 시나리오): PATH 밖의 가짜 에이전트를 bare name으로
new-session→ pane 즉사 확인 (타임아웃 전조 재현 성공). - Case B (수정 후 시나리오): 동일 조건에서 절대 경로로
new-session→ 세션 생존 + 에이전트 실제 실행 확인 (마커 파일 기록됨).
호출 스크립트(전체 PATH 보유) 시점에 command -v로 해석해 절대 경로를 명령 문자열에 굽는 설계는 이 문제의 정확한 해법이다. Gatekeeper quarantine 해제도 macOS 최초 실행 지연/행에 대한 합리적 보완책이다(Darwin 전용 가드로 Linux 무영향).
2. 정적 분석
bash -n양 파일 통과.shellcheck -S warning: 변경 전 기준선(31ca11c시점 파일을 추출해 비교) 대비 신규 경고 0건.resume_session.sh:40의 SC2155 1건은 이번 diff와 무관한 기존 경고로 변화 없음.
3. 동작성 검증 (실행 기반)
- 해석 스니펫 단독 실행: PATH에 있는
claude→/home/godopu16/.local/bin/claude로 정상 해석. PATH에 없는 이름 → bare name으로 안전한 폴백,set -euo pipefail하에서 exit 0 (조건문 내command -v실패가 set -e를 트립하지 않음을 실측). - 실제 스크립트 스모크:
create_session.sh --dry-run(실제 claude 에이전트, 격리 서버명 지정)으로 신규 블록 포함 전체 경로가 exit 0으로 통과 — 부수효과 없이 CMD_FULL 확정 지점까지 실행됨. - xattr 안전성: Darwin 가드로 Linux에서 완전 스킵. macOS에서
xattr부재/실패 시에도2>/dev/null || true패턴이set -e를 트립하지 않음을 동형 재현으로 확인.[ -f "$RESOLVED_BIN" ]가드 덕에 미해석(bare name) 상태에서는 실행 자체가 스킵됨.
4. 유실 검사
- 4개 에이전트(claude/agy/hermes/cline)의 플래그(
--dangerously-skip-permissions,-i,-r/--conversation/--resume/--id $UUID) 및ISO_ENV_PREFIX/ISO_CMD_ARGS배치가 변경 전과 전부 동일하게 보존됨. cline이 env prefix를 받지 않는 기존 비대칭도 그대로 유지(회귀 없음). - claude wrapper 경로(비격리 시
~/.local/bin/<session>우선)는 양 스크립트 모두 변경되지 않음. - 다운스트림 영향: drift 클래스 A–D(reconcile.sh)와 status.sh는
cmd_full/start_command를 비교 로직에 사용하지 않고 표시용으로만 전달함을 확인 — 절대 경로가 들어가도 오탐 없음.
5. 비차단(Non-blocking) 지적 사항
- 경로 내 공백 취약 —
RESOLVED_BIN이 공백 포함 경로로 해석되면 CMD_FULL이 깨짐을 격리 tmux에서 실측으로 확인(pane 즉사). 다만 대상 CLI들의 표준 설치 경로(/opt/homebrew/bin,~/.local/bin, npm global 등)에는 공백이 없고 macOS 홈 디렉터리 short name에도 공백이 없어 실사용 확률은 낮음. 후속 개선 시printf %q또는 인용 부호 처리를 권장(단, resume 쪽eval이중 해석 계층 고려 필요). - 중복 분기 —
cline분기와 else 분기가 기능적으로 완전 동일(command -v cline==command -v "$AGENT"when AGENT=cline). 동작 문제는 없으나 단순화 여지 있음(양 파일 공통). - resume 후 메타데이터 불일치(외관상) —
update_yaml_resumed.sh가 resume 후cmd_full을 bare name 형태로 되써서, 실제 pane은 절대 경로로 실행됐는데 YAML 기록은 bare name이 됨. 비교 로직에 쓰이지 않는 표시 전용 필드라 실해는 없음. - macOS 실기기 미검증 — 본 리뷰 환경은 Linux이므로
xattr실효(quarantine 속성 실제 제거) 자체는 실측 불가. 가드/에러 억제 로직의 안전성은 동형 재현으로 확인했고, 명령·플래그는 표준 macOS 관행과 일치함.
참고: 리뷰 중 발견된 저장소 내 multi-agent-mux-delegate-job.27194_12342.tmp 파일은 고아 파일이 아니라 본 job(20a83d73)을 디스패치 중인 살아있는 delegate_job_safe 임시 사본(PID 확인됨)으로, 직전 라운드에서 검증한 trap 정리 대상이다. 결함 아님.
6. 결론
수정의 핵심 메커니즘(절대 경로 baking)이 재현 실험으로 실효성이 입증되었고, 기존 동작 유실·신규 경고·다운스트림 회귀가 전무하다. 비차단 지적 4건은 모두 후속 개선 수준이며 설계 재작업이 필요한 사항은 없다.
[VERDICT: PASS]