make_tables - the analysis tables for a campaign, joined into one place.
python make_tables.py --design design/T2_design_v1.csv --results results/
Writes a single named artifact set into report/, default stem
`provisional_twin_map` (override with --name):
provisional_twin_map.md the report: what was run, model against
experiment, the sigma_model floor, and an
explicit statement of what is NOT included.
provisional_twin_map_runs.csv ONE ROW PER MODEL EVALUATION: identity,
every theta component, every observable,
the admissibility block, and provenance
hashes. The master table -- everything
else is a view of it. The .jsonl stores
only theta_hash, so this join against the
design file is what puts theta beside the
result it produced.
..._runs_admissible.csv the same, usable rows only.
..._observables.csv per observable per condition: model
p05/median/p95 over admissible rows
against the experimental band, with the
in-band fraction.
..._targets.csv the experimental table, standalone.
"PROVISIONAL" is meant literally: see the three exclusions below. This is a
map of where the model sits relative to the data under the current prior box,
not a calibrated twin.
WHAT THESE TABLES DO NOT CONTAIN, AND WHY
-----------------------------------------
1. RESULTS EXTRAPOLATED TO EXPERIMENTAL CONDITIONS. Deliberately absent. The
Tier-2 ensemble runs at d_LF = 0.1 dpa; the database is at 15-30 dpa. There
is no defensible closed-form extrapolation across that gap -- <100> loops in
this model have no size cap (loop->network is off and its P_ld is ~0 at these
loop sizes anyway), so a run that matches at 0.1 dpa keeps growing and any
naive scaling would be confidently wrong. Bridging LF to experimental
conditions is precisely the job of the multi-fidelity emulator (plan Tier 4,
surrogate.py + calibrate.py), which is not built. Emitting a column labelled
"extrapolated" before that exists would be inventing data.
2. POSTERIOR UNCERTAINTY. Also absent. Tier 2 produces SENSITIVITY (Sobol
S_i, S_i^T -- which parameters matter), not UNCERTAINTY (posterior spread on
theta given the data). What these tables can honestly show is the ENSEMBLE
SPREAD -- p05/median/p95 of each observable over the prior box -- which is a
prior-predictive spread, not a posterior. They are different quantities and
conflating them would overstate what the campaign knows.
3. sigma_model. The plan expects model error to dominate sigma_exp for f_100.
The convention spread IS computable here (f_100 is emitted at four TEM
cutoffs) and is reported as a floor on sigma_model, but the full model-error
term belongs to calibration.
make_tables.py — emit the verification tables from the campaign board.
python make_tables.py # markdown to stdout
python make_tables.py --latex # LaTeX bodies
python make_tables.py --out FILE # write markdown to FILE
This is plan S3.5's reporting helper. It reads the published records and
REFUSES to print a value from a run that missed its comparison dose (S3.4.1):
such a row appears in a "did not reach" line with the dose it achieved, never as
a metric. The rule is mechanical here rather than a matter of discipline.
Table 4 ships as the NO-COARSENING variant. The production-configuration exact
arm was attempted three times and abandoned each time (see S3 note below); the
NC variant is the one where both arms provably solve identical equations, which
is what a verification table requires.