{
  "$schema": "https://sous.pras.ai/schema/v0/schedule.schema.json",
  "sous_version": "0.7.0",
  "recipe": "sous.example/beef-bourguignon",
  "kitchen": "sous.example/home-kitchen",
  "title": "Beef Bourguignon",
  "servings": 6,
  "feasible": true,
  "origin": "makespan",
  "makespan_s": 16830,
  "serial_s": 17930,
  "equipment": [
    {
      "id": "pot",
      "class": "heated_vessel",
      "label": "Dutch oven or large saucepan",
      "instance": "small_pan",
      "attributes": {
        "capacity": {
          "value": 5.5,
          "unit": "L"
        },
        "surface_area": {
          "value": 0.05,
          "unit": "m2"
        },
        "lidded": true,
        "thermal_mass": "high"
      }
    },
    {
      "id": "string",
      "class": "wrapping",
      "label": "kitchen string",
      "instance": "string"
    },
    {
      "id": "bowl",
      "class": "vessel",
      "label": "holding bowl",
      "instance": "bowl",
      "attributes": {
        "capacity": {
          "value": 2,
          "unit": "L"
        }
      }
    },
    {
      "id": "board",
      "class": "cutting_surface",
      "label": "cutting board",
      "instance": "board",
      "attributes": {
        "area": {
          "value": 0.12,
          "unit": "m2"
        }
      }
    }
  ],
  "tasks": [
    {
      "id": "t_preheat_pot",
      "op": "preheat",
      "source": "recipe",
      "start_s": 0,
      "end_s": 600,
      "duration_s": 600,
      "duration_source": "until",
      "attended": 0.0,
      "equipment": [
        "small_pan"
      ],
      "resources": {
        "eq:small_pan": 1
      },
      "in": "pot",
      "params": {
        "setpoint": {
          "kind": "exact",
          "value": 220,
          "unit": "Cel"
        }
      },
      "heat": {
        "setpoint": {
          "kind": "exact",
          "value": 220,
          "unit": "Cel"
        },
        "setpoint_source": "recipe"
      },
      "until": {
        "any_of": [
          {
            "observable": "equipment_temperature",
            "comparison": "at_least",
            "value": 220,
            "unit": "Cel"
          }
        ],
        "max_duration": {
          "max": 10,
          "unit": "min"
        }
      },
      "observables_required": [
        {
          "observable": "equipment_temperature"
        }
      ],
      "hazards": [
        "hot_surface"
      ],
      "text": "Set the pot over high heat until it is hot enough to sear.",
      "critical": true,
      "slack_s": 0
    },
    {
      "id": "t_split_wine",
      "op": "portion",
      "source": "recipe",
      "start_s": 0,
      "end_s": 60,
      "duration_s": 60,
      "duration_source": "operation",
      "attended": 0.9,
      "attention_visits": {
        "count": 1,
        "each_s": 30,
        "every_s": 33,
        "at_s": [
          0
        ]
      },
      "resources": {
        "cook": 0.9
      },
      "consumes": [
        {
          "id": "wine",
          "kind": "ingredient",
          "substance": {
            "ref": "foodon:03310272",
            "label": "red wine"
          },
          "state": {
            "form": "liquid"
          },
          "quantity": {
            "kind": "range",
            "min": 480,
            "max": 960,
            "unit": "mL",
            "display": "2-4 cups of red wine"
          }
        }
      ],
      "produces": [
        {
          "id": "wine_deglaze"
        },
        {
          "id": "wine_braise"
        }
      ],
      "params": {
        "split": [
          {
            "output": "wine_deglaze",
            "fraction": 0.44
          },
          {
            "output": "wine_braise",
            "fraction": 0.56
          }
        ]
      },
      "text": "Divide the wine.",
      "critical": false,
      "slack_s": 3420
    },
    {
      "id": "t_bundle",
      "op": "bundle",
      "source": "recipe",
      "start_s": 60,
      "end_s": 120,
      "duration_s": 60,
      "duration_source": "operation",
      "attended": 0.9,
      "attention_visits": {
        "count": 1,
        "each_s": 30,
        "every_s": 33,
        "at_s": [
          60
        ]
      },
      "equipment": [
        "string"
      ],
      "resources": {
        "cook": 0.9,
        "eq:string": 1
      },
      "consumes": [
        {
          "id": "thyme",
          "kind": "ingredient",
          "substance": {
            "ref": "foodon:00002312",
            "label": "thyme"
          },
          "state": {
            "form": "whole"
          },
          "quantity": {
            "kind": "count",
            "count": 4,
            "unit": "{sprig}"
          }
        },
        {
          "id": "rosemary",
          "kind": "ingredient",
          "substance": {
            "ref": "foodon:00002212",
            "label": "rosemary"
          },
          "state": {
            "form": "whole"
          },
          "quantity": {
            "kind": "count",
            "count": 2,
            "unit": "{sprig}"
          }
        },
        {
          "id": "basil",
          "kind": "ingredient",
          "substance": {
            "ref": "foodon:00003044",
            "label": "basil"
          },
          "state": {
            "form": "whole"
          },
          "quantity": {
            "kind": "count",
            "count": 4,
            "unit": "{sprig}"
          }
        }
      ],
      "produces": [
        {
          "id": "bouquet",
          "label": "bouquet garni",
          "state": {
            "containment": "wrapped"
          }
        }
      ],
      "text": "Tie the basil, rosemary and thyme together with string.",
      "critical": false,
      "slack_s": 4080
    },
    {
      "id": "t_cut_beef",
      "op": "cut",
      "source": "recipe",
      "start_s": 120,
      "end_s": 240,
      "duration_s": 120,
      "duration_source": "operation",
      "attended": 0.9,
      "attention_visits": {
        "count": 3,
        "each_s": 30,
        "every_s": 33,
        "at_s": [
          120,
          153,
          186
        ]
      },
      "equipment": [
        "board"
      ],
      "resources": {
        "cook": 0.9,
        "eq:board": 1
      },
      "consumes": [
        {
          "id": "beef",
          "kind": "ingredient",
          "substance": {
            "ref": "foodon:02000045",
            "label": "beef chuck",
            "variety": "blade steak or stewing shoulder"
          },
          "state": {
            "form": "whole",
            "doneness": "raw",
            "thermal": "chilled"
          },
          "quantity": {
            "kind": "exact",
            "value": 1000,
            "unit": "g",
            "basis": "as_purchased",
            "display": "1 kg"
          },
          "mass_g": 1000
        }
      ],
      "produces": [
        {
          "id": "beef_chunks",
          "state": {
            "form": "chunked"
          },
          "mass_g": 1000.0
        }
      ],
      "params": {
        "form": "chunked",
        "dimension": {
          "value": 5,
          "unit": "cm"
        }
      },
      "hazards": [
        "blade"
      ],
      "text": "Cut beef into large, 5 cm chunks.",
      "critical": false,
      "slack_s": 340
    },
    {
      "id": "t_season_beef",
      "op": "season",
      "source": "recipe",
      "start_s": 240,
      "end_s": 260,
      "duration_s": 20,
      "duration_source": "operation",
      "attended": 0.9,
      "resources": {
        "cook": 0.9
      },
      "consumes": [
        {
          "id": "beef_chunks",
          "kind": "intermediate",
          "from_task": "t_cut_beef",
          "state": {
            "form": "chunked"
          },
          "mass_g": 1000.0
        },
        {
          "id": "salt",
          "kind": "ingredient",
          "substance": {
            "ref": "foodon:00002250",
            "label": "salt"
          },
          "quantity": {
            "kind": "to_taste",
            "seed": {
              "kind": "exact",
              "value": 12,
              "unit": "g"
            }
          }
        },
        {
          "id": "pepper",
          "kind": "ingredient",
          "substance": {
            "ref": "foodon:00001650",
            "label": "black pepper"
          },
          "state": {
            "form": "ground"
          },
          "quantity": {
            "kind": "to_taste",
            "seed": {
              "kind": "exact",
              "value": 3,
              "unit": "g"
            }
          }
        },
        {
          "id": "olive_oil",
          "kind": "ingredient",
          "substance": {
            "ref": "foodon:03301826",
            "label": "olive oil"
          },
          "state": {
            "form": "liquid"
          },
          "quantity": {
            "kind": "as_needed",
            "condition": "to_coat",
            "target": "beef",
            "max": {
              "kind": "exact",
              "value": 60,
              "unit": "mL"
            }
          }
        }
      ],
      "produces": [
        {
          "id": "beef_seasoned",
          "state": {
            "surface": [
              "seasoned",
              "oiled"
            ],
            "hydration": "dry"
          },
          "mass_g": 1000.0
        }
      ],
      "after": [
        "t_cut_beef"
      ],
      "text": "Season with salt, pepper and olive oil.",
      "critical": false,
      "slack_s": 340
    },
    {
      "id": "prep_0_peel",
      "op": "peel",
      "source": "prep",
      "start_s": 260,
      "end_s": 380,
      "duration_s": 120,
      "duration_source": "operation",
      "attended": 0.9,
      "attention_visits": {
        "count": 3,
        "each_s": 30,
        "every_s": 33,
        "at_s": [
          260,
          293,
          326
        ]
      },
      "resources": {
        "cook": 0.9
      },
      "subject": {
        "id": "onion",
        "kind": "ingredient",
        "substance": {
          "ref": "sous:onion_peeled",
          "label": "onion (peeled)"
        },
        "state": {
          "form": "chopped"
        },
        "quantity": {
          "kind": "count",
          "count": 3,
          "unit": "{each}",
          "size_class": "large",
          "mass_equivalent": {
            "value": 600,
            "unit": "g",
            "tolerance": 0.3,
            "source": "vocabulary"
          },
          "basis": "as_purchased",
          "display": "3 large onions, chopped"
        },
        "mass_g": 600
      },
      "hazards": [
        "blade"
      ],
      "text": "peel: onion (peeled)",
      "critical": false,
      "slack_s": 1900
    },
    {
      "id": "prep_1_cut_chopped",
      "op": "cut",
      "source": "prep",
      "start_s": 380,
      "end_s": 500,
      "duration_s": 120,
      "duration_source": "operation",
      "attended": 0.9,
      "attention_visits": {
        "count": 3,
        "each_s": 30,
        "every_s": 33,
        "at_s": [
          380,
          413,
          446
        ]
      },
      "resources": {
        "cook": 0.9
      },
      "subject": {
        "id": "onion",
        "kind": "ingredient",
        "substance": {
          "ref": "sous:onion_peeled",
          "label": "onion (peeled)"
        },
        "state": {
          "form": "chopped"
        },
        "quantity": {
          "kind": "count",
          "count": 3,
          "unit": "{each}",
          "size_class": "large",
          "mass_equivalent": {
            "value": 600,
            "unit": "g",
            "tolerance": 0.3,
            "source": "vocabulary"
          },
          "basis": "as_purchased",
          "display": "3 large onions, chopped"
        },
        "mass_g": 600
      },
      "after": [
        "prep_0_peel"
      ],
      "hazards": [
        "blade"
      ],
      "text": "cut chopped: onion (peeled)",
      "critical": false,
      "slack_s": 1900
    },
    {
      "id": "t_sear",
      "op": "sear",
      "source": "recipe",
      "start_s": 600,
      "end_s": 2400,
      "duration_s": 1800,
      "duration_source": "batched",
      "attended": 1.0,
      "batches": 3,
      "equipment": [
        "small_pan"
      ],
      "resources": {
        "cook": 1.0,
        "eq:small_pan": 1
      },
      "consumes": [
        {
          "id": "beef_seasoned",
          "kind": "intermediate",
          "from_task": "t_season_beef",
          "state": {
            "surface": [
              "seasoned",
              "oiled"
            ],
            "hydration": "dry"
          },
          "mass_g": 1000.0
        }
      ],
      "produces": [
        {
          "id": "beef_seared",
          "label": "seared beef",
          "state": {
            "browning": "deep_brown",
            "doneness": "raw"
          },
          "mass_g": 850.0
        }
      ],
      "after": [
        "t_preheat_pot",
        "t_season_beef"
      ],
      "in": "pot",
      "heat": {
        "level": "high",
        "level_source": "task",
        "setpoint": {
          "kind": "exact",
          "value": 240,
          "unit": "Cel"
        },
        "setpoint_source": "kitchen"
      },
      "until": {
        "any_of": [
          {
            "observable": "facet",
            "facet": "browning",
            "value": "deep_brown",
            "comparison": "at_least"
          }
        ],
        "max_duration": {
          "max": 10,
          "unit": "min"
        },
        "on_timeout": "proceed"
      },
      "observables_required": [
        {
          "observable": "facet",
          "facet": "browning"
        }
      ],
      "hazards": [
        "hot_surface",
        "spatter"
      ],
      "text": "Cook beef a small amount at a time until golden brown on the outside.",
      "critical": true,
      "slack_s": 0
    },
    {
      "id": "t_hold_beef",
      "op": "hold",
      "source": "recipe",
      "start_s": 2400,
      "end_s": 3000,
      "duration_s": 600,
      "duration_source": "operation",
      "attended": 0.0,
      "equipment": [
        "bowl"
      ],
      "resources": {
        "eq:bowl": 1
      },
      "consumes": [
        {
          "id": "beef_seared",
          "kind": "intermediate",
          "from_task": "t_sear",
          "label": "seared beef",
          "state": {
            "browning": "deep_brown",
            "doneness": "raw"
          },
          "mass_g": 850.0
        }
      ],
      "produces": [
        {
          "id": "beef_held",
          "label": "reserved beef",
          "mass_g": 850.0
        }
      ],
      "after": [
        "t_sear"
      ],
      "timing": {
        "max_hold": {
          "max": 90,
          "unit": "min"
        }
      },
      "in": "bowl",
      "control_points": [
        {
          "task": "t_hold_beef",
          "type": "control",
          "condition": {
            "observable": "elapsed",
            "duration": {
              "max": 90,
              "unit": "min"
            }
          },
          "rationale": "Seared but raw beef held at ambient temperature sits in the food-safety danger zone.",
          "on_failure": "escalate"
        }
      ],
      "text": "Remove each portion as it's done and set aside.",
      "critical": false,
      "slack_s": 1200
    },
    {
      "id": "t_sweat",
      "op": "saute",
      "source": "recipe",
      "start_s": 2400,
      "end_s": 3300,
      "duration_s": 900,
      "duration_source": "until",
      "attended": 0.25,
      "attention_visits": {
        "count": 7,
        "each_s": 30,
        "every_s": 120,
        "at_s": [
          2400,
          2520,
          2640,
          2760,
          2880,
          3000,
          3120
        ]
      },
      "equipment": [
        "small_pan"
      ],
      "resources": {
        "cook": 0.25,
        "eq:small_pan": 1
      },
      "consumes": [
        {
          "id": "onion",
          "kind": "ingredient",
          "substance": {
            "ref": "sous:onion_peeled",
            "label": "onion (peeled)"
          },
          "state": {
            "form": "chopped"
          },
          "quantity": {
            "kind": "count",
            "count": 3,
            "unit": "{each}",
            "size_class": "large",
            "mass_equivalent": {
              "value": 600,
              "unit": "g",
              "tolerance": 0.3,
              "source": "vocabulary"
            },
            "basis": "as_purchased",
            "display": "3 large onions, chopped"
          },
          "mass_g": 600
        },
        {
          "id": "garlic",
          "kind": "ingredient",
          "substance": {
            "ref": "sous:garlic_peeled",
            "label": "garlic (peeled)"
          },
          "state": {
            "form": "minced"
          },
          "quantity": {
            "kind": "range",
            "min": 1,
            "max": 2,
            "unit": "{clove}",
            "display": "1-2 cloves of garlic"
          }
        }
      ],
      "produces": [
        {
          "id": "aromatics",
          "label": "browned onion and garlic",
          "mass_g": 450.0
        }
      ],
      "after": [
        "prep_1_cut_chopped",
        "t_sear"
      ],
      "in": "pot",
      "heat": {
        "level": "medium",
        "level_source": "task",
        "setpoint": {
          "kind": "exact",
          "value": 165,
          "unit": "Cel"
        },
        "setpoint_source": "kitchen"
      },
      "until": {
        "any_of": [
          {
            "observable": "facet",
            "facet": "browning",
            "value": "golden_brown",
            "comparison": "at_least"
          }
        ],
        "max_duration": {
          "max": 15,
          "unit": "min"
        },
        "on_timeout": "proceed"
      },
      "observables_required": [
        {
          "observable": "facet",
          "facet": "browning"
        }
      ],
      "hazards": [
        "hot_surface",
        "spatter"
      ],
      "text": "Add onions and garlic to the same pot and cook till golden brown.",
      "critical": true,
      "slack_s": 0
    },
    {
      "id": "t_flour",
      "op": "coat",
      "source": "recipe",
      "start_s": 3300,
      "end_s": 3480,
      "duration_s": 180,
      "duration_source": "task",
      "attended": 0.9,
      "attention_visits": {
        "count": 5,
        "each_s": 30,
        "every_s": 33,
        "at_s": [
          3300,
          3333,
          3366,
          3399,
          3432
        ]
      },
      "equipment": [
        "small_pan"
      ],
      "resources": {
        "cook": 0.9,
        "eq:small_pan": 1
      },
      "consumes": [
        {
          "id": "aromatics",
          "kind": "intermediate",
          "from_task": "t_sweat",
          "label": "browned onion and garlic",
          "mass_g": 450.0
        },
        {
          "id": "flour",
          "kind": "ingredient",
          "substance": {
            "ref": "foodon:00001210",
            "label": "all-purpose flour"
          },
          "state": {
            "form": "ground",
            "hydration": "dry"
          },
          "quantity": {
            "kind": "exact",
            "value": 16,
            "unit": "g",
            "display": "2 tablespoons of flour"
          },
          "mass_g": 16
        }
      ],
      "produces": [
        {
          "id": "roux_base",
          "label": "floured aromatics",
          "mass_g": 466.0
        }
      ],
      "after": [
        "t_sweat"
      ],
      "in": "pot",
      "params": {
        "coating": "floured"
      },
      "text": "Sprinkle with 2 tablespoons of flour. Cook a few minutes longer.",
      "critical": true,
      "slack_s": 0
    },
    {
      "id": "t_deglaze",
      "op": "deglaze",
      "source": "recipe",
      "start_s": 3480,
      "end_s": 3600,
      "duration_s": 120,
      "duration_source": "operation",
      "attended": 1.0,
      "equipment": [
        "small_pan"
      ],
      "resources": {
        "cook": 1.0,
        "eq:small_pan": 1
      },
      "consumes": [
        {
          "id": "wine_deglaze",
          "kind": "intermediate",
          "from_task": "t_split_wine"
        },
        {
          "id": "roux_base",
          "kind": "intermediate",
          "from_task": "t_flour",
          "label": "floured aromatics",
          "mass_g": 466.0
        }
      ],
      "produces": [
        {
          "id": "wine_base",
          "label": "deglazed wine base",
          "mass_g": 466.0
        }
      ],
      "after": [
        "t_flour",
        "t_split_wine"
      ],
      "in": "pot",
      "hazards": [
        "steam",
        "hot_liquid",
        "alcohol_vapour"
      ],
      "text": "Add 1-2 cups of red wine.",
      "critical": true,
      "slack_s": 0
    },
    {
      "id": "t_boil_wine",
      "op": "boil",
      "source": "recipe",
      "start_s": 3600,
      "end_s": 4200,
      "duration_s": 600,
      "duration_source": "until",
      "attended": 0.0,
      "equipment": [
        "small_pan"
      ],
      "resources": {
        "eq:small_pan": 1
      },
      "consumes": [
        {
          "id": "wine_base",
          "kind": "intermediate",
          "from_task": "t_deglaze",
          "label": "deglazed wine base",
          "mass_g": 466.0
        }
      ],
      "produces": [
        {
          "id": "wine_reduced",
          "mass_g": 466.0
        }
      ],
      "after": [
        "t_deglaze"
      ],
      "in": "pot",
      "until": {
        "any_of": [
          {
            "observable": "elapsed",
            "duration": {
              "target": 5,
              "unit": "min"
            }
          }
        ],
        "max_duration": {
          "max": 10,
          "unit": "min"
        }
      },
      "observables_required": [
        {
          "observable": "elapsed"
        }
      ],
      "hazards": [
        "hot_liquid",
        "steam"
      ],
      "text": "Bring wine to a boil then simmer for 5 minutes.",
      "critical": true,
      "slack_s": 0
    },
    {
      "id": "t_charge",
      "op": "transfer",
      "source": "recipe",
      "start_s": 4200,
      "end_s": 4230,
      "duration_s": 30,
      "duration_source": "operation",
      "attended": 0.9,
      "equipment": [
        "small_pan"
      ],
      "resources": {
        "cook": 0.9,
        "eq:small_pan": 1
      },
      "consumes": [
        {
          "id": "beef_held",
          "kind": "intermediate",
          "from_task": "t_hold_beef",
          "label": "reserved beef",
          "mass_g": 850.0
        },
        {
          "id": "carrot",
          "kind": "ingredient",
          "substance": {
            "ref": "foodon:03311673",
            "label": "carrot root (peeled)"
          },
          "state": {
            "form": "chopped"
          },
          "quantity": {
            "kind": "exact",
            "value": 300,
            "unit": "g",
            "basis": "as_prepared",
            "display": "300 g of chopped carrot"
          },
          "mass_g": 300
        },
        {
          "id": "mushroom",
          "kind": "ingredient",
          "substance": {
            "ref": "foodon:00003528",
            "label": "button mushroom"
          },
          "state": {
            "form": "whole"
          },
          "quantity": {
            "kind": "exact",
            "value": 300,
            "unit": "g",
            "basis": "as_purchased"
          },
          "mass_g": 300
        },
        {
          "id": "bouquet",
          "kind": "intermediate",
          "from_task": "t_bundle",
          "label": "bouquet garni",
          "state": {
            "containment": "wrapped"
          }
        },
        {
          "id": "wine_reduced",
          "kind": "intermediate",
          "from_task": "t_boil_wine",
          "mass_g": 466.0
        },
        {
          "id": "wine_braise",
          "kind": "intermediate",
          "from_task": "t_split_wine"
        },
        {
          "id": "water",
          "kind": "ingredient",
          "substance": {
            "ref": "chebi:15377",
            "label": "water"
          },
          "state": {
            "form": "liquid"
          },
          "quantity": {
            "kind": "as_needed",
            "condition": "to_cover",
            "target": "braise_charge",
            "max": {
              "kind": "exact",
              "value": 1500,
              "unit": "mL"
            },
            "display": "water (enough to cover the meat and vegetables)"
          }
        }
      ],
      "produces": [
        {
          "id": "braise_charge",
          "label": "assembled braise",
          "mass_g": 1916.0
        }
      ],
      "after": [
        "t_boil_wine",
        "t_bundle",
        "t_hold_beef"
      ],
      "in": "pot",
      "params": {
        "mode": "tip",
        "destination": "pot"
      },
      "hazards": [
        "hot_liquid",
        "spill"
      ],
      "text": "Add beef, carrots, herbs and mushrooms, then another couple cups of red wine and water enough to cover.",
      "critical": true,
      "slack_s": 0
    },
    {
      "id": "t_braise",
      "op": "braise",
      "source": "recipe",
      "start_s": 4230,
      "end_s": 16830,
      "duration_s": 12600,
      "duration_source": "until",
      "attended": 0.05,
      "attention_visits": {
        "count": 7,
        "each_s": 30,
        "every_s": 1800,
        "at_s": [
          4230,
          6030,
          7830,
          9630,
          11430,
          13230,
          15030
        ]
      },
      "equipment": [
        "small_pan"
      ],
      "resources": {
        "cook": 0.05,
        "eq:small_pan": 1
      },
      "consumes": [
        {
          "id": "braise_charge",
          "kind": "intermediate",
          "from_task": "t_charge",
          "label": "assembled braise",
          "mass_g": 1916.0
        }
      ],
      "produces": [
        {
          "id": "bourguignon",
          "label": "finished bourguignon",
          "state": {
            "doneness": "well_done",
            "texture": "tender"
          },
          "mass_g": 1628.6
        },
        {
          "id": "spent_bouquet",
          "label": "spent bouquet garni",
          "mass_g": 1628.6
        }
      ],
      "after": [
        "t_charge"
      ],
      "in": "pot",
      "params": {
        "covered": true
      },
      "heat": {
        "level": "low",
        "level_source": "task",
        "setpoint": {
          "kind": "exact",
          "value": 90,
          "unit": "Cel"
        },
        "setpoint_source": "kitchen"
      },
      "until": {
        "all_of": [
          {
            "observable": "facet",
            "facet": "texture",
            "value": "tender",
            "comparison": "at_least"
          },
          {
            "observable": "elapsed",
            "duration": {
              "min": 120,
              "unit": "min"
            }
          }
        ],
        "max_duration": {
          "max": 210,
          "unit": "min"
        },
        "on_timeout": "escalate"
      },
      "observables_required": [
        {
          "observable": "facet",
          "facet": "texture"
        },
        {
          "observable": "elapsed"
        }
      ],
      "concurrent_actions": [
        {
          "op": "mix",
          "frequency": "occasional",
          "interval": {
            "target": 30,
            "unit": "min"
          },
          "note": "stirring occasionally"
        },
        {
          "op": "skim",
          "frequency": "as_required",
          "note": "Remove surface scum as required."
        }
      ],
      "control_points": [
        {
          "task": "t_braise",
          "type": "critical",
          "condition": {
            "observable": "internal_temperature",
            "comparison": "at_least",
            "value": 75,
            "unit": "Cel",
            "site": "centre of a beef chunk"
          },
          "rationale": "Whole-muscle beef braised for hours far exceeds this, but the control point must be stated so an executor can verify rather than assume.",
          "on_failure": "continue_cooking"
        }
      ],
      "hazards": [
        "hot_liquid",
        "hot_surface"
      ],
      "text": "Cook for 2-3 hours, stirring occasionally. Remove surface scum as required.",
      "critical": true,
      "slack_s": 0
    }
  ],
  "utilisation": {
    "cook": {
      "capacity": 1.0,
      "peak": 1.0,
      "mean": 0.203
    },
    "pool:hob": {
      "capacity": 2.0,
      "peak": 1.0,
      "mean": 1.0
    },
    "eq:small_pan": {
      "capacity": 1.0,
      "peak": 1.0,
      "mean": 1.0
    },
    "eq:string": {
      "capacity": 1.0,
      "peak": 1.0,
      "mean": 0.004
    },
    "eq:board": {
      "capacity": 1.0,
      "peak": 1.0,
      "mean": 0.007
    },
    "eq:bowl": {
      "capacity": 3.0,
      "peak": 1.0,
      "mean": 0.036
    }
  },
  "safety": {
    "allergens": {
      "declared": [
        "sulphite",
        "gluten"
      ],
      "may_contain": []
    },
    "hazards": [
      "hot_surface",
      "hot_liquid",
      "blade",
      "spatter",
      "alcohol_vapour"
    ]
  },
  "goal": {
    "serve": [
      {
        "material": "bourguignon",
        "vessel": "serving_vessel",
        "portions": 6,
        "temperature": "hot",
        "arrangement": [
          {
            "relation": "centred",
            "material": "bourguignon"
          }
        ],
        "on_the_side": []
      }
    ],
    "accompaniments": [
      {
        "substance": {
          "label": "crusty bread"
        },
        "optional": true
      },
      {
        "substance": {
          "label": "mashed potato"
        },
        "optional": true
      }
    ],
    "storage": {
      "make_ahead": true,
      "keeps_for": {
        "target": 3,
        "unit": "d"
      },
      "at": "chilled",
      "reheat": "Reheat gently to a simmer; the dish improves on the second day."
    }
  },
  "warnings": []
}
