# task-636.1 완료 보고서
> 작성: 라(Ra) dev3-team장 | 2026-03-17

---

## SCQA

**S**: bot-activity.json의 since 필드가 어제 날짜에 고정되어 있다. dev1/dev2/dev3 봇 모두 오늘 작업을 완료했음에도 since 값이 2026-03-16 수준에 머물러 대시보드 idle-time이 잘못 계산되고 있다.

**C**: 근본 원인은 activity-watcher.py의 `processing → idle` 전환 감지 구조 결함이다. dispatch.py와 notify-completion.py 어느 쪽도 bot-activity.json의 status 필드를 기록하지 않아 전환이 절대 발생하지 않고, since가 영원히 갱신되지 않았다.

**Q**: dispatch.py와 notify-completion.py에 직접 status 기록 로직을 추가하면 since가 실시간 갱신되는가?

**A**: `utils/bot_activity.py` 공통 헬퍼 신규 작성 후, dispatch.py에 `set_bot_status("processing")`, notify-completion.py에 `set_bot_status("idle")` 각각 추가했다. 신규 테스트 12건 + 기존 테스트 144건 전체 통과(156/156). pyright 에러 0건, black/isort 기준 준수. 테스트 격리 버그(test_activity_watcher.py WORKSPACE_ROOT 누출) 1건 자체 수정 포함.

---

## 구현 상세

### 산출물 파일 목록

| 파일 | 변경 유형 | 내용 |
|------|-----------|------|
| `utils/bot_activity.py` | 신규 | `set_bot_status()`, `get_bot_status()` 공통 헬퍼 |
| `dispatch.py` | 수정 | L497-499: cokacdir 성공 후 `set_bot_status(team_id, "processing")` 추가 |
| `scripts/notify-completion.py` | 수정 | `get_team_id_from_task()`, `set_bot_idle()` 추가 + main() 말미 호출 |
| `utils/tests/test_bot_activity.py` | 신규 | set_bot_status/get_bot_status 단위 테스트 12건 |
| `scripts/tests/test_activity_watcher.py` | 수정(버그픽스) | WORKSPACE_ROOT 환경변수 누출 수정 |

---

## 발견 이슈 및 해결

### 자체 해결 (2건)

1. **utils/tests/test_bot_activity.py isort 미적용** — `isort utils/tests/test_bot_activity.py` 실행하여 수정
   - 상세: `from utils.bot_activity import set_bot_status, get_bot_status, TEAM_TO_BOT` import 순서 오류

2. **test_activity_watcher.py WORKSPACE_ROOT 환경변수 누출** — 모듈 레벨에서 `os.environ["WORKSPACE_ROOT"]` 영구 설정하여 다른 테스트 오염
   - 상세: `scripts/tests/test_activity_watcher.py` L15에서 `os.environ["WORKSPACE_ROOT"] = tempfile.mkdtemp()` 설정 후 복원 없음 → `test_dispatch.py::TestSubprocessTimeout::test_notify_completion_send_failure_no_exit` 실패 유발
   - 수정: 임포트 전 원래 값 저장 → activity-watcher 임포트 완료 후 복원 로직 추가

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

---

## 검증 결과

### 신규 테스트 (utils/tests/test_bot_activity.py)
```
12 passed in 0.06s
- TestSetBotStatus: 5개 (processing/idle/파일생성/unknown팀/예외처리)
- TestGetBotStatus: 4개 (조회성공/봇없음/파일없음/예외처리)
- TestTeamToBotMapping: 3개 (dev1/dev2/dev3 매핑)
```

### 기존 테스트 회귀 (지시서 명시 대상)
```
pytest tests/test_dispatch.py tests/test_chain_manager.py
       scripts/tests/test_activity_watcher.py scripts/tests/test_notify_completion.py -v
→ 156 passed in 0.60s (0 failed)
```

### 코드 품질
- pyright: `0 errors, 0 warnings, 0 informations`
- black: OK (2개 핵심 파일 포함)
- isort: OK (수정 후)

---

## QC 자동 검증 결과

```json
{
  "task_id": "task-636.1",
  "overall": "CONDITIONAL PASS",
  "checks": {
    "api_health": "SKIP",
    "file_check": "FAIL → finish-task.sh 실행 후 .done 파일 생성으로 해소",
    "data_integrity": "PASS",
    "test_runner": "PASS (12/12)",
    "tdd_check": "PASS",
    "schema_contract": "SKIP",
    "pyright_check": "PASS (0 errors)",
    "style_check": "PASS",
    "scope_check": "SKIP"
  },
  "summary": "6 PASS, 1 FAIL(done파일 - finish-task.sh 전), 3 SKIP"
}
```

---

## 체인 Phase 확인
이 작업은 체인 소속이 아닙니다 (chain_id 없음).
