From 46ed9ce51e19aafef7647d47adf84481f5c320e5 Mon Sep 17 00:00:00 2001 From: swrring Date: Mon, 20 Apr 2026 13:57:50 +0900 Subject: [PATCH] =?UTF-8?q?feat(#50=20Phase=202):=20PreToolUse=20=EC=B0=A8?= =?UTF-8?q?=EB=8B=A8=20=EC=A0=84=ED=99=98=20(=EA=B7=BC=EB=B3=B8=20?= =?UTF-8?q?=ED=95=B4=EA=B2=B0)=20+=208=ED=9A=8C=EC=B0=A8=20=EC=9E=AC?= =?UTF-8?q?=EB=B0=9C=20=EB=B0=A9=EC=A7=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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) --- .claude/agents/pm-auditor.md | 4 +- .claude/settings.json | 17 +- .claude/settings.json.bak_20260420_1348 | 219 ++++++++++++++++++ .claude/skills/너드나비스-코어룰/SKILL.md | 96 +++++--- CLAUDE.md | 2 +- .../org/feedback_c35_initial_enforcement.md | 37 +-- .../feedback_pm_proxy_improvement_reflex.md | 1 + ...udit_pattern_analyzer.sh.bak_20260420_1348 | 87 +++++++ .../auditor_call_log.sh.bak_20260420_1348.2 | 34 +++ scripts/auditor_gate.sh | 88 +++++++ scripts/auditor_guard.sh | 71 +----- scripts/auditor_guard.sh.bak_20260420_1348 | 68 ++++++ scripts/git-hooks/post-commit | 4 + .../git-hooks/post-commit.bak_20260420_1348 | 32 +++ scripts/manifest_archive.sh | 55 +++++ scripts/manifest_register.sh | 72 ++++++ 공유/PD_지시_트래킹/개발팀_PD_지시_로그.md | 2 +- 공유/대화로그/조직운영/2026-04-20.md | 73 +++++- .../2026-04-20_PreToolUse_차단_전환_근본해결.md | 77 ++++++ 공유/조직공지/방향전환_히스토리_아카이브.md | 45 ++++ 20 files changed, 939 insertions(+), 145 deletions(-) create mode 100644 .claude/settings.json.bak_20260420_1348 create mode 100644 scripts/audit_pattern_analyzer.sh.bak_20260420_1348 create mode 100644 scripts/auditor_call_log.sh.bak_20260420_1348.2 create mode 100644 scripts/auditor_gate.sh create mode 100644 scripts/auditor_guard.sh.bak_20260420_1348 create mode 100644 scripts/git-hooks/post-commit.bak_20260420_1348 create mode 100644 scripts/manifest_archive.sh create mode 100644 scripts/manifest_register.sh create mode 100644 공유/조직공지/2026-04-20_PreToolUse_차단_전환_근본해결.md diff --git a/.claude/agents/pm-auditor.md b/.claude/agents/pm-auditor.md index 3b37193..6347c5c 100644 --- a/.claude/agents/pm-auditor.md +++ b/.claude/agents/pm-auditor.md @@ -112,7 +112,9 @@ PM 응답·권고 전수 점검: - [ ] 경계 값·설정·수치만 조정하는 **proxy 개선**을 근본 해결로 포장하지 않았는가? (C2-2) - [ ] 근본 해결안 vs proxy 개선 공존 시 **근본 해결안을 첫 번째**로 제시했는가? (C2-3) - [ ] 동일 문제에 대한 복수 개선안이 **모두 같은 축 내 튜닝**(시간 윈도우 수치·임계값·유형별 차등 등)이면 전형적 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님 직접 지시) diff --git a/.claude/settings.json b/.claude/settings.json index 73b6c0e..6b911c7 100644 --- a/.claude/settings.json +++ b/.claude/settings.json @@ -69,6 +69,10 @@ { "type": "command", "command": "bash scripts/auto_approve.sh" + }, + { + "type": "command", + "command": "bash scripts/auditor_gate.sh" } ] } @@ -174,19 +178,6 @@ { "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" } ] }, diff --git a/.claude/settings.json.bak_20260420_1348 b/.claude/settings.json.bak_20260420_1348 new file mode 100644 index 0000000..73b6c0e --- /dev/null +++ b/.claude/settings.json.bak_20260420_1348 @@ -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" + } + ] + } + ] + } +} diff --git a/.claude/skills/너드나비스-코어룰/SKILL.md b/.claude/skills/너드나비스-코어룰/SKILL.md index 9f687d4..2c92011 100644 --- a/.claude/skills/너드나비스-코어룰/SKILL.md +++ b/.claude/skills/너드나비스-코어룰/SKILL.md @@ -1794,6 +1794,7 @@ C35 감사 로그 3종(`auditor_calls`·`warning_ignored`·`bypass_log`)은 본 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 접두로 해소 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 — 필요 시 확장) @@ -1861,28 +1862,69 @@ pm-auditor 자신의 호출 이력도 감사 대상. 특정 작업에서 **호 - **C34** PC 로컬 실시간 공유 중앙화 (감사관 호출 결과 축적의 인프라) - **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) -- `recent_feedback_brief.sh` — 최근 7일 feedback 요지 자동 주입 (기존) +- `recent_feedback_brief.sh` — 최근 7일 feedback 요지 자동 주입 - 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/.log`에 타임스탬프 기록 -- **경고 무시 해소 처리 포함** — 호출 시 `$HOME/.claude/.nerdnavis_warning_ignored/.log`의 기존 UNRESOLVED에 RESOLVED 마커 append -- 30분 시간 윈도우로 "최근 호출 있음" 판정 +- 감사 실행 이력 누적 (C35-10 장기 패턴 분석 입력) +- **시간 윈도우 로직 삭제** (Layer 3 차단으로 대체) -#### Layer 3: 사후 경고 (PostToolUse, matcher: `Edit|Write|MultiEdit|Bash`) -- **`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 로그에 사유 자동 기록) +#### Layer 3: PreToolUse 차단 + 해제 워크플로우 (근본 해결) -#### 한계 재인정 (본 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 ` 명시 실행 → 매니페스트 생성 +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님 직접 지시) @@ -1909,27 +1951,21 @@ PD님 직접 지시 2종 이행: 3. **개선 안건화**: pm-auditor 감사 체크 확장·C35-1 대상 조정·hook 로직 개선 4. **PD님 보고**: 분기별 개선 안건 요약 + PM 재량 집행·PD 승인 구분 -#### BYPASS 우회 사유 기록 의무 (2026-04-19 신설 · 파일 기반 전환) +#### BYPASS 메커니즘 사실상 폐기 (2026-04-20 #50 — PreToolUse 차단 전환) -**작동 방식** (2026-04-19 옵션 A 파일 기반 전환): -Claude Code tool_use hook 실행 환경에서 PM이 명령 prefix(`NERDNAVIS_AUDITOR_BYPASS=1 git ...`)로 설정한 환경변수가 전달되지 않는 것이 본 세션 11차 commit 실패 사례로 실증됨. 이에 따라 BYPASS 메커니즘을 **파일 기반으로 전환**. +**2026-04-20 #50 집행으로 BYPASS 메커니즘 존재 의미 소실**: +- 구 PostToolUse 경고 방식(`auditor_guard.sh`)에서 BYPASS는 경고 회피 목적이었으나, 본 스크립트가 **deprecated** 처리됨 +- PreToolUse 차단(`auditor_gate.sh`)은 **BYPASS 플래그 무시** (M-1 수용 — 근본 해결 우회 불가) +- 긴급 우회가 필요한 경우 **매니페스트 등록 자체가 우회 절차** — `manifest_register.sh` 호출이 실질적 BYPASS 대체 -**사용 절차**: -1. 사유 기록: `echo "사유 텍스트" > $HOME/.claude/.nerdnavis_bypass_reason` -2. 플래그 생성: `touch $HOME/.claude/.nerdnavis_bypass_active` -3. 작업 수행 (Edit·Write·commit·push 등 의무 영역) -4. **작업 완료 직후 플래그·사유 파일 제거**: `rm $HOME/.claude/.nerdnavis_bypass_active $HOME/.claude/.nerdnavis_bypass_reason` +**BYPASS 파일 2종(`.nerdnavis_bypass_active`·`.nerdnavis_bypass_reason`) 처리**: +- **존재는 허용 (호환성)** — 기존 로그·히스토리 보존 +- **신규 작성 금지** — PreToolUse 차단 우회 목적 사용 불가. 사용 시 효과 없이 로그만 남음 +- **기존 플래그 잔존 시 즉시 제거**: `rm $HOME/.claude/.nerdnavis_bypass_active $HOME/.claude/.nerdnavis_bypass_reason` -**자동 기록**: `auditor_guard.sh`가 플래그 파일 존재 시 `$HOME/.claude/.nerdnavis_bypass_log/.log`에 `BYPASS (file) reason=...` 자동 기록 후 `exit 0`. +**BYPASS 로그 디렉토리** (`$HOME/.claude/.nerdnavis_bypass_log/`): **읽기 전용 히스토리**. 신규 기록 중단. C35-10 분기별 review에서 누적 이력만 참조. -**환경변수 방식 fallback 유지**: Claude Code가 미래에 hook 환경변수 전달 지원 시 작동. 현재 PM 명령 prefix로는 미작동 (실증). - -**재발 방지 체크 (세션 리더 의무)**: -- BYPASS 사용 전 `ls $HOME/.claude/.nerdnavis_bypass_active`로 플래그 설정 검증 -- **작업 완료 직후 반드시 플래그 제거** — 잔존 시 차후 모든 작업이 BYPASS 상태로 통과 (감사 사각지대 발생) -- C35-10 분기별 review 시 BYPASS 로그 누적 검토 필수 - -**위반 시**: BYPASS 플래그 장기 잔존·사유 미기록 시 C3 이슈 은폐 금지 위반에 준함. 자진 고지 + 플래그 즉시 제거. +**위반 시**: BYPASS로 PreToolUse 차단을 우회하려는 시도는 구조상 불가. 시도 자체가 C35-9 위반 신호로 간주되며, 자진 고지 + pm-auditor 호출 + 매니페스트 등록 순서 정상화 의무. #### 연관 자산 diff --git a/CLAUDE.md b/CLAUDE.md index afafccb..2e5dd6e 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -60,7 +60,7 @@ PD님 - **C30** git 동기화 프로젝트 작업 전 최신 상태 점검 / **C31** 응답 발신 직전 자기검증 의무 (헌법급) - **C32** 대화로그 기록 의무 (헌법급, 구 P22·P24 흡수) / **C33** 조직 업무 공유·기록 체계 일관성 보장 (헌법급, 구 P26·P27 흡수) - 🏆 **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 연계) - 폐기·통합·강등·재활용 규칙 상세: [폐기 규칙 아카이브](공유/조직공지/폐기_규칙_아카이브.md) diff --git a/memory/org/feedback_c35_initial_enforcement.md b/memory/org/feedback_c35_initial_enforcement.md index 3988858..ec17933 100644 --- a/memory/org/feedback_c35_initial_enforcement.md +++ b/memory/org/feedback_c35_initial_enforcement.md @@ -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 정상화 확인된 직후 실증) diff --git a/memory/org/feedback_pm_proxy_improvement_reflex.md b/memory/org/feedback_pm_proxy_improvement_reflex.md index e1b89b8..b2862e2 100644 --- a/memory/org/feedback_pm_proxy_improvement_reflex.md +++ b/memory/org/feedback_pm_proxy_improvement_reflex.md @@ -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 #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회차 변종 신호로 분류 | diff --git a/scripts/audit_pattern_analyzer.sh.bak_20260420_1348 b/scripts/audit_pattern_analyzer.sh.bak_20260420_1348 new file mode 100644 index 0000000..f6c46ce --- /dev/null +++ b/scripts/audit_pattern_analyzer.sh.bak_20260420_1348 @@ -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 diff --git a/scripts/auditor_call_log.sh.bak_20260420_1348.2 b/scripts/auditor_call_log.sh.bak_20260420_1348.2 new file mode 100644 index 0000000..5888c30 --- /dev/null +++ b/scripts/auditor_call_log.sh.bak_20260420_1348.2 @@ -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 diff --git a/scripts/auditor_gate.sh b/scripts/auditor_gate.sh new file mode 100644 index 0000000..cc9b57d --- /dev/null +++ b/scripts/auditor_gate.sh @@ -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 < + 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 </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" +# DEPRECATED (2026-04-20 #50 집행) — PostToolUse 경고 방식 폐기 +# 대체: scripts/auditor_gate.sh (PreToolUse 차단 방식, 근본 해결) +# 근거: C35-9 Layer 3 "차단 + 해제 워크플로우" 개정 (2026-04-20 PD님 직접 지시) +# +# 기존 스크립트는 호환성 유지 목적으로 보존되나 .claude/settings.json 참조 제거됨. +# 필요 시 완전 삭제 가능 (기능 의존 없음). exit 0 diff --git a/scripts/auditor_guard.sh.bak_20260420_1348 b/scripts/auditor_guard.sh.bak_20260420_1348 new file mode 100644 index 0000000..b941867 --- /dev/null +++ b/scripts/auditor_guard.sh.bak_20260420_1348 @@ -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 diff --git a/scripts/git-hooks/post-commit b/scripts/git-hooks/post-commit index cb97fad..92fda24 100644 --- a/scripts/git-hooks/post-commit +++ b/scripts/git-hooks/post-commit @@ -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" [ -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 diff --git a/scripts/git-hooks/post-commit.bak_20260420_1348 b/scripts/git-hooks/post-commit.bak_20260420_1348 new file mode 100644 index 0000000..cb97fad --- /dev/null +++ b/scripts/git-hooks/post-commit.bak_20260420_1348 @@ -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 diff --git a/scripts/manifest_archive.sh b/scripts/manifest_archive.sh new file mode 100644 index 0000000..24f7cbd --- /dev/null +++ b/scripts/manifest_archive.sh @@ -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 diff --git a/scripts/manifest_register.sh b/scripts/manifest_register.sh new file mode 100644 index 0000000..c0f69e5 --- /dev/null +++ b/scripts/manifest_register.sh @@ -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="${1}" +TARGETS_CSV="${2}" +GOAL="${3}" + +if [ -z "$PLAN_ID" ] || [ -z "$TARGETS_CSV" ] || [ -z "$GOAL" ]; then + cat >&2 < + + 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 diff --git a/공유/PD_지시_트래킹/개발팀_PD_지시_로그.md b/공유/PD_지시_트래킹/개발팀_PD_지시_로그.md index 015fbf1..70f6c7b 100644 --- a/공유/PD_지시_트래킹/개발팀_PD_지시_로그.md +++ b/공유/PD_지시_트래킹/개발팀_PD_지시_로그.md @@ -33,7 +33,6 @@ 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 동시 재개 | -| 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차)**: > #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) | | 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·규칙 반영 완료 | diff --git a/공유/대화로그/조직운영/2026-04-20.md b/공유/대화로그/조직운영/2026-04-20.md index b71a4b2..31a69e0 100644 --- a/공유/대화로그/조직운영/2026-04-20.md +++ b/공유/대화로그/조직운영/2026-04-20.md @@ -264,6 +264,73 @@ $HOME/.claude/nerdnavis-audit/manifest/ ### 상태 -- Phase 1 완료 — 코어룰 정비 7종 commit 대기 -- Phase 2 진행중 — 매니페스트 재설계. 재감사 후 착수 -- #50 PD 지시 로그 활성 `진행중` (Phase 2 완료 시 완료 이동) +- Phase 1 완료 — commit `b5cb6d7` push +- Phase 2 완료 — commit (본 후속) push 후 +- #50 PD 지시 로그 완료 아카이브 이동 (즉답 접두 포함) + +--- + + +## [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 완료 아카이브 이동 diff --git a/공유/조직공지/2026-04-20_PreToolUse_차단_전환_근본해결.md b/공유/조직공지/2026-04-20_PreToolUse_차단_전환_근본해결.md new file mode 100644 index 0000000..682bfe4 --- /dev/null +++ b/공유/조직공지/2026-04-20_PreToolUse_차단_전환_근본해결.md @@ -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` — 매니페스트 수동 등록 (` `) +- `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` diff --git a/공유/조직공지/방향전환_히스토리_아카이브.md b/공유/조직공지/방향전환_히스토리_아카이브.md index 921bf68..51981df 100644 --- a/공유/조직공지/방향전환_히스토리_아카이브.md +++ b/공유/조직공지/방향전환_히스토리_아카이브.md @@ -269,3 +269,48 @@ rationale: 수정 3대 원칙(2026-04-18 재개정) — "본문은 최신 내용 - **C14**: 본문 최신 + 외부 아카이브 구조로 고정비·변동비 모두 최적화 - **헌법 목표 2-B**: 차기 프로젝트 참고 자료 핵심 SOT - **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 집행 조직공지)