"""Minimal end-to-end experiment: 100 agents, fixed seed, zero paid calls (mock LLM at 25 %), accounting verified.""" from __future__ import annotations import sys from pathlib import Path ROOT = Path(__file__).resolve().parents[1] sys.path.insert(0, str(ROOT / "src")) from market_agents.experiments.config import RunConfig # noqa: E402 from market_agents.experiments.runner import run_config # noqa: E402 from market_agents.metrics.outcomes import run_outcomes # noqa: E402 if __name__ == "__main__": out = ROOT / "results/runs/smoke" for share in (0.0, 0.25): cfg = RunConfig.from_yaml(ROOT / "configs/baseline.yaml", **{"name": f"smoke_{int(share * 100)}", "seed": 1, "n_ticks": 300, "population.llm_share": share, "population.llm.provider_mix": {"mock": 1.0}}) res = run_config(cfg, out_dir=out / cfg.name) oc = run_outcomes(res) print(f"{cfg.name}: trades={oc['n_trades']} mad={oc['mad_pct']:.2f}% spread={oc['spread_bp']:.1f}bp bubbles={oc['n_bubbles']} " 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") print("smoke test OK — artefacts in", out)