162 lines
8.9 KiB
Markdown
162 lines
8.9 KiB
Markdown
# ✅ 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)
|
||
|
||
```diff
|
||
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)
|
||
|
||
```diff
|
||
+ # 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] |