# Rationale (candidate 2)

## What I looked at

- Read in full: `rules.json`, `modules/prime.py`, `spread.py`, `hedge.py`, `news.py`, `fxcontrol.py` (both checkouts, identical except `bracket_exit`), `modules/broker_map.py`, the strategy, `acceptance.py`, `run_live.py`, the strategy README, the systemd unit and the non-secret keys of its environment file, `decision.json`, `front.json`, `broker_results.json`, the scalar fields of `broker_map.json`, the news battery cache, the formulation note, the paper's Sections 1-3 and 14-18 and its generated tables, the `make_numbers.py` blocks that write Sections 14-15, the executed notebook's cells 90-120 (sections 24-26) with outputs, and the five most recent mdgraph entries plus every entry's description.
- Ran: six scripts in this folder (`c2_gate.py`, `c2_front.py`, `c2_refusal.py`, `c2_floats.py`, `c2_seeds.py`, `c2_rho_clock.py`), each from the research checkout root, one process at a time, 5,000 paths per wallet run, exact chains for everything else. Outputs sit beside them as `.out` and `.json`.

## How I chose to audit

- Reproduce first, then perturb. Every decision number was recomputed from the modules before any sensitivity was run, so a disagreement would have been mine to explain. All reproduced, which moved the audit from "is the arithmetic right" to "is the arithmetic decisive".
- Measure the gate's own error before trusting its sign. The brief's memory limit ruled out 100,000-path runs, so I used seeds: eight at 5,000 paths give the standard error of the published statistic without exceeding the cap.
- Bisect flips on the exact chain where the input enters the chain (cost, clock, assessment risk, floor reading) and on the wallet where it enters only there (honour, refusal, correlation). Thresholds are linear roots between scanned points or bisections, not guesses.
- Test modelling choices by changing one line. The refusal check copies `wallet_mc` into this folder with one added argument and proves the copy reproduces the module at the same seed before changing the reading, so the comparison is clean and no repository file moved.
- Read the trading code against the paper's plan table line by line, because the brief asked what the runner wires and because that is where a correct model can still trade the wrong play.

## Alternatives I considered and did not take

- Re-deriving the chains independently (my own absorbing-chain code) instead of reusing `prime.py`. Rejected for the decision numbers: the module's chains already match two independent Monte Carlos and the real-path control, and an independent derivation would cost hours to buy a check the repository has. I used independent arithmetic only where the module has no hook (the refusal readings, the aside boundary).
- Replaying the broker for the 7-trade clock or the account-rules parity. Rejected by the brief: no uncached broker replay, and the memory left no room for it. Stated as the fix instead.
- A fresh-context second opinion on the framing. Not run: a second model process would have breached the one-process and memory constraints while the scans ran. The verdicts rest on executed numbers, not on my reading alone, and the one place where same-context judgement carries weight, the ranking of severity, is labelled as mine.
- Treating the plateau pick as a bug. Rejected: the code does what the notebook says; the paper's description is incomplete. Filed as a paper-to-code finding, not a defect.

## What I chose not to examine, and why

- Notebook sections 1-23 beyond their modules: superseded by sections 24-26 for the deployed decision, and their numbers (pass rates at 60 pips, Maven, the hedge, the instrument ranking, GARCH) do not enter the gate, the pick or the front.
- The real-path control (`fxcontrol.assess`) and the walk-forward: used only as corroboration of the pace mapping through the paper's own table; rerunning them was not needed for any decision.
- The news battery replays and the live venue conformance: cached results read, not rerun; the aside rate's level is the firm's calendar question, and the audit shows it cannot open the gate alone whatever the level.
- The $3,000 tier and the $1,000 wallet: fixed by the operator in the brief; the ruin cap at one account reads 0.5%, so no stress was needed.
- The strict daily-loss reading, the firm's honour conduct and the floor on review: unverifiable from here; the floor reading is in the table because it is cheap on the chain, the other two are stated as open.
- `make_numbers.py` and the notebook were not executed, per the brief.
