# 대시보드 [기록] 탭 추가 — 보고서/미팅 열람 기능

## Task ID: task-474.1
## 레벨: Lv.2

---

## ★ 최우선 원칙: 기능 후퇴 절대 금지
- 기존 조직뷰, 프로젝트뷰, 시스템뷰의 **모든 기능과 접근성 100% 유지**
- 탭 재배치(설정 아이콘 분리)가 부담스러우면 **4번째 탭 단순 추가**로 진행
- 기존 탭 컴포넌트에 최소한의 변경만 허용
- 구현 완료 후 기존 3개 뷰 정상 동작 검증 필수

## 에이전트 미팅 합의 사항 (2026-03-11)
- 미팅 기록: `/home/jay/workspace/memory/meetings/2026-03-11-dashboard-archive-ia.md`
- 참여: 아테나(UX), 미미르(데이터UX), 프레이야(프론트), 아르고스(DA)

## 구현 내용

### 1. [기록] 탭 추가
- tabs 배열에 `{ id: 'archive', label: '기록', icon: '📄' }` 항목 추가
- 기존 탭 유지하면서 4번째 탭 추가 (가장 안전한 방식)
- 설정 탭 분리는 선택사항 — 기존 탭이 불편해지면 하지 마라

### 2. ArchiveListView 컴포넌트 (목록)
- 시간순 역순 (최신 우선)
- 유형 필터: [전체] [보고서] [미팅]
- 각 항목: 파일명, 날짜, 유형 배지, 첫 줄 요약
- 서버 API: `GET /api/records?type=all|report|meeting`

### 3. ArchiveDetailView 컴포넌트 (상세)
- 2-depth 페이지 전환 (목록 → 상세)
- History API + pushState로 뒤로가기 지원
- 마크다운 렌더링: marked.js (이미 로드됨) + DOMPurify (CDN 추가)
- 상단 `← 뒤로` 버튼 + 전체 스크롤 레이아웃
- 서버 API: `GET /api/records/<type>/<filename>`

### 4. 홈(조직뷰) 위젯
- 기존 조직뷰 상단 또는 하단에 "최근 완료 보고서" 위젯 추가
- 최근 3~5건 표시 (파일명 + 날짜)
- 클릭 시 기록 탭 상세로 이동

### 5. 서버 API (server.py)

#### GET /api/records
```
파라미터: type (all|report|meeting)
응답: [{ "filename": "task-472.1.md", "type": "report", "date": "2026-03-11", "summary": "첫 줄...", "size": 3813 }, ...]
```

#### GET /api/records/<type>/<filename>
```
type: report | meeting
filename: 파일명 (경로 포함 금지)
응답: { "filename": "...", "content": "마크다운 본문", "type": "..." }
```

### 6. ★ 보안 (구현 전 필수 — 블로커)

#### Path Traversal 방어
```python
import os

ALLOWED_DIRS = {
    "report": "/home/jay/workspace/memory/reports",
    "meeting": "/home/jay/workspace/memory/meetings",
}

def safe_read(dir_type: str, filename: str) -> str:
    base = ALLOWED_DIRS.get(dir_type)
    if not base:
        raise ValueError("Invalid directory type")
    full_path = os.path.realpath(os.path.join(base, filename))
    real_base = os.path.realpath(base)
    if not full_path.startswith(real_base + os.sep):
        raise PermissionError("Path traversal detected")
    with open(full_path, "r") as f:
        return f.read()
```

#### XSS 방어
```html
<script src="https://cdn.jsdelivr.net/npm/dompurify@3/dist/purify.min.js"></script>
```
```javascript
const rendered = marked.parse(content);
const clean = DOMPurify.sanitize(rendered);
```

## 대상 파일
- `/home/jay/workspace/dashboard/index.html` — 프론트엔드
- `/home/jay/workspace/dashboard/server.py` — 백엔드 API

## 데이터 소스
- 보고서: `/home/jay/workspace/memory/reports/*.md`
- 미팅 기록: `/home/jay/workspace/memory/meetings/*.md`

## 검증 체크리스트 (구현 후 필수)
- [ ] 기존 조직뷰 정상 동작
- [ ] 기존 프로젝트뷰 정상 동작
- [ ] 기존 시스템뷰 정상 동작
- [ ] 탭 전환 (기존 3탭 + 기록 탭) 정상
- [ ] 기록 탭 → 보고서 목록 표시
- [ ] 기록 탭 → 미팅 목록 표시
- [ ] 유형 필터 동작
- [ ] 보고서 클릭 → 상세 보기 (마크다운 렌더링)
- [ ] 뒤로가기 → 목록 복귀
- [ ] 홈 위젯 최근 보고서 표시
- [ ] Path traversal 차단 (../../.env.keys 요청 시 거부)
- [ ] XSS 차단 (script 태그 포함 마크다운 렌더링 시 무해화)
- [ ] 모바일(375px) 레이아웃 정상