코드 리뷰에서 잡은 검색·그래프 경계 결함 일곱 건을 한 장으로 응축해 확정
문제 (Context)
코드 리뷰에서 잡은 HIGH 등급 결함과 검색·그래프 경계 결정이 일곱 개의 개별 노드로 흩어져 있었다. 같은 묶음을 한 장의 결정으로 응축해, 완료 레인에는 종합 노드 하나만 남기고 원본은 보관으로 보존한다.
시도한 해결 (Decision)
일곱 결정을 한 묶음으로 확정했다.
- 노드 렌더가 콜론이 든 제목에도 깨지지 않도록 YAML을 안전하게 직렬화한다.
- 그래프가 평행한 타입 엣지를 보존한다(같은 노드쌍에 depends_on과 contradicts가 함께 존재).
- 검색 후보는 어휘 일치만 받고, 그래프는 재랭킹에만 쓴다.
- 검색이 읽기 시점에 폐기 노드를 제외한다(supersede-not-delete를 읽기 경로에서도 지킴).
- 증거맵이 소스에 없는 게이트 심볼을 가리키지 못하도록 드리프트 가드를 둔다.
- 회상이 읽기 시점에 경계를 재검사해 누수 노드를 제외한다.
- 회상이 폐기된 결정을 되살리지 않는다.
손댄 곳: wiki_chain/node_contract.py, md_graph.py, retrieval.py, kanban_wiki.py(render·recall).
수정 내역:
- 콜론 제목 깨짐: yaml.safe_dump로 전환.
- 엣지 덮어쓰기: MultiDiGraph로 교체.
- 비어휘 노드 주입: 후보를 어휘 일치로 한정.
- 폐기 노드 검색됨: terminal 필터 추가.
- 게이트 심볼 드리프트: 존재 검사 추가.
근거·결과 (Consequences)
완료 레인에는 이 응축 노드 한 장과 0.0.2.5 마일스톤 결정만 남는다. 원본 일곱 결정 노드는 supersede-not-delete 원칙대로 보관 레인에 남겨 두며, recall로 여전히 질의할 수 있다. 남은 0.0.2.5 GUI 검증과 사인오프는 사람 몫이다.
노드 계약 (contract)
| 필드 | 값 |
|---|---|
| type | 결정(decision) |
| Status | accepted |
| source_count | 1 |
| confidence | 미설정(구 엔진 격차) |
| confidence_reason_codes | 미설정(구 엔진 격차) |
| stale | fresh |
| 이슈(feature) | RAG·지식엔진 |
시행착오 타임라인 (supersede)
- 이전 시도: 노드 렌더가 콜론 든 제목에 안 깨짐 (대체함)
- 이전 시도: 그래프가 평행 타입 엣지 보존 (대체함)
- 이전 시도: 검색 후보는 어휘 일치만(그래프는 재랭킹) (대체함)
- 이전 시도: 검색이 읽기 때 폐기 노드를 제외 (대체함)
- 이전 시도: 증거맵 게이트 심볼 존재 가드 (대체함)
- 이전 시도: 읽기 경로에서 RAG 경계가 누수 노드를 보류 (대체함)
- 이전 시도: 회상이 폐기된 결정을 되살리지 않음 (대체함)
상호참조
이슈 wiki_chain 코드 리뷰 · Status accepted · 2026-06-25