# task-2084: 대시보드 보고서 — 상대 경로 파일 링크 프로젝트 루트 자동 연결

## SCQA

**S**: 대시보드 아카이브뷰에서 보고서의 파일 경로 링크는 절대 경로(`/home/jay/projects/InsuRo/public/favicon.ico`)일 때 정상 동작하며, 파일 내용/이미지를 올바르게 표시한다.

**C**: task-2073 보고서처럼 상대 경로(`public/favicon-16.png`)로 기록된 파일 링크를 클릭하면, 프로젝트 루트 경로를 모르므로 파일 조회가 실패한다. `linkifyFilePaths()` Pass 1이 상대 경로를 매칭하지만 클릭 핸들러가 이를 절대 경로로 변환하는 로직이 없었다.

**Q**: 상대 경로 링크 클릭 시 프로젝트 루트를 자동으로 연결하여 절대 경로로 변환할 수 있는가?

**A**: 2단계 폴백 전략으로 해결. (1) 보고서 내 워크트리 경로에서 프로젝트 루트 추출 (1순위, 가장 정확), (2) `project_id` 기반 프로젝트 경로 매핑 (2순위). 테스트 결과 `public/favicon-16.png` → `/home/jay/projects/InsuRo/public/favicon-16.png`으로 정확히 변환되며, 기존 절대 경로 링크는 `startsWith('/')` 체크로 영향 없음. 콘솔 에러 0건.

---

## 수정 파일 목록

| 파일 | 변경 내용 | grep 검증 | 상태 |
|------|-----------|-----------|------|
| dashboard/data_loader.py:1173 | `get_task_detail()`에 `project_id` 필드 추가 | grep "project_id.*task.get" OK (L1173) | verified |
| dashboard/components/utils.js:825-858 | TaskDetailModal 클릭 핸들러에 상대경로→절대경로 변환 로직 추가 (워크트리 1순위, project_id 2순위) | grep "projectPathMap" OK (L839), grep "worktrees" OK (L833) | verified |
| dashboard/components/ArchiveView.js:132-149 | ArchiveView 클릭 핸들러에도 워크트리 경로 기반 상대경로 해결 추가 | grep "projectRoot" OK (L144) | verified |

## 변경 로직 요약

### 상대 경로 해결 순서 (2단계 폴백)
1. **워크트리 경로 추출 (1순위)**: 보고서 HTML에서 `워크트리 경로` 패턴 매칭 → `/home/jay/projects/InsuRo/.worktrees/task-2073-dev2`에서 `.worktrees` 앞부분 = `/home/jay/projects/InsuRo/`
2. **project_id 매핑 (2순위)**: API 응답의 `project_id`를 경로 매핑 딕셔너리로 변환 (`insuro` → `/home/jay/projects/InsuRo/`)
3. **매핑 실패 시**: 기존대로 `filepath` 그대로 전달

### 기존 절대 경로 보호
- `filepath.startsWith('/')` 체크로 절대 경로는 새 로직을 완전히 우회

---

## 발견 이슈 및 해결

### 자체 해결 (3건)
1. **워크트리 정규식 HTML 태그 매칭 버그** — 초기 정규식 `[\/\w.\-]+`가 `</strong>` 태그의 `/strong`을 매칭. `/home/`으로 시작하는 경로만 매칭하도록 패턴을 `(\/home\/[\w.\-\/]+)`로 수정
2. **상대경로 해결 우선순위 오류** — `project_id=system` 매핑이 워크트리보다 먼저 실행되어 잘못된 경로(`/home/jay/workspace/public/...`) 생성. 워크트리 1순위, project_id 2순위로 순서 변경
3. **ArchiveView.js 누락** — utils.js의 TaskDetailModal만 수정하고 ArchiveView.js의 클릭 핸들러를 놓침. 동일 로직 추가

---

## L1 스모크테스트 결과
- 서버 재시작: 성공 (PID 자동 재시작 확인)
- API 응답 확인: `GET /api/task-detail/task-2073` → `project_id: "system"`, 보고서 내 워크트리 경로 정상 추출
- Playwright 검증: `public/favicon-16.png` → `/home/jay/projects/InsuRo/public/favicon-16.png` 정확히 변환 (expected와 일치)
- 파일 존재 확인: `/home/jay/projects/InsuRo/public/favicon-16.png` 실제 존재 (799 bytes)
- 콘솔 에러: 0건
- 스크린샷: `/home/jay/workspace/memory/reports/task-2084-dashboard-l1.png`

---

## 모델 사용 기록

| 팀원 | 역할 | 모델 | 작업 |
|------|------|------|------|
| 카르티케야 | 백엔드 | Sonnet | data_loader.py에 project_id 필드 추가 |
| 사라스바티 | 프론트엔드 | Sonnet | utils.js 클릭 핸들러에 상대경로 해결 로직 추가 |
| 비슈누 (팀장) | 검토/수정 | Opus | 정규식 버그 수정, 우선순위 변경, ArchiveView.js 추가 수정 |

## 세션 통계
- 총 도구 호출: 0회

