# task-1467.1 완료 보고서

**S**: 대시보드 보고서 탭에서 배너 PNG 파일 링크가 `cell-7-snu-fair/google-resp-1200x628.png` 형태의 상대경로로 표기되어, `/api/file?path=cell-7-snu-fair/...`로 요청 시 ALLOWED_PREFIXES 체크를 통과하지 못하고 403 "Access denied: path not in allowed directories" 에러가 발생하고 있었다.

**C**: 실제 파일은 `output/banners/cell-7-snu-fair/...` 또는 `output/banners/versions/*/cell-7-snu-fair/...`에 존재하지만, `/api/file` 핸들러가 `cell-N-*` 패턴 경로를 `output/banners/` 하위로 인식하지 못하여 보고서 탭에서 배너 이미지를 열람할 수 없었다.

**Q**: `/api/file` 핸들러에서 배너 셀 경로를 자동 리라이트하여 보고서 탭의 PNG 링크가 정상 작동하도록 할 수 있는가?

**A**: server.py의 `/api/file` 핸들러에 `cell-\d+-` 패턴 경로 자동 리라이트 로직을 추가했다. path traversal 체크 이후, ALLOWED_PREFIXES 체크 이전에 삽입하여: (1) 직접 경로 `output/banners/{path}` 우선 확인, (2) 없으면 `output/banners/versions/*/` 하위 역순 검색(최신 버전 우선). 리라이트 결과는 `output/`으로 시작하여 기존 보안 체크를 자연스럽게 통과한다. pytest 16건 전체 통과(신규 5건 포함), pyright 신규 에러 0건.

## 수정 파일

- `/home/jay/workspace/dashboard/server.py` (line 362-374: 배너 셀 경로 자동 리라이트 로직 추가)
- `/home/jay/workspace/dashboard/tests/test_file_api.py` (line 85-138: TestBannerCellPathRewrite 클래스 5개 테스트 추가)

## 발견 이슈 및 해결

### 자체 해결 (1건)
1. **`cell-N-*` 패턴 경로가 ALLOWED_PREFIXES를 통과하지 못하는 문제** — path traversal 체크 후 `re.match(r'^cell-\d+-', rel_path)` 패턴 매칭으로 자동 리라이트. 직접 경로와 versions 폴백 2단계 검색 구현.

### 범위 외 미해결 (2건)
1. **pyright: dashboard.data_loader import 해석 불가** — 기존 이슈 (line 39, 45). 본 작업 범위 외.
2. **pyright: 미사용 변수 경고** — 기존 이슈 (current_pid, _time, section_type). 본 작업 범위 외.

## 테스트 결과

```
16 passed in 0.10s
- TestNormalizeFilePath: 5 passed
- TestAllowedAbsolutePaths: 6 passed
- TestBannerCellPathRewrite: 5 passed (신규)
```

## 모델 사용 기록

- 팀원: 스바로그 / 작업: server.py 배너 경로 리라이트 구현 / 모델: sonnet / 정당성: -
- 팀원: 벨레스 / 작업: test_file_api.py 테스트 추가 / 모델: sonnet / 정당성: -
