feat(BT14-Org): 세션 끊김 진단 + 세션 수명 체계 v1 — hook cwd 독립화 30종·C14-7·C40 보강·session_health 자동 실측 (NerdNavis C50-6·C55 이식)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
깃 관리자 2026-08-21 01:31:29 +09:00
parent 867bab1150
commit 88c72478d3
13 changed files with 255 additions and 33 deletions

View File

@ -93,11 +93,11 @@
"hooks": [ "hooks": [
{ {
"type": "command", "type": "command",
"command": "bash scripts/auto_approve.sh" "command": "cd \"$CLAUDE_PROJECT_DIR\" && bash scripts/auto_approve.sh"
}, },
{ {
"type": "command", "type": "command",
"command": "bash scripts/auditor_gate.sh" "command": "cd \"$CLAUDE_PROJECT_DIR\" && bash scripts/auditor_gate.sh"
} }
] ]
}, },
@ -106,7 +106,7 @@
"hooks": [ "hooks": [
{ {
"type": "command", "type": "command",
"command": "bash scripts/pm_implicit_check.sh 2>/dev/null || true" "command": "cd \"$CLAUDE_PROJECT_DIR\" && bash scripts/pm_implicit_check.sh 2>/dev/null || true"
} }
] ]
} }
@ -117,43 +117,43 @@
"hooks": [ "hooks": [
{ {
"type": "command", "type": "command",
"command": "git fetch origin 2>/dev/null; CHANGES=$(git log --oneline HEAD..origin/main 2>/dev/null | head -10); if [ -n \"$CHANGES\" ]; then echo '📌 [SessionStart] origin/main 변경 검출 — 자동 병합 중:'; echo \"$CHANGES\"; git merge origin/main --no-edit 2>/dev/null && echo '✅ 자동 병합 완료' || echo '⚠️ 자동 병합 실패 (충돌 발생 — 수동 해결 필요)'; else echo '✅ [SessionStart] main 동기화 상태'; fi" "command": "cd \"$CLAUDE_PROJECT_DIR\" && git fetch origin 2>/dev/null; CHANGES=$(git log --oneline HEAD..origin/main 2>/dev/null | head -10); if [ -n \"$CHANGES\" ]; then echo '📌 [SessionStart] origin/main 변경 검출 — 자동 병합 중:'; echo \"$CHANGES\"; git merge origin/main --no-edit 2>/dev/null && echo '✅ 자동 병합 완료' || echo '⚠️ 자동 병합 실패 (충돌 발생 — 수동 해결 필요)'; else echo '✅ [SessionStart] main 동기화 상태'; fi"
}, },
{ {
"type": "command", "type": "command",
"command": "bash scripts/unity_project_sync.sh 2>/dev/null || true" "command": "cd \"$CLAUDE_PROJECT_DIR\" && bash scripts/unity_project_sync.sh 2>/dev/null || true"
}, },
{ {
"type": "command", "type": "command",
"command": "bash scripts/inbox_scan.sh 2>/dev/null || true" "command": "cd \"$CLAUDE_PROJECT_DIR\" && bash scripts/inbox_scan.sh 2>/dev/null || true"
}, },
{ {
"type": "command", "type": "command",
"command": "bash scripts/change_digest.sh 2>/dev/null || true" "command": "cd \"$CLAUDE_PROJECT_DIR\" && bash scripts/change_digest.sh 2>/dev/null || true"
}, },
{ {
"type": "command", "type": "command",
"command": "bash scripts/live_session_load.sh 2>/dev/null || true" "command": "cd \"$CLAUDE_PROJECT_DIR\" && bash scripts/live_session_load.sh 2>/dev/null || true"
}, },
{ {
"type": "command", "type": "command",
"command": "bash scripts/pm_context_restore.sh 2>/dev/null || true" "command": "cd \"$CLAUDE_PROJECT_DIR\" && bash scripts/pm_context_restore.sh 2>/dev/null || true"
}, },
{ {
"type": "command", "type": "command",
"command": "bash scripts/recent_feedback_brief.sh 2>/dev/null || true" "command": "cd \"$CLAUDE_PROJECT_DIR\" && bash scripts/recent_feedback_brief.sh 2>/dev/null || true"
}, },
{ {
"type": "command", "type": "command",
"command": "bash scripts/audit_pattern_analyzer.sh 2>/dev/null || true" "command": "cd \"$CLAUDE_PROJECT_DIR\" && bash scripts/audit_pattern_analyzer.sh 2>/dev/null || true"
}, },
{ {
"type": "command", "type": "command",
"command": "bash scripts/verify_log_paths.sh 2>/dev/null || true" "command": "cd \"$CLAUDE_PROJECT_DIR\" && bash scripts/verify_log_paths.sh 2>/dev/null || true"
}, },
{ {
"type": "command", "type": "command",
"command": "git config core.hooksPath scripts/git-hooks 2>/dev/null || true" "command": "cd \"$CLAUDE_PROJECT_DIR\" && git config core.hooksPath scripts/git-hooks 2>/dev/null || true"
} }
] ]
} }
@ -164,19 +164,23 @@
"hooks": [ "hooks": [
{ {
"type": "command", "type": "command",
"command": "bash scripts/sync_signal.sh check 2>/dev/null || true" "command": "cd \"$CLAUDE_PROJECT_DIR\" && bash scripts/sync_signal.sh check 2>/dev/null || true"
}, },
{ {
"type": "command", "type": "command",
"command": "bash scripts/git_fetch_throttle.sh 2>/dev/null || true" "command": "cd \"$CLAUDE_PROJECT_DIR\" && bash scripts/git_fetch_throttle.sh 2>/dev/null || true"
}, },
{ {
"type": "command", "type": "command",
"command": "bash scripts/hold_watch.sh 2>/dev/null || true" "command": "cd \"$CLAUDE_PROJECT_DIR\" && bash scripts/hold_watch.sh 2>/dev/null || true"
}, },
{ {
"type": "command", "type": "command",
"command": "bash scripts/live_inject.sh 2>/dev/null || true" "command": "cd \"$CLAUDE_PROJECT_DIR\" && bash scripts/live_inject.sh 2>/dev/null || true"
},
{
"type": "command",
"command": "cd \"$CLAUDE_PROJECT_DIR\" && bash scripts/session_health.sh 2>/dev/null || true"
} }
] ]
} }
@ -187,39 +191,39 @@
"hooks": [ "hooks": [
{ {
"type": "command", "type": "command",
"command": "bash scripts/postuse_log_reminder.sh 2>/dev/null || true" "command": "cd \"$CLAUDE_PROJECT_DIR\" && bash scripts/postuse_log_reminder.sh 2>/dev/null || true"
}, },
{ {
"type": "command", "type": "command",
"command": "bash scripts/c9_2_block.sh 2>/dev/null || true" "command": "cd \"$CLAUDE_PROJECT_DIR\" && bash scripts/c9_2_block.sh 2>/dev/null || true"
}, },
{ {
"type": "command", "type": "command",
"command": "bash scripts/fact_first_check.sh 2>/dev/null || true" "command": "cd \"$CLAUDE_PROJECT_DIR\" && bash scripts/fact_first_check.sh 2>/dev/null || true"
}, },
{ {
"type": "command", "type": "command",
"command": "bash scripts/identity_guard.sh 2>/dev/null || true" "command": "cd \"$CLAUDE_PROJECT_DIR\" && bash scripts/identity_guard.sh 2>/dev/null || true"
}, },
{ {
"type": "command", "type": "command",
"command": "bash scripts/hardboiled_empathy_check.sh 2>/dev/null || true" "command": "cd \"$CLAUDE_PROJECT_DIR\" && bash scripts/hardboiled_empathy_check.sh 2>/dev/null || true"
}, },
{ {
"type": "command", "type": "command",
"command": "bash scripts/proactive_inference_check.sh 2>/dev/null || true" "command": "cd \"$CLAUDE_PROJECT_DIR\" && bash scripts/proactive_inference_check.sh 2>/dev/null || true"
}, },
{ {
"type": "command", "type": "command",
"command": "bash scripts/skill_trigger_audit.sh 2>/dev/null || true" "command": "cd \"$CLAUDE_PROJECT_DIR\" && bash scripts/skill_trigger_audit.sh 2>/dev/null || true"
}, },
{ {
"type": "command", "type": "command",
"command": "bash scripts/c35_obligation_check.sh 2>/dev/null || true" "command": "cd \"$CLAUDE_PROJECT_DIR\" && bash scripts/c35_obligation_check.sh 2>/dev/null || true"
}, },
{ {
"type": "command", "type": "command",
"command": "bash scripts/filler_word_check.sh 2>/dev/null || true" "command": "cd \"$CLAUDE_PROJECT_DIR\" && bash scripts/filler_word_check.sh 2>/dev/null || true"
} }
] ]
}, },
@ -228,7 +232,7 @@
"hooks": [ "hooks": [
{ {
"type": "command", "type": "command",
"command": "bash scripts/auditor_call_log.sh 2>/dev/null || true" "command": "cd \"$CLAUDE_PROJECT_DIR\" && bash scripts/auditor_call_log.sh 2>/dev/null || true"
} }
] ]
} }
@ -239,11 +243,11 @@
"hooks": [ "hooks": [
{ {
"type": "command", "type": "command",
"command": "bash scripts/session_end_audit.sh 2>/dev/null || true" "command": "cd \"$CLAUDE_PROJECT_DIR\" && bash scripts/session_end_audit.sh 2>/dev/null || true"
}, },
{ {
"type": "command", "type": "command",
"command": "bash scripts/verify_references.sh 2>/dev/null || true" "command": "cd \"$CLAUDE_PROJECT_DIR\" && bash scripts/verify_references.sh 2>/dev/null || true"
} }
] ]
} }

View File

@ -205,6 +205,7 @@ skills: [bt-foundation, bt-index, bt-commit-rules, bt-task-delegation, bt-data-p
| 일시 | 변경 | | 일시 | 변경 |
|------|------| |------|------|
| 2026-05-07 | **분할 슬림화 v1** — 11개 SKILL로 분할 + 본 SKILL은 인덱스 SOT 전환 (PD 결정 "A 정식 SKILL 분할") | | 2026-05-07 | **분할 슬림화 v1** — 11개 SKILL로 분할 + 본 SKILL은 인덱스 SOT 전환 (PD 결정 "A 정식 SKILL 분할") |
| 2026-08-21 | **BT14 세션 수명 체계** — C14-7 신설(`bt-document-mgmt`) + C40 세션 수명·종결 표준 순서·인수인계 2계층 보강(`bt-session-mgmt`·`bt-foundation` 양쪽, NerdNavis C50-6·C55·C40-1-A 이식). 근거: 세션 끊김 진단 (30MB 세션 403 사망 실측) |
--- ---

View File

@ -60,6 +60,21 @@ API Stream idle timeout 방지 + 응답 속도 + 토큰 낭비 차단.
- 단일 트랜잭션 필수 (.json·.cs·.py 구조 무결성) - 단일 트랜잭션 필수 (.json·.cs·.py 구조 무결성)
- 짧은 md 1~3줄 수정 - 짧은 md 1~3줄 수정
### C14-7. 스크린샷·이미지 최소 획득 원칙 (2026-08-21 BT14 신설)
> 근거 실측: 스크린샷 116장 축적 → 세션 기록 30MB → 매 요청 페이로드 비대 → `403 socket closed` 세션 사망 (2026-08-20 GodDem). 이미지 1장 = base64 원문이 세션 기록과 이후 모든 요청에 영구 잔류.
#### C14-7-1. 텍스트 실측 우선
Unity 등 시각 검증 시 `read_console`·`find_gameobjects`·`manage_scene`·컴포넌트 값 조회 등 **텍스트 실측으로 판정 가능한 항목은 스크린샷 금지**. 좌표·활성 상태·계층 구조·에러 유무는 전부 텍스트 실측 대상.
#### C14-7-2. 스크린샷 허용 3종
1. 작업 단계 **최종 확인 1회**
2. PD 보고용 증빙 1회
3. 텍스트 실측 불가 항목 (시각 연출·색상·레이아웃 겹침 등 픽셀 판정)
#### C14-7-3. 누적 상한 → 세션 수명 연동
세션 누적 이미지 30장 도달 = C40 세션 수명 판정 트리거 (`bt-session-mgmt` C40 세션 수명 관리 + `scripts/session_health.sh` 자동 실측).
--- ---
## C22. 용어·식별자 일관 사용 ## C22. 용어·식별자 일관 사용

View File

@ -277,9 +277,12 @@ PM이 P21-2 "세션 공유" 시 다음 5종 사전 점검 의무:
### 세션 종결 자동 인수인계 프롬프트 제공 의무 ### 세션 종결 자동 인수인계 프롬프트 제공 의무
PM이 세션 만료·종결 시 PD 별도 지시 없이도: PM이 세션 만료·종결 시 PD 별도 지시 없이도:
- 인수인계서 12 섹션 자동 작성 - 인수인계서 자동 작성 (2계층: 핵심 요약 + 세부 아카이브 링크)
- 다음 세션 첫 프롬프트 템플릿 (PD 복사용) 자동 제공 - 다음 세션 첫 프롬프트 템플릿 (PD 복사용) 자동 제공
### 세션 수명 판정·분리 운용 (2026-08-21 BT14)
세션 기록 10MB·누적 이미지 30장·API 끊김·컨텍스트 압축 중 하나 도달 = 세션 전환 권고 (`session_health.sh` 자동 실측). 근거: 30MB 세션 403 사망 실측. 상세·종결 표준 순서 = `bt-session-mgmt`.
--- ---
## C41. 병렬 진행 의무 — 불필요한 대기 모드 금지 (조직 생명급) ## C41. 병렬 진행 의무 — 불필요한 대기 모드 금지 (조직 생명급)

View File

@ -172,10 +172,32 @@ PD 별도 지시 없이도:
- **다음 세션 첫 프롬프트 템플릿** (PD 복사용) - **다음 세션 첫 프롬프트 템플릿** (PD 복사용)
#### 자동 제공 트리거 #### 자동 제공 트리거
- 세션 자체 종결 판정 (컨텍스트 한도 근접·작업 자연 마무리) - 세션 자체 종결 판정 (**세션 수명 기준 도달**·작업 자연 마무리)
- PD가 "세션 정리·종결" 류 지시 - PD가 "세션 정리·종결" 류 지시
- 장시간 작업 자연 마무리 후 PM 판단 - 장시간 작업 자연 마무리 후 PM 판단
### 세션 수명 판정·분리 운용 (2026-08-21 BT14 신설)
> 근거 실측: 단일 세션 30MB(스크린샷 116장) 축적 → `403 socket closed` 사망 + 후속 세션 즉사 (2026-08-20). 세션은 작업 단위로 짧게 끊고 인수인계로 승계한다.
- **판정 기준 (권고 — 운영 조정 가능)**: ① 세션 기록 10MB ② 누적 이미지 30장 ③ API 끊김·소켓 에러 발생 ④ 컨텍스트 압축 발생
- **자동 실측**: `scripts/session_health.sh` (UserPromptSubmit hook·10분 주기) — 기준 도달 시 경고 자동 출력
- **도달 시 행동**: 진행 중 맥락 단위만 마무리 → 인수인계서 + 다음 세션 첫 프롬프트 템플릿 제공 → PD에 세션 전환 권고. 신규 대형 작업 착수 금지
### 세션 종결 표준 순서 (NerdNavis C50-6 이식)
**역순 진행 금지.** ① 잔존 위반·활성 테이블 점검 → ② memory feedback 작성 → ③ PD 지시 로그 갱신 → ④ 대화로그 기록 → ⑤ **인수인계서 작성 (가장 마지막 — SOT 정리 완료 후)** → ⑥ 단일 commit + push.
- **인수인계서 ↔ SOT 정합 의무**: 인수인계서 "활성 N건" = 실제 PD 지시 로그 활성 테이블 N건 동일 확증. 글만 쓰고 SOT 정리 누락 = 위반 (NerdNavis C40-1-A 이식)
- **사실 표기만**: "다음 commit에 추가 예정"·"후속 작업 의무" 류 미래형 표기 금지 — 통과 사실만 `✓`/`X` (NerdNavis C50-6-2 이식)
### 인수인계서 2계층 원칙 (NerdNavis C55 이식)
- **① 핵심 요약** (다음 세션이 매번 읽음): 활성·미완 작업 / 다음 액션 / PD 결정 대기 / 블로커만
- **② 세부 아카이브** (on-demand): 완료 상세·검증 로그·기각안 — 링크로만 연결
- 완료 항목은 **태그 1줄 압축** (예: `S2 7종 완료 → 상세 [링크]`). 상세 재기술 금지. 완료 누적으로 비대화 = 위반
- **이어가기 프롬프트**: 인계 본문을 채팅에 다시 풀어 쓰지 않는다 — **인계서를 읽게 한다**. 첫 프롬프트 템플릿 = 작업 선언 1줄 + SOT 경로 + "핵심 요약 먼저 Read 후 현황 보고" + 금지·고정 사항 불릿만
--- ---
## 연관 규칙 ## 연관 규칙

View File

@ -73,7 +73,7 @@ PD님
- **C9** AI 에이전트 조직 원칙 — 완성도 우선·일정 개념 배제 (**C9-2-1 자동 차단 hook 발효 2026-04-24** — `scripts/c9_2_block.sh` 키워드 5그룹 자동 감지) - **C9** AI 에이전트 조직 원칙 — 완성도 우선·일정 개념 배제 (**C9-2-1 자동 차단 hook 발효 2026-04-24** — `scripts/c9_2_block.sh` 키워드 5그룹 자동 감지)
- **C10** 중복 작업 방지·선행 검증 / **C11** 개발 관점 원칙(개발팀) - **C10** 중복 작업 방지·선행 검증 / **C11** 개발 관점 원칙(개발팀)
- **C13** PD 지시 트래킹·공유 의무 (시작·진행·완료·중단 4단계 가시화) - **C13** PD 지시 트래킹·공유 의무 (시작·진행·완료·중단 4단계 가시화)
- **C14** 토큰 최소화 우선 설계 (C14-5 본문 최신 + 히스토리 아카이브, 폐기 표기 본문 유지 금지 · **C14-6 대용량 파일 스크립트·Chunk 분할 2026-04-24** — API idle timeout 방지) - **C14** 토큰 최소화 우선 설계 (C14-5 본문 최신 + 히스토리 아카이브, 폐기 표기 본문 유지 금지 · **C14-6 대용량 파일 스크립트·Chunk 분할 2026-04-24** — API idle timeout 방지 · **C14-7 스크린샷·이미지 최소 획득 2026-08-21 BT14** — 텍스트 실측 우선·허용 3종·30장 = C40 세션 수명 트리거)
- **C16** PC 독립 셋업·세션 표준 / **C17** 최신 세션 관리 기준 / **C18** 조직 공유 완료 판정 (main push 완료) - **C16** PC 독립 셋업·세션 표준 / **C17** 최신 세션 관리 기준 / **C18** 조직 공유 완료 판정 (main push 완료)
- **C19** 승인 범위 엄격 해석 / **C20** 팀장급 커밋·푸시 재량 / **C21** 작업 완료 즉시 공유·PM 능동 확인 (내부 공유 / 공유 완료 2단계) - **C19** 승인 범위 엄격 해석 / **C20** 팀장급 커밋·푸시 재량 / **C21** 작업 완료 즉시 공유·PM 능동 확인 (내부 공유 / 공유 완료 2단계)
- **C22** 용어·식별자 일관 사용 / **C23** 허위 보고·역할 연기 절대 금지 (헌법급) - **C22** 용어·식별자 일관 사용 / **C23** 허위 보고·역할 연기 절대 금지 (헌법급)
@ -87,7 +87,7 @@ PD님
- **C37** 규칙 문서 관리 원칙 (2026-04-20 헌법급 신설 — 중복 금지·의미 보존·참조 무결성·표기법 통일·순서 정렬·변경 아카이브·3중 전파 8조항. 규칙 추가·변경 시 본 원칙 준수 의무) - **C37** 규칙 문서 관리 원칙 (2026-04-20 헌법급 신설 — 중복 금지·의미 보존·참조 무결성·표기법 통일·순서 정렬·변경 아카이브·3중 전파 8조항. 규칙 추가·변경 시 본 원칙 준수 의무)
- **C38** 기술 도구·시스템 구축 주체 vs 활용 주체 분리 (2026-04-24 BT9 NerdNavis 경험 반영 헌법급 신설 — 도구 구축 = 개발팀, 활용 업무 = 해당 업무 주 담당 팀) - **C38** 기술 도구·시스템 구축 주체 vs 활용 주체 분리 (2026-04-24 BT9 NerdNavis 경험 반영 헌법급 신설 — 도구 구축 = 개발팀, 활용 업무 = 해당 업무 주 담당 팀)
- **C39** 작업 전 관련 시스템 최신 반영 상태 실측 의무 (2026-04-24 BT9 헌법급·조직 생명급 신설 — 전 조직 공통 3문항 실측·미반영 시 선행 반영 우선 · C39-10 신규 코드 기존 시스템 참조 실측 Read 의무) - **C39** 작업 전 관련 시스템 최신 반영 상태 실측 의무 (2026-04-24 BT9 헌법급·조직 생명급 신설 — 전 조직 공통 3문항 실측·미반영 시 선행 반영 우선 · C39-10 신규 코드 기존 시스템 참조 실측 Read 의무)
- **C40** 세션 공유·종결 완결성 의무 (2026-04-24 BT9 헌법급 신설 — 세션 공유 5종 사전 점검 + 세션 종결 인수인계서 + 다음 세션 첫 프롬프트 템플릿 자동 제공) - **C40** 세션 공유·종결 완결성 의무 (2026-04-24 BT9 헌법급 신설 — 세션 공유 5종 사전 점검 + 세션 종결 인수인계서 + 다음 세션 첫 프롬프트 템플릿 자동 제공 · **세션 수명 판정·분리 운용 2026-08-21 BT14** — 10MB/이미지 30장/API 끊김/압축 도달 시 세션 전환 권고·`session_health.sh` 자동 실측·인수인계 2계층·종결 표준 순서 NerdNavis 이식)
- **C41** 병렬 진행 의무 — 불필요한 대기 모드 금지 (2026-04-24 BT9 헌법급·조직 생명급 신설 — 4축 자동 점검 · "응답 대기" 단독 모드 금지) - **C41** 병렬 진행 의무 — 불필요한 대기 모드 금지 (2026-04-24 BT9 헌법급·조직 생명급 신설 — 4축 자동 점검 · "응답 대기" 단독 모드 금지)
- **C42** 사전 검증 절차 — 지시 수행 전 자기검증 (2026-04-24 BT9 헌법급 신설 · **구 C31 폐기 대체**) — C42-2 사전 6항목 (A PD 원문 인용 · B 의도 분석 · C 영역 분류 · D 실측 의무 · E 위반 패턴 · F pm-auditor 매칭) + **C42-7 BT 고유 9그룹 보강 체크리스트** (구 C31-1 A~I 원형 보존 + J K 그룹 신설) - **C42** 사전 검증 절차 — 지시 수행 전 자기검증 (2026-04-24 BT9 헌법급 신설 · **구 C31 폐기 대체**) — C42-2 사전 6항목 (A PD 원문 인용 · B 의도 분석 · C 영역 분류 · D 실측 의무 · E 위반 패턴 · F pm-auditor 매칭) + **C42-7 BT 고유 9그룹 보강 체크리스트** (구 C31-1 A~I 원형 보존 + J K 그룹 신설)
- **C43** PD 호칭별 직접 하달 체계 (2026-04-24 BT9 헌법급 신설 — 호칭 카탈로그 라우팅 · C안 팀장 경유 · 6종 전문 에이전트 기획팀장 경유 · 단순 반복 PM 직접 호출 예외) - **C43** PD 호칭별 직접 하달 체계 (2026-04-24 BT9 헌법급 신설 — 호칭 카탈로그 라우팅 · C안 팀장 경유 · 6종 전문 에이전트 기획팀장 경유 · 단순 반복 PM 직접 호출 예외)

View File

@ -60,3 +60,5 @@
- [🏛️ ScriptableObject placeholder 필드 무차별 채움 금지](feedback_scriptable_object_field_blanket_fill.md) — 2026-05-09 BT12-Dev Phase 2-C 본 PM 영역 6 ActiveSkillData asset 작성 시 모든 필드 무차별 채움. A01·A02·A03·A14·A15 영역 `DebuffStackLimit: 3` 의도 외 적용 → StatusApplier 가드 통과 → 의도 외 DebuffStack 트리거. 근층 = C39 위반 (가드 조건 Read 선행 X·카드↔런타임 의존성 미실측). 재발 차단 3 단계 의무 — 클래스 정의 Read·사용 코드 Grep·가드 조건 의도 매핑. 헌법급. C39-10·C2·C44 정합 - [🏛️ ScriptableObject placeholder 필드 무차별 채움 금지](feedback_scriptable_object_field_blanket_fill.md) — 2026-05-09 BT12-Dev Phase 2-C 본 PM 영역 6 ActiveSkillData asset 작성 시 모든 필드 무차별 채움. A01·A02·A03·A14·A15 영역 `DebuffStackLimit: 3` 의도 외 적용 → StatusApplier 가드 통과 → 의도 외 DebuffStack 트리거. 근층 = C39 위반 (가드 조건 Read 선행 X·카드↔런타임 의존성 미실측). 재발 차단 3 단계 의무 — 클래스 정의 Read·사용 코드 Grep·가드 조건 의도 매핑. 헌법급. C39-10·C2·C44 정합
- [🏛️ 신규 코드 영역 기존 시스템 의존성 미실측 금지](feedback_new_code_existing_system_dependency_unmeasured.md) — 2026-05-09 BT12-Dev `fe65592` 회귀. 본 PM이 ProjectileSpawner 영역 Kinematic Rigidbody2D 추가 → Enemy KinematicObject Kinematic Rigidbody2D 영역 사전 미실측 → Kinematic vs Kinematic OnTriggerEnter2D 발화 X 영역 회귀. 근층 = C39 위반 (KinematicObject.cs:76 영역 Read X). 재발 차단 3 단계 의무 — 참조 클래스 정의 Read·라이프사이클 Grep·인터랙션 호환성 검증. 회귀 유발 시 C3 자진 고지 + 본 feedback 환기 의무. 헌법급. C39-10·C2·C3·C44 정합 - [🏛️ 신규 코드 영역 기존 시스템 의존성 미실측 금지](feedback_new_code_existing_system_dependency_unmeasured.md) — 2026-05-09 BT12-Dev `fe65592` 회귀. 본 PM이 ProjectileSpawner 영역 Kinematic Rigidbody2D 추가 → Enemy KinematicObject Kinematic Rigidbody2D 영역 사전 미실측 → Kinematic vs Kinematic OnTriggerEnter2D 발화 X 영역 회귀. 근층 = C39 위반 (KinematicObject.cs:76 영역 Read X). 재발 차단 3 단계 의무 — 참조 클래스 정의 Read·라이프사이클 Grep·인터랙션 호환성 검증. 회귀 유발 시 C3 자진 고지 + 본 feedback 환기 의무. 헌법급. C39-10·C2·C3·C44 정합
- [🏛️ PD에게 작업 떠넘기기 금지·MCP 능동 활용 의무](feedback_pm_pd_work_offloading.md) — 2026-05-10 BT12-Dev-Death PD 직접 지적 "MCP 활용해서 네가 직접 체크해! 왜 자꾸 나에게 일을 미루는거지?". 본 PM 가설 5회 누적 부정확 후 PD 자료 제공 영역 — Inspector 스크린샷·Animator Parameters 능동 요청 영역. Unity MCP 영역 read_console·controller_get_info·execute_code·manage_animation 영역 자율 활용 가능 영역 영역 영역 영역 X. 재발 차단 3 단계 자문 — MCP 활용 가능 영역 X·Read/Grep 가능 영역 X·PD 능동 요청 정당 영역 X. 헌법급. C29·C36·C44·C45·C47·feedback_pm_solution_proactive_proposal·feedback_pm_root_diagnosis_priority 정합 - [🏛️ PD에게 작업 떠넘기기 금지·MCP 능동 활용 의무](feedback_pm_pd_work_offloading.md) — 2026-05-10 BT12-Dev-Death PD 직접 지적 "MCP 활용해서 네가 직접 체크해! 왜 자꾸 나에게 일을 미루는거지?". 본 PM 가설 5회 누적 부정확 후 PD 자료 제공 영역 — Inspector 스크린샷·Animator Parameters 능동 요청 영역. Unity MCP 영역 read_console·controller_get_info·execute_code·manage_animation 영역 자율 활용 가능 영역 영역 영역 영역 X. 재발 차단 3 단계 자문 — MCP 활용 가능 영역 X·Read/Grep 가능 영역 X·PD 능동 요청 정당 영역 X. 헌법급. C29·C36·C44·C45·C47·feedback_pm_solution_proactive_proposal·feedback_pm_root_diagnosis_priority 정합
- [🏛️ hook 상대 경로 + fail-open 침묵 무력화 금지](feedback_hook_relative_path_failopen.md) — 2026-08-21 BT14. hook 상대 경로는 세션 cwd 기준 해석 — GodDem cwd 세션에서 27종 hook(auditor_gate 포함) 침묵 무력화·에러 422건. 처방 = `cd "$CLAUDE_PROJECT_DIR" &&` 전량 적용 + 게이트 헬스체크. hook 참조 스크립트 git 추적 의무. C16·C35-9 정합
- [🏛️ 세션 비대 → 403 사망·세션 수명 기준](feedback_session_lifetime_bloat_403.md) — 2026-08-21 BT14. 스크린샷 116장 → 세션 30MB → 403 socket closed 사망 실측. C14-7(텍스트 실측 우선·허용 3종) + C40 세션 수명(10MB/30장/끊김/압축 → 전환 권고) + session_health.sh 자동 실측. 두 PC 병행 동시 세션 금지. NerdNavis C50-6·C55 이식

View File

@ -0,0 +1,18 @@
---
name: hook-relative-path-failopen
description: hook 상대 경로 등록 + fail-open 구조로 27종 hook이 GodDem cwd 세션에서 침묵 무력화 — cwd 독립화·헬스체크로 처방 (2026-08-21 BT14)
metadata:
type: feedback
---
# hook 상대 경로 + fail-open 침묵 무력화 (2026-08-21 BT14)
**발견**: 세션 끊김 진단 중 `.claude/settings.json` hook 29종 전부가 `bash scripts/...` 상대 경로 등록 상태 확인. hook 상대 경로는 프로젝트 루트가 아닌 **세션 cwd 기준** 해석 — cwd가 `E:\NerdNavis\GodDem`인 세션에서 에러 422건 + `2>/dev/null || true` 처리된 27종은 **침묵 무력화** (auditor_gate C35-9 게이트 포함). PreToolUse hook 실패는 공식적으로 fail-open (차단 신호 = exit 2 유일, exit 127·문법 오류는 non-blocking 통과).
**Why**: 규칙·게이트를 hook으로 강제해도 hook 자체가 조용히 죽으면 전체 통제 체계가 무너진다. 침묵 실패(`|| true`)는 편의지만 관측 불가능성을 낳는다.
**How to apply**:
1. hook 명령은 항상 `cd "$CLAUDE_PROJECT_DIR" && bash scripts/...` (cwd 독립 + PC 이식성. 드라이브 고정 절대 경로 금지 — C16 위반)
2. hook이 참조하는 스크립트는 반드시 git 추적 (untracked면 타 PC clone 시 동일 사고 재생산)
3. 게이트류 hook은 별도 헬스체크로 실존·접근성 상시 관측 (`scripts/session_health.sh` 내장)
4. 관련: [[session-lifetime-bloat-403]]

View File

@ -0,0 +1,19 @@
---
name: session-lifetime-bloat-403
description: 스크린샷 116장 → 세션 30MB → 403 socket closed 사망 실측. 세션 수명 기준(10MB/이미지 30장)·C14-7·session_health.sh 신설 근거 (2026-08-21 BT14)
metadata:
type: feedback
---
# 세션 비대 → 403 사망 실측과 세션 수명 체계 (2026-08-21 BT14)
**발견**: 8/20 GodDem 세션에 Unity 스크린샷 116장이 base64 원문으로 축적 → 세션 기록 30MB → `403 The socket connection was closed unexpectedly`(`authentication_failed`)로 사망. 대조군 8/13 세션은 이미지 1장·에러 0건. 이미지 1장 = 이후 모든 요청 페이로드에 영구 잔류. 두 PC 병행 사용 시 인증 토큰 갱신 충돌도 `authentication_failed`와 정합 (복합 요인 추정 — PD 가설).
**Why**: 세션은 무한히 키울 수 없다. 비대해질수록 요청 실패·크래시 확률이 오르고, 죽고 나서의 인수인계보다 살아있을 때의 분리가 싸다.
**How to apply**:
1. 시각 검증은 텍스트 실측 우선, 스크린샷은 단계 최종 확인·PD 증빙·픽셀 판정만 (C14-7)
2. 세션 기록 10MB·이미지 30장·API 끊김·압축 발생 = 세션 전환 권고 (C40 세션 수명, `session_health.sh` 자동 경고)
3. 세션 종결은 표준 순서로: SOT 정리 → 로그 → 대화로그 → 인수인계서(최후) → 단일 commit (NerdNavis C50-6 이식)
4. 두 PC 병행 시 동시 세션 금지 (토큰 갱신 충돌)
5. 계획에 없는 hook·고정비 신설은 감사 계획서에 선기재 후 집행 (pm-auditor Critical 2 재발 방지). 관련: [[hook-relative-path-failopen]]

50
scripts/session_health.sh Normal file
View File

@ -0,0 +1,50 @@
#!/bin/bash
# session_health.sh — C40 세션 수명 자동 실측 + hook 게이트 헬스체크 (UserPromptSubmit · 10분 스로틀)
# 근거: 2026-08-20 세션 30MB(스크린샷 116장) → 403 socket closed 사망 실측 (BT14)
# 기준: 세션 기록 10MB 또는 누적 이미지 30장 도달 시 세션 전환 권고 (권고 기준 — 운영 조정 가능)
# 세션 식별: hook stdin JSON의 transcript_path (공식 스키마) — 추정 아닌 실측. 폴백: mtime 최신
# --- 게이트 헬스체크 (fail-open 보완: PreToolUse hook 실패는 침묵 통과되므로 여기서 관측) ---
if [ -z "$CLAUDE_PROJECT_DIR" ]; then
echo "⚠️ [hook 헬스체크] CLAUDE_PROJECT_DIR 미주입 — hook 체계 전반 무력화 가능 상태. Claude Code 버전·hook 설정 점검 필요"
fi
GATE="${CLAUDE_PROJECT_DIR:-.}/scripts/auditor_gate.sh"
if [ ! -f "$GATE" ]; then
echo "⚠️ [hook 헬스체크] auditor_gate.sh 접근 불가($GATE) — C35-9 게이트 침묵 무력화 상태 (fail-open). 경로·클론 상태 점검 필요"
fi
# --- 스로틀 (10분) ---
THROTTLE_DIR="$HOME/.claude/.burningtimes_throttle"
THROTTLE="$THROTTLE_DIR/session_health"
mkdir -p "$THROTTLE_DIR"
now=$(date +%s)
last=$(cat "$THROTTLE" 2>/dev/null || echo 0)
[ $((now - last)) -lt 600 ] && exit 0
echo "$now" > "$THROTTLE"
# --- 현 세션 파일 식별: stdin JSON transcript_path 우선 ---
f=""
if [ ! -t 0 ]; then
stdin_json=$(cat 2>/dev/null)
f=$(printf '%s' "$stdin_json" | grep -o '"transcript_path":"[^"]*"' | head -1 | sed 's/.*transcript_path":"//;s/"$//;s/\\\\/\//g')
fi
# 폴백: mtime 최신 jsonl (C24 단일 세션 전제 — 다중 프로젝트 환경에서는 오판 가능, transcript_path 실패 시에만 사용)
if [ -z "$f" ] || [ ! -f "$f" ]; then
f=$(ls -t "$HOME"/.claude/projects/*/*.jsonl 2>/dev/null | head -1)
fi
[ -z "$f" ] || [ ! -f "$f" ] && exit 0
size=$(wc -c < "$f" 2>/dev/null | tr -d ' ')
size=${size:-0}
size_mb=$((size / 1048576))
imgs=$(grep -c '"type":"image"' "$f" 2>/dev/null | head -1)
imgs=${imgs:-0}
if [ "$size_mb" -ge 10 ] || [ "$imgs" -ge 30 ]; then
echo "⚠️ [C40 세션 수명] 현 세션 기록 ${size_mb}MB · 누적 이미지 ${imgs}장 — 기준(10MB/30장) 도달."
echo " → C40 인수인계서 작성 + 다음 세션 첫 프롬프트 템플릿 제공 후 세션 전환 권고"
echo " → 근거: 30MB 세션 403 소켓 끊김 사망 실측 (2026-08-20)"
elif [ "$size_mb" -ge 7 ] || [ "$imgs" -ge 20 ]; then
echo "📏 [C40 세션 수명 예고] 현 세션 기록 ${size_mb}MB · 이미지 ${imgs}장 — 기준(10MB/30장) 접근 중. 스크린샷 검증 최소화(C14-7) 유지"
fi
exit 0

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,39 @@
# 조직운영 대화로그 — 2026-08-21
## 세션: 세션 끊김 진단 + BT14 세션 수명 체계 구축 (총괄PM)
### PD 직접 지시 (BT14-Org)
1. "세션이 자꾸 끊기는데 왜그런지 확인해봐"
2. "처방대로 진행해" + "세션 분리 운영하고, 인수인계 체계로 승계하도록 진행해" + "E:\NerdNavisAi 참고"
3. hook 절대 경로화 반문 "상대 경로로 진행하는 것이 범용성을 높일 수 있는 것 아니야?" → **PD 지적 수용, `$CLAUDE_PROJECT_DIR` 방식 채택** (드라이브 고정 절대 경로는 C16 위반이었음)
4. 가설 제시 "다른 PC의 BurningTimesAi 세션 병행 때문 아닌가" + "GodDem 이어서 진행 가능한가?"
### 진단 결과 (실측)
- 8/20 세션: 스크린샷 116장 base64 축적 → 30MB → `403 socket closed`(`authentication_failed`) 사망. 대조군 8/13 세션 = 이미지 1장·에러 0건
- 후속 세션 47분 무기록 즉사 (원인 미규명 — 관찰 항목)
- 세이프가드 `[cyber]` 차단 1건
- hook 29종 상대 경로 → GodDem cwd 세션에서 에러 422건 + 27종 침묵 무력화 (auditor_gate 포함·fail-open)
- PD 두 PC 병행 가설: `authentication_failed`와 정합 (토큰 갱신 충돌). 복합 요인 추정
### GodDem 승계 판정
**문제없이 이어감 가능.** GodDem.git 미푸시 0·조직 레포(BurningTimesAi.git 공유) main 동기화·로컬 dirty 10건은 A10 분신 작업(BT12-Dev-Clone) 중간 상태로 보존 중 — 유실 아님, 재개 지점.
### 집행 (pm-auditor 조건부 승인 → 전건 해소)
| 항목 | 산출물 |
|------|--------|
| hook cwd 독립화 30종 | `.claude/settings.json` |
| C14-7 스크린샷 최소 획득 신설 | `bt-document-mgmt/SKILL.md` |
| C40 세션 수명·종결 표준 순서·인수인계 2계층 보강 (양쪽 정합) | `bt-session-mgmt`·`bt-foundation` SKILL |
| session_health.sh 신설 (transcript_path 실측·게이트 헬스체크 내장) + UserPromptSubmit hook 등록 | `scripts/session_health.sh` |
| NerdNavis 노하우 이식 (C50-6·C55·C40-1-A·이어가기 프롬프트 패턴) | 상동 |
| 조직공지·feedback 메모리 2건·MEMORY.md 인덱스·코어룰 인덱스 이력 | `공유/조직공지/2026-08-21_세션끊김_진단_및_세션수명_체계_v1.md` 외 |
### #이슈 (pm-auditor 적발 — C3 기록)
- **Critical 2**: session_health hook 신설을 감사 계획서에 미기재 상태로 선집행 (고정비 추가는 계획 선기재 의무 — feedback 등재)
- **Major 4**: 매니페스트 미등록 상태에서 settings.json 편집 선행 — hook 무력화 사고의 실증. 등록 후 재집행
- 진단 ②(무기록 즉사) 미규명·③(세이프가드) 처방 불가 — PD 명시 고지
### 결정·방침
- 세션 수명 기준: 10MB / 이미지 30장 / API 끊김 / 압축 발생 (권고 기준 — 운영 조정 가능)
- 이 PC(E:\BurningTimes) 단독 운영 권장. 두 PC 병행 시 동시 세션 금지
- C40 하위 번호 미사용 (무번호 소절) — C40-1~4 부재 상태에서 C40-5 신설 시 번호 기형 (감사 Major 1)

View File

@ -0,0 +1,48 @@
# 세션 끊김 진단 및 세션 수명 체계 v1 (BT14)
> **일자**: 2026-08-21 · **집행**: 총괄PM · **PD 승인**: "처방대로 진행해" + "세션 분리 운영·인수인계 승계·NerdNavisAi 참고" (2026-08-21 직접 지시)
> **사전 감사**: pm-auditor 조건부 승인 — Critical 2·Major 4 전건 해소 반영
---
## 1. 진단 결과 (실측)
| # | 실측 사실 | 판정 |
|---|----------|------|
| ① | 8/20 세션에 Unity 스크린샷 **116장** base64 축적 → 세션 기록 **30MB**`403 The socket connection was closed unexpectedly` (`authentication_failed`)가 마지막 이벤트로 세션 사망 | 주원인 추정 (페이로드 비대). 8/13 세션은 이미지 1장·에러 0건 (대조군) |
| ② | 후속 세션(1.2MB)이 47분 만에 도구 결과 수신 직후 **무기록 즉사** | **원인 미규명** — 크래시 패턴. 관찰 항목으로 유지 |
| ③ | 세이프가드 `[cyber]` 차단 1건 (새 세션 재시도 강제) | 처방 불가 영역 — 발생 시 표현 우회·새 세션 대응 |
| ④ | `.claude/settings.json` hook 29종 전부 상대 경로 등록 — cwd가 GodDem인 세션에서 **에러 422건 + 27종 hook 침묵 무력화** (auditor_gate 포함, fail-open) | 확정 결함 — 본 건 처방 |
| ⑤ | PD 가설 "두 PC 병행 사용": 에러 유형이 `authentication_failed`**토큰 갱신 충돌 가설과 정합**. 단독 원인 단정 불가 — ①과 복합 추정 | 이 PC 단독 운영 시 소멸 |
## 2. 처방 집행 내역
| # | 처방 | 산출물 |
|---|------|--------|
| 1 | **hook cwd 독립화 30종**`cd "$CLAUDE_PROJECT_DIR" && bash scripts/...` 전량 적용 (인라인 git 2건 포함). GodDem cwd 시뮬레이션·JSON 검증 통과. 본 세션에서 auditor_gate 즉시 재작동 실증 | `.claude/settings.json` |
| 2 | **C14-7 신설** — 스크린샷·이미지 최소 획득 (텍스트 실측 우선·허용 3종·30장 상한) | `bt-document-mgmt/SKILL.md` |
| 3 | **C40 세션 수명 판정·분리 운용 보강** — 기준 10MB/이미지 30장/API 끊김/압축 (권고, 조정 가능) 도달 시 인수인계 후 세션 전환. `bt-foundation`·`bt-session-mgmt` 양쪽 정합 갱신 | SKILL 2종 |
| 4 | **세션 수명 자동 실측 hook 신설** — UserPromptSubmit·10분 주기. hook stdin `transcript_path` 기반 현 세션 정확 식별 + auditor_gate fail-open 헬스체크 내장 | `scripts/session_health.sh` |
| 5 | **NerdNavis 노하우 이식** — 종결 표준 순서(C50-6: 인수인계서 최후 작성·역순 금지), 인수인계 2계층(C55: 핵심 요약+세부 아카이브·완료 태그 1줄), 인수인계서↔SOT 정합 의무(C40-1-A), 미래형 표기 금지(C50-6-2), 이어가기 프롬프트 패턴("본문을 채팅에 풀지 않는다 — 인계서를 읽게 한다") | `bt-session-mgmt/SKILL.md` |
## 3. 감사 지적 반영 (pm-auditor)
- **Critical 1** `session_health.sh` untracked → 본 커밋 포함 ✓
- **Critical 2** hook 신설 계획 미기재 선집행 → 본 공지·PD 보고 명시 ✓ (신규 hook 1건 = 상시 실행 고정비 추가. 평시 출력 0줄이라 컨텍스트 비용은 실질 0, 프로세스 실행 비용만 존재)
- **Major 1** C40-5 번호 기형 → 하위 번호 미사용·무번호 소절 방식 채택 (번호 체계 무변경) ✓
- **Major 2** C40 본문 2곳 중복 → 양쪽 동시 갱신 ✓
- **Major 3** 진단 ②③ 미처방 → 본 공지 1절 명시 ✓
- **Major 4** 매니페스트 미등록 → `2026-08-21_BT14_SessionSurvival` 등록 후 집행 ✓
- **Minor 2** 현 세션 식별 proxy → `transcript_path` 실측 방식 전환 + GNU stat 의존 제거 ✓
- **Improvement** fail-open 게이트 → `session_health.sh` 헬스체크 내장 ✓
## 4. 잔여·관찰 항목
- 진단 ② 무기록 즉사: 원인 미규명. 재발 시 발생 시각·직전 작업 기록해 본 문서에 추가
- 두 PC 병행 사용: **이 PC(E:\BurningTimes) 단독 운영 권장** — 병행 필요 시 동시 세션 금지
- `~/.claude` 하위 nerdnavis-audit 동기화 충돌 파일 수백 건 (OneDrive 추정): 세션 끊김과 무관 판정. 별도 정리 후보
## 5. 참조
- 이식 원본: `E:\NerdNavisAi` (NerdNavis 조직 레포) — C50·C55·C40-1-A·C17-3·인수인계서_체크리스트_v1
- 세션 실측 근거: `C:\Users\sw\.claude\projects\E--BurningTimes\66f66968*.jsonl` (30MB·이미지 116장·403 에러) 및 `6f0d01eb*.jsonl` (무기록 즉사)