Phase 0, task 0.2 — see docs/studio/plan/PHASE_0.md. This is a review gate: nothing is built on top of studio/schema until it is reviewed and merged.
Scope
SciField(unit=…, range=…, provenance=…, cite=…, derived_from=[…]) over Field(json_schema_extra=…).
- Minimum-viable
RunConfig covering exactly what the Phase-0 slice needs — resist modelling stages 4–7 fully before anything runs.
RunSet + axes (GRID / ZIP / LIST) from day one. N = 1 is a RunSet with zero axes; there is no separate single-run code path. Bolting sweeps on later would mean rewriting the config layer, the results schema and the comparison views.
- Canonical JSON serialisation → stable SHA-256, with hash stability tested across dict insertion order and across Python versions. A drifting hash silently invalidates every cache and fixture (ADR-006).
- JSON Schema export; round-trip tests.
- Field
provenance populated from the sources that already exist: TABLE_microphysics_parameters.md, TABLE_dilution_parameters.md, and the CoupledScenario docstrings.
Acceptance
- Every field carries unit, range, description, default and provenance — enforced by a test, not by review attention.
- The schema is a faithful superset of what
run_ensemble.build_scenario() sets for case 30N_20km__sabr220__D2med__a1p0__nuc1__cg1. The field-for-field equivalence proof itself is task 0.4; this task must not make it impossible.
- No physics computed here. Derived fields are declared with
derived_from and left unresolved — the DAG engine is 0.3 and the derivations are 0.5.
studio.schema still imports nothing from coupled, JAX, the database or the web layer.
Base branch: studio/dev.
Phase 0, task 0.2 — see
docs/studio/plan/PHASE_0.md. This is a review gate: nothing is built on top ofstudio/schemauntil it is reviewed and merged.Scope
SciField(unit=…, range=…, provenance=…, cite=…, derived_from=[…])overField(json_schema_extra=…).RunConfigcovering exactly what the Phase-0 slice needs — resist modelling stages 4–7 fully before anything runs.RunSet+ axes (GRID/ZIP/LIST) from day one. N = 1 is a RunSet with zero axes; there is no separate single-run code path. Bolting sweeps on later would mean rewriting the config layer, the results schema and the comparison views.provenancepopulated from the sources that already exist:TABLE_microphysics_parameters.md,TABLE_dilution_parameters.md, and theCoupledScenariodocstrings.Acceptance
run_ensemble.build_scenario()sets for case30N_20km__sabr220__D2med__a1p0__nuc1__cg1. The field-for-field equivalence proof itself is task 0.4; this task must not make it impossible.derived_fromand left unresolved — the DAG engine is 0.3 and the derivations are 0.5.studio.schemastill imports nothing fromcoupled, JAX, the database or the web layer.Base branch:
studio/dev.