from __future__ import annotations import json import re from refactor_master_helpers import ROOT, collect_prompt_files, read_text PRICE_RE = re.compile(r"\b\d{1,3}(?:,\d{3})+(?:\.\d+)?원\b") PCT_RE = re.compile(r"\b\d+(?:\.\d+)?%") LEAK_WORDS = ("계산", "산출", "조정", "약", "대략", "상황에 따라", "추정") SAFE_PHRASES = ("산출한", "재산출", "재계산", "재해석", "그대로", "참조", "인용", "사용", "읽기", "출력", "결과값", "하네스") def main() -> int: violations: list[dict[str, str]] = [] for path in collect_prompt_files(): text = read_text(path) for lineno, line in enumerate(text.splitlines(), start=1): if not (PRICE_RE.search(line) or PCT_RE.search(line) or any(word in line for word in LEAK_WORDS)): continue if "input JSON values" in line or "DATA_MISSING" in line: continue if line.lstrip().startswith("#"): continue if any(word in line for word in SAFE_PHRASES): continue if "금지" in line or "하지 말" in line or "절대" in line: continue if "LLM" not in line and "하네스" not in line: continue if "formula_id" in line or "공식_ID" in line: continue violations.append({"file": str(path.relative_to(ROOT)), "line": str(lineno), "text": line.strip()}) result = { "formula_id": "PROMPT_FORMULA_LEAK_V1", "prompt_formula_leak_count": len(violations), "violations": violations[:200], "gate": "PASS" if not violations else "FAIL", } out = ROOT / "Temp" / "prompt_formula_leak_audit_v1.json" out.write_text(json.dumps(result, ensure_ascii=False, indent=2), encoding="utf-8") print(json.dumps(result, ensure_ascii=True, indent=2)) return 0 if not violations else 1 if __name__ == "__main__": raise SystemExit(main())