# task-1139.1 완료 보고서: 팀원 에이전트 작업 상태 신호등 미반영 수정

## SCQA

**S**: 대시보드의 팀원 상태 표시는 `member-status.json`을 기반으로 동작한다. Claude Code hooks (pre/post-tool-use.sh)가 Task tool 호출 시 `parse_member_id()` 함수로 에이전트 이름을 파싱하여 member-status.json에 working/idle 상태를 기록한다.

**C**: `parse_member_id()` 함수에 dev1/dev2 팀원 + 횡단조직 리드 20명만 매핑되어 있었고, dev3~7팀(20명), 마케팅팀(7명), 출판팀(6명), 디자인팀(4명), 보안팀(4명), 컨설팅팀(2명), 센터 리드(7명), 직할(1명) 등 **총 35+명의 에이전트가 누락**되어 해당 팀원들의 상태가 대시보드에 반영되지 않았다.

**Q**: 전체 55명의 에이전트를 매핑하여 모든 팀의 팀원 상태가 실시간으로 대시보드에 반영되도록 할 수 있는가?

**A**: 공유 라이브러리 `parse-member-id.sh`를 생성하여 organization-structure.json의 전체 55명을 매핑하고, 양쪽 hook에서 이를 소싱하도록 수정. pytest 4건 전체 통과, pyright 에러 0건. E2E 테스트로 마케팅/dev5/dev6팀 멤버의 working→idle 전환 정상 확인.

## 근본 원인 분석

`/home/jay/.claude/hooks/pre-tool-use.sh`의 `parse_member_id()` 함수에 에이전트 이름→ID 매핑이 dev1(5명), dev2(5명), dev8(4명), 횡단(6명) = 20명만 존재했다. 나머지 35명은 매핑이 없어 Task tool 호출 시에도 member-status.json에 기록되지 않았다.

서버(server.py)와 프론트엔드(utils.js)의 상태 결정 로직은 member-status.json을 **우선 참조**하도록 올바르게 구현되어 있었으므로, hooks의 매핑만 완성하면 해결되는 구조였다.

## 수정 내용

### 1. `/home/jay/.claude/hooks/lib/parse-member-id.sh` (신규)
- 전체 55명 에이전트의 한국어/영어 이름→ID 매핑 함수
- substring 충돌 방지 (아누비스→아누, 라타토스크→라 등)
- PCRE lookahead/lookbehind로 짧은 이름(라, 루, 에코)의 오탐 방지
- 공유 라이브러리로 설계하여 양쪽 hook에서 소싱

### 2. `/home/jay/.claude/hooks/pre-tool-use.sh` (수정)
- 인라인 `parse_member_id()` 함수 제거
- 공유 라이브러리 소싱으로 대체 (20명→55명)

### 3. `/home/jay/.claude/hooks/post-tool-use.sh` (수정)
- 인라인 `_parse_member_id()` 함수 제거
- 공유 라이브러리 소싱으로 대체 (20명→55명)

### 4. `/home/jay/workspace/teams/dev5/tests/test_member_id_mapping.py` (신규)
- org-structure 대비 매핑 완전성 검증 (55개 ID)
- 기본 동작 검증 (한국어/영어 이름)
- substring 충돌 테스트 (아누비스 vs 아누)
- false positive 테스트

## 수정/생성 파일 목록
- 생성: `/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/workspace/teams/dev5/tests/test_member_id_mapping.py`

## 테스트 결과
- pytest: 4/4 통과 (mapping 검증 4건)
- pyright: 에러 0건
- E2E hook 테스트: 엔키(dev5), 아폴론(marketing), 스바로그(dev6)의 working→idle 전환 정상 확인
- 대시보드 기존 테스트: 69/70 통과 (1건 기존 timezone 이슈, 본 작업 범위 외)

## 발견 이슈 및 해결

### 자체 해결 (3건)
1. **pixel(픽셀) 에이전트 누락** — 아누 직할 사원으로 org-structure에 존재. parse-member-id.sh에 추가
2. **hooks 인라인 매핑 중복** — pre-tool-use.sh와 post-tool-use.sh에 동일 함수가 중복 존재. 공유 라이브러리로 통합
3. **test 파일 pyright 경고** — `_extract_ids_from_node(node: dict)` 파라미터 타입을 `object`로 변경하여 unreachable code 경고 해소

### 범위 외 미해결 (1건)
1. **server.py timezone 파싱 버그** — `datetime.fromisoformat("...Z")` 파싱 후 timezone-aware/naive 비교 오류. 기존 테스트 `test_timezone_aware_since_not_stuck_working` 1건 실패. 범위 외 사유: server.py 코드 변경은 본 작업 지시 범위 밖이며, 별도 작업으로 수정 필요

## QC 자동 검증 결과

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

⚠️ 기존 테스트 실패 1건 (본 작업 범위 외): `dashboard/test_server.py::TestMemberStatusTimezone::test_timezone_aware_since_not_stuck_working`
