8.9 KiB
✅ 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 폴더 링크 추가를 통해 해결" — 달성.
변경 품질
- ✅ 파일 기반 Hang 우회: 토큰/자격증명 파일 존재 시
agy models스킵 — 4케이스 검증 모두 PASS - ✅ Keychains 심볼릭 링크: Darwin 가드 +
[ -d ]존재 확인 +ln -sfn— 안전한 조건부 생성 - ✅ 경로 일치성: auth check 파일과 provisioning 파일 경로 완전 일치
- ✅ 타겟팅 정확: agy case에만 Keychains 링크 추가 — 타 agent는 파일 기반 인증으로 불필요
- ✅ seeded 패턴 일관: 기존 누적 패턴과 동일
- ✅ Darwin 가드: Linux에서 미실행, macOS에서만 동작
검증 결과
- 정적 분석:
bash -n2/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]