# task-866.1 완료 보고: 완료된 Todo 이슈 조회 기능 + 대시보드 구현

## SCQA

**S**: 대시보드 프로젝트 뷰에서 Todo 이슈를 조회할 수 있으며, 현재 40개 이슈 중 5건이 완료(done/completed) 상태다.

**C**: 완료된 이슈는 목록에서 필터링되어 "어떻게 마무리됐는지" 확인 불가. "완료 N건 숨김" 배지만 표시되고 내용 접근 불가.

**Q**: 대시보드에서 완료된 이슈의 상세 내용(sub_items, linked_tasks, 완료일)을 조회할 수 있는가?

**A**: 백엔드에 `status` 필터 파라미터와 보고서 조회 API를 추가하고, 프론트엔드에 진행중/완료/전체 3탭 UI + 완료 이슈 스타일링 + 보고서 모달을 구현하여 해결. pytest 16건 전체 통과, pyright 에러 0건.

---

## 수정 파일 목록

| 파일 | 변경 내용 |
|------|-----------|
| `/home/jay/workspace/dashboard/server.py` | `GET /api/todo`에 `status` 파라미터 추가, `GET /api/report/{task_id}` 엔드포인트 신설 |
| `/home/jay/workspace/dashboard/index.html` | 탭 UI, 완료 이슈 스타일링, IssueItem 개선, ReportModal 컴포넌트, todoFilter 상태 |
| `/home/jay/workspace/dashboard/tests/test_todo_api.py` | 신규 테스트 8건 추가 (status 필터 5건 + report API 3건) |

## 변경 상세

### 1. 백엔드 (server.py)

**GET /api/todo 수정** (line 2414-2432):
- `status` 쿼리 파라미터 추가 (Optional[str])
- `status=done` → done/completed만 반환
- `status=all` → 전체 반환
- `status=active` 또는 미지정 → 기존 동작 유지 (active만)
- `include_done` 하위호환 유지

**GET /api/report/{task_id} 신설** (line 2526-2536):
- 보고서 마크다운 파일 조회
- path traversal 방지 (`..", `/` 포함 시 400 에러)
- 파일 미존재 시 404

### 2. 프론트엔드 (index.html)

**ReportModal 컴포넌트** (line 591-628):
- 보고서 마크다운을 모달로 표시
- DOMPurify + marked.js로 안전한 렌더링

**IssueItem 개선** (line 630-713):
- `isDone` 플래그로 완료 이슈 시각적 구분 (bg-slate-50/50, opacity-75, line-through)
- 완료 배지 (녹색 "완료" 태그)
- completed_at 날짜 표시
- 펼침 시 description, 생성일/완료일, 프로젝트명, linked_tasks 표시
- linked_tasks 클릭 시 ReportModal 연동

**탭 UI** (line 949-971):
- "완료 N건 숨김" 배지 → 세그먼트 탭으로 교체
- 진행중 (기본) / 완료 (N) / 전체 3탭
- 모바일 반응형 (flex-wrap)

**todoByProject 필터** (line 793-805):
- todoFilter 상태에 따라 active/done/all 필터링
- useMemo 의존성에 todoFilter 추가

**데이터 패치** (line 2521):
- `fetch('/api/todo')` → `fetch('/api/todo?status=all')` 변경
- 전체 데이터를 받아 클라이언트에서 필터링 (탭 전환 시 재요청 불필요)

### 3. 테스트 (test_todo_api.py)

기존 8건 유지 + 신규 8건 추가 = 총 16건

**신규 테스트:**
- TestTodoFiltering: test_filter_status_done, test_filter_status_all, test_filter_status_active, test_include_done_backward_compat, test_status_overrides_include_done
- TestReportAPI: test_get_report_success, test_get_report_not_found, test_get_report_path_traversal

## 테스트 결과

```
16 passed in 0.08s
```
- pyright: 0 errors, 0 warnings, 0 informations
- pytest: 16/16 passed (기존 8 + 신규 8)

## 발견 이슈 및 해결

### 자체 해결 (3건)
1. **기존 API 하위호환 깨짐 위험** — `include_done` 파라미터를 유지하고 `status`가 우선 적용되도록 분기 설계
2. **completed vs done 상태 혼용** — 두 상태 모두 완료로 간주하도록 `in ("done", "completed")` 조건 통일
3. **보고서 모달에서 XSS 위험** — DOMPurify.sanitize()로 마크다운 렌더링 전 sanitize 적용 (기존 CDN 라이브러리 활용)

### 범위 외 미해결 (0건)
없음.
