fix(safety): B-4 리뷰 반영 — 단일 술어 중앙화 + study/briefing 경로 커버

적대 리뷰(10에이전트) 확정 반영:
- license_filter.py 신설 — restricted_exclude_sql(raw)/restricted_exclude_orm(ORM)
  단일 정의. retrieval _license_sql·digest·briefing·study 풀이가 공유(드리프트 방지).
- major: explanation_rag(study 문제 AI 풀이 RAG)에 술어 누락 → doc_meta 쿼리에 ORM
  적용(valid_doc_ids 경유로 청크도 차단). briefing/loader 2쿼리에 누락 → digest 와
  동일 술어 추가(news restricted 부재=방어적·경로 일관성).
- blocker(low-impact): file_watcher changed-doc 경로 material/license 보정(merge 주입·
  license 부재 시만 — extract_meta clobber 회피, pre-B-4 적재분 동기화).
- 테스트: 단일-source 검증 + ORM 구성 스모크 2건 추가.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
hyungi
2026-06-13 14:51:05 +09:00
parent ed7740beee
commit a6db6c999b
7 changed files with 78 additions and 7 deletions
+23
View File
@@ -10,10 +10,33 @@ from pathlib import Path
sys.path.insert(0, str(Path(__file__).parent.parent / "app"))
from services.search.license_filter import ( # noqa: E402
restricted_exclude_orm,
restricted_exclude_sql,
)
from services.search.retrieval_service import _license_sql # noqa: E402
from workers.file_watcher import _TARGET_AXIS # noqa: E402
def test_shared_predicate_single_source():
# retrieval/digest/briefing 가 같은 술어 정의를 공유 — drift 방지(단일 source 계약)
assert _license_sql("d") == " AND " + restricted_exclude_sql("d")
assert _license_sql("") == " AND " + restricted_exclude_sql("")
assert restricted_exclude_sql("d").startswith("COALESCE(d.extract_meta")
def test_restricted_exclude_orm_constructs():
# study 풀이(explanation_rag)용 ORM 표현 — 컴파일 SQL 이 raw 술어와 동일 구조인지
from sqlalchemy.dialects import postgresql
clause = restricted_exclude_orm()
sql = str(clause.compile(dialect=postgresql.dialect(),
compile_kwargs={"literal_binds": True}))
assert "extract_meta" in sql
assert "'license'" in sql and "'restricted'" in sql # JSONB 경로 키
assert "'false'" in sql and "'true'" in sql # COALESCE 기본 + 비교값
def test_license_sql_shape_with_alias():
sql = _license_sql("d")
assert sql.startswith(" AND ") # 항상 ' AND ...' (WHERE 합성용)