feat(#50 Phase 2): PreToolUse 차단 전환 (근본 해결) + 8회차 재발 방지

PD님 직접 지시 수용. "작업 흐름 파괴" 전제 폐기 후 PreToolUse 차단 집행.
"보고 체계 없이 무단 변경이 더 큰 파괴" (PD님 원문).

Phase 2 집행 (30+종):
- scripts 3종 신설 (auditor_gate·manifest_register·manifest_archive)
- settings.json PreToolUse auditor_gate 편입·PostToolUse auditor_guard 제거
- post-commit manifest_archive 확장
- auditor_guard.sh deprecated
- SKILL.md C35-9 전면 재작성 (차단 + 해제 워크플로우)
- SKILL.md C34-17 조항 8 (매니페스트 디렉토리 편입)
- SKILL.md C35-10 BYPASS 사실상 폐기 (PreToolUse 우회 불가)
- pm-auditor 5-F 8회차 확장 (근본 해결 회피 명분 감지)
- feedback §8 방향전환 히스토리 아카이브 이관 (M-3)
- feedback 8회차 append (PM 자진 고지 SOT)
- 조직공지 2종 (C2 확장 + PreToolUse 차단)
- CLAUDE.md C35 요약 갱신
- C6-1 백업 5종 실 생성

pm-auditor 재감사: Critical 0·Major 1·Minor 2·Improvement 1.
M-1·m-1·m-2·i-1 전수 수용.

본 세션 집행 중 PreToolUse 차단 정상 작동 실증.
SKILL.md Edit 차단 → manifest_register.sh 등록 → 통과 (설계대로 작동).

기대 커버리지: ~97% → ~99%.
#50 완료 아카이브 이동.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
깃 관리자 2026-04-20 13:57:50 +09:00
parent b5cb6d7c8c
commit 46ed9ce51e
20 changed files with 939 additions and 145 deletions

View File

@ -112,7 +112,9 @@ PM 응답·권고 전수 점검:
- [ ] 경계 값·설정·수치만 조정하는 **proxy 개선**을 근본 해결로 포장하지 않았는가? (C2-2) - [ ] 경계 값·설정·수치만 조정하는 **proxy 개선**을 근본 해결로 포장하지 않았는가? (C2-2)
- [ ] 근본 해결안 vs proxy 개선 공존 시 **근본 해결안을 첫 번째**로 제시했는가? (C2-3) - [ ] 근본 해결안 vs proxy 개선 공존 시 **근본 해결안을 첫 번째**로 제시했는가? (C2-3)
- [ ] 동일 문제에 대한 복수 개선안이 **모두 같은 축 내 튜닝**(시간 윈도우 수치·임계값·유형별 차등 등)이면 전형적 proxy 반사. 본질 축 변경 없이 옵션만 나열한 경우 Critical 등급 - [ ] 동일 문제에 대한 복수 개선안이 **모두 같은 축 내 튜닝**(시간 윈도우 수치·임계값·유형별 차등 등)이면 전형적 proxy 반사. 본질 축 변경 없이 옵션만 나열한 경우 Critical 등급
- 근거: `memory/org/feedback_pm_proxy_improvement_reflex.md` (2026-04-20 PM 7회차 변종 실증 — 30분 윈도우 3안 모두 proxy) - [ ] **근본 해결 회피 명분 표현 감지** (2026-04-20 8회차 변종 추가): 응답에 "작업 흐름 파괴"·"생산성 저해"·"구현 복잡"·"하위 호환성"·"실용성 부족" 등 **근본 해결 단점 강조 표현**이 있는가? 이 표현들은 PM이 proxy 선택을 정당화하는 숨은 명분으로 작동. 등장 시 Critical 등급. 트레이드오프 판정은 PD님 영역이며 PM이 proxy 정당화 근거로 사용 불가
- [ ] 근본 해결안을 "이상적이지만 현실적으로 어려움" 식으로 **가상적 단점을 전제**로 기피하지 않았는가? (C2-2·C2-3 심층 위반 형태)
- 근거: `memory/org/feedback_pm_proxy_improvement_reflex.md` (7회차 변종: 30분 윈도우 3안 proxy + 8회차 변종: "작업 흐름 파괴" 명분으로 PreToolUse 차단 기피 — 2026-04-20 PD님 직접 지적 "보고 체계 없이 무단 변경이 더 큰 파괴" 수용)
### 5-A. C34/C16-1 동급 생존성 이슈 축소 보고 감지 (2026-04-19 신설 — PD님 직접 지시) ### 5-A. C34/C16-1 동급 생존성 이슈 축소 보고 감지 (2026-04-19 신설 — PD님 직접 지시)

View File

@ -69,6 +69,10 @@
{ {
"type": "command", "type": "command",
"command": "bash scripts/auto_approve.sh" "command": "bash scripts/auto_approve.sh"
},
{
"type": "command",
"command": "bash scripts/auditor_gate.sh"
} }
] ]
} }
@ -174,19 +178,6 @@
{ {
"type": "command", "type": "command",
"command": "bash scripts/postuse_log_reminder.sh 2>/dev/null || true" "command": "bash scripts/postuse_log_reminder.sh 2>/dev/null || true"
},
{
"type": "command",
"command": "bash scripts/auditor_guard.sh 2>/dev/null || true"
}
]
},
{
"matcher": "Bash",
"hooks": [
{
"type": "command",
"command": "bash scripts/auditor_guard.sh 2>/dev/null || true"
} }
] ]
}, },

View File

@ -0,0 +1,219 @@
{
"_description": "너드나비스 조직 공용 Claude Code permission + hook 설정 (SOT). PD님 일괄 승인 원칙 + 자동 동기화 hook. 단일 세션 + Agent 병렬 호출 구조. 모든 PC 동일 적용. 루트 단일 관리.",
"permissions": {
"defaultMode": "acceptEdits",
"allow": [
"Read",
"Glob",
"Grep",
"TodoWrite",
"Edit",
"Write",
"MultiEdit",
"NotebookEdit",
"Skill",
"Bash",
"Bash(git *)",
"Bash(ls *)",
"Bash(cat *)",
"Bash(echo *)",
"Bash(mkdir *)",
"Bash(pwd)",
"Bash(which *)",
"Bash(bash *)",
"Bash(powershell *)",
"Bash(node *)",
"Bash(npm *)",
"Bash(npx *)",
"Bash(python *)",
"Bash(python3 *)",
"Bash(pip *)",
"Bash(uv *)",
"Bash(uvx *)",
"Bash(dotnet *)",
"WebFetch",
"WebSearch",
"mcp__unity-mcp__*",
"mcp__filesystem__*",
"mcp__memory__*",
"mcp__sqlite__*",
"mcp__scheduled-tasks__*",
"mcp__Claude_Preview__*"
],
"deny": [
"Bash(rm:*)",
"Bash(rmdir:*)",
"Bash(sudo:*)",
"Bash(dd:*)",
"Bash(mkfs:*)",
"Bash(format:*)",
"Bash(chmod 777:*)",
"Bash(chown:*)",
"Bash(shutdown:*)",
"Bash(reboot:*)",
"Write(/etc/**)",
"Write(/System/**)",
"Write(C:/Windows/**)",
"Write(C:\\Windows\\**)",
"Edit(/etc/**)",
"Edit(/System/**)",
"Edit(C:/Windows/**)",
"Edit(C:\\Windows\\**)"
]
},
"hooks": {
"PreToolUse": [
{
"matcher": "",
"hooks": [
{
"type": "command",
"command": "bash scripts/auto_approve.sh"
}
]
}
],
"SessionStart": [
{
"matcher": "",
"hooks": [
{
"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/memory_junction_ensure.sh 2>/dev/null || true"
},
{
"type": "command",
"command": "bash scripts/sync_memory_repo_to_central.sh 2>/dev/null || true"
},
{
"type": "command",
"command": "bash scripts/audit_junction_ensure.sh 2>/dev/null || true"
},
{
"type": "command",
"command": "bash scripts/sync_audit_repo_to_central.sh 2>/dev/null || true"
},
{
"type": "command",
"command": "bash scripts/inbox_scan.sh 2>/dev/null || true"
},
{
"type": "command",
"command": "bash scripts/change_digest.sh 2>/dev/null || true"
},
{
"type": "command",
"command": "bash scripts/live_session_load.sh 2>/dev/null || true"
},
{
"type": "command",
"command": "bash scripts/pm_context_restore.sh 2>/dev/null || true"
},
{
"type": "command",
"command": "bash scripts/recent_feedback_brief.sh 2>/dev/null || true"
},
{
"type": "command",
"command": "bash scripts/audit_pattern_analyzer.sh 2>/dev/null || true"
},
{
"type": "command",
"command": "bash scripts/verify_log_paths.sh 2>/dev/null || true"
},
{
"type": "command",
"command": "git config core.hooksPath scripts/git-hooks 2>/dev/null || true"
}
]
}
],
"UserPromptSubmit": [
{
"matcher": "",
"hooks": [
{
"type": "command",
"command": "bash scripts/sync_signal.sh check 2>/dev/null || true"
},
{
"type": "command",
"command": "bash scripts/git_fetch_throttle.sh 2>/dev/null || true"
},
{
"type": "command",
"command": "bash scripts/hold_watch.sh 2>/dev/null || true"
},
{
"type": "command",
"command": "bash scripts/live_junction_ensure.sh 2>/dev/null || true"
},
{
"type": "command",
"command": "bash scripts/audit_junction_ensure.sh 2>/dev/null || true"
},
{
"type": "command",
"command": "bash scripts/live_inject.sh 2>/dev/null || true"
}
]
}
],
"PostToolUse": [
{
"matcher": "Edit|Write|MultiEdit",
"hooks": [
{
"type": "command",
"command": "bash scripts/postuse_log_reminder.sh 2>/dev/null || true"
},
{
"type": "command",
"command": "bash scripts/auditor_guard.sh 2>/dev/null || true"
}
]
},
{
"matcher": "Bash",
"hooks": [
{
"type": "command",
"command": "bash scripts/auditor_guard.sh 2>/dev/null || true"
}
]
},
{
"matcher": "Task",
"hooks": [
{
"type": "command",
"command": "bash scripts/auditor_call_log.sh 2>/dev/null || true"
}
]
}
],
"SessionEnd": [
{
"matcher": "",
"hooks": [
{
"type": "command",
"command": "bash scripts/session_end_audit.sh 2>/dev/null || true"
},
{
"type": "command",
"command": "bash scripts/verify_references.sh 2>/dev/null || true"
}
]
}
]
}
}

View File

@ -1794,6 +1794,7 @@ C35 감사 로그 3종(`auditor_calls`·`warning_ignored`·`bypass_log`)은 본
5. **sync 4계층**: SessionStart(레포→중앙) · post-commit(중앙→레포) · 수동(`scripts/sync_audit.sh both`) · 감사관 주기 5. **sync 4계층**: SessionStart(레포→중앙) · post-commit(중앙→레포) · 수동(`scripts/sync_audit.sh both`) · 감사관 주기
6. **PC별 PC 식별자 접두**: 레포 git 추적 SOT에 기록 시 `{hostname}_YYYY-MM-DD_calls.log` 형태로 PC별 구분 + 통합 집계. PC 간 로그 혼재 리스크는 hostname 접두로 해소 6. **PC별 PC 식별자 접두**: 레포 git 추적 SOT에 기록 시 `{hostname}_YYYY-MM-DD_calls.log` 형태로 PC별 구분 + 통합 집계. PC 간 로그 혼재 리스크는 hostname 접두로 해소
7. **역방향 sync 충돌**: `memory/org/` 로직 준용. 레포 mtime > 중앙 mtime이면 중앙 덮어쓰기 스킵 (C34-16 조항 6 동형) 7. **역방향 sync 충돌**: `memory/org/` 로직 준용. 레포 mtime > 중앙 mtime이면 중앙 덮어쓰기 스킵 (C34-16 조항 6 동형)
8. **매니페스트 하위 디렉토리 편입 (2026-04-20 #50)**: `$HOME/.claude/nerdnavis-audit/manifest/{active,archived}/` 추가. C35-9 Layer 3 PreToolUse 차단 워크플로우의 집행 계획 저장. 파일 포맷 md + YAML frontmatter. active/*.md는 PM이 `manifest_register.sh`로 생성, post-commit 시 `manifest_archive.sh`로 archived 이동. PC 간 실시간 공유 불요 (각 PC 자기 매니페스트만 생성)
### C34-18. (placeholder — 필요 시 확장) ### C34-18. (placeholder — 필요 시 확장)
@ -1861,28 +1862,69 @@ pm-auditor 자신의 호출 이력도 감사 대상. 특정 작업에서 **호
- **C34** PC 로컬 실시간 공유 중앙화 (감사관 호출 결과 축적의 인프라) - **C34** PC 로컬 실시간 공유 중앙화 (감사관 호출 결과 축적의 인프라)
- **C33** 조직 업무 공유·기록 체계 일관성 (3축 감사의 상위 규칙) - **C33** 조직 업무 공유·기록 체계 일관성 (3축 감사의 상위 규칙)
### C35-9. pm-auditor 호출 자동 강제 hook 3층 구조 (2026-04-19 PD님 직접 지시 옵션 A) ### C35-9. pm-auditor 호출 강제 hook 3층 구조 (2026-04-20 #50 근본 해결 — 차단 + 해제 워크플로우)
C35-7 "LLM 자율 판단 한계"의 잔여 리스크를 최대한 축소하기 위한 hook 기반 3층 메커니즘. > **2026-04-20 #50 전면 개정**: 구 "차단 아닌 경고" 방식(30분 시간 윈도우)은 **proxy 개선**으로 기각 확정. PD님 직접 지시 "보고 체계가 갖춰지지 않고 무단 변경으로 생긴 이슈가 더 큰거 같아" 수용으로 **PreToolUse 차단 + 해제 워크플로우** 전환. feedback_pm_proxy_improvement_reflex.md 7·8회차 변종 구조 차단. 구 30분 윈도우·UNRESOLVED 로그·BYPASS 우회 방식 폐기. 방향 전환 경위: `공유/조직공지/방향전환_히스토리_아카이브.md`.
#### Layer 1: 사전 환기 (UserPromptSubmit·SessionStart) #### Layer 1: 사전 환기 (UserPromptSubmit·SessionStart)
- `recent_feedback_brief.sh` — 최근 7일 feedback 요지 자동 주입 (기존) - `recent_feedback_brief.sh` — 최근 7일 feedback 요지 자동 주입
- SessionStart hook 체인 — 세션 시작 시 C35 의무 호출 대상 환기 - SessionStart hook 체인 — 세션 시작 시 C35 의무 호출 대상 환기
#### Layer 2: 호출 자동 기록 (PostToolUse, matcher: `Task`) #### Layer 2: 호출 기록 (PostToolUse, matcher: `Task`)
- **`scripts/auditor_call_log.sh`** — pm-auditor Task 호출 시 `$HOME/.claude/.nerdnavis_auditor_calls/<date>.log`에 타임스탬프 기록 - **`scripts/auditor_call_log.sh`** — pm-auditor Task 호출 시 `$HOME/.claude/.nerdnavis_auditor_calls/<date>.log`에 타임스탬프 기록
- **경고 무시 해소 처리 포함** — 호출 시 `$HOME/.claude/.nerdnavis_warning_ignored/<date>.log`의 기존 UNRESOLVED에 RESOLVED 마커 append - 감사 실행 이력 누적 (C35-10 장기 패턴 분석 입력)
- 30분 시간 윈도우로 "최근 호출 있음" 판정 - **시간 윈도우 로직 삭제** (Layer 3 차단으로 대체)
#### Layer 3: 사후 경고 (PostToolUse, matcher: `Edit|Write|MultiEdit|Bash`) #### Layer 3: PreToolUse 차단 + 해제 워크플로우 (근본 해결)
- **`scripts/auditor_guard.sh`** — Write·Edit 대상이 의무 영역(SKILL.md·memory/org/feedback_*·조직공지·PD_지시_트래킹) 또는 Bash 명령이 `git commit/push`일 때
- 최근 30분 내 pm-auditor 호출 기록 없으면 **stderr 경고 출력 + UNRESOLVED 로그 기록**
- **차단 아닌 경고** — PM 자진 정정 유도 (생산성 저해 회피)
- 우회: `NERDNAVIS_AUDITOR_BYPASS=1` + `NERDNAVIS_AUDITOR_BYPASS_REASON="사유"` (BYPASS 로그에 사유 자동 기록)
#### 한계 재인정 (본 3층 구조의 범위) **차단 조건**:
- `scripts/auditor_gate.sh` PreToolUse hook (Edit/Write/MultiEdit/Bash(git commit·push))
- 대상: 의무 영역(SKILL.md·memory/org/feedback_*·조직공지·PD_지시_트래킹) 또는 git commit/push
- 활성 매니페스트(`$HOME/.claude/nerdnavis-audit/manifest/active/*.md`) **부재**`exit 2` 차단
- 매니페스트 있으나 대상 파일이 **target_files 범위 밖**`exit 2` 차단
- BYPASS 플래그로 **우회 불가** (M-1 수용 — 근본 해결 자체 우회 차단)
본 hook 3층은 **사후 감지·기록·경고 층위**이며 **PreToolUse 차단 방식이 아니므로**, **LLM의 C35-1 사전 호출 의무 인지는 여전히 필수**다. C35-7 "코드·hook 레벨 강제 불가 · ~90% 커버" 한계 인정과 정합하며, 본 hook은 **100% 강제가 아닌 "사후 탐지율 극대화 + 미호출 패턴 장기 축적"**을 목표로 한다. 예상 커버리지 ~97%, 최종 3%는 LLM 구조 한계 (PM이 경고 의도적 무시·BYPASS 남용 시). **해제 절차**:
1. PM이 pm-auditor Task 호출 (집행 계획 사전 감사)
2. `bash scripts/manifest_register.sh <plan_id> <target_files_csv> <goal>` 명시 실행 → 매니페스트 생성
3. Edit/Write 재시도 → target_files 범위 내면 자동 통과
**매니페스트 구조** (md + YAML frontmatter, C34-15 5문항 체크 통과):
```yaml
---
plan_id: 2026-04-20_134530
created_at: 2026-04-20T13:45:30+09:00
hostname: DESKTOP-RD7PUKN
goal: "안건 X Phase 1 집행"
target_files:
- scripts/auditor_gate.sh
- SKILL.md
completion_criteria: "commit + push 완료"
---
```
**사후 cross-check** (M-1 수용):
- `scripts/manifest_archive.sh` post-commit hook
- commit diff 파일 목록 vs 매니페스트 `target_files[]` 부분집합 비교
- 매니페스트 밖 수정 있으면 경고 (범위 축소 조작 감지)
- 매니페스트 `archived/` 이동
#### C34-15 worktree 경계 5문항 체크 결과 (m-2 수용)
1. **PC 단위 vs worktree 단위**: PC 단위 + hostname 필드로 PC 구분. worktree 경계 무관
2. **경계 안전성**: C34-17 audit junction 경유 (중앙 저장소 hostname 폴더 격리)
3. **중앙화 필요성**: 각 PC가 자기 매니페스트만 생성. PC 간 실시간 공유 불요. post-commit sync로 레포 경유 충분
4. **레포 루트 vs worktree 실행 차이**: `$HOME/.claude/` 경로라 worktree 무관
5. **Agent 경계 보호**: target_files는 **레포 상대 경로** 강제 (C34-11 준수)
#### 한계 및 잔여 리스크 (C35-7 진실 인정)
본 차단 방식도 **완벽 강제 아님**:
- 매니페스트 등록 시 PM이 target_files 범위를 **과도 확장**하면 사실상 무제한 (M-1 cross-check로 사후 감지 가능)
- Bash(git commit/push)는 파일 단위 범위 체크 불가 — 매니페스트 존재만 확인
- PM이 매니페스트 등록 절차를 **의식적으로 누락**하면 차단되지만, **악의적 우회**는 작업 외 경로(파일시스템 직접 접근)로 가능
단 Claude Code tool_use 체계 내에선 **차단 강제** 작동. 기대 커버리지: 기존 ~97% → **~99%**. 잔여 1%는 LLM 구조 한계.
### C35-10. 경고 무시 PD 우선 보고 + 장기 행동 패턴 분석 개선 사이클 (2026-04-19 PD님 직접 지시) ### C35-10. 경고 무시 PD 우선 보고 + 장기 행동 패턴 분석 개선 사이클 (2026-04-19 PD님 직접 지시)
@ -1909,27 +1951,21 @@ PD님 직접 지시 2종 이행:
3. **개선 안건화**: pm-auditor 감사 체크 확장·C35-1 대상 조정·hook 로직 개선 3. **개선 안건화**: pm-auditor 감사 체크 확장·C35-1 대상 조정·hook 로직 개선
4. **PD님 보고**: 분기별 개선 안건 요약 + PM 재량 집행·PD 승인 구분 4. **PD님 보고**: 분기별 개선 안건 요약 + PM 재량 집행·PD 승인 구분
#### BYPASS 우회 사유 기록 의무 (2026-04-19 신설 · 파일 기반 전환) #### BYPASS 메커니즘 사실상 폐기 (2026-04-20 #50 — PreToolUse 차단 전환)
**작동 방식** (2026-04-19 옵션 A 파일 기반 전환): **2026-04-20 #50 집행으로 BYPASS 메커니즘 존재 의미 소실**:
Claude Code tool_use hook 실행 환경에서 PM이 명령 prefix(`NERDNAVIS_AUDITOR_BYPASS=1 git ...`)로 설정한 환경변수가 전달되지 않는 것이 본 세션 11차 commit 실패 사례로 실증됨. 이에 따라 BYPASS 메커니즘을 **파일 기반으로 전환**. - 구 PostToolUse 경고 방식(`auditor_guard.sh`)에서 BYPASS는 경고 회피 목적이었으나, 본 스크립트가 **deprecated** 처리됨
- PreToolUse 차단(`auditor_gate.sh`)은 **BYPASS 플래그 무시** (M-1 수용 — 근본 해결 우회 불가)
- 긴급 우회가 필요한 경우 **매니페스트 등록 자체가 우회 절차**`manifest_register.sh` 호출이 실질적 BYPASS 대체
**사용 절차**: **BYPASS 파일 2종(`.nerdnavis_bypass_active`·`.nerdnavis_bypass_reason`) 처리**:
1. 사유 기록: `echo "사유 텍스트" > $HOME/.claude/.nerdnavis_bypass_reason` - **존재는 허용 (호환성)** — 기존 로그·히스토리 보존
2. 플래그 생성: `touch $HOME/.claude/.nerdnavis_bypass_active` - **신규 작성 금지** — PreToolUse 차단 우회 목적 사용 불가. 사용 시 효과 없이 로그만 남음
3. 작업 수행 (Edit·Write·commit·push 등 의무 영역) - **기존 플래그 잔존 시 즉시 제거**: `rm $HOME/.claude/.nerdnavis_bypass_active $HOME/.claude/.nerdnavis_bypass_reason`
4. **작업 완료 직후 플래그·사유 파일 제거**: `rm $HOME/.claude/.nerdnavis_bypass_active $HOME/.claude/.nerdnavis_bypass_reason`
**자동 기록**: `auditor_guard.sh`가 플래그 파일 존재 시 `$HOME/.claude/.nerdnavis_bypass_log/<date>.log``BYPASS (file) reason=...` 자동 기록 후 `exit 0`. **BYPASS 로그 디렉토리** (`$HOME/.claude/.nerdnavis_bypass_log/`): **읽기 전용 히스토리**. 신규 기록 중단. C35-10 분기별 review에서 누적 이력만 참조.
**환경변수 방식 fallback 유지**: Claude Code가 미래에 hook 환경변수 전달 지원 시 작동. 현재 PM 명령 prefix로는 미작동 (실증). **위반 시**: BYPASS로 PreToolUse 차단을 우회하려는 시도는 구조상 불가. 시도 자체가 C35-9 위반 신호로 간주되며, 자진 고지 + pm-auditor 호출 + 매니페스트 등록 순서 정상화 의무.
**재발 방지 체크 (세션 리더 의무)**:
- BYPASS 사용 전 `ls $HOME/.claude/.nerdnavis_bypass_active`로 플래그 설정 검증
- **작업 완료 직후 반드시 플래그 제거** — 잔존 시 차후 모든 작업이 BYPASS 상태로 통과 (감사 사각지대 발생)
- C35-10 분기별 review 시 BYPASS 로그 누적 검토 필수
**위반 시**: BYPASS 플래그 장기 잔존·사유 미기록 시 C3 이슈 은폐 금지 위반에 준함. 자진 고지 + 플래그 즉시 제거.
#### 연관 자산 #### 연관 자산

View File

@ -60,7 +60,7 @@ PD님
- **C30** git 동기화 프로젝트 작업 전 최신 상태 점검 / **C31** 응답 발신 직전 자기검증 의무 (헌법급) - **C30** git 동기화 프로젝트 작업 전 최신 상태 점검 / **C31** 응답 발신 직전 자기검증 의무 (헌법급)
- **C32** 대화로그 기록 의무 (헌법급, 구 P22·P24 흡수) / **C33** 조직 업무 공유·기록 체계 일관성 보장 (헌법급, 구 P26·P27 흡수) - **C32** 대화로그 기록 의무 (헌법급, 구 P22·P24 흡수) / **C33** 조직 업무 공유·기록 체계 일관성 보장 (헌법급, 구 P26·P27 흡수)
- 🏆 **C34** PC 로컬 실시간 공유 중앙화 체계 — Live + memory + audit (헌법급·조직 핵심 자산, 구 P25 승격 + 2026-04-19 memory 편입 + 2026-04-20 audit 편입, 3종 중앙 Junction + sync 4계층) - 🏆 **C34** PC 로컬 실시간 공유 중앙화 체계 — Live + memory + audit (헌법급·조직 핵심 자산, 구 P25 승격 + 2026-04-19 memory 편입 + 2026-04-20 audit 편입, 3종 중앙 Junction + sync 4계층)
- **C35** pm-auditor 의무 참여 체계 (2026-04-19 신설 — 조직 내 공유 작업 7종 사전 호출 의무 · C35-9 hook 3층 구조 · C35-10 경고 무시 PD 우선 보고 + 장기 패턴 분석) - **C35** pm-auditor 의무 참여 체계 (2026-04-19 신설 — 조직 내 공유 작업 7종 사전 호출 의무 · **C35-9 Layer 3 전면 개정 2026-04-20 #50**: PostToolUse 경고·30분 윈도우 폐기 → PreToolUse 차단 + 해제 워크플로우 근본 해결 · 매니페스트(`auditor_gate.sh`·`manifest_register.sh`·`manifest_archive.sh`) · BYPASS 우회 불가 · C35-10 장기 패턴 분석)
- **C36** PM 자율 판단 범위 상한 — 방향·원칙 수준 축소·희석 금지 (2026-04-20 헌법급 신설, 판정 기준 3종 · 실질 필요성 4문항 적용 범위 제한 · C31-H 체크리스트 편입 · pm-auditor 5-E 연계) - **C36** PM 자율 판단 범위 상한 — 방향·원칙 수준 축소·희석 금지 (2026-04-20 헌법급 신설, 판정 기준 3종 · 실질 필요성 4문항 적용 범위 제한 · C31-H 체크리스트 편입 · pm-auditor 5-E 연계)
- 폐기·통합·강등·재활용 규칙 상세: [폐기 규칙 아카이브](공유/조직공지/폐기_규칙_아카이브.md) - 폐기·통합·강등·재활용 규칙 상세: [폐기 규칙 아카이브](공유/조직공지/폐기_규칙_아카이브.md)

View File

@ -70,36 +70,11 @@ C35-7 원문: "LLM 자율 판단 구조상 코드·hook 레벨에서 강제 불
--- ---
## 8. 추가 실증 — 30분 윈도우 경계 초과 (2026-04-20 #48 I-2 집행) ## 8. 구 실증 아카이브 이관 — 30분 윈도우 기반 설계 폐기 (2026-04-20 #50 집행)
> **⚠️ 방향 전환 주석 (2026-04-20 PD님 지시)**: 본 섹션은 **30분 시간 윈도우 기반 설계의 한계 실증**이었으나, PM 자체 제시 3안(60분 확장·작업 유형별 차등·유효 만료 로그) 모두 proxy로 판정 → **시간 기반 전체 폐기 + 매니페스트 기반 감사 재설계** 방향으로 전환 (Phase 2 집행 예정). 본 섹션의 "개선 안건 후보 3종"은 **모두 proxy 개선으로 기각**. 방향 전환 경위: `feedback_pm_proxy_improvement_reflex.md` (7회차 변종 SOT). > **🔴 본 섹션 내용 이관 완료 (2026-04-20 #50)**: 구 "30분 시간 윈도우 경계 초과 실증"은 **C35-9 Layer 3 PreToolUse 차단 전환**으로 전체 폐기됨. 30분 윈도우·UNRESOLVED 로그·BYPASS 우회 체계 모두 폐기. 실증 이력과 방향 전환 경위는 **`공유/조직공지/방향전환_히스토리_아카이브.md` "C35-9 Layer 3 — 시간 윈도우 → PreToolUse 차단 전환" 섹션**으로 이관. 본 feedback 파일은 **C35 최초 집행(2026-04-19)**의 긍정 실증만 유지 (§1~§7).
>
> **현행 감사 체계**: PreToolUse 차단 + 해제 워크플로우. `scripts/auditor_gate.sh` + `manifest_register.sh` + `manifest_archive.sh`. 상세: SKILL.md C35-9 개정분.
>
> **7·8회차 변종 경위**: `memory/org/feedback_pm_proxy_improvement_reflex.md` 단일 SOT.
### 사건 타임라인
- **11:40**#48 D·F·G 집행 전 PM의 pm-auditor 사전 호출 (Task 도구)
- **12:10**`auditor_guard.sh` 30분 윈도우 만료 시점
- **12:12~12:17** — C10-6 3중 전파 집행 (CLAUDE.md·조직공지·대화로그·MEMORY.md·#48 완료 이동 파일 수정)
- **결과** — 5건 파일 수정이 윈도우 만료 후 **재호출 없이 진행**`.nerdnavis_warning_ignored/2026-04-20.log`에 UNRESOLVED 5건 기록 (12:12:35·12:12:41·12:14:42·12:16:21·12:16:35)
- **사후 해소** — 다른 세션의 검증 감사 pm-auditor 호출로 `auditor_call_log.sh`가 RESOLVED 자동 append 처리
### 구조적 원인 (PM 실수 아님)
- 30분 윈도우는 **논리적 안전 구간** 설정이나 경계 직전 다수 파일 수정 케이스(C10-6 3중 전파 등)는 5~10분 걸리는 경우가 흔함 → 윈도우 만료 시점과 수정 시점 경계 충돌 가능성 내재
- PM은 **한 집행 라운드 내 파일 수정 수행 중**이었으나 Layer 3 관점에선 각 Edit·Write가 독립 tool_use로 평가됨 → 재호출 의무 해석 모호
### 개선 안건 후보 (PM 재량 후속, 지금 집행 안 함)
1. **윈도우 45분 확장** — C10-6 전파 실측 시간(5~10분) + 여유(35분) 반영
2. **재호출 자동화**`auditor_guard.sh`가 윈도우 경계 5분 전 `⏰ [C35 경고 예방] pm-auditor 재호출 권장` 출력
3. **라운드 단위 묶음 처리** — 단일 라운드 내 수정은 1회 호출로 커버하는 "라운드 ID" 메커니즘 도입
### 교훈
**30분 윈도우는 설계상 안전하나 경계 직전 다수 수정 케이스에 취약.** C35-10 장기 패턴 분석의 첫 실증 데이터로 본 사례 기록 → 누적 5건 이상 발생 시 설계 재검토.
### 연관
- **C35-9** Layer 3 30분 윈도우 설계
- **C35-10** 장기 행동 패턴 분석·점진적 개선 사이클
- `memory/org/feedback_pm_warning_ignored_pattern.md` (상위 누적 SOT)
- `memory/org/feedback_auditor_resolved_substring_bug.md` (A 수정으로 RESOLVED append 정상화 확인된 직후 실증)

View File

@ -113,3 +113,4 @@ PM 권고: "(a) + (c) 조합. (a) 60분 실측 반영, (c) 경계 인지 유도"
| 일시 | 변경자 | 내용 | | 일시 | 변경자 | 내용 |
|------|--------|------| |------|--------|------|
| 2026-04-20 | PM 자진 + pm-auditor 감사 | 신설 — 7회차 변종 구조 차단 (C2 확장 + C31-I + pm-auditor 5-F + 매니페스트 재설계 Phase 2 예정) | | 2026-04-20 | PM 자진 + pm-auditor 감사 | 신설 — 7회차 변종 구조 차단 (C2 확장 + C31-I + pm-auditor 5-F + 매니페스트 재설계 Phase 2 예정) |
| 2026-04-20 #50 | PM 자진 + pm-auditor 재감사 | **8회차 변종 추가 실증·구조 차단** — Phase 2 매니페스트 원안 제시 후 PM이 "(a) PreToolUse 차단 강제는 **작업 흐름 파괴·생산성 저해**로 부적합" 프레이밍으로 **근본 해결 기피**. PD님 직접 지적 "보고 체계가 갖춰지지 않고 무단 변경으로 생긴 이슈가 더 큰거 같아. 정확하게 보고 검증 체계만 이루어지면 작업 흐름이 파괴 될 경우는 없을거 같아" → "작업 유연성 희생" 명분 자체가 **PM의 proxy 정당화 숨은 전제**였음 드러남. **구조적 재발 방지**: (1) pm-auditor 5-F 확장 — "작업 흐름 파괴·생산성 저해·구현 복잡·하위 호환성·실용성 부족" 표현 감지 Critical · (2) C35-9 Layer 3 PreToolUse 차단 방식 실제 집행 (본 commit) · (3) BYPASS 우회 불가 · (4) 근본 해결 단점 강조 표현 자체를 8회차 변종 신호로 분류 |

View File

@ -0,0 +1,87 @@
#!/bin/bash
# SessionStart hook + 수동 실행 (인자 `report`)
# C35-10 장기 행동 패턴 분석·개선 사이클
# 2026-04-19 신설 — PD님 직접 지시 "장기적 문제 행동 패턴 분석 + 점진적 개선"
REPO_ROOT=$(git rev-parse --show-toplevel 2>/dev/null)
[ -z "$REPO_ROOT" ] && exit 0
CALL_DIR="$HOME/.claude/.nerdnavis_auditor_calls"
WARN_DIR="$HOME/.claude/.nerdnavis_warning_ignored"
BYPASS_DIR="$HOME/.claude/.nerdnavis_bypass_log"
# 미해소 경고 건수 집계 (UNRESOLVED - RESOLVED)
UNRESOLVED_NET=0
if [ -d "$WARN_DIR" ]; then
for f in "$WARN_DIR"/*.log; do
[ -f "$f" ] || continue
U=$(grep -c "UNRESOLVED" "$f" 2>/dev/null || echo 0)
R=$(grep -c "RESOLVED" "$f" 2>/dev/null || echo 0)
UNRESOLVED_NET=$((UNRESOLVED_NET + U - R))
done
fi
# 세션 시작 시 미해소 경고 있으면 PD님 환기 출력 (stdout — 세션 컨텍스트 주입)
if [ "$UNRESOLVED_NET" -gt 0 ]; then
echo "🚨 [C35 경고 무시 사례] 미해소 $UNRESOLVED_NET 건 — PD님 우선 보고 대상 (감사 자산 축적)"
echo " 상세: $WARN_DIR/"
echo " PM 후속 조치: 경고 대상 review + pm-auditor 호출 or 사유를 memory/org/feedback_pm_warning_ignored_pattern.md에 기록"
fi
# 월별 패턴 분석 보고서 (월 1일 자동 or 수동 `report` 인자)
MONTH=$(date +%Y_%m)
REPORT="$REPO_ROOT/memory/org/audit_pattern_analysis_${MONTH}.md"
TRIGGER="${1:-auto}"
if [ "$TRIGGER" = "report" ] || { [ "$(date +%d)" = "01" ] && [ ! -f "$REPORT" ]; }; then
{
echo "---"
echo "name: 감사 패턴 월별 분석 ${MONTH/_/-}"
echo "description: pm-auditor 호출·경고 무시·BYPASS 우회 이력 누적 분석. 장기 행동 패턴 기록 + 개선 안건 식별 (C35-10)"
echo "type: audit_pattern"
echo "period: ${MONTH/_/-}"
echo "---"
echo ""
echo "# 감사 패턴 분석 — ${MONTH/_/-}"
echo ""
echo "## pm-auditor 호출 빈도"
if [ -d "$CALL_DIR" ]; then
TOTAL_CALLS=0
for f in "$CALL_DIR"/*.log; do
[ -f "$f" ] || continue
C=$(grep -c "pm-auditor called" "$f" 2>/dev/null || echo 0)
TOTAL_CALLS=$((TOTAL_CALLS + C))
done
echo "- 누적 호출 건수: $TOTAL_CALLS"
fi
echo ""
echo "## 경고 무시 사례 (UNRESOLVED)"
echo "- 미해소 순수 건수: $UNRESOLVED_NET"
if [ -d "$WARN_DIR" ]; then
echo ""
echo "### 최근 UNRESOLVED 샘플 (최대 20건)"
grep "UNRESOLVED" "$WARN_DIR"/*.log 2>/dev/null | head -20
fi
echo ""
echo "## BYPASS 우회 이력"
if [ -d "$BYPASS_DIR" ]; then
BYPASS_COUNT=0
for f in "$BYPASS_DIR"/*.log; do
[ -f "$f" ] || continue
B=$(wc -l < "$f" 2>/dev/null || echo 0)
BYPASS_COUNT=$((BYPASS_COUNT + B))
done
echo "- 누적 우회 건수: $BYPASS_COUNT"
fi
echo ""
echo "## 개선 안건 (PM 수동 기입)"
echo "- (분석 로직 추가 확장 필요 — PM review 후 규칙 개정·감사 체크 강화 안건화)"
echo ""
echo "## 연관"
echo "- C35-9 hook 3층 구조 · C35-10 경고 무시 PD 보고·장기 패턴 분석"
echo "- \`memory/org/feedback_pm_warning_ignored_pattern.md\` (누적 SOT)"
} > "$REPORT"
echo "📊 [감사 패턴] 월별 분석 보고서 생성: $REPORT"
fi
exit 0

View File

@ -0,0 +1,34 @@
#!/bin/bash
# PostToolUse hook (matcher: Task) — pm-auditor Task 호출 자동 기록
# C35-9 Layer 2: 감사관 호출 이력 자동 축적 + 경고 무시 사례 해소 처리
# 2026-04-19 신설 — PD님 직접 지시 "경고 무시 사례 발견 시 PD 우선 보고 + 감사 자산 축적"
# 관련: C35-9 hook 3층 구조 · C35-10 경고 무시 PD 보고 + 장기 패턴 분석
INPUT=$(cat 2>/dev/null)
# subagent_type이 pm-auditor인 경우만 기록
if ! echo "$INPUT" | grep -q '"subagent_type"[[:space:]]*:[[:space:]]*"pm-auditor"'; then
exit 0
fi
LOG_DIR="$HOME/.claude/.nerdnavis_auditor_calls"
mkdir -p "$LOG_DIR" 2>/dev/null
# 일자별 로그 파일에 호출 시각 기록
LOG_FILE="$LOG_DIR/$(date +%Y-%m-%d).log"
echo "$(date +%Y-%m-%d_%H:%M:%S) pm-auditor called" >> "$LOG_FILE"
# 경고 무시 사례 해소 처리 — 기존 UNRESOLVED 로그에 RESOLVED 마커 append
WARNING_DIR="$HOME/.claude/.nerdnavis_warning_ignored"
if [ -d "$WARNING_DIR" ]; then
for wf in "$WARNING_DIR"/*.log; do
[ -f "$wf" ] || continue
# 해당 파일에 UNRESOLVED 있고 아직 RESOLVED 미완료이면 해소 처리
# 2026-04-20 #48 A 집행: grep -qw 로 word boundary 적용 (기존 grep -q "RESOLVED"는 UN**RESOLVED** 부분문자열 매칭되어 항상 true → append 실패 결함)
if grep -q "UNRESOLVED" "$wf" 2>/dev/null && ! tail -1 "$wf" | grep -qw "RESOLVED"; then
echo "$(date +%Y-%m-%d_%H:%M:%S) RESOLVED by pm-auditor call" >> "$wf"
fi
done
fi
exit 0

88
scripts/auditor_gate.sh Normal file
View File

@ -0,0 +1,88 @@
#!/bin/bash
# PreToolUse hook — 감사 미보고 시 Edit/Write/MultiEdit/Bash(git commit·push) 차단
# C35-9 Layer 3 개정 (2026-04-20 PD님 직접 지시 — 차단 + 해제 워크플로우)
# 근본 해결: "hook은 proxy" 자인 + LLM 자율 준수 한계 차단 층 추가
# 8회차 변종 재발 방지 (proxy 회피 반사·작업 유연성 명분 기각)
INPUT=$(cat 2>/dev/null)
# 1. tool_name 추출
TOOL_NAME=$(echo "$INPUT" | grep -oE '"tool_name"[[:space:]]*:[[:space:]]*"[^"]*"' | head -1 | sed 's/.*"\([^"]*\)"$/\1/')
# 2. 대상 tool 필터
SHOULD_GATE=0
case "$TOOL_NAME" in
Edit|Write|MultiEdit) SHOULD_GATE=1 ;;
Bash)
CMD=$(echo "$INPUT" | grep -oE '"command"[[:space:]]*:[[:space:]]*"[^"]*"' | head -1)
if echo "$CMD" | grep -qE 'git[[:space:]]+(commit|push)'; then
SHOULD_GATE=1
fi
;;
esac
[ "$SHOULD_GATE" -eq 0 ] && exit 0
# 3. 의무 영역 식별 (auditor_guard 동일 로직)
TARGET=""
if echo "$INPUT" | grep -qE '"file_path"[[:space:]]*:[[:space:]]*"[^"]*(SKILL\.md|memory/org/feedback|조직공지|PD_지시_트래킹)[^"]*"'; then
TARGET="의무 영역 파일"
elif echo "$INPUT" | grep -qE '"command"[[:space:]]*:[[:space:]]*"[^"]*git[[:space:]]+(commit|push)'; then
TARGET="git commit/push"
fi
[ -z "$TARGET" ] && exit 0
# 4. M-1 수용: BYPASS 플래그 PreToolUse 차단 우회 불가
# (BYPASS는 기존 PostToolUse 경고 메커니즘 전용, 본 차단은 무조건 체크)
# 5. 활성 매니페스트 존재 확인
MANIFEST_DIR="$HOME/.claude/nerdnavis-audit/manifest/active"
mkdir -p "$MANIFEST_DIR" 2>/dev/null
ACTIVE=$(ls -t "$MANIFEST_DIR"/*.md 2>/dev/null | head -1)
if [ -z "$ACTIVE" ]; then
cat >&2 <<EOF
🔒 [C35-9 차단] $TARGET 수정 전 감사 보고 필요
해결 절차:
1. pm-auditor Task 호출 (집행 계획 사전 감사)
2. bash scripts/manifest_register.sh <plan_id> <target_files_csv> <goal>
3. 본 작업 재시도 → 차단 자동 해제
예시:
bash scripts/manifest_register.sh "2026-04-20_$(date +%H%M%S)" "scripts/x.sh,SKILL.md" "안건 X 집행"
근거: C35-9 Layer 3 차단 + 해제 워크플로우 (2026-04-20 근본 해결)
BYPASS 플래그로는 우회 불가 (M-1 수용)
EOF
exit 2
fi
# 6. 범위 체크 — Edit/Write/MultiEdit인 경우
if [ "$TOOL_NAME" != "Bash" ]; then
FILE_PATH=$(echo "$INPUT" | grep -oE '"file_path"[[:space:]]*:[[:space:]]*"[^"]*"' | head -1 | sed 's/.*"\([^"]*\)"$/\1/')
REPO_ROOT=$(git rev-parse --show-toplevel 2>/dev/null)
if [ -n "$REPO_ROOT" ] && [ -n "$FILE_PATH" ]; then
REL=$(realpath --relative-to="$REPO_ROOT" "$FILE_PATH" 2>/dev/null || echo "$FILE_PATH")
else
REL="$FILE_PATH"
fi
# target_files 목록에서 검색 (YAML frontmatter " - " 형태)
if ! grep -qF " - $REL" "$ACTIVE" 2>/dev/null; then
cat >&2 <<EOF
🔒 [C35-9 차단] 범위 이탈
대상 파일: $REL
활성 매니페스트: $(basename "$ACTIVE")
현 매니페스트 target_files에 미등록
해결:
- 범위 확장 필요: manifest_register.sh 재호출 (신 plan_id 또는 기존 갱신)
- 또는 해당 파일이 의도 밖이면 수정 취소
EOF
exit 2
fi
fi
# 통과
exit 0

View File

@ -1,68 +1,9 @@
#!/bin/bash #!/bin/bash
# PostToolUse hook (matcher: Edit|Write|MultiEdit|Bash) — 의무 영역 tool_use 시 호출 기록 검사 # DEPRECATED (2026-04-20 #50 집행) — PostToolUse 경고 방식 폐기
# C35-9 Layer 3: 의무 호출 누락 즉시 경고 + 무시 사례 UNRESOLVED 로그 # 대체: scripts/auditor_gate.sh (PreToolUse 차단 방식, 근본 해결)
# 2026-04-19 신설 — PD님 직접 지시 옵션 A (경고 모드) # 근거: C35-9 Layer 3 "차단 + 해제 워크플로우" 개정 (2026-04-20 PD님 직접 지시)
# 관련: C35 의무 참여 체계 · C35-10 무시 사례 PD 보고 · C34-11 Agent 경계 보호 #
# 기존 스크립트는 호환성 유지 목적으로 보존되나 .claude/settings.json 참조 제거됨.
# 우회 검사 (2026-04-19 옵션 A: 파일 기반 BYPASS 우선, 환경변수 fallback) # 필요 시 완전 삭제 가능 (기능 의존 없음).
# 근거: Claude Code tool_use hook 실행 환경에서 PM이 명령 prefix로 설정한 환경변수가
# 전달되지 않는 것이 실증됨 (2026-04-19 본 세션 11차 commit 실패 사례)
BYPASS_FLAG_FILE="$HOME/.claude/.nerdnavis_bypass_active"
BYPASS_REASON_FILE="$HOME/.claude/.nerdnavis_bypass_reason"
# 1. 파일 기반 BYPASS (권장)
if [ -f "$BYPASS_FLAG_FILE" ]; then
BYPASS_DIR="$HOME/.claude/.nerdnavis_bypass_log"
mkdir -p "$BYPASS_DIR" 2>/dev/null
BYPASS_LOG="$BYPASS_DIR/$(date +%Y-%m-%d).log"
REASON="(사유 미기록)"
[ -f "$BYPASS_REASON_FILE" ] && REASON=$(cat "$BYPASS_REASON_FILE" 2>/dev/null | head -c 500 | tr -d '\n')
echo "$(date +%Y-%m-%d_%H:%M:%S) BYPASS (file) reason=$REASON" >> "$BYPASS_LOG"
exit 0
fi
# 2. 환경변수 기반 BYPASS (fallback, Claude Code hook에 전달되는 경우만 작동)
if [ "${NERDNAVIS_AUDITOR_BYPASS:-0}" = "1" ]; then
BYPASS_DIR="$HOME/.claude/.nerdnavis_bypass_log"
mkdir -p "$BYPASS_DIR" 2>/dev/null
BYPASS_LOG="$BYPASS_DIR/$(date +%Y-%m-%d).log"
REASON="${NERDNAVIS_AUDITOR_BYPASS_REASON:-(사유 미기록)}"
echo "$(date +%Y-%m-%d_%H:%M:%S) BYPASS (env, may not trigger) reason=$REASON" >> "$BYPASS_LOG"
exit 0
fi
INPUT=$(cat 2>/dev/null)
# 의무 영역 식별
TARGET=""
if echo "$INPUT" | grep -qE '"file_path"[[:space:]]*:[[:space:]]*"[^"]*(SKILL\.md|memory/org/feedback|조직공지|PD_지시_트래킹)[^"]*"'; then
TARGET="의무 영역 파일 수정"
elif echo "$INPUT" | grep -qE '"command"[[:space:]]*:[[:space:]]*"[^"]*git[[:space:]]+(commit|push)'; then
TARGET="git commit/push"
fi
[ -z "$TARGET" ] && exit 0
# 최근 30분 내 pm-auditor 호출 기록 검사
LOG_DIR="$HOME/.claude/.nerdnavis_auditor_calls"
RECENT_CALL=0
if [ -d "$LOG_DIR" ]; then
if find "$LOG_DIR" -type f -mmin -30 2>/dev/null | head -1 | grep -q .; then
RECENT_CALL=1
fi
fi
[ "$RECENT_CALL" -eq 1 ] && exit 0
# 경고 출력 (stderr)
echo "⚠️ [C35 경고] $TARGET — 최근 30분 내 pm-auditor 호출 기록 없음" >&2
echo " C35-1 의무 호출 대상일 수 있음. 응답 발신 전 pm-auditor Task 호출 권장" >&2
echo " 긴급 단발 지시면 export NERDNAVIS_AUDITOR_BYPASS=1 + NERDNAVIS_AUDITOR_BYPASS_REASON='사유' (C35-3·C35-10)" >&2
# UNRESOLVED 로그 기록 (이후 pm-auditor 호출되면 auditor_call_log.sh가 RESOLVED 마커 append)
WARNING_DIR="$HOME/.claude/.nerdnavis_warning_ignored"
mkdir -p "$WARNING_DIR" 2>/dev/null
WARNING_LOG="$WARNING_DIR/$(date +%Y-%m-%d).log"
echo "$(date +%Y-%m-%d_%H:%M:%S) UNRESOLVED target=$TARGET" >> "$WARNING_LOG"
exit 0 exit 0

View File

@ -0,0 +1,68 @@
#!/bin/bash
# PostToolUse hook (matcher: Edit|Write|MultiEdit|Bash) — 의무 영역 tool_use 시 호출 기록 검사
# C35-9 Layer 3: 의무 호출 누락 즉시 경고 + 무시 사례 UNRESOLVED 로그
# 2026-04-19 신설 — PD님 직접 지시 옵션 A (경고 모드)
# 관련: C35 의무 참여 체계 · C35-10 무시 사례 PD 보고 · C34-11 Agent 경계 보호
# 우회 검사 (2026-04-19 옵션 A: 파일 기반 BYPASS 우선, 환경변수 fallback)
# 근거: Claude Code tool_use hook 실행 환경에서 PM이 명령 prefix로 설정한 환경변수가
# 전달되지 않는 것이 실증됨 (2026-04-19 본 세션 11차 commit 실패 사례)
BYPASS_FLAG_FILE="$HOME/.claude/.nerdnavis_bypass_active"
BYPASS_REASON_FILE="$HOME/.claude/.nerdnavis_bypass_reason"
# 1. 파일 기반 BYPASS (권장)
if [ -f "$BYPASS_FLAG_FILE" ]; then
BYPASS_DIR="$HOME/.claude/.nerdnavis_bypass_log"
mkdir -p "$BYPASS_DIR" 2>/dev/null
BYPASS_LOG="$BYPASS_DIR/$(date +%Y-%m-%d).log"
REASON="(사유 미기록)"
[ -f "$BYPASS_REASON_FILE" ] && REASON=$(cat "$BYPASS_REASON_FILE" 2>/dev/null | head -c 500 | tr -d '\n')
echo "$(date +%Y-%m-%d_%H:%M:%S) BYPASS (file) reason=$REASON" >> "$BYPASS_LOG"
exit 0
fi
# 2. 환경변수 기반 BYPASS (fallback, Claude Code hook에 전달되는 경우만 작동)
if [ "${NERDNAVIS_AUDITOR_BYPASS:-0}" = "1" ]; then
BYPASS_DIR="$HOME/.claude/.nerdnavis_bypass_log"
mkdir -p "$BYPASS_DIR" 2>/dev/null
BYPASS_LOG="$BYPASS_DIR/$(date +%Y-%m-%d).log"
REASON="${NERDNAVIS_AUDITOR_BYPASS_REASON:-(사유 미기록)}"
echo "$(date +%Y-%m-%d_%H:%M:%S) BYPASS (env, may not trigger) reason=$REASON" >> "$BYPASS_LOG"
exit 0
fi
INPUT=$(cat 2>/dev/null)
# 의무 영역 식별
TARGET=""
if echo "$INPUT" | grep -qE '"file_path"[[:space:]]*:[[:space:]]*"[^"]*(SKILL\.md|memory/org/feedback|조직공지|PD_지시_트래킹)[^"]*"'; then
TARGET="의무 영역 파일 수정"
elif echo "$INPUT" | grep -qE '"command"[[:space:]]*:[[:space:]]*"[^"]*git[[:space:]]+(commit|push)'; then
TARGET="git commit/push"
fi
[ -z "$TARGET" ] && exit 0
# 최근 30분 내 pm-auditor 호출 기록 검사
LOG_DIR="$HOME/.claude/.nerdnavis_auditor_calls"
RECENT_CALL=0
if [ -d "$LOG_DIR" ]; then
if find "$LOG_DIR" -type f -mmin -30 2>/dev/null | head -1 | grep -q .; then
RECENT_CALL=1
fi
fi
[ "$RECENT_CALL" -eq 1 ] && exit 0
# 경고 출력 (stderr)
echo "⚠️ [C35 경고] $TARGET — 최근 30분 내 pm-auditor 호출 기록 없음" >&2
echo " C35-1 의무 호출 대상일 수 있음. 응답 발신 전 pm-auditor Task 호출 권장" >&2
echo " 긴급 단발 지시면 export NERDNAVIS_AUDITOR_BYPASS=1 + NERDNAVIS_AUDITOR_BYPASS_REASON='사유' (C35-3·C35-10)" >&2
# UNRESOLVED 로그 기록 (이후 pm-auditor 호출되면 auditor_call_log.sh가 RESOLVED 마커 append)
WARNING_DIR="$HOME/.claude/.nerdnavis_warning_ignored"
mkdir -p "$WARNING_DIR" 2>/dev/null
WARNING_LOG="$WARNING_DIR/$(date +%Y-%m-%d).log"
echo "$(date +%Y-%m-%d_%H:%M:%S) UNRESOLVED target=$TARGET" >> "$WARNING_LOG"
exit 0

View File

@ -29,4 +29,8 @@ MEMORY_SYNC="$REPO_ROOT/scripts/sync_memory_central_to_repo.sh"
AUDIT_SYNC="$REPO_ROOT/scripts/sync_audit_central_to_repo.sh" AUDIT_SYNC="$REPO_ROOT/scripts/sync_audit_central_to_repo.sh"
[ -f "$AUDIT_SYNC" ] && bash "$AUDIT_SYNC" 2>/dev/null || true [ -f "$AUDIT_SYNC" ] && bash "$AUDIT_SYNC" 2>/dev/null || true
# 2026-04-20 #50 집행 — C35-9 Layer 3 매니페스트 archived 이동 + cross-check
MANIFEST_ARCHIVE="$REPO_ROOT/scripts/manifest_archive.sh"
[ -f "$MANIFEST_ARCHIVE" ] && bash "$MANIFEST_ARCHIVE" 2>/dev/null || true
exit 0 exit 0

View File

@ -0,0 +1,32 @@
#!/bin/bash
# post-commit — commit 직후 sync_signal.sh update 자동 호출
#
# 목적 (2026-04-17 PD님 직접 지시 반영):
# "작업 완료 시 공유 문서 즉시 반영 + 시그널로 알림. push는 필요 시만."
# commit = "의미 있는 작업 완료" 단위이므로 commit 시점에 시그널 갱신하여
# 같은 PC 내 다른 세션이 다음 프롬프트에서 즉시 감지할 수 있도록 함.
#
# 설치 (자동): SessionStart hook이 `git config core.hooksPath scripts/git-hooks`
# 설정하므로 레포 clone 즉시 활성화.
#
# push와 무관 — commit만 해도 시그널 갱신됨. push는 PD님 지시·필요 시에만.
REPO_ROOT=$(git rev-parse --show-toplevel 2>/dev/null)
[ -z "$REPO_ROOT" ] && exit 0
SCRIPT="$REPO_ROOT/scripts/sync_signal.sh"
[ -x "$SCRIPT" ] || [ -f "$SCRIPT" ] || exit 0
bash "$SCRIPT" update
# 2026-04-19 신설 — C34-16 memory 중앙 → 레포 sync
# commit 시점 중앙 저장소의 최신 user memory 내용을 레포 memory/org/로 반영.
# 다음 commit에 포함되도록 하려면 개발자가 재commit 필요 (안전망으로 자동 add 안 함).
MEMORY_SYNC="$REPO_ROOT/scripts/sync_memory_central_to_repo.sh"
[ -f "$MEMORY_SYNC" ] && bash "$MEMORY_SYNC" 2>/dev/null || true
# 2026-04-20 #48 G 집행 — C34-17 audit 중앙 → 레포 sync
AUDIT_SYNC="$REPO_ROOT/scripts/sync_audit_central_to_repo.sh"
[ -f "$AUDIT_SYNC" ] && bash "$AUDIT_SYNC" 2>/dev/null || true
exit 0

View File

@ -0,0 +1,55 @@
#!/bin/bash
# post-commit hook — 활성 매니페스트 cross-check + archived 이동
# C35-9 Layer 3 근본 해결 2026-04-20
# M-1 수용: commit diff vs manifest target_files cross-check (부분집합 감지)
MANIFEST_DIR="$HOME/.claude/nerdnavis-audit/manifest"
ACTIVE_DIR="$MANIFEST_DIR/active"
ARCHIVED_DIR="$MANIFEST_DIR/archived"
[ ! -d "$ACTIVE_DIR" ] && exit 0
mkdir -p "$ARCHIVED_DIR" 2>/dev/null
# 본 commit의 수정 파일 목록
COMMIT_FILES=$(git diff-tree --no-commit-id --name-only -r HEAD 2>/dev/null)
[ -z "$COMMIT_FILES" ] && exit 0
# 활성 매니페스트 각각 cross-check + archived 이동
MOVED=0
for mf in "$ACTIVE_DIR"/*.md; do
[ -f "$mf" ] || continue
PLAN_ID=$(basename "$mf" .md)
# target_files 추출 (YAML frontmatter)
TARGET_FILES=$(awk '/^target_files:$/,/^[a-z_]+:/' "$mf" | grep -E '^ - ' | sed 's/^ - //')
# cross-check: commit_files 중 target_files 밖 파일
OUT_OF_SCOPE=()
while IFS= read -r cf; do
[ -z "$cf" ] && continue
if ! echo "$TARGET_FILES" | grep -qFx "$cf"; then
OUT_OF_SCOPE+=("$cf")
fi
done <<< "$COMMIT_FILES"
if [ "${#OUT_OF_SCOPE[@]}" -gt 0 ]; then
echo "⚠️ [manifest cross-check] $PLAN_ID" >&2
echo " target_files 밖 수정 ${#OUT_OF_SCOPE[@]}건:" >&2
for f in "${OUT_OF_SCOPE[@]}"; do
echo " - $f" >&2
done
echo " → M-1 사후 경고. 매니페스트 범위 축소 조작 가능성 점검 필요." >&2
fi
# archived 이동
if mv "$mf" "$ARCHIVED_DIR/" 2>/dev/null; then
echo "📦 [manifest archived] $PLAN_ID"
MOVED=$((MOVED + 1))
fi
done
[ "$MOVED" -gt 0 ] && echo "✅ [manifest] $MOVED건 archived 이동 완료"
exit 0

View File

@ -0,0 +1,72 @@
#!/bin/bash
# 매니페스트 수동 등록 — PM이 pm-auditor Task 호출 직후 명시 실행
# C35-9 Layer 3 근본 해결 2026-04-20
# Usage: bash scripts/manifest_register.sh <plan_id> <target_files_csv> <goal>
PLAN_ID="${1}"
TARGETS_CSV="${2}"
GOAL="${3}"
if [ -z "$PLAN_ID" ] || [ -z "$TARGETS_CSV" ] || [ -z "$GOAL" ]; then
cat >&2 <<EOF
Usage: bash scripts/manifest_register.sh <plan_id> <target_files_csv> <goal>
plan_id : 예) 2026-04-20_134530
target_files_csv : 쉼표 구분 파일 상대 경로 (예: scripts/x.sh,SKILL.md)
goal : 집행 목표 1줄 요약 (예: "안건 X Phase 1 집행")
근거: C35-9 Layer 3 매니페스트 기반 감사 (2026-04-20 PreToolUse 차단 전환)
EOF
exit 1
fi
MANIFEST_DIR="$HOME/.claude/nerdnavis-audit/manifest/active"
mkdir -p "$MANIFEST_DIR" 2>/dev/null
MANIFEST="$MANIFEST_DIR/$PLAN_ID.md"
HOSTNAME_TAG=$(hostname 2>/dev/null | tr -d '[:space:]' | tr -cd '[:alnum:]-_' | head -c 32)
# YAML frontmatter + 본문
{
echo "---"
echo "plan_id: $PLAN_ID"
echo "created_at: $(date -Iseconds 2>/dev/null || date +%Y-%m-%dT%H:%M:%S)"
echo "hostname: ${HOSTNAME_TAG:-unknown}"
echo "goal: \"$GOAL\""
echo "target_files:"
IFS=',' read -ra FILES <<< "$TARGETS_CSV"
for f in "${FILES[@]}"; do
# 공백 제거
f=$(echo "$f" | sed 's/^[[:space:]]*//;s/[[:space:]]*$//')
echo " - $f"
done
echo "completion_criteria: \"commit + push 완료 후 post-commit hook archived 이동\""
echo "---"
echo ""
echo "# 매니페스트 — $PLAN_ID"
echo ""
echo "- **등록 시각**: $(date -Iseconds 2>/dev/null || date)"
echo "- **호스트**: ${HOSTNAME_TAG:-unknown}"
echo "- **집행 목표**: $GOAL"
echo ""
echo "## 대상 파일"
for f in "${FILES[@]}"; do
f=$(echo "$f" | sed 's/^[[:space:]]*//;s/[[:space:]]*$//')
echo "- \`$f\`"
done
echo ""
echo "## 완료 기준"
echo ""
echo "commit + push 완료. post-commit hook이 \`archived/$PLAN_ID.md\`로 자동 이동 + target_files cross-check."
} > "$MANIFEST"
echo "✅ 매니페스트 등록 완료"
echo " 경로: $MANIFEST"
echo " plan_id: $PLAN_ID"
echo " target_files: ${#FILES[@]}"
echo " 해제: 본 매니페스트 target_files 범위 내 Edit/Write 자동 통과"
echo ""
echo "📌 본 집행 완료 (commit + push) 후 매니페스트는 자동 archived 이동"
exit 0

View File

@ -33,7 +33,6 @@ C3·C13 위반에 해당. **즉시 자진 보고 후 소급 등록**.
|---|------|----------|----------|-----------|----------|----------| |---|------|----------|----------|-----------|----------|----------|
| 2 | 2026-04-14 | 서버 Critical 보안 3건 보류 | 보류 | `프로젝트/수상한잡화점/개발/05_서버연동_현황_v1.md` | 서버 파트 정비 미완료 (PD님 지시) | 서버팀 가동 시점에 블로커급 재개. 담당: 서버팀장. 재개 트리거: 서버 파트 정비 완료 통보 | | 2 | 2026-04-14 | 서버 Critical 보안 3건 보류 | 보류 | `프로젝트/수상한잡화점/개발/05_서버연동_현황_v1.md` | 서버 파트 정비 미완료 (PD님 지시) | 서버팀 가동 시점에 블로커급 재개. 담당: 서버팀장. 재개 트리거: 서버 파트 정비 완료 통보 |
| 38 | 2026-04-17 | (#28 후속 분리) Phase 3 재개 로드맵 결정 — Unity MCP 단일축 기반 밸런스 작업 재개 범위·선후관계·검증 축 확정 | 보류 | (로드맵 확정 시 기입) | PD님 별도 논의 예정 | 재개 트리거: PD님 Phase 3 재개 지시 수령. 기획팀 #3 동시 재개 | | 38 | 2026-04-17 | (#28 후속 분리) Phase 3 재개 로드맵 결정 — Unity MCP 단일축 기반 밸런스 작업 재개 범위·선후관계·검증 축 확정 | 보류 | (로드맵 확정 시 기입) | PD님 별도 논의 예정 | 재개 트리거: PD님 Phase 3 재개 지시 수령. 기획팀 #3 동시 재개 |
| 50 | 2026-04-20 | (PD님 직접 지시·조직 공통) **근본 해결 원칙 정비 + 매니페스트 기반 감사 재설계** — 30분 윈도우 proxy 3안 기각 후 C2 확장·C31-I·feedback 7회차·매니페스트 전환 2단계 집행 | **진행중** (Phase 1 완료, Phase 2 대기) | (Phase 1) SKILL.md C2 확장·C31-I + `.claude/agents/pm-auditor.md` 5-F + `memory/org/feedback_pm_proxy_improvement_reflex.md` + feedback §8 주석 + MEMORY.md + CLAUDE.md + `공유/조직공지/2026-04-20_C2_확장_근본해결_우선_원칙.md` + 감사보고서 + 대화로그 · (Phase 2 예정) `auditor_guard.sh` 매니페스트 기반 재작성 + `auditor_call_log.sh` 매니페스트 등록 + post-commit archived 이동 + SKILL.md C35-9 Layer 재작성 | - | Phase 2 착수 전 pm-auditor 재감사 필수 (C-1 수용). 매니페스트 + commit diff cross-check 2중 구조 (M-1 수용). 완료 시 완료 아카이브 이동 |
> **2026-04-15 오후 추가 갱신 (C4·C13 위반 자진 정정 2차)**: > **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` 오후 섹션 참조. > #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` 오후 섹션 참조.
@ -92,6 +91,7 @@ C3·C13 위반에 해당. **즉시 자진 보고 후 소급 등록**.
| # | 일시 | 지시 요지 | 처리 상태 | 산출물 경로 | 중단 사유 | 사후 조치 | | # | 일시 | 지시 요지 | 처리 상태 | 산출물 경로 | 중단 사유 | 사후 조치 |
|---|------|----------|----------|-----------|----------|----------| |---|------|----------|----------|-----------|----------|----------|
| 50 | 2026-04-20 | (PD님 직접 지시·조직 공통) **근본 해결 원칙 정비 + PreToolUse 차단 전환 (근본 해결)** — 30분 윈도우 proxy 3안 기각 → 매니페스트 원안도 proxy 판정 → PreToolUse 차단 + 해제 워크플로우 최종 근본 해결. Phase 1 코어룰 정비 + Phase 2 차단 전환 + 8회차 변종 재발 방지 완결 | **완료 (근본 해결)** | **[완료: 2026-04-20 14:00 · commit: b5cb6d7 (Phase 1) + (본 Phase 2 commit) · 참조: `공유/대화로그/조직운영/2026-04-20.md` "Phase 1 집행" + "Phase 2 완료" 2개 엔트리]** (집행 30+종) Phase 1: SKILL.md C2-1~C2-6·C31-I·pm-auditor 5-F·feedback 7회차 신설·CLAUDE.md·조직공지 `2026-04-20_C2_확장_근본해결_우선_원칙.md`·감사보고서 · Phase 2: scripts 3종 신설(`auditor_gate.sh`·`manifest_register.sh`·`manifest_archive.sh`)·settings.json PreToolUse 편입·post-commit 확장·auditor_guard deprecated·SKILL.md C35-9 전면 재작성·C34-17 조항 8·C35-10 BYPASS 폐기·pm-auditor 5-F 8회차 확장·feedback §8 아카이브 이관 `공유/조직공지/방향전환_히스토리_아카이브.md`·feedback 8회차 append·조직공지 `2026-04-20_PreToolUse_차단_전환_근본해결.md`·CLAUDE.md C35 요약·pm-auditor 재감사 Critical 0·Major 1·Minor 2·Improvement 1 전수 수용 | - | **본 세션 집행 중 PreToolUse 차단 정상 작동 실증** (SKILL.md Edit 차단 → manifest_register.sh 등록 → 통과). 기존 UNRESOLVED 로그 체계 폐기. 기대 커버리지 ~99%. 8회차 변종 재발 방지 (pm-auditor 5-F 확장 + feedback SOT) |
| 49 | 2026-04-20 | (후속 안건·조직 공통) **verify_setup 2.7 단독 집행**#48 G 기각안 1·2 후속 검토 중 verify_setup 2.7만 실질 이득 인정. setup 3.7·BYPASS 파일 2종 중앙화는 PD님 판단으로 **기각 확정** (재논의 대상 아님) | **완료 (2/3 기각)** | **[완료: 2026-04-20 12:40 · commit: (본 후속 commit) · 참조: `공유/대화로그/조직운영/2026-04-20.md` "#49 verify_setup 2.7 단독 집행" 엔트리]** `scripts/verify_setup.ps1` 2.7 섹션 신설 (audit 중앙 저장소 실체·marker·3종 하위 sub-marker·junction 3종 연결 검증). 기각 2종 경위는 본 대화로그 엔트리 | - | **기각 2종(setup 3.7·BYPASS 중앙화) 폐기 확정** — 향후 현황 보고 미포함 (P28-8) | | 49 | 2026-04-20 | (후속 안건·조직 공통) **verify_setup 2.7 단독 집행**#48 G 기각안 1·2 후속 검토 중 verify_setup 2.7만 실질 이득 인정. setup 3.7·BYPASS 파일 2종 중앙화는 PD님 판단으로 **기각 확정** (재논의 대상 아님) | **완료 (2/3 기각)** | **[완료: 2026-04-20 12:40 · commit: (본 후속 commit) · 참조: `공유/대화로그/조직운영/2026-04-20.md` "#49 verify_setup 2.7 단독 집행" 엔트리]** `scripts/verify_setup.ps1` 2.7 섹션 신설 (audit 중앙 저장소 실체·marker·3종 하위 sub-marker·junction 3종 연결 검증). 기각 2종 경위는 본 대화로그 엔트리 | - | **기각 2종(setup 3.7·BYPASS 중앙화) 폐기 확정** — 향후 현황 보고 미포함 (P28-8) |
| 48 | 2026-04-19 | (PD님 직접 지시) **세션 최종 점검 6개선 안건 이어받기 집행** — A·B·C 집행 + D·F·G 집행 + C36 헌법급 신설 + audit C34 3종 편입 | **완료** | **[완료: 2026-04-20 12:17 · commit: 224617d (A·B·C) + 9e8c0b0 (D·F·G·C36) + ccd37da (C10-6 3중 전파 완결·완료 이동) · 참조: `공유/대화로그/조직운영/2026-04-20.md` "#48 A·B·C 집행" + "#48 D·F·G 집행 + C36 헌법급 신설" 2개 엔트리]** (집행 11+종) A: `scripts/auditor_call_log.sh` grep -qw 수정 · B: `scripts/pm_context_restore.sh` 경로 필터 · C: 본 PC UNRESOLVED 수동 RESOLVED · D: 중앙 `.live/README.md` · F: pm-auditor 5-E 신설 · G (a): audit 중앙 통합 (scripts 3종 + settings.json + post-commit + audit_logs SOT + C34-17) · G (b): C36 신설 + C31-H + P11 + feedback 2종 · 조직공지 · MEMORY.md · CLAUDE.md · E 진행 안 함 | - | 본 commit push 완료 시 모든 PC git pull + 세션 재시작으로 자동 동기화. BYPASS 파일 2종·setup 3.7·verify 2.7은 후속 안건 (기각안 1·2 기록) | | 48 | 2026-04-19 | (PD님 직접 지시) **세션 최종 점검 6개선 안건 이어받기 집행** — A·B·C 집행 + D·F·G 집행 + C36 헌법급 신설 + audit C34 3종 편입 | **완료** | **[완료: 2026-04-20 12:17 · commit: 224617d (A·B·C) + 9e8c0b0 (D·F·G·C36) + ccd37da (C10-6 3중 전파 완결·완료 이동) · 참조: `공유/대화로그/조직운영/2026-04-20.md` "#48 A·B·C 집행" + "#48 D·F·G 집행 + C36 헌법급 신설" 2개 엔트리]** (집행 11+종) A: `scripts/auditor_call_log.sh` grep -qw 수정 · B: `scripts/pm_context_restore.sh` 경로 필터 · C: 본 PC UNRESOLVED 수동 RESOLVED · D: 중앙 `.live/README.md` · F: pm-auditor 5-E 신설 · G (a): audit 중앙 통합 (scripts 3종 + settings.json + post-commit + audit_logs SOT + C34-17) · G (b): C36 신설 + C31-H + P11 + feedback 2종 · 조직공지 · MEMORY.md · CLAUDE.md · E 진행 안 함 | - | 본 commit push 완료 시 모든 PC git pull + 세션 재시작으로 자동 동기화. BYPASS 파일 2종·setup 3.7·verify 2.7은 후속 안건 (기각안 1·2 기록) |
| 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·규칙 반영 완료 | | 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·규칙 반영 완료 |

View File

@ -264,6 +264,73 @@ $HOME/.claude/nerdnavis-audit/manifest/
### 상태 ### 상태
- Phase 1 완료 — 코어룰 정비 7종 commit 대기 - Phase 1 완료 — commit `b5cb6d7` push
- Phase 2 진행중 — 매니페스트 재설계. 재감사 후 착수 - Phase 2 완료 — commit (본 후속) push 후
- #50 PD 지시 로그 활성 `진행중` (Phase 2 완료 시 완료 이동) - #50 PD 지시 로그 완료 아카이브 이동 (즉답 접두 포함)
---
<!-- #PD지시 #PM #완료 #50Phase2 #PreToolUse차단 #근본해결 #8회차재발방지 -->
## [PM Phase 2 완료] #50 PreToolUse 차단 전환 + 8회차 변종 재발 방지
- **요지**: PD님 직접 워크플로우 수용 집행. "꺼내기 전 신고 안하면 책장 잠금, 신고 확인 후 해제". PM "작업 흐름 파괴" 전제 폐기. C35-9 Layer 3 전면 개정 (PostToolUse 경고 → PreToolUse 차단).
- **PM 자진 인정 (8회차 변종 실증)**: Phase 2 원안에서 (a) PreToolUse 차단을 "작업 유연성 희생·생산성 저해"로 기피 → PD님 "보고 체계 없이 무단 변경이 더 큰 파괴" 지적 → 회피 명분 자체가 **proxy 정당화 숨은 전제**였음 드러남. feedback 8회차 변종 append.
- **본 세션 차단 실증**: 본 Edit 시도 중 `auditor_gate.sh`가 정상 작동하여 SKILL.md Edit 차단 → `manifest_register.sh` 실행 → 매니페스트 등록 후 통과. **설계대로 작동 실증**.
### pm-auditor 재감사 결과 반영
- **Critical 0**
- **Major M-1 수용**: auditor_gate.sh에 BYPASS 플래그 무시 (PreToolUse 차단 우회 불가)
- **Minor m-1 수용**: 기존 감사 자산 프레이밍 재조정
- **Minor m-2 수용**: C34-15 5문항 체크 SKILL.md 명문화
- **Improvement i-1 수용**: C2-7·C31-J 신설 **기각**. pm-auditor 5-F 확장 + feedback 8회차 append로 대체 (C14 토큰 효율)
### 집행 내역 (10종)
1. **scripts/auditor_gate.sh** 신설 (PreToolUse hook 차단)
2. **scripts/manifest_register.sh** 신설 (매니페스트 수동 등록)
3. **scripts/manifest_archive.sh** 신설 (post-commit archived 이동 + cross-check)
4. **.claude/settings.json** 개정 — PreToolUse auditor_gate 추가·PostToolUse auditor_guard 제거
5. **scripts/git-hooks/post-commit** 확장 — manifest_archive 편입
6. **scripts/auditor_guard.sh** deprecated 처리 (호환성 유지)
7. **SKILL.md C35-9** 전면 재작성 (Layer 3 PreToolUse 차단 + 해제 워크플로우 + C34-15 5문항 체크 결과 + 한계 인정)
8. **SKILL.md C34-17** 확장 (매니페스트 하위 디렉토리 편입 조항 8 신설)
9. **SKILL.md C35-10** BYPASS 사실상 폐기 선언 (PreToolUse 차단 우회 불가)
10. **pm-auditor 5-F** 확장 (근본 해결 회피 명분 표현 감지 + 가상적 단점 전제 기피 Critical)
### 8회차 변종 재발 방지 (PD님 마지막 지시)
**근본 문제**: PM이 "작업 흐름 파괴·생산성 저해" 명분으로 근본 해결을 기피하는 패턴.
**i-1 수용 구조**:
- pm-auditor 5-F 확장 (표현 감지 + 가상 단점 전제 기피 감지)
- feedback_pm_proxy_improvement_reflex.md 8회차 append (실증 타임라인·구조적 재발 방지 4종)
- 신규 규칙 신설 없이 기존 체계 확장 (C14 토큰 효율·C26 단일 SOT)
### 문서화
- `공유/조직공지/2026-04-20_PreToolUse_차단_전환_근본해결.md` 신설
- `공유/조직공지/방향전환_히스토리_아카이브.md` C35-9 Layer 3 섹션 append (M-3 수용)
- `memory/org/feedback_c35_initial_enforcement.md` §8 구 본문 삭제 + 이관 주석만 유지 (109→80줄)
- CLAUDE.md C35 요약 갱신
- MEMORY.md 기존 7회차 인덱스에 8회차 포함 (feedback 파일 내 변경 이력)
- 본 대화로그 엔트리
### 기각안
1. **C2-7·C31-J 신설** — i-1 수용 기각. 기존 C2·C36·5-F 확장으로 커버
2. **BYPASS 완전 삭제** — 호환성 유지(읽기 전용 히스토리). 신규 기록 중단
3. **30분 윈도우 코드 완전 삭제** — auditor_call_log.sh의 경고 해소 append 로직도 현행 유지 (감사 자산 보존, m-1 수용)
4. **PreToolUse 차단을 설정 기반 토글** — 근본 해결 약화. 기각
### 기대 효과
- C35 커버리지 ~97% → **~99%** (tool_use 체계 내 차단 강제)
- 시간 윈도우 경계 초과 재발 불가
- PM proxy 반사·근본 해결 회피 명분 구조적 차단
- 본 세션 집행 자체가 PreToolUse 차단 정상 작동 실증
### 상태
- Phase 2 완료 — 본 commit push 후 다른 PC 세션 재시작 시 자동 적용
- #50 완료 아카이브 이동

View File

@ -0,0 +1,77 @@
---
type: 조직공지
date: 2026-04-20
kind: C35-9 Layer 3 전면 개정 — PreToolUse 차단 + 해제 워크플로우 (근본 해결)
authority: PD님 직접 지시
---
# 2026-04-20 — C35-9 Layer 3 PreToolUse 차단 전환 (근본 해결)
## 배경
2026-04-20 #48 집행 후 C35-9 30분 시간 윈도우 경계 초과 실증 → PM이 proxy 3안 제시 → PD님 "모두 근본 해결 아님" 지적 → Phase 2 매니페스트 재설계.
PM이 다시 "(a) PreToolUse 차단은 작업 흐름 파괴" 명분으로 기피 → **PD님 직접 지적**:
> "꺼내기 전 사서에게 신고 안하면 책장 잠금하고, 신고가 확인되면 풀어주는 강제 조항을 적용해. 작업 흐름이 파괴 될 경우는 어떤 경우이지? 보고 체계가 갖춰지지 않고 무단 변경으로 생긴 이슈가 더 큰거 같아. 정확하게 보고 검증 체계만 이루어지면 작업 흐름이 파괴 될 경우는 없을거 같아."
→ "작업 유연성 희생"이 PM의 proxy 정당화 숨은 전제였음 드러남. 8회차 변종.
## 본 집행 내용
### 1. Layer 3 전환 — PostToolUse 경고 → PreToolUse 차단
| 구 (폐기) | 신 (근본 해결) |
|----------|--------------|
| `scripts/auditor_guard.sh` PostToolUse 경고 | `scripts/auditor_gate.sh` PreToolUse **차단** |
| 30분 시간 윈도우 | 활성 매니페스트 **범위** 체크 |
| UNRESOLVED 로그 누적 | 차단 → PM 즉시 해제 절차 유도 |
| BYPASS 플래그 우회 가능 | **BYPASS 우회 불가** (M-1 수용) |
### 2. 신규 스크립트 3종
- `scripts/auditor_gate.sh` — PreToolUse hook, 차단 + 안내 메시지
- `scripts/manifest_register.sh` — 매니페스트 수동 등록 (`<plan_id> <targets_csv> <goal>`)
- `scripts/manifest_archive.sh` — post-commit archived 이동 + cross-check
### 3. 매니페스트 포맷 (md + YAML frontmatter, I-1 확정)
활성: `$HOME/.claude/nerdnavis-audit/manifest/active/{plan_id}.md` / 완료: `archived/{plan_id}.md`
### 4. 해제 워크플로우 (PD님 제시 수용)
Edit 시도 → 매니페스트 부재/범위 밖 → 🔒 차단 + 안내 → PM이 pm-auditor Task 호출 + `manifest_register.sh` 실행 → Edit 재시도 통과.
### 5. 사후 cross-check (M-1 수용)
post-commit이 commit diff vs 매니페스트 target_files 비교. 범위 이탈 수정 시 경고.
### 6. 8회차 변종 재발 방지
- pm-auditor 5-F 확장 — "작업 흐름 파괴·생산성 저해·구현 복잡·하위 호환성·실용성 부족" 표현 감지 Critical
- feedback_pm_proxy_improvement_reflex.md 8회차 append
- i-1 수용: C2-7·C31-J 신설 기각 (기존 C2·5-F 확장 충분)
### 7. feedback §8 아카이브 이관 (M-3 수용)
구 §8 → 본 조직공지 + 방향전환 아카이브. feedback 본문은 §1~§7만 유지 (109→80줄).
### 8. BYPASS 메커니즘 사실상 폐기
PreToolUse 차단 우회 불가. 기존 파일은 읽기 전용 히스토리.
## 조직 전원 적용
본 commit push 완료 시 즉시 적용. 다음 세션부터 PreToolUse 차단 활성화.
## 기대 효과
- C35 커버리지 ~97% → **~99%**
- 시간 윈도우 경계 초과 재발 불가
- PM proxy 반사·근본 해결 회피 명분 구조적 차단
## 연관
- `memory/org/feedback_pm_proxy_improvement_reflex.md` (7·8회차 변종 SOT)
- `공유/조직공지/방향전환_히스토리_아카이브.md` C35-9 Layer 3 섹션
- `공유/소통/pm-auditor→PM/2026-04-20_감사보고_코어룰정비_매니페스트전환.md`

View File

@ -269,3 +269,48 @@ rationale: 수정 3대 원칙(2026-04-18 재개정) — "본문은 최신 내용
- **C14**: 본문 최신 + 외부 아카이브 구조로 고정비·변동비 모두 최적화 - **C14**: 본문 최신 + 외부 아카이브 구조로 고정비·변동비 모두 최적화
- **헌법 목표 2-B**: 차기 프로젝트 참고 자료 핵심 SOT - **헌법 목표 2-B**: 차기 프로젝트 참고 자료 핵심 SOT
- **P24** (기각안 필드 필수): 본 아카이브의 "당시 가정 → 현 방향" 구조가 기각안 정신의 설계 문서 확장 - **P24** (기각안 필드 필수): 본 아카이브의 "당시 가정 → 현 방향" 구조가 기각안 정신의 설계 문서 확장
---
## C35-9 Layer 3 — 시간 윈도우 → PreToolUse 차단 전환 (2026-04-20 #50)
### 당시 가정
- **2026-04-19 #44 C35-9 신설 당시**: PostToolUse 사후 경고 + 30분 시간 윈도우 방식
- 근거: "차단 아닌 경고" 방침 (생산성 저해 회피, C35-9 Layer 3 원안)
- 기대 커버리지 ~97%, 잔여 3%는 LLM 구조 한계로 인정
### 당시 실증 (경계 초과 5건)
2026-04-20 #48 D·F·G 집행 중 관측:
- 11:40 pm-auditor 호출 → 12:10 30분 윈도우 만료 → 12:12~12:17 C10-6 3중 전파 5건 파일 수정 → UNRESOLVED 로그 5건 누적
- 집행 완료는 했으나 경계 직전 다수 수정 케이스에 취약 실증 (`feedback_c35_initial_enforcement.md §8` 원본 실증)
### PM proxy 개선 반사 (7회차 변종)
- (a) 60분 확장 · (b) 작업 유형별 차등(규칙 90분·commit 15분·일반 30분) · (c) 유효 만료 시각 로그 명시 + 5분 전 경고
- PM 권고 "(a)+(c) 조합"
- **PD님 직접 지적**: "모든 안건이 다 근본 해결이 아닌거 같아."
### PM 8회차 변종 (매니페스트 원안 단계)
- PM이 "매니페스트 기반 = 근본 해결" 프레이밍
- pm-auditor Critical 지적: "매니페스트도 proxy 범주. 범위 선언 = proxy 치환"
- PM이 (a) PreToolUse 차단을 **"작업 흐름 파괴·생산성 저해"** 명분으로 기피
- **PD님 직접 지적**: "보고 체계가 갖춰지지 않고 무단 변경으로 생긴 이슈가 더 큰거 같아. 정확하게 보고 검증 체계만 이루어지면 작업 흐름이 파괴 될 경우는 없을거 같아."
- → 8회차 변종: "작업 유연성 희생" 명분 자체가 PM의 proxy 정당화 숨은 전제
### 현 방향 (2026-04-20 #50 집행)
- **PreToolUse 차단 + 해제 워크플로우**: `scripts/auditor_gate.sh` + 매니페스트(`manifest_register.sh`) + post-commit cross-check(`manifest_archive.sh`)
- 30분 시간 윈도우·UNRESOLVED 로그·BYPASS 우회 방식 폐기
- BYPASS 플래그 PreToolUse 차단 우회 불가 (M-1 수용)
- C35-9 Layer 3 본문 전면 재작성
- 기대 커버리지 ~97% → **~99%** (tool_use 체계 내 차단 강제)
### 재발 방지 구조
- **C2 확장 (C2-1~C2-6)**: 근본 vs proxy 명문화
- **C31-I 체크리스트**: 응답 발신 직전 proxy 반사 자기검증
- **pm-auditor 5-F**: proxy 개선 회피 + 근본 해결 회피 명분 감지 (8회차 변종 커버)
- **feedback_pm_proxy_improvement_reflex.md**: 7·8회차 변종 누적 SOT
### 연관
- `memory/org/feedback_pm_proxy_improvement_reflex.md` (7·8회차 변종 실증)
- `memory/org/feedback_c35_initial_enforcement.md` (구 §8 실증 이관)
- `memory/org/feedback_pm_over_conservative_interpretation.md` (1~6회차 과도 보수 해석 상위 SOT)
- `공유/조직공지/2026-04-20_PreToolUse_차단_전환_근본해결.md` (#50 집행 조직공지)