1"""YAML config loading with environment overrides (paths only; no secrets)."""2from __future__ import annotations34import os5from pathlib import Path67import yaml8910def load_config(path: str | Path) -> dict:11 cfg = yaml.safe_load(Path(path).read_text())12 cfg.setdefault("paths", {})13 cache = os.environ.get("WP41_CACHE", cfg["paths"].get("cache", "~/wp41-cache"))14 cfg["paths"]["cache"] = os.path.expanduser(cache) if cache.startswith("~") or cache.startswith("/") else str(Path(path).resolve().parent.parent / cache)15 cfg["paths"]["root"] = str(Path(path).resolve().parent.parent)16 return cfg171819def results_dir(cfg: dict, *parts: str) -> Path:20 p = Path(cfg["paths"]["root"]) / "results" / Path(*parts)21 p.mkdir(parents=True, exist_ok=True)22 return p23