1# Assumption register — WP 2723Version 1.0, 2026-10-27. Each row states the assumption *as implemented* in `src/market_agents`, its role, why it is acceptable for the research question, and the pre-specified check that probes it. Values are the defaults of `configs/baseline.yaml` unless noted. "Confirmatory base" refers to the overrides in `protocol.md` §5.1.45## 1. Time, assets and fundamentals67| ID | Assumption (as implemented) | Role | Justification | Robustness check |8|---|---|---|---|---|9| A1 | Discrete model time: 600 ticks, outcomes on t ≥ 100; no calendar mapping | Defines the horizon of every metric | Avoids false precision; 30 dividend periods suffice for ACF/VR estimates (≥ 500 returns) | `n_ticks` 1,000 on the control (free); report whether rankings of cells change |10| A2 | Dividend every 20 ticks: D = μ + x + J, x_t = 0.98 x_{t−1} + 2 ε_t (cents), μ = 50 c, r = 0.25 % per period; one asset by default | Fundamental process; V ≈ 200.00 and P/D ≈ 400 | Persistent, stationary cash-flow state with a closed-form PV (brief §Economy) | Sweep ρ ∈ {0.95, 0.98}, σ ∈ {1, 2, 4} on the control (free) |11| A3 | **"Efficient price" = full-information PV** V_t = μ/r + x_t·ρ/(1 + r − ρ), risk-neutral, constant discount rate, no risk premium | Benchmark for `msd_log`, `mad_pct`, bubbles, absorption | The only unambiguous benchmark in a simulated economy; the latent state is never shown to agents | Also report deviations from the *public* PV (`public_value`) and from the end-of-run mean price |12| A4 | Public PV = Kalman/HMM posterior on announced dividends; in the baseline (no jumps, one regime) the dividend reveals x_t exactly, so V^pub ≡ V | Information structure | Simplest case for calibration; **but it makes private signals redundant and H1 unidentified** | Confirmatory base uses noisy dividends (`jump_prob` 1, `jump_sigma` ≈ 4 c → SD(V^pub/V − 1) ≈ 0.5 %); both variants reported |13| A5 | No look-ahead: private signals s = x_t + N(0, σ²/precision) are about the *current* state; news reports x_t with noise; nobody sees future draws | Rules out mechanical information advantages | Standard in noisy rational-expectations settings | Unit test on the signal function; prompt audit (`prompting.py` builds only from `Observation`) |14| A6 | Shock: latent jump in x at t = 300 revealed through dividends/news; placebo at t = 450. Baseline size 40 c (+8.4 % on V); confirmatory size 10 c (+2.1 %) | Event-study outcomes (`time_to_absorb`, `response_ratio`, local projections) | A sub-threshold (< 5 %) jump so that a lagged response is not counted as a bubble; placebo for falsification | Sizes 10/20/40 c on the control; `news_burst` variant |1516## 2. Market mechanism1718| ID | Assumption | Role | Justification | Robustness check |19|---|---|---|---|---|20| A7 | Continuous double auction, price–time priority, limit/market/cancel, partial fills, IOC remainder of market orders, integer ticks (1 c) and lots | Price formation; no Walrasian auctioneer and no imposed equilibrium | Matches modern electronic markets; prices emerge from order matching | `call_auction_interval` = 5 (batch clearing with a 2 % collar), mock only |21| A8 | Per-agent latency U[0.05, 1] tick, fixed for the run; orders processed in arrival order; LLM agents draw latency like others | Removes a speed advantage from either population | Speed is not the object of study | `latency.llm_latency` matched-latency variant |22| A9 | Fees: taker 2 bp, maker 0, no rebates; fees leave the economy; exact cash/share conservation asserted after every fill | Transaction costs; accounting integrity | Low explicit costs so that spreads are endogenous | Taker 0 and 5 bp on the control |23| A10 | Order TTL 50 ticks; price band ±50 % of the reference; max order 10,000 lots (policies cap at 40–50) | Keeps books finite and prices bounded | Prevents stale quotes and absurd limit prices | TTL 20 / 100 on the control |24| A11 | No short selling by default; buys limited by free cash (reserved for resting buys) | Budget constraint; asymmetry between buying and selling | Retail-like constraint; makes the no-short assumption explicit for H3 | `allow_short` with `max_short_lots` 100 on the control and at φ = 0.25 (mock) |25| A12 | Leverage only for "leveraged" slots: cap 3× gross/equity, maintenance margin 25 %, forced sale of 50 % by market order on the next tick, bankrupt agents frozen | The leverage channel of H3 (spiral when λX/m ≥ 1) | Mirrors margin trading with mechanical liquidation | Cap 2×/5×; maintenance 15 %/35 % (free at φ = 0, live only in the T4 leverage cell) |26| A13 | Safeguards off by default; treatments: halt when |10-tick move| > 5 % for 20 ticks with resting orders cancelled; position limit 300 lots | H6 | Simple, transparent rules | Halt 3 %/8 %; limit 150/600 (mock) |27| A14 | Market making by 5 bounded inventory-skewed two-sided quoters (half-spread 8 ticks + volatility term, skew 2 % at 200 lots), endowed ×5, never replaced by LLM agents | Liquidity supply; spread floor ≈ 8 bp | Keeps a stable liquidity benchmark across cells so liquidity changes come from the treated population | `quote_qty` 10/20 and `liquidity` shock (makers withdraw) on the control |2829## 3. Agents3031| ID | Assumption | Role | Justification | Robustness check |32|---|---|---|---|---|33| A15 | **No rationality or equilibrium assumption**: classical agents are documented heuristics (fundamentalist with signal-weighted value, EMA trend, z-score mean reverter, zero-intelligence-plus noise, leveraged trend); LLM agents do whatever the model outputs | Defines the "human-like" baseline | The brief's theory (β-response traders) is a stylization; the simulator tests directional claims, not point predictions | Calibration sweep (360 runs) shows the stylized facts are robust to aggressiveness, trend share, market-order share |34| A16 | Mix 25/15/10/35/5/10 % (fundamentalist/trend/meanrev/noise/MM/leveraged), stratified by wealth; endowment 20,000 + 100 shares × lognormal(0.3) | Population composition | Common in ABM calibrations; 50/50 cash–stock endowment at V | Trend share 10–25 % in the sweep; `wealth_dispersion` 0/0.6 |35| A17 | Decision frequency: classical activation Bernoulli(0.2–0.5) per tick; LLM agents decide every 20 ticks with staggered offsets, from t = 50 | Event frequency vs decision frequency | API cost; one decision per dividend period is a defensible "slow trader" | Realized order/volume shares always reported (mock: 3.5 % / 8 % at φ = 0.25); `decision_interval` 10 (mock) |36| A18 | Information: 30 % of fundamentalists informed (precision 2 → signal SD 1.4 c); after the gate-4 fix an LLM slot inherits the status of the slot it replaces | Holds information quality fixed across arms (H1's premise) | Otherwise the treatment bundles policy and information (mock: 44 % vs 6 % informed) | Report `stratum` composition of LLM slots per cell; variant with `llm.informed_share` 0 |37| A19 | Stratified replacement: proportional quotas by classical type, market makers excluded → 95 eligible slots, so φ = 1 means 95 % | Dose definition | Keeps composition of the *replaced* population constant along the dose | `llm_replace: noise` (replace one type only) at φ = 0.25 (mock) |38| A20 | LLM observation = canonical snapshot (5 levels of depth, 60-tick mid history, 30 recent trades, last dividend, public PV, ≤ 3 news items, own signal, account, open orders); personas single ("generalist") or 8 diverse; memory 0/5; channel = last 5 rationales of a cohort | What the model can condition on | Identical information set to the classical agents' `Observation` | Prompt audit; prompt version frozen (v1) |39| A21 | Invalid or infeasible decisions become `hold` (quantity, ±20 % price window, cash/holdings, owned cancel ids); sells clipped to holdings | Reliability rule; ITT estimand | A deployed agent that fails holds | Validity reported per cell; cells < 80 % flagged |40| A22 | Provider sampling is not seeded; cached responses replay exactly; the frozen library is a nearest-neighbour map, not an agent | Reproducibility | Only option with current APIs | Cache-hit share and online/replay flag per run; library distance diagnostics |41| A23 | Equal decision opportunities across models by default (27 per agent); equal-USD via per-run `usd_cap` (single-provider cells) | Fairness of cross-model comparisons | Decision opportunities, not tokens, are the economically relevant unit | T5 fairness cell |4243## 4. Measurement4445| ID | Assumption | Role | Justification | Robustness check |46|---|---|---|---|---|47| A24 | Mid-price is the price; metrics use the mid (fallback in `engine.mid_ticks` when one side is empty); effective spread uses the start-of-tick mid | All price-based outcomes | Standard; avoids bid–ask bounce | Also compute `msd_log` on last trade prices |48| A25 | Bubble = |P/V − 1| > 5 % for ≥ 10 ticks; crash = drop ≥ 10 % from the trailing 20-tick max; `time_to_absorb` tolerance 1 % for 5 ticks, censored at 100 | Instability and absorption outcomes | Pre-specified; the 10 % crash rule has a floor effect in the control (0 crashes) | Grid bubble 3/5/8 %, crash 7/10/15 %, computed on saved ticks |49| A26 | Coordination measured among LLM agents only (sign correlation in 20-tick windows; synchrony per decision round) | H2/H5 | Only LLM decisions are logged with intent | Classical analogue from aggressor-signed trades (analysis stage) |50| A27 | Multi-asset: common factor 0.7 in innovations; LLM prompt covers asset 0 only | Contagion arm | Keeps the prompt single-asset (cost, validity) | Report that spillover runs from the LLM-traded asset to the classical-only asset |51