diff --git a/memory/skill_measurement_sot.md b/memory/skill_measurement_sot.md new file mode 100644 index 0000000..5efabd3 --- /dev/null +++ b/memory/skill_measurement_sot.md @@ -0,0 +1,144 @@ +# SKILL 동적 로딩 운영 측정 SOT (Phase 5) + +> **신설 일자**: 2026-05-07 +> **근거**: 2026-05-07 SKILL 동적 로딩 분할 정식 도입 (commit `18fc680`) +> **목적**: 분할 도입 후 토큰 절감률·매칭 정확도·헌법급 위반 발생 빈도 점진 측정 +> **운영 영역**: PM 분기별 review + 운영자 수동 수집 + 자동화 가능 영역 점진 보강 + +--- + +## 1. 측정 메트릭 4종 + +| # | 메트릭 | 측정 방식 | 목표 | 임계 알림 | +|---|--------|----------|------|---------| +| **M1** | 세션당 시작 토큰 | log 분석 (수동·자동 보강) | < 15K (현 60K 대비 75% 절감) | > 25K 시 경고 | +| **M2** | SKILL 활성화 정확도 | 헌법급 위반 사례 / 전체 작업 | < 1% (월 분석) | ≥ 1건/월 시 review | +| **M3** | 트리거 매칭 정밀도 (False Positive율) | 불필요 SKILL 활성 / 활성 총수 | < 10% | > 20% 시 description 튜닝 | +| **M4** | False Negative율 | 활성 필요했는데 비활성 / 활성 필요 시나리오 | < 10% | > 5% 시 description 보강 | + +--- + +## 2. 측정 데이터 누적 위치 + +### 2-A. 본 SOT (`memory/skill_measurement_sot.md`) +- 메트릭 정의 + 분기별 review 결과 누적 +- 운영자 수동 기입 + +### 2-B. 자동 수집 영역 (운영 후 점진 보강) +- `scripts/skill_trigger_audit.sh` (PostToolUse) — false negative 신호 수집 +- `scripts/c35_obligation_check.sh` (PostToolUse) — 의무 호출 누락 신호 수집 +- 신호 누적 위치: `$HOME/.claude/.skill_metrics/` (PC 로컬, 휘발성) + +--- + +## 3. 베이스라인 데이터 (2026-05-07 분할 도입 시점) + +### 3-A. SKILL.md 본문 분량 + +| 시점 | 본문 줄 수 | 본문 KB | 추정 토큰 | +|------|---------|--------|---------| +| 분할 전 (`SKILL.md.bak_20260507_0930.md`) | 3,043줄 | 190KB | ~50-60K | +| **분할 후 (현 시점)** | **~250줄** | **~15KB** | **~10-15K** | +| 감축률 | -91.8% | -92.1% | **-75% 추정** | + +### 3-B. SKILL 카탈로그 (11종 + 정식 SOT 1종 = 12종 등록) + +| SKILL | 분량 추정 | 항시 주입 대상 | +|-------|---------|------------| +| `bt-foundation` (L1 헌법급) | ~10K | 14 agent 모두 | +| `bt-index` (메타) | ~3K | 14 agent 모두 | +| `bt-commit-rules` | ~5K | 동적 (commit 작업 시) | +| `bt-task-delegation` | ~7K | 동적 (Task 위임 시) | +| `bt-data-protection` | ~5K | 동적 + balance-designer 항시 | +| `bt-session-mgmt` | ~7K | 동적 (세션 갱신·공유 시) | +| `bt-pd-tracking` | ~5K | 동적 (PD 지시 트래킹 시) | +| `bt-document-mgmt` | ~5K | 동적 (문서·규칙 변경 시) | +| `bt-c50-token-policy` | ~3K | 동적 (큰 작업 시) | +| `bt-archive-mgmt` | ~3K | 동적 (폐기·아카이브 시) | +| `bt-planning-fun` | ~3K | 기획팀 항시 | +| `BurningTimes-코어룰` (인덱스 SOT) | ~10K | 동적 (코어룰 인덱스 조회 시) | + +--- + +## 4. 분기별 Review 사이클 + +### 4-A. Review 시점 트리거 +- **분기 1회 (3개월마다)** PM 자체 review +- **임계 초과 발견 즉시** PM 자체 review (M2 ≥ 1건·M3 > 20%·M4 > 5%) + +### 4-B. Review 출력 항목 +1. 분기별 메트릭 4종 측정값 +2. 임계 위반 영역 식별 +3. description 키워드 튜닝 필요 SKILL 식별 +4. 헌법급 위반 사례 분석 (있다면) +5. 다음 분기 개선 안건 + +### 4-C. Review 결과 본 SOT 누적 + +```markdown +## YYYY-Q# Review (YYYY-MM-DD) +- M1 평균: __K +- M2 위반 건수: __건 +- M3 평균: __% +- M4 평균: __% +- 임계 초과: ____ +- 튜닝 안건: ____ +- 다음 분기 개선: ____ +``` + +--- + +## 5. 자동화 보강 영역 (운영 후 점진) + +### 5-A. 측정 자동화 후보 + +| 메트릭 | 자동화 가능성 | 구현 방법 | +|--------|----------|---------| +| M1 | 중간 | Claude Code log 파싱 (외부 도구 의존) | +| M2 | 낮음 | LLM 자가 보고 신뢰 영역 (수동 review 우선) | +| M3 | 중간 | `skill_trigger_audit.sh` 누적 신호 분석 | +| M4 | 중간 | `c35_obligation_check.sh` 의무 호출 누락 신호 | + +### 5-B. 신설 가능 자동화 스크립트 +- `scripts/skill_metrics_collect.sh` (SessionEnd hook 후보) — 세션 종료 시 측정 데이터 자동 수집 +- `scripts/skill_metrics_report.sh` (분기별 수동 실행) — 본 SOT 자동 갱신 + +위 스크립트는 **운영 데이터 1분기 누적 후 신설** 권고. 즉시 신설은 측정 대상 부재로 효과 X. + +--- + +## 6. 임계 위반 시 대응 절차 + +### 6-A. M2 헌법급 위반 발생 (≥ 1건) +1. 즉시 PM 자진 보고 (C3·C5 정합) +2. 위반 발생 SKILL 영역 식별 +3. description 키워드 보강 또는 hook 차단 강화 +4. 본 SOT에 사례 누적 (영구 자산) + +### 6-B. M3 False Positive율 > 20% +1. 활성 빈도 높은 SKILL description 키워드 분석 +2. 광범위 매칭 키워드 한정·축소 +3. 분기별 안건 상신 (PD review) + +### 6-C. M4 False Negative율 > 5% +1. 누락 영역 키워드 분석 (`skill_trigger_audit.sh` 신호) +2. 해당 SKILL description 키워드 보강 +3. hook 안전망 강화 (필요 시) + +--- + +## 7. 연관 자산 + +- **분할 설계 v1**: `공유/조직공지/2026-05-07_SKILL_동적로딩_분할_설계_v1.md` +- **PoC Phase 2 결과**: `memory/poc_skill_phase2_results.md` +- **이전 본문 백업**: `.claude/skills/BurningTimes-코어룰/SKILL.md.bak_20260507_0930.md` +- **Hook 운영**: `scripts/skill_trigger_audit.sh`·`c35_obligation_check.sh`·`hardboiled_empathy_check.sh`·`proactive_inference_check.sh` +- **신설 SKILL 11종**: `.claude/skills/bt-*/SKILL.md` + +--- + +## 8. 변경 이력 + +| 일시 | 변경 | +|------|------| +| 2026-05-07 | **v1 신설** — Phase 5 운영 측정 SOT 정식 시작 (분할 도입 직후 베이스라인 + 분기별 review 사이클) | diff --git a/scripts/audit_pattern_analyzer.sh.bak_20260420_1348 b/scripts/audit_pattern_analyzer.sh.bak_20260420_1348 deleted file mode 100644 index f6c46ce..0000000 --- a/scripts/audit_pattern_analyzer.sh.bak_20260420_1348 +++ /dev/null @@ -1,87 +0,0 @@ -#!/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_1113 b/scripts/auditor_call_log.sh.bak_20260420_1113 deleted file mode 100644 index 1cf9830..0000000 --- a/scripts/auditor_call_log.sh.bak_20260420_1113 +++ /dev/null @@ -1,33 +0,0 @@ -#!/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 미완료이면 해소 처리 - if grep -q "UNRESOLVED" "$wf" 2>/dev/null && ! tail -1 "$wf" | grep -q "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_call_log.sh.bak_20260420_1348.2 b/scripts/auditor_call_log.sh.bak_20260420_1348.2 deleted file mode 100644 index 5888c30..0000000 --- a/scripts/auditor_call_log.sh.bak_20260420_1348.2 +++ /dev/null @@ -1,34 +0,0 @@ -#!/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_guard.sh.bak_20260420_1348 b/scripts/auditor_guard.sh.bak_20260420_1348 deleted file mode 100644 index b941867..0000000 --- a/scripts/auditor_guard.sh.bak_20260420_1348 +++ /dev/null @@ -1,68 +0,0 @@ -#!/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/pm_context_restore.sh.bak_20260420_1112 b/scripts/pm_context_restore.sh.bak_20260420_1112 deleted file mode 100644 index b43efa5..0000000 --- a/scripts/pm_context_restore.sh.bak_20260420_1112 +++ /dev/null @@ -1,69 +0,0 @@ -#!/bin/bash -# SessionStart hook — PM 자기 업무 맥락 복원 -# 신설 근거: 2026-04-17 C29 위반 사건 (이전 세션 PM 업무 파악 실패) -# 관련 규칙: P21-5B, P24 읽기 의무, C31 자기검증 - -REPO_ROOT=$(git rev-parse --show-toplevel 2>/dev/null) -[ -z "$REPO_ROOT" ] && exit 0 - -LOG_ROOT="$REPO_ROOT/공유/대화로그" -[ ! -d "$LOG_ROOT" ] && exit 0 - -TODAY=$(date +%Y-%m-%d) -YESTERDAY=$(date -d "yesterday" +%Y-%m-%d 2>/dev/null || date -v-1d +%Y-%m-%d 2>/dev/null) - -echo "" -echo "🧠 [PM 맥락 복원] 최근 2일 대화로그 자동 스캔" - -# 당일 로그 부재 감지 (P24 위반 플래그) -MISSING_TODAY=0 -for PROJ in "$LOG_ROOT"/*/; do - PROJ_NAME=$(basename "$PROJ") - [ "$PROJ_NAME" = "INDEX.md" ] && continue - if [ -d "$PROJ" ]; then - TODAY_LOG="$PROJ$TODAY.md" - if [ ! -f "$TODAY_LOG" ]; then - # 당일 작업이 있는데 로그 없으면 경고 (git log로 당일 커밋 확인) - TODAY_COMMITS=$(git log --since="$TODAY 00:00" --oneline 2>/dev/null | wc -l | tr -d ' ') - if [ "$TODAY_COMMITS" -gt "0" ]; then - if [ "$MISSING_TODAY" -eq "0" ]; then - echo "⚠️ P24 위반 감지 — 당일 대화로그 미작성:" - MISSING_TODAY=1 - fi - echo " - $PROJ_NAME/$TODAY.md (당일 커밋 ${TODAY_COMMITS}건 존재)" - fi - fi - fi -done - -# 최근 2일 로그 목록 출력 -echo "" -echo "📚 최근 2일 대화로그 (Read 권장):" -FOUND=0 -for PROJ in "$LOG_ROOT"/*/; do - PROJ_NAME=$(basename "$PROJ") - [ "$PROJ_NAME" = "INDEX.md" ] && continue - if [ -d "$PROJ" ]; then - for DATE in "$TODAY" "$YESTERDAY"; do - LOG_FILE="$PROJ$DATE.md" - if [ -f "$LOG_FILE" ]; then - SIZE=$(wc -c < "$LOG_FILE" 2>/dev/null | tr -d ' ') - echo " - 공유/대화로그/$PROJ_NAME/$DATE.md (${SIZE}B)" - FOUND=1 - fi - done - fi -done - -[ "$FOUND" -eq "0" ] && echo " (최근 2일 로그 없음)" - -# PM 자기 커밋 최근 10건 (맥락 복원 보조) -echo "" -echo "📝 최근 커밋 10건 (PM 자기 업무 맥락):" -git log --oneline -10 2>/dev/null | sed 's/^/ /' - -echo "" -echo "→ P21-5B 수행: 위 대화로그를 Read하여 이전 세션 결정·방향 복원" -echo "→ C31 자기검증: 응답 발신 직전 C27~C30 준수 여부 확인 의무" - -exit 0 diff --git a/scripts/sync_audit_central_to_repo.sh b/scripts/sync_audit_central_to_repo.sh deleted file mode 100644 index 1c8a6de..0000000 --- a/scripts/sync_audit_central_to_repo.sh +++ /dev/null @@ -1,41 +0,0 @@ -#!/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/burningtimes-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 deleted file mode 100644 index 66c8c50..0000000 --- a/scripts/sync_audit_repo_to_central.sh +++ /dev/null @@ -1,48 +0,0 @@ -#!/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/burningtimes-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