# task-99.1: 철학 vs 실제 코드 Gap 전수 감사 보고서

**작성자:** 헤르메스 (개발1팀장)
**감사일:** 2026-03-02
**감사 팀원:** 불칸(A,B,D), 아르고스(C), 이리스(E), 헤르메스(F+통합)

---

## 감사 대상 파일 (9개)

1. `/home/jay/workspace/prompts/team_prompts.py`
2. `/home/jay/workspace/dispatch.py`
3. `/home/jay/.claude/hooks/user-prompt-submit.sh`
4. `/home/jay/.claude/hooks/post-tool-use.sh`
5. `/home/jay/.claude/hooks/pre-tool-use.sh`
6. `/home/jay/.claude/hooks/stop-qc-reminder.sh`
7. `/home/jay/workspace/memory/event-queue.py`
8. `/home/jay/workspace/dashboard/server.py`
9. `/home/jay/workspace/dashboard/index.html`

**감사 기준:** 아누 가이드 v1.1, organization-structure.json v2.0, CLAUDE.md

---

## 종합 판정 요약

- **A) team_prompts.py 5원칙 반영**: **PASS**
- **B) dispatch.py 프로토콜 지원**: **PARTIAL** (2건 FAIL, 2건 PARTIAL)
- **C) hooks 설계 의도 충족**: **PARTIAL** (Audit Trail 형식 Gap, 고급 트리거 미구현)
- **D) event-queue.py 동시성 안전장치**: **PASS**
- **E) 대시보드 SSE/bot-activity/member-status 통합**: **PARTIAL** (횡단조직 member-status 미연동)
- **F) 선언 vs 미구현 / 구현 vs 선언 불일치**: **4건 발견**

---

## 체크항목 A: team_prompts.py — 5원칙 반영 여부

### 판정: PASS

**감사자: 불칸**

`_build_work_philosophy_section()` (team_prompts.py:78~102)에서 A~E 5원칙이 전부 정확히 포함됨.

- A) 계획 우선 원칙 (83~86행): 3개 세부항목 전부 일치
- B) 결정론적 실행 (87~90행): 3개 세부항목 전부 일치
- C) 피드백 사이클 (91~94행): 3개 세부항목 전부 일치
- D) 문서화 의무 (95~98행): 2개 세부항목 + "대안 없는 보고서 = 사고하지 않은 보고서" 강화 문구 추가 (위배 아님)
- E) 감사추적 (99~101행): 2개 세부항목 전부 일치

**추가 확인:**
- System 2 Forcing 5항목 (297~309행): PASS — 아누 가이드 3.4와 정확 일치
- critical 레벨 마아트 소집 (316~331행): PASS — 아누 가이드 3.1/4.1과 일치
- security 레벨 마아트+로키 소집 (333~348행): PASS — 아누 가이드 3.1/4.1과 일치
- dev3-team GLM 프롬프트 (279행): PASS — 동일한 `_build_work_philosophy_section()` 호출로 일관성 보장

**검토 대안:** 인라인 문자열 삽입 vs 공통 함수 분리 → 현재 공통 함수 방식이 일관성·유지보수 면에서 우월. 기각 사유 없음.

---

## 체크항목 B: dispatch.py — 프로토콜 지원 여부

### 판정: PARTIAL

**감사자: 불칸**

소항목별 결과:

- **B-1. task-timer start/end 프롬프트 포함**: PASS (team_prompts.py:136~139, direct:216/223행, glm:281/289행)
- **B-2. .done 프로토콜**: PARTIAL
  - direct 프롬프트: `memory/events/{task_id}.done` — 정상
  - **GLM 프롬프트 경로 불일치**: `teams/dev3/{task_id}.done` (team_prompts.py:252행) vs 아누 통보 cron이 참조하는 `memory/events/{task_id}.done` (team_prompts.py:293행). **done 파일 생성 경로와 아누 통보 참조 경로가 다름.**
- **B-3. 팀 경계 분리**: PASS (team_prompts.py:198~203, 253~258행)
- **B-4. TEAM_BOT 라우팅 일치**: PASS (dispatch.py:48~52)
- **B-5. generate_task_id() 경합 안전성**: PARTIAL — fcntl.LOCK_EX 기반 보호 구현되어 있으나, `open(lock_file_path, "w")` (dispatch.py:75행)가 try 블록 외부에 위치하여 lock_file 핸들 누수 위험.
- **B-6. 이중 위임 방지**: PARTIAL — description 첫 60자 비교(199행)의 한계: 60자 초과 지점에서만 차이가 나는 중복은 탐지 불가.
- **B-7. _register_followup 호출 여부**: **FAIL** — 함수 정의(dispatch.py:135행)만 있고 dispatch() 함수 내에서 호출이 전혀 없음. Dead code.
- **B-8. event-queue 등록 프롬프트 포함**: PASS (team_prompts.py:221, 292행)

**수정 권고 (우선순위순):**
1. `_register_followup` dead code 제거 또는 활성화 (dispatch.py:135~161)
2. GLM done_file 경로를 `memory/events/`로 통일 (team_prompts.py:252)
3. `generate_task_id()` lock_file 핸들을 `with` 문으로 변경 (dispatch.py:75~76)

---

## 체크항목 C: hooks 설계 의도 충족 여부

### 판정: PARTIAL

**감사자: 아르고스**

파일별 결과:

### detect-bot.sh: PASS
- cwd 패턴 매칭 정확 (autoset→anu, teams/dev1→dev1 등)
- `.cokacdir/workspace/*dev1*` 패턴으로 봇 세션 디렉토리도 정확히 식별

### user-prompt-submit.sh: PARTIAL
- **PASS**: 봇 식별, 봇 활동 기록(processing), .done 파일 체크, 이벤트 큐 체크, 역할별 가이드 주입
- **Gap**: 아누 가이드 1.2의 "4가지 매칭 조건"(키워드/의도/작업위치/파일내용) 중 CWD 기반 봇 식별만 구현. 키워드·의도 기반 동적 가이드 로딩은 미구현. 다만 이는 Claude Code의 Skill 트리거 시스템이 일부 담당하는 영역이므로, 훅 단독 책임이 아닐 수 있음.

### post-tool-use.sh: PARTIAL
- **PASS**: JSONL Audit Trail 기록(98행), Task tool 완료 시 member-status idle 업데이트, 팀원 매핑 함수 20명 전원 커버
- **Gap — Audit Trail 형식 불일치** (아누 가이드 1.4):
  - 가이드 요구: `[팀/팀원] [시각] [파일] [변경유형] [사유]`
  - 실제 기록: `{ts, bot, session, tool, file, cwd}`
  - **누락 필드**: 팀원명(bot ID만 기록), 변경 사유
  - **추가 필드**: session, cwd (가이드 미요구)
  - 또한 Edit/Write/NotebookEdit 외 모든 도구가 기록됨 (가이드는 파일 수정 도구만 언급)

### pre-tool-use.sh: PASS
- Task tool 시작 시 working 상태 기록 정상
- 팀원 매핑 함수 post-tool-use.sh와 100% 동일

### stop-qc-reminder.sh: PARTIAL
- **PASS**: stop_hook_active 무한루프 방지, 봇 idle 기록, anu 봇 제외
- **Gap**: QC 리마인더 3번 항목 표현 차이
  - 가이드 3.4: "이 구현이 **계획서와** 정확히 일치하는가?"
  - 현재 코드(68행): "이 구현이 **작업 지시와** 정확히 일치하는가?"
  - 단, team_prompts.py의 셀프체크 섹션(305행)도 동일하게 "작업 지시"를 사용하므로 내부 일관성은 유지됨. 가이드 원문과만 불일치.

**수정 권고 (우선순위순):**
1. post-tool-use.sh Audit Trail에 팀원명(member) 및 변경 사유(reason) 필드 추가
2. Edit/Write/NotebookEdit 도구만 선택적으로 상세 기록하도록 필터링 추가
3. stop-qc-reminder.sh 3번 항목을 가이드 원문과 통일하거나, 가이드를 "작업 지시"로 업데이트

---

## 체크항목 D: event-queue.py 동시성 안전장치

### 판정: PASS

**감사자: 불칸**

- **D-1. fcntl.flock 파일 잠금**: PASS — LOCK_SH(읽기), LOCK_EX(쓰기) 올바르게 사용
- **D-2. Atomic write**: PASS — tempfile.mkstemp → os.replace + os.fsync 패턴 구현
- **D-3. 백업 복구(.bak)**: PASS — 쓰기 전 shutil.copy2, 읽기 실패 시 .bak 복구 시도
- **D-4. enqueue/dequeue 배타적 잠금**: PASS — .lock 파일 LOCK_EX로 read-modify-write 원자적 처리
- **D-5. LOCK_SH/LOCK_EX 올바른 사용**: PASS (이중 잠금 구조이나 기능상 문제 없음)
- **D-6. finally 블록 잠금 해제**: PASS — 4곳 모두 finally 블록 보장
- **D-7. 에러 처리**: PASS — 파일 없음, JSON 실패, .bak 실패 모두 처리

**설계 주의사항:** peek/count/list_events는 .lock 파일 보호 없이 _read_data의 LOCK_SH만으로 읽기. 읽기 전용이므로 데이터 손상 위험 없으나, os.replace 중간에 읽기 시 .bak 복구 경로로 처리됨.

---

## 체크항목 E: 대시보드 SSE/bot-activity/member-status 통합

### 판정: PARTIAL

**감사자: 이리스**

### server.py 감사 결과:

- **SSE /api/stream**: PARTIAL
  - PASS: 감시 대상 파일 5개(bot-activity, member-status, task-timers, tech-debt, ci-latest) 올바름
  - PASS: mtime 비교 변경 감지, 15초 keepalive, Connection: keep-alive 헤더
  - Gap: CORS 기본값에 특정 IP 하드코딩 (server.py:666)
- **bot-activity 통합**: PASS — /api/bot-activity 엔드포인트, DataLoader 정상
- **member-status 통합**: PASS — /api/member-status 엔드포인트, DataLoader 정상
- **get_member_status() 상태 결정**: PARTIAL
  - Gap: member-status.json에서 `working` 상태만 우선 반영, `idle`/`standby` 등 명시 상태는 무시 (server.py:388)
  - Gap: bot-activity.json 봇 상태가 get_member_status()에 통합되지 않음 (별도 API로만 노출)
- **인증**: PARTIAL — Basic Auth 구현됨, SSE 면제 의도적(주석 기록). 기본 패스워드 `changeme` 하드코딩 (server.py:545)

### index.html 감사 결과:

- **SSE 연결**: PASS — EventSource, refresh 이벤트, 폴링 폴백, 연결 상태 표시 모두 정상
- **bot-activity 표시**: PASS — 4개 봇(anu/dev1/dev2/dev3) processing/idle 헤더 배지 표시
- **member-status 표시**: PARTIAL
  - PASS: 개발팀 TeamCard에 memberStatus prop 전달 → MemberRow에서 반영
  - **Gap: 레드팀(534~548행)과 횡단조직 CenterCard(167~195행)에 memberStatus prop 미전달** → 로키/비너스/야누스/마아트 4명의 실시간 상태 미반영
- **조직 구조 20명 표시**: PARTIAL — 구조상 표시 가능하나 횡단조직은 `status===active` 조건부
- **작업 현황**: PASS — 진행중 배너, 히스토리 12건 표시 정상

**수정 권고 (우선순위순):**
1. index.html: 레드팀/CenterCard에 memberStatus prop 전달하여 4명 실시간 상태 반영
2. server.py: get_member_status()에서 member-status.json의 `idle` 등 명시 상태도 우선 반영
3. server.py: 기본 패스워드 하드코딩 제거, 환경 변수 미설정 시 경고 출력

---

## 체크항목 F: 선언만 하고 미구현 / 구현했지만 선언과 다른 항목

### 판정: 4건 발견

### F-1. 선언만 하고 미구현 (Dead Code / 미완성)

**F-1-1. `dispatch.py:_register_followup` — Dead Code** (FAIL)
- 위치: dispatch.py:135~161
- 현상: followup 등록 함수가 정의되어 있으나 dispatch() 함수 내에서 한 번도 호출되지 않음
- 영향: 코드 독자에게 followup이 등록된다는 오해 유발
- 현재 우회: 팀장 프롬프트 내 아누 통보 cron 명령(team_prompts.py:222, 293행)이 대신 역할 수행
- 권고: 함수 제거 또는 dispatch() 성공 분기에서 호출 활성화

**F-1-2. 아누 가이드 1.2 "4가지 매칭 조건" — 부분 구현**
- 가이드 선언: 키워드/의도/작업위치/파일내용 4가지 조건으로 트리거
- 현재 구현: CWD 기반 봇 식별만 구현 (detect-bot.sh)
- 참고: Claude Code의 Skill 트리거 시스템이 키워드/의도 매칭을 일부 담당. 훅 단독 미완이라 해도 시스템 전체로는 보완될 수 있음.
- 권고: 명확히 "훅 vs 스킬" 역할 분담을 아누 가이드에 명시

### F-2. 구현했지만 선언과 다른 항목

**F-2-1. Audit Trail 형식 불일치**
- 아누 가이드 1.4 선언: `[팀/팀원] [시각] [파일] [변경유형] [사유]`
- 실제 구현 (post-tool-use.sh:98행): `{ts, bot, session, tool, file, cwd}`
- 차이: 팀원명 미기록(bot ID만), 변경 사유 미기록, session/cwd는 가이드 미요구
- 권고: 가이드 형식에 맞게 필드 추가하거나, 가이드를 현실에 맞게 업데이트

**F-2-2. GLM .done 파일 경로 불일치**
- 선언(아누 통보 cron): `memory/events/{task_id}.done` (team_prompts.py:293행)
- 실제 생성: `teams/dev3/{task_id}.done` (team_prompts.py:252행)
- 영향: 아누가 done 파일을 rename하라는 지시가 실행 불가 (파일이 다른 경로에 존재)
- 권고: 경로를 `memory/events/` 로 통일

---

## 전체 감사 판정 요약

- A) team_prompts.py 5원칙: **PASS** — 5원칙 전항목 정확 반영, System 2 Forcing 5항목 포함, critical/security 검증 분기 구현
- B) dispatch.py 프로토콜: **PARTIAL** — task-timer/event-queue/팀경계는 정상. _register_followup dead code, GLM done경로 불일치
- C) hooks 설계 의도: **PARTIAL** — 봇 식별·활동 기록·QC 리마인더 기본 동작. Audit Trail 형식 Gap, 고급 트리거 미구현
- D) event-queue.py 동시성: **PASS** — fcntl.flock, atomic write, .bak 복구 모두 견고하게 구현
- E) 대시보드 통합: **PARTIAL** — SSE/bot-activity/member-status 핵심 기능 구현. 횡단조직 member-status 미연동
- F) 선언 vs 실제 Gap: **4건** — dead code 1건, 부분 구현 1건, 형식 불일치 1건, 경로 불일치 1건

---

## 수정 권고 우선순위 (Top 5)

1. **[HIGH] dispatch.py _register_followup dead code** — 제거 또는 활성화. 현재 코드가 독자를 오도함.
2. **[HIGH] GLM done_file 경로 통일** — team_prompts.py:252행 `teams/dev3/` → `memory/events/` 로 변경
3. **[MEDIUM] post-tool-use.sh Audit Trail 형식** — 팀원명(member), 변경 사유(reason) 필드 추가. Edit/Write/NotebookEdit만 상세 기록.
4. **[MEDIUM] index.html 횡단조직 memberStatus 전달** — CenterCard/레드팀에 memberStatus prop 전달
5. **[LOW] server.py 기본 패스워드 제거** — 환경 변수 미설정 시 경고/차단 추가

---

## 검토 대안과 기각 사유

- **_register_followup 활성화 vs 제거**: 프롬프트 내 아누 통보 cron이 이미 동일 역할을 수행하므로, 중복 방지를 위해 "제거"를 1순위로 권고. 다만 Python 수준 followup이 더 신뢰성 높다는 반론도 유효하므로, "활성화 + cron 통보 제거"도 대안.
- **Audit Trail 형식**: 가이드를 현실에 맞게 업데이트하는 대안도 있으나, 가이드가 상위 기준이므로 "코드를 가이드에 맞추는" 방향을 권고. 다만 "변경 사유"는 훅에서 자동 추출이 어려우므로 가이드 완화도 검토 가능.
- **4가지 매칭 조건**: 훅에서 전부 구현하는 대안 vs Skill 트리거 시스템과 역할 분담하는 대안. 후자가 토큰 효율·시스템 복잡도 면에서 우월. 역할 분담을 가이드에 명시하는 것을 권고.

---

## 생성/수정 파일 목록

- 생성: `/home/jay/workspace/memory/reports/task-99.1.md` (본 보고서)
- 수정: 없음 (감사 전용 작업)

## 감사 추적

- 헤르메스(dev1-team 팀장), 2026-03-02, 보고서 작성
- 불칸(서브에이전트), 2026-03-02, 체크항목 A/B/D 감사
- 아르고스(서브에이전트), 2026-03-02, 체크항목 C 감사
- 이리스(서브에이전트), 2026-03-02, 체크항목 E 감사
