BurningTimesAi/scripts/pm_implicit_check.sh

97 lines
4.1 KiB
Bash
Raw Permalink Normal View History

#!/bin/bash
# PreToolUse hook (Edit/Write/MultiEdit) — PM 실측 누락 감지·환기
# BurningTimes BT9 이식 (2026-04-24 NerdNavis 원본 반영 · PD 결정 5)
# 원본: D:/NerdNavis/NerdNavisAi/scripts/pm_implicit_check.sh (NerdNavis 방안 9 · 2026-04-23 PD 직접 결정)
# 목적: 외부 시스템 추정 참조 차단 — "Unity 레포·git log·다른 PC" 등
# 토큰 비용: 0 (키워드 grep + 파일 mtime 체크만 수행)
#
# 근거: BurningTimes C30 (git 동기화 프로젝트 작업 전 최신 상태 점검 의무) · C5 정직성
# NerdNavis 실측 의무 진입점 차단 패턴 계승
# LLM 자율 준수 한계 → 외부 키워드 + 명령 이력 교차 검증
INPUT=$(cat 2>/dev/null)
# Edit·Write·MultiEdit의 new_string·content 본문 추출
BODY=$(echo "$INPUT" | grep -oE '"(new_string|content)"[[:space:]]*:[[:space:]]*"[^"]*"' | head -3)
[ -z "$BODY" ] && exit 0
# 외부 시스템 참조 키워드 카탈로그 (실측 의무 영역)
HIT_LIST=""
# 그룹 1 — Unity 레포·외부 git 레포 참조
if echo "$BODY" | grep -qE '(Unity[[:space:]]*레포|Unity[[:space:]]*프로젝트|UNITY_PROJECT_ROOT|코어[[:space:]]*프레임워크[[:space:]]*레포|BT\.Framework)'; then
HIT_LIST="${HIT_LIST}Unity 레포·외부 git 레포, "
fi
# 그룹 2 — git 명령 결과 참조
if echo "$BODY" | grep -qE '(git[[:space:]]+log|git[[:space:]]+status|git[[:space:]]+diff|git[[:space:]]+ls-remote|원격[[:space:]]*HEAD|local[[:space:]]*==[[:space:]]*remote)'; then
HIT_LIST="${HIT_LIST}git 명령 결과 참조, "
fi
# 그룹 3 — 다른 PC·다른 세션 상태 참조
if echo "$BODY" | grep -qE '(다른[[:space:]]*PC|다른[[:space:]]*세션|동기화[[:space:]]*완료|세션[[:space:]]*간[[:space:]]*공유)'; then
HIT_LIST="${HIT_LIST}다른 PC·다른 세션 상태, "
fi
# 그룹 4 — 외부 시스템 상태 일반
if echo "$BODY" | grep -qE '(외부[[:space:]]*시스템|코드[[:space:]]*반영|테이블[[:space:]]*반영|설정[[:space:]]*반영)'; then
HIT_LIST="${HIT_LIST}외부 시스템 반영 상태, "
fi
[ -z "$HIT_LIST" ] && exit 0
# 직전 N분 내 실측 명령 호출 이력 체크
# Bash 명령 이력 = $HOME/.bash_history는 신뢰 X (Claude Code Bash는 별도)
# 대체: $HOME/.claude/.burningtimes_implicit_check/last_verify.log mtime 체크
VERIFY_LOG_DIR="$HOME/.claude/.burningtimes_implicit_check"
mkdir -p "$VERIFY_LOG_DIR" 2>/dev/null
VERIFY_LOG="$VERIFY_LOG_DIR/last_verify.log"
# 직전 5분 (300초) 내 실측 흔적 부재 시 환기
WINDOW_SEC=300
NOW=$(date +%s)
LAST_VERIFY=0
if [ -f "$VERIFY_LOG" ]; then
# 파일 mtime을 epoch 초로 변환 (Linux·Mac·Windows MINGW 호환)
LAST_VERIFY=$(stat -c %Y "$VERIFY_LOG" 2>/dev/null || stat -f %m "$VERIFY_LOG" 2>/dev/null || echo 0)
fi
ELAPSED=$((NOW - LAST_VERIFY))
if [ "$ELAPSED" -gt "$WINDOW_SEC" ]; then
cat >&2 <<EOF
⚠️ [BurningTimes 실측 누락 감지 — PM 외부 시스템 추정 참조 가능성]
감지 키워드: ${HIT_LIST%, }
직전 실측 명령 이력: ${ELAPSED}초 전 (윈도우 ${WINDOW_SEC}초 초과)
C30·C5 실측 의무:
- 외부 시스템 참조 시 해당 대상 Read·git log·git status 선행
- 필드명·메서드명·키 이름 추정 금지
- "코드·테이블·설정에 이미 반영" 단정 시 실측 확증
실측 명령 예시:
- git log --since="5 min ago" --oneline
- git ls-remote origin refs/heads/main
- git status --short
- cd \$UNITY_PROJECT_ROOT && git fetch origin && git status
⚠️ PM 자가 점검 의무:
본 키워드 매칭이 실측 의무 영역인지 즉시 판별
실측 누락 시 → 즉시 작업 중단 + 실측 선행 + 자진 보고 (C30·C3 준수)
실측 완료 사례 시 → touch \$HOME/.claude/.burningtimes_implicit_check/last_verify.log
근거: BurningTimes C30 (git 최신 상태 점검 의무) · C5 정직성
NerdNavis 방안 9 이식 (2026-04-24 BT9)
한계: 키워드 매칭 정확도 (false positive 가능) · 명령 이력 추정 의존
EOF
fi
# PreToolUse는 차단 가능하나 본 환기는 차단 X (PM 자가 판단 영역)
# 차단 강제 시 false positive로 정상 작업 막힘 → 환기만 + PM 자가 점검 의무
exit 0