1\section{Full hyperparameters}2\label{app:hyperparameters}34Table~\ref{tab:hp_baseline} lists every parameter of \code{configs/baseline.yaml} together with the defaults of the configuration schema (\code{experiments/config.py}) that the file does not set explicitly. Tables~\ref{tab:hp_classical}--\ref{tab:hp_pilot} list the overrides of every cell of the four design files; a cell inherits everything else from the baseline. Table~\ref{tab:hp_models} summarises the model cards (\code{docs/model\_cards.md}).56\begin{small}7\begin{longtable}{@{}p{5.0cm} p{3.4cm} p{6.6cm}@{}}8\caption{Baseline configuration (\code{configs/baseline.yaml}; schema defaults in italics)}9\label{tab:hp_baseline}\\10\toprule11Parameter & Value & Meaning \\12\midrule13\endfirsthead14\toprule15Parameter & Value & Meaning \\16\midrule17\endhead18\bottomrule19\endfoot20\multicolumn{3}{@{}l}{\emph{Run}}\\21\code{name} & baseline & run label (design/cell in designs) \\22\code{seed} & 1 & master seed of all streams \\23\code{n\_ticks} & 600 & ticks per run \\24\code{warmup} & 100 & ticks excluded from outcomes; LLM decisions start at \code{warmup}/2 \\25\multicolumn{3}{@{}l}{\emph{assets}}\\26\code{n\_assets} & 1 & number of risky assets \\27\code{tick\_cents} & 1 & tick size in cents \\28\code{initial\_price\_cents} & 20000 & reference price $=\mu/r$ (200.00) \\29\code{price\_band\_pct} & 0.5 & limit prices farther than $\pm50\%$ from the midpoint are rejected \\30\code{max\_order\_qty} & 10000 & maximum lots per order at the exchange \\31\multicolumn{3}{@{}l}{\emph{fundamentals}}\\32\code{div\_interval} & 20 & ticks between dividends ($\Delta$) \\33\code{r\_period} & 0.0025 & discount rate per dividend period ($r$) \\34\code{mu} & [50.0] & mean dividend in cents, regime 0, per asset ($\mu$) \\35\code{mu\_shift} & 0.0 & regime-1 mean $=\mu(1+\text{mu\_shift})$; 0 disables regimes \\36\code{p\_switch} & 0.0 & per-period regime switch probability \\37\code{rho} & 0.98 & persistence of the deviation ($\rho$) \\38\code{sigma} & 2.0 & innovation standard deviation in cents ($\sigma$) \\39\code{jump\_prob} & 0.0 & per-period jump probability (dividend noise) \\40\code{jump\_sigma} & 0.0 & jump standard deviation in cents \\41\code{factor\_loading} & [0.0] & loading $b_k$ on the common factor \\42\code{x0} & 0.0 & initial revealed deviation \\43\multicolumn{3}{@{}l}{\emph{news}}\\44\code{rate} & 0.02 & per-tick probability of a public item per asset \\45\code{noise\_sd} & 1.0 & stated noise of credible items (cents) \\46\code{misleading\_share} & 0.0 & share of biased items \\47\code{misleading\_bias} & 10.0 & bias of a misleading item (cents, random sign) \\48\code{window} & 20 & ticks of news visible in the observation \\49\multicolumn{3}{@{}l}{\emph{exchange}}\\50\code{maker\_fee\_bps} & 0.0 & maker fee (negative = rebate) \\51\code{taker\_fee\_bps} & 2.0 & taker fee in basis points of notional \\52\code{min\_latency} & 0.05 & floor on per-agent latency (ticks) \\53\code{halt\_threshold} & null & circuit breaker off (treatment: 0.05) \\54\code{halt\_window} & 10 & ticks over which the move is measured \\55\code{halt\_duration} & 20 & halt length in ticks \\56\code{halt\_cancel\_resting} & true & cancel resting orders at a halt \\57\code{allow\_short} & false & short selling switch (inert: every account has \code{short\_allowed=false}) \\58\code{max\_short\_lots} & 0 & short limit when shorting is allowed \\59\code{margin\_check} & true & end-of-tick margin and bankruptcy check \\60\code{liquidation\_fraction} & 0.5 & share of each position sold on a margin call \\61\code{order\_ttl} & 50 & resting orders expire after this many ticks \\62\code{position\_limit} & \emph{null} & max $|$position$|$ in lots (treatment: 300) \\63\code{call\_auction\_interval} & \emph{null} & batch clearing every $k$ ticks (treatment: 5); collar 0.02 fixed in \code{ExchangeConfig} \\64\multicolumn{3}{@{}l}{\emph{population}}\\65\code{n\_traders} & 100 & trader slots ($N$) \\66\code{mix} & fund.\ 0.25, trend 0.06, meanrev 0.10, noise 0.50, MM 0.05, statarb 0.0, leveraged 0.04 & shares of slots by policy (calibrated 2026-10-27) \\67\code{activity} & fund.\ 0.20, trend 0.20, meanrev 0.20, noise 0.30, MM 0.5, statarb 0.2, leveraged 0.2 & per-tick activation probability \\68\code{policy\_kwargs} & fundamentalist \{aggressiveness: 20.0\}; noise \{p\_market: 0.6\}; market\_maker \{quote\_qty: 20\} & calibrated policy parameters (others at code defaults, Table~\ref{tab:policies}) \\69\code{llm\_share} & 0.0 & fraction of slots controlled by the LLM policy ($\varphi$) \\70\code{llm\_replace} & proportional & stratified replacement across types (or one policy name) \\71\code{llm\_keep\_market\_makers} & true & market makers are never replaced \\72\code{informed\_share} & 0.3 & share of fundamentalists receiving private signals \\73\code{precision} & 2.0 & signal precision $\pi$ of informed fundamentalists \\74\code{leverage\_cap} & 3.0 & gross exposure / equity cap of leveraged slots ($L$) \\75\code{maintenance\_margin} & 0.25 & margin-call threshold on equity / gross ($m$) \\76\code{endowment.cash\_cents} & 2000000 & base cash (20,000.00) \\77\code{endowment.shares} & 100 & base lots per asset \\78\code{endowment.wealth\_dispersion} & 0.3 & lognormal sd of the wealth multiplier \\79\code{latency.min}, \code{latency.max} & 0.05, 1.0 & uniform latency range (ticks) \\80\code{latency.llm\_latency} & null & matched-latency override for LLM slots \\81\multicolumn{3}{@{}l}{\emph{population.llm}}\\82\code{provider\_mix} & \{mock: 1.0\} & provider $\to$ share of LLM slots \\83\code{models} & mock: mock-v1; openai: gpt-5.4-nano; anthropic: claude-haiku-5-5 & model id per provider alias \\84\code{prompt\_set} & single & single (generalist) or diverse (8 personas) \\85\code{prompt\_version} & v1 & frozen prompt version \\86\code{memory} & 0 & past own decisions shown (treatment: 5) \\87\code{channel} & false & cohort communication channel \\88\code{cohort\_size} & 5 & cohort size and channel length \\89\code{decision\_interval} & 20 & ticks between LLM decisions \\90\code{stagger}, \code{stagger\_slots} & true, 4 & offsets $\{0,5,10,15\}$ \\91\code{informed\_share} & null & inherit the replaced slot's information (a number overrides) \\92\code{precision} & 2.0 & precision used when \code{informed\_share} is a number \\93\code{max\_order\_qty} & 50 & cap on LLM order size (lots) \\94\code{reasoning\_effort} & low & OpenAI \code{reasoning.effort} / Anthropic \code{effort} \\95\code{max\_output\_tokens} & 1200 & output cap per call (includes reasoning tokens) \\96\code{concurrency} & 8 & parallel requests per decision batch \\97\code{usd\_cap} & 5.0 & hard USD cap per run \\98\code{cache} & true & reuse identical (provider, model, prompt) decisions \\99\code{temperature} & \emph{null} & never sent to gpt-5 / o-series models \\100\code{timeout\_s}, \code{max\_retries} & \emph{60.0, 3} & client timeout and retries \\101\code{token\_cap}, \code{decision\_cap} & \emph{null, null} & optional total-token and per-agent decision caps \\102\code{frozen\_library} & \emph{null} & path of the recorded decision library (provider \code{library}) \\103\code{adaptive\_prompt} & \emph{false} & P\&L feedback line in the prompt \\104\code{price\_assumptions} & \emph{Table~\ref{tab:hp_models}} & USD per 1M tokens by model id \\105\multicolumn{3}{@{}l}{\emph{shocks}}\\106shock 1 & \{time: 300, kind: fundamental\_jump, size: 10.0\} & $+10$ cents on the latent deviation ($+2.2\%$ of $V$) \\107shock 2 & \{time: 450, kind: placebo\} & logged, no effect \\108\multicolumn{3}{@{}l}{\emph{output}}\\109\code{events} & false & write the full event log \\110\code{trades}, \code{llm\_log} & true, true & write trade and LLM-decision frames \\111\code{lookback} & 60 & ticks of midpoint history in the observation \\112\end{longtable}113\end{small}114115\begin{small}116\begin{longtable}{@{}p{4.3cm} p{10.7cm}@{}}117\caption{Cells of \code{configs/classical\_confirmatory.yaml} (seeds 101--130; design overrides: \code{provider\_mix} \{mock: 1.0\}, \code{usd\_cap} 0.0)}118\label{tab:hp_classical}\\119\toprule120Cell & Overrides (dotted paths relative to the baseline) \\121\midrule122\endfirsthead123\toprule124Cell & Overrides \\125\midrule126\endhead127\bottomrule128\endfoot129control & none \\130placebo\_shock & shocks: placebo at 300 and at 450 (no jump) \\131trend\_heavy & population.mix: trend 0.16, noise 0.40 (others as baseline) \\132leverage\_heavy & population.mix: leveraged 0.19, noise 0.35 \\133leverage\_heavy\_funding\_shock & population.mix as leverage\_heavy; shocks: fundamental\_jump $-10.0$ at 300, funding 0.5 at 320 \\134liquidity\_shock & shocks: fundamental\_jump 10.0 at 300, liquidity at 300, liquidity\_end at 360 \\135info\_low & population.precision 0.5 \\136info\_high & population.precision 8.0 \\137misleading\_news & news.misleading\_share 0.5 \\138breaker\_5 & exchange.halt\_threshold 0.05 \\139poslimit\_300 & exchange.position\_limit 300 \\140auction\_5 & exchange.call\_auction\_interval 5 \\141mock\_llm\_25\_indep & population.llm\_share 0.25 (mock provider) \\142mock\_llm\_50\_indep & population.llm\_share 0.50 (mock provider) \\143k2\_control & assets.n\_assets 2; fundamentals.mu [50, 50]; factor\_loading [0.7, 0.7]; population.mix: noise 0.45, statarb 0.05 \\144k2\_leverage & as k2\_control with leveraged 0.19, noise 0.30; shocks: fundamental\_jump $-10.0$ on asset 0 at 300, funding 0.5 at 320 \\145\end{longtable}146\end{small}147148\begin{small}149\begin{longtable}{@{}p{4.3cm} p{10.7cm}@{}}150\caption{Cells of \code{configs/confirmatory\_openai.yaml} (seeds 201--207; design overrides: \code{provider\_mix} \{openai: 1.0\}, \code{models} \{openai: gpt-5.4-nano, openai\_mini: gpt-5.4-mini, mock: mock-v1, anthropic: claude-haiku-5-5\}, \code{usd\_cap} 2.0, \code{concurrency} 8)}151\label{tab:hp_confirmatory}\\152\toprule153Cell & Overrides \\154\midrule155\endfirsthead156\toprule157Cell & Overrides \\158\midrule159\endhead160\bottomrule161\endfoot162dose\_000 / 005 / 010 / 025 / 050 / 100 & population.llm\_share 0.00 / 0.05 / 0.10 / 0.25 / 0.50 / 1.00 (single generalist prompt, gpt-5.4-nano) \\163div\_prompts\_025 & llm\_share 0.25; llm.prompt\_set diverse \\164div\_models\_025 & llm\_share 0.25; llm.prompt\_set diverse; llm.provider\_mix \{openai: 0.5, openai\_mini: 0.5\} \\165memory\_025 & llm\_share 0.25; llm.memory 5 \\166channel\_025 & llm\_share 0.25; llm.channel true \\167adaptive\_025 & llm\_share 0.25; llm.adaptive\_prompt true \\168leverage\_025 & llm\_share 0.25; population.mix: leveraged 0.19, noise 0.35 \\169breaker\_025 & llm\_share 0.25; exchange.halt\_threshold 0.05 \\170poslimit\_025 & llm\_share 0.25; exchange.position\_limit 300 \\171fair\_mini\_005 & llm\_share 0.05; llm.provider\_mix \{openai\_mini: 1.0\} (gpt-5.4-mini; equal-USD comparison with dose\_025) \\172fair\_latency\_025 & llm\_share 0.25; population.latency.llm\_latency 0.05 \\173\end{longtable}174\end{small}175176\begin{small}177\begin{longtable}{@{}p{4.3cm} p{10.7cm}@{}}178\caption{Cells of \code{configs/exploratory.yaml} (mock dry run, seeds 1--3; design overrides: \code{provider\_mix} \{mock: 1.0\}, \code{usd\_cap} 0.0)}179\label{tab:hp_exploratory}\\180\toprule181Cell & Overrides \\182\midrule183\endfirsthead184\toprule185Cell & Overrides \\186\midrule187\endhead188\bottomrule189\endfoot190share\_0 / 5 / 25 / 50 & population.llm\_share 0.0 / 0.05 / 0.25 / 0.50 \\191diverse\_25 & llm\_share 0.25; llm.prompt\_set diverse \\192memory\_25 & llm\_share 0.25; llm.memory 5 \\193channel\_25 & llm\_share 0.25; llm.channel true \\194leverage\_25 & llm\_share 0.25; population.mix: leveraged 0.19, noise 0.35 \\195breaker\_25 & llm\_share 0.25; exchange.halt\_threshold 0.05 \\196poslimit\_25 & llm\_share 0.25; exchange.position\_limit 300 \\197auction\_25 & llm\_share 0.25; exchange.call\_auction\_interval 5 \\198k2\_25 & llm\_share 0.25; assets.n\_assets 2; fundamentals.mu [50, 50]; factor\_loading [0.7, 0.7]; population.mix: noise 0.45, statarb 0.05 \\199\end{longtable}200\end{small}201202\begin{small}203\begin{longtable}{@{}p{4.3cm} p{10.7cm}@{}}204\caption{Cells of \code{configs/pilot\_openai.yaml} (seeds 1--3; design overrides: \code{provider\_mix} \{openai: 1.0\}, \code{models} \{openai: gpt-5.4-nano, mock: mock-v1, anthropic: claude-haiku-5-5\}, \code{usd\_cap} 1.5, \code{concurrency} 8)}205\label{tab:hp_pilot}\\206\toprule207Cell & Overrides \\208\midrule209\endfirsthead210\toprule211Cell & Overrides \\212\midrule213\endhead214\bottomrule215\endfoot216share\_5 / 25 / 50 & population.llm\_share 0.05 / 0.25 / 0.50 (gpt-5.4-nano, single prompt) \\217\end{longtable}218\end{small}219220\begin{table}[H]221\centering222\caption{Model cards summary (prices in USD per 1M tokens: input / cached input / output; source: provider pricing pages fetched 2026-10-27 for OpenAI, Anthropic's published table; identical to \code{LLMCfg.price\_assumptions})}223\label{tab:hp_models}224\footnotesize225\begin{tabular}{@{}p{2.7cm} p{2.6cm} p{2.3cm} p{1.6cm} p{5.6cm}@{}}226\toprule227Model id & Price & Reasoning effort & Output cap & Status / role \\228\midrule229gpt-5.4-nano & 0.20 / 0.02 / 1.25 & low & 1,200 & live; primary model (all dose, mechanism, safeguard and fairness cells; library source) \\230gpt-5.4-mini & 0.75 / 0.075 / 4.50 & low & 1,200 & live-capable; two-model mix and equal-USD cells \\231gpt-5-nano & 0.05 / 0.005 / 0.40 & low & 1,200 & priced; optional replication, not planned \\232gpt-5-mini & 0.25 / 0.025 / 2.00 & low & 1,200 & priced only \\233gpt-4.1-nano & 0.10 / 0.025 / 0.40 & n/a & 1,200 & priced only \\234gpt-4.1-mini & 0.40 / 0.10 / 1.60 & n/a & 1,200 & priced only \\235claude-haiku-5-5 & 0.10 / 0.01 / 0.50 & low (\code{effort}) & 1,200 & blocked (Anthropic key rejected, HTTP 401); mock dry run only \\236claude-sonnet-5-5 & 2.00 / 0.20 / 10.00 & low & 1,200 & blocked; mock dry run only \\237mock-v1 & 0 / 0 / 0 & n/a & n/a & mock (seeded value rule, 5\% invalid); not evidence about LLMs \\238library (knn-replay) & 0 & n/a & n/a & frozen nearest-neighbour replay of recorded decisions; non-adaptive; reported separately \\239\bottomrule240\end{tabular}241\end{table}242243\noindent The Anthropic adapter sends \code{max\_tokens} $=\max(\texttt{max\_output\_tokens},256)$ and \code{output\_config.effort}. Reasoning-token accounting exists only in the OpenAI adapter; the Anthropic adapter reports input, cached-input and output tokens. An unknown model id is priced at the most expensive known output price. Every manifest stores the price table in force when the run was made.244