Skip to content

fix: 갓 init 한 KB 가 validate 를 영구히 통과하지 못한다 (#190 잔여) #327

Description

@SeoyunL

요약

factlog init 이 만든 KB 는 사용자가 아무것도 잘못하지 않아도 tools/validate.py
영구히 통과하지 못한다(rc=1, 오류 5건). init 스캐폴드가 만드는 산출물과 validate 가
요구하는 산출물이 어긋나 있고, 사용자가 두 파일을 손으로 채우기 전까지 매 sync 마다
Fact sync validation failed 가 출력된다.

#190 은 같은 상황(무정책 KB)에서 check 가 하드 실패하던 것을 graceful 하게 고쳤다.
그 수정은 _load_logic_policy_from 한 곳에만 들어갔고 validate 는 갱신되지 않았다.

재현 (upstream/main c6d359d, macOS, Python 3.12 로 실측)

factlog init --target /tmp/kb
export FACTLOG_ROOT=/tmp/kb
python3 tools/validate.py /tmp/kb; echo "rc=$?"
Fact sync validation failed:
- missing or empty policy/logic-policy.dl
- decisions/open-questions.md should keep a '중복' review section
- decisions/open-questions.md should keep a '모호' review section
- decisions/open-questions.md should keep a '출처' review section
- decisions/open-questions.md should keep a '충돌' review section
rc=1

문서가 안내하는 복구 절차를 따라도 낫지 않는다.

python3 tools/generate_logic_policy.py; echo "rc=$?"
# policy/logic-policy.md has no compilable policies: no supported policy bullets
# rc=1                    <- .dl 을 만들어 주지 않는다

python3 tools/validate.py /tmp/kb; echo "rc=$?"
# - policy/logic-policy.dl does not match policy/logic-policy.md: ... no supported policy bullets
# - decisions/open-questions.md should keep a '중복' review section   (…4건)
# rc=1

finalize.py 로 정상 sync 를 한 바퀴 돌려도 같은 5건이 그대로 출력된다(그리고 finalize
자체는 rc=0 으로 끝나므로, 실패는 화면에만 남고 종료 코드로는 드러나지 않는다).

근거

(a) 정책 축 — init 이 쓰는 policy/logic-policy.md 는 규칙 불릿이 없는 산문 스텁이다.

  • tools/generate_logic_policy.py 는 컴파일할 불릿이 없으면 .dl 을 만들지 않고 rc=1.
  • tools/validate.py:174-176policy/logic-policy.dl 이 없거나 비면 무조건 오류.
  • 반면 #190/PR fix(#190): 무정책 KB에서 check가 graceful하게 완주 (진짜 오류는 그대로 fail-loud) #192 이후 factlog.common.load_logic_policy() 는 같은 KB 에서
    '// no policy rules'정상 반환한다(실측). 즉 check/ask 는 무정책을 받아들이는데
    validate 만 거부하는 비대칭이 남아 있다.

(b) 검토 섹션 축tools/validate.py:212-214decisions/open-questions.md
중복·모호·출처·충돌 네 섹션이 있기를 요구한다. 그런데 이 섹션을 스캐폴드하는
코드가 없다.

  • factlog initdecisions/open-questions.md아예 만들지 않는다(init 출력의
    파일 목록에 없음).
  • tools/merge_candidates.py:596,629 는 파일이 없으면 "# Open Questions\n" 만 만들고,
    섹션 heading 은 해당 분류의 needs_review 불릿이 실제로 생길 때만 덧붙인다.
  • 따라서 사실이 0건이거나 네 분류가 다 차지 않은 KB 는 항상 이 오류를 낸다.

영향

  • 심각도 중간. 데이터 손상은 없으나, 첫 실행 경험이 실패로 시작한다. 새 사용자가
    보는 첫 validate 결과가 rc=1 이고, 무엇이 자기 잘못이고 무엇이 스캐폴드 결함인지
    구분할 근거가 화면에 없다.
  • validate 를 CI 게이트로 쓰려는 사용자는 빈 KB 를 통과시킬 방법이 없다.

제안

  1. 정책 축: validate#190 의 결론을 따른다 — logic-policy.md 에 컴파일 가능한
    불릿이 없으면 .dl 부재를 오류가 아니라 "무정책" 으로 취급한다
    (logic_policy_md_has_rules 헬퍼가 이미 있으므로 재사용 가능). 불릿이 있는데 .dl
    없는 경우는 지금처럼 fail-loud 유지.
  2. 검토 섹션 축: factlog init 이 네 섹션 heading 을 가진 decisions/open-questions.md
    를 스캐폴드하거나, validate 가 "불릿이 존재하는 분류의 섹션" 만 요구하도록 좁힌다.
    (전자가 문서와의 정합이 낫다 — 검토 섹션은 계약이지 산출물이 아니다.)

수용 기준

  • factlog init 직후 tools/validate.py 가 rc=0.
  • 규칙이 있는 KB 에서 .dl 이 낡거나 없으면 여전히 오류로 잡힌다(진짜 드리프트 미삼킴).
  • needs_review 불릿이 있는데 섹션이 없는 경우는 여전히 오류.
  • 기존 KB 의 validate 결과 불변(회귀 없음).
  • 갓 init 한 KB 로 rc=0 을 고정하는 테스트.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions