# task-1142.1 완료 보고서: 팀원 에이전트 이름→ID 매핑 동적 로드 구현

## SCQA

**S**: task-1139.1에서 `parse-member-id.sh`에 55명분 하드코딩 매핑을 구현하여 팀원 상태 대시보드가 동작 중이다. pre-tool-use.sh와 post-tool-use.sh가 이 공유 라이브러리를 소싱하여 Task tool 호출 시 member-status.json에 working/idle 상태를 기록한다.

**C**: 실제 organization-structure.json에는 73명분 데이터가 존재하며(하드코딩 55명과 불일치), `bastet`(dev8 신규) 누락 + `isis`(제거됨) 잔존. 조직 변경 시마다 코드를 수동 수정해야 하는 유지보수 부담이 있다.

**Q**: organization-structure.json에서 동적으로 매핑을 로드하여 조직 변경 시 JSON만 수정하면 자동 반영되도록 할 수 있는가?

**A**: Python 제너레이터(`generate-member-map.py`)가 org-structure.json을 파싱하여 bash 캐시 파일을 자동 생성하는 구조로 전환. `parse-member-id.sh`는 캐시 만료를 자동 감지하여 재생성 후 소싱. org-structure.json의 73개 에이전트가 모두 매핑되며, pytest 16/16 통과, pyright 에러 0건.

## 수정 내용

### 1. `/home/jay/.claude/hooks/lib/generate-member-map.py` (신규, 283줄)
- org-structure.json 재귀 파싱으로 에이전트 id/name 추출
- name 필드 `"한국어 (English)"` 형식 자동 파싱
- Substring 충돌 자동 감지 및 매칭 순서 결정 (긴 이름 먼저)
- 한국어/영어 PCRE 경계를 독립적으로 판단:
  - 한국어 1글자(루,라) + 예외("에코"): PCRE 경계 적용
  - 영어 ≤4글자: `\b` word boundary 적용
  - 2글자+ 한국어 이름에는 경계 미적용 (조사 붙어도 매칭: "토르가 개발")
- 특수 이름 처리: Ah Kin, Ma'at, Da Vinci, Áine
- `.member-map-cache.sh` 캐시 파일 출력

### 2. `/home/jay/.claude/hooks/lib/parse-member-id.sh` (전면 교체, 34줄)
- 72개 하드코딩 if/elif 체인 제거
- 캐시 만료 자동 감지 (org-structure.json mtime vs 캐시 mtime 비교)
- 캐시 없거나 만료 시 generate-member-map.py 자동 호출
- 캐시 소싱 실패 시 빈 문자열 반환 (hook 안전성 보장)

### 3. `/home/jay/.claude/hooks/lib/.member-map-cache.sh` (자동 생성, 87줄)
- 73개 에이전트 매핑 포함
- org-structure.json updated 날짜 + 생성 시각 주석 기록

### 4. `/home/jay/workspace/teams/dev4/tests/test_dynamic_member_mapping.py` (신규, 12개 테스트)
- 캐시 생성, 전체 매핑 완전성, 기본 이름, substring 충돌, PCRE 경계, 특수 이름, false positive, 캐시 staleness, 한국어/영어/혼합 파싱

### 5. `/home/jay/workspace/teams/dev5/tests/test_member_id_mapping.py` (수정)
- `get_mapped_ids()` 함수가 캐시 파일도 참조하도록 최소 수정 (동적 로드 호환)

## 수정/생성 파일 목록
- 생성: `/home/jay/.claude/hooks/lib/generate-member-map.py` (283줄)
- 수정: `/home/jay/.claude/hooks/lib/parse-member-id.sh` (131줄→34줄)
- 자동생성: `/home/jay/.claude/hooks/lib/.member-map-cache.sh` (87줄)
- 생성: `/home/jay/workspace/teams/dev4/tests/test_dynamic_member_mapping.py` (12 tests)
- 수정: `/home/jay/workspace/teams/dev5/tests/test_member_id_mapping.py` (get_mapped_ids 함수)

## 테스트 결과
- dev4 pytest: 12/12 통과 (동적 매핑 전체 검증)
- dev5 pytest: 4/4 통과 (기존 호환성 검증)
- pyright: 0 errors, 0 warnings
- E2E bash 검증: 73개 에이전트 매핑 정상, substring 충돌 방지 정상, PCRE 경계 정상

## 발견 이슈 및 해결

### 자체 해결 (4건)
1. **isis→bastet 불일치** — org-structure.json에서 isis가 bastet으로 교체되었으나 기존 코드에 isis 잔존. 동적 로드로 자동 해결 (org-structure.json 기준으로 생성)
2. **PCRE 경계 과잉 적용 버그** — 초기 구현에서 영어 이름 길이(≤4) 기준으로 한국어 이름에까지 PCRE 경계를 적용하여 "토르가 개발"이 매칭 실패. 한국어/영어 경계 판단을 독립 분리하여 해결
3. **dev5 테스트 호환성 깨짐** — `get_mapped_ids()`가 parse-member-id.sh 파일 내용에서 직접 echo 패턴을 찾는 방식이라 동적 로드 후 실패. 캐시 파일도 참조하도록 수정
4. **Ma'at 작은따옴표 이스케이프** — bash single-quote 패턴에 `'`가 포함되면 구문 오류. double-quote grep 패턴으로 분리 처리

### 범위 외 미해결 (1건)
1. **server.py timezone 파싱 버그** — task-1139.1에서 보고된 기존 이슈. `test_timezone_aware_since_not_stuck_working` 1건 실패. 범위 외 사유: server.py 코드는 본 작업 지시 범위 밖

## QC 자동 검증 결과

```
pyright_check: PASS (0 errors)
style_check: PASS (black+isort 적용 완료)
data_integrity: PASS
test_runner: SKIP (관련 테스트 자동 추론 0개, 정당한 SKIP)
```
