Recipe files

Saving, opening, and why there is only one recipe format, shared with the CLI.

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, Save As, Open, next to Undo/Redo and the validation status badge

  • 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 Factory unless you changed it).
  • Open… reads and validates a file the same way settings.import validates 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.