# task-871.1: 대시보드 완료 Todo 조회 기능 버그 수정

**작업일:** 2026-03-24
**팀:** dev4-team
**작업자:** GLM-5 (검토: 라 팀장)

---

## S (Situation)

task-866.1에서 구현된 대시보드 Todo 완료 이슈 조회 기능이 실제 운영에서 동작하지 않는 버그가 보고되었다. 현재 대시보드 데이터는 Active 33건 / Done 4건 / Total 37건이다.

## C (Complication)

제이회장님 브라우저에서 진행/완료/전체 탭이 클릭되지 않고, 카운트가 "진행 0 / 완료 14 / 전체 14"로 잘못 표시되며, 완료 이슈가 진행중 탭에 혼재하는 3가지 버그가 동시에 발생하고 있다. 아누가 1차 진단으로 API 핸들러 status 필터 추가 및 sw.js v5 업데이트를 완료했으나, 프론트엔드 탭 클릭 불가 문제는 미해결 상태였다.

## Q (Question)

버튼 이벤트 바인딩 문제와 모바일 터치 타겟 부족 문제를 수정하여 모든 브라우저/기기에서 탭이 정상 동작하는가?

## A (Answer)

버튼에 `type="button"`, `cursor-pointer`, `min-h-[32px]` 추가 및 sw.js를 v6으로 업데이트하여 해결. Playwright 데스크탑(1280x800) + 모바일(375x812) 탭 전환 테스트 8건 전체 통과 확인. pyright 에러 0건, black/isort 통과.

---

## 수정 내용

### 1. dashboard/index.html — 버튼 스타일 개선

| 항목 | 변경 전 | 변경 후 |
|------|---------|---------|
| 버튼 타입 | (없음) | `type="button"` 추가 |
| 패딩 | `py-1` | `py-1.5` |
| 최소 높이 | (없음) | `min-h-[32px]` (터치 타겟 32px 보장) |
| 커서 | (없음) | `cursor-pointer` |
| 호버 배경 | (없음) | `hover:bg-slate-50` |

### 2. dashboard/sw.js — 캐시 버전 업데이트

- `dashboard-v5` → `dashboard-v6`

---

## 검증 결과

### API 테스트

| API | 예상 | 실제 | 결과 |
|-----|------|------|------|
| `/api/todo?status=all` | 37건 | 37건 | PASS |
| `/api/todo?status=done` | 4건 | 4건 | PASS |
| `/api/todo` (default) | 33건 | 33건 | PASS |

### Playwright 테스트 (8건)

| 테스트 | 뷰포트 | 결과 |
|--------|--------|------|
| 탭 전환 (진행/완료/전체) | 1280x800 | PASS |
| 탭 전환 (완료/전체) | 375x812 | PASS |
| `cursor-pointer` 클래스 확인 | 1280x800 | PASS |
| `min-h` 클래스 확인 | 1280x800 | PASS |
| sw.js CACHE_NAME=dashboard-v6 | N/A | PASS |

### 코드 품질

- black: PASS (1 file unchanged)
- isort: PASS
- pyright: 0 errors, 0 warnings (수정 후)

---

## 발견 이슈 및 해결

### 자체 해결 (2건)

1. **pyright 에러 2건** — `get_attribute("class")` 반환값 `str | None` 미처리
   - 상세: `tests/test_dashboard_todo_tabs.py` 152, 175행에 `assert class_name is not None` 추가

2. **보고서 SCQA 포맷 누락** — GLM이 작성한 보고서가 SCQA 구조 미적용
   - 상세: 라 팀장이 직접 SCQA 포맷으로 재작성

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

1. **API 핸들러 통합 (과제 #1)** — 아누가 구 핸들러(1249행)에 status 필터 이미 추가 완료. GLM 확인 결과 do_GET/FastAPI 두 핸들러가 서로 다른 실행 모드(SimpleHTTP vs FastAPI)에서 독립적으로 동작하므로 실제 충돌 없음. 통합 작업은 별도 리팩터링 태스크로 분리 권장.

---

## qc_verify.py 결과

```json
{
  "task_id": "task-871.1",
  "overall": "PASS (재실행 후)",
  "summary": "5 PASS, 2 FAIL(수정 후 PASS), 5 SKIP",
  "checks": {
    "file_check": "PASS (보고서 재작성 후)",
    "data_integrity": "PASS",
    "pyright_check": "PASS (에러 2건 수정 후 — 0 errors, 0 warnings)",
    "style_check": "PASS",
    "gap_check": "PASS",
    "spec_compliance": "PASS",
    "duplicate_check": "PASS (유사도 최대 4.8%)"
  }
}
```

---

**스크린샷 경로**: `/tmp/dashboard_desktop.png`, `/tmp/dashboard_desktop_done.png`, `/tmp/dashboard_desktop_all.png`, `/tmp/dashboard_mobile.png`, `/tmp/dashboard_mobile_done.png`
