#!/bin/bash # SessionStart hook + 수동 실행 (인자 `report` | `session_restore_report` | `auditor_window `) # C35-10 장기 행동 패턴 분석·개선 사이클 # 2026-04-19 신설 — PD님 직접 지시 "장기적 문제 행동 패턴 분석 + 점진적 개선" # 2026-04-23 확장 (BT4) — 감사관 E안 자동 윈도우 + session_restore_report 수동 발동 REPO_ROOT=$(git rev-parse --show-toplevel 2>/dev/null) [ -z "$REPO_ROOT" ] && exit 0 CALL_DIR="$HOME/.claude/.burningtimes_auditor_calls" WARN_DIR="$HOME/.claude/.burningtimes_warning_ignored" BYPASS_DIR="$HOME/.claude/.burningtimes_bypass_log" # ───────────────────────────────────────────────────────────────────── # 감사관 E안 자동 윈도우 (BT4, 2026-04-23) # 메커니즘: 마지막 해당 감사관 호출 시점 → 현재 = 자동 윈도우 # 최소 1일, 최대 30일 상한, --extend=N 수동 확장 # ───────────────────────────────────────────────────────────────────── get_auditor_window() { local auditor_name="$1" # pm-auditor | dev-auditor | plan-auditor local extend_override="$2" # 수동 확장 (일수, 선택) # 수동 확장 우선 if [ -n "$extend_override" ] && [ "$extend_override" -gt 0 ] 2>/dev/null; then echo "$extend_override" return 0 fi local now=$(date +%s) local last_call=0 # 호출 이력 파일 순회 (최신 로그부터) if [ -d "$CALL_DIR" ]; then for f in $(ls -t "$CALL_DIR"/*.log 2>/dev/null); do [ -f "$f" ] || continue # "pm-auditor called" 같은 패턴 grep, 최신 라인의 타임스탬프 추출 local line=$(grep -h "${auditor_name} called" "$f" 2>/dev/null | tail -1) if [ -n "$line" ]; then # 타임스탬프가 앞에 ISO/epoch 형태로 있다고 가정. epoch 시도 local ts=$(echo "$line" | grep -oE '[0-9]{10}' | head -1) if [ -n "$ts" ]; then last_call=$ts break fi # ISO 시도 (date 명령) local iso=$(echo "$line" | grep -oE '[0-9]{4}-[0-9]{2}-[0-9]{2}[T ][0-9]{2}:[0-9]{2}(:[0-9]{2})?' | head -1) if [ -n "$iso" ]; then last_call=$(date -d "$iso" +%s 2>/dev/null || echo 0) [ "$last_call" -gt 0 ] && break fi fi done fi # 마지막 호출 없으면 기본 7일 (초기·PC 이관 대비) if [ "$last_call" -eq 0 ]; then echo 7 return 0 fi # 공백일수 계산 local gap_sec=$((now - last_call)) local gap_days=$((gap_sec / 86400)) # 최소 1일·최대 30일 상한 [ "$gap_days" -lt 1 ] && gap_days=1 [ "$gap_days" -gt 30 ] && gap_days=30 echo "$gap_days" } # ───────────────────────────────────────────────────────────────────── # BT4 6계층 운영 모니터링 — session_restore_report # project_context_조직운영_archive.md 첫 엔트리 이동 시점 또는 수동 발동 # ───────────────────────────────────────────────────────────────────── generate_session_restore_report() { local arch_file="$REPO_ROOT/memory/org/project_context_조직운영_archive.md" local ts=$(date +%Y-%m-%d_%H%M) local report="$REPO_ROOT/memory/org/audit_pattern_analysis_6계층_${ts}.md" { echo "---" echo "name: 세션 시작 교훈 환기 6계층 운영 모니터링 보고서 (${ts})" echo "description: BT4 6계층 체계 운영 데이터 누적 분석. pm-auditor 지속 모니터링 SOT 기반. 개선 안건 식별 + PD 보고" echo "type: audit_pattern" echo "period: ${ts}" echo "trigger: $([ -s "$arch_file" ] && echo 'archive_entry_moved' || echo 'manual')" echo "---" echo "" echo "# BT4 6계층 운영 모니터링 보고서 — ${ts}" echo "" echo "## 1. 트리거 상태" if [ -s "$arch_file" ]; then local arch_count=$(grep -c "^- \[" "$arch_file" 2>/dev/null || echo 0) echo "- project_context_조직운영_archive.md 엔트리 수: $arch_count" else echo "- 수동 발동 (archive 미이동)" fi echo "" echo "## 2. 감사관 E안 자동 윈도우 실측" for a in pm-auditor dev-auditor plan-auditor; do local w=$(get_auditor_window "$a") echo "- ${a}: ${w}일" done echo "" echo "## 3. 계층별 발동 통계 (pm-auditor 수동 기입 영역)" echo "- 계층 0 고정 주입: 매 세션 1회 (기본 전제)" echo "- 계층 1 (1일): (기입)" echo "- 계층 2 (2~7일): (기입)" echo "- 계층 3 (>7일): (기입)" echo "- 계층 4 (--extend=N): (기입)" echo "- 계층 5 (내용축 트리거): (기입)" echo "" echo "## 4. 개선 안건 (pm-auditor 수동 기입)" echo "- (계층 추가·폐기·통합 / 트리거 조정 / 계층 0 대상 조정 / 감사관 윈도우 튜닝)" echo "" echo "## 5. PD 결정 요청" echo "- (pm-auditor 우선순위 기입)" echo "" echo "## 연관" echo "- \`memory/org/feedback_session_restore_monitoring.md\` (모니터링 SOT)" echo "- \`memory/org/project_context_조직운영.md\` (트리거 기반)" echo "- \`scripts/recent_feedback_brief.sh\` (6계층 구현)" } > "$report" echo "📊 [BT4 6계층] 운영 모니터링 보고서 생성: $report" } # 미해소 경고 건수 집계 (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 # 수동 발동 명령 처리 (BT4 2026-04-23 확장) TRIGGER="${1:-auto}" # auditor_window <감사관명> [--extend=N] — E안 자동 윈도우 조회 if [ "$TRIGGER" = "auditor_window" ]; then AUDITOR="${2:-pm-auditor}" EXTEND="" if [ "$3" = "--extend" ] && [ -n "$4" ]; then EXTEND="$4" fi get_auditor_window "$AUDITOR" "$EXTEND" exit 0 fi # session_restore_report — BT4 6계층 운영 모니터링 보고서 수동 발동 if [ "$TRIGGER" = "session_restore_report" ]; then generate_session_restore_report exit 0 fi # project_context_조직운영_archive.md 첫 엔트리 감지 → 자동 보고서 생성 ARCHIVE_FILE="$REPO_ROOT/memory/org/project_context_조직운영_archive.md" AUTO_SESSION_REPORT_FLAG="$HOME/.claude/.burningtimes_bt4_session_report_done" if [ -f "$ARCHIVE_FILE" ] && grep -q "^- \[" "$ARCHIVE_FILE" 2>/dev/null && [ ! -f "$AUTO_SESSION_REPORT_FLAG" ]; then generate_session_restore_report touch "$AUTO_SESSION_REPORT_FLAG" echo "📌 [BT4] archive 첫 엔트리 감지 — 운영 모니터링 보고서 자동 생성 (재발동 금지 플래그 설정)" fi # 월별 패턴 분석 보고서 (월 1일 자동 or 수동 `report` 인자) MONTH=$(date +%Y_%m) REPORT="$REPO_ROOT/memory/org/audit_pattern_analysis_${MONTH}.md" 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