{
  "$schema": "https://sous.pras.ai/schema/v0/schedule.schema.json",
  "sous_version": "0.7.0",
  "recipe": "sous.example/caramelized-onions",
  "kitchen": "sous.example/home-whole-produce",
  "title": "Caramelized Onions",
  "servings": 4,
  "feasible": true,
  "origin": "makespan",
  "makespan_s": 4440,
  "serial_s": 4680,
  "equipment": [
    {
      "id": "pan",
      "class": "heated_vessel",
      "label": "wide saute pan",
      "instance": "hob_pan",
      "attributes": {
        "capacity": {
          "value": 3,
          "unit": "L"
        },
        "surface_area": {
          "value": 0.05,
          "unit": "m2"
        },
        "lidded": true
      }
    }
  ],
  "tasks": [
    {
      "id": "prep_0_peel",
      "op": "peel",
      "source": "prep",
      "start_s": 0,
      "end_s": 120,
      "duration_s": 120,
      "duration_source": "operation",
      "attended": 0.9,
      "attention_visits": {
        "count": 3,
        "each_s": 30,
        "every_s": 33,
        "at_s": [
          0,
          33,
          66
        ]
      },
      "resources": {
        "cook": 0.9
      },
      "subject": {
        "id": "onion",
        "kind": "ingredient",
        "substance": {
          "ref": "sous:onion_peeled",
          "label": "onion (peeled)"
        },
        "state": {
          "form": "diced",
          "doneness": "raw"
        },
        "quantity": {
          "kind": "exact",
          "value": 500,
          "unit": "g",
          "basis": "as_prepared"
        },
        "mass_g": 500
      },
      "hazards": [
        "blade"
      ],
      "text": "peel: onion (peeled)",
      "critical": false,
      "slack_s": 600
    },
    {
      "id": "t_preheat_pan",
      "op": "preheat",
      "source": "recipe",
      "start_s": 0,
      "end_s": 600,
      "duration_s": 600,
      "duration_source": "until",
      "attended": 0.0,
      "equipment": [
        "hob_pan"
      ],
      "resources": {
        "eq:hob_pan": 1
      },
      "in": "pan",
      "params": {
        "setpoint": {
          "kind": "exact",
          "value": 160,
          "unit": "Cel"
        }
      },
      "heat": {
        "setpoint": {
          "kind": "exact",
          "value": 160,
          "unit": "Cel"
        },
        "setpoint_source": "recipe"
      },
      "until": {
        "any_of": [
          {
            "observable": "equipment_temperature",
            "comparison": "at_least",
            "value": 160,
            "unit": "Cel"
          }
        ],
        "max_duration": {
          "max": 10,
          "unit": "min"
        }
      },
      "observables_required": [
        {
          "observable": "equipment_temperature"
        }
      ],
      "hazards": [
        "hot_surface"
      ],
      "text": "Set the pan over medium heat.",
      "critical": true,
      "slack_s": 0
    },
    {
      "id": "prep_1_cut_diced",
      "op": "cut",
      "source": "prep",
      "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
        ]
      },
      "resources": {
        "cook": 0.9
      },
      "subject": {
        "id": "onion",
        "kind": "ingredient",
        "substance": {
          "ref": "sous:onion_peeled",
          "label": "onion (peeled)"
        },
        "state": {
          "form": "diced",
          "doneness": "raw"
        },
        "quantity": {
          "kind": "exact",
          "value": 500,
          "unit": "g",
          "basis": "as_prepared"
        },
        "mass_g": 500
      },
      "after": [
        "prep_0_peel"
      ],
      "hazards": [
        "blade"
      ],
      "text": "cut diced: onion (peeled)",
      "critical": false,
      "slack_s": 600
    },
    {
      "id": "t_melt",
      "op": "melt",
      "source": "recipe",
      "start_s": 600,
      "end_s": 840,
      "duration_s": 240,
      "duration_source": "until",
      "attended": 0.25,
      "attention_visits": {
        "count": 2,
        "each_s": 30,
        "every_s": 120,
        "at_s": [
          600,
          720
        ]
      },
      "equipment": [
        "hob_pan"
      ],
      "resources": {
        "cook": 0.25,
        "eq:hob_pan": 1
      },
      "consumes": [
        {
          "id": "butter",
          "kind": "ingredient",
          "substance": {
            "ref": "foodon:03310351",
            "label": "butter"
          },
          "state": {
            "form": "whole"
          },
          "quantity": {
            "kind": "exact",
            "value": 30,
            "unit": "g"
          },
          "mass_g": 30
        }
      ],
      "produces": [
        {
          "id": "melted_butter",
          "state": {
            "form": "liquid"
          },
          "mass_g": 30.0
        }
      ],
      "after": [
        "t_preheat_pan"
      ],
      "in": "pan",
      "heat": {
        "level": "medium",
        "level_source": "task",
        "setpoint": {
          "kind": "exact",
          "value": 165.0,
          "unit": "Cel"
        },
        "setpoint_band_c": [
          150,
          180
        ],
        "setpoint_source": "vocabulary"
      },
      "until": {
        "any_of": [
          {
            "observable": "facet",
            "facet": "form",
            "value": "liquid",
            "comparison": "exactly"
          }
        ],
        "max_duration": {
          "max": 4,
          "unit": "min"
        }
      },
      "observables_required": [
        {
          "observable": "facet",
          "facet": "form"
        }
      ],
      "hazards": [
        "hot_surface",
        "scorching"
      ],
      "text": "Melt the butter in a wide pan over medium heat.",
      "critical": true,
      "slack_s": 0
    },
    {
      "id": "t_caramelize",
      "op": "saute",
      "source": "recipe",
      "start_s": 840,
      "end_s": 4440,
      "duration_s": 3600,
      "duration_source": "until",
      "attended": 0.05,
      "attention_visits": {
        "count": 12,
        "each_s": 30,
        "every_s": 300,
        "at_s": [
          840,
          1140,
          1440,
          1740,
          2040,
          2340,
          2640,
          2940,
          3240,
          3540,
          3840,
          4140
        ]
      },
      "equipment": [
        "hob_pan"
      ],
      "resources": {
        "cook": 0.05,
        "eq:hob_pan": 1
      },
      "consumes": [
        {
          "id": "onion",
          "kind": "ingredient",
          "substance": {
            "ref": "sous:onion_peeled",
            "label": "onion (peeled)"
          },
          "state": {
            "form": "diced",
            "doneness": "raw"
          },
          "quantity": {
            "kind": "exact",
            "value": 500,
            "unit": "g",
            "basis": "as_prepared"
          },
          "mass_g": 500
        },
        {
          "id": "melted_butter",
          "kind": "intermediate",
          "from_task": "t_melt",
          "state": {
            "form": "liquid"
          },
          "mass_g": 30.0
        },
        {
          "id": "salt",
          "kind": "ingredient",
          "substance": {
            "ref": "foodon:00002250",
            "label": "salt"
          },
          "quantity": {
            "kind": "to_taste",
            "seed": {
              "kind": "exact",
              "value": 3,
              "unit": "g"
            }
          }
        }
      ],
      "produces": [
        {
          "id": "caramelized",
          "label": "caramelized onions",
          "state": {
            "browning": "caramelized",
            "texture": "soft",
            "doneness": "cooked_through"
          },
          "mass_g": 397.5
        }
      ],
      "after": [
        "prep_1_cut_diced",
        "t_melt"
      ],
      "in": "pan",
      "params": {
        "agitation": "occasional"
      },
      "heat": {
        "level": "medium_low",
        "level_source": "task",
        "setpoint": {
          "kind": "exact",
          "value": 135.0,
          "unit": "Cel"
        },
        "setpoint_band_c": [
          120,
          150
        ],
        "setpoint_source": "vocabulary"
      },
      "until": {
        "all_of": [
          {
            "observable": "facet",
            "facet": "browning",
            "value": "caramelized",
            "comparison": "at_least"
          },
          {
            "observable": "elapsed",
            "duration": {
              "min": 30,
              "unit": "min"
            }
          }
        ],
        "max_duration": {
          "max": 60,
          "unit": "min"
        },
        "on_timeout": "escalate"
      },
      "observables_required": [
        {
          "observable": "facet",
          "facet": "browning"
        },
        {
          "observable": "elapsed"
        }
      ],
      "concurrent_actions": [
        {
          "op": "mix",
          "frequency": "occasional",
          "interval": {
            "target": 5,
            "unit": "min"
          }
        }
      ],
      "hazards": [
        "hot_surface",
        "spatter"
      ],
      "text": "Add the onions and a pinch of salt. Cook slowly, stirring every few minutes, until deeply caramelized.",
      "critical": true,
      "slack_s": 0
    }
  ],
  "utilisation": {
    "cook": {
      "capacity": 1.0,
      "peak": 0.9,
      "mean": 0.103
    },
    "eq:hob_pan": {
      "capacity": 1.0,
      "peak": 1.0,
      "mean": 1.0
    }
  },
  "safety": {
    "allergens": {
      "declared": [
        "milk"
      ]
    },
    "hazards": [
      "hot_surface",
      "blade"
    ]
  },
  "goal": {
    "serve": [
      {
        "material": "caramelized",
        "vessel": "serving_vessel",
        "portions": 4,
        "temperature": "warm"
      }
    ],
    "storage": {
      "make_ahead": true,
      "keeps_for": {
        "target": 5,
        "unit": "d"
      },
      "at": "chilled"
    }
  },
  "warnings": []
}
