# task-456.1: 활성 프리뷰 동적 감지 — 완료 보고서

## 작업 내용
대시보드 `_get_previews()` 메서드에 동적 프리뷰 감지 기능 추가.
기존 `PreviewManager.status()`로만 감지하던 것에 더해, `config/preview-ports.json`의 `port_assignments`를 읽어 미감지 포트에 TCP 연결 시도. 응답하면 활성 프리뷰 목록에 추가.

## 수정 파일
- `/home/jay/workspace/dashboard/server.py` — `_get_previews()` 메서드 (line 1268~1328)

## 변경 사항
1. `tracked_ports: set[int]` 추가하여 PreviewManager에서 이미 감지된 포트 추적
2. 동적 감지 블록 추가:
   - `config/preview-ports.json`의 `port_assignments` 로드
   - 이미 감지된 포트 제외
   - 나머지 포트에 `_check_http_response()` 호출
   - 응답 시 `pid=None`으로 프리뷰 목록에 추가
3. 동적 감지 실패 시 내부 try-except로 기존 결과 보존

## 테스트 결과
- Lv.1 작업으로 TDD 미적용
- `test_server.py`에 `_get_previews` 관련 기존 테스트 없음 → 회귀 위험 없음
- pyright: 수정 영역 에러 0건 (기존 line 1974 uvicorn.run 관련 에러 28건은 본 작업 범위 외)

## 버그 유무
- 없음

## 비고
- `preview-ports.json` 파일이 없는 경우 `config_path.exists()` 체크로 안전하게 스킵
- 동적 감지 프리뷰의 `pid`는 `None` (preview_manager 외부에서 실행되므로 PID 추적 불가)
- pyright WARN 28건: 모두 기존 line 1973 uvicorn.run 호출 관련 (본 작업 범위 외)
- style_check WARN: black 포매팅 차이 (기존 파일 전체 대상, 본 작업 범위 외)

## QC 결과
- overall: WARN (PASS 2, SKIP 5, WARN 2)
- .done 생성: /home/jay/workspace/memory/events/task-456.1.done
