---
task_id: "task-1811.1"
team: dev1-team
status: done
completed_at: "2026-04-14T21:01:00+09:00"
---

# task-1811.1 완료 보고서: InsuWiki 양방향 동기화 Level 3 수정

## SCQA

**S**: InsuWiki 양방향 동기화(대시보드↔Firestore) 기능이 운영 중이며, wiki-entries.json 219건, Firestore documents 87건 기준으로 승인/거절 워크플로우가 작동한다.

**C**: 5건의 버그가 발견됨 — (1) do_POST global 변수 누락으로 _wiki_statuses 변경이 세션 내 미반영, (2) sync-firestore 핸들러 global 누락(BUG1로 해결), (3) 데이터 불일치(statuses 16/219건, sync-status 105/219건), (4) DASHBOARD_API_URL 미설정, (5) approve 핸들러 entry 미발견 시 404로 콜백 중단.

**Q**: 5건의 버그를 수정하고 Firestore 기준 데이터 재동기화로 정합성을 확보할 수 있는가?

**A**: 5건 모두 수정 완료. server.py global 선언 정상화, approve/review 핸들러 404 제거, DASHBOARD_API_URL 환경변수 추가, Firestore 기준 wiki-statuses.json 220건(approved 13, rejected 3, draft 204) + wiki-sync-status.json 219건으로 전수 갱신. 구문 검증 통과.

## 수정 내역

### BUG 1 (Critical): do_POST global 변수 선언 누락 — 해결
- **파일**: `/home/jay/workspace/dashboard/server.py:5249`
- **변경**: `global _wiki_entries, _wiki_loaded, _wiki_sync_status` → `global _wiki_entries, _wiki_statuses, _wiki_loaded, _wiki_sync_status`
- **효과**: approve/review API 호출 후 동일 세션 내 _wiki_statuses 변경이 글로벌에 정상 반영

### BUG 2 (Critical): sync-firestore 핸들러 global 누락 — BUG 1로 해결
- sync-firestore 핸들러(line 6347)에서 `_wiki_loaded`와 `_wiki_sync_status` 재바인딩은 do_POST 최상위 global 선언에 이미 포함
- BUG 1에서 `_wiki_statuses`를 추가함으로써 완전히 해결

### BUG 3 (High): 데이터 불일치 → Firestore 기준 재동기화 — 해결
- **스크립트**: `/home/jay/workspace/dashboard/scripts/sync_firestore_statuses.py`
- **Firestore 조회**: `sourceType == "dashboard_insight"` 조건으로 87건 조회
- **결과**:
  - wiki-statuses.json: 16건 → 220건 (insight-* 219 + kakao-001)
  - wiki-sync-status.json: 105건 → 219건
  - 상태 분포: approved 13, rejected 3, draft 204
- **백업**: `wiki-statuses.json.bak.20260414210035`, `wiki-sync-status.json.bak.20260414210035`
- **정합성**: entries 219건 모두 statuses에 존재, sync-status와 교차검증 일치 확인

### BUG 4 (High): DASHBOARD_API_URL 환경변수 — 해결
- **파일**: `/home/jay/projects/insuwiki/nextapp/.env.local`
- **변경**: `DASHBOARD_API_URL="http://localhost:8000"` 추가
- **근거**: 서버 IP 100.76.130.39에서 InsuWiki와 대시보드 모두 실행 → localhost:8000 유효
- **참고**: route.ts에 fallback(`|| 'http://localhost:8000'`)이 있어 기존에도 동작했으나, 명시적 설정 추가

### BUG 5 (Medium): approve 핸들러 entry 미발견 시 처리 — 해결
- **파일**: `/home/jay/workspace/dashboard/server.py:6534-6536`, `6592-6594`
- **변경**: 404 반환 + return 제거 → logging.warning 후 상태 업데이트 계속 진행
- **적용**: approve 핸들러(`/api/wiki/entries/{id}/approve`)와 review 핸들러(`/api/wiki/insights/{id}/review`) 모두 동일 수정
- **효과**: entry가 _wiki_entries에 없어도 statuses/sync_status 업데이트 정상 진행

## 산출물 파일 목록

- `/home/jay/workspace/dashboard/server.py` (수정: BUG 1, 5)
- `/home/jay/workspace/dashboard/data/wiki-statuses.json` (갱신: 16 → 220건)
- `/home/jay/workspace/dashboard/data/wiki-sync-status.json` (갱신: 105 → 219건)
- `/home/jay/workspace/dashboard/scripts/sync_firestore_statuses.py` (신규: 재동기화 스크립트)
- `/home/jay/projects/insuwiki/nextapp/.env.local` (수정: DASHBOARD_API_URL 추가)
- `/home/jay/workspace/dashboard/data/wiki-statuses.json.bak.20260414210035` (백업)
- `/home/jay/workspace/dashboard/data/wiki-sync-status.json.bak.20260414210035` (백업)

## 발견 이슈 및 해결

### 자체 해결 (3건)
1. **server.py 요약 파일 outdated** — 현재 7147줄이나 요약은 2475줄 기준. 코드 탐색에 요약 대신 직접 grep/read 사용으로 우회
2. **wiki-entries.json 경로 혼동** — dashboard/data/가 아닌 insuwiki/scripts/kakao_knowledge/에 위치. _WIKI_ENTRIES_PATH 상수로 확인하여 해결
3. **Firestore 132건 미등록 entries** — sourceType "dashboard_insight"가 87건뿐. 나머지 132건은 Firestore에 아직 sync 전이므로 draft 상태로 정확히 처리

### 범위 외 미해결 (1건)
1. **server.py 요약 파일 갱신** — 범위 외 사유: 별도 유지보수 작업

## 검증

- python3 구문 검증: server.py PASS, sync_firestore_statuses.py PASS
- 데이터 정합성: entries 219 == statuses에 포함 219 ✓
- sync-status에 entries 외 항목 0건 ✓
- pyright 진단: 기존 이슈만 존재 (import resolution, complexity), 신규 이슈 0건

## QC 검증 결과

- **overall**: WARN (6 PASS, 5 SKIP, 2 WARN)
- **test_runner**: PASS — pytest 18 passed, 0 failed (2.53s)
- **tdd_check**: WARN — 버그 수정 특성상 구현 선행 후 테스트 추가 (TDD 순서 위반이나 테스트 전수 통과)
- **pyright_check**: SKIP — 기존 "Code too complex" 이슈 (line 1610/5246, do_GET/do_POST 메서드). 이번 변경과 무관한 기존 구조적 문제
- **style_check**: WARN — black 포맷팅 차이 (기존 파일 스타일 유지)
- **TRUST 5**: T✓ R✓ U✓ S✓ T✓ (전 차원 PASS)

## 마아트 독립 검증 (critical 레벨)

- 코드 정확성: PASS
- 데이터 정합성: PASS (kakao-001 레거시 항목 1건 — 기능 무해, 향후 정리 권장)
- 테스트: PASS (18 passed, 0 failed)
- 환경변수: PASS
- 보안: PASS (로깅에 PII 노출 없음)
- **종합 판정: PASS**

## 모델 사용 기록

- 불칸(백엔드) — sonnet: BUG 1+5 server.py 수정
- 불칸(백엔드) — sonnet: BUG 3 Firestore 동기화 스크립트 작성+실행
- 아르고스(테스터) — sonnet: BUG 1+5 검증 테스트 3건 추가
- 마아트(QC) — sonnet: 독립 검증 (critical 레벨)
- 헤르메스(팀장) — opus: 설계, BUG 4 config 수정, 검증, 통합, 보고서

## 세션 통계
- 총 도구 호출: 15회

### 수정 파일 목록
- /home/jay/workspace/memory/reports/task-1811.1.md: 4회 (Edit, Write)
- /home/jay/workspace/dashboard/server.py: 3회 (Edit)
- bash_cmd: 3회 (Bash)
- /home/jay/workspace/dashboard/tests/test_server.py: 2회 (Edit)
- /home/jay/projects/insuwiki/nextapp/.env.local: 1회 (Edit)
- /home/jay/workspace/dashboard/scripts/sync_firestore_statuses.py: 1회 (Write)
- /home/jay/workspace/memory/tasks/task-1811.1.md: 1회 (dispatch)

### 도구 사용 현황
- Edit: 9회
- Bash: 3회
- Write: 2회
- dispatch: 1회

