Files
multi-agent-mux/.agents/reports/canary-projects-multi-agent-mux-reviewer-cline/report-14943484.md
T

8.9 KiB
Raw Blame History

Peer Review Report: macOS 키체인 Hang 우회 및 격리 모드 인증 토큰 소실 수정 (Job 14943484)

Job: 14943484 · Reviewer: Reviewer B (Cline, canary-projects-multi-agent-mux-reviewer-cline) Review Target: 커밋 36b3910 "fix(mac-compat): bypass keyring auth check hang and link macOS Library/Keychains to isolated home" Files Changed: lib.sh (+8/-0), create_session.sh (+4/-1) — 2 files, 12 insertions, 1 deletion Review Scope: 작업 목표 "create_session.sh 및 lib.sh에서 macOS 키체인(keyring) 접근 차단으로 인한 비대화식 Hang 현상과 격리 모드(--isolate) 시 인증 토큰 소실 문제를 각각 파일 기반 사전 검증 우회 및 Library/Keychains 폴더 링크 추가를 통해 해결" — 린트, 동작성, 유실 관점 교차 리뷰 Method: 커밋 diff 분석 + bash -n/shellcheck 정적 분석 + 인증 바이패스 로직 4케이스 검증 + Darwin 가드 검증 + 경로 일치성 확인 + seeded 패턴 일관성 확인 + 타 agent keychain 필요성 분석


1. 변경 사항 개요

1.1 파일 기반 사전 검증 우회 (create_session.sh 라인 92-98)

 elif [ "$AGENT" = "agy" ]; then
-  if ! agy models >/dev/null 2>&1; then
+  # Fast, non-blocking check: if token or credentials exist on disk, assume authenticated to prevent keyring hang
+  if [ -f "$HOME/.gemini/oauth_creds.json" ] || [ -f "$HOME/.gemini/antigravity-cli/antigravity-oauth-token" ]; then
+    true
+  elif ! agy models >/dev/null 2>&1; then
     echo "ERROR: agy is not authenticated. Please log in first." >&2
     exit 1
   fi

목적: agy models 명령이 macOS에서 키체인 접근 시 비대화식 Hang 유발. 토큰/자격증명 파일 존재 시 파일 기반으로 인증 가정하여 Hang 우회.

1.2 Library/Keychains 폴더 링크 추가 (lib.sh 라인 841-848)

+      # On macOS, seed ~/Library/Keychains to allow isolated agy to query Keychain Access credentials
+      if [ "$(uname)" = "Darwin" ]; then
+        mkdir -p "$root/Library"
+        if [ -d "$HOME/Library/Keychains" ]; then
+          ln -sfn "$HOME/Library/Keychains" "$root/Library/Keychains"
+          seeded="${seeded:+$seeded,}Library/Keychains"
+        fi
+      fi

목적: --isolate 모드 시 격리된 홈 디렉토리에 ~/Library/Keychains 심볼릭 링크 추가 → 격리 agy가 Keychain Access 자격증명 조회 가능.


2. 작업 목표 달성도

목표 상태 확인
macOS 키체인 Hang 우회 (파일 기반 사전 검증) 토큰 파일 존재 시 agy models 스킵
격리 모드 인증 토큰 소실 해결 (Keychains 링크) Darwin 가드 + Library/Keychains 심볼릭 링크
create_session.sh 적용 라인 92-98
lib.sh 적용 라인 841-848 (agy case)

3. 정적 분석

파일 bash -n shellcheck 비고
lib.sh SYNTAX OK 경고 없음 (clean) 본 diff 새 경고 0건
create_session.sh SYNTAX OK SC1091 (info, 기존 source) — 본 diff 새 경고 없음 EXIT 1 (기존)

4. 동작성 검증

4.1 인증 바이패스 로직 4케이스 검증

케이스 조건 결과 판정
1 antigravity-oauth-token 파일 존재 BYPASS (token found) Hang 우회
2 oauth_creds.json 파일 존재 BYPASS (oauth_creds found) Hang 우회
3 파일 없음 + agy models 실패 ERROR (not authenticated) 정상 에러
4 파일 없음 + agy models 성공 PASS (agy models succeeded) 정상 통과

검증: 파일 존재 시 agy models 호출 스킵 → macOS 키체인 Hang 방지. 파일 부재 시 기존 agy models 체크 유지 → 미인증 감지.

4.2 Darwin 가드 검증 (Keychains 링크)

조건 결과 판정
uname = Linux Darwin 체크 실패 → 블록 스킵 Linux에서 Keychains 링크 미생성
uname = Darwin + ~/Library/Keychains 존재 mkdir -p $root/Library + ln -sfn 실행 macOS에서 심볼릭 링크 생성
uname = Darwin + ~/Library/Keychains 부재 [ -d ] 실패 → 링크 미생성 graceful (seeded 미추가)

4.3 경로 일치성 (auth check vs provisioning)

파일 create_session.sh 체크 경로 lib.sh provisioning 경로 일치
oauth_creds.json $HOME/.gemini/oauth_creds.json $HOME/.gemini/oauth_creds.json (라인 835)
antigravity-oauth-token $HOME/.gemini/antigravity-cli/antigravity-oauth-token $HOME/.gemini/antigravity-cli/antigravity-oauth-token (라인 838)

인증 체크 파일과 격리 provisioning 파일 경로가 완전 일치 → 일관성 확보.

4.4 seeded 패턴 일관성

seeded="${seeded:+$seeded,}Library/Keychains" (라인 846) — 기존 패턴(라인 836, 839, 853)과 동일한 ${seeded:+$seeded,} 누적 패턴. 일관성 확보

4.5 타 agent keychain 필요성 분석

Agent 인증 방식 Keychain 필요 Keychains 링크 적용
claude .credentials.json 파일 기반 아니오 불필요 (맞음)
cline 파일 기반 settings + DB 아니오 불필요 (맞음)
agy macOS Keychain Access 적용됨
hermes auth.json 파일 기반 아니오 불필요 (맞음)

Keychains 링크가 agy case에만 추가된 것은 정확한 타겟팅 — agy만 macOS Keychain 사용, 타 agent는 파일 기반 인증.

4.6 true 문 유효성

if 블록 본문으로 true 사용 — bash에서 유효 (no-op). if true; then true; fi 검증 통과. 의도: 파일 존재 시 아무 동작 없이 통과(바이패스).


5. 잔여 결함 (LOW — INFORMATIONAL)

5.1 ⚠️ 만료된 토큰 시 false positive 가능성 (LOW, 설계 트레이드오프)

위치: create_session.sh 라인 93 분석: 토큰 파일이 존재하지만 만료/무효한 경우, 바이패스가 agy models 체크를 스킵하여 세션 시작 → agy 실행 시 인증 실패 가능. 평가: 의도적 트레이드오프 — 원 문제는 Hang(무한 대기)이며, 만료 토큰으로 인한 후속 실패는 Hang보다 나음(진단 가능). 주석(라인 92)이 의도 명시. 심각도: LOW — BLOCKING 아님. 설계 결정으로 수용 가능.

5.2 작업 트리 잔여 .tmp 파일 (INFO, unrelated)

위치: .agents/skills/multi-agent-mux-delegate-job/multi-agent-mux-delegate-job.14657_36745.tmp (untracked) 분석: 이전 delegate_job_safe 실행 잔여물. 본 diff와 무관. 무해하지만 정리 권장. 심각도: INFO — 본 리뷰 범위 외.


6. 종합 평가

작업 목표 달성도

"create_session.sh 및 lib.sh에서 macOS 키체인(keyring) 접근 차단으로 인한 비대화식 Hang 현상과 격리 모드(--isolate) 시 인증 토큰 소실 문제를 각각 파일 기반 사전 검증 우회 및 Library/Keychains 폴더 링크 추가를 통해 해결" — 달성.

변경 품질

  1. 파일 기반 Hang 우회: 토큰/자격증명 파일 존재 시 agy models 스킵 — 4케이스 검증 모두 PASS
  2. Keychains 심볼릭 링크: Darwin 가드 + [ -d ] 존재 확인 + ln -sfn — 안전한 조건부 생성
  3. 경로 일치성: auth check 파일과 provisioning 파일 경로 완전 일치
  4. 타겟팅 정확: agy case에만 Keychains 링크 추가 — 타 agent는 파일 기반 인증으로 불필요
  5. seeded 패턴 일관: 기존 누적 패턴과 동일
  6. Darwin 가드: Linux에서 미실행, macOS에서만 동작

검증 결과

  • 정적 분석: bash -n 2/2 OK, shellcheck 본 diff 새 경고 없음 (lib.sh clean, create SC1091 기존만)
  • 인증 바이패스: 4케이스(토큰 존재/ oauth_creds 존재/ 파일 없음+실패/ 파일 없음+성공) 모두 PASS
  • Darwin 가드: Linux 스킵 확인
  • 경로 일치성: auth check ↔ provisioning 완전 일치
  • seeded 일관성: 기존 패턴과 동일
  • 타 agent 분석: agy만 Keychain 사용, 타겟팅 정확

잔여 LOW 1건 + INFO 1건

  • LOW 5.1: 만료 토큰 false positive — 의도적 트레이드오프 (Hang > 후속 실패), 주석 명시
  • INFO 5.2: 잔여 .tmp 파일 (본 diff 무관)

판정 근거

작업 목표(키체인 Hang 우회 + 격리 토큰 소실 해결) 완전 달성. 파일 기반 바이패스 4케이스 검증 PASS, Darwin 가드 동작 확인, 경로 일치성 확보, agy 타겟팅 정확. 정적 분석 통과. 잔여 LOW 1건은 의도적 설계 트레이드오프(Hang 방지가 만료 토큰 후속 실패보다 우선). 주 개발자가 macOS 키체인 문제를 정확히 진단하고 파일 기반 우회 + Keychains 링크로 해결했으므로 PASS 판정이 타당.

[VERDICT: PASS]