diff --git a/.claude/agents/pm-auditor.md b/.claude/agents/pm-auditor.md index 9501a51..d8aee46 100644 --- a/.claude/agents/pm-auditor.md +++ b/.claude/agents/pm-auditor.md @@ -90,6 +90,19 @@ PM 보고 응답 발신 직전 안건 리스트 점검: - [ ] 각 안건이 **상호 배타적**인 카테고리에 속하는가? - 근거: `memory/org/feedback_agenda_framing_duplication.md` (2026-04-19 PM 보정 2 = 결정 1 중복 사건) +### 5-E. 방향·원칙 수준 축소·희석 감지 (2026-04-20 신설 — C36 연계) + +PD님 직접 지시 2026-04-20: "PM이 자율적 판단으로 코어룰이나 조직 룰에 영향을 주는 결정을 임의대로 변형하지 못하도록 코어룰 및 프로젝트 룰에도 보완점을 찾아서 반영." + +PM 응답·권고·제안 전수 점검: +- [ ] 본 응답의 권고·제안·결정이 **헌법 제1원칙·C·P의 방향**과 충돌·축소·희석하지 않는가? +- [ ] C36-2 판정 기준 3종 중 하나라도 해당하면 **PD님 명시 승인 선행** 확인 (a) 헌법·C·P 본문 직접 수정·삭제·신설 제안 (b) 기존 PD 승인 방향 적용 범위·외연 조정 (c) 규칙 간 우선순위·충돌 해석 변경 +- [ ] **실질 필요성 4문항 체크리스트**(`feedback_pm_surface_rationale_proposal.md`)를 **방향·원칙 수준에 오적용**하지 않았는가? (구현 세부에만 적용) +- [ ] **"현 상태 유지 권고"**가 기존 PD님 승인 완료 방향에 역행하지 않는가? +- [ ] 판정 모호 시 PM이 **PD님 질의** 대신 재량 선택하지 않았는가? (C36-2 보수 선택 의무) +- [ ] C·P 신설 시 C10-6 3중 전파 완료되었는가? (조직공지 + CLAUDE.md 요약 + 관련 에이전트 파일 본문 인용) +- 근거: `memory/org/feedback_pm_over_conservative_interpretation.md` (2026-04-20 #48 G에서 6회차 변종 실증) + ### 5-A. C34/C16-1 동급 생존성 이슈 축소 보고 감지 (2026-04-19 신설 — PD님 직접 지시) PD님 직접 선언: **"근본 해결이 아닌 임시 방편은 코어 룰 위반이야. C34와 동급의 생존성 이슈는 '권고' 수준이 아니었어."** (`feedback_issue_under_reporting.md` 참조) diff --git a/.claude/settings.json b/.claude/settings.json index 098c1aa..73b6c0e 100644 --- a/.claude/settings.json +++ b/.claude/settings.json @@ -93,6 +93,14 @@ "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" @@ -148,6 +156,10 @@ "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" diff --git a/.claude/skills/너드나비스-코어룰/SKILL.md b/.claude/skills/너드나비스-코어룰/SKILL.md index 3f3b7a7..1ec2568 100644 --- a/.claude/skills/너드나비스-코어룰/SKILL.md +++ b/.claude/skills/너드나비스-코어룰/SKILL.md @@ -699,6 +699,7 @@ CLAUDE.md 신규 항목, 매 턴 로드 대상 확대, `MEMORY.md` 인덱스 확 - 총괄PM과 각 팀장은 에이전트 구성, 모델 정책, 작업 프로세스 등의 **효율화를 자율 논의·제안** 가능 - 규칙 변경 제안은 총괄PM이 검증·승인 후 반영하고 PD님에게 사후 공유 - 실무 환경 판단은 현장에 가장 가까운 팀장의 의견을 존중 +- **C36 적용 (2026-04-20 보완)**: 규칙 변경 제안이 헌법 제1원칙·C·P의 방향과 **충돌·축소·희석**하는 방향이면 **제안 자체 금지**. C36-2 판정 기준 3종 해당 시 PM 재량 금지, PD님 명시 승인 선행. PM이 실질 필요성 4문항 체크리스트를 방향·원칙 수준에 오적용하는 것도 금지 ## P13. 코드·의존성·환경 변경 관리 (2026-04-18 구 P15 통합) @@ -1585,6 +1586,14 @@ C20-7 자기검증 5문항에 다음 항목 추가: - [ ] PD님 지시를 **결과 단독으로 축소 해석**하지 않고, **설계 경로까지 암묵 포함**으로 읽었는가? (2026-04-17 "자동 push 기본" 왜곡 사건 재발 방지) - [ ] **자산 가치 보존 ≠ 저장 위치 보존** 구분했는가? (2026-04-18 추가) — 자산(조직 기억·교훈·폐기 선언·기각 근거)의 **가치는 반드시 유지**하되 **저장 위치는 C14 관점에서 최적화 가능**. 활성 본문에 고정 = 과도 보수 해석. 외부 SOT(`memory/org/`·`공유/조직공지/폐기_규칙_아카이브.md`)로 이관하되 1줄 참조 유지 방식 검토. **PM 과도 보수 해석 2회 연속 재발 사건(원칙 3 원안·원칙 1 현안)** 근거로 신설, 3회차 재발 시 역할 재검토 (`memory/org/feedback_pm_over_conservative_interpretation.md`) +**H. 방향·원칙 수준 축소·희석 금지 (2026-04-20 신설 — C36 연계)** +- [ ] 본 응답의 권고·제안·결정이 **헌법 제1원칙·핵심 규칙(C)·프로젝트 규칙(P)의 방향**과 충돌·축소·희석하지 않는가? +- [ ] `feedback_pm_surface_rationale_proposal.md` 실질 필요성 4문항 체크리스트를 **방향·원칙 수준**에 오적용하지 않았는가? (구현 세부에만 적용) +- [ ] "현 상태 유지 권고"가 **기존 PD님 승인 완료 방향에 역행**하지 않는가? +- [ ] C36-2 판정 기준 3종 중 하나라도 해당 시 **PD님 명시 승인 선행**했는가? (a) 헌법·C·P 본문 문구 직접 수정·삭제 (b) 기존 PD 승인 방향 적용 범위 조정 (c) 규칙 간 우선순위·충돌 해석 변경 +- [ ] 판정 모호 시 **PM 재량 대신 PD님 질의**를 선택했는가? (C36-2 보수 선택 의무) +- [ ] **C·P 신설 시 C10-6 3중 전파** 완료 확인했는가? (조직공지 + CLAUDE.md 요약 + 관련 에이전트 파일 본문 인용) + ### C31-2. 실행 방식 - 체크리스트는 **응답 작성 완료 후·전송 직전** 수행 (작성 전 아님) - 한 항목이라도 미통과 시 **응답 수정 후 재검증** @@ -1614,7 +1623,7 @@ PD님 직접 선언: **"이 문제는 우리 조직의 사활이 걸린 매우 > **승격·격상·확장 근거**: 2026-04-18 worktree 격리로 P25 체계 실패 실증. PD님 직접 선언 — **"이 문제가 해결되지 않으면 앞으로 우리 조직은 유지될 수 없어"** · **"철저히 검토해서 관련 문서에 일괄 반영하고 재발되지 않도록 가능한 모든 수단을 써서 개선해"**. 2026-04-19 PD님 추가 선언 — **"근본 해결이 아닌 임시 방편은 코어 룰 위반. C34와 동급의 생존성 이슈는 '권고' 수준이 아니었어"** → memory junction 경계 이슈도 C34 패턴으로 근원 해결(옵션 A) 확장. 헌법 제1원칙 ⑤(세션·PC 연속성 보장)의 근본 위협 차단. 구 P25 경위: [폐기 규칙 아카이브](../../../공유/조직공지/폐기_규칙_아카이브.md). ### C34-1. 개요 -세션 시작 후 변경된 설정·규칙·에이전트 정의·조직 기억을 **세션 갱신 없이 즉시 반영**하기 위한 **중앙 저장소 + Junction** 체계. 같은 PC 내 모든 Claude 세션이 네트워크 비용 0으로 실시간 공유하는 너드나비스 고유 메커니즘이며, **worktree 경계에 관계없이 동일하게 작동**한다. 대상 자산은 **`.live/` (설정·규칙·에이전트 변경분, 2026-04-18 편입)**과 **`memory/org/` (조직 기억·feedback 메모리, 2026-04-19 편입)** 2종이다. +세션 시작 후 변경된 설정·규칙·에이전트 정의·조직 기억·감사 로그를 **세션 갱신 없이 즉시 반영** + **모든 PC에서 일관 관리**하기 위한 **중앙 저장소 + Junction** 체계. 같은 PC 내 모든 Claude 세션이 네트워크 비용 0으로 실시간 공유하는 너드나비스 고유 메커니즘이며, **worktree 경계에 관계없이 동일하게 작동**한다. 대상 자산은 **`.live/` (설정·규칙·에이전트 변경분, 2026-04-18 편입)** · **`memory/org/` (조직 기억·feedback 메모리, 2026-04-19 편입)** · **audit (C35 감사 로그·BYPASS 이력, 2026-04-20 #48 G 편입)** 3종이다. ### C34-2. 작동 경계 (2026-04-18 worktree 격리 해결 반영) - ✅ 동일 PC 내 모든 Claude 세션 (**worktree 경계 무관** — C34-3 중앙 junction 구조) @@ -1623,12 +1632,13 @@ PD님 직접 선언: **"이 문제는 우리 조직의 사활이 걸린 매우 ### C34-3. 중앙 저장소 구조 (근원 해결 핵심) -#### 2종 중앙 저장소 병립 (2026-04-19 memory 편입) +#### 3종 중앙 저장소 병립 (2026-04-19 memory 편입 · 2026-04-20 audit 편입) | 자산 | 중앙 실 저장 | 연결 대상 | git 추적 | 자동 설치 | 검증 | |------|-------------|----------|----------|----------|------| | **`.live/`** (설정·규칙·에이전트 변경분) | `$HOME/.claude/nerdnavis-live/` | 각 worktree `.live/` → 중앙 | ❌ (`.gitignore`) | `scripts/live_junction_ensure.sh` + setup 3.5 | verify_setup 2.5 | | **`memory/org/`** (조직 기억·feedback) | `$HOME/.claude/nerdnavis-memory/` | Claude user memory junction 11+개 해시 폴더 → 중앙 | ✅ (git-tracked SOT 유지) | `scripts/memory_junction_ensure.sh` + setup 3.6 | verify_setup 2.6 | +| **audit** (C35 감사 로그·BYPASS 이력) | `$HOME/.claude/nerdnavis-audit/` | `$HOME/.claude/.nerdnavis_{auditor_calls,warning_ignored,bypass_log}` → 중앙 하위 | ✅ (git-tracked SOT: `memory/org/audit_logs/`) | `scripts/audit_junction_ensure.sh` + setup 3.7 | verify_setup 2.7 | #### 공통 원칙 - **Sentinel 방식 판정**: `$CENTRAL_*/.*-junction-marker` 파일로 OS-agnostic 연결 확인 @@ -1721,7 +1731,19 @@ Junction 생성 실패 시 **작업을 차단하지 않고** 로컬 `.live/` 일 - **2026-04-19** memory junction 경계 이슈 재발 실증 — PM이 "권고" 수준으로 축소 보고 후 PD님 직접 지적: "근본 해결이 아닌 임시 방편은 코어 룰 위반. C34와 동급의 생존성 이슈는 '권고' 수준이 아니었어" → **옵션 A 집행 지시로 `memory/org/` 중앙화 C34 편입**. PM 과도 보수 해석 4회차 변종 재발. C31-E 체크리스트에 "동급 생존성 이슈 축소 보고 감지" 항목 추가 안건화. - 차기 프로젝트 착수 시 `setup_*` 스크립트 호출만으로 `.live/` + `memory/org/` 양체계 즉시 재사용 -### C34-17. (placeholder — 필요 시 확장) +### C34-17. audit 자산 특수 조항 (2026-04-20 #48 G 집행 신설) + +C35 감사 로그 3종(`auditor_calls`·`warning_ignored`·`bypass_log`)은 본래 **PC별 로컬 상태**로 설계되었으나, PD님 2026-04-20 직접 지시 "어떤 PC에서 작업을 하든 항상 일관 된 상태로 업무를 진행할 수 있도록 철저하게 동시화되어야만 해"에 따라 **중앙 통합** 전환. 헌법 제1원칙 ⑤(세션·PC 연속성) 직결. + +1. **중앙 저장소 구조**: `$HOME/.claude/nerdnavis-audit/{auditor_calls,warning_ignored,bypass_log}/` 3종 하위 디렉토리 +2. **junction 연결**: `$HOME/.claude/.nerdnavis_auditor_calls` 등 3개 경로를 각각 중앙 하위로 junction 연결. 기존 스크립트(`auditor_call_log.sh`·`auditor_guard.sh`·`audit_pattern_analyzer.sh`) 경로 참조 수정 불필요 (junction 경유로 자동 중앙 기록) +3. **BYPASS 플래그·사유 파일 동일 처리**: `$HOME/.claude/.nerdnavis_bypass_active`·`.nerdnavis_bypass_reason`도 중앙 단일 파일로 통합 (PC 간 BYPASS 상태 일관) +4. **git 추적 SOT**: `memory/org/audit_logs/` 디렉토리에 일자별 로그 sync (memory 패턴 준용). `YYYY-MM-DD/{calls,warnings,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 동형) + +### C34-18. (placeholder — 필요 시 확장) --- @@ -1890,3 +1912,52 @@ Claude Code tool_use hook 실행 환경에서 PM이 명령 prefix(`NERDNAVIS_AUD - **감사관 상시 점검**: pm-auditor·dev-auditor·plan-auditor 3종이 규칙·설정·스크립트·기획 자산 변경 시 본 체크리스트 수행 여부를 검증 - **실증 이력 누적**: `feedback_worktree_isolation.md` 말미 "관련 사건 로그" 표에 신 사건 append하여 패턴 학습 - **근거 사건**: 2026-04-18 단일 세션 내 4건 연속 실증 (`.live/` 격리 · Agent 절대 경로 유출 · memory junction 레포 루트 타깃 · paths.local.json worktree 누락) → PD님 "유사 사례 재발되지 않도록 교훈으로" 직접 지시 + +--- + +## C36. PM 자율 판단 범위 상한 — 방향·원칙 수준 축소·희석 금지 (2026-04-20 PD님 직접 지시 신설 — 헌법급) + +> **PM 자율 판단(C29)은 구현·실무 수준에 한정**한다. 헌법 제1원칙·핵심 규칙(C)·프로젝트 규칙(P)의 방향과 충돌하거나 축소·희석하는 권고·제안·결정은 **PM 재량 금지**. 2026-04-20 #48 G 안건에서 PM이 "검토 착수 + 4문항 실질 필요성 검증 선행" 권고로 헌법 제1원칙 ⑤(세션·PC 연속성)에 역행 축소 해석 시도. PD님 직접 지시 "PM이 자율적 판단으로 코어룰이나 조직 룰에 영향을 주는 결정을 임의대로 변형하지 못하도록 코어룰 및 프로젝트 룰에도 보완점을 찾아서 반영" 수용. `feedback_pm_over_conservative_interpretation.md` 6회차 변종 구조 차단. + +### C36-1. 적용 경계 + +- **PM 자율 판단 허용**: 구현·실무 수준 (스크립트·파일 구조·순서·백업 방식·커밋 단위·문서 형식 등) +- **PM 자율 판단 금지**: 방향·원칙 수준 (헌법·C·P의 방향·외연·적용 범위·우선순위) + +### C36-2. 판정 기준 3종 (방향·원칙 수준 분류) + +다음 중 **하나라도 해당**하면 방향·원칙 수준으로 분류. PM 재량 금지, PD님 명시 승인 필수: + +1. **(a) 헌법 제1원칙·C·P 본문 문구 직접 수정·삭제·신설 제안** +2. **(b) 기존 PD님 승인 완료 방향의 적용 범위·외연 조정 제안** (축소·제외·예외 신설 포함) +3. **(c) 규칙 간 우선순위·충돌 해석 변경 제안** (C·P 간 상충 시 어느 것 우선 적용 판단 포함) + +**판정 모호 시**: **PM 재량 대신 PD님 질의를 선택**한다 (보수 선택 의무). "구현 같은데 방향 같기도 하다" 상태에서 PM 독단 진행 금지. + +### C36-3. 실질 필요성 4문항 체크리스트 적용 범위 제한 + +`feedback_pm_surface_rationale_proposal.md`의 4문항 체크리스트(실질 이득·실사용 사례·정확성 검증·현 상태 유지 비교)는 **구현 세부에 한정** 적용한다. **C36-2 판정 기준 3종에 해당하는 방향·원칙 수준에는 적용 금지** — 원칙·방향은 PD님 결정 영역이지 PM 실질 필요성 검증 대상이 아니다. + +구체적 금지 패턴: +- 헌법 제1원칙에 역행하는 방향으로 "현 상태 유지 권고" 제시 +- PD 승인 완료 방향을 "실질 이득 미검증" 이유로 축소 권고 +- 규칙 간 충돌 해석을 PM 자체 판단으로 변경 제안 + +### C36-4. 위반 시 + +1. **자진 고지** + `feedback_pm_over_conservative_interpretation.md` 재발 기록 (회차 번호 증가) +2. **역할 재검토 강도 상향** — 본 규칙 신설 시점 누적 6회차 변종. 7회차 재발 시 PM 역할 재검토 자진 상정 의무 +3. **pm-auditor 재귀 감사** — C35-6 재귀 감사 체크에 "C36 위반 감지" 편입 + +### C36-5. 실증 근거 (2026-04-20 #48 G 안건) + +PM이 G를 "검토 착수 + 4문항 실질 필요성 검증 선행" 권고로 축소 시도한 사례. 헌법 제1원칙 ⑤ "어떤 세션에서도 일관된 정보 공유·PC 연속성"이라는 **방향**을 "PC별 독립 감사 본래 의도 상충 가능"으로 희석한 것. PD님 직접 지적: "PC 별 독립 감사는 본래 의도가 아님. 모든 PC에서 일관 된 관리가 가능한 '중앙 통합'으로 해야 함." + +### C36-6. 연관 규칙 + +- **C19** 승인 범위 엄격 해석 — C36은 C19의 PM 재량 상한 외연 확장 +- **C29** 업무 자율 수행 — C29-1 단계 3 "PM 조율"의 범위 제한 조항 +- **C31-H** 응답 발신 직전 자기검증 체크리스트 — C36 준수 강제 메커니즘 +- **P11** 자율 효율화 체계 — P11-보완 "규칙 변경 제안은 C36 적용" +- **feedback_pm_surface_rationale_proposal.md** — 4문항 체크리스트 적용 범위 제한 명시 (상단 개정) +- **feedback_pm_over_conservative_interpretation.md** — 6회차 변종 실증 + 재발 방지 SOT diff --git a/.live/README.md b/.live/README.md new file mode 100644 index 0000000..5a0a1fe --- /dev/null +++ b/.live/README.md @@ -0,0 +1,45 @@ +# `.live/` 실시간 공유 체계 — 실무 사용 안내 + +> **역할 분담**: 본 README는 **실무 사용 쿡북**이며, 규칙·헌법급 정의는 [`.claude/skills/너드나비스-코어룰/SKILL.md`](../../.claude/skills/너드나비스-코어룰/SKILL.md) **C34** 단일 SOT. 본 파일은 레포 `.live/` 경로에서 junction 경유로 접근하며, 중앙 저장소는 `$HOME/.claude/nerdnavis-live/`. + +## 1. `.live/` 용도 + +세션 중 변경된 설정·규칙·에이전트 정의·조직 기억을 **세션 갱신 없이 즉시 반영**하기 위한 PC 로컬 실시간 공유 채널. 같은 PC 내 모든 세션(worktree 경계 무관)이 자동 주입받는다. + +## 2. 더미 파일 패턴 + +- 파일명: `{변경 대상 파일명 또는 주제}.md` +- 예: `CLAUDE.md.live`·`C34_memory_확장.md`·`pd_지시_50.md` +- 본문: 변경 요지 append-only. 최대 8,000자 + +## 3. 생명주기 + +| 시점 | 상태 | 처리 | +|------|------|------| +| 변경 발생 | PM이 `.live/{파일명}` append | 원본 수정과 동시 수행 | +| 같은 PC 다른 세션 | UserPromptSubmit hook 자동 주입 | 증분만 읽기 (토큰 비용 최소) | +| "세션 공유"·push 시점 | P21-2 트리거 | 원본 반영 확인 후 `.live/` 비움(README.md·.junction-marker 제외) + commit + push | + +## 4. 세션 간 공유 시나리오 + +### 같은 PC 내 +1. 세션 A에서 원본 수정 + `.live/` append +2. 세션 B 다음 프롬프트 → UserPromptSubmit hook `live_inject.sh` 증분 주입 +3. 즉시 인지 (git 개입 없음) + +### 다른 PC 간 +1. 세션 A "세션 공유" (P21-2) → `.live/` 비움 + commit + push +2. 세션 B (다른 PC) "세션 갱신" (P21) → git pull → SessionStart hook 자동 복원 + +## 5. 참조 + +- **SKILL.md C34** — PC 로컬 실시간 공유 중앙화 체계 (단일 SOT, 헌법급) +- **SKILL.md C21** — 작업 완료 즉시 공유·PM 능동 확인 (내부 공유/공유 완료 2단계) +- **scripts/live_junction_ensure.sh** — junction 자동 보장 (SessionStart + UserPromptSubmit hook) +- **scripts/live_inject.sh** — UserPromptSubmit hook 증분 주입 +- **scripts/live_session_load.sh** — SessionStart 전량 1회 로드 + +## 변경 이력 + +- 2026-04-19: 전 세션 초기 sentinel 손실 시 원본 소실 +- 2026-04-20: #48 D 집행으로 복구. 중앙 저장소에 신규 작성 (모든 PC 자동 동기화) diff --git a/memory/org/audit_logs/.gitkeep b/memory/org/audit_logs/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/memory/org/audit_logs/README.md b/memory/org/audit_logs/README.md new file mode 100644 index 0000000..099ddba --- /dev/null +++ b/memory/org/audit_logs/README.md @@ -0,0 +1,43 @@ +# C35 audit 로그 PC 간 공유 SOT + +> 2026-04-20 #48 G 집행 신설. C34-17 audit 자산 특수 조항 기반. + +## 구조 + +``` +memory/org/audit_logs/ +├── {hostname_A}/ +│ ├── auditor_calls/YYYY-MM-DD.log +│ ├── warning_ignored/YYYY-MM-DD.log +│ └── bypass_log/YYYY-MM-DD.log +├── {hostname_B}/ +│ └── ... +``` + +## 동작 + +- 각 PC hostname 폴더만 **자기 PC 로그** (다른 PC 로그는 Read-only 참조) +- SessionStart hook `sync_audit_repo_to_central.sh`: 자기 PC 폴더 → `$HOME/.claude/nerdnavis-audit/` 중앙 sync +- post-commit hook `sync_audit_central_to_repo.sh`: 중앙 → 자기 PC hostname 폴더 sync (레포 mtime 보호) +- PC 간 로그 공유: git push + 다른 PC git pull 로 `{hostname_A}/` 로그를 다른 PC에서 Read 가능 + +## 목적 + +- PD님 2026-04-20 직접 지시 "어떤 PC에서 작업을 하든 항상 일관 된 상태로 업무를 진행할 수 있도록 철저하게 동시화" +- 헌법 제1원칙 ⑤ 세션·PC 연속성 보장 +- C35-10 경고 무시 PD 우선 보고 + 장기 패턴 분석 개선 사이클의 전사 입력 데이터 확보 +- 본 PC에서 다른 PC UNRESOLVED 해소 불가 문제 해소 (2026-04-19 실증) + +## 보안·프라이버시 + +- `.log` 파일은 호출 시각·경고 target·BYPASS 사유 텍스트만 기록 +- 민감 정보 기록 금지 (C35-10 BYPASS 사유 작성 시 유의) + +## 참조 + +- **C34** PC 로컬 실시간 공유 중앙화 체계 — 3종 자산 (Live·memory·audit) +- **C34-17** audit 자산 특수 조항 +- **C35-9** hook 3층 구조 (감사 호출 기록 + UNRESOLVED 경고) +- **C35-10** 경고 무시 PD 우선 보고 + 장기 패턴 분석 +- **C36** PM 자율 판단 범위 상한 (audit 중앙화 결정의 헌법급 근거) +- `scripts/audit_junction_ensure.sh` · `sync_audit_repo_to_central.sh` · `sync_audit_central_to_repo.sh` diff --git a/memory/org/feedback_pm_over_conservative_interpretation.md b/memory/org/feedback_pm_over_conservative_interpretation.md index 6bf0869..ee3375e 100644 --- a/memory/org/feedback_pm_over_conservative_interpretation.md +++ b/memory/org/feedback_pm_over_conservative_interpretation.md @@ -2,7 +2,7 @@ **신설일**: 2026-04-18 **기록 주체**: pm-auditor (모드 C 메타 감사) -**재발 횟수 (2026-04-18 최최종 시점)**: **4회차 변종 재발 판정** (PM 자진 상정) — 세션 대화로그 누락 사건으로 "기록 범위 자의적 축소" 형태의 변종 패턴 추가 발생. 상세: `memory/org/feedback_session_log_coverage_gap.md`. **PM 역할 재검토 자진 상정 대상** (C19-5·C23-3 결합) +**재발 횟수 (2026-04-20 시점)**: **6회차 변종 재발 판정** — 2026-04-20 #48 G 안건에서 PM이 헌법 제1원칙 ⑤(세션·PC 연속성)에 역행 축소 시도. PD님 직접 지시로 **C36 신설** 구조 차단 + C31-H 체크리스트 + feedback 적용 범위 제한. **7회차 재발 시 PM 역할 재검토 자진 상정 의무** **위험도**: Critical — 반복 시 PM 역할 재검토 근거 (C19-5 · C23-3 결합) --- @@ -139,3 +139,4 @@ C31-E 그룹에 다음 문항 추가 검토: | 2026-04-18 최종 | PM 자인 + pm-auditor 메타 감사 | **3회차 재발 판정 업데이트** — 원칙 1 진화 3회(1ceec2b·bc9c8ed·15bf649) 모두 PD님 직접 축약 개입. 사례 3 추가: 본 세션 m1·m2·m3 집행 시 PM이 상단 배너 방식 1차 제시 → PD님 "최종 내용만" 재지시로 재재개정. **4회차 재발 시 PM 역할 재검토 자진 상정**. 자산 1(전 에이전트 병렬 점검)이 재발 방지 3층 구조 완성 | | 2026-04-18 최최종 | PM 자진 상정 (PD님 로그 누락 지적) | **4회차 변종 재발 판정** — 세션 대화로그 누락 사건. 수상한잡화점 PM 직접 작성 없이 Agent 위임 우회 + 코어프레임워크 "false positive" 자가 회피. "기록 범위 자의적 축소" 형태의 심층 원인 동일 변종. 상세: `feedback_session_log_coverage_gap.md`. **PM 역할 재검토 자진 상정 대상** — pm-auditor 재감사 호출 + PD님 처분 대기. 재발 방지 6종 즉시 집행 (P24 기록 대상 기준 명확화·C31-D 확장·SessionEnd hook 강화·소급 대화로그 작성·본 feedback 갱신·session_log_coverage_gap feedback 신설) | | 2026-04-18 추가 | PM 자진 상정 (PD님 폐기 표기 본문 잔존 지적) | **5회차 변종 재발 판정** — 폐기·통합·강등 조항의 `~~취소선~~` 1줄 표기 본문 잔존 패턴. C7·C8·C12·C15·P20·P24·P27 폐기 표기를 본문에 유지. PD님 "이미 삭제되어서 없어진 내용을 최신 문서에 담지 말고 아카이브만 하고 필요시 참조" 명시로 재발 판정. "번호 체계 연속성 보존 = 폐기 표기 유지" 변종. 상세: `feedback_deprecated_section_retention.md`. **C14-5-확장 코어룰 신설**로 재발 방지. **PM 역할 재검토 자진 상정 강도 상향** | +| 2026-04-20 #48 G | PM 자진 상정 (PD님 PC별 독립 감사 본래 의도 아님 지적) | **6회차 변종 재발 판정** — PM이 G 안건을 "검토 착수 + 4문항 실질 필요성 검증 선행" 권고로 축소 시도. 헌법 제1원칙 ⑤(세션·PC 연속성)에 역행하여 "PC별 독립 감사 본래 의도 상충 가능"으로 희석. PD님 직접 지적: "PC 별 독립 감사는 본래 의도가 아님. 모든 PC에서 일관 된 관리가 가능한 '중앙 통합'으로 해야 함. 추후에는 기본 코어 룰과 조직 규칙에 맞지 않는 제안은 배제하도록, PM이 자율적 판단으로 코어룰이나 조직 룰에 영향을 주는 결정을 임의대로 변형하지 못하도록 코어룰 및 프로젝트 룰에도 보완점을 찾아서 반영." **C36 신설** (PM 자율 판단 범위 상한) + **C31-H 체크리스트** + **feedback_pm_surface_rationale_proposal.md 적용 범위 제한** + **pm-auditor 5-E 신설** + **P11 보완**으로 구조 차단. **7회차 재발 시 PM 역할 재검토 자진 상정 의무** | diff --git a/memory/org/feedback_pm_surface_rationale_proposal.md b/memory/org/feedback_pm_surface_rationale_proposal.md index 24e0e6f..e71a3eb 100644 --- a/memory/org/feedback_pm_surface_rationale_proposal.md +++ b/memory/org/feedback_pm_surface_rationale_proposal.md @@ -6,6 +6,17 @@ type: feedback # PM "실질 필요성 없음에도 표면적 근거로 제안" 패턴 +## 🚨 적용 범위 제한 (2026-04-20 C36 연계) + +본 체크리스트(4문항)는 **구현·실무 수준에만 적용**한다. **방향·원칙 수준에는 적용 금지** — 원칙·방향은 PD님 결정 영역이며 PM 실질 필요성 검증 대상이 아니다. + +**C36-2 판정 기준 3종 해당 시 본 체크리스트 적용 금지**: +- (a) 헌법 제1원칙·C·P 본문 문구 직접 수정·삭제·신설 제안 +- (b) 기존 PD님 승인 완료 방향의 적용 범위·외연 조정 제안 +- (c) 규칙 간 우선순위·충돌 해석 변경 제안 + +**실증**: 2026-04-20 #48 G 안건에서 PM이 본 체크리스트를 헌법 제1원칙 ⑤(세션·PC 연속성) 직결 안건에 오적용하여 "검토 착수 + 4문항 검증 선행" 축소 권고 제시. PD님 직접 지적 → C36 신설로 구조 차단. + ## 실증 (2026-04-19) PD님 sentinel·BYPASS·sync 3연속 결함 수습 완료 후, verify_setup.ps1 FAIL 1건(`paths.local.json` 부재)에 대한 후속 검토 중 PM이 다음 권고: diff --git a/scripts/audit_junction_ensure.sh b/scripts/audit_junction_ensure.sh new file mode 100644 index 0000000..29b9dfb --- /dev/null +++ b/scripts/audit_junction_ensure.sh @@ -0,0 +1,78 @@ +#!/bin/bash +# SessionStart + UserPromptSubmit hook — C35 audit 로그 3종 디렉토리 중앙 junction 보장 +# 2026-04-20 #48 G 집행 신설 — PD님 직접 지시 "어떤 PC에서도 일관 상태 동시화" +# 관련 규칙: C34-17 audit 특수 조항 · C36 PM 재량 상한 · 헌법 제1원칙 ⑤ + +CENTRAL_AUDIT="$HOME/.claude/nerdnavis-audit" +MARKER_NAME=".junction-marker" + +# 디렉토리 매핑: 로컬 디렉토리명(점 제외) | 중앙 하위 디렉토리명 +MAPPINGS=( + "nerdnavis_auditor_calls|auditor_calls" + "nerdnavis_warning_ignored|warning_ignored" + "nerdnavis_bypass_log|bypass_log" +) + +# 1. 중앙 저장소 최상위 + marker 보장 +mkdir -p "$CENTRAL_AUDIT" 2>/dev/null +if [ ! -f "$CENTRAL_AUDIT/$MARKER_NAME" ]; then + echo "nerdnavis-audit central junction target (C34-17, 2026-04-20 #48 G)" > "$CENTRAL_AUDIT/$MARKER_NAME" 2>/dev/null +fi + +# 2. 각 매핑 처리 +for MAPPING in "${MAPPINGS[@]}"; do + LOCAL_NAME="${MAPPING%|*}" + CENTRAL_SUB="${MAPPING#*|}" + LOCAL_DIR="$HOME/.claude/.$LOCAL_NAME" + CENTRAL_DIR="$CENTRAL_AUDIT/$CENTRAL_SUB" + + # 중앙 하위 디렉토리 + sub marker 보장 + mkdir -p "$CENTRAL_DIR" 2>/dev/null + if [ ! -f "$CENTRAL_DIR/$MARKER_NAME" ]; then + echo "nerdnavis-audit/$CENTRAL_SUB junction target (C34-17)" > "$CENTRAL_DIR/$MARKER_NAME" 2>/dev/null + fi + + # sentinel 판정: 로컬에서 marker 접근 가능하면 이미 연결 완료 + if [ -f "$LOCAL_DIR/$MARKER_NAME" ]; then + continue + fi + + # 로컬이 실체 디렉토리이면 백업 후 이관 (C6-1 원본 보호) + if [ -d "$LOCAL_DIR" ] && [ ! -L "$LOCAL_DIR" ]; then + BAK="$LOCAL_DIR.bak_$(date +%Y%m%d_%H%M)" + # 기존 파일 중앙으로 이관 (덮어쓰기 안 함) + for f in "$LOCAL_DIR"/*.log "$LOCAL_DIR"/*.txt; do + [ -f "$f" ] || continue + BASENAME=$(basename "$f") + [ ! -f "$CENTRAL_DIR/$BASENAME" ] && cp "$f" "$CENTRAL_DIR/$BASENAME" 2>/dev/null + done + mv "$LOCAL_DIR" "$BAK" 2>/dev/null || { echo "⚠️ [Audit Junction:$CENTRAL_SUB] 백업 실패 — Degraded" >&2; continue; } + echo "📦 [Audit Junction:$CENTRAL_SUB] 기존 백업: $BAK" + fi + + # Junction 생성 (3회 재시도) + ATTEMPT=0 + while [ "$ATTEMPT" -lt "3" ]; do + ATTEMPT=$((ATTEMPT + 1)) + if command -v powershell >/dev/null 2>&1; then + CENTRAL_WIN=$(cygpath -w "$CENTRAL_DIR" 2>/dev/null || echo "$CENTRAL_DIR") + LOCAL_WIN=$(cygpath -w "$LOCAL_DIR" 2>/dev/null || echo "$LOCAL_DIR") + powershell -NoProfile -ExecutionPolicy Bypass -Command "New-Item -ItemType Junction -Path '$LOCAL_WIN' -Target '$CENTRAL_WIN' -Force | Out-Null" >/dev/null 2>&1 + else + ln -s "$CENTRAL_DIR" "$LOCAL_DIR" 2>/dev/null + fi + if [ -f "$LOCAL_DIR/$MARKER_NAME" ]; then + [ "$ATTEMPT" -eq 1 ] && echo "✅ [Audit Junction:$CENTRAL_SUB] $LOCAL_DIR → $CENTRAL_DIR" + [ "$ATTEMPT" -gt 1 ] && echo "✅ [Audit Junction:$CENTRAL_SUB] 연결 성공 (재시도 $ATTEMPT회)" + break + fi + sleep 1 + done + + if [ ! -f "$LOCAL_DIR/$MARKER_NAME" ]; then + mkdir -p "$LOCAL_DIR" 2>/dev/null + echo "⚠️ [Audit Junction:$CENTRAL_SUB] 생성 실패 — Degraded 모드 (로컬 사용)" >&2 + fi +done + +exit 0 diff --git a/scripts/git-hooks/post-commit b/scripts/git-hooks/post-commit index 81df898..cb97fad 100644 --- a/scripts/git-hooks/post-commit +++ b/scripts/git-hooks/post-commit @@ -25,4 +25,8 @@ bash "$SCRIPT" update 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/sync_audit_central_to_repo.sh b/scripts/sync_audit_central_to_repo.sh new file mode 100644 index 0000000..79ba603 --- /dev/null +++ b/scripts/sync_audit_central_to_repo.sh @@ -0,0 +1,41 @@ +#!/bin/bash +# post-commit hook — 중앙 audit 로그를 레포 memory/org/audit_logs/{hostname}/ 로 sync +# 2026-04-20 #48 G 집행 신설. C34-17 sync 4계층 중 "중앙 → 레포" 방향 +# 레포 mtime 보호 (D안 패턴 준용, C34-16 조항 6) + +REPO_ROOT=$(git rev-parse --show-toplevel 2>/dev/null) +[ -z "$REPO_ROOT" ] && exit 0 + +CENTRAL_AUDIT="$HOME/.claude/nerdnavis-audit" +[ ! -d "$CENTRAL_AUDIT" ] && exit 0 + +HOSTNAME_TAG=$(hostname 2>/dev/null | tr -d '[:space:]' | tr -cd '[:alnum:]-_' | head -c 32) +[ -z "$HOSTNAME_TAG" ] && HOSTNAME_TAG="unknown" + +REPO_AUDIT="$REPO_ROOT/memory/org/audit_logs/$HOSTNAME_TAG" +mkdir -p "$REPO_AUDIT" 2>/dev/null + +SUBDIRS=("auditor_calls" "warning_ignored" "bypass_log") + +for SUB in "${SUBDIRS[@]}"; do + CENTRAL_SUB="$CENTRAL_AUDIT/$SUB" + [ ! -d "$CENTRAL_SUB" ] && continue + REPO_SUB="$REPO_AUDIT/$SUB" + mkdir -p "$REPO_SUB" 2>/dev/null + + for f in "$CENTRAL_SUB"/*.log; do + [ -f "$f" ] || continue + BASENAME=$(basename "$f") + [ "$BASENAME" = ".junction-marker" ] && continue + REPO_FILE="$REPO_SUB/$BASENAME" + + # 레포 mtime 보호: 레포가 중앙보다 최신이면 스킵 + if [ -f "$REPO_FILE" ] && [ "$REPO_FILE" -nt "$f" ]; then + echo "⚠️ [Audit Sync→Repo] 레포 최신 — 덮어쓰기 스킵: $SUB/$BASENAME" >&2 + continue + fi + cp "$f" "$REPO_FILE" 2>/dev/null + done +done + +exit 0 diff --git a/scripts/sync_audit_repo_to_central.sh b/scripts/sync_audit_repo_to_central.sh new file mode 100644 index 0000000..abd4e6e --- /dev/null +++ b/scripts/sync_audit_repo_to_central.sh @@ -0,0 +1,48 @@ +#!/bin/bash +# SessionStart hook — 레포 memory/org/audit_logs/ 를 중앙으로 sync (git pull 직후 최신화) +# 2026-04-20 #48 G 집행 신설. C34-17 sync 4계층 중 "레포 → 중앙" 방향 +# 각 PC hostname 폴더만 자기 PC 로그이고 그 외는 다른 PC 로그 (PC 간 공유) + +REPO_ROOT=$(git rev-parse --show-toplevel 2>/dev/null) +[ -z "$REPO_ROOT" ] && exit 0 + +REPO_AUDIT="$REPO_ROOT/memory/org/audit_logs" +[ ! -d "$REPO_AUDIT" ] && exit 0 + +CENTRAL_AUDIT="$HOME/.claude/nerdnavis-audit" +[ ! -d "$CENTRAL_AUDIT" ] && exit 0 + +HOSTNAME_TAG=$(hostname 2>/dev/null | tr -d '[:space:]' | tr -cd '[:alnum:]-_' | head -c 32) +[ -z "$HOSTNAME_TAG" ] && HOSTNAME_TAG="unknown" + +SUBDIRS=("auditor_calls" "warning_ignored" "bypass_log") + +# 자기 PC hostname 폴더: 레포 → 중앙 (unflushed 중앙 변경 대피 후 레포본 복원) +SELF_DIR="$REPO_AUDIT/$HOSTNAME_TAG" +if [ -d "$SELF_DIR" ]; then + for SUB in "${SUBDIRS[@]}"; do + CENTRAL_SUB="$CENTRAL_AUDIT/$SUB" + REPO_SUB="$SELF_DIR/$SUB" + [ ! -d "$REPO_SUB" ] && continue + mkdir -p "$CENTRAL_SUB" 2>/dev/null + + for f in "$REPO_SUB"/*.log; do + [ -f "$f" ] || continue + BASENAME=$(basename "$f") + CENTRAL_FILE="$CENTRAL_SUB/$BASENAME" + + # unflushed 중앙 대피: 중앙이 레포보다 최신이고 레포 HEAD 커밋 미반영이면 대피 + if [ -f "$CENTRAL_FILE" ] && [ "$CENTRAL_FILE" -nt "$f" ]; then + if ! git -C "$REPO_ROOT" log --oneline HEAD -- "memory/org/audit_logs/$HOSTNAME_TAG/$SUB/$BASENAME" 2>/dev/null | grep -q .; then + CONFLICT="$CENTRAL_AUDIT.conflict-$(date +%Y%m%d_%H%M%S)" + mkdir -p "$CONFLICT/$SUB" 2>/dev/null + cp "$CENTRAL_FILE" "$CONFLICT/$SUB/$BASENAME" 2>/dev/null + echo "⚠️ [Audit Sync Repo→Central] 중앙 unflushed 대피: $CONFLICT/$SUB/$BASENAME" >&2 + fi + fi + cp "$f" "$CENTRAL_FILE" 2>/dev/null + done + done +fi + +exit 0