# task-1063.1 완료 보고서: 대시보드 기록 탭 보고서 제목 개선

**작성자**: 이참나 (dev7-team 팀장)
**작성일**: 2026-03-26
**작업 레벨**: Lv.1 (단순 수정)
**팀원**: 쿠쿨칸(백엔드), 이쉬첼(프론트엔드)

---

## SCQA

**S**: 대시보드 기록 탭에서 보고서 제목이 `get_records_list()` 함수로 추출되어 표시되고 있다.

**C**: "통합 보고서"라는 제네릭 제목이 그대로 표시되어 어떤 보고서인지 식별 불가하고, 어떤 팀이 작업한 건인지 제목에 표시되지 않는다.

**Q**: 제네릭 제목을 설명적 제목으로 대체하고, 팀 정보를 접두사로 추가할 수 있는가?

**A**: `server.py`의 `get_records_list()` 함수에 (1) 제네릭 제목 감지 + H2 폴백 로직, (2) team_id 기반 팀 접두사 추가 로직을 구현하여 해결. pytest 14/14 통과, pyright 에러 0건.

---

## 수정 내용

### 수정 1: 제네릭 제목 감지 + H2 폴백 (server.py:2107~2143)

- 9개 제네릭 제목 세트 정의: "통합 보고서", "완료 보고서", "감사 보고서", "보고서", "최종 보고서" (공백 유무 포함)
- H1에서 추출된 제목이 제네릭이면 title을 None으로 리셋 후 H2에서 설명적 제목 추출 시도
- 14개 섹션 헤딩("SCQA", "Executive Summary", "작업 내용" 등)은 H2 탐색에서 건너뜀
- H2에서도 못 찾으면 기존 폴백 체인(blockquote → description → SCQA → meta) 유지

**설계 판단**: task 지시서에서 보일러플레이트 regex에 "통합\s*보고서"를 추가하라고 했으나, 이 방식은 "완료 보고서"가 이미 regex에 있어 title이 None이 되는 기존 흐름과 충돌. 보일러플레이트 regex는 변경하지 않고, 제네릭 감지 단계에서만 "통합 보고서"를 처리하여 기존 동작과의 호환성 보존.

### 수정 2: 팀 표시 접두사 추가 (server.py:2241~2263)

- task-timers.json에서 team_id 조회 → 13개 팀 ID를 한국어 접두사로 매핑
  - dev1-team~dev8-team → [1팀]~[8팀], composite → [복합], anu-direct → [아누] 등
- 미팅 기록(rtype=="meeting")에는 접두사 미적용
- team_id 없으면 접두사 미적용
- 제목이 이미 "["로 시작하면 중복 접두사 방지

### 수정 3: 프론트엔드 확인 (변경 없음)

- HistoryView.js: `/api/history`에서 팀별 집계 통계만 표시, 개별 제목 렌더링 없음 → 영향 없음
- ArchiveView.js (line 100), utils.js (line 485): 보고서 제목 렌더링 위치. `truncate` CSS 클래스로 팀 접두사 포함 긴 제목 안전 처리 확인

## 수정 파일 목록

- `/home/jay/workspace/dashboard/server.py` — `get_records_list()` 함수 수정 (제네릭 감지 + 팀 접두사)

## 테스트 결과

### 제목 추출 검증 (4건)

- task-1057.1: "통합 보고서" → "티오피사업단 리쿠르팅 캠페인 재테스트 (디자인 스킬 업데이트 검증)" (H2 폴백)
- task-1052.1: "통합 보고서" → "티오피사업단 경력직 리쿠르팅 캠페인 Threads 카드뉴스 제작" (H2 폴백)
- task-1054.1: "마케팅 시스템 업그레이드" → "[2팀] 마케팅 시스템 업그레이드" (팀 접두사)
- task-1061.1: "기존 시스템 연동 및 업데이트" → "[4팀] 기존 시스템 연동 및 업데이트" (팀 접두사)

### 회귀 검증

- 미팅 기록: 팀 접두사 없음 확인 (3건 샘플)
- task-1055.1: 기존 "작업: 디자인 스킬 학습 + 복합팀 캠페인 재테스트" 유지 확인 (blockquote 추출)

### 자동화 테스트

- pytest tests/test_records_api.py: **14/14 통과** (0.08s)
- pyright server.py: **0 errors, 0 warnings**
- black --check: 변경 없음 (준수)
- isort --check-only: 변경 없음 (준수)

## 발견 이슈 및 해결

### 자체 해결 (3건)

1. **H2 폴백이 title=None일 때 작동 안 함** — 보일러플레이트 regex에 "통합\s*보고서"를 추가하면 remaining이 빈 문자열이 되어 제네릭 감지가 스킵됨. 해결: 보일러플레이트 regex를 원래대로 유지, 제네릭 감지에서만 "통합 보고서" 처리.
   - 상세: server.py:2099 보일러플레이트 regex는 변경하지 않고, 2107-2119의 _generic_titles 세트에서 처리

2. **H2 폴백이 섹션 헤딩을 잘못 선택** — "## SCQA", "## 작업 내용" 같은 구조적 헤딩이 제목으로 선택되는 회귀 발생. 해결: 14개 일반 섹션 헤딩을 `_section_headings` 세트로 필터링.
   - 상세: server.py:2123-2136 _section_headings 세트 추가, H2 탐색 시 continue로 건너뜀

3. **task-1055.1 회귀** — H2 폴백이 blockquote 추출보다 먼저 실행되어 "수정 파일 목록 (5개)"를 제목으로 잘못 선택. 해결: `not title` 조건 제거, 제네릭 감지 시에만 H2 폴백 트리거.
   - 상세: server.py:2119 조건을 `if title and title.strip() in _generic_titles:`로 한정

## 셀프 QC 체크리스트

- [x] 1. 영향 파일: server.py만 수정. ArchiveView.js/utils.js는 읽기 전용 확인.
- [x] 2. 엣지 케이스: 제네릭 제목 9종, 섹션 헤딩 14종 처리. team_id 없음/미팅 기록/중복 접두사 방지.
- [x] 3. 작업 지시와 일치: 3가지 수정사항 모두 구현 (보일러플레이트 regex 변경은 설계 판단으로 대체).
- [x] 4. 보안: get_records_list() 내에서만 수정, safe_read_record() 미수정. path traversal 방어 미변경.
- [x] 5. 테스트 커버리지: 14/14 기존 테스트 통과, 4건 실제 보고서 제목 검증, 3건 회귀 검증.
- [x] 6. 발견 이슈 3건 모두 자체 해결 완료.
- [x] 7. 코드 아키텍처: 기존 폴백 체인 구조 보존. 새 로직은 기존 단계 사이에 삽입.
- [x] 8. 인터페이스 변경 없음 (title 필드의 값만 변경, 키/구조 동일).
