Phase 0, task 0.4 — see docs/studio/plan/PHASE_0.md.
Scope
to_scenario(RunConfig) -> CoupledScenario — the single conversion point, and the only package permitted to import coupled (ADR-001). Therefore also the single place unit conversion happens (ADR-003).
- The equivalence test.
to_scenario applied to a RunConfig describing case 30N_20km__sabr220__D2med__a1p0__nuc1__cg1 must produce a CoupledScenario field-for-field identical to run_ensemble.build_scenario() for that case. This is what proves the schema is a faithful superset before anything is run — cheaper and sharper than discovering it from a diverging result.
RunSummary — versioned reduced structure (schema_version, scalar time series, final size distribution, termination reason, flags, conservation-check residuals), written next to state.npz. Every array declares its wet-vs-dry basis. Comparison plots read this, never the raw npz.
Traps this package exists to contain
dp_mid_um / dNdlogDp are dry; SA / radius_cm are wet.
- Never reconstruct time as
i × DT — outer steps snap to the terminator (~592 s actual vs 600 s nominal). Use the stored t.
- Index gas species by name from the npz's own
species list, never by position.
DilutionRegime.CONSTANT maps to the model's "" — the one enum value that is not the model's own string.
Base branch: studio/dev.
Phase 0, task 0.4 — see
docs/studio/plan/PHASE_0.md.Scope
to_scenario(RunConfig) -> CoupledScenario— the single conversion point, and the only package permitted to importcoupled(ADR-001). Therefore also the single place unit conversion happens (ADR-003).to_scenarioapplied to aRunConfigdescribing case30N_20km__sabr220__D2med__a1p0__nuc1__cg1must produce aCoupledScenariofield-for-field identical torun_ensemble.build_scenario()for that case. This is what proves the schema is a faithful superset before anything is run — cheaper and sharper than discovering it from a diverging result.RunSummary— versioned reduced structure (schema_version, scalar time series, final size distribution, termination reason, flags, conservation-check residuals), written next tostate.npz. Every array declares its wet-vs-dry basis. Comparison plots read this, never the raw npz.Traps this package exists to contain
dp_mid_um/dNdlogDpare dry;SA/radius_cmare wet.i × DT— outer steps snap to the terminator (~592 s actual vs 600 s nominal). Use the storedt.specieslist, never by position.DilutionRegime.CONSTANTmaps to the model's""— the one enum value that is not the model's own string.Base branch:
studio/dev.