# task-1283.1 완료 보고서

**S**: 캠페인뷰 `/api/campaign-docs` 엔드포인트에 10개 파일이 하드코딩되어 있고, `blog-content.md`는 v2.0, `naver-keyword-ads.md`는 버전 표기 없는 상태이다.

**C**: `matrix-3x3-strategy.md` 등 신규 전략 문서 4개가 캠페인 탭에 표시되지 않으며, 3x3 매트릭스 전략 반영에 따른 문서 버전 업데이트가 필요하다.

**Q**: 하드코딩을 동적 스캔으로 전환하여 신규 문서 자동 노출 + v3.0 콘텐츠 업데이트가 가능한가?

**A**: `server.py`를 `os.listdir` 기반 동적 스캔으로 전환 완료. 14개 .md 파일 자동 감지 (기존 10개 → +4개). blog-content.md v3.0 업데이트 + naver-keyword-ads.md v3.0 버전 표기 추가. pytest 7건 전체 통과, pyright 에러 0건.

---

## 수정 파일 목록

- `/home/jay/workspace/dashboard/server.py` — `/api/campaign-docs` 엔드포인트 동적 스캔 전환 (3449~3483줄)
- `/home/jay/workspace/memory/plans/recruiting-marketing/blog-content.md` — v2.0 → v3.0, 1200% 룰 시의성 메시지 섹션 추가
- `/home/jay/workspace/memory/plans/recruiting-marketing/naver-keyword-ads.md` — v3.0 버전 표기 추가

## 작업 상세

### 작업 1: 동적 스캔 전환
- 하드코딩 `doc_list` 10개 → `os.listdir()` 기반 자동 스캔 14개 파일
- `.md` 파일만 필터링, `exec/` 하위 디렉토리 제외
- 파일 첫 줄 `# 제목`에서 한글 표시명 자동 추출 (없으면 파일명 사용)
- `os.path.getmtime` 기준 최신순 정렬
- API 응답 구조 변경 없음 (name, filename, content 필드 유지)

### 작업 2: 콘텐츠 v3.0 업데이트
- `blog-content.md`: 버전 v2.0 → v3.0 변경, 공통 앵글 "7월 1200% 룰 시의성 메시지" 섹션 추가 (103~111줄)
- `naver-keyword-ads.md`: `> 버전: v3.0` 줄 추가 (4줄째), 3x3 매트릭스 키워드 확장 내용은 이미 반영 확인

## 신규 노출 파일 (동적 스캔으로 추가된 4개)
- `matrix-3x3-strategy.md` — 리쿠르팅 3x3 매트릭스 전략
- `threads-validation-criteria.md` — Threads 채널 30일 검증 기준
- `gtm-install-guide.md` — GTM 이벤트 설치 가이드
- `google-tag-guide.md` — Google Ads 전환태그 설치 가이드

## 테스트 결과
- pytest: 7 passed (test_server.py)
- pyright: 0 errors, 0 warnings
- 동적 스캔 로직 단독 테스트: 14개 파일 정상 감지, exec 제외 확인, 비-md 제외 확인

## 발견 이슈 및 해결

### 자체 해결 (3건)
1. **제목 추출 시 `lstrip("# ")` 과다 제거 위험** — `first_line[2:].strip()`으로 정확히 `# ` 2문자만 제거하는 안전한 방식 채택
   - 태스크 지시서 예시의 `lstrip("# ")`은 `#`, ` ` 문자를 개별 제거하여 `### 제목`에서 `제목`만 남기는 부작용 발생 가능
2. **exec/ 디렉토리 이중 방어** — `os.path.isfile()` 체크로 디렉토리 자체 제외 + `"exec/" in fpath` 추가 안전장치
3. **naver-keyword-ads.md 1200% 룰 미반영 판단** — 태스크에서 "3x3 매트릭스 관련 내용 확인, 없으면 추가"라 했으나 3x3 키워드 확장은 이미 반영 완료. 1200% 룰은 콘텐츠 전략 영역이라 키워드 광고 문서에는 추가 불필요로 판단.

### 범위 외 미해결 (1건)
1. **style_check WARN (black 포맷팅)** — 범위 외 사유: server.py 전체의 기존 포맷팅 이슈. 이번 작업 변경분만으로는 black 적용 범위가 아님.

## QC 검증 결과
```json
{
  "task_id": "task-1283.1",
  "test_runner": "PASS (7 passed)",
  "pyright_check": "PASS (0 errors)",
  "style_check": "WARN (기존 코드 black 포맷팅)",
  "data_integrity": "PASS"
}
```
