# task: 유령 task 생성 + member-status timezone 버그 수정

## 레벨: Lv.2

## 버그 A: 유령 task 생성 방지

### 증상
- Bot B(1팀)가 dispatch를 받을 때마다 `task-timer.py start task-1.1 --team dev1-team --desc "작업"` 을 호출
- 3월 5일, 3월 11일 등 반복 발생. 대시보드에 task-1.1 "작업"이 표시됨
- 원인: `/home/jay/.cokacdir/workspace/autoset/CLAUDE.md`의 "작업 기록 규칙"을 Bot B도 읽고 따름

### 수정 사항
1. **CLAUDE.md 수정** (`/home/jay/.cokacdir/workspace/autoset/CLAUDE.md`):
   - "작업 기록 규칙" 섹션에 아래 문구 추가:
   ```
   > ⚠️ 이 규칙은 아누 세션 전용입니다. 팀장 봇(헤르메스/오딘/라)은 dispatch 프롬프트에 포함된 timer 명령만 따르세요.
   > dispatch.py가 timer start를 자동 처리하므로, 팀장이 직접 task-timer.py start를 호출하지 마세요.
   ```

2. **task-timer.py 보호** (`/home/jay/workspace/memory/task-timer.py`):
   - `start_task()` 함수에서 이미 `completed` 상태인 동일 task_id가 있으면 **새 ID 생성을 거부**하는 가드 추가
   - 현재는 `running` 상태만 이중 등록 거부 (line 111-115). `completed` 상태도 덮어쓰기 금지 추가:
   ```python
   # 완료된 task 덮어쓰기 방지
   if existing and existing.get("status") == "completed":
       logger.warning(f"완료된 task 덮어쓰기 시도 거부: {task_id}")
       return {"status": "error", "reason": f"task_id '{task_id}' is already completed. Use a new ID."}
   ```

## 버그 B: member-status timezone 비교 오류

### 증상
- Ra(3팀장)가 대시보드에서 영원히 "작업중"으로 표시
- `member-status.json`의 `since` 필드에 "Z" suffix (UTC) → timezone-aware datetime
- `datetime.now()`는 naive datetime → 비교 시 TypeError → except에서 `return "working"`

### 수정 사항
- **파일**: `/home/jay/workspace/dashboard/server.py`
- **위치**: `get_member_status()` 함수 (line 506~561)
- line 525 근처 `since_dt = datetime.fromisoformat(since_str)` 이후:
  ```python
  # timezone-aware → naive 변환 (로컬 시스템 시간과 비교 위해)
  if since_dt.tzinfo is not None:
      since_dt = since_dt.replace(tzinfo=None)
  ```
- 동일 패턴이 다른 곳에도 있는지 `fromisoformat` 전수 검사 후 동일 처리 적용
  - `get_running_tasks_by_team()` (line 456 근처)
  - `_get_previews()` 등 시간 비교가 있는 모든 곳

## 테스트
- task-timer.py: completed ID로 start 시도 → error 반환 확인
- server.py: "Z" suffix 있는 since로 member-status 설정 후 stale 판정 정상 동작 확인
- 기존 pytest 전체 PASS 유지

## QC
- pyright 타입 체크 통과
- 기존 테스트 깨지지 않음
