Summary
Add a top-level SystemSpec Pydantic model as a discriminated union of ExprSpec and TransitionsSpec, giving users a fully typed entry point to compile_spec().
Problem
After #20–28 create Pydantic models for every sub-structure (Axis, Transition, Mixing, etc.), nothing composes them into a top-level schema. compile_spec() still accepts dict[str, object] — users get no IDE autocompletion, no schema-level validation, and no clear documentation of the full spec shape.
Scope
- Define
ExprSpec model: state, equations, axes, aliases, kernels, operators, constraints, state_axes, meta
- Define
TransitionsSpec model: state, transitions, axes, aliases, kernels, operators, constraints, state_axes, meta
- Define
SystemSpec = ExprSpec | TransitionsSpec as discriminated union on presence of equations vs transitions
- Update
compile_spec() to accept SystemSpec | dict[str, object] (backward-compatible)
- Spec
kind field becomes optional — discrimination handles it
Notes
This naturally subsumes #41 (infer spec kind from contents): a discriminated union on equations vs transitions keys eliminates the need for an explicit kind field.
Dependencies
Should land after sub-model issues are resolved:
Related
Summary
Add a top-level
SystemSpecPydantic model as a discriminated union ofExprSpecandTransitionsSpec, giving users a fully typed entry point tocompile_spec().Problem
After #20–28 create Pydantic models for every sub-structure (Axis, Transition, Mixing, etc.), nothing composes them into a top-level schema.
compile_spec()still acceptsdict[str, object]— users get no IDE autocompletion, no schema-level validation, and no clear documentation of the full spec shape.Scope
ExprSpecmodel:state,equations,axes,aliases,kernels,operators,constraints,state_axes,metaTransitionsSpecmodel:state,transitions,axes,aliases,kernels,operators,constraints,state_axes,metaSystemSpec = ExprSpec | TransitionsSpecas discriminated union on presence ofequationsvstransitionscompile_spec()to acceptSystemSpec | dict[str, object](backward-compatible)kindfield becomes optional — discrimination handles itNotes
This naturally subsumes #41 (infer spec
kindfrom contents): a discriminated union onequationsvstransitionskeys eliminates the need for an explicitkindfield.Dependencies
Should land after sub-model issues are resolved:
ExpressionStringtype #22 (ExpressionString)Axispydantic model #23 (Axis)TransitionPydantic model #21 (Transition)Mixingpydantic model #24 (Mixing)ChainPydantic model #26 (Chain)StateAxesPydantic model #27 (StateAxes)OperatorPydantic model #28 (Operator)ConstraintPydantic model #58 (Constraint)NormalizedRhsmodel that is discriminated union ofExprRhsandTransitionsRhs#20 (NormalizedRhs discriminated union)Related