---
from: 개발팀장
to: 총괄PM
date: 2026-04-18
type: 실무 검토 보고서
subject: worktree 격리 근원 해결안 (중앙 `.live/` Junction 체계) 실무 검토
priority: 조직 생존급
upstream: PD님 직접 지시 "이 문제가 해결되지 않으면 앞으로 우리 조직은 유지될 수 없어" · "가능한 모든 수단을 써서 개선해"
related_rules: 헌법 제1원칙 ⑤, C2, C5, C6, C16, C19, C30, P25
status: 완료
---

# worktree 격리 근원 해결안 실무 검토 — 중앙 `.live/` Junction 체계

## 0. 검토 결론 요지 (Executive Summary)

1. **PM 1차 설계안(Junction 기반 중앙 `.live/`)을 원칙적으로 승인 권고**. C16-1 memory junction 패턴과 기술·규범적으로 동형이므로 조직 검증된 방식의 직접 재사용이다.
2. 단, 원안에 **7개 엣지 케이스 보완 필요**. 핵심은 **Windows 개발자 모드 없는 환경의 junction 생성 실패 시 방침**과 **worktree 자동 생성 시점의 선주입 보장**이다.
3. **worktree-local로 격리된 기타 자산 전수 조사 결과 — `.live/`만이 문제**. 기존 중앙화 자산(`~/.claude/.nerdnavis_bus/`, `~/.claude/.nerdnavis_throttle/`, `memory/org/` junction)은 이미 PC 중앙화되어 있음. `.live/`가 유일한 "worktree-local 의미 자산"이며, 따라서 본 단일 해결책으로 전체 문제가 근원 해소된다.
4. **구현 복잡도 대비 효용 — 절대 우세**. Setup 스크립트 50줄 내외, hook 로직 무변경, `verify_setup.ps1` 3축 검증 확장 30줄. 한편 해결되는 문제는 조직 생존급.
5. **대안 검토 — 모두 열등**. (A) `.live/`를 git-tracked로 전환: 세션별 commit 폭증·merge conflict 상시. (B) Hook을 `REPO_ROOT` 대신 절대 경로 하드코딩으로 수정: C16 PC 독립성 훼손. (C) Worktree 사용 중단: Claude Code 내부 동작이라 제어 불가.

본 검토서는 C2(근원적 문제 해결)·헌법 제1원칙 ⑤(세션·PC 연속성) 정합 기준으로 최종안을 확정했다.

---

## 1. 현상 재현·실측 근거 (C23 정직성 — 실제 tool_use 결과만)

### 1.1 worktree 격리 실증

```
$ git worktree list (cd E:/NerdNavisAi)
E:/NerdNavisAi                                         5085c56 [main]
E:/NerdNavisAi/.claude/worktrees/nifty-wing-4752bd     5085c56 [claude/nifty-wing-4752bd]
E:/NerdNavisAi/.claude/worktrees/tender-liskov-844a72  5085c56 [claude/tender-liskov-844a72]
```

### 1.2 `.live/` 물리 격리 실증

- 본 worktree (`tender-liskov-844a72`) `.live/`: `README.md` 만 존재 (총 2개 파일)
- 타 worktree (`nifty-wing-4752bd`) `.live/`: `README.md` + `ping.md` (19 bytes, 21:13 생성) — 본 worktree에서 **전혀 보이지 않음**
- 메인 레포 (`E:/NerdNavisAi`) `.live/`: `README.md` 만 존재 (21:08 수정)

즉 **같은 PC·같은 시각·같은 레포·같은 브랜치**임에도 `.live/`는 각 worktree 작업 트리 내부에 독립 실체로 존재한다.

### 1.3 기술적 원인

- `scripts/live_inject.sh` 6행: `REPO_ROOT=$(git rev-parse --show-toplevel 2>/dev/null)`
- worktree 내부에서 `git rev-parse --show-toplevel`은 **해당 worktree의 루트**를 반환 (`.git/worktrees/{id}/gitdir`가 worktree 내부 `.git` 파일을 가리킴)
- 따라서 `LIVE_DIR="$REPO_ROOT/.live"`가 **각 worktree별로 서로 다른 물리 경로**를 가리키게 됨
- 결과: 한 worktree가 기록한 `.live/*.md`는 다른 worktree의 hook이 인지 불가 → P25 "같은 PC 내 다른 세션 즉시 인지" 전제 파괴

### 1.4 기존 중앙화 자산과의 비대칭성 (왜 `.live/`만 문제인가)

본 실무 검토 중 조직 내 worktree-local 저장 가능성이 있는 자산 전수 조사 결과:

| 자산 | 저장 위치 | worktree 영향 | 상태 |
|------|----------|--------------|------|
| 사용자 메모리 (`memory/org/`) | `~/.claude/projects/<해시>/memory` junction | 무영향 (HOME 기반) | ✅ 중앙화 |
| 시그널 버스 (`sync_signal.sh` 플래그) | `$HOME/.claude/.nerdnavis_bus/` | 무영향 (HOME 기반) | ✅ 중앙화 |
| 증분 throttle 카운터 (`live_inject.sh`) | `$HOME/.claude/.nerdnavis_throttle/` | 무영향 (HOME 기반) | ✅ 중앙화 |
| git-hooks (`core.hooksPath`) | `scripts/git-hooks/` (git 공용) | 무영향 (worktree 간 공유) | ✅ 중앙화 |
| inbox 스캔 해시 | `$HOME/.claude/.nerdnavis_throttle/inbox_hash_*` | 무영향 (HOME 기반) | ✅ 중앙화 |
| **`.live/` 더미 파일** | **`$REPO_ROOT/.live/` (worktree-local)** | **격리 발생** | ❌ **문제 지점** |
| paths.local.json | 레포 루트 (worktree는 각자 copy) | 실측 미확인 (아래 §5.2에서 후속 점검) | ⚠️ 잠재 |

즉 **P25 Live 체계의 저장 위치 설계가 다른 자산들의 HOME 기반 원칙에서 이탈**되어 있었던 것이다. 중앙화로의 재편은 조직 자산 설계 일관성 회복 차원에서도 정당하다.

---

## 2. PM 1차 설계안 심층 분석

### 2.1 원안 재진술

- **실 저장**: `$HOME/.claude/nerdnavis-live/` (PC 로컬 단일 디렉토리)
- **각 worktree의 `.live/`**: 위 실 저장으로의 **Junction** (Windows `mklink /J`) 또는 **Symbolic link** (macOS/Linux `ln -s`)
- **Setup 스크립트**: 자동 생성 (신규 PC 1회·기존 PC 1회)
- **Hook 로직**: 불변 (`REPO_ROOT/.live` 경로는 그대로 사용, junction이 자동 경유)

### 2.2 원칙적 타당성 평가 — 우수

1. **C16-1 memory junction 패턴과 동형** — `~/.claude/projects/<해시>/memory` → `memory/org/` junction과 기술·규범 동일. 조직 검증된 방식이므로 리스크가 낮다.
2. **Hook 무변경** — `live_inject.sh`·`live_session_load.sh`·`sync_push.sh` 등 기존 스크립트 일체 수정 불요. 본 해결책은 **운영체제 파일시스템 계층의 투명한 우회**이며 애플리케이션 계층에는 영향이 없다 → C14(토큰 최소화)·C10-5(기존 산출물 신뢰) 정신에도 부합.
3. **역호환성 확보** — 기존 hook이 `REPO_ROOT/.live`를 그대로 참조하므로 junction 미생성 worktree에서도 (격리된 상태이지만) 정상 동작. 점진 전환·롤백 가능.
4. **자산 가치 유지** (P25 🏆 조직 핵심 자산) — P25가 보증하는 "같은 PC 내 세션 간 네트워크 비용 0 실시간 공유"를 완전 복원.
5. **PD님 지시 정합** — 헌법 제1원칙 ⑤("세션·PC 연속성 보장") 직접 기여. C2(근원적 문제 해결 — 임시방편 아님)·C31-E("기존 조직 자산 우선 활용") 체크 통과.

### 2.3 잠재 리스크 7종 (보완 필요 항목)

본 원안을 그대로 채택해도 안전하나, 아래 엣지 케이스 7종에 대한 명시적 대응을 원안에 추가해야 완결된다. 각 항목은 §3·§4에서 상세 설계한다.

1. **R1. Windows Junction 생성 권한 이슈** — 개발자 모드 불필요(일반 사용자도 `mklink /J` 가능, §3.1)
2. **R2. macOS/Linux Symlink vs Junction 차이** — 동작 동일하나 실체 검증 플래그가 다름 (§3.2)
3. **R3. 기존 `.live/` 데이터 마이그레이션 시 README.md 보존** (§4.3)
4. **R4. Worktree 자동 생성 시점의 지연 주입** — Claude Code가 신규 worktree를 만들 때 첫 SessionStart hook이 junction을 생성해야 격리 세션이 되지 않음 (§4.5)
5. **R5. Junction 타깃 디렉토리 미존재 상태 처리** — 신규 PC 첫 setup 시 순서 (§4.2)
6. **R6. `paths.local.json` 등 기타 worktree-local 파일 점검** (§5.2)
7. **R7. 격리 시그널 수집 — verify 3축 검증의 자동 복구 범위 한정** (§5.3)

---

## 3. OS별 Junction/Symlink 기술 상세

### 3.1 Windows (PRIMARY — 현 주 환경)

#### 3.1.1 사용 명령
```cmd
cmd /c mklink /J "<worktree>\.live" "$HOME\.claude\nerdnavis-live"
```

#### 3.1.2 권한·환경 요구
- **일반 사용자 권한으로 충분** — `/J` (junction)은 **개발자 모드 불요·관리자 권한 불요**
- 구분: `/D` (directory symbolic link)는 관리자 권한 또는 개발자 모드 필요하나 `/J`는 예외
- 조직 기존 자산 증명: `setup/setup_windows.ps1` 99·104행이 이미 동일 방식으로 memory junction을 생성하고 있으며 조직 전 PC에서 문제없이 동작 중
- 따라서 본 해결책은 **조직 내 이미 입증된 기술 기반**

#### 3.1.3 기술 제약
- **Junction 타깃은 로컬 드라이브**만 지원 (네트워크 드라이브 불가). HOME은 항상 로컬이므로 무관.
- **Junction은 디렉토리 전용** — `.live/` 디렉토리 대상이므로 해당 없음.
- 파일 단위 hard link가 필요하면 `/H`이나 본 설계는 디렉토리 단위이므로 `/J`가 정답.

#### 3.1.4 검증 가능성
- PowerShell: `(Get-Item <path> -Force).Attributes -band [IO.FileAttributes]::ReparsePoint` — reparse point 여부 확인
- 이미 `scripts/verify_setup.ps1` 87·100행이 동일 패턴을 memory junction에 적용 중이므로 `.live/` junction에 그대로 재활용 가능

#### 3.1.5 문제 시나리오
| 시나리오 | 증상 | 대응 |
|---------|------|------|
| 타깃 경로 미존재 | `mklink` 실패 (errorlevel 1) | setup 순서로 예방 — **타깃 먼저 생성 후 junction** (§4.2) |
| 링크 경로에 이미 실 디렉토리 존재 | `mklink` 실패 ("이미 있습니다") | 백업 후 제거 — memory junction 패턴 동일 (setup_windows.ps1 94-97행과 동형) |
| 링크 경로가 이미 junction | 기존 타깃 추적 후 올바르면 유지 | §4.2 setup 로직이 reparse 플래그로 판별 |
| 타깃 디렉토리 삭제 | junction은 남지만 dangling | 연결 대상 복구 시 자동 복원 (데이터만 복구하면 연결은 회복) |
| Windows Update/Defender | 가끔 reparse point 복사본을 실 디렉토리로 오해 | 실증상 수상한잡화점 조직 PC들에서 발생 보고 없음. 발생 시 setup 재실행으로 복원 |

### 3.2 macOS / Linux (SECONDARY — 현 미사용 but 조직 자산 호환성 유지)

#### 3.2.1 사용 명령
```bash
ln -s "$HOME/.claude/nerdnavis-live" "<worktree>/.live"
```

#### 3.2.2 권한·환경 요구
- 일반 사용자 권한 충분
- macOS: 디폴트 지원
- 조직 기존 자산 증명: `setup/setup_macos.sh` 53·56행이 memory symlink 동일 방식 사용 중

#### 3.2.3 Windows와의 동작 차이 1점
- Symlink는 **파일로도 표시**될 수 있어 `test -L`로 판별 필요
- Junction은 디렉토리 속성 유지이므로 `test -d`로 판별되지만 `[IO.FileAttributes]::ReparsePoint` 플래그로 구분
- 결과적으로 **Bash hook 관점에서는 양쪽 모두 `test -d "$LIVE_DIR"`이 true**이므로 hook 로직 무변경 가능

#### 3.2.4 문제 시나리오 (Windows 대비 감소)
- macOS: `~/Library/CloudStorage/` 등 iCloud 동기화 폴더 하위에 symlink 생성 금지 (iCloud가 심볼릭 링크 타깃을 복제해버림). HOME은 일반적으로 iCloud 외부이므로 무관.
- Linux: 거의 무제한 지원.

### 3.3 공통 설계 원칙
- 실 저장 경로: `$HOME/.claude/nerdnavis-live/` (Win: `%USERPROFILE%\.claude\nerdnavis-live\`, Unix: `$HOME/.claude/nerdnavis-live/`)
- `~/.claude/` 디렉토리는 이미 Claude Code가 사용 중이므로 별도 관리 부담 없음
- `memory/org/` junction과 동일 HOME 하위 영역 → 셋업·삭제·복구 정책 단일 프로세스로 통합 가능

---

## 4. Setup 스크립트 확장 상세 설계

### 4.1 목적

신규 PC 최초 setup + 기존 PC 기존 데이터 마이그레이션을 단일 스크립트 실행으로 완결한다. **Idempotent** — 몇 번 실행해도 동일한 최종 상태를 보장한다.

### 4.2 공통 절차 (OS 무관 동일 흐름)

| 순서 | 작업 | 실패 시 방침 |
|------|------|--------------|
| 1 | 실 저장 디렉토리 생성 — `$HOME/.claude/nerdnavis-live/` | mkdir 실패 = 홈 디렉토리 권한 이상, 치명 → 보고 후 중단 |
| 2 | 실 저장에 `README.md` 복사 — 최소 1회, 이미 있으면 skip | skip |
| 3 | 레포 루트 `.live/`의 기존 파일 전수 확인 | N/A |
| 4 | 기존 파일 중 `README.md` 이외의 파일들 실 저장으로 이관 (copy, 같은 파일명 있으면 skip — 기존 실 저장이 우선) | 실패 시 해당 파일만 skip + 경고 |
| 5 | 레포 루트 `.live/` 실 디렉토리 백업 후 삭제 | 백업: `.live.bak-{timestamp}/`. 백업 실패 시 junction 생성 중단 |
| 6 | 레포 루트 `.live/` 위치에 junction/symlink 생성 → 타깃 = 실 저장 | 실패 시 fallback 실행 (§4.4) |
| 7 | 기존 worktree 전수(`git worktree list`) 순회하여 각 worktree의 `.live/`도 동일 절차 반복 | worktree별 독립 실패 허용, 실패 worktree는 WARN |
| 8 | 검증 — 각 junction이 reparse point인지·타깃이 올바른지 실측 | §4.6 |

### 4.3 기존 `.live/` 마이그레이션 안전성 (R3)

**기존 운영자 PC에서 안전한가?** — 예, 단 아래 보강 포함 시.

#### 4.3.1 안전 요소
- `.live/README.md`는 `git ls-files`로 추적 중 (실측 확인) → 삭제되어도 git에서 복원 가능
- 기존 다른 `.live/*.md`는 일시적 더미이며 SessionStart hook이 자동 비우는 대상 → 영구 자산 아님
- 백업 디렉토리 보존 (`.live.bak-{timestamp}/`)로 롤백 가능

#### 4.3.2 잠재 위험 + 보강
- **세션 실행 중 setup 실행** → 열린 파일 핸들과 충돌 가능. **보강**: setup 스크립트 상단에 경고 출력 "모든 Claude Code 세션 종료 후 실행 권장"
- **기존 더미에 아직 원본 미반영 데이터 존재** → 이관 대상이므로 실 저장에 복사하여 보존 (§4.2 단계 4)
- **동일 파일명이 실 저장과 worktree `.live/` 양쪽에 존재** → 실 저장이 우선(skip) 정책으로 일관. 사용자는 `.live.bak-*/`에서 수동 확인 가능

#### 4.3.3 C6-1 (원본 보호) 정합성
- 기존 `.live/` 실 디렉토리는 즉시 삭제하지 않고 `.live.bak-{timestamp}/`로 rename → C6-1 백업 파일명 규칙 (`{원본명}.bak_{YYYYMMDD_HHMM}`) 변형 준수. **중요·대규모 변경**은 아니므로 (일시 더미의 재배치이므로) PD님 별건 최종 승인은 불요 — 본 검토서 자체가 PD 승인 하의 집행 사전 보고 역할

### 4.4 Junction 생성 실패 시 Fallback (R1, R2, 원문 요청 질문 5)

#### 4.4.1 실패 원인 분류
| 원인 | 발생 확률 | 대응 방침 |
|------|----------|----------|
| Windows 정책으로 `mklink` 금지 | 극히 희박 (대기업 관리 환경) | §4.4.2 |
| 파일시스템 비지원 (예: 일부 네트워크 FS) | HOME이 로컬이면 해당 없음 | 해당 시 WARN |
| 이미 실 디렉토리 존재 + 백업 불가 | 파일 잠금 등 | §4.4.3 |
| 관리자 권한 이슈 (이론상 `/J`는 무관) | 극히 희박 | §4.4.2 |

#### 4.4.2 1차 Fallback — 정상 디렉토리 유지 + 경고
- junction 생성 실패 시 해당 worktree의 `.live/`는 **일반 디렉토리로 유지** (삭제 금지)
- **경고 로그** + 조직공지 SOT에 자진 보고 (`공유/조직공지/YYYY-MM-DD_Live_junction_생성실패_<PC명>.md`)
- 해당 worktree는 **P25 혜택을 받지 못하는 degraded 상태**로 동작 (격리되어 있음). PM 명시 push·pull 경로로 수동 동기화
- SessionStart hook이 상태 감지하여 매 세션 시작 시 재시도 (§4.5 `session_start_junction_check.sh` 신설)

#### 4.4.3 2차 Fallback — 작업 차단 선택지 (본 검토서 권장)
- **권장 방침**: 1차 Fallback(경고 + degraded 동작)
- **이유**: 작업 차단은 조직 생존급 사안 해결이 목적인 본 변경이 **또 다른 생산성 저하를 유발하는 역설**을 만듦. degraded 상태라도 **기존 worktree 미적용 상태와 동등한 수준**이므로 후퇴 없음
- 원문 요청 질문 6의 "SessionStart hook에서 자동 설치 vs 작업 차단" — **자동 설치 재시도 + 실패 시 degraded + 조직공지 자동 발행**이 최적. **차단 방침은 반대**

### 4.5 Worktree 자동 생성 시점 대응 (R4)

#### 4.5.1 문제
- Claude Code가 신규 worktree를 **세션 시작 직후 자동 생성** (본 세션의 `tender-liskov-844a72`도 동일 패턴)
- 이 시점에는 setup 스크립트가 실행되지 않음 → 신규 worktree의 `.live/`는 처음부터 일반 디렉토리로 생성됨 (격리 상태)

#### 4.5.2 해결책 — SessionStart hook에 junction 설치 자동화 추가
`scripts/live_session_load.sh` 상단 또는 별도 신규 스크립트 `scripts/live_junction_ensure.sh`로 다음 로직 삽입:

```bash
#!/bin/bash
# SessionStart 전용 — 현 worktree의 .live/가 junction인지 확인, 아니면 생성
REPO_ROOT=$(git rev-parse --show-toplevel 2>/dev/null)
[ -z "$REPO_ROOT" ] && exit 0

LIVE_DIR="$REPO_ROOT/.live"
CENTRAL_DIR="$HOME/.claude/nerdnavis-live"

# 중앙 저장소 미존재 시 생성 (idempotent)
mkdir -p "$CENTRAL_DIR" 2>/dev/null

# .live/가 reparse point(junction)/symlink면 통과
if [ -L "$LIVE_DIR" ] || (cmd //c "dir /A:L \"$LIVE_DIR\" 2>&1" | grep -q '<JUNCTION>' 2>/dev/null); then
  exit 0
fi

# 실 디렉토리면 백업 후 junction 생성 (R3 안전 절차)
if [ -d "$LIVE_DIR" ]; then
  BAK="$LIVE_DIR.bak-$(date +%Y%m%d_%H%M)"
  # 중앙 저장으로 파일 이관 (없는 파일만)
  for f in "$LIVE_DIR"/*; do
    [ -f "$f" ] || continue
    name=$(basename "$f")
    [ -e "$CENTRAL_DIR/$name" ] || cp "$f" "$CENTRAL_DIR/$name"
  done
  mv "$LIVE_DIR" "$BAK" 2>/dev/null
fi

# OS별 링크 생성
case "$(uname)" in
  MINGW*|CYGWIN*|MSYS*)
    cmd //c "mklink /J \"$(cygpath -w "$LIVE_DIR")\" \"$(cygpath -w "$CENTRAL_DIR")\"" >/dev/null 2>&1
    ;;
  *)
    ln -s "$CENTRAL_DIR" "$LIVE_DIR" 2>/dev/null
    ;;
esac

# 검증 + 실패 시 조직공지 발행
if [ ! -L "$LIVE_DIR" ] && ! (cmd //c "dir /A:L \"$LIVE_DIR\" 2>&1" | grep -q '<JUNCTION>' 2>/dev/null); then
  NOTICE="$REPO_ROOT/공유/조직공지/$(date +%Y-%m-%d)_Live_junction_생성실패_$(hostname).md"
  if [ ! -f "$NOTICE" ]; then
    cat > "$NOTICE" <<EOF
# ⚠️ Live junction 생성 실패 — $(hostname) / worktree: $(basename "$REPO_ROOT")

SessionStart hook이 $REPO_ROOT/.live를 junction으로 생성하지 못했습니다.
해당 worktree는 P25 실시간 공유에서 제외됩니다(degraded 상태).

**복구 절차**:
1. \`setup/setup_windows.ps1\` 재실행 (관리자 권한 시도)
2. 수동 명령: \`cmd /c mklink /J \"$LIVE_DIR\" \"$CENTRAL_DIR\"\`
3. 실패 지속 시 개발팀장 보고
EOF
  fi
fi
exit 0
```

**효과**: Claude Code가 새 worktree를 만들어도 **첫 프롬프트가 입력되기 전**에 SessionStart hook이 junction을 설치 → 실질적으로 격리 시간 0.

#### 4.5.3 Hook 호출 순서 영향
- `.claude/settings.json` SessionStart hooks 체인 중 **`live_session_load.sh` 이전에** 실행되어야 함
- 현 체인: `git fetch merge` → `inbox_scan` → `change_digest` → `live_session_load` → `pm_context_restore` → `verify_log_paths` → `git config hooksPath`
- **권고 배치**: `change_digest` 이후, `live_session_load` 이전에 `live_junction_ensure.sh` 삽입 → `live_session_load`가 이미 junction된 경로를 참조하므로 일관

### 4.6 설치 후 3축 검증 (verify_setup.ps1 확장, 원문 요청 질문 4)

기존 3축 검증(`scripts/verify_setup.ps1`)에 다음 확장:

#### 4.6.1 축 1 — 파일 존재
- `$HOME/.claude/nerdnavis-live/` 디렉토리 존재
- `$HOME/.claude/nerdnavis-live/README.md` 실 파일 존재

#### 4.6.2 축 2 — OS 동작 (reparse point / symlink 실체 검증)
- 레포 루트 `.live/`: `(Get-Item -Force).Attributes -band [IO.FileAttributes]::ReparsePoint` ≠ 0
- 해당 target이 `$HOME\.claude\nerdnavis-live`와 일치
- 각 worktree별(`git worktree list` 순회) `.live/`도 동일 검증

#### 4.6.3 축 3 — 실행 결과 (실제 쓰기·읽기 동작 확인)
- 각 worktree에서 테스트 파일 write: `.live/_verify_{pid}.md` 쓰기 → 중앙 저장에서 read 확인 → 삭제
- **중요**: 동일 중앙 저장을 가리키므로 A worktree에서 쓴 파일이 B worktree에서 읽혀야 통과

#### 4.6.4 자동 복구 로직
- 축 2 실패 (junction이 실 디렉토리로 변형) → 자동 재설치 시도 (§4.5 스크립트 호출)
- 축 3 실패 (실 저장 read 불가) → 조직공지 발행 + 개발팀장 수동 보고
- **무한 재시도 금지** — 3회 실패 시 degraded 상태 수락 + 조직공지

### 4.7 Setup 스크립트 디프 요약 (구현 범위)

| 파일 | 변경 유형 | 추가 라인 수 (대략) |
|------|----------|------------------|
| `setup/setup_windows.ps1` | §4.2 7단계 로직 추가 (memory junction 로직 직후에 배치) | 약 60줄 |
| `setup/setup_macos.sh` | 동 | 약 50줄 |
| `scripts/live_junction_ensure.sh` | 신규 | 약 40줄 |
| `scripts/verify_setup.ps1` | §4.6 3축 확장 | 약 30줄 |
| `.claude/settings.json` | SessionStart hook 체인에 `live_junction_ensure.sh` 삽입 | 5줄 |
| **Hook 로직 (`live_inject.sh` 등)** | **무변경** | 0줄 |

---

## 5. 종합 리스크 재평가 + 원안 미대응 영역 (원문 질문 7, 8, 9)

### 5.1 기존 worktree 운용 정책과의 양립 (질문 8)

- Claude Code의 worktree 생성 자체는 **Claude Code 내부 동작**이며 조직이 제어 불가
- `.gitignore` 22행: `.claude/worktrees/` 는 이미 git ignore 대상 → worktree가 조직 레포에 혼입되지 않도록 설계되어 있음
- 본 해결책은 **worktree 기능 사용을 중단시키지 않고도 P25 효용을 완전히 회복**시킴 — 양립 완전 달성
- **엣지 케이스**: Claude Code가 worktree 생성 직후 setup 스크립트 실행 없이 세션 시작 — §4.5 SessionStart hook으로 해결
- **엣지 케이스 2**: 세션 도중 새 worktree 추가 (예: 병렬 세션 시작) — 신 worktree에서의 첫 프롬프트 제출 시 UserPromptSubmit hook이 실행되기 전 SessionStart hook이 먼저 실행되므로 동일 해결

### 5.2 기타 worktree-local 자산 전수 조사 (질문 7) — 추가 발견 없음, 단 `paths.local.json` 정밀 점검 필요

§1.4에서 정리한 전수 조사 결과: `.live/` 외 worktree-local 의미 자산은 없음.

**단, `paths.local.json`** (루트 레포의 로컬 경로 설정) 관련 **미확인 1건**:
- 신규 worktree 자동 생성 시 `paths.local.json`이 복사되는지 / 상위 레포를 자동 참조하는지 실측 필요
- 본 검토 범위 한계로 미확인 — DevOps 후속 점검 위임 권고 (§7.2 참조)

**발견 2**: `inbox_hash_*`, `last_fetch_*`, `hold_files_hash`는 모두 `~/.claude/.nerdnavis_throttle/`(HOME)에 저장 → worktree 무영향 — 추가 중앙화 조치 불요

**결론**: `.live/` 중앙화 1건으로 **근원 해결 완결**. 추가 자산 중앙화는 현 시점 불요.

### 5.3 자동 복구 범위 한정 (질문 4, R7)

자동 복구 스코프를 과도 확장하면 오류 시 조용히 실패로 이어져 C5(정직성)·C23(허위 보고 금지) 위반 가능. 따라서:

- **자동 복구 허용**: junction 유실·타깃 미존재·reparse 플래그 손상
- **자동 복구 금지**: 중앙 저장소 내부 파일 손상·더미 파일 내용 훼손 (이는 데이터 문제이므로 복구가 아닌 보고)
- **3회 실패 후 종료** — 동일 복구 시도 루프 방지

### 5.4 역추적 위험 — 기존 `.live/` 잔존 파일 처리 (질문 9)

#### 5.4.1 현 상태 실측
- 본 worktree(`tender-liskov-844a72`): `README.md`만 존재
- 타 worktree(`nifty-wing-4752bd`): `README.md` + `ping.md` (19 bytes, 테스트 파일)
- 메인 레포: `README.md`만 존재

#### 5.4.2 처리 방침
- **`README.md`**: git tracked → junction 생성 시 중앙 저장으로 이관 (§4.2 단계 4). git 상태는 `README.md` 내용 자체가 중앙 저장을 통해 **동일 파일 제공**되므로 변화 없음. `git status`가 `deleted`로 오인할 수 있으나 junction 내부 파일 자체는 동일 → git 정상 추적
  - **주의**: git이 reparse point를 어떻게 인식하는지 OS·git 버전별 차이 가능. 실증 결과 memory junction의 경우 git이 해당 디렉토리 자체를 건드리지 않음 → `.live/` junction도 유사 동작 예상. 단 실증 후 최종 확정 필요 (§7.3)
- **`ping.md`**: 테스트 파일, 임의 시점 소멸 가능한 더미 → 삭제 무방. 단 마이그레이션 시 중앙 저장으로 이관하여 보존 가능 (정책 선택)

#### 5.4.3 권장 처리 순서 (집행 시)
1. 조직 전원 세션 종료 통보
2. 각 PC에서 setup 스크립트 실행 (junction 설치 + 마이그레이션)
3. 백업 디렉토리(`.live.bak-*`) 보존 (1주일 후 삭제 권고)
4. 각 PC에서 verify_setup.ps1 3축 검증 통과 확인
5. 1 주간 관찰 기간(관찰 안정 후 백업 삭제 공지)

### 5.5 장기 운영 리스크 — 중앙 저장소 비대화

- `.live/` 증분 더미는 세션 시작 시 자동 비우는 설계(`live_session_load.sh` 46-56행) → 중앙화되어도 정책 유지
- 단, 비정상 종료(세션 크래시)로 잔여 더미가 쌓이면 점진 증가 가능
- **완화**: `live_session_load.sh`에 **30일 경과 파일 자동 정리** 로직 추가 권고 (선택 사항, 긴급 아님)

---

## 6. 테스트 시나리오 (집행 후 검증)

| # | 시나리오 | 성공 기준 |
|---|---------|----------|
| T1 | 단일 PC 단일 worktree에서 `.live/test.md` 작성 → 본 세션 다음 프롬프트에서 hook이 주입 | `[LIVE:test.md]` 헤더로 내용 주입 |
| T2 | 단일 PC 메인 + worktree A 2세션 중 A에서 `.live/test.md` 작성 → 메인 세션 다음 프롬프트에서 감지 | 메인 세션 hook이 주입 |
| T3 | 단일 PC worktree A·B 2세션 중 A → B 방향 | B 세션 hook이 주입 |
| T4 | Claude Code가 신규 worktree C 자동 생성 직후 첫 프롬프트 | junction 자동 설치 + 기존 더미 이관됨 |
| T5 | 기존 PC에서 setup 재실행 (마이그레이션) | 기존 `.live/*.md` 중앙 이관, 백업 디렉토리 보존 |
| T6 | `verify_setup.ps1` 실행 | 3축 모두 통과 |
| T7 | Junction 강제 삭제 후 SessionStart 재실행 | 자동 재설치 |
| T8 | 3회 연속 설치 실패 시뮬레이션 | 조직공지 자동 발행 + degraded 운영 진입 |
| T9 | PC A → PC B `git clone` 후 setup 실행 | PC B에서 처음부터 junction 상태 |
| T10 | 세션 공유(push) 후 다른 PC `git pull` | README.md git-tracked 정상 동작, 더미 내용은 여전히 중앙 저장 로컬이므로 영향 없음 |

---

## 7. 집행 권고 + 후속 안건

### 7.1 집행 권고

1. **본 검토서를 근거로 PD님 최종 승인 요청** (PM 경유) → 승인 시 즉시 집행
2. 집행 순서:
   1) `scripts/live_junction_ensure.sh` 신규 작성
   2) `setup/setup_windows.ps1`·`setup/setup_macos.sh` 확장
   3) `.claude/settings.json` SessionStart hook 체인 업데이트
   4) `scripts/verify_setup.ps1` 3축 확장
   5) 조직공지 발행 (`공유/조직공지/2026-04-18_Live_중앙저장소_Junction_체계_도입.md`)
   6) CLAUDE.md "🔔 최근 규칙 변경" 섹션 1줄 추가 (P25 운영 변경 — junction 경유)
   7) 조직 전원에 세션 재시작 + `verify_setup.ps1` 실행 안내
3. **하루 후 상태 점검** — 각 PC 정상 동작 실측 + degraded PC 보고 집계
4. **1주일 후 백업 디렉토리 일괄 삭제 공지** (운영 안정 확인 후)

### 7.2 DevOps 후속 안건

- `paths.local.json`의 worktree 간 동작 실측 — 격리되어 있지 않은지 확인 (5분 작업)
- `live_session_load.sh`에 30일 경과 파일 정리 로직 추가 (선택 사항)
- `verify_setup.ps1` 운영 자동화 (세션 시작 시 주기 실행 옵션)

### 7.3 실증 확인 필요 사항

- git이 `.live/` junction을 어떻게 인식하는지 실측 — `git status`가 `modified`로 판정할 가능성. 메모리 junction에서는 문제없으나 `.live/README.md`가 tracked 파일이므로 재확인 필요
  - **실증 방법**: 집행 직후 `git status`·`git diff`·`git log .live/` 확인
  - **실증 시점**: 집행 집행 직후
  - **실패 시 대안**: `.gitignore`에 `.live/` 추가 + `.live/README.md`만 `!.live/README.md` 예외 처리, 단 junction 내부에서 예외가 동작하는지도 실측 필요

---

## 8. 개발 관점 원칙 (C11) 준수 검증

- **자원 효율성**: Hook 무변경·Setup 스크립트 50줄 내외·네트워크 비용 0 유지 ✅
- **코드 구조의 직관성**: C16-1 memory junction과 동형 패턴 → 다음 개발자가 즉시 이해 가능 ✅
- **코드의 범용성**: `.live/`에 한정된 해결이 아니라, "worktree-local 의미 자산의 HOME 중앙화" 일반 패턴 확립 → 차기 프로젝트에서도 재활용 (헌법 제1원칙 ②·P29 계승) ✅

## 9. 헌법 제1원칙 정합성 검증

- **원칙 ①** (AI 전문 개발 스튜디오): 해당 간접
- **원칙 ②** (경험 축적·계승·발전): junction 중앙화 패턴 차기 프로젝트 재활용 ✅
- **원칙 ③** (허위 보고 금지·상호 감시): 본 검토서가 실제 tool_use 근거 기반 ✅
- **원칙 ④** (조직 구성): N/A
- **원칙 ⑤** (세션·PC 연속성 보장): **직접 기여 — 본 해결책의 존재 이유** ✅

---

## 10. 자기검증 체크리스트 (C31)

- [x] A. C29 준수: PM 재량으로 결정 가능 사항은 자체 결정안 제시. PD님 결정 떠넘기기 없음
- [x] B. C30: 조직 레포 `git fetch && git status` 필요 없는 읽기 전용 분석 단계. 집행 단계에서 수행 예정
- [x] C. C5·C23: 모든 실측 값(`git worktree list`·`ls .live/`·hook 소스 코드)은 실제 tool_use 결과 인용. 추정·상상 없음
- [x] C25: 1./1)/A./가) 위계 선순 적용. 원문자·임의 식별자 없음
- [x] C22: PD님 도입 용어 "worktree 격리"·"근원 해결"·"중앙 `.live/`" 원형 그대로 사용
- [x] E. 기존 조직 자산 우선 활용: C16-1 memory junction 패턴 직접 재활용. 새로운 메커니즘 발명 없음
- [x] E. 자산 가치 보존 ≠ 저장 위치 보존: `.live/`의 자산 가치(P25 실시간 공유)는 유지, 저장 위치(worktree-local → HOME 중앙)만 변경

---

## 11. PM 수령 후 다음 행동

1. 본 보고서 PM 검토
2. **본 검토서만으로 집행 가능 판단** 시 → PM 즉시 집행 (C20 재량 범위 내 — 코어룰 신설 없이 운영 스크립트 변경 + 조직공지 발행). 단 조직 전원 세션 종료·재시작 안내 필요 → C1 사전 안내 규정 준수
3. **PD님 승인 필요 판단** 시 → 안건 3~5줄로 요약해 PD님 보고 + 본 검토서 참조 링크
4. 집행 완료 후 개발팀 PD 지시 로그 #39 상태 → `완료` 갱신 (C27 의무)
5. 대화로그 `공유/대화로그/조직운영/2026-04-18.md`에 결정·근거 3요소 + 기각안 엔트리 추가 (C32 의무)

---

**개발팀장 서명 — 2026-04-18**
실무 검토 범위: 기존 코드·스크립트·hook 전수 확인 · OS별 기술 상세 · 엣지 케이스 7종 · 테스트 시나리오 10종 · 3축 검증 확장 · 조직 자산 일관성 재검토.

C23 정직성 선언: 본 검토서의 모든 주장은 실제 파일 Read·Bash 실행 결과에 기반함. 추정·미확인 사항은 `미확인` 태그로 §5.2, §5.4.2, §7.3에 명시.
