# Phase 2 — Candidate Storage 및 Review 책임 경계 본 문서는 Phase 1 완료 후 다음 작업자가 Phase 2를 시작할 때 참고할 핸드오프 노트다. 자동으로 Phase 2를 진행하지 않는다. ## 시작 전 확인 - `PHASE_INDEX.md`에서 Phase 2 진행 요청이 명시되어 있는지 확인한다. - `PHASE1_ACCEPTANCE_GATE.md`의 unit/integration 34/34 통과 상태를 기준선으로 삼는다. - vendored OntoCast core는 계속 직접 수정하지 않는다. ## Phase 2 목표 추출 결과를 바로 확정 그래프로 보내지 않고, 사람이 검토할 수 있는 candidate/review queue 계약으로 분리한다. SourceDocument와 EvidenceSpan이 없는 후보는 확정 graph로 들어가지 못하게 한다. ## 작업 범위 1. `storage/models.py`의 `CandidateEntity`, `CandidateRelation`을 review queue 계약으로 확정한다. 2. OntoCast 결과와 lightweight extraction 결과의 저장 경로를 분리한다. 3. `pending`, `approved`, `auto_approved`, `rejected` 상태 전이 규칙을 문서와 테스트로 고정한다. 4. evidence 없는 후보가 확정 graph로 승격되지 못하도록 validation boundary를 둔다. ## 권장 테스트 - 후보 생성 시 `document_id`와 `evidence_ids`가 필수로 연결되는지 검증한다. - 승인/반려/자동승인 상태 전이가 허용된 경로로만 움직이는지 검증한다. - evidence 없는 entity/relation이 commit 단계에 도달하지 못하는지 검증한다. - Phase 1 URL/HTML ingestion 테스트가 계속 통과하는지 회귀 검증한다.