**task-1033.1 완료 보고** (dev5-team) **완료 보고서: 대시보드 캠페인뷰 고도화 — 실시간 체크리스트 + 예산 연동** (6분 50초) **핵심 결과** server.py에 MD 파싱 + 토글 API, CampaignView.js에 Phase별 아코디언 + 예산 섹션을 구현하여 119개 체크리스트 항목을 동적 연동 완료. GET /api/campaign 응답에서 phase별 완료율 자동 계산, POST /api/campaign/checklist로 MD 파일 직접 수정 확인. pyright 0 errors, API 테스트 GET/POST 모두 정상. ## 수정 파일 - `/home/jay/workspace/dashboard/server.py` — `_parse_checklist_md()`, `_toggle_checklist_item()` 메서드 추가, `_get_campaign_data()` 교체, `POST /api/campaign/checklist` 엔드포인트 추가 (+175줄) - `/home/jay/workspace/dashboard/components/CampaignView.js` — Phase별 아코디언 UI, 체크박스 토글 핸들러, 예산 집행 현황 섹션, 기존 flat 배열 fallback (235줄 → 430줄, +195줄) - `/home/jay/workspace/dashboard/data/campaign.json` — `budget_tracking` 필드 추가 (채널별 집행 금액 구조) ## 테스트 결과 - **pyright**: 0 errors, 0 warnings, 0 informations - **문법 검증**: `ast.parse()` SYNTAX OK - **파싱 테스트**: 4 Phases (46+18+21+17), 컴플라이언 테스트: pyright 0 errors **발견/해결 이슈 3건** 1. **Phase명에 기간 정보 포함** — MD의 `## Phase 0: 인프라 준비 (Week 1~2)` 파싱 시 "(Week 1~2)"가 이름에 포함됨. UI에서 오히려 유용한 정보이므로 의도적으로 유지 결정. 2. **기존 flat 배열 하위 호환** — API가 새 구조를 반환하지 못할 때(파싱 실패 등) 기존 campaign.json의 flat 배열이 그대로 사용됨. CampaignView.js에서 `isNewChecklist` 분기로 두 구조 모두 렌더링 가능하게 처리. 3. **MD 파일 토글 시 줄바꿈 보존** — `splitlines()` + `"\n".join()` 패턴으로 원본 줄바꿈 유지 확인. 테스트에서 원복 후 diff 없음 검증.