# 와치독 테스트 실패 수정 — 2건

## 개요
task-1775에서 미해결로 남은 기존 테스트 실패 2건을 수정한다.

---

## 수정 1: TC23-5 테스트 패턴 오류

**파일**: `scripts/tests/test_session_watchdog.sh` Line 1044-1045

**현재 문제**: 테스트가 session-watchdog.sh에서 `claude.*-p.*teams` 패턴을 grep하지만, 실제 코드(Line 213)는 `Project directory: /home/jay/workspace/teams/${TEAM_SHORT}` 패턴을 사용. grep 패턴 불일치로 항상 실패.

**수정**: 테스트의 grep 패턴을 실제 코드와 일치시키기
```bash
# 현재 (불일치)
PROJECT_DIR_FALLBACK=$(grep 'claude.*-p.*teams' "$WATCHDOG_SCRIPT" 2>/dev/null || echo "")
assert_contains "TC23-5: 팀 디렉토리 fallback PID 체크 존재" "claude" "$PROJECT_DIR_FALLBACK"

# 수정 (실제 코드 패턴에 맞춤)
PROJECT_DIR_FALLBACK=$(grep 'Project directory.*teams' "$WATCHDOG_SCRIPT" 2>/dev/null || echo "")
assert_contains "TC23-5: 팀 디렉토리 fallback PID 체크 존재" "Project directory" "$PROJECT_DIR_FALLBACK"
```

---

## 수정 2: extract_report_summary 함수 누락

**파일**: `scripts/activity-watcher.py`

**현재 문제**: 
- `scripts/report_utils.py`에 `extract_report_summary(report_path, max_chars)` 함수가 존재 (Line 11)
- `scripts/tests/test_activity_watcher.py`에서 `aw.extract_report_summary("task-id", "team")` 형태로 호출 (5개 테스트)
- 하지만 activity-watcher.py에는 이 함수가 정의도 import도 안 되어 있음

**분석**: 테스트 코드의 시그니처 `(task_id, team)` vs report_utils의 시그니처 `(report_path, max_chars)`가 다름.
→ activity-watcher에 report_utils를 래핑하는 `extract_report_summary(task_id, team)` 함수를 추가해야 함.

**수정 방향**:
1. `activity-watcher.py`에 `extract_report_summary(task_id, team)` 함수 추가
2. 내부에서 report_path를 `{WORKSPACE_ROOT}/memory/reports/{task_id}.md`로 조합
3. `report_utils.extract_report_summary(report_path)`를 호출
4. 반환 형식: 테스트가 기대하는 포맷에 맞춰 task_id, team, SCQA 내용을 포함하는 문자열

테스트 기대값 분석:
- `"task-123.1" in result` — task_id 포함
- `"dev2" in result` — team 포함  
- `"S:" in result` — SCQA의 S 포함
- `"500 에러" in result` — 보고서 내용 포함
- `"보고서:" in result` — 파일 없을 때 fallback 메시지
- 150자 truncation

```python
def extract_report_summary(task_id: str, team: str, max_chars: int = 150) -> str:
    """보고서에서 요약 추출. 알림 메시지에 포함할 간략한 요약 반환."""
    report_path = Path(f"{WORKSPACE_ROOT}/memory/reports/{task_id}.md")
    
    if not report_path.exists():
        return f"보고서: {report_path} (파일 없음)\ntask: {task_id}, team: {team}"
    
    content = report_path.read_text(encoding="utf-8")
    
    # SCQA 파싱
    lines = []
    lines.append(f"task: {task_id}, team: {team}")
    
    for prefix in ("**S**:", "**A**:"):
        for line in content.split("\n"):
            if line.strip().startswith(prefix):
                text = line.strip().replace(prefix, "").strip()
                label = prefix.replace("**", "").replace(":", "")
                if len(text) > max_chars:
                    text = text[:max_chars]
                lines.append(f"{label}: {text}")
                break
    
    # 수정 내역 포함
    for line in content.split("\n"):
        if "수정:" in line and "건" in line:
            lines.append(line.strip().lstrip("- "))
            break
    
    return "\n".join(lines)
```

---

## 검증 시나리오

1. **TC23-5**: `bash scripts/tests/test_session_watchdog.sh` 실행 시 TC23-5가 PASS되면 성공 (전체 89/89 목표)
2. **extract_report_summary**: `pytest scripts/tests/test_activity_watcher.py -k "extract_report_summary"` 실행 시 5개 테스트가 전부 PASS되면 성공
3. **회귀 테스트**: 기존 PASS였던 테스트가 FAIL로 바뀌지 않으면 성공
