"""Locate the 40250 reference source tree for the audit scripts. Order: `MT_40250_SOURCE` env var, then `reference_root` in `audit/manifest.json` (relative to the repository root). A missing tree is an error, never a silent fallback. """ from __future__ import annotations import json import os from pathlib import Path def repo_root() -> Path: return Path(__file__).resolve().parents[4] def reference_root(repo: Path | None = None) -> Path: repo = (repo or repo_root()).resolve() raw = os.environ.get("MT_40250_SOURCE") if not raw: manifest = json.loads((repo / "audit" / "manifest.json").read_text(encoding="utf-8")) raw = manifest.get("reference_root", "") if not raw: raise SystemExit("40250 reference root not set: export MT_40250_SOURCE or set manifest reference_root") path = Path(raw) path = (path if path.is_absolute() else repo / path).resolve() if not (path / "UserInterface").is_dir(): raise SystemExit(f"40250 reference root not found or incomplete: {path}") return path