chore(잔존 정리 + Phase 5 운영 측정 SOT): §6-D·§6-E 정리 + 운영 메트릭 4종 SOT 신설
PD 결정 "1, 3 작업 진행" 후속. ## 작업 1 — Phase 5 운영 측정 SOT 신설 memory/skill_measurement_sot.md - 메트릭 4종 정의 (세션당 시작 토큰·헌법급 위반·FP율·FN율) - 베이스라인 데이터 (분할 전 SKILL.md 3043줄/190KB → 분할 후 ~250줄/15KB, -91.8%) - 분기별 review 사이클 + 임계 위반 시 대응 절차 - 자동화 보강 영역 (운영 데이터 1분기 누적 후 점진) ## 작업 3 — 인수인계서 §6 잔존 정리 §6-D nerdnavis 키워드 백업 파일 5종 git rm: - audit_pattern_analyzer.sh.bak_20260420_1348 - auditor_call_log.sh.bak_20260420_1113·.bak_20260420_1348.2 - auditor_guard.sh.bak_20260420_1348 - pm_context_restore.sh.bak_20260420_1112 §6-E sync_audit 2종 git rm (C34 폐기 후속): - sync_audit_central_to_repo.sh - sync_audit_repo_to_central.sh ## 잔존 §6-A stupefied-spence-727cd7 worktree: 다른 프로세스 점유 잔존 (STILL LOCKED). 본 PC 재기동 후 정리 가능 — 별건 후순위. 근거: PD 결정 "1, 3 작업부터 진행"
This commit is contained in:
parent
18fc680f14
commit
d3968e92cb
|
|
@ -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 사이클) |
|
||||||
|
|
@ -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
|
|
||||||
|
|
@ -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
|
|
||||||
|
|
@ -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
|
|
||||||
|
|
@ -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
|
|
||||||
|
|
@ -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
|
|
||||||
|
|
@ -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
|
|
||||||
|
|
@ -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
|
|
||||||
Loading…
Reference in New Issue