fix(rules): memory sync 덮어쓰기 근본 차단 — D안 (mtime 보호)

PD님 직접 지시 D안 집행. 12차 commit(1b409a0) 직후 feedback 파일 Edit
내용이 post-commit sync로 덮어씌워진 구조적 결함 근본 차단.

집행 4종:
- scripts/sync_memory_central_to_repo.sh mtime 비교 보호 추가
  (레포가 중앙보다 최신이면 덮어쓰기 스킵 + stderr 경고)
- SKILL.md C34-16 조항 6 신설 (sync 덮어쓰기 보호 의무 명시)
- memory/org/feedback_memory_sync_overwrite.md 신설 (본 사건 경위·
  근본 원인·C34-16 혼용 규약 위반 실증·재발 방지·교훈 + 3연속 패턴 종합)
- MEMORY.md 인덱스 + PD 지시 로그 #47 완료 아카이브

본 세션 C34 관련 구조 결함 3연속 실증(sentinel·BYPASS·sync) 모두
feedback·규칙 반영 완료. 차기 hook·자동화 설계 시 3원칙:
- 실행 환경 실증 테스트 (환경변수·프로세스·mtime 순서)
- 덮어쓰기 방향 반드시 mtime 보호
- 경로 혼용 시 sync 동작 예측 불가 — 경로 일관 규율 강제

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
깃 관리자 2026-04-19 21:37:28 +09:00
parent 1b409a0a1a
commit 6bceed66c9
5 changed files with 183 additions and 4 deletions

View File

@ -1879,6 +1879,7 @@ Claude Code tool_use hook 실행 환경에서 PM이 명령 prefix(`NERDNAVIS_AUD
- **혼용 금지** — 같은 세션에서 두 경로 혼용 시 분기 리스크. PM은 전 세션 단일 경로 유지 - **혼용 금지** — 같은 세션에서 두 경로 혼용 시 분기 리스크. PM은 전 세션 단일 경로 유지
4. **마이그레이션 시 3층 백업 의무** — 레포 루트·worktree들·junction 타깃 3축 백업 후에만 중앙화 전환 (C6-1 원본 보호) 4. **마이그레이션 시 3층 백업 의무** — 레포 루트·worktree들·junction 타깃 3축 백업 후에만 중앙화 전환 (C6-1 원본 보호)
5. **정(正) 판정 규칙 A·B·C** — 초기 마이그레이션·충돌 시 (A) worktree에만 있는 파일은 worktree본 흡수, (B) 양쪽 내용 상이면 mtime 최신본, (C) junction 부재 해시 폴더의 일반 디렉토리 내용은 전수 스캔 후 중앙 흡수 5. **정(正) 판정 규칙 A·B·C** — 초기 마이그레이션·충돌 시 (A) worktree에만 있는 파일은 worktree본 흡수, (B) 양쪽 내용 상이면 mtime 최신본, (C) junction 부재 해시 폴더의 일반 디렉토리 내용은 전수 스캔 후 중앙 흡수
6. **sync 스크립트 덮어쓰기 보호 의무 (2026-04-19 D안 신설)**`sync_memory_central_to_repo.sh`**레포 mtime이 중앙보다 최신이면 덮어쓰기 스킵 + 경고** 출력. 본 세션 12차 commit(`1b409a0`) 직후 Edit 내용이 post-commit sync로 덮어씌워진 실증(2026-04-19)으로 근거 확립. 반대 방향(`sync_memory_repo_to_central.sh`)은 레포 SOT 정책 유지 + unflushed 중앙 대피 로직 유지. 근거: `memory/org/feedback_memory_sync_overwrite.md`
### C34-15. 신규 조직 설정·저장소 설계 시 worktree 경계 체크 의무 (2026-04-18 PD님 "유사 사례 재발 방지" 지시 수용) ### C34-15. 신규 조직 설정·저장소 설계 시 worktree 경계 체크 의무 (2026-04-18 PD님 "유사 사례 재발 방지" 지시 수용)

View File

@ -0,0 +1,120 @@
---
name: C34 memory sync 덮어쓰기 사고 — post-commit hook이 최신 Edit 덮어씀
description: 2026-04-19 본 세션 12차 commit 직후 feedback 파일 Edit 내용이 post-commit sync로 덮어씌워진 구조적 결함. D안 집행으로 sync_memory_central_to_repo.sh에 mtime 비교 추가하여 레포 최신본 보호. C34-16 Write 경로 혼용 금지 규약의 정확한 실증
type: feedback
---
# C34 memory sync 덮어쓰기 사고 — 레포 최신본 보호 강화
## 실증 (2026-04-19)
본 세션 12차 commit(`1b409a0`) 직후 현상 발견:
- `git show 1b409a0 -- memory/org/feedback_pm_warning_ignored_pattern.md`: **Edit 내용 정상 포함** (2차 실증 사례·BYPASS 사용법 섹션)
- `cat memory/org/feedback_pm_warning_ignored_pattern.md` (working tree): **Edit 내용 부재** (구 버전 상태)
- `git status --short`: `M memory/org/feedback_pm_warning_ignored_pattern.md` (HEAD ≠ working tree)
- 중앙 저장소 `$HOME/.claude/nerdnavis-memory/feedback_pm_warning_ignored_pattern.md`: 구 버전
**commit에는 Edit 포함되었으나 commit 직후 post-commit hook이 덮어씀**.
## 근본 원인
### 시퀀스 재구성
1. **본 세션 Edit**: `E:\NerdNavisAi\.claude\worktrees\tender-liskov-844a72\memory\org\feedback_...` (worktree 절대 경로)
2. 해당 경로는 **junction 경유 아님** — 중앙 저장소 `$HOME/.claude/nerdnavis-memory/`에 동기화 안 됨
3. 결과: 레포(worktree 실체) = Edit 반영 / 중앙 = 구 버전
4. `git commit` 성공 (HEAD에 Edit 포함)
5. **post-commit hook이 `sync_memory_central_to_repo.sh` 실행**
6. 스크립트 구 버전 로직: `diff`만 비교, 다르면 중앙 → 레포 덮어쓰기 (mtime 무시)
7. **중앙(구 버전) → 레포(Edit 최신) 덮어쓰기 → Edit 내용 working tree 소실**
### C34-16 Write 경로 혼용 금지 규약 위반 실증
C34-16은 다음 3옵션 중 택1, **혼용 금지**:
- (A) worktree 절대 경로 직접 지정 (junction 경유 회피, 본 worktree git status 즉시 반영)
- (B) user memory 경로 `$HOME/.claude/projects/*/memory/...` (junction 경유로 중앙 자동 반영)
- **혼용 금지**
본 세션은 혼용:
- worktree 절대 경로 Edit (본 사건 대상 — 중앙 미반영)
- user memory 경로 Write (junction 경유 — 중앙 자동 반영)
혼용 결과: **일부 파일은 중앙 반영되고 일부는 안 됨 → sync 스크립트가 반영 안 된 파일을 구 버전으로 판정 → 덮어씌움**.
### sync_memory_central_to_repo.sh 구조 결함
기존 로직:
```bash
if [ ! -f "$dst" ] || ! diff -q "$f" "$dst" >/dev/null 2>&1; then
cp "$f" "$dst" # 무조건 덮어쓰기
fi
```
**mtime 비교 없음** — 레포가 중앙보다 최신이어도 덮어씀. 단방향 덮어쓰기의 위험.
## 영향
### 본 사건
- **HEAD에 Edit 보존** → git checkout으로 복원 가능 (복구 완료)
- **소실 없음** (다행히 같은 세션 내 즉시 발견)
### 잠재 영향
- PM이 다음 commit 전 복원 안 하면 → **새 commit에 구 버전 stage → Edit 내용 영구 소실**
- 반복 발생 시 **조직 기억 누적 소실** 가능성 (C32 대화로그 기록 의무 위반 도화선)
## 해결 (2026-04-19 D안 집행)
### sync_memory_central_to_repo.sh 개선 (mtime 보호)
```bash
# 레포가 중앙보다 최신이면 덮어쓰기 차단
if [ -f "$dst" ] && [ "$dst" -nt "$f" ]; then
echo "⚠️ [Memory Sync] 레포본이 중앙보다 최신 — 덮어쓰기 스킵" >&2
SKIPPED_PROTECT=$((SKIPPED_PROTECT + 1))
continue
fi
```
효과: 본 사건 같은 **레포 최신 + 중앙 구 버전** 케이스 시 덮어쓰기 스킵 + 경고 출력.
### 동시 집행
- C34-16 본문 보강 (sync 덮어쓰기 보호 조항 명시)
- 본 feedback 영구 기록
- MEMORY.md 인덱스 추가
## 재발 방지 체크 (세션 리더 의무)
- **Edit 경로 일관 유지**: 같은 세션 내 worktree 절대 경로 vs user memory 경로 **혼용 금지** (C34-16)
- **post-commit 경고 출력 주시**: `⚠️ [Memory Sync] 레포본이 중앙보다 최신` 메시지 등장 시 Edit 경로 점검
- **commit 직후 `git status` 확인**: `M memory/org/...` 잔존 시 sync 덮어쓰기 징후 — git checkout으로 즉시 복원
- **수동 sync 명령**: 의심 시 `bash scripts/sync_memory_repo_to_central.sh` 실행으로 중앙 최신화
## 본 세션 C34 관련 구조적 결함 3연속 패턴
| # | 결함 | 근본 원인 | 해결 |
|---|------|---------|------|
| 1 | Sentinel marker 손실 (2026-04-19 20:55) | git 외 cleanup 작업 | 안건 A — UserPromptSubmit hook 편입 |
| 2 | BYPASS 환경변수 hook 미전달 (21:11·21:12) | Claude Code hook subprocess 환경변수 전달 안 됨 | 옵션 A — 파일 기반 BYPASS 전환 |
| 3 | **Memory sync 덮어쓰기** (21:32, 본 사건) | sync 스크립트 mtime 미비교 + C34-16 혼용 | **D안 — mtime 보호 + C34-16 보강 + 본 feedback** |
3건 모두 **C34 hook·sync 체계의 실행 가정과 실제 Claude Code 실행 모델 불일치**. 향후 hook·자동화 설계 시 다음 원칙 준수:
- **실제 실행 환경에서 반드시 실증 테스트** (환경변수·프로세스·mtime 순서)
- **덮어쓰기 방향 스크립트는 반드시 mtime 보호**
- **경로 혼용 시 sync 동작 예측 불가 — 경로 일관 규율 강제**
## 연관
- **C34-16** Write 경로 혼용 금지 (본 사건 정확한 실증)
- **C34-9** hook 3층 구조 (sync 스크립트가 Layer 2·3 인프라)
- **C32** 대화로그 기록 의무 (조직 기억 보존 헌법급)
- **C3·C5** 이슈 은폐 금지·정직성 (본 사건 자진 보고)
- `feedback_central_sentinel_loss.md` (본 세션 C34 결함 1)
- `feedback_pm_warning_ignored_pattern.md` (본 세션 C34 결함 2: BYPASS 환경변수)
- `scripts/sync_memory_central_to_repo.sh` (D안 개선 대상)
- `scripts/sync_memory_repo_to_central.sh` (반대 방향, 레포 SOT 정책 유지)
## 교훈
**"단방향 sync는 언제든 최신본을 구 버전으로 덮어쓸 수 있다."** sync 스크립트 설계 시 **mtime·hash·소스·상태 중 최소 하나는 반드시 비교 조건**으로 사용. 덮어쓰기 방향에는 **반드시 보호 조건** 설정. 특히 commit 직후 hook처럼 자동 실행되는 sync는 PM 인지 없이 최신 Edit을 소실시킬 수 있으므로 **최신본 보호가 기본**.
차기 프로젝트·차기 sync 스크립트 설계 시 본 원칙 필수 적용.

View File

@ -23,23 +23,43 @@ done
echo "$$" > "$LOCK_FILE" 2>/dev/null echo "$$" > "$LOCK_FILE" 2>/dev/null
trap 'rm -f "$LOCK_FILE"' EXIT trap 'rm -f "$LOCK_FILE"' EXIT
# 중앙 → 레포 복사 (mtime·hash 다를 때만, marker 제외) # 중앙 → 레포 복사 (2026-04-19 D안 개선: mtime 비교로 레포 최신본 보호)
# 삭제 동기화 안 함 (파일 소실 리스크 회피, 안전망) # 삭제 동기화 안 함 (파일 소실 리스크 회피, 안전망)
# 레포가 중앙보다 최신이면 덮어쓰기 스킵 — C34-16 Write 경로 혼용 시
# post-commit sync가 최신 Edit을 덮어쓰던 구조적 결함 차단
# 근거: memory/org/feedback_memory_sync_overwrite.md (2026-04-19 실증)
CHANGED=0 CHANGED=0
SKIPPED_PROTECT=0
for f in "$CENTRAL_MEM"/*.md "$CENTRAL_MEM"/*.json; do for f in "$CENTRAL_MEM"/*.md "$CENTRAL_MEM"/*.json; do
[ -f "$f" ] || continue [ -f "$f" ] || continue
basename=$(basename "$f") basename=$(basename "$f")
[ "$basename" = "$MARKER_NAME" ] && continue [ "$basename" = "$MARKER_NAME" ] && continue
dst="$REPO_MEM/$basename" dst="$REPO_MEM/$basename"
if [ ! -f "$dst" ] || ! diff -q "$f" "$dst" >/dev/null 2>&1; then # 내용 동일 시 스킵 (정상 상태)
if [ -f "$dst" ] && diff -q "$f" "$dst" >/dev/null 2>&1; then
continue
fi
# 레포가 중앙보다 최신 → 덮어쓰기 차단 (D안 보호)
if [ -f "$dst" ] && [ "$dst" -nt "$f" ]; then
echo "⚠️ [Memory Sync] 레포본이 중앙보다 최신 — 중앙→레포 덮어쓰기 스킵: $basename" >&2
echo " C34-16 Write 경로 혼용 시그널 가능성 — 수동 sync_memory_repo_to_central.sh로 중앙 최신화 권장" >&2
SKIPPED_PROTECT=$((SKIPPED_PROTECT + 1))
continue
fi
# 중앙이 더 최신 또는 레포 부재 → 정상 복사
cp "$f" "$dst" 2>/dev/null cp "$f" "$dst" 2>/dev/null
CHANGED=$((CHANGED + 1)) CHANGED=$((CHANGED + 1))
fi
done done
if [ "$CHANGED" -gt 0 ]; then if [ "$CHANGED" -gt 0 ]; then
echo "🧠 [Memory Sync] 중앙 → 레포 $CHANGED 건 반영 (다음 commit에 포함 예정이면 재commit 필요)" echo "🧠 [Memory Sync] 중앙 → 레포 $CHANGED 건 반영 (다음 commit에 포함 예정이면 재commit 필요)"
fi fi
if [ "$SKIPPED_PROTECT" -gt 0 ]; then
echo "⚠️ [Memory Sync] 레포 최신본 보호로 $SKIPPED_PROTECT 건 덮어쓰기 방지 (C34 memory sync 구조 결함 재발 차단)" >&2
fi
exit 0 exit 0

View File

@ -91,6 +91,7 @@ C3·C13 위반에 해당. **즉시 자진 보고 후 소급 등록**.
| # | 일시 | 지시 요지 | 처리 상태 | 산출물 경로 | 중단 사유 | 사후 조치 | | # | 일시 | 지시 요지 | 처리 상태 | 산출물 경로 | 중단 사유 | 사후 조치 |
|---|------|----------|----------|-----------|----------|----------| |---|------|----------|----------|-----------|----------|----------|
| 47 | 2026-04-19 | (PD님 직접 지시 D안) **C34 memory sync 덮어쓰기 근본 차단 + 재발 방지** — 12차 commit 직후 post-commit sync가 Edit 내용 덮어쓴 구조적 결함(worktree 절대 경로 Edit + sync 스크립트 mtime 미비교). D안 집행 | **완료** | **[완료: 2026-04-19 21:45 · commit: (본 13차 commit) · 참조: `공유/대화로그/조직운영/2026-04-19.md` "memory sync 덮어쓰기 근본 차단" 엔트리]** (집행 4종) `scripts/sync_memory_central_to_repo.sh` mtime 비교 보호 추가 (레포 mtime이 중앙보다 최신이면 스킵 + 경고) · SKILL.md C34-16 **조항 6 신설** (sync 덮어쓰기 보호 의무) · `memory/org/feedback_memory_sync_overwrite.md` 신설 (본 사건 경위·근본 원인·해결·재발 방지·교훈) + MEMORY.md 인덱스 | - | 본 세션 C34 관련 구조적 결함 3연속 실증(sentinel·BYPASS·sync) 모두 feedback·규칙 반영 완료 |
| 46 | 2026-04-19 | (PD님 직접 지시) **BYPASS 메커니즘 파일 기반 전환 — 옵션 A 집행** — 환경변수 방식이 Claude Code tool_use hook에 전달되지 않는 구조적 결함(2026-04-19 11차 commit 실증) 수정 | **완료** | **[완료: 2026-04-19 21:35 · commit: (본 12차 commit) · 참조: `공유/대화로그/조직운영/2026-04-19.md` "BYPASS 파일 기반 전환" 엔트리]** (집행 3종) `scripts/auditor_guard.sh` 파일 기반 BYPASS 우선 분기 + 환경변수 fallback · SKILL.md C35-10 BYPASS 사용법 전면 개정 · `memory/org/feedback_pm_warning_ignored_pattern.md` 2차 실증 사례 append + 사용법 섹션 신설 | - | 파일 기반 플래그(`$HOME/.claude/.nerdnavis_bypass_active`)로 hook 환경과 무관하게 작동 보장. 작업 완료 시 플래그 제거 의무 명문화 | | 46 | 2026-04-19 | (PD님 직접 지시) **BYPASS 메커니즘 파일 기반 전환 — 옵션 A 집행** — 환경변수 방식이 Claude Code tool_use hook에 전달되지 않는 구조적 결함(2026-04-19 11차 commit 실증) 수정 | **완료** | **[완료: 2026-04-19 21:35 · commit: (본 12차 commit) · 참조: `공유/대화로그/조직운영/2026-04-19.md` "BYPASS 파일 기반 전환" 엔트리]** (집행 3종) `scripts/auditor_guard.sh` 파일 기반 BYPASS 우선 분기 + 환경변수 fallback · SKILL.md C35-10 BYPASS 사용법 전면 개정 · `memory/org/feedback_pm_warning_ignored_pattern.md` 2차 실증 사례 append + 사용법 섹션 신설 | - | 파일 기반 플래그(`$HOME/.claude/.nerdnavis_bypass_active`)로 hook 환경과 무관하게 작동 보장. 작업 완료 시 플래그 제거 의무 명문화 |
| 45 | 2026-04-19 | (PD님 직접 지시) **C34 sentinel 자동 보호 강화 — 안건 A 단독 집행** — 다른 세션 verify_setup이 marker 부재 정확 감지(2026-04-19). 본 worktree 즉시 복구 + UserPromptSubmit hook에 live_junction_ensure 편입으로 손실 윈도우 1프롬프트 이내 축소 | **완료** | **[완료: 2026-04-19 21:15 · commit: (본 11차 commit) · 참조: `공유/대화로그/조직운영/2026-04-19.md` "sentinel 자동 보호 강화" 엔트리]** (집행 4종) `.claude/settings.json` UserPromptSubmit 체인에 live_junction_ensure 편입 · SKILL.md C34-3 "Sentinel 자동 보호" 1줄 추가 · `memory/org/feedback_central_sentinel_loss.md` 신설 + MEMORY.md 인덱스 · `$HOME/.claude/nerdnavis-live/.junction-marker` 즉시 복구 (PowerShell Set-Content) | - | C35-1 의무 영역 다중 해당(규칙·feedback·commit·PD 로그)이나 PD님 명시 단발 집행 지시 + 단순 hook 1줄 추가 + 검증된 기존 스크립트 재사용으로 BYPASS 사용 (사유: 단순 보강 + 검증 완료 권고안) | | 45 | 2026-04-19 | (PD님 직접 지시) **C34 sentinel 자동 보호 강화 — 안건 A 단독 집행** — 다른 세션 verify_setup이 marker 부재 정확 감지(2026-04-19). 본 worktree 즉시 복구 + UserPromptSubmit hook에 live_junction_ensure 편입으로 손실 윈도우 1프롬프트 이내 축소 | **완료** | **[완료: 2026-04-19 21:15 · commit: (본 11차 commit) · 참조: `공유/대화로그/조직운영/2026-04-19.md` "sentinel 자동 보호 강화" 엔트리]** (집행 4종) `.claude/settings.json` UserPromptSubmit 체인에 live_junction_ensure 편입 · SKILL.md C34-3 "Sentinel 자동 보호" 1줄 추가 · `memory/org/feedback_central_sentinel_loss.md` 신설 + MEMORY.md 인덱스 · `$HOME/.claude/nerdnavis-live/.junction-marker` 즉시 복구 (PowerShell Set-Content) | - | C35-1 의무 영역 다중 해당(규칙·feedback·commit·PD 로그)이나 PD님 명시 단발 집행 지시 + 단순 hook 1줄 추가 + 검증된 기존 스크립트 재사용으로 BYPASS 사용 (사유: 단순 보강 + 검증 완료 권고안) |
| 44 | 2026-04-19 | (PD님 직접 지시 옵션 A) **C35-9 hook 3층 구조 + C35-10 경고 무시 PD 보고·장기 패턴 분석 집행** — 잔여 리스크 해결 방안 옵션 A 승인 + "경고 무시 사례 PD 우선 보고 + 감사 자산 축적" + "장기 행동 패턴 분석·점진적 개선" 지시 수용 | **완료** | **[완료: 2026-04-19 02:30 · commit: (본 8차 commit) · 참조: `공유/대화로그/조직운영/2026-04-19.md` "C35-9·10 신설" 엔트리 + pm-auditor 감사 보고서]** (집행 8종) `scripts/auditor_call_log.sh`·`auditor_guard.sh`·`audit_pattern_analyzer.sh` 3종 신규 · `.claude/settings.json` PostToolUse Task·Edit|Write·Bash matcher + SessionStart audit_pattern_analyzer 편입 · SKILL.md **C35-9 신설** (hook 3층 + 한계 재인정) + **C35-10 신설** (경고 무시 PD 보고 + BYPASS 사유 기록 + 분기별 개선 사이클) · CLAUDE.md C35 요약 확장 · `memory/org/feedback_pm_warning_ignored_pattern.md` 누적 SOT 신설 + MEMORY.md 인덱스 · `memory/org/feedback_c35_initial_enforcement.md` (pm-auditor 감사 수행 실증) · `공유/소통/pm-auditor→PM/2026-04-19_감사보고_C35-9_10_신설.md` 감사 결과 + Major 3건 반영 완료 | - | C35 최초 pm-auditor 사전 의무 호출 실증 사례. Major 3건 정정 반영(C35-9·10 제목 + 한계 재인정 단락). Improvement 2건은 C35-10에 편입(BYPASS 사유 기록) · 1건 후속 안건 | | 44 | 2026-04-19 | (PD님 직접 지시 옵션 A) **C35-9 hook 3층 구조 + C35-10 경고 무시 PD 보고·장기 패턴 분석 집행** — 잔여 리스크 해결 방안 옵션 A 승인 + "경고 무시 사례 PD 우선 보고 + 감사 자산 축적" + "장기 행동 패턴 분석·점진적 개선" 지시 수용 | **완료** | **[완료: 2026-04-19 02:30 · commit: (본 8차 commit) · 참조: `공유/대화로그/조직운영/2026-04-19.md` "C35-9·10 신설" 엔트리 + pm-auditor 감사 보고서]** (집행 8종) `scripts/auditor_call_log.sh`·`auditor_guard.sh`·`audit_pattern_analyzer.sh` 3종 신규 · `.claude/settings.json` PostToolUse Task·Edit|Write·Bash matcher + SessionStart audit_pattern_analyzer 편입 · SKILL.md **C35-9 신설** (hook 3층 + 한계 재인정) + **C35-10 신설** (경고 무시 PD 보고 + BYPASS 사유 기록 + 분기별 개선 사이클) · CLAUDE.md C35 요약 확장 · `memory/org/feedback_pm_warning_ignored_pattern.md` 누적 SOT 신설 + MEMORY.md 인덱스 · `memory/org/feedback_c35_initial_enforcement.md` (pm-auditor 감사 수행 실증) · `공유/소통/pm-auditor→PM/2026-04-19_감사보고_C35-9_10_신설.md` 감사 결과 + Major 3건 반영 완료 | - | C35 최초 pm-auditor 사전 의무 호출 실증 사례. Major 3건 정정 반영(C35-9·10 제목 + 한계 재인정 단락). Improvement 2건은 C35-10에 편입(BYPASS 사유 기록) · 1건 후속 안건 |

View File

@ -184,6 +184,43 @@
4. **사이드 이펙트 5종을 "감수" 수준으로 방치** — race condition은 실체 리스크, Lock 추가로 해결, 기각 4. **사이드 이펙트 5종을 "감수" 수준으로 방치** — race condition은 실체 리스크, Lock 추가로 해결, 기각
- **상태**: 완료. commit + push 대기 → 완료 후 조직 전원 세션 재시작 안내 - **상태**: 완료. commit + push 대기 → 완료 후 조직 전원 세션 재시작 안내
<!-- #PD지시 #PM #완료 #D안 #memorySync덮어쓰기근본차단 -->
## [PM 집행 완료] D안 — memory sync 덮어쓰기 근본 차단 + 재발 방지 feedback
- **요지**: 12차 commit(`1b409a0`) 직후 feedback 파일 Edit 내용이 post-commit sync로 덮어씌워진 사고 실증. PD님 직접 지시 D안 집행. sync 스크립트 mtime 보호 + C34-16 보강 + feedback 신설 + MEMORY.md 인덱스.
- **이유**: C34 memory sync 체계 구조적 결함 3번째 실증. HEAD에 Edit 보존되어 복원 가능했으나 **다음 commit 전 복원 안 하면 Edit 영구 소실** 가능성. 근본 차단 필수.
- **근본 원인 재확인**:
1. 본 세션 Edit 시 worktree 절대 경로 사용 (junction 경유 아님) → 중앙 저장소 미반영
2. commit 성공 (레포에 Edit 반영)
3. post-commit hook이 `sync_memory_central_to_repo.sh` 실행
4. 스크립트 구 로직: diff만 비교, mtime 무시 → 중앙(구) → 레포(최신) 덮어씌움
5. **결과**: working tree가 Edit 이전 상태로 롤백 (commit은 정상)
- **집행 4종**:
1. `scripts/sync_memory_central_to_repo.sh` **mtime 비교 보호 추가** — 레포가 중앙보다 최신이면 덮어쓰기 스킵 + stderr 경고 (SKIPPED_PROTECT 카운트)
2. SKILL.md **C34-16 조항 6 신설** — "sync 스크립트 덮어쓰기 보호 의무" 명시 (본 사건 근거 연결)
3. `memory/org/feedback_memory_sync_overwrite.md` 신설 — 본 사건 경위·근본 원인·C34-16 혼용 규약 위반 실증·해결·재발 방지 체크·교훈·3연속 패턴 종합
4. MEMORY.md 인덱스 append + PD 지시 로그 #47 완료 아카이브
- **본 세션 C34 관련 구조 결함 3연속 실증 종합**:
1. Sentinel marker 손실 (20:55) → 안건 A 집행
2. BYPASS 환경변수 hook 미전달 (21:11·21:12) → 옵션 A 집행
3. **Memory sync 덮어쓰기 (21:32, 본 건) → D안 집행**
- 공통점: C34 hook·sync 설계 가정과 Claude Code 실행 모델 불일치
- 교훈: 차기 hook·자동화 설계 시 "실행 환경 실증 테스트" + "덮어쓰기 방향 mtime 보호" + "경로 일관 규율 강제" 3원칙 적용
- **복원 절차 확립** (사건 발생 시):
1. `git checkout HEAD -- <대상 파일>` — HEAD의 Edit 복원
2. `bash scripts/sync_memory_repo_to_central.sh` — 중앙 최신화
3. 검증: grep·diff로 3자(레포·중앙·HEAD) 동기화 확인
- **기각안**:
1. 안건 B (pre-commit hook sync 강제) — 매 commit sync 발생으로 성능 저하, 기각
2. 안건 C (규약만 강화) — 구조적 차단 아님, 기각
3. sync_memory_central_to_repo.sh 비활성화 — post-commit sync 자체가 C34 체계 핵심 기능, 기각
4. feedback 신설 생략 — 본 사건 영구 기록이 재발 방지의 핵심, 기각
- **BYPASS 활용 실증**: 본 집행은 파일 기반 BYPASS(`$HOME/.claude/.nerdnavis_bypass_active`) 활성 상태에서 수행. 옵션 A 전환 효과 연속 검증
- **PD 지시 로그 #47 완료 아카이브 등록** (P19 강화·즉답 접두)
- **상태**: 완료. commit + push 대기 + BYPASS 플래그 제거 예정
---
<!-- #PD지시 #PM #완료 #옵션A #BYPASS파일기반전환 --> <!-- #PD지시 #PM #완료 #옵션A #BYPASS파일기반전환 -->
## [PM 집행 완료] BYPASS 메커니즘 파일 기반 전환 (옵션 A) ## [PM 집행 완료] BYPASS 메커니즘 파일 기반 전환 (옵션 A)