1\section{Reproducibility and replication package}2\label{app:repro}34\paragraph{Environment.}5The package requires Python $\ge 3.12$ and is installed with \code{uv sync --extra dev} from the committed lock file \code{uv.lock}; the runs reported here used Python 3.12.13 and uv 0.11.7 on macOS (arm64). Locked versions of the libraries that affect numerical results or provider calls are numpy 2.5.4, pandas 3.1.0, scipy 1.18.1, statsmodels 0.15.0, pyarrow 26.0.0, duckdb 2.0.0, sortedcontainers 2.4.0, pydantic 2.14.1, pyyaml 6.0.3, openai 3.40.0, anthropic 2.3.0, with pytest 9.2.0 and hypothesis 6.170.12 for the test suite. API keys are read from a local \code{.env} file (\code{OPENAI\_API\_KEY}, \code{ANTHROPIC\_API\_KEY}) by the \code{ma} command line and never appear in configurations, manifests or logs.67\paragraph{One-command replication without an API key.}8\code{make replicate} runs, in order, the test suite (\code{make test}, 24 tests), the smoke test (two 300-tick runs with 100 agents at $\varphi=0$ and $\varphi=0.25$ with the mock provider, accounting verified), the classical confirmatory design (16 cells $\times$ 30 seeds) and the mock exploratory design (12 cells $\times$ 3 seeds), the numerical theory checks, the figures and the tables, writing \code{results/runs/<design>/outcomes.parquet}, \code{results/figures/} and \code{results/tables/}; \code{make paper} copies tables and figures into \code{paper/} and compiles \code{main.tex} with \code{latexmk}. The classical designs take about a minute on six worker processes (\code{W=6}); every number in the classical tables is reproduced bit for bit because those runs are deterministic functions of the seed.910\paragraph{Paid designs and cost estimates.}\sloppy11\code{make pilot} and \code{make confirmatory} first print the \code{ma budget} estimate and then run the design with the shared decision cache \code{results/cache/llm\_cache.sqlite}. With the planning token profile of 760 input and 230 output tokens per call, \code{ma budget} reports 6,480 calls and 2.85~USD for \code{pilot\_openai.yaml} (3 cells $\times$ 3 seeds, per-run cap 1.5~USD) and 79,380 calls and 38.74~USD for \code{confirmatory\_openai.yaml} (16 cells $\times$ 7 seeds, per-run cap 2.0~USD; 41.65~USD at the default 800/250 profile); the mock designs cost nothing. The realised profile of gpt-5.4-nano at prompt version v1 in the live runs on disk is about 850--870 input tokens (no provider-side cache hits were reported), 320--460 output tokens of which 240--380 are reasoning tokens, 2.5--3.2~s of latency and 0.00057--0.00075~USD per decision, i.e.\ 0.08--0.10~USD per run at $\varphi=0.05$ and about 0.22~USD at $\varphi=0.25$.\footnote{Means over the online gpt-5.4-nano decisions in the \code{llm\_decisions.parquet} frames of the pilot \code{share\_5} runs (seeds 1--3) and of the confirmatory \code{dose\_005}, \code{dose\_010} and \code{dose\_025} runs completed at the time of writing; the planning figure of 0.00044~USD per decision in \code{docs/model\_cards.md} was measured on shorter smoke-test prompts.} The project-wide ceiling for live calls is 40~USD; per-run caps are set at least twice the expected run cost so that no confirmatory run halts for budget.1213\paragraph{Where things live.}14Each run writes \code{results/runs/<design>/<cell>/seed<NNNN>/} containing \code{config.yaml} (the fully resolved configuration), \code{manifest.json}, \code{ticks.parquet} (one row per tick and asset), \code{trades.parquet}, \code{agents.parquet} (one row per slot with policy, replaced type, provider, model, prompt id, cohort, stratum, latency, precision, leverage cap, initial and final wealth, fees, dividends, order counts and the frozen flag), \code{llm\_decisions.parquet} (one row per LLM decision, Section~\ref{sec:implementation}) and \code{outcomes.json}; optionally \code{events.parquet}. The design level adds \code{outcomes.parquet} (one row per run with all outcome metrics and treatment labels) and \code{design.json}. The decision cache is a single SQLite table keyed by the SHA-256 of (provider, model, prompt version, system prompt, user prompt) storing both prompts, the raw response text, the token usage and a timestamp; the frozen library built from the recorded decisions is \code{results/library/gpt-5.4-nano\_single.npz} (feature matrix plus JSON decisions), produced and replayed by \code{scripts/60\_frozen\_library.py}. Calibration artefacts are in \code{results/calibration/} (\code{sweep.parquet}, \code{sweep\_summary.csv}, \code{scale\_benchmark.json}).1516\paragraph{Provider non-determinism.}17OpenAI reasoning models are sampled at the provider and expose no seed; identical prompts can yield different decisions across calls, and the Anthropic API is likewise unseeded. Three mechanisms bound the consequences. First, every online decision is written to the cache before it is used, so a re-run of the same design with the same cache replays every recorded decision exactly, performs zero calls and costs nothing; cache hits are counted separately (\code{cached\_hits} in the manifest, \code{cached\_hit} per decision, \code{llm\_cached\_hits} in the outcomes) so that online and replayed runs are never confused. Second, the request id and the dated model snapshot are stored per decision and the price table per run, so that a provider-side model change is visible. Third, the mock and library providers are fully seeded and serve as the deterministic reference for the pipeline; the frozen library is a non-adaptive replay and its runs are labelled provider \code{library}. The git revision in each manifest carries a \code{-dirty} suffix when the working tree had uncommitted changes at the time of the run; the record of every change made between the pre-analysis plan and the confirmatory runs is kept in \code{docs/research\_log.md}.1819\paragraph{Replication checklist.}20\begin{enumerate}\sloppy21\item Check out the revision named in the manifests of the design to be replicated (\code{git\_revision}, without the \code{-dirty} suffix) and install with \code{uv sync --extra dev}; run \code{make test} (24 tests pass).22\item Run \code{make smoke}; the printed conservation flag is \code{True} and the artefacts appear in \code{results/runs/smoke/}.23\item Run \code{make replicate}; compare \code{results/runs/classical\_confirmatory/outcomes.parquet} and \code{results/runs/exploratory\_mock/outcomes.parquet} with the published copies (identical up to floating-point formatting).24\item For the live designs, place the published \code{results/cache/llm\_cache.sqlite} in \code{results/cache/} and run \code{make pilot} and \code{make confirmatory}: every manifest then reports \code{cached\_hits} equal to the number of calls and zero USD. Without the cache, the same commands reproduce the design with fresh provider samples at the cost printed by \code{ma budget}.25\item Verify that every run directory carries a \code{manifest.json} with \code{config\_hash}, \code{git\_revision}, \code{prompt\_version}, \code{price\_assumptions}, \code{llm\_usage}, \code{shocks} and \code{final\_conservation\_ok}, and that the \code{providers} list of every live cell contains only the providers named in the design file.26\item Regenerate figures and tables with \code{make figures tables}; the analysis scripts read only the parquet frames and never re-simulate. The threshold sensitivity grid (bubble 3/5/8\%, crash 7/10/15\%) is obtained by re-running \code{run\_outcomes} on the saved tick frames.27\item Compile the paper with \code{make paper}; the sections that quote numbers from result files cite those files in footnotes so that each figure can be traced to a frame and a script.28\item Record any deviation from \code{docs/protocol.md} in \code{docs/research\_log.md} with its date and reason before analysing new runs.29\end{enumerate}30