from __future__ import annotations import argparse import json from pathlib import Path ROOT = Path(__file__).resolve().parents[1] def _scan(path: Path) -> list[dict[str, str]]: text = path.read_text(encoding="utf-8", errors="ignore") findings: list[dict[str, str]] = [] if "subprocess.run" in text and "cwd=" not in text: findings.append({"file": str(path.relative_to(ROOT)), "reason": "subprocess_without_root_cwd"}) if "requests." in text or "pandas." in text or "numpy." in text: findings.append({"file": str(path.relative_to(ROOT)), "reason": "heavy_dependency_in_tool"}) return findings def main() -> int: ap = argparse.ArgumentParser() ap.add_argument("--root", default="tools") ap.add_argument("--max-findings", type=int, default=0) args = ap.parse_args() root = (ROOT / args.root).resolve() findings: list[dict[str, str]] = [] for path in sorted(root.rglob("*.py")): if path.name.startswith("validate_tool_thin_wrapper"): continue if path.name in { "validate_golden_coverage_100.py", "validate_harness_coverage_auditor.py", "validate_engine_harness_gate.py", }: continue findings.extend(_scan(path)) gate = "PASS" if len(findings) <= args.max_findings else "FAIL" payload = { "formula_id": "TOOL_THIN_WRAPPER_V1", "gate": gate, "thin_wrapper_findings": len(findings), "findings": findings[:200], } out = ROOT / "Temp" / "tool_thin_wrapper_v1.json" out.write_text(json.dumps(payload, ensure_ascii=False, indent=2), encoding="utf-8") print(json.dumps(payload, ensure_ascii=True, indent=2)) return 0 if gate == "PASS" else 1 if __name__ == "__main__": raise SystemExit(main())