Sous

An executable recipe format.

Sous is an open, machine-readable format for recipes that a kitchen orchestration system can execute, not merely display. It is built on one idea that no existing recipe format has: an ingredient's state is separate from the procedure that produces it.

A recipe says it needs diced onion. Whether that comes from a bag of pre-diced onion or from a knife and a whole onion is a planning question, not a recipe fact.

"requires": [
  { "id": "onion",
    "substance": { "ref": "foodon:03316347", "label": "onion" },
    "state":     { "form": "diced", "integrity": ["peeled"] },   // WHAT is needed
    "quantity":  { "kind": "exact", "value": 500, "unit": "g" } }
]                                                                // not HOW to get it

Give that recipe a kitchen with whole onions and the planner emits a cut. Give it a kitchen with pre-diced onions and the plan is empty. Same recipe, both times.

v0.1.0 — draft, unstable. The facet vocabulary is the highest-risk surface and needs validation against a much broader corpus before anything freezes. Read LIMITATIONS.md before building on this.

Schemas

These URIs are what $id and $schema fields point at. They are identifiers first and locations second — nothing in the toolchain dereferences them, since every cross-file $ref is relative and resolved against a local registry. They are served here for anyone who pastes one into a browser.

LayerNamespace URI
Recipe
Required states, a task network, a goal
https://psigen.github.io/sous/schema/v0/recipe.schema.json
Kitchen
Equipment and pantry — the planner's initial state
https://psigen.github.io/sous/schema/v0/kitchen.schema.json
Domain
Facets and operations — compiles to PDDL
https://psigen.github.io/sous/schema/v0/domain.schema.json
Common
Identifiers, quantities, state, conditions
https://psigen.github.io/sous/schema/v0/common/

The namespace is scoped to the major version, so additive 0.N → 0.N+1 releases do not rewrite the $id of every schema or the $schema line of every document in the wild.

Getting started

git clone https://github.com/psigen/sous
cd sous && pip install jsonschema

python3 tests/run_tests.py                       # the acceptance suite
python3 tools/sous_validate.py examples/*.sous.json
python3 tools/sous_to_pddl.py \
    examples/caramelized-onions.sous.json \
    examples/kitchens/home-whole-produce.sous-kitchen.json

Reading

SPEC.mdThe normative specification
SEMANTIC-RULES.mdConstraints JSON Schema cannot express
CONFORMANCE.mdWhat it means to implement Sous
SAFETY.mdAllergen derivation and critical control points
GOVERNANCE.mdVersioning and namespace policy
LIMITATIONS.mdKnown gaps and open problems
adr/Why JSON Schema over LinkML, why facets, why PDDL is a target