# task: 대시보드 TODO 자동 동기화 시스템 구축

## 배경
현재 `/home/jay/workspace/memory/todo.json`은 완전 수동 관리.
작업(task)이 완료되어도 관련 issue의 sub_item이 자동 업데이트되지 않음.

**예시 (현재 불일치):**
- issue-007 (Remotion 파이프라인): Phase 0~3-1 진행 완료인데 전부 `done: false`
- issue-001 (InsuRo Lovable 독립): Phase 1~3 플랜관리 완료인데 미반영

## Phase 1: todo-sync 모듈 + 완료 파이프라인 연동

### 1-1. todo-sync 유틸리티 구현
파일: `/home/jay/workspace/utils/todo_sync.py` (신규)

```python
# 핵심 함수
def sync_task_completion(task_id: str) -> dict:
    """완료된 task_id를 todo.json의 sub_items에 매칭하여 done=true 업데이트"""
    # 1. todo.json 로드
    # 2. 모든 issue의 sub_items에서 task_id 매칭 검색
    #    - 방법 A: sub_item.task_id == task_id (직접 매칭)
    #    - 방법 B: issue.linked_tasks에 task_id 포함
    # 3. 매칭된 sub_item의 done=true, task_id 기록
    # 4. 모든 sub_items가 done이면 issue.status = "done", completed_at 기록
    # 5. todo.json 저장
    # 6. 변경 내역 반환

def retroactive_sync() -> dict:
    """task-timers.json의 완료된 태스크를 전수 스캔하여 todo.json 일괄 동기화"""
    # 1. task-timers.json에서 status=completed인 모든 task_id 수집
    # 2. 각 task_id에 대해 sync_task_completion 호출
    # 3. 총 변경 건수 반환

def link_task_to_issue(task_id: str, issue_id: str, sub_item_title: str = None) -> dict:
    """수동으로 task_id를 issue의 sub_item에 연결"""
    # 아누가 위임할 때 issue-sub_item 매핑을 명시적으로 등록하는 용도
```

### 1-2. notify-completion.py 연동
파일: `/home/jay/workspace/scripts/notify-completion.py` (수정)

task 완료 시 `sync_task_completion(task_id)` 자동 호출:
```python
from utils.todo_sync import sync_task_completion

# main() 안에서 task-timer end 호출 후:
sync_result = sync_task_completion(args.task_id)
if sync_result.get("updated"):
    print(f"[TODO] {sync_result['updated']}건 업데이트: {sync_result.get('details', '')}")
```

### 1-3. CLI 인터페이스
```bash
# 단일 task 동기화
python3 utils/todo_sync.py sync --task-id task-635.1

# 전수 동기화 (과거 완료 태스크 일괄)
python3 utils/todo_sync.py retroactive

# 수동 연결
python3 utils/todo_sync.py link --task-id task-635.1 --issue-id issue-007 --sub-item "Phase 0: 환경 셋업"
```

### 1-4. 매칭 전략
직접 매칭 우선:
1. sub_item에 `task_id` 필드가 있으면 → 정확 매칭
2. issue.linked_tasks에 task_id 포함 → 해당 issue의 미완료 sub_items 검색
3. 보고서 파일(`memory/reports/<task_id>.md`)에서 issue_id 참조 검색 (보완적)

### 1-5. 안전장치
- todo.json 수정 전 `.bak` 백업 생성
- 파일 락 (fcntl) 사용 — 동시 수정 방지
- done=true → done=false로 되돌리는 건 불가 (단방향)
- 변경 로그를 `memory/daily/` 또는 todo.json 내 `last_synced` 필드에 기록

### 1-6. 테스트
- `tests/test_todo_sync.py` 신규 작성
- sync_task_completion: 매칭 있을 때 / 없을 때 / 이미 done일 때
- retroactive_sync: 다건 동기화 시뮬레이션
- issue 전체 완료 시 status=done 자동 변경
- 기존 테스트 회귀 없음

## 산출물
- `/home/jay/workspace/utils/todo_sync.py` (신규)
- `/home/jay/workspace/scripts/notify-completion.py` (수정)
- `/home/jay/workspace/tests/test_todo_sync.py` (신규)
- 보고서: `memory/reports/<task_id>.md`

## Phase 2: 과거 완료 태스크 소급 동기화 + 검증

### 2-1. retroactive_sync 실행
- task-timers.json의 완료된 태스크 전수 스캔
- todo.json의 sub_items 중 task_id 매칭되는 항목 자동 done=true

### 2-2. 수동 매칭이 필요한 항목 목록 생성
- 자동 매칭 안 된 완료 태스크 ↔ 미완료 sub_item 후보 리스트 출력
- `memory/reports/todo-unmatched.md`에 저장

### 2-3. 대시보드 연동 확인
- `/home/jay/workspace/dashboard/server.py`에서 todo.json 읽는 로직 확인
- 자동 동기화된 데이터가 대시보드에 정상 표시되는지 확인
- (필요시) 대시보드 캐시 무효화 처리

### 2-4. 최종 검증
- todo.json의 done 상태가 실제 완료 상태와 일치하는지 확인
- 전체 테스트 실행

## 산출물
- 동기화된 `memory/todo.json`
- `memory/reports/todo-unmatched.md` (매칭 안 된 항목)
- 보고서: `memory/reports/<task_id>.md`

## 금지사항
- todo.json의 기존 issue 구조 변경 금지 (필드 추가는 OK)
- 다른 팀 디렉토리 접근 금지
- 대시보드 server.py의 기존 API 변경 금지 (추가만)

## 작업 레벨: Lv.2 (다중 파일 수정 + 설계)
