# task-1205.1 완료 보고서: member-status hook 오탐 원인 분석 + 개선

## SCQA

**S**: `~/.claude/hooks/pre-tool-use.sh`가 Task/Agent tool 호출 시 프롬프트 텍스트에서 멤버 이름을 grep으로 매칭하여 member-status.json을 업데이트하는 시스템이 운영 중이다.

**C**: 마케팅팀 작업(task-1204.1) 프롬프트에 "에라토"가 포함되면서 출판팀 에라토(Erato)가 "작업중"으로 오탐 표시됨. hook이 팀 범위를 확인하지 않고 전체 조직에서 이름을 매칭하며, `grep -qi '에라토\|erato'`가 부분 문자열 매칭이라 "에라토스테네스"에서도 오탐 발생.

**Q**: 기존 정상 동작(같은 팀 멤버 매칭)을 깨뜨리지 않으면서, 타 팀 멤버 오탐을 방지할 수 있는가?

**A**: Option D(A+B) 적용 — (A) detect-bot.sh로 BOT_ID를 추출하고 `_TEAM_MAP` 연관배열로 팀 범위 필터링, (B) "erato"를 PCRE_EN_NAMES에 추가하여 `\bErato\b` 영어 워드 바운더리 적용. 16개 테스트 시나리오 전체 통과, bash 문법 검증 4/4 통과.

## 수정 내역

### 변경 사항 (Option D: 팀 범위 필터 + 영어 워드 바운더리)

**Part A — 팀 범위 필터**:
- `generate-member-map.py`에 `extract_team_membership()` 함수 추가: org-structure.json에서 15개 팀 멤버십 추출
- 캐시에 `declare -A _TEAM_MAP` + `_CROSS_ORG` + `_is_team_member()` 함수 자동 생성
- `parse-member-id.sh`의 `parse_member_id()` 에 선택적 2번째 인자 (bot_id) 지원 추가
- `pre-tool-use.sh`에 CWD 추출 + `detect-bot.sh` 소싱 추가
- `post-tool-use.sh`에 BOT_ID 전달 추가

**Part B — 영어 워드 바운더리**:
- `PCRE_EN_NAMES`에 `"erato"` 추가 → `\bErato\b`로 "Eratosthenes" 오탐 방지

### 팀 범위 필터 동작 규칙
- BOT_ID 감지 성공 (예: "dev7") → 해당 팀 멤버 + 횡단조직만 매칭
- BOT_ID = "anu" → 모든 멤버 매칭 (개발실장 권한)
- BOT_ID = "unknown" → 모든 멤버 매칭 (하위호환)
- 횡단조직 에이전트 (maat, janus, venus, atlas, prometheus, chronos) → 어떤 팀에서든 매칭

## 산출물 파일 목록

- `/home/jay/.claude/hooks/lib/generate-member-map.py` (수정)
- `/home/jay/.claude/hooks/lib/parse-member-id.sh` (수정)
- `/home/jay/.claude/hooks/pre-tool-use.sh` (수정)
- `/home/jay/.claude/hooks/post-tool-use.sh` (수정)
- `/home/jay/.claude/hooks/lib/.member-map-cache.sh` (재생성)
- `/home/jay/.claude/hooks/lib/generate-member-map.py.bak3` (백업)
- `/home/jay/.claude/hooks/lib/parse-member-id.sh.bak3` (백업)
- `/home/jay/.claude/hooks/pre-tool-use.sh.bak3` (백업)
- `/home/jay/.claude/hooks/post-tool-use.sh.bak3` (백업)
- `/home/jay/workspace/teams/dev7/test_member_hook.sh` (테스트 스크립트)

## 테스트 결과

**16/16 통과** (bash 테스트 스크립트: `teams/dev7/test_member_hook.sh`)

핵심 시나리오:
- dev7 세션 + "쿠쿨칸" → kukulkan 매칭 (같은 팀 정상 동작)
- dev7 세션 + "에라토" → 빈문자열 (팀 범위 필터로 차단)
- publishing 세션 + "에라토" → erato 매칭 (같은 팀 정상 동작)
- unknown 세션 + "에라토" → erato 매칭 (하위호환)
- "Eratosthenes" → 빈문자열 (영어 워드 바운더리 차단)
- dev7 세션 + "마아트" → maat 매칭 (횡단조직 허용)
- anu 세션 + "에라토" → erato 매칭 (anu 전체 접근)

bash 문법 검증 4/4 통과 (cache, parse, pre, post)

## 발견 이슈 및 해결

### 자체 해결 (2건)

1. **publishing-center 중복 문제** — org-structure.json에 publishing-team(수직)과 publishing-center(횡단)가 모두 존재하여 출판팀 멤버가 cross_org에 포함될 위험
   - 해결: `extract_team_membership()`에서 `status != "active"` 센터를 제외 (publishing-center는 status="planned")

2. **pre-tool-use.sh에 CWD/detect-bot 누락** — 기존 코드에 CWD 추출과 detect-bot.sh 소싱이 없어 팀 식별 불가
   - 해결: post-tool-use.sh와 동일한 CWD 추출 + detect-bot.sh 소싱 패턴 추가

### 범위 외 미해결 (1건)

1. **cokacdir 세션의 BOT_ID "unknown" 문제** — cokacdir 워크스페이스 경로(/home/jay/.cokacdir/workspace/HASH)에 팀 이름이 포함되지 않으면 detect-bot.sh가 "unknown"을 반환하여 팀 필터가 비활성화됨
   - 범위 외 사유: detect-bot.sh 및 cokacdir 세션 아키텍처 변경은 본 태스크 범위를 초과함. dispatch.py 또는 cokacdir에서 세션 팀 정보를 전달하는 메커니즘이 필요 (별도 태스크 권장)
