From 53fa3162ef506377562a41c561fc90a0294c6548 Mon Sep 17 00:00:00 2001 From: swrring Date: Sat, 18 Apr 2026 21:59:41 +0900 Subject: [PATCH] =?UTF-8?q?feat(rules):=20C34=20Live=20=EC=A6=9D=EB=B6=84?= =?UTF-8?q?=20=EB=8F=99=EA=B8=B0=ED=99=94=20=ED=97=8C=EB=B2=95=EA=B8=89=20?= =?UTF-8?q?=EC=8B=A0=EC=84=A4=20+=20worktree=20=EA=B2=A9=EB=A6=AC=20?= =?UTF-8?q?=EA=B7=BC=EC=9B=90=20=ED=95=B4=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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) --- .claude/settings.json | 4 + .claude/skills/너드나비스-코어룰/SKILL.md | 132 +++-- .gitignore | 8 + CLAUDE.md | 11 +- memory/org/MEMORY.md | 2 + memory/org/feedback_agent_path_boundary.md | 39 ++ memory/org/feedback_worktree_isolation.md | 39 ++ scripts/live_junction_ensure.sh | 68 +++ scripts/verify_setup.ps1 | 23 + setup/setup_macos.sh | 29 ++ setup/setup_windows.ps1 | 42 ++ 공유/PD_지시_트래킹/개발팀_PD_지시_로그.md | 1 + 공유/대화로그/조직운영/2026-04-18.md | 96 ++++ .../2026-04-18_worktree_격리_근원해결_실무검토.md | 476 ++++++++++++++++++ .../2026-04-18_C34_신설_worktree_격리_근원해결.md | 70 +++ 공유/조직공지/폐기_규칙_아카이브.md | 18 + 16 files changed, 1010 insertions(+), 48 deletions(-) create mode 100644 memory/org/feedback_agent_path_boundary.md create mode 100644 memory/org/feedback_worktree_isolation.md create mode 100644 scripts/live_junction_ensure.sh create mode 100644 공유/소통/개발팀→PM/2026-04-18_worktree_격리_근원해결_실무검토.md create mode 100644 공유/조직공지/2026-04-18_C34_신설_worktree_격리_근원해결.md diff --git a/.claude/settings.json b/.claude/settings.json index dbe866e..2991665 100644 --- a/.claude/settings.json +++ b/.claude/settings.json @@ -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" diff --git a/.claude/skills/너드나비스-코어룰/SKILL.md b/.claude/skills/너드나비스-코어룰/SKILL.md index b8af817..2edf0d3 100644 --- a/.claude/skills/너드나비스-코어룰/SKILL.md +++ b/.claude/skills/너드나비스-코어룰/SKILL.md @@ -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_*` 스크립트 호출만으로 본 체계 즉시 재사용 diff --git a/.gitignore b/.gitignore index e5711f6..544dbaa 100644 --- a/.gitignore +++ b/.gitignore @@ -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-*/ + diff --git a/CLAUDE.md b/CLAUDE.md index bb06902..b1385e7 100644 --- a/CLAUDE.md +++ b/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) 참조 ## 컨벤션 diff --git a/memory/org/MEMORY.md b/memory/org/MEMORY.md index caef3bc..b6067ee 100644 --- a/memory/org/MEMORY.md +++ b/memory/org/MEMORY.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 호출 프롬프트 경로 규약 명시 의무 diff --git a/memory/org/feedback_agent_path_boundary.md b/memory/org/feedback_agent_path_boundary.md new file mode 100644 index 0000000..8ad2ba4 --- /dev/null +++ b/memory/org/feedback_agent_path_boundary.md @@ -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/레포 루트에 쓸 수 있음. diff --git a/memory/org/feedback_worktree_isolation.md b/memory/org/feedback_worktree_isolation.md new file mode 100644 index 0000000..3f2750f --- /dev/null +++ b/memory/org/feedback_worktree_isolation.md @@ -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과 동일 원칙). diff --git a/scripts/live_junction_ensure.sh b/scripts/live_junction_ensure.sh new file mode 100644 index 0000000..6279add --- /dev/null +++ b/scripts/live_junction_ensure.sh @@ -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 diff --git a/scripts/verify_setup.ps1 b/scripts/verify_setup.ps1 index a652521..feae6c4 100644 --- a/scripts/verify_setup.ps1 +++ b/scripts/verify_setup.ps1 @@ -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 = @( diff --git a/setup/setup_macos.sh b/setup/setup_macos.sh index 1fdeb42..96f2aed 100644 --- a/setup/setup_macos.sh +++ b/setup/setup_macos.sh @@ -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 "셋업 완료." diff --git a/setup/setup_windows.ps1 b/setup/setup_windows.ps1 index e8840d2..aa88978 100644 --- a/setup/setup_windows.ps1 +++ b/setup/setup_windows.ps1 @@ -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을 부서 디렉토리로 복제. diff --git a/공유/PD_지시_트래킹/개발팀_PD_지시_로그.md b/공유/PD_지시_트래킹/개발팀_PD_지시_로그.md index 33c63e7..7d7d8ab 100644 --- a/공유/PD_지시_트래킹/개발팀_PD_지시_로그.md +++ b/공유/PD_지시_트래킹/개발팀_PD_지시_로그.md @@ -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` 오후 섹션 참조. diff --git a/공유/대화로그/조직운영/2026-04-18.md b/공유/대화로그/조직운영/2026-04-18.md index 639ff2c..62d17e9 100644 --- a/공유/대화로그/조직운영/2026-04-18.md +++ b/공유/대화로그/조직운영/2026-04-18.md @@ -610,3 +610,99 @@ - **(안 나)** PM 역할 재검토 구체 절차 즉시 착수 - **(안 다)** 현행 유지 + 6회차 발생 시 처분 - **상태**: 완료. 세션 공유 대기 + + +## [개발팀장] 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 수령 대기 + + +## [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님 재량) + diff --git a/공유/소통/개발팀→PM/2026-04-18_worktree_격리_근원해결_실무검토.md b/공유/소통/개발팀→PM/2026-04-18_worktree_격리_근원해결_실무검토.md new file mode 100644 index 0000000..c4d973e --- /dev/null +++ b/공유/소통/개발팀→PM/2026-04-18_worktree_격리_근원해결_실무검토.md @@ -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 "\.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 -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" "/.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_생성실패_.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 '' 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 '' 2>/dev/null); then + NOTICE="$REPO_ROOT/공유/조직공지/$(date +%Y-%m-%d)_Live_junction_생성실패_$(hostname).md" + if [ ! -f "$NOTICE" ]; then + cat > "$NOTICE" < "이 문제가 해결되지 않으면 앞으로 우리 조직은 유지될 수 없어." +> "철저히 검토해서 관련 된 문서에 일괄 반영하고 재발되지 않도록 가능한 모든 수단을 써서 개선해." + +**헌법 제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) diff --git a/공유/조직공지/폐기_규칙_아카이브.md b/공유/조직공지/폐기_규칙_아카이브.md index 684c37e..185e532 100644 --- a/공유/조직공지/폐기_규칙_아카이브.md +++ b/공유/조직공지/폐기_규칙_아카이브.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님 조직 생존급 선언 "가능한 모든 수단을 써서 개선해" | ### 역진화 방지 (본 파일 자체의 보호) 본 아카이브 파일 자체가 소실·삭제되면 조직 기억이 일괄 소실됨. 따라서: