feat(BT4·Phase2): 6계층 스크립트 로직 + 감사관 E안 자동 윈도우

- 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) <noreply@anthropic.com>
This commit is contained in:
깃 관리자 2026-04-23 00:20:06 +09:00
parent d35b0cc627
commit 23064353f9
2 changed files with 364 additions and 25 deletions

View File

@ -1,7 +1,8 @@
#!/bin/bash #!/bin/bash
# SessionStart hook + 수동 실행 (인자 `report`) # SessionStart hook + 수동 실행 (인자 `report` | `session_restore_report` | `auditor_window <name>`)
# C35-10 장기 행동 패턴 분석·개선 사이클 # C35-10 장기 행동 패턴 분석·개선 사이클
# 2026-04-19 신설 — PD님 직접 지시 "장기적 문제 행동 패턴 분석 + 점진적 개선" # 2026-04-19 신설 — PD님 직접 지시 "장기적 문제 행동 패턴 분석 + 점진적 개선"
# 2026-04-23 확장 (BT4) — 감사관 E안 자동 윈도우 + session_restore_report 수동 발동
REPO_ROOT=$(git rev-parse --show-toplevel 2>/dev/null) REPO_ROOT=$(git rev-parse --show-toplevel 2>/dev/null)
[ -z "$REPO_ROOT" ] && exit 0 [ -z "$REPO_ROOT" ] && exit 0
@ -10,6 +11,120 @@ CALL_DIR="$HOME/.claude/.burningtimes_auditor_calls"
WARN_DIR="$HOME/.claude/.burningtimes_warning_ignored" WARN_DIR="$HOME/.claude/.burningtimes_warning_ignored"
BYPASS_DIR="$HOME/.claude/.burningtimes_bypass_log" 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 - RESOLVED)
UNRESOLVED_NET=0 UNRESOLVED_NET=0
if [ -d "$WARN_DIR" ]; then 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에 기록" echo " PM 후속 조치: 경고 대상 review + pm-auditor 호출 or 사유를 memory/org/feedback_pm_warning_ignored_pattern.md에 기록"
fi 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` 인자) # 월별 패턴 분석 보고서 (월 1일 자동 or 수동 `report` 인자)
MONTH=$(date +%Y_%m) MONTH=$(date +%Y_%m)
REPORT="$REPO_ROOT/memory/org/audit_pattern_analysis_${MONTH}.md" REPORT="$REPO_ROOT/memory/org/audit_pattern_analysis_${MONTH}.md"
TRIGGER="${1:-auto}"
if [ "$TRIGGER" = "report" ] || { [ "$(date +%d)" = "01" ] && [ ! -f "$REPORT" ]; }; then if [ "$TRIGGER" = "report" ] || { [ "$(date +%d)" = "01" ] && [ ! -f "$REPORT" ]; }; then
{ {

View File

@ -1,39 +1,235 @@
#!/bin/bash #!/bin/bash
# SessionStart hook — 최근 7일 내 신설·수정 feedback 메모리 요지 자동 주입 # SessionStart hook — 세션 시작 교훈 환기 체계 6계층 (BT4, 2026-04-23 PD 승인)
# 신 PM 세션·다른 PC 세션이 본 세션의 핵심 교훈을 인지할 수 있도록 자동 환기 # 구 버전(7일 고정 10건 주입)에서 확장 — PD 지시 "1일 우선 + 필요 시 확장"
# 2026-04-19 신설 — PD님 직접 지시 "공유 누락 재발 방지" # 관련 규칙: C31-G 자기검증 · C33 조직 공유·기록 체계 · 헌법 원칙 ⑤
# 관련 규칙: C31 자기검증 · 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) REPO_ROOT=$(git rev-parse --show-toplevel 2>/dev/null)
[ -z "$REPO_ROOT" ] && exit 0 [ -z "$REPO_ROOT" ] && exit 0
MEMORY_DIR="$REPO_ROOT/memory/org" MEMORY_DIR="$REPO_ROOT/memory/org"
DIALOG_DIR="$REPO_ROOT/공유/대화로그"
PD_LOG_DIR="$REPO_ROOT/공유/PD_지시_트래킹"
[ ! -d "$MEMORY_DIR" ] && exit 0 [ ! -d "$MEMORY_DIR" ] && exit 0
# 최근 7일 내 mtime feedback 파일 (최대 10건) NOW=$(date +%s)
RECENT_FILES=$(find "$MEMORY_DIR" -name "feedback_*.md" -mtime -7 -type f 2>/dev/null | head -10)
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 fi
COUNT=$(echo "$RECENT_FILES" | wc -l) # 0-B. 활성 PD 지시 (개발팀·기획팀 활성 테이블)
echo "🔍 [최근 7일 교훈 요지] $COUNT 건 — 세션 리더 필독 (C31 F·G 자기검증 참조):" 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 # 0-C. 완료 아카이브 최근 5건
[ -f "$file" ] || continue echo ""
name=$(basename "$file" .md) echo " ✅ PD 지시 완료 아카이브 최근 5건:"
# frontmatter description 추출 (첫 줄 120자 제한) COMPLETED=$(grep -h "^| [A-Z0-9].*완료" "$PD_LOG_DIR"/개발팀_PD_지시_로그.md "$PD_LOG_DIR"/기획팀_PD_지시_로그.md 2>/dev/null | tail -5)
desc=$(awk '/^description:/ {sub(/^description: /, ""); print; exit}' "$file" 2>/dev/null | cut -c 1-120) if [ -n "$COMPLETED" ]; then
if [ -n "$desc" ]; then echo "$COMPLETED" | while IFS= read -r line; do
echo "$name" id=$(echo "$line" | awk -F'|' '{print $2}' | xargs)
echo "$desc" brief=$(echo "$line" | awk -F'|' '{print $4}' | cut -c 1-90)
fi echo " • [$id] $brief"
done <<< "$RECENT_FILES" 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 ""
echo "📖 [본문 Read 의무 — C31-G] 조직 내 공유 작업(C35-1) 착수 전 관련 메모리 본문 Read:"
echo " Read('memory/org/<feedback_name>.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 exit 0