feat(rules): C34 Live 증분 동기화 헌법급 신설 + worktree 격리 근원 해결
PD님 조직 생존급 선언 수용 — "이 문제가 해결되지 않으면 앞으로 우리 조직은 유지될 수 없어" / "철저히 검토해서 가능한 모든 수단을 써서 개선해". 헌법 제1원칙 ⑤(세션·PC 연속성) 근본 위협 판정. P25 → C34 승격 + 중앙 Junction 구조로 worktree 경계 무관 실시간 공유 복원. 집행 10종: - SKILL.md: C34 신설(14개 하위 조항) + P25 본문 삭제(C14-5-확장) + C16-1 .live/ junction 편입 + C31-1-E 표기 갱신 + 조직 핵심 자산 참조 갱신 - CLAUDE.md: 핵심 규칙 요약 28→29 + C34 추가, 프로젝트 규칙 요약 25→24 + P25 제거, 번호 구멍 목록 확장 - scripts/live_junction_ensure.sh: 신규 SessionStart hook (PowerShell New-Item Junction 우선, git-bash mklink 대비 신뢰성 우위 실증 반영) - setup/setup_windows.ps1·setup_macos.sh: 3.5 섹션 추가 - scripts/verify_setup.ps1: 2.5 Live junction 3축 검증 (실측 통과 확인) - .claude/settings.json: SessionStart hook 체인 최우선 삽입 - .gitignore: .live/* 제외 + README 예외 + 백업 제외 - 공유/조직공지/2026-04-18_C34_신설_worktree_격리_근원해결.md 신설 - 공유/조직공지/폐기_규칙_아카이브.md §13 P25 승격 6필드 기록 - memory/org/feedback_worktree_isolation.md + feedback_agent_path_boundary.md 신설 + MEMORY.md 인덱스 대화로그·PD 지시 로그 #39 완료 갱신 포함. Agent 경계 넘기 2차 사건 (개발팀장 Agent 절대 경로 하드코딩으로 레포 루트 유출) stash 이관 복구 + C34-11 Agent 경계 보호 조항 신설. 조직 전원 세션 1회 재시작 필요 — SessionStart hook이 live_junction_ensure.sh 자동 실행하여 junction 설치. verify_setup.ps1 통과 확인 후 작업 재개. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
parent
5085c5625e
commit
53fa3162ef
|
|
@ -81,6 +81,10 @@
|
|||
"type": "command",
|
||||
"command": "git fetch origin 2>/dev/null; CHANGES=$(git log --oneline HEAD..origin/main 2>/dev/null | head -10); if [ -n \"$CHANGES\" ]; then echo '📌 [SessionStart] origin/main 변경 검출 — 자동 병합 중:'; echo \"$CHANGES\"; git merge origin/main --no-edit 2>/dev/null && echo '✅ 자동 병합 완료' || echo '⚠️ 자동 병합 실패 (충돌 발생 — 수동 해결 필요)'; else echo '✅ [SessionStart] main 동기화 상태'; fi"
|
||||
},
|
||||
{
|
||||
"type": "command",
|
||||
"command": "bash scripts/live_junction_ensure.sh 2>/dev/null || true"
|
||||
},
|
||||
{
|
||||
"type": "command",
|
||||
"command": "bash scripts/inbox_scan.sh 2>/dev/null || true"
|
||||
|
|
|
|||
|
|
@ -58,7 +58,7 @@ description: 너드나비스 조직의 헌법 제1원칙(5항 ①~⑤) + 헌법
|
|||
|
||||
### 조직 핵심 자산 — Live 더미 파일 프로세스
|
||||
|
||||
세션이 변경되기 전까지 갱신이 안 되는 문서의 경우, **더미 파일(`.live/`)을 활용해 세션이 변경되지 않아도 확인할 수 있는 프로세스를 구축했으며 이것은 우리의 핵심 자산이다.** 상세 규정: P25 Live 증분 동기화 체계.
|
||||
세션이 변경되기 전까지 갱신이 안 되는 문서의 경우, **더미 파일(`.live/`)을 활용해 세션이 변경되지 않아도 확인할 수 있는 프로세스를 구축했으며 이것은 우리의 핵심 자산이다.** 상세 규정: C34 Live 증분 동기화 체계 (2026-04-18 헌법급 승격, worktree 경계 무관 중앙 Junction).
|
||||
|
||||
---
|
||||
|
||||
|
|
@ -587,6 +587,7 @@ CLAUDE.md 신규 항목, 매 턴 로드 대상 확대, `MEMORY.md` 인덱스 확
|
|||
- 조직 공용 승인은 **루트 `.claude/settings.json` 단일 파일**에 선언하며 git 커밋으로 유지한다 (루트가 SOT). 단일 세션 구조이므로 부서별 별도 settings.json 복제는 불필요.
|
||||
- PC별 변동값(`paths.local.json`)은 `.gitignore`로 추적 제외하고 `paths.local.json.template`만 커밋한다.
|
||||
- 사용자 메모리(`memory/org/`)는 setup 스크립트가 `~/.claude/projects/<해시>/memory` junction으로 자동 연결한다.
|
||||
- **Live 증분 동기화 `.live/`**는 setup 스크립트 + SessionStart hook(`scripts/live_junction_ensure.sh`)이 `$HOME/.claude/nerdnavis-live/`로 junction 자동 연결한다 — **worktree 경계 무관 실시간 공유 보장** (C34 근원 해결, 2026-04-18 PD님 직접 지시 신설).
|
||||
- `.claude/settings.local.json`은 `.gitignore` 대상이므로 **PC 이동 시 소실된다 — 조직 공용 승인은 절대 local 파일에 두지 않는다**.
|
||||
|
||||
### C16-2. 세션 시작 표준 절차 (단일 세션 — 레포 루트에서 시작)
|
||||
|
|
@ -921,47 +922,6 @@ PD님이 **"세션 공유"**라고 지시하면, 현재 세션의 모든 변경
|
|||
- 별도 결정로그 파일(`공유/소통/{부서}→PM/`) 발행은 **선택 사항**이며 대화로그 엔트리만으로도 요건 충족
|
||||
- 자기 송신 채널 결정로그 파일이 필요한 경우(타 부서 영향 명시적 공지 등) 대화로그 + 결정로그 병행 가능
|
||||
|
||||
## P25. Live 증분 동기화 체계 (2026-04-16 PD님 직접 지시 / 2026-04-17 조직 핵심 자산 선언)
|
||||
|
||||
> 🏆 **조직 핵심 자산 (2026-04-17 PD님 직접 명시)**: Live 더미 + `sync_signal.sh` 시그널 체계는 **같은 PC 세션 간 네트워크 비용 0으로 실시간 공유** 가능한 너드나비스 고유 메커니즘. "작업 완료 시 공유 문서 + Live 더미 + 시그널 즉시 갱신 → 다른 세션 프롬프트 시 감지" 구조는 차기 프로젝트·조직 확장 시에도 핵심 경쟁력으로 계승된다. 향후 polling 기반 대안으로 회귀 금지. 신규 기능·문제 해결 시 본 체계 활용 가능성을 최우선 검토(C31-1-E).
|
||||
|
||||
> 세션 시작 후 변경된 설정·규칙·에이전트 정의를 **세션 갱신 없이 즉시 반영**하기 위한 임시 더미 파일 체계. 원본 수정 + 더미 기록의 이중 반영으로, 현재 세션은 hook이 즉시 주입하고 다음 세션은 원본이 이미 최신.
|
||||
|
||||
### 대상 (세션 중 반영 불가 9종)
|
||||
CLAUDE.md, CLAUDE.local.md, .claude/settings.json, settings.local.json, .claude/skills/*/SKILL.md, .claude/agents/*.md, .claude/rules/*.md, .claude/commands/*.md, .mcp.json
|
||||
|
||||
### 더미 파일 위치
|
||||
`.live/` — 원본과 동일 파일명으로 **변경분(diff)만** 기록.
|
||||
|
||||
### 변경 발생 시 절차
|
||||
1. **원본 파일 즉시 수정** (다음 세션·다른 PC를 위해)
|
||||
2. **`.live/{파일명}`에 변경 요지 append** (현재 세션 즉시 반영용)
|
||||
3. UserPromptSubmit hook(`live_inject.sh`)이 증분 감지 → 추가분만 컨텍스트 주입
|
||||
|
||||
### 증분 읽기 원리
|
||||
- hook이 파일별 "마지막 읽은 줄 번호" 기록
|
||||
- 다음 턴에 추가된 줄만 stdout 출력 → 에이전트 컨텍스트 주입
|
||||
- 변경 없으면 출력 없음 (토큰 비용 0)
|
||||
|
||||
### 서브에이전트 의무
|
||||
모든 에이전트는 작업 착수 전 `.live/` 디렉토리에 더미 파일이 존재하는지 확인하고, 존재하면 Read하여 변경사항을 인지한다.
|
||||
|
||||
### Write 권한
|
||||
- **PM만 Write** (서브에이전트는 Read 전용)
|
||||
- 각 더미 파일 최대 8,000자
|
||||
|
||||
### "세션 공유" 시 동기화 (P21-2 연계)
|
||||
1. 더미 내용이 원본에 이미 반영되어 있는지 확인
|
||||
2. `.live/` 더미 파일 비우기 (README.md 제외)
|
||||
3. commit + push
|
||||
|
||||
### C14 준수
|
||||
- 변경 없는 턴: 토큰 비용 0 (해시 비교만)
|
||||
- 변경 감지 턴: 추가분만 주입 (전체 재읽기 없음)
|
||||
- 세션 시작 시: SessionStart hook이 전량 1회 로드
|
||||
|
||||
---
|
||||
|
||||
## P29. 코어 코드 프레임워크 프로젝트 규칙 (2026-04-18 PD님 직접 지시)
|
||||
|
||||
> **적용 범위**: **코어 코드 프레임워크** 프로젝트 (`코어코드/NerdNavis.Framework/`·`프로젝트/코어프레임워크/`) 전용 규칙. 본 규칙은 프로젝트 단위 고유 규칙으로 P17(수상한잡화점 전용)과 동일 층위.
|
||||
|
|
@ -1560,7 +1520,7 @@ C20-7 자기검증 5문항에 다음 항목 추가:
|
|||
|
||||
**E. 기존 조직 자산 우선 활용 확인 (2026-04-17 추가)**
|
||||
- [ ] 새로운 문제·지시에 대한 해법을 설계할 때, **조직에 이미 있는 체계** 중 본 문제를 해결할 수 있는 것을 가장 먼저 검토했는가?
|
||||
- 필수 검토 대상: **P25 Live 증분 동기화**(조직 핵심 자산) · P27 3축 감사 · memory/feedback 패턴 · 기존 `scripts/`·`git-hooks`·UserPromptSubmit/SessionStart/SessionEnd hook
|
||||
- 필수 검토 대상: **C34 Live 증분 동기화**(🏆 조직 핵심 자산, 구 P25 헌법급 승격) · P27 3축 감사 · memory/feedback 패턴 · 기존 `scripts/`·`git-hooks`·UserPromptSubmit/SessionStart/SessionEnd hook
|
||||
- [ ] 기존 자산을 무시하고 새로 만들거나 양적 조정(숫자 단순 변경)으로 회피하지 않았는가?
|
||||
- [ ] PD님 지시를 **결과 단독으로 축소 해석**하지 않고, **설계 경로까지 암묵 포함**으로 읽었는가? (2026-04-17 "자동 push 기본" 왜곡 사건 재발 방지)
|
||||
- [ ] **자산 가치 보존 ≠ 저장 위치 보존** 구분했는가? (2026-04-18 추가) — 자산(조직 기억·교훈·폐기 선언·기각 근거)의 **가치는 반드시 유지**하되 **저장 위치는 C14 관점에서 최적화 가능**. 활성 본문에 고정 = 과도 보수 해석. 외부 SOT(`memory/org/`·`공유/조직공지/폐기_규칙_아카이브.md`)로 이관하되 1줄 참조 유지 방식 검토. **PM 과도 보수 해석 2회 연속 재발 사건(원칙 3 원안·원칙 1 현안)** 근거로 신설, 3회차 재발 시 역할 재검토 (`memory/org/feedback_pm_over_conservative_interpretation.md`)
|
||||
|
|
@ -1586,3 +1546,89 @@ C20-7 자기검증 5문항에 다음 항목 추가:
|
|||
### C31-5. 본 규칙의 무게
|
||||
PD님 직접 선언: **"이 문제는 우리 조직의 사활이 걸린 매우 중대한 문제야."**
|
||||
본 규칙이 무력화되면 조직 운영 자체가 무력화된다. C23(허위 보고 금지)과 함께 **너드나비스 조직의 생존 2대 규칙**이다.
|
||||
|
||||
---
|
||||
|
||||
## C34. Live 증분 동기화 체계 (🏆 조직 핵심 자산, 2026-04-18 PD님 직접 지시로 P25에서 헌법급 승격 + 근원 해결)
|
||||
|
||||
> **승격·격상 근거**: 2026-04-18 worktree 격리로 P25 체계 실패 실증. PD님 직접 선언 — **"이 문제가 해결되지 않으면 앞으로 우리 조직은 유지될 수 없어"** · **"철저히 검토해서 관련 문서에 일괄 반영하고 재발되지 않도록 가능한 모든 수단을 써서 개선해"**. 헌법 제1원칙 ⑤(세션·PC 연속성 보장)의 근본 위협 판정 → 프로젝트 규칙에서 헌법급 승격 + 근원 해결(중앙 Junction) + Agent 경계 보호 3종 동시 집행. 구 P25 경위: [폐기 규칙 아카이브](../../../공유/조직공지/폐기_규칙_아카이브.md).
|
||||
|
||||
### C34-1. 개요
|
||||
세션 시작 후 변경된 설정·규칙·에이전트 정의를 **세션 갱신 없이 즉시 반영**하기 위한 **중앙 저장소 + Junction** 체계. 같은 PC 내 모든 Claude 세션이 네트워크 비용 0으로 실시간 공유하는 너드나비스 고유 메커니즘이며, **worktree 경계에 관계없이 동일하게 작동**한다.
|
||||
|
||||
### C34-2. 작동 경계 (2026-04-18 worktree 격리 해결 반영)
|
||||
- ✅ 동일 PC 내 모든 Claude 세션 (**worktree 경계 무관** — C34-3 중앙 junction 구조)
|
||||
- ✅ 레포 루트·worktree·다른 worktree에서 세션 시작해도 동일 파일시스템 참조
|
||||
- ❌ 다른 PC 간 실시간 공유 (이 경우 `git push` 경유 명시 공유, P21-2)
|
||||
|
||||
### C34-3. 중앙 저장소 구조 (근원 해결 핵심)
|
||||
- **실 저장**: `$HOME/.claude/nerdnavis-live/` (PC 로컬 단일)
|
||||
- **각 worktree의 `.live/`**: 위 경로로 **Junction(Windows `mklink /J`) / Symlink(Unix `ln -s`) 자동 연결**
|
||||
- **자동 설치**: `scripts/live_junction_ensure.sh` (SessionStart hook 체인 최우선 삽입, git fetch 직후) + `setup/setup_windows.ps1`·`setup/setup_macos.sh` 3.5 섹션이 보장
|
||||
- **Sentinel 방식 판정**: `$CENTRAL_LIVE/.junction-marker` 파일 존재 여부로 연결 상태 OS-agnostic 판정
|
||||
- **검증**: `verify_setup.ps1` 2.5 섹션 3축 검증 (중앙 실체·reparse point·marker 경유 읽기)
|
||||
|
||||
### C34-4. 대상 (세션 중 반영 불가 9종)
|
||||
CLAUDE.md, CLAUDE.local.md, .claude/settings.json, settings.local.json, .claude/skills/*/SKILL.md, .claude/agents/*.md, .claude/rules/*.md, .claude/commands/*.md, .mcp.json
|
||||
|
||||
### C34-5. 변경 발생 시 절차
|
||||
1. **원본 파일 즉시 수정** (다음 세션·다른 PC를 위해)
|
||||
2. **`.live/{파일명}`에 변경 요지 append** — junction 경유로 중앙 저장소에 실제 기록
|
||||
3. UserPromptSubmit hook `live_inject.sh`가 증분 감지 → **모든 세션(worktree 무관)에 자동 주입**
|
||||
|
||||
### C34-6. 증분 읽기 원리
|
||||
- hook이 파일별 "마지막 읽은 줄 번호" 기록 (`$HOME/.claude/.nerdnavis_throttle/`)
|
||||
- 다음 턴에 추가된 줄만 stdout 출력 → 에이전트 컨텍스트 주입
|
||||
- 변경 없으면 출력 없음 (토큰 비용 0)
|
||||
|
||||
### C34-7. 서브에이전트 의무 (Agent 경계 보호 강화)
|
||||
모든 에이전트는 작업 착수 전 `.live/` 디렉토리에 더미 파일이 존재하는지 확인하고, 존재하면 Read하여 변경사항을 인지한다.
|
||||
- **절대 경로 `E:\NerdNavisAi\...` 등 하드코딩 금지** — 항상 `.live/` 상대 경로 또는 `git rev-parse --show-toplevel` 기반 경로 사용 (C34-11 위반 사건 재발 방지)
|
||||
|
||||
### C34-8. Write 권한
|
||||
- **PM만 Write** (서브에이전트는 Read 전용)
|
||||
- 각 더미 파일 최대 8,000자
|
||||
|
||||
### C34-9. "세션 공유" 시 동기화 (P21-2 연계)
|
||||
1. 더미 내용이 원본에 이미 반영되어 있는지 확인
|
||||
2. `.live/` 더미 파일 비우기 (README.md·.junction-marker 제외)
|
||||
3. commit + push
|
||||
|
||||
### C34-10. C14 준수
|
||||
- 변경 없는 턴: 토큰 비용 0 (sentinel 비교만)
|
||||
- 변경 감지 턴: 추가분만 주입 (전체 재읽기 없음)
|
||||
- 세션 시작 시: `live_junction_ensure.sh`가 junction 보장 후 `live_session_load.sh`가 전량 1회 로드
|
||||
|
||||
### C34-11. Agent 경계 보호 — 절대 경로 하드코딩 금지 (2026-04-18 실증 신설)
|
||||
Agent 도구로 호출된 서브에이전트가 **절대 경로로 레포 루트를 하드코딩하면 worktree 경계를 넘어 main 체크아웃 디렉토리에 변경이 기록되는 이슈 실증** (2026-04-18 worktree 격리 2차 사건: 개발팀장 Agent가 `E:\NerdNavisAi\공유\...`로 Write 호출하여 본 워크트리가 아닌 레포 루트에 파일 생성).
|
||||
|
||||
**재발 방지 의무**:
|
||||
- Agent 호출 프롬프트에 **"현재 cwd 기준 상대 경로 사용 의무"** 명시
|
||||
- 산출물 경로는 `$(git rev-parse --show-toplevel)` 기준 또는 상대 경로
|
||||
- PM은 Agent 응답 수령 직후 `git -C <레포루트> status` + 본 워크트리 `git status` 병행 확인
|
||||
- 경계 이탈 발견 시 `git -C <레포루트> stash push -u -- 공유/` → 본 워크트리 `git stash pop`으로 복구
|
||||
- 재발 방지 메모리: `memory/org/feedback_agent_path_boundary.md`
|
||||
|
||||
### C34-12. Degraded 운영 (작업 차단 금지 원칙)
|
||||
Junction 생성 실패 시 **작업을 차단하지 않고** 로컬 `.live/` 일반 디렉토리로 동작(경고 출력). 이유:
|
||||
- 조직 생존 해결이 또 다른 생산성 저하 역설 유발 방지
|
||||
- Degraded 모드 감지 시 다음 세션 시작마다 자동 재시도 (최대 3회/세션)
|
||||
- 영구 실패 시 관리자 권한 setup 스크립트 재실행 또는 `공유/조직공지/` 수동 이슈 보고
|
||||
|
||||
### C34-13. 연관 규칙·자산
|
||||
- **헌법 제1원칙 ⑤** (세션·PC 연속성): 본 규칙의 상위 근거
|
||||
- **C16-1** (PC 독립 셋업): Live junction 자동 연결이 본 조항에 편입됨 (2026-04-18 보강)
|
||||
- **C17** (최신 세션 관리 기준): 세션 시작 시 junction 실체 검증 의무
|
||||
- **C21-①** (내부 공유 상태): 핵심 수단
|
||||
- **C18** (조직 공유 완료 판정): main push로의 전환
|
||||
- **P21-2** (세션 공유 프로토콜): 다른 PC 간 실시간 공유의 명시 수단
|
||||
- **`scripts/live_junction_ensure.sh`** (SessionStart hook 최우선 삽입)
|
||||
- **`scripts/live_inject.sh`** (UserPromptSubmit hook)
|
||||
- **`scripts/sync_signal.sh`** (post-commit hook 시그널)
|
||||
|
||||
### C34-14. 격상 경위 (조직 기억)
|
||||
- **2026-04-16** P25 신설 (PD님 직접 지시)
|
||||
- **2026-04-17** PD님 "조직 핵심 자산" 직접 명시
|
||||
- **2026-04-18 오전** worktree 격리 실증 — 세션 B(nifty-wing) `.live/ping.md` Write가 세션 A(tender-liskov) hook에 미주입
|
||||
- **2026-04-18 오후** PD님 조직 생존급 선언 + "가능한 모든 수단을 써서 개선" 지시 → **헌법급 승격 + 근원 해결(중앙 Junction) + Agent 경계 보호 동시 집행**
|
||||
- 차기 프로젝트 착수 시 `setup_*` 스크립트 호출만으로 본 체계 즉시 재사용
|
||||
|
|
|
|||
|
|
@ -101,3 +101,11 @@ node_modules/
|
|||
coverage/
|
||||
dist/
|
||||
build/
|
||||
|
||||
# ===== Live 증분 동기화 (C34 중앙 junction 체계 — 2026-04-18 PD님 직접 지시) =====
|
||||
# .live/는 worktree별 junction/symlink 대상이므로 내부 파일은 추적 제외.
|
||||
# README.md만 tracked 유지 (조직 문서 역할). 마이그레이션 백업 디렉토리도 제외.
|
||||
.live/*
|
||||
!.live/README.md
|
||||
.live.bak-*/
|
||||
|
||||
|
|
|
|||
11
CLAUDE.md
11
CLAUDE.md
|
|
@ -33,7 +33,7 @@ PD님
|
|||
| 구분 | 성격 | 변경 권한 |
|
||||
|------|------|----------|
|
||||
| **헌법 제1원칙** (5항 ①~⑤) | 조직의 **최상위 원칙** | **PD님만** 수정 가능 (2026-04-18 전면 재작성) |
|
||||
| **핵심 규칙** (코어 룰, C1~C33) | 조직의 **헌법** | **PD님만** 수정 가능 (총괄PM이 팀장급과 상의 후 제안 → PD님 승인) |
|
||||
| **핵심 규칙** (코어 룰, C1~C34) | 조직의 **헌법** | **PD님만** 수정 가능 (총괄PM이 팀장급과 상의 후 제안 → PD님 승인) |
|
||||
| **프로젝트 규칙** (조직 규칙, P1~P31) | 조직의 **법률** | **팀장급 재량 + PD님 최종 승인 필수** (2026-04-18 개정 — 사전 승인 체계) |
|
||||
|
||||
### 헌법 제1원칙 (2026-04-18 PD님 직접 전면 재작성)
|
||||
|
|
@ -44,7 +44,7 @@ PD님
|
|||
- **⑤** 세션·PC 변경 시에도 일관된 정보 공유·동기화된 환경·연속성 있는 업무 수행
|
||||
- 구 3개 목표 폐기: [폐기 규칙 아카이브 #constitution-v1](공유/조직공지/폐기_규칙_아카이브.md#constitution-v1)
|
||||
|
||||
### 핵심 규칙 요약 (활성 28개, 번호 구멍 허용 — 폐기 표기 본문 유지 금지 원칙)
|
||||
### 핵심 규칙 요약 (활성 29개, 번호 구멍 허용 — 폐기 표기 본문 유지 금지 원칙)
|
||||
- **C1** 지시=승인 / **C2** 근원적 문제 해결 / **C3** 이슈 은폐 금지·즉시 보고 / **C4** 총괄PM 하달
|
||||
- **C5** 정보의 정직성 / **C6** 데이터 보호 및 프로덕션 보호 (원본·프로덕션·복구 불가 고지 의무)
|
||||
- **C9** AI 에이전트 조직 원칙 — 완성도 우선·일정 개념 배제
|
||||
|
|
@ -59,19 +59,20 @@ PD님
|
|||
- **C28** 문서 수정 무승인 원칙 / **C29** 업무 자율 수행 체계 (조직 생존급)
|
||||
- **C30** git 동기화 프로젝트 작업 전 최신 상태 점검 / **C31** 응답 발신 직전 자기검증 의무 (헌법급)
|
||||
- **C32** 대화로그 기록 의무 (헌법급, 구 P22·P24 흡수) / **C33** 조직 업무 공유·기록 체계 일관성 보장 (헌법급, 구 P26·P27 흡수)
|
||||
- 🏆 **C34** Live 증분 동기화 체계 (헌법급·조직 핵심 자산, 구 P25 승격, worktree 경계 무관 중앙 Junction — 2026-04-18 조직 생존급 근원 해결)
|
||||
- 폐기·통합·강등·재활용 규칙 상세: [폐기 규칙 아카이브](공유/조직공지/폐기_규칙_아카이브.md)
|
||||
|
||||
### 프로젝트 규칙 요약 (활성 25개, 번호 구멍 허용)
|
||||
### 프로젝트 규칙 요약 (활성 24개, 번호 구멍 허용)
|
||||
- **P1~P11** 기본 운영 (호칭·현황·이슈·토큰·의사결정·커뮤니케이션·위임·모델·트래킹·노하우·자율효율화)
|
||||
- **P13** 코드·의존성·환경 변경 관리 (구 P15 통합) / **P14** QA 게이트 / **P16** 산출물 추적성
|
||||
- **P17** 수상한잡화점 전용 ★ 조건 배타 배치 7종
|
||||
- **P18** 설계 문서화 의무 / **P19** PD님 직접 지시 트래킹 및 공유 의무
|
||||
- **P21** 세션 갱신 프로토콜 / **P21-2** 세션 공유 프로토콜
|
||||
- **P23** 기획 결정 재량 범위
|
||||
- 🏆 **P25** Live 증분 동기화 체계 (조직 핵심 자산) / **P28** 조직 업무 현황 보고 표준 포맷
|
||||
- **P28** 조직 업무 현황 보고 표준 포맷 (P25는 C34로 헌법급 승격 — 2026-04-18)
|
||||
- **P29** 코어 코드 프레임워크 프로젝트 규칙 (조직 자산 계승·차기 프로젝트 활용·현 프로젝트 인사이트)
|
||||
- **P30** 재미 우선 원칙 (기획팀 전용) / **P31** PD님 경어 사용 원칙
|
||||
- 폐기·강등·통합된 구 P 번호(P12·P15·P20·P22·P24·P26·P27): [폐기 규칙 아카이브](공유/조직공지/폐기_규칙_아카이브.md) 참조
|
||||
- 폐기·강등·통합·승격된 구 P 번호(P12·P15·P20·P22·P24·P25·P26·P27): [폐기 규칙 아카이브](공유/조직공지/폐기_규칙_아카이브.md) 참조
|
||||
|
||||
## 컨벤션
|
||||
|
||||
|
|
|
|||
|
|
@ -25,3 +25,5 @@
|
|||
- [dev-auditor 감사 범위 형식주의 오판](feedback_dev_auditor_scope_shortcut.md) — 2026-04-18 발견. SKILL.md 문언만 보고 설계 맥락 미확인. 감사 착수 전 관련 설계 문서 선행 Read 의무 추가 안건
|
||||
- [세션 대화로그 누락 — "기록 범위 자의적 축소" 패턴 (🚨 PM 과도 보수 4회차 변종)](feedback_session_log_coverage_gap.md) — 2026-04-18 발견. PM이 수상한잡화점 Agent 위임 우회 + 코어프레임워크 "false positive" 자가 회피로 대화로그 누락. **PM 역할 재검토 자진 상정 대상**. P24 기록 대상 기준·C31-D 체크·SessionEnd hook 강화로 재발 방지
|
||||
- [폐기 조항 본문 잔존 — "번호 체계 연속성" 관성 (🚨 PM 과도 보수 5회차 변종)](feedback_deprecated_section_retention.md) — 2026-04-18 발견. C7·C8·C12·C15·P20·P24·P27 폐기 표기를 본문에 유지. PD님 "이미 삭제된 내용을 최신 문서에 담지 말라" 명시 지적. **C14-5-확장 코어룰 신설**로 재발 방지. **PM 역할 재검토 자진 상정 강도 상향**
|
||||
- [worktree 격리로 인한 조직 실시간 동기화 실패 🚨 조직 생존급](feedback_worktree_isolation.md) — 2026-04-18 PD님 직접 선언 "해결 안 되면 조직 유지 불가". P25→C34 승격 + 중앙 Junction (C16-1 memory junction 패턴 재사용)으로 근원 해결. "같은 PC=같은 파일시스템" 직관은 worktree에서 성립하지 않음
|
||||
- [Agent 절대 경로 하드코딩 금지 — worktree 경계 보호](feedback_agent_path_boundary.md) — 2026-04-18 worktree 격리 2차 사건. Agent가 `E:\NerdNavisAi\...`로 Write 호출 → 레포 루트 유출. `git stash push/pop` 이관 복구 + Agent 호출 프롬프트 경로 규약 명시 의무
|
||||
|
|
|
|||
|
|
@ -0,0 +1,39 @@
|
|||
---
|
||||
name: Agent 호출 시 절대 경로 하드코딩 금지 — worktree 경계 보호
|
||||
description: 2026-04-18 worktree 격리 2차 사건. Agent가 절대 경로로 Write 호출 시 레포 루트로 산출물 유출. stash 이관 복구 절차 + 재발 방지 체크리스트
|
||||
type: feedback
|
||||
originSessionId: 0c3fc143-5c2a-4165-afb1-7becf72eaa0a
|
||||
---
|
||||
# Agent 호출 시 절대 경로 하드코딩 금지 — worktree 경계 보호
|
||||
|
||||
## 실증 (2026-04-18, worktree 격리 2차 사건)
|
||||
PM(tender-liskov worktree)이 개발팀장 Agent를 호출. Agent가 산출물 경로에 **절대 경로 `E:\NerdNavisAi\공유\소통\개발팀→PM\...`**를 사용하여 Write. 이로 인해 파일이 **레포 루트(main 브랜치 체크아웃)에 기록**되고 본 워크트리는 해당 파일을 볼 수 없음.
|
||||
|
||||
Agent 응답에 "476줄 산출물 작성 완료"라 보고되었으나 PM 세션의 `공유/소통/개발팀→PM/`에는 없었음. `git -C "E:/NerdNavisAi" status` 확인으로 레포 루트에 uncommitted 변경 3건(PD 지시 로그·대화로그·보고서) 발견.
|
||||
|
||||
## 근본 원인
|
||||
- Agent는 실행 환경의 `cwd`를 계승하나, Write 도구에 **절대 경로**를 전달하면 cwd와 무관하게 해당 경로에 기록
|
||||
- `E:\NerdNavisAi`는 레포 루트(main 브랜치 체크아웃) — worktree가 아닌 독립 작업 디렉토리
|
||||
- Agent가 worktree 경계를 인지하지 못하고 "레포 절대 경로 = 안전한 표준"으로 처리
|
||||
- PM은 Agent 응답만 보고 산출물 실체 위치 미확인 → worktree 경계 이탈을 검증 없이 신뢰 (C23 관점에서도 문제)
|
||||
|
||||
## 복구 방법 (2026-04-18 실증)
|
||||
1. `git -C <레포루트> stash push -u -- <영향 경로>` — Agent가 쓴 변경분을 stash로 수집
|
||||
2. 본 worktree에서 `git stash pop` — 동일 base라면 conflict 없이 적용
|
||||
3. `git -C <레포루트> status` 재확인 (clean 여부)
|
||||
4. 본 worktree에서 변경분 검증 후 commit
|
||||
|
||||
## 재발 방지 의무 (세션 리더)
|
||||
1. **Agent 호출 프롬프트에 경로 규약 명시**: "산출물 경로는 `$(git rev-parse --show-toplevel)` 기준 또는 상대 경로로 작성. 절대 경로 `E:\NerdNavisAi\...` 등 하드코딩 금지."
|
||||
2. **Agent 응답 수령 직후 2축 검증**: 본 worktree `git status` + `git -C <레포루트> status` 병행 확인
|
||||
3. **경계 이탈 발견 시**: stash 이관 복구 즉시 수행, PD님께 자진 보고 (C3·C5)
|
||||
4. **감사 확장**: pm-auditor·dev-auditor 체크리스트에 "Agent 경계 이탈 확인" 항목 추가 안건
|
||||
|
||||
## 연관
|
||||
- **C34-11** (Agent 경계 보호 조항)
|
||||
- **C23** (허위 보고·역할 연기 금지)
|
||||
- **feedback_worktree_isolation.md** (1차 사건)
|
||||
- **조직공지**: `2026-04-18_C34_신설_worktree_격리_근원해결.md`
|
||||
|
||||
## 교훈
|
||||
**Agent 위임은 PM 책임 해제가 아니다.** Agent 응답의 "완료" 선언을 실체 파일로 검증하지 않으면 worktree 격리 같은 숨겨진 경계로 인한 누락을 놓칠 수 있다. 특히 "절대 경로의 안전성" 직관은 worktree 체제에서 무력화됨 — Agent가 의도치 않게 다른 worktree/레포 루트에 쓸 수 있음.
|
||||
|
|
@ -0,0 +1,39 @@
|
|||
---
|
||||
name: worktree 격리로 인한 조직 실시간 동기화 체계 실패 — 재발 방지
|
||||
description: 2026-04-18 PD님 조직 생존급 선언. P25→C34 승격 + 중앙 Junction 근원 해결. worktree 경계는 실시간 공유 체계의 숨겨진 경계이므로 새 체계 설계 시 최우선 검토 대상
|
||||
type: feedback
|
||||
originSessionId: 0c3fc143-5c2a-4165-afb1-7becf72eaa0a
|
||||
---
|
||||
# worktree 격리로 인한 조직 실시간 동기화 체계 실패
|
||||
|
||||
## 실증 (2026-04-18)
|
||||
세션 A(`tender-liskov-844a72` worktree)와 세션 B(`nifty-wing-4752bd` worktree)에서 P25 Live 증분 동기화 테스트 수행. 세션 B가 `.live/ping.md`에 PING 마커 작성 후 세션 A에서 hook 주입 확인 → **미수신**. 원인은 git worktree가 각 worktree에 독립 파일시스템 디렉토리를 부여하므로 `.live/`가 물리적으로 분리됨.
|
||||
|
||||
## 왜 중요한가 (조직 생존급)
|
||||
PD님 직접 선언: **"이 문제가 해결되지 않으면 앞으로 우리 조직은 유지될 수 없어."**
|
||||
헌법 제1원칙 ⑤ "세션·PC 연속성 보장"의 근본 위협. P25(조직 핵심 자산 선언)가 특정 조건(같은 worktree)에서만 작동한다는 사실이 조직 기반 전제를 훼손.
|
||||
|
||||
## 근본 원인
|
||||
`live_inject.sh` hook이 `git rev-parse --show-toplevel`로 얻은 경로의 `.live/`를 스캔하는데, 이 명령은 **worktree별로 다른 경로를 반환**함. 따라서 worktree A와 B의 `.live/`가 서로 다른 디렉토리이며 hook이 상호 주입 불가.
|
||||
|
||||
## 해결 (C34 신설 + 중앙 Junction)
|
||||
1. 실 저장 경로를 `$HOME/.claude/nerdnavis-live/`로 중앙화 (PC 로컬 단일)
|
||||
2. 각 worktree의 `.live/`를 중앙 디렉토리로 Junction(Windows `mklink /J`) / Symlink(Unix `ln -s`) 연결
|
||||
3. `scripts/live_junction_ensure.sh`가 SessionStart hook 체인에서 보장 (git fetch 직후 최우선 삽입)
|
||||
4. `setup_*` 스크립트 3.5 섹션에서 자동 설치
|
||||
5. Sentinel 파일 `.junction-marker`로 OS-agnostic 판정
|
||||
|
||||
## 재발 방지 체크 (세션 리더 의무)
|
||||
- 신 PC·신 worktree 첫 세션 시 `verify_setup.ps1`의 2.5 "Live 중앙 저장소 실체·reparse·marker 경유 읽기" 3축 통과 확인
|
||||
- `.live/`가 실체 디렉토리로 남아있으면 `setup_windows.ps1` 재실행
|
||||
- 조직 전원 세션 1회 재시작 필수 안내 (C1 사전 고지)
|
||||
- **새 조직 공유 체계 설계 시 worktree 경계 조건을 첫 검토 항목에 포함** (본 사건 재발 방지)
|
||||
|
||||
## 연관
|
||||
- **C34** (헌법급 본 체계 — P25 승격)
|
||||
- **C16-1** (`.live/` junction 자동 연결 편입)
|
||||
- **feedback_agent_path_boundary.md** (Agent 경계 넘기 2차 사건)
|
||||
- **조직공지**: `2026-04-18_C34_신설_worktree_격리_근원해결.md`
|
||||
|
||||
## 교훈
|
||||
**worktree 기능은 편리하나 조직 공유 체계의 숨겨진 경계를 만든다.** "같은 PC = 같은 파일시스템"이라는 직관은 worktree 앞에서 성립하지 않음. 앞으로 공유 체계 설계 시 "실 저장 = 중앙 1곳, 접근 = junction/symlink"을 기본 패턴으로 채택 (C16-1 memory junction과 동일 원칙).
|
||||
|
|
@ -0,0 +1,68 @@
|
|||
#!/bin/bash
|
||||
# SessionStart hook — .live/ 디렉토리를 $HOME/.claude/nerdnavis-live/로 junction 보장
|
||||
# worktree 격리를 제거하여 모든 세션이 동일한 실제 .live/ 디렉토리를 공유한다.
|
||||
# 2026-04-18 신설 — C34 헌법급 Live 증분 동기화 체계의 근원 해결 장치
|
||||
# 관련 규칙: C34 · C16-1 PC 독립 셋업 · 헌법 제1원칙 ⑤ 세션·PC 연속성
|
||||
|
||||
REPO_ROOT=$(git rev-parse --show-toplevel 2>/dev/null)
|
||||
[ -z "$REPO_ROOT" ] && exit 0
|
||||
|
||||
CENTRAL_LIVE="$HOME/.claude/nerdnavis-live"
|
||||
LOCAL_LIVE="$REPO_ROOT/.live"
|
||||
MARKER_NAME=".junction-marker"
|
||||
|
||||
# 1. 중앙 저장소 + marker 보장
|
||||
mkdir -p "$CENTRAL_LIVE" 2>/dev/null
|
||||
if [ ! -f "$CENTRAL_LIVE/$MARKER_NAME" ]; then
|
||||
echo "nerdnavis-live central junction target (C34, 2026-04-18)" > "$CENTRAL_LIVE/$MARKER_NAME" 2>/dev/null
|
||||
fi
|
||||
|
||||
# 2. 이미 올바르게 junction 연결되어 있으면 조기 종료 (sentinel 경유 판정)
|
||||
if [ -f "$LOCAL_LIVE/$MARKER_NAME" ]; then
|
||||
exit 0
|
||||
fi
|
||||
|
||||
# 3. 로컬 .live/ 가 실체 디렉토리인 경우 → 백업 후 junction 전환 (C6-1 원본 보호)
|
||||
if [ -d "$LOCAL_LIVE" ] && [ ! -L "$LOCAL_LIVE" ]; then
|
||||
BAK="$LOCAL_LIVE.bak-$(date +%Y%m%d%H%M%S)"
|
||||
# 기존 파일 중앙으로 복사 (기존 중앙 파일 덮어쓰기 안 함)
|
||||
for f in "$LOCAL_LIVE"/*.md "$LOCAL_LIVE"/*.json; do
|
||||
[ -f "$f" ] || continue
|
||||
BASENAME=$(basename "$f")
|
||||
[ ! -f "$CENTRAL_LIVE/$BASENAME" ] && cp "$f" "$CENTRAL_LIVE/$BASENAME" 2>/dev/null
|
||||
done
|
||||
mv "$LOCAL_LIVE" "$BAK" 2>/dev/null || { echo "⚠️ [Live Junction] 기존 .live/ 백업 실패 — Degraded 모드" >&2; exit 0; }
|
||||
echo "📦 [Live Junction] 기존 .live/ 백업: $BAK"
|
||||
fi
|
||||
|
||||
# 4. Junction 생성 (OS별·3회 재시도)
|
||||
ATTEMPT=0
|
||||
MAX_ATTEMPTS=3
|
||||
while [ "$ATTEMPT" -lt "$MAX_ATTEMPTS" ]; do
|
||||
ATTEMPT=$((ATTEMPT + 1))
|
||||
|
||||
if command -v powershell >/dev/null 2>&1; then
|
||||
# Windows — PowerShell New-Item Junction (git-bash의 cmd //c mklink 대비 신뢰성 우위, 2026-04-18 실증)
|
||||
CENTRAL_WIN=$(cygpath -w "$CENTRAL_LIVE" 2>/dev/null || echo "$CENTRAL_LIVE")
|
||||
LOCAL_WIN=$(cygpath -w "$LOCAL_LIVE" 2>/dev/null || echo "$LOCAL_LIVE")
|
||||
powershell -NoProfile -ExecutionPolicy Bypass -Command "New-Item -ItemType Junction -Path '$LOCAL_WIN' -Target '$CENTRAL_WIN' -Force | Out-Null" >/dev/null 2>&1
|
||||
else
|
||||
# Unix — symlink
|
||||
ln -s "$CENTRAL_LIVE" "$LOCAL_LIVE" 2>/dev/null
|
||||
fi
|
||||
|
||||
if [ -f "$LOCAL_LIVE/$MARKER_NAME" ]; then
|
||||
[ "$ATTEMPT" -eq 1 ] && echo "✅ [Live Junction] $LOCAL_LIVE → $CENTRAL_LIVE"
|
||||
[ "$ATTEMPT" -gt 1 ] && echo "✅ [Live Junction] 연결 성공 (재시도 $ATTEMPT회)"
|
||||
exit 0
|
||||
fi
|
||||
|
||||
sleep 1
|
||||
done
|
||||
|
||||
# 5. 실패 — Degraded 모드 (작업 차단 안 함, C34 기본 원칙)
|
||||
mkdir -p "$LOCAL_LIVE" 2>/dev/null
|
||||
echo "⚠️ [Live Junction] 생성 실패 — Degraded 모드 (로컬 .live/ 사용). worktree 간 동기화 불가" >&2
|
||||
echo "⚠️ [Live Junction] 해결: 관리자 권한으로 setup 스크립트 재실행 또는 수동 mklink/ln -s 필요" >&2
|
||||
|
||||
exit 0
|
||||
|
|
@ -120,6 +120,29 @@ if (Test-Path $claudeMemoryBase) {
|
|||
Warn "Claude 메모리 베이스" "$claudeMemoryBase 미존재. Claude Code 첫 실행 전일 가능성"
|
||||
}
|
||||
|
||||
# 2.5. Live 증분 동기화 Junction 3축 검증 (C34, 2026-04-18 신설)
|
||||
# 축 1: 중앙 저장소 실체 / 축 2: reparse point / 축 3: marker 경유 읽기
|
||||
$centralLive = Join-Path $env:USERPROFILE ".claude\nerdnavis-live"
|
||||
$localLive = Join-Path $repoRoot ".live"
|
||||
$markerName = ".junction-marker"
|
||||
|
||||
Check "Live 중앙 저장소 실체 존재" (Test-Path $centralLive) $centralLive
|
||||
|
||||
if (Test-Path $localLive) {
|
||||
$liveItem = Get-Item $localLive -Force
|
||||
$isReparse = ($liveItem.Attributes -band [IO.FileAttributes]::ReparsePoint) -ne 0
|
||||
if ($isReparse) {
|
||||
Check "Live .live/ Junction reparse 실체" $true "reparse point OK"
|
||||
# 축 3: marker 경유 읽기 (A→B worktree 동기화 가능성 실증)
|
||||
$markerPath = Join-Path $localLive $markerName
|
||||
Check "Live Junction marker 경유 읽기" (Test-Path $markerPath) $markerPath
|
||||
} else {
|
||||
Check "Live .live/ Junction reparse 실체" $false "실체 디렉토리 (setup 재실행 필요)"
|
||||
}
|
||||
} else {
|
||||
Warn "Live .live/ 존재" "$localLive 미존재 (세션 1회 시작 시 hook 자동 생성)"
|
||||
}
|
||||
|
||||
# 3. 경로 추상화 적용 여부 (CLAUDE.md 계열에 구 하드코딩 경로 잔존 확인)
|
||||
$hardcodePatterns = @("C:/Users/PC/Documents", "D:/NerdNavis/FilGoodBandits", "D:/NerdNavis/NerdNavis.Framework")
|
||||
$scanTargets = @(
|
||||
|
|
|
|||
|
|
@ -59,4 +59,33 @@ if [ -d "$CLAUDE_BASE" ]; then
|
|||
done
|
||||
fi
|
||||
|
||||
# 3.5. Live 증분 동기화 중앙 저장소 + Symlink (C34, 2026-04-18 PD님 직접 지시)
|
||||
# worktree 격리로 인한 .live/ 물리 분리 해결을 위해
|
||||
# $HOME/.claude/nerdnavis-live/ 중앙 디렉토리로 symlink 연결한다.
|
||||
CENTRAL_LIVE="$HOME/.claude/nerdnavis-live"
|
||||
LOCAL_LIVE="$NERDNAVIS_ROOT/.live"
|
||||
MARKER_NAME=".junction-marker"
|
||||
|
||||
mkdir -p "$CENTRAL_LIVE"
|
||||
if [ ! -f "$CENTRAL_LIVE/$MARKER_NAME" ]; then
|
||||
echo "nerdnavis-live central junction target (C34, 2026-04-18)" > "$CENTRAL_LIVE/$MARKER_NAME"
|
||||
fi
|
||||
|
||||
if [ -L "$LOCAL_LIVE" ]; then
|
||||
echo "Live symlink 이미 존재. 유지: $LOCAL_LIVE"
|
||||
elif [ -d "$LOCAL_LIVE" ]; then
|
||||
BAK="$LOCAL_LIVE.bak-$(date +%s)"
|
||||
for f in "$LOCAL_LIVE"/*.md "$LOCAL_LIVE"/*.json; do
|
||||
[ -f "$f" ] || continue
|
||||
DST="$CENTRAL_LIVE/$(basename "$f")"
|
||||
[ ! -f "$DST" ] && cp "$f" "$DST"
|
||||
done
|
||||
mv "$LOCAL_LIVE" "$BAK"
|
||||
ln -s "$CENTRAL_LIVE" "$LOCAL_LIVE"
|
||||
echo "Live Symlink 생성: $LOCAL_LIVE -> $CENTRAL_LIVE (백업: $BAK)"
|
||||
else
|
||||
ln -s "$CENTRAL_LIVE" "$LOCAL_LIVE"
|
||||
echo "Live Symlink 생성: $LOCAL_LIVE -> $CENTRAL_LIVE"
|
||||
fi
|
||||
|
||||
echo "셋업 완료."
|
||||
|
|
|
|||
|
|
@ -110,6 +110,48 @@ if ($hashDirs.Count -eq 0) {
|
|||
Write-Warning "Claude 프로젝트 해시 폴더를 찾지 못했습니다. 수동 연결 필요."
|
||||
}
|
||||
|
||||
# 3.5. Live 증분 동기화 중앙 저장소 + Junction (C34, 2026-04-18 PD님 직접 지시)
|
||||
# worktree 격리로 인한 .live/ 물리 분리 문제를 해결하기 위해
|
||||
# $HOME\.claude\nerdnavis-live\ 중앙 디렉토리로 junction 연결한다.
|
||||
# 헌법 제1원칙 ⑤ 세션·PC 연속성의 근원 보장 장치.
|
||||
$centralLive = Join-Path $env:USERPROFILE ".claude\nerdnavis-live"
|
||||
$localLive = Join-Path $NerdNavisRoot ".live"
|
||||
$markerName = ".junction-marker"
|
||||
$markerText = "nerdnavis-live central junction target (C34, 2026-04-18)"
|
||||
|
||||
if (-not (Test-Path $centralLive)) {
|
||||
New-Item -ItemType Directory -Path $centralLive -Force | Out-Null
|
||||
Write-Host "Live 중앙 저장소 생성: $centralLive"
|
||||
}
|
||||
|
||||
$centralMarker = Join-Path $centralLive $markerName
|
||||
if (-not (Test-Path $centralMarker)) {
|
||||
[System.IO.File]::WriteAllText($centralMarker, $markerText, [System.Text.UTF8Encoding]::new($false))
|
||||
}
|
||||
|
||||
if (Test-Path $localLive) {
|
||||
$liveItem = Get-Item $localLive -Force
|
||||
$isReparse = ($liveItem.Attributes -band [IO.FileAttributes]::ReparsePoint) -ne 0
|
||||
if (-not $isReparse) {
|
||||
# 실체 디렉토리 — 백업 후 junction 전환 (C6-1 원본 보호)
|
||||
$bak = "$localLive.bak-$(Get-Date -Format yyyyMMddHHmmss)"
|
||||
# 기존 파일 중앙으로 복사 (기존 중앙 파일 덮어쓰기 안 함)
|
||||
Get-ChildItem $localLive -File -ErrorAction SilentlyContinue | ForEach-Object {
|
||||
$dst = Join-Path $centralLive $_.Name
|
||||
if (-not (Test-Path $dst)) { Copy-Item $_.FullName $dst -Force }
|
||||
}
|
||||
Rename-Item $localLive $bak
|
||||
Write-Host "기존 .live/ 백업: $bak"
|
||||
New-Item -ItemType Junction -Path $localLive -Target $centralLive -Force | Out-Null
|
||||
Write-Host "Live Junction 생성: $localLive -> $centralLive"
|
||||
} else {
|
||||
Write-Host "Live Junction 이미 존재. 유지: $localLive"
|
||||
}
|
||||
} else {
|
||||
New-Item -ItemType Junction -Path $localLive -Target $centralLive -Force | Out-Null
|
||||
Write-Host "Live Junction 생성: $localLive -> $centralLive"
|
||||
}
|
||||
|
||||
# 4. .claude/settings.json 부서 동기화 (루트 SOT → 개발팀/기획팀 복제)
|
||||
# Claude Code는 .claude/ 계층 auto-merge를 지원하지 않으므로 자식 디렉토리에서 세션 시작 시
|
||||
# 루트 settings.json을 인식하지 못함. 이를 우회하기 위해 루트 settings.json을 부서 디렉토리로 복제.
|
||||
|
|
|
|||
|
|
@ -33,6 +33,7 @@ C3·C13 위반에 해당. **즉시 자진 보고 후 소급 등록**.
|
|||
|---|------|----------|----------|-----------|----------|----------|
|
||||
| 2 | 2026-04-14 | 서버 Critical 보안 3건 보류 | 보류 | `프로젝트/수상한잡화점/개발/05_서버연동_현황_v1.md` | 서버 파트 정비 미완료 (PD님 지시) | 서버팀 가동 시점에 블로커급 재개. 담당: 서버팀장. 재개 트리거: 서버 파트 정비 완료 통보 |
|
||||
| 38 | 2026-04-17 | (#28 후속 분리) Phase 3 재개 로드맵 결정 — Unity MCP 단일축 기반 밸런스 작업 재개 범위·선후관계·검증 축 확정 | 보류 | (로드맵 확정 시 기입) | PD님 별도 논의 예정 | 재개 트리거: PD님 Phase 3 재개 지시 수령. 기획팀 #3 동시 재개 |
|
||||
| 39 | 2026-04-18 | (PD님 조직 생존급 선언 · PM 경유) **C34 Live 증분 동기화 체계 신설 — worktree 격리 근원 해결 (P25 헌법급 승격)**. PD님 직접 표현: "이 문제가 해결되지 않으면 앞으로 우리 조직은 유지될 수 없어" · "철저히 검토해서 관련 문서에 일괄 반영하고 재발되지 않도록 가능한 모든 수단을 써서 개선해" | **완료** | (10종 일괄) SKILL.md C34 신설 + P25 본문 삭제 + C16-1 보강 + C31-1-E 갱신 · CLAUDE.md 요약 6건 갱신 · `scripts/live_junction_ensure.sh` 신규 · `setup/setup_windows.ps1`·`setup/setup_macos.sh`·`scripts/verify_setup.ps1` 확장 · `.claude/settings.json`·`.gitignore` 갱신 · `공유/조직공지/2026-04-18_C34_신설_worktree_격리_근원해결.md` 신설 · `공유/조직공지/폐기_규칙_아카이브.md` §13 승격 기록 · `공유/소통/개발팀→PM/2026-04-18_worktree_격리_근원해결_실무검토.md` 실무 검토서 · `memory/org/feedback_worktree_isolation.md`·`feedback_agent_path_boundary.md` 신설 + MEMORY.md 인덱스 · `공유/대화로그/조직운영/2026-04-18.md` 2엔트리 (개발팀장 + PM 집행) | - | 조직 전원 세션 1회 재시작 안내 (C1 사전 고지) + 1주일 관찰 후 `.live.bak-*` 정리 공지 |
|
||||
|
||||
> **2026-04-15 오후 추가 갱신 (C4·C13 위반 자진 정정 2차)**:
|
||||
> #5번 신규 등재. PD님 3대 지시(A/B/C) 및 #1 산출물 경로에 Framework Tier 1 구현체(`D:/NerdNavis/NerdNavis.Framework/`)를 소급 등록. **B 착수 시점 및 Git 동기화 병렬 지시(#4) 착수 시점에 총괄PM 공유를 누락**한 건을 PD님이 직접 지적하여 즉시 정정. 근본 원인: "C 항목 진행 전 지시 대기" 지시를 본인이 **PM 공유 전체 보류**로 잘못 확대 해석. C4(총괄PM 하달)·C13(4단계 가시화)의 "작업 착수 시점=상시 공유 의무" 원칙을 거스른 것. 재발 방지 관례: **신규 트랙 착수 즉시 pm-general 공유 → TodoWrite 항목 생성** (총괄PM 채택 권고). 자체 경위는 `공유/일일보고/2026-04-15_개발팀.md` 오후 섹션 참조.
|
||||
|
|
|
|||
|
|
@ -610,3 +610,99 @@
|
|||
- **(안 나)** PM 역할 재검토 구체 절차 즉시 착수
|
||||
- **(안 다)** 현행 유지 + 6회차 발생 시 처분
|
||||
- **상태**: 완료. 세션 공유 대기
|
||||
|
||||
<!-- #PD님_직접지시 #조직생존급 #개발팀장 #worktree격리 #P25 -->
|
||||
## [개발팀장] worktree 격리 근원 해결안 실무 검토 — 중앙 `.live/` Junction 체계
|
||||
|
||||
- **요지**: PD님 조직 생존급 선언 "이 문제가 해결되지 않으면 앞으로 우리 조직은 유지될 수 없어" · "가능한 모든 수단을 써서 개선해" 수령. Claude Code 자동 생성 worktree가 `.live/`를 물리 격리하여 P25 Live 증분 동기화 체계 무력화. PM 1차 설계안(Junction 기반 중앙 `.live/`) 실무 검토 완결
|
||||
- **결정**: **PM 1차 설계안 원칙 승인 권고 + 7개 엣지 케이스 보완 추가**
|
||||
- 실 저장: `$HOME/.claude/nerdnavis-live/` (C16-1 memory junction 패턴 동형 재사용)
|
||||
- Hook 로직 **무변경** (`REPO_ROOT/.live` 경로 그대로, junction 투명 경유)
|
||||
- Setup 스크립트 확장: `setup_windows.ps1`·`setup_macos.sh`에 junction 설치 + 마이그레이션 로직 약 50~60줄
|
||||
- 신규 `scripts/live_junction_ensure.sh` — SessionStart hook이 Claude Code 자동 생성 worktree에서도 첫 프롬프트 전 junction 설치 보장
|
||||
- `verify_setup.ps1` 3축 검증 확장 — reparse point 실체 + A→B worktree 실제 쓰기/읽기 테스트
|
||||
- Junction 생성 실패 시 **degraded 운영 + 조직공지 자동 발행** (작업 차단 반대)
|
||||
- **근거** (실측 tool_use):
|
||||
1. `git worktree list` = 3경로(main·nifty-wing·tender-liskov) 모두 동일 HEAD
|
||||
2. nifty-wing `.live/ping.md` 존재, 본 worktree `.live/`에는 `README.md`만 존재 — 100% 격리 확인
|
||||
3. `live_inject.sh` L6: `REPO_ROOT=$(git rev-parse --show-toplevel)` — worktree 내부에서 각 worktree 루트 반환이 원인
|
||||
4. `~/.claude/.nerdnavis_bus/`·`~/.claude/.nerdnavis_throttle/`·`memory/org/` junction은 **이미 HOME 기반 중앙화** → `.live/`만 비대칭 문제
|
||||
5. Windows `mklink /J`는 관리자·개발자 모드 불요 — setup_windows.ps1 99·104행이 이미 동일 방식 memory junction 생성 중 (조직 검증 완료)
|
||||
- **영향**:
|
||||
- **긍정**: P25 🏆 조직 핵심 자산 완전 복원 + 헌법 제1원칙 ⑤ 보호 + C16-1 패턴 일관성 회복 + 차기 프로젝트 재활용 가능 (P29 계승)
|
||||
- **운영 변경**: 조직 전원 세션 재시작 + setup 재실행 1회 필요 (C1 사전 안내 규정 준수)
|
||||
- **역호환**: junction 미설치 worktree는 기존대로 (격리) 동작 — 점진 전환·롤백 가능
|
||||
- **기각안**:
|
||||
1. **`.live/`를 git-tracked로 전환** — 세션별 commit 폭증·merge conflict 상시 발생. P25의 "네트워크 비용 0" 본질 파괴. 기각
|
||||
2. **Hook의 `REPO_ROOT` 대신 절대 경로 하드코딩** — C16 PC 독립성 훼손. paths.local.json 원칙 역행. 기각
|
||||
3. **Worktree 기능 사용 중단 제안** — Claude Code 내부 동작이라 조직이 제어 불가. 기각
|
||||
4. **SessionStart junction 검증 실패 시 작업 차단** — 조직 생존 해결이 목적인 변경이 또 다른 생산성 저하 유발 역설. degraded + 자진 보고가 우월. 기각
|
||||
5. **`.live/README.md`를 gitignore로 전환** — 현재 tracked 상태가 조직 자산 문서 역할. 검증 후 문제 없음 확인 시 유지 (§7.3 실증). 기각
|
||||
6. **중앙 저장소를 `$NERDNAVIS_ROOT/.nerdnavis-live/`(레포 루트 하위)에 배치** — worktree 외부긴 하나 레포 공유 시 다른 PC에 노출되는 경로 → HOME 원칙 포기. 기각
|
||||
7. **파일 단위 hard link (`/H`) 대신** — `.live/`는 디렉토리 대상이므로 기술 불일치. 기각
|
||||
- **산출물**:
|
||||
1. `공유/소통/개발팀→PM/2026-04-18_worktree_격리_근원해결_실무검토.md` — 정규 실무 검토 보고서 (11개 섹션, OS 상세·엣지 케이스 7종·테스트 시나리오 10종 포함)
|
||||
2. 본 대화로그 엔트리 (append)
|
||||
3. `공유/PD_지시_트래킹/개발팀_PD_지시_로그.md` #39 신규 등록 (진행중)
|
||||
- **검증**:
|
||||
- C23 정직성: 모든 주장 실제 tool_use 결과 기반. 미확인 사항은 §5.2·§7.3에 명시
|
||||
- C31 자기검증 10항 통과 (§10)
|
||||
- C11 개발 관점 원칙 3종(자원 효율성·코드 구조 직관성·범용성) 충족 확인 (§8)
|
||||
- 헌법 제1원칙 5개 중 ②·③·⑤ 직접 기여 (§9)
|
||||
- **PM 안건**:
|
||||
1. PM 검토 → **C20 재량 범위 내 판단 시 즉시 집행** (코어룰 신설 아님, 운영 스크립트 + 조직공지). 집행 시 조직 전원 세션 재시작 안내 필수
|
||||
2. PD님 최종 승인 필요 판단 시 — 본 검토서를 첨부해 간결 안건화
|
||||
3. 집행 완료 후 PD 지시 로그 #39 → `완료` 갱신 (C27)
|
||||
- **상태**: 실무 검토 완료. PM 수령 대기
|
||||
|
||||
<!-- #PD지시 #PM #완료 #C34신설 #조직생존급 #worktree격리_근원해결 -->
|
||||
## [PM 집행 완료] C34 Live 증분 동기화 체계 신설 + worktree 격리 근원 해결 (10종 일괄)
|
||||
|
||||
- **요지**: 개발팀장 실무 검토 수령 후 PM이 **10종 일괄 집행 완료**. C34 헌법급 신설(P25 승격 + 중앙 Junction + Agent 경계 보호) + 스크립트 5종 + 설정 2종 + 규칙 3종 + 아카이브·공지·메모리 6종.
|
||||
- **이유 (PD님 조직 생존급 선언)**: "이 문제가 해결되지 않으면 앞으로 우리 조직은 유지될 수 없어" · "철저히 검토해서 관련 문서에 일괄 반영하고 재발되지 않도록 가능한 모든 수단을 써서 개선해". 헌법 제1원칙 ⑤(세션·PC 연속성) 근본 위협 판정.
|
||||
- **집행 10종**:
|
||||
1. **C34 신설** — `SKILL.md` 말미에 14개 하위 조항 (C34-1 개요 · C34-2 경계 · C34-3 중앙 저장소 · C34-4 대상 · C34-5 절차 · C34-6 증분 · C34-7 Agent 경로 규약 · C34-8 Write 권한 · C34-9 세션 공유 · C34-10 C14 · C34-11 Agent 경계 보호 · C34-12 Degraded · C34-13 연관 · C34-14 격상 경위)
|
||||
2. **P25 본문 완전 삭제** — C14-5-확장 규준. 번호 구멍 허용
|
||||
3. **C16-1 보강** — `.live/` junction 자동 연결 1줄 편입
|
||||
4. **C31-1-E 갱신** — "P25" → "C34" 표기 갱신
|
||||
5. **`scripts/live_junction_ensure.sh`** 신규 (SessionStart hook 최우선 삽입, 68줄, sentinel 판정 + 3회 재시도 + Degraded fallback)
|
||||
6. **`setup_windows.ps1` 3.5 섹션** 추가 (Junction + 마이그레이션)
|
||||
7. **`setup_macos.sh` 3.5 섹션** 추가 (Symlink + 마이그레이션)
|
||||
8. **`verify_setup.ps1` 2.5 섹션** 추가 (3축 검증)
|
||||
9. **`.claude/settings.json`** SessionStart hook 체인에 `live_junction_ensure.sh` 최우선 삽입 + **`.gitignore`** `.live/*` 제외 + README.md·백업 처리
|
||||
10. **CLAUDE.md** 핵심 규칙 요약 28→29 + C34 추가, 프로젝트 규칙 요약 25→24 + P25 제거, 번호 구멍 목록 확장. **SKILL.md 조직 핵심 자산 섹션** "P25"→"C34" 표기 갱신
|
||||
- **아카이브·공지·메모리 6종 병행**:
|
||||
- `공유/조직공지/2026-04-18_C34_신설_worktree_격리_근원해결.md` 신설
|
||||
- `공유/조직공지/폐기_규칙_아카이브.md` §13 P25→C34 승격 6필드 기록
|
||||
- `memory/org/feedback_worktree_isolation.md` 신설 (1차 사건)
|
||||
- `memory/org/feedback_agent_path_boundary.md` 신설 (2차 사건: Agent 경계 넘기)
|
||||
- `memory/org/MEMORY.md` 인덱스 2건 추가
|
||||
- 본 대화로그 엔트리
|
||||
- **추가 사건 자진 보고 — Agent 경계 넘기 2차 실증 (C3·C23)**:
|
||||
- 개발팀장 Agent가 산출물 경로에 **절대 경로 `E:\NerdNavisAi\공유\...`**를 사용하여 Write → **레포 루트(main 브랜치 체크아웃)에 uncommitted 변경 3건 유출**
|
||||
- `git -C "E:/NerdNavisAi" status` 확인으로 발견. 본 worktree와 물리적으로 다른 디렉토리
|
||||
- **복구**: `git -C "E:/NerdNavisAi" stash push -u -- 공유/` → 본 worktree `git stash pop`으로 conflict 없이 이관 (두 브랜치 모두 `5085c56` 기반이라 base 일치)
|
||||
- **재발 방지**: C34-11 조항 명문화 + `feedback_agent_path_boundary.md` + Agent 호출 프롬프트에 경로 규약 명시 의무
|
||||
- **근거 (실측 tool_use)**:
|
||||
1. `git worktree list`: main · nifty-wing · tender-liskov 3경로 분리 확인
|
||||
2. 세션 B `.live/ping.md` 작성 후 본 worktree hook 미주입 실증 (1차 사건)
|
||||
3. 개발팀장 Agent 산출물이 `공유/소통/개발팀→PM/`에 없음 → 레포 루트에 발견 (2차 사건)
|
||||
4. `stash push + pop` 후 본 worktree clean + 레포 루트 clean 양측 검증
|
||||
5. SKILL.md Grep으로 P25 섹션 위치·C31-1-E 본문·C16-1 본문 사전 확인 후 Edit
|
||||
- **영향**:
|
||||
- **긍정**: P25 🏆 조직 핵심 자산 완전 복원 + 헌법 제1원칙 ⑤ 보호 + C16-1 patterns 일관성 회복 + 차기 프로젝트 재활용 (P29 계승) + Agent 경계 보호 신규 조항으로 2차 사건 예방
|
||||
- **운영 변경**: **조직 전원 세션 1회 재시작 필수** (C1 사전 고지). SessionStart hook이 `live_junction_ensure.sh` 자동 실행 → junction 자동 설치
|
||||
- **역호환**: junction 미설치 worktree는 기존대로 degraded 동작 (작업 차단 없음)
|
||||
- **기각안**:
|
||||
1. **경로 정렬 단편 해결 (worktree 정렬·레포 루트 정렬·git push 경유)** — PD님 재제안 지시 수용 시 "단편적"으로 판정, 기각. 근원 해결로 전환.
|
||||
2. **Git-backed Live (commit 즉시 전파)** — "네트워크 비용 0" 파괴. 기각.
|
||||
3. **파일 감시 데몬·IPC** — 복잡도 과잉, hook 체계 통합 난이도. 기각.
|
||||
4. **worktree 기능 포기** — PD님 작업 자유도 제약, 조직 역량 후퇴. 기각.
|
||||
5. **C34 신설 시 P25 본문 `~~취소선~~` 잔존** — C14-5-확장 원칙 위반. 본문 완전 삭제.
|
||||
6. **Agent 경계 보호 메모리만 기록하고 C34 본문 미포함** — 헌법급 규칙에 포함하지 않으면 반복 가능. C34-11로 명문화 채택.
|
||||
- **PM 안건 2건 (PD님 승인 필요 아닌 보고 안건)**:
|
||||
1. **조직 전원 세션 1회 재시작 안내** (C1 사전 고지 의무) — junction 자동 설치를 위함. commit 완료 후 PD님께 공지 문안 전달
|
||||
2. **1주일 관찰 후 `.live.bak-*` 마이그레이션 백업 정리 공지** — 현 시점부터 1주 관찰, 이후 PM 재량 삭제
|
||||
- **C27 PD 지시 로그 갱신**: 개발팀 #39 "진행중" → 본 PM 집행으로 실무 완료분 반영해야 함 → 다음 단계(commit) 후 `완료` 갱신 예정
|
||||
- **상태**: PM 일괄 집행 완료. commit + verify_setup 실행 후 PD님 보고 예정 (push는 PD님 재량)
|
||||
|
||||
|
|
|
|||
|
|
@ -0,0 +1,476 @@
|
|||
---
|
||||
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에 명시.
|
||||
|
|
@ -0,0 +1,70 @@
|
|||
---
|
||||
type: 조직공지
|
||||
date: 2026-04-18
|
||||
kind: 헌법급 규칙 신설·조직 생존급 집행
|
||||
authority: PD님 직접 지시
|
||||
sot_boundary: 본 문서는 C34 신설·worktree 격리 근원 해결 1차 선언. 상세 본문은 SKILL.md C34, 경위는 폐기 아카이브 + 대화로그 참조
|
||||
---
|
||||
|
||||
# 2026-04-18 — C34 Live 증분 동기화 체계 신설 + worktree 격리 근원 해결
|
||||
|
||||
## 배경
|
||||
2026-04-18 세션 간 동기화 테스트에서 **git worktree 격리**로 P25 Live 증분 동기화 체계가 실패함을 실증. PD님 직접 선언:
|
||||
|
||||
> "이 문제가 해결되지 않으면 앞으로 우리 조직은 유지될 수 없어."
|
||||
> "철저히 검토해서 관련 된 문서에 일괄 반영하고 재발되지 않도록 가능한 모든 수단을 써서 개선해."
|
||||
|
||||
**헌법 제1원칙 ⑤**(세션·PC 연속성 보장)의 근본 위협 수준으로 격상. 개발팀장 실무 검토 후 근원 해결 집행.
|
||||
|
||||
## 집행 요약 (10종 일괄)
|
||||
|
||||
| # | 영역 | 변경 |
|
||||
|---|------|------|
|
||||
| 1 | 규칙 신설 | **C34 Live 증분 동기화 체계** 헌법급 신설 (P25 승격 + worktree 경계 해소 + Agent 경계 보호 포함) |
|
||||
| 2 | 규칙 삭제 | P25 본문 완전 삭제 (C14-5-확장 규준, 번호 구멍 허용) |
|
||||
| 3 | C16-1 보강 | `.live/` junction 자동 연결 명문화 |
|
||||
| 4 | C31-1-E 갱신 | "P25" 표기를 "C34"로 갱신 |
|
||||
| 5 | 근원 구현 | `scripts/live_junction_ensure.sh` 신규 (SessionStart hook 최우선 삽입) |
|
||||
| 6 | Setup 강화 | `setup_windows.ps1`·`setup_macos.sh`에 3.5 Live junction 섹션 |
|
||||
| 7 | Verify 강화 | `verify_setup.ps1`에 2.5 3축 검증 (중앙 실체·reparse·marker) |
|
||||
| 8 | Hook 체인 갱신 | `.claude/settings.json` SessionStart에 `live_junction_ensure.sh` 추가 |
|
||||
| 9 | `.gitignore` | `.live/*` 제외 + README.md 예외 + 마이그레이션 백업 제외 |
|
||||
| 10 | Agent 경계 보호 | C34-11 + `memory/org/feedback_agent_path_boundary.md` |
|
||||
|
||||
## 중앙 저장소 구조 (근원 해결 핵심)
|
||||
|
||||
```
|
||||
$HOME/.claude/nerdnavis-live/ # PC 로컬 단일 실 저장
|
||||
├── .junction-marker # 연결 상태 판정용 sentinel
|
||||
├── README.md # 조직 문서 역할
|
||||
└── {파일별 변경분}.md # hook 주입 대상
|
||||
|
||||
{repo_or_worktree}/.live/ ──Junction──▶ 위 중앙 저장소
|
||||
```
|
||||
|
||||
## 작동 경계
|
||||
- ✅ 동일 PC 내 모든 Claude 세션 (**worktree 경계 무관**)
|
||||
- ✅ 레포 루트·worktree·다른 worktree 어디서든 동일 파일시스템 참조
|
||||
- ❌ 다른 PC 간 실시간 공유 (이 경우 `git push` 명시 공유, P21-2)
|
||||
|
||||
## 조직 전원 필수 조치 (C1 사전 고지)
|
||||
1. **세션 1회 재시작** — SessionStart hook이 `live_junction_ensure.sh`를 자동 실행하여 junction 설치
|
||||
2. **`scripts/verify_setup.ps1`** 실행하여 3축 검증 통과 확인
|
||||
3. 실패 시 관리자 권한 PowerShell로 `setup/setup_windows.ps1` 또는 `setup/setup_macos.sh` 재실행
|
||||
|
||||
## Agent 호출 시 경계 보호 (신규 의무)
|
||||
- Agent 호출 프롬프트에 **"현재 cwd 기준 상대 경로 사용 의무"** 명시
|
||||
- 산출물 경로는 `git rev-parse --show-toplevel` 기준
|
||||
- PM은 Agent 응답 수령 직후 `git -C <레포루트> status` + 본 워크트리 `git status` 병행 확인
|
||||
- 경계 이탈 시 `git -C <레포루트> stash push -u -- <경로>` → 본 워크트리 `git stash pop`으로 복구
|
||||
|
||||
## 1주일 관찰 기간
|
||||
`.live.bak-*` 마이그레이션 백업은 1주일 관찰 후 삭제 공지 예정 (C6-1 원본 보호).
|
||||
|
||||
## 참조
|
||||
- [SKILL.md C34 본문](../../.claude/skills/너드나비스-코어룰/SKILL.md)
|
||||
- [폐기 규칙 아카이브 P25 승격 기록](폐기_규칙_아카이브.md)
|
||||
- [개발팀장 실무 검토 보고서](../소통/개발팀→PM/2026-04-18_worktree_격리_근원해결_실무검토.md)
|
||||
- [대화로그 조직운영 2026-04-18](../대화로그/조직운영/2026-04-18.md)
|
||||
- [재발 방지 메모리: worktree 격리](../../memory/org/feedback_worktree_isolation.md)
|
||||
- [재발 방지 메모리: Agent 경계 넘기](../../memory/org/feedback_agent_path_boundary.md)
|
||||
|
|
@ -292,6 +292,23 @@ rationale: C14(토큰 최소화) + 헌법 제1원칙 목표 2 원칙 B(차기
|
|||
|
||||
---
|
||||
|
||||
## 13. P25 → C34 승격 + worktree 격리 근원 해결 (2026-04-18)
|
||||
|
||||
| 항목 | 내용 |
|
||||
|------|------|
|
||||
| **규칙 번호·명** | P25 Live 증분 동기화 체계 → **C34 Live 증분 동기화 체계** (헌법급 승격 + 본문 전면 재작성) |
|
||||
| **신설일** | 2026-04-16 (P25로) |
|
||||
| **승격·재작성일** | 2026-04-18 (C34로) |
|
||||
| **상태** | **번호 승격 + 본문 전면 재작성** (프로젝트 규칙 → 핵심 규칙 헌법급) |
|
||||
| **대체 관계** | 구 P25 본문은 C34로 흡수되며, worktree 경계 해소·Agent 경계 보호·중앙 Junction 구조가 신규 편입됨 |
|
||||
| **경위·근거** | 2026-04-18 PD님 직접 선언 — **"이 문제가 해결되지 않으면 앞으로 우리 조직은 유지될 수 없어"** · **"철저히 검토해서 관련 된 문서에 일괄 반영하고 재발되지 않도록 가능한 모든 수단을 써서 개선해"**. git worktree 격리로 P25의 "같은 PC 세션 간 실시간 공유"가 실패하는 사실이 실증됨. 헌법 제1원칙 ⑤(세션·PC 연속성 보장)의 근본 위협 판정. |
|
||||
| **영향 범위** | (1) SKILL.md C34 신설 + P25 본문 완전 삭제, C16-1 junction 의무 편입, C31-1-E 표기 갱신 (2) CLAUDE.md 핵심 규칙 요약 28→29, 프로젝트 규칙 요약 25→24 (3) 스크립트: `scripts/live_junction_ensure.sh` 신규 + `setup_*.ps1/sh` 3.5 섹션 + `verify_setup.ps1` 2.5 섹션 (4) `.claude/settings.json` SessionStart hook 체인 갱신 (5) `.gitignore` `.live/*` 제외 규칙 (6) 조직공지 `2026-04-18_C34_신설_worktree_격리_근원해결.md` 발행 (7) memory/org/ 2종 신설 |
|
||||
| **구 P25 본문 요지** (보존) | Live 더미 + `sync_signal.sh` 시그널 체계로 같은 PC 세션 간 네트워크 비용 0 실시간 공유. 단, "같은 worktree" 전제가 암묵적이었으며 worktree 격리에서 실패함이 실증됨. |
|
||||
| **교훈** | (1) **"같은 PC = 같은 파일시스템"이라는 직관은 worktree 앞에서 성립하지 않음** — 조직 공유 체계 설계 시 worktree 경계 조건을 첫 검토 항목에 포함 (2) Agent 호출 시 절대 경로 하드코딩은 worktree 경계를 넘어 다른 디렉토리에 쓰이는 2차 위험 — C34-11·`feedback_agent_path_boundary.md` 참조 (3) 기존 C16-1 memory junction 패턴이 본 해결의 모범 사례 (중앙 저장소 + junction). 새 공유 체계 설계 시 동일 패턴 우선 채택 |
|
||||
| **번호 구멍** | P25는 본문 완전 삭제 (C14-5-확장 규준). CLAUDE.md 프로젝트 규칙 요약에서도 완전 제거. 번호 연속성 자산 아님. |
|
||||
|
||||
---
|
||||
|
||||
## 📘 운영 규칙 (본 파일 관리)
|
||||
|
||||
### 추가 시점
|
||||
|
|
@ -303,6 +320,7 @@ rationale: C14(토큰 최소화) + 헌법 제1원칙 목표 2 원칙 B(차기
|
|||
| 일시 | 변경자 | 변경 요지 | 관련 PD 지시 |
|
||||
|------|--------|-----------|-------------|
|
||||
| 2026-04-18 | PM | 신설 + P20·C17·구 C18·구 C24·구 C26 5종 이관. 수정 3대 원칙 3번 개정(저장 위치 최적화) PD님 직접 지시 반영 | 2026-04-18 원칙 3 개정 + A+B급 6건 집행 착수 지시 |
|
||||
| 2026-04-18 | PM | §13 P25 → C34 승격 기록 추가. worktree 격리 근원 해결 집행 (중앙 Junction + Agent 경계 보호) | 2026-04-18 PD님 조직 생존급 선언 "가능한 모든 수단을 써서 개선해" |
|
||||
|
||||
### 역진화 방지 (본 파일 자체의 보호)
|
||||
본 아카이브 파일 자체가 소실·삭제되면 조직 기억이 일괄 소실됨. 따라서:
|
||||
|
|
|
|||
Loading…
Reference in New Issue