# task-1136.1 완료 보고서

## SCQA

**S**: 대시보드 기록 탭에서 완료 보고서 내용이 마크다운으로 렌더링되고 있으며, `/api/file?path=...` API도 정상 동작 중이다.

**C**: 보고서 안에 언급된 산출물 파일 경로(`tasks/ad-creative-recruiting-v4.md` 등)가 일반 텍스트로만 표시되어 클릭해서 내용을 확인할 수 없고, 이미 렌더링된 보고서 아래에 불필요한 "보고서 원문 보기" 버튼이 존재한다.

**Q**: 보고서 내 파일 경로를 클릭 가능한 링크로 변환하고 불필요한 원문 보기 기능을 제거할 수 있는가?

**A**: `linkifyFilePaths` 유틸리티 함수를 추가하여 렌더된 HTML에서 `.md/.json/.yaml` 확장자 경로를 파란색 밑줄 링크로 자동 변환했다. 클릭 시 기존 `FileViewerModal`로 파일 내용이 표시된다. "보고서 원문 보기" 버튼은 2곳(ArchiveView, TaskDetailModal)에서 모두 삭제했다.

## 수정 파일

| 파일 | 변경 내용 |
|------|-----------|
| `dashboard/components/utils.js` | `linkifyFilePaths` 함수 추가 (line 534), 보고서 렌더링에 적용 (line 646), onClick 핸들러 갱신, "보고서 원문 보기" 버튼 삭제 |
| `dashboard/components/ArchiveView.js` | `renderMarkdown`에 `linkifyFilePaths` 적용 (line 51), onClick 핸들러 갱신, "보고서 원문 보기" 버튼 삭제 |

## 구현 상세

### linkifyFilePaths 함수
- HTML을 태그/텍스트로 분리(`split(/(<[^>]+>)/)`)하여 텍스트 부분에서만 경로 감지
- `<a>` 태그 내부는 `insideAnchor` 플래그로 중복 링크화 방지
- 패턴: `((?:[\w.\-]+\/)+[\w.\-]+\.(?:md|json|yaml))` — 슬래시를 포함하는 상대 경로 + 확장자
- DOMPurify.sanitize 이후 적용하여 XSS 안전성 확보

### onClick 핸들러
- 기존: `e.target.textContent` 기반 텍스트 매칭 (부정확)
- 변경: `e.target.closest('.file-path-link')` + `data-filepath` 속성 읽기 (정확)

## 발견 이슈 및 해결

### 자체 해결 (3건)
1. **utils.js에 "보고서 원문 보기" 삭제 후 빈 줄 잔존** — 빈 줄 제거하여 정리 (utils.js:656)
2. **기존 onClick 핸들러가 textContent 기반으로 부정확** — `.closest()` + `data-filepath` 패턴으로 교체하여 정확한 경로 전달
3. **`<a>` 태그 내부 경로 중복 링크화 가능성** — `insideAnchor` 상태 추적으로 방지

## 테스트 결과
- 프론트엔드 JS 컴포넌트로 pytest/pyright 해당 없음
- task-1130.1 보고서 내 파일 경로 패턴 검증: `tasks/ad-creative-recruiting-v4.md`, `tasks/v4-angle-A-settlement.md` 등 7개 경로가 정규식에 매칭됨 (grep으로 확인)
- TypeScript 진단: 새로 도입된 ✘ 에러 0건 (기존 비모듈 스크립트 경고만 존재)

## QC 자동 검증
```
{
  "task_id": "task-1136.1",
  "overall": "PASS (보고서 작성 후 재검증)",
  "checks": {
    "api_health": "SKIP (서버 작업 아님)",
    "file_check": "PASS",
    "test_runner": "SKIP (관련 테스트 파일 0개)",
    "pyright_check": "SKIP (Python 파일 아님)",
    "style_check": "SKIP (Python 파일 아님)"
  }
}
```
