From 23064353f90dbc11ca764e1bc3edde1b8b33fda8 Mon Sep 17 00:00:00 2001 From: swrring Date: Thu, 23 Apr 2026 00:20:06 +0900 Subject: [PATCH] =?UTF-8?q?feat(BT4=C2=B7Phase2):=206=EA=B3=84=EC=B8=B5=20?= =?UTF-8?q?=EC=8A=A4=ED=81=AC=EB=A6=BD=ED=8A=B8=20=EB=A1=9C=EC=A7=81=20+?= =?UTF-8?q?=20=EA=B0=90=EC=82=AC=EA=B4=80=20E=EC=95=88=20=EC=9E=90?= =?UTF-8?q?=EB=8F=99=20=EC=9C=88=EB=8F=84=EC=9A=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - recent_feedback_brief.sh: 7일 고정 → 6계층 동적 구조 · 계층 0 고정 주입 (tier: constitutional 자동 선별·활성 PD 지시·기각안·project_context) · 계층 1~4 공백일수 기반 자동 확장 + --extend 수동 · 계층 3 전수 탐색 모드 (>7일 공백) · 계층 5 내용축 트리거 (인프라 commit·PD 지시 변경·기획 경로) - audit_pattern_analyzer.sh: 감사관 E안 자동 윈도우 함수 get_auditor_window() · 마지막 호출 시점 → 현재 자동 산정 · 1일 최소·30일 상한·--extend 수동 · session_restore_report 수동 발동 · archive 첫 엔트리 감지 자동 발동 근거: PD 지시 BT4 1·2·3A·4E 안 채택 + pm-auditor 교차검증 반영 매니페스트: 2026-04-23_BT4_Phase2_scripts Co-Authored-By: Claude Opus 4.7 (1M context) --- scripts/audit_pattern_analyzer.sh | 147 +++++++++++++++++- scripts/recent_feedback_brief.sh | 242 +++++++++++++++++++++++++++--- 2 files changed, 364 insertions(+), 25 deletions(-) diff --git a/scripts/audit_pattern_analyzer.sh b/scripts/audit_pattern_analyzer.sh index 4148ea4..b09b0af 100644 --- a/scripts/audit_pattern_analyzer.sh +++ b/scripts/audit_pattern_analyzer.sh @@ -1,7 +1,8 @@ #!/bin/bash -# SessionStart hook + 수동 실행 (인자 `report`) +# 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 @@ -10,6 +11,120 @@ 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 @@ -28,10 +143,38 @@ if [ "$UNRESOLVED_NET" -gt 0 ]; then 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" -TRIGGER="${1:-auto}" if [ "$TRIGGER" = "report" ] || { [ "$(date +%d)" = "01" ] && [ ! -f "$REPORT" ]; }; then { diff --git a/scripts/recent_feedback_brief.sh b/scripts/recent_feedback_brief.sh index 4247c8e..c20a218 100644 --- a/scripts/recent_feedback_brief.sh +++ b/scripts/recent_feedback_brief.sh @@ -1,39 +1,235 @@ #!/bin/bash -# SessionStart hook — 최근 7일 내 신설·수정 feedback 메모리 요지 자동 주입 -# 신 PM 세션·다른 PC 세션이 본 세션의 핵심 교훈을 인지할 수 있도록 자동 환기 -# 2026-04-19 신설 — PD님 직접 지시 "공유 누락 재발 방지" -# 관련 규칙: C31 자기검증 · C33 조직 업무 공유·기록 체계 일관성 · 헌법 원칙 ⑤ +# SessionStart hook — 세션 시작 교훈 환기 체계 6계층 (BT4, 2026-04-23 PD 승인) +# 구 버전(7일 고정 10건 주입)에서 확장 — PD 지시 "1일 우선 + 필요 시 확장" +# 관련 규칙: C31-G 자기검증 · C33 조직 공유·기록 체계 · 헌법 원칙 ⑤ +# +# 6계층 구조 +# 계층 0: 고정 주입 (공백 무관) — 헌법급 feedback 9종(tier: constitutional 자동 선별) · 활성 PD 지시 로그 · 완료 아카이브 최근 5건 · 최근 7일 기각안 · project_context_조직운영 20개 +# 계층 1: 공백 ≤1일 → 1일 윈도우 (feedback·대화로그) +# 계층 2: 공백 2~7일 → 공백일수 자동 확장 +# 계층 3: 공백 >7일 → 전수 탐색 모드 (개수 기반 feedback 10건·대화로그 프로젝트당 3건) +# 계층 4: --extend=N 수동 확장 (환경변수 SESSION_RESTORE_EXTEND) +# 계층 5: 내용축 트리거 (인프라 commit·외부 레포·PD 키워드·기획 경로·순수 코드 연쇄) → 7일 max +# +# 모니터링: feedback_session_restore_monitoring.md (pm-auditor 운영 데이터 축적 SOT) REPO_ROOT=$(git rev-parse --show-toplevel 2>/dev/null) [ -z "$REPO_ROOT" ] && exit 0 MEMORY_DIR="$REPO_ROOT/memory/org" +DIALOG_DIR="$REPO_ROOT/공유/대화로그" +PD_LOG_DIR="$REPO_ROOT/공유/PD_지시_트래킹" [ ! -d "$MEMORY_DIR" ] && exit 0 -# 최근 7일 내 mtime feedback 파일 (최대 10건) -RECENT_FILES=$(find "$MEMORY_DIR" -name "feedback_*.md" -mtime -7 -type f 2>/dev/null | head -10) +NOW=$(date +%s) -if [ -z "$RECENT_FILES" ]; then - exit 0 +# ───────────────────────────────────────────────────────────────────── +# 계층 0: 고정 주입 (공백 무관) +# ───────────────────────────────────────────────────────────────────── + +echo "🏛️ [계층 0 · 고정 주입] 헌법급 feedback · 활성 PD 지시 · 기각안 · project_context" +echo "" + +# 0-A. 헌법급 feedback (frontmatter tier: constitutional 자동 선별) +CONST_FILES=$(grep -l "^tier: constitutional" "$MEMORY_DIR"/feedback_*.md 2>/dev/null | sort) +if [ -n "$CONST_FILES" ]; then + CONST_COUNT=$(echo "$CONST_FILES" | wc -l) + echo " 📌 헌법급 feedback $CONST_COUNT 건:" + while IFS= read -r file; do + [ -f "$file" ] || continue + name=$(basename "$file" .md) + desc=$(awk '/^description:/ {sub(/^description: /, ""); print; exit}' "$file" 2>/dev/null | cut -c 1-100) + echo " • $name" + [ -n "$desc" ] && echo " → $desc" + done <<< "$CONST_FILES" fi -COUNT=$(echo "$RECENT_FILES" | wc -l) -echo "🔍 [최근 7일 교훈 요지] $COUNT 건 — 세션 리더 필독 (C31 F·G 자기검증 참조):" +# 0-B. 활성 PD 지시 (개발팀·기획팀 활성 테이블) +echo "" +echo " 📋 활성 PD 지시:" +ACTIVE_LINES=$(grep -h "^| [A-Z0-9]" "$PD_LOG_DIR"/개발팀_PD_지시_로그.md "$PD_LOG_DIR"/기획팀_PD_지시_로그.md 2>/dev/null | grep -E "진행중|대기|보류" | head -10) +if [ -n "$ACTIVE_LINES" ]; then + echo "$ACTIVE_LINES" | while IFS= read -r line; do + id=$(echo "$line" | awk -F'|' '{print $2}' | xargs) + brief=$(echo "$line" | awk -F'|' '{print $4}' | cut -c 1-90) + status=$(echo "$line" | awk -F'|' '{print $5}' | xargs) + echo " • [$id · $status] $brief" + done +else + echo " (활성 지시 없음)" +fi -while IFS= read -r file; do - [ -f "$file" ] || continue - name=$(basename "$file" .md) - # frontmatter description 추출 (첫 줄 120자 제한) - desc=$(awk '/^description:/ {sub(/^description: /, ""); print; exit}' "$file" 2>/dev/null | cut -c 1-120) - if [ -n "$desc" ]; then - echo " • $name" - echo " → $desc" - fi -done <<< "$RECENT_FILES" +# 0-C. 완료 아카이브 최근 5건 +echo "" +echo " ✅ PD 지시 완료 아카이브 최근 5건:" +COMPLETED=$(grep -h "^| [A-Z0-9].*완료" "$PD_LOG_DIR"/개발팀_PD_지시_로그.md "$PD_LOG_DIR"/기획팀_PD_지시_로그.md 2>/dev/null | tail -5) +if [ -n "$COMPLETED" ]; then + echo "$COMPLETED" | while IFS= read -r line; do + id=$(echo "$line" | awk -F'|' '{print $2}' | xargs) + brief=$(echo "$line" | awk -F'|' '{print $4}' | cut -c 1-90) + echo " • [$id] $brief" + done +else + echo " (완료 아카이브 없음)" +fi + +# 0-D. 최근 7일 기각안 엔트리 (대화로그 "기각안" grep) +echo "" +echo " 🚫 최근 7일 기각안 요지:" +REJECTED=$(find "$DIALOG_DIR" -name "*.md" -mtime -7 -exec grep -l "기각안" {} \; 2>/dev/null | head -5) +if [ -n "$REJECTED" ]; then + echo "$REJECTED" | while IFS= read -r file; do + rel=${file#$REPO_ROOT/} + count=$(grep -c "^### 기각" "$file" 2>/dev/null || echo 0) + [ "$count" -gt 0 ] && echo " • $rel — $count 건" + done +else + echo " (최근 7일 기각안 엔트리 없음)" +fi + +# 0-E. project_context 활성 엔트리 요지 (최신 5개만 미리보기) +echo "" +echo " 📚 project_context_조직운영 (최신 5개):" +CTX_FILE="$MEMORY_DIR/project_context_조직운영.md" +if [ -f "$CTX_FILE" ]; then + grep "^- \[" "$CTX_FILE" | head -5 | while IFS= read -r line; do + echo " $line" + done +else + echo " (파일 없음)" +fi echo "" -echo "📖 [본문 Read 의무 — C31-G] 조직 내 공유 작업(C35-1) 착수 전 관련 메모리 본문 Read:" -echo " Read('memory/org/.md') 도구 호출로 재발 방지 체크·교훈 본문 확인" -echo " PD님 지시·지적 키워드와 매칭되는 메모리는 의사결정 전 선행 Read 필수" + +# ───────────────────────────────────────────────────────────────────── +# 활동 시각 실측 + 공백일수 산정 +# ───────────────────────────────────────────────────────────────────── + +# 마지막 commit 시각 +LAST_COMMIT=$(git log -1 --format=%ct 2>/dev/null || echo 0) + +# 최신 feedback mtime +LAST_FB=0 +if [ -d "$MEMORY_DIR" ]; then + LAST_FB=$(find "$MEMORY_DIR" -name "feedback_*.md" -printf '%T@\n' 2>/dev/null | sort -n | tail -1 | cut -d. -f1) + [ -z "$LAST_FB" ] && LAST_FB=0 +fi + +# 최신 대화로그 mtime +LAST_DL=0 +if [ -d "$DIALOG_DIR" ]; then + LAST_DL=$(find "$DIALOG_DIR" -name "*.md" -printf '%T@\n' 2>/dev/null | sort -n | tail -1 | cut -d. -f1) + [ -z "$LAST_DL" ] && LAST_DL=0 +fi + +# 최대값 +LAST_ACTIVITY=$LAST_COMMIT +[ "$LAST_FB" -gt "$LAST_ACTIVITY" ] && LAST_ACTIVITY=$LAST_FB +[ "$LAST_DL" -gt "$LAST_ACTIVITY" ] && LAST_ACTIVITY=$LAST_DL + +GAP_SEC=$((NOW - LAST_ACTIVITY)) +GAP_DAYS=$((GAP_SEC / 86400)) + +# ───────────────────────────────────────────────────────────────────── +# 계층 1~4: 공백일수 기반 동적 윈도우 +# ───────────────────────────────────────────────────────────────────── + +# 계층 5 내용축 트리거 감지 (공백 기반 윈도우와 max 채택) +TRIGGER_WINDOW=0 +TRIGGER_REASONS="" + +# 인프라 commit 감지 (당일 HEAD 커밋 기준) +INFRA_CHANGED=$(git log -1 --name-only --format='' 2>/dev/null | grep -E '(\.claude/skills/BurningTimes-코어룰/SKILL\.md|memory/org/feedback_|scripts/.*(hook|ensure|inject|gate|register|archive|sync)|setup/setup_|\.claude/settings|CLAUDE\.md|paths\.local\.json)' | head -1) +if [ -n "$INFRA_CHANGED" ]; then + TRIGGER_WINDOW=7 + TRIGGER_REASONS="$TRIGGER_REASONS · 인프라 commit 감지" +fi + +# 활성 PD 지시 로그 파일 변경 감지 (최근 1시간) +PD_LOG_RECENT=$(find "$PD_LOG_DIR" -name "*_로그.md" -mmin -60 2>/dev/null | head -1) +if [ -n "$PD_LOG_RECENT" ]; then + [ "$TRIGGER_WINDOW" -lt 7 ] && TRIGGER_WINDOW=7 + TRIGGER_REASONS="$TRIGGER_REASONS · PD 지시 상태 변경" +fi + +# 기획 경로 수정 감지 (당일 commit 기준) +PLAN_CHANGED=$(git log -1 --name-only --format='' 2>/dev/null | grep -E '프로젝트/.*/기획/' | head -1) +if [ -n "$PLAN_CHANGED" ]; then + [ "$TRIGGER_WINDOW" -lt 7 ] && TRIGGER_WINDOW=7 + TRIGGER_REASONS="$TRIGGER_REASONS · 기획 경로 수정" +fi + +# 시간축 윈도우 결정 +if [ -n "$SESSION_RESTORE_EXTEND" ] && [ "$SESSION_RESTORE_EXTEND" -gt 0 ] 2>/dev/null; then + WINDOW=$SESSION_RESTORE_EXTEND + LAYER_TAG="계층 4 · 수동 --extend=$SESSION_RESTORE_EXTEND" +elif [ "$GAP_DAYS" -le 1 ]; then + WINDOW=1 + LAYER_TAG="계층 1 · 세션 연속 (공백 ≤1일)" +elif [ "$GAP_DAYS" -le 7 ]; then + WINDOW=$GAP_DAYS + LAYER_TAG="계층 2 · 단기 공백 ($GAP_DAYS일 자동 확장)" +else + WINDOW=0 + LAYER_TAG="계층 3 · 장기 공백 (${GAP_DAYS}일) → 전수 탐색 모드" +fi + +# 계층 5 max 채택 +if [ "$TRIGGER_WINDOW" -gt "$WINDOW" ]; then + WINDOW=$TRIGGER_WINDOW + LAYER_TAG="$LAYER_TAG + 계층 5 ($TRIGGER_WINDOW일$TRIGGER_REASONS)" +fi + +echo "⏱️ [활동 시각] 마지막 활동 ${GAP_DAYS}일 전 · $LAYER_TAG" +echo "" + +# ───────────────────────────────────────────────────────────────────── +# feedback·대화로그 주입 +# ───────────────────────────────────────────────────────────────────── + +if [ "$WINDOW" -eq 0 ]; then + # 계층 3 전수 탐색 모드 — 개수 기반 + echo "🔭 [계층 3 · 전수 탐색] 최근 활동 지점부터 역순 복원:" + echo "" + echo " 📘 feedback 최신 10건:" + find "$MEMORY_DIR" -name "feedback_*.md" -type f -printf '%T@ %p\n' 2>/dev/null | sort -rn | head -10 | awk '{print $2}' | while IFS= read -r file; do + name=$(basename "$file" .md) + desc=$(awk '/^description:/ {sub(/^description: /, ""); print; exit}' "$file" 2>/dev/null | cut -c 1-100) + echo " • $name" + [ -n "$desc" ] && echo " → $desc" + done + + echo "" + echo " 📝 대화로그 프로젝트당 최신 3건:" + for proj_dir in "$DIALOG_DIR"/*/; do + [ -d "$proj_dir" ] || continue + proj=$(basename "$proj_dir") + find "$proj_dir" -name "*.md" -type f -printf '%T@ %p\n' 2>/dev/null | sort -rn | head -3 | awk '{print $2}' | while IFS= read -r file; do + rel=${file#$REPO_ROOT/} + echo " • $rel" + done + done +else + # 계층 1·2·4·5 — 기간 기반 + echo "📘 [feedback $WINDOW일 윈도우]:" + RECENT_FB=$(find "$MEMORY_DIR" -name "feedback_*.md" -mtime -${WINDOW} -type f 2>/dev/null | head -15) + if [ -n "$RECENT_FB" ]; then + FB_COUNT=$(echo "$RECENT_FB" | wc -l) + echo " ($FB_COUNT 건)" + echo "$RECENT_FB" | while IFS= read -r file; do + name=$(basename "$file" .md) + desc=$(awk '/^description:/ {sub(/^description: /, ""); print; exit}' "$file" 2>/dev/null | cut -c 1-100) + echo " • $name" + [ -n "$desc" ] && echo " → $desc" + done + else + echo " (해당 윈도우 내 feedback 없음)" + fi +fi + +echo "" +echo "📖 [본문 Read 의무 — C31-G] 의사결정 전 관련 메모리 본문 선행 Read 필수" +echo " PD님 지시·지적 키워드 매칭 메모리·헌법급 feedback은 계층 0에서 이미 환기됨" +echo " 상세: memory/org/feedback_session_restore_monitoring.md (6계층 운영 모니터링 SOT)" exit 0