A recipe file is the bare Recipe JSON document — no wrapper, no desktop-app-specific
envelope. It is exactly what sensym generate <recipe.json> already reads on the command line
(see the CLI reference), so a recipe saved from the desktop app opens correctly from
the CLI, and a recipe written by the CLI's own test fixtures opens correctly in the desktop app.
There is one format, not two that happen to agree today.
Saving and opening#
The toolbar carries three controls:
- Save writes to the file currently open, or behaves like Save As if nothing is open yet.
- Save As… always prompts for a destination, defaulting to your Settings-configured project
library (
storage.project_library,~/Documents/SenSym Data Factoryunless you changed it). - Open… reads and validates a file the same way
settings.importvalidates a settings profile: a malformed or invalid recipe raises a real, structured, field-by-field error, and nothing about the working recipe changes until the read succeeds. If the current recipe has unsaved changes, a confirmation dialog appears first — the same guard Scenario Mode's own Apply uses before replacing the working recipe.
Why JSON, and why no second format#
cli.py's own rule is that this layer must never add a dependency, and a recipe is already a
pydantic model with a real JSON Schema (sensym schema prints it) — no YAML, no proprietary
container, nothing an editor can't already validate against a schema it already understands.
Editing outside the app#
Because a recipe file is just JSON, sensym schema gives any editor with JSON Schema support
real autocompletion over the exact same shape the desktop app edits. Hand edits are read back
by the same recipe.open validation path as a desktop-app save, so anything a hand edit gets
wrong is reported before it can silently produce a different dataset than you meant to build.
