1"""Minimal end-to-end experiment: 100 agents, fixed seed, zero paid calls (mock LLM at 25 %), accounting verified."""2from __future__ import annotations34import sys5from pathlib import Path67ROOT = Path(__file__).resolve().parents[1]8sys.path.insert(0, str(ROOT / "src"))9from market_agents.experiments.config import RunConfig # noqa: E40210from market_agents.experiments.runner import run_config # noqa: E40211from market_agents.metrics.outcomes import run_outcomes # noqa: E4021213if __name__ == "__main__":14 out = ROOT / "results/runs/smoke"15 for share in (0.0, 0.25):16 cfg = RunConfig.from_yaml(ROOT / "configs/baseline.yaml", **{"name": f"smoke_{int(share * 100)}", "seed": 1, "n_ticks": 300,17 "population.llm_share": share, "population.llm.provider_mix": {"mock": 1.0}})18 res = run_config(cfg, out_dir=out / cfg.name)19 oc = run_outcomes(res)20 print(f"{cfg.name}: trades={oc['n_trades']} mad={oc['mad_pct']:.2f}% spread={oc['spread_bp']:.1f}bp bubbles={oc['n_bubbles']} "21 f"llm_decisions={oc['n_llm_decisions']} valid={oc.get('llm_valid_rate', float('nan')):.2f} conservation_ok={res.manifest['final_conservation_ok']} wall={oc['wall_s']:.2f}s")22 print("smoke test OK — artefacts in", out)23