#!/usr/bin/env python3 from __future__ import annotations import argparse import json import re from pathlib import Path ROOT = Path(__file__).resolve().parents[1] CONJ_RE = re.compile(r"(그리고|및|와|과|또는|/|,)") MULTI_CONDITION_RE = re.compile(r".*(그리고|및|와|과|또는).*(그리고|및|와|과|또는).*") def main() -> int: ap = argparse.ArgumentParser() ap.add_argument("--report", default=str(ROOT / "Temp" / "operational_report.json")) args = ap.parse_args() report_path = Path(args.report) raw = report_path.read_text(encoding="utf-8") try: payload = json.loads(raw) sections = payload.get("sections") if isinstance(payload, dict) else [] text = "\n".join(str(s.get("markdown") or "") for s in sections if isinstance(s, dict)) except Exception: text = raw order_section = next((s for s in (payload.get("sections") if isinstance(payload, dict) else []) if isinstance(s, dict) and s.get("name") == "sell_priority_decision_table"), {}) if 'payload' in locals() else {} order_text = str(order_section.get("markdown") or text) multi_condition_count = sum(1 for line in order_text.splitlines() if MULTI_CONDITION_RE.search(line)) tick_normalized = "tick" in text.lower() or "호가단위" in text or "KRX" in text sell_candidate_count = len(re.findall(r"\bSELL\b|\bTRIM\b|매도", order_text)) result = { "formula_id": "ORDER_GRAMMAR_V1", "multi_condition_order_sentence_count": multi_condition_count, "tick_normalization_ok": tick_normalized, "sell_candidate_count": sell_candidate_count, "gate": "PASS" if multi_condition_count == 0 and tick_normalized else "FAIL", } print(json.dumps(result, ensure_ascii=False, indent=2)) return 0 if result["gate"] == "PASS" else 1 if __name__ == "__main__": raise SystemExit(main())