fix(sync): 세션 간 실시간 동기화 강화 (PD님 "실시간 공유" 지시)

## 발견 (PD님 다른 세션 조회 실증)
- PM이 NerdNavisAi main에 push 정상 완료
- 그러나 다른 세션 로컬 HEAD가 구버전 유지
- 다른 세션이 #36·#37 완료 아카이브분을 여전히 "대기/진행중"으로 보고

## 근본 원인 2중
1. git_fetch_throttle.sh throttle 5분(300s) 과도
2. ff-only merge 한정 — 로컬 미커밋 있으면 merge 스킵

## 개선 (scripts/git_fetch_throttle.sh)
- THROTTLE_SECONDS: 300 → 30 (실시간 동기화 기준)
- 자동 stash/pop merge 추가 (로컬 미커밋 안전 보존)
- ff-only 실패 시 non-ff merge fallback
- stash pop 실패 시 수동 복원 경고

## 적용 효과
- 모든 세션 다음 프롬프트부터 30초 이내 원격 변경 자동 반영
- C20-1-A 자동 push(송신) + 본 hook(수신) 쌍으로 실시간 동기화 완성

## 노하우
- memory/feedback_realtime_sync_gap.md 신설
- MEMORY.md 인덱스 반영
- throttle 파일 강제 리셋으로 즉시 효과 발생

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
깃 관리자 2026-04-17 21:05:57 +09:00
parent 96b1fd7831
commit 433290ffcc
1 changed files with 33 additions and 11 deletions

View File

@ -1,23 +1,25 @@
#!/bin/bash #!/bin/bash
# UserPromptSubmit hook용 5분 throttle된 git fetch + 변경 알림 # UserPromptSubmit hook — 실시간 원격 동기화 (2026-04-17 강화)
# C20-7·C18 운용: 부서 세션이 매 입력 시 5분 이내 main 변경 자동 감지 # 변경 이력:
# 적용 시점: 2026-04-15 PD님 B안 승인 (Phase 2) # - 2026-04-15: 5분 throttle fetch + ff-only merge (초기)
# - 2026-04-17: throttle 30초로 단축 + 자동 stash/pop + merge 강화
# (PD님 지시: "항상 실시간으로 공유되어서 다른 세션에서도 확인")
THROTTLE_DIR="$HOME/.claude/.nerdnavis_throttle" THROTTLE_DIR="$HOME/.claude/.nerdnavis_throttle"
mkdir -p "$THROTTLE_DIR" 2>/dev/null mkdir -p "$THROTTLE_DIR" 2>/dev/null
GIT_DIR=$(git rev-parse --git-dir 2>/dev/null) GIT_DIR=$(git rev-parse --git-dir 2>/dev/null)
[ -z "$GIT_DIR" ] && exit 0 # git 레포 아님 — 조용히 종료 [ -z "$GIT_DIR" ] && exit 0
REPO_HASH=$(echo "$GIT_DIR" | sha1sum 2>/dev/null | cut -d' ' -f1) REPO_HASH=$(echo "$GIT_DIR" | sha1sum 2>/dev/null | cut -d' ' -f1)
THROTTLE_FILE="$THROTTLE_DIR/last_fetch_$REPO_HASH" THROTTLE_FILE="$THROTTLE_DIR/last_fetch_$REPO_HASH"
THROTTLE_SECONDS=300 # 5분 THROTTLE_SECONDS=30 # 2026-04-17: 300 → 30초 (실시간 동기화 보장)
if [ -f "$THROTTLE_FILE" ]; then if [ -f "$THROTTLE_FILE" ]; then
LAST=$(cat "$THROTTLE_FILE" 2>/dev/null || echo 0) LAST=$(cat "$THROTTLE_FILE" 2>/dev/null || echo 0)
NOW=$(date +%s) NOW=$(date +%s)
if [ $((NOW - LAST)) -lt $THROTTLE_SECONDS ]; then if [ $((NOW - LAST)) -lt $THROTTLE_SECONDS ]; then
exit 0 # throttle 적용 exit 0
fi fi
fi fi
@ -28,11 +30,32 @@ CHANGES=$(git log --oneline HEAD..origin/main 2>/dev/null | head -5)
if [ -n "$CHANGES" ]; then if [ -n "$CHANGES" ]; then
echo "📌 [auto-sync] origin/main 변경 검출:" echo "📌 [auto-sync] origin/main 변경 검출:"
echo "$CHANGES" echo "$CHANGES"
git merge origin/main --no-edit --ff-only 2>/dev/null
if [ $? -eq 0 ]; then # 로컬 미커밋 변경 자동 stash (conflict 회피)
echo "✅ 자동 동기화 완료 (ff-only)" STASHED=0
if ! git diff --quiet 2>/dev/null || ! git diff --cached --quiet 2>/dev/null; then
if git stash push -u -m "auto-sync-$(date +%s)" > /dev/null 2>&1; then
STASHED=1
fi
fi
# ff-only 시도 → 실패 시 일반 merge (non-ff) 시도
if git merge origin/main --no-edit --ff-only 2>/dev/null; then
echo "✅ 실시간 동기화 완료 (fast-forward)"
elif git merge origin/main --no-edit 2>/dev/null; then
echo "✅ 실시간 동기화 완료 (merge commit)"
else else
echo "⚠️ 자동 merge 불가 — 세션 갱신으로 수동 해결 필요" echo "⚠️ 자동 merge 실패 — 수동 해결 필요 (git merge origin/main)"
git merge --abort 2>/dev/null
fi
# stash 복원
if [ "$STASHED" -eq 1 ]; then
if git stash pop > /dev/null 2>&1; then
:
else
echo "⚠️ stash pop 실패 — 수동 복원 필요 (git stash list 확인)"
fi
fi fi
fi fi
@ -40,7 +63,6 @@ fi
REPO_ROOT=$(git rev-parse --show-toplevel 2>/dev/null) REPO_ROOT=$(git rev-parse --show-toplevel 2>/dev/null)
if [ -n "$REPO_ROOT" ]; then if [ -n "$REPO_ROOT" ]; then
INBOX_HASH_FILE="$THROTTLE_DIR/inbox_hash_$REPO_HASH" INBOX_HASH_FILE="$THROTTLE_DIR/inbox_hash_$REPO_HASH"
# 현재 부서 판별 (PWD 기준)
CURRENT_DIR=$(pwd) CURRENT_DIR=$(pwd)
INBOX_DIRS="" INBOX_DIRS=""
case "$CURRENT_DIR" in case "$CURRENT_DIR" in