{
  "$schema": "https://sous.pras.ai/schema/v0/schedule.schema.json",
  "sous_version": "0.7.0",
  "recipe": "sous.example/dal-tadka",
  "kitchen": "sous.example/home-kitchen",
  "title": "Dal Tadka",
  "servings": 4,
  "feasible": true,
  "origin": "makespan",
  "makespan_s": 2880,
  "serial_s": 3660,
  "equipment": [
    {
      "id": "pot",
      "class": "heated_vessel",
      "label": "saucepan",
      "instance": "saucepan",
      "attributes": {
        "capacity": {
          "value": 3,
          "unit": "L"
        },
        "surface_area": {
          "value": 0.03,
          "unit": "m2"
        },
        "lidded": true
      }
    },
    {
      "id": "tadka_pan",
      "class": "heated_vessel",
      "label": "small tempering pan",
      "instance": "small_pan",
      "attributes": {
        "capacity": {
          "value": 0.3,
          "unit": "L"
        },
        "surface_area": {
          "value": 0.01,
          "unit": "m2"
        },
        "lidded": false
      }
    }
  ],
  "tasks": [
    {
      "id": "t_boil_dal",
      "op": "boil",
      "source": "recipe",
      "start_s": 0,
      "end_s": 2400,
      "duration_s": 2400,
      "duration_source": "until",
      "attended": 0.022,
      "attention_visits": {
        "count": 2,
        "each_s": 20,
        "every_s": 900,
        "at_s": [
          0,
          900
        ]
      },
      "equipment": [
        "saucepan"
      ],
      "resources": {
        "cook": 0.022,
        "eq:saucepan": 1
      },
      "consumes": [
        {
          "id": "lentil",
          "kind": "ingredient",
          "substance": {
            "ref": "foodon:03309936",
            "label": "red lentil"
          },
          "state": {
            "form": "whole",
            "hydration": "dry"
          },
          "quantity": {
            "kind": "exact",
            "value": 200,
            "unit": "g",
            "basis": "as_purchased"
          },
          "mass_g": 200
        },
        {
          "id": "water",
          "kind": "ingredient",
          "substance": {
            "ref": "chebi:15377",
            "label": "water"
          },
          "state": {
            "form": "liquid"
          },
          "quantity": {
            "kind": "exact",
            "value": 800,
            "unit": "mL"
          }
        },
        {
          "id": "turmeric",
          "kind": "ingredient",
          "substance": {
            "ref": "foodon:00002323",
            "label": "turmeric"
          },
          "state": {
            "form": "ground"
          },
          "quantity": {
            "kind": "exact",
            "value": 2,
            "unit": "g"
          },
          "mass_g": 2
        }
      ],
      "produces": [
        {
          "id": "dal_cooked",
          "label": "cooked dal",
          "state": {
            "texture": "soft",
            "doneness": "cooked_through"
          },
          "mass_g": 202.0
        }
      ],
      "in": "pot",
      "heat": {
        "level": "medium",
        "level_source": "task",
        "setpoint": {
          "kind": "exact",
          "value": 165,
          "unit": "Cel"
        },
        "setpoint_source": "kitchen"
      },
      "until": {
        "all_of": [
          {
            "observable": "facet",
            "facet": "texture",
            "value": "soft",
            "comparison": "at_least"
          }
        ],
        "max_duration": {
          "max": 40,
          "unit": "min"
        },
        "on_timeout": "escalate"
      },
      "observables_required": [
        {
          "observable": "facet",
          "facet": "texture"
        }
      ],
      "concurrent_actions": [
        {
          "op": "skim",
          "frequency": "as_required",
          "note": "Skim the foam that rises in the first few minutes."
        }
      ],
      "hazards": [
        "hot_liquid",
        "steam"
      ],
      "text": "Simmer the lentils with water and turmeric until they collapse.",
      "critical": false,
      "slack_s": 90
    },
    {
      "id": "t_preheat_tadka",
      "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": "tadka_pan",
      "params": {
        "setpoint": {
          "kind": "exact",
          "value": 190,
          "unit": "Cel"
        }
      },
      "heat": {
        "setpoint": {
          "kind": "exact",
          "value": 190,
          "unit": "Cel"
        },
        "setpoint_source": "recipe"
      },
      "until": {
        "any_of": [
          {
            "observable": "equipment_temperature",
            "comparison": "at_least",
            "value": 190,
            "unit": "Cel"
          }
        ],
        "max_duration": {
          "max": 10,
          "unit": "min"
        }
      },
      "observables_required": [
        {
          "observable": "equipment_temperature"
        }
      ],
      "hazards": [
        "hot_surface"
      ],
      "text": "Set the small pan over medium-high heat.",
      "critical": false,
      "slack_s": 1920
    },
    {
      "id": "t_melt_ghee",
      "op": "melt",
      "source": "recipe",
      "start_s": 600,
      "end_s": 780,
      "duration_s": 180,
      "duration_source": "until",
      "attended": 0.25,
      "attention_visits": {
        "count": 1,
        "each_s": 30,
        "every_s": 120,
        "at_s": [
          600
        ]
      },
      "equipment": [
        "small_pan"
      ],
      "resources": {
        "cook": 0.25,
        "eq:small_pan": 1
      },
      "consumes": [
        {
          "id": "ghee",
          "kind": "ingredient",
          "substance": {
            "ref": "foodon:03310185",
            "label": "ghee"
          },
          "state": {
            "form": "whole"
          },
          "quantity": {
            "kind": "exact",
            "value": 30,
            "unit": "g"
          },
          "mass_g": 30
        }
      ],
      "produces": [
        {
          "id": "hot_ghee",
          "state": {
            "form": "liquid",
            "thermal": "very_hot"
          },
          "mass_g": 30.0
        }
      ],
      "after": [
        "t_preheat_tadka"
      ],
      "in": "tadka_pan",
      "heat": {
        "level": "medium_high",
        "level_source": "task",
        "setpoint": {
          "kind": "exact",
          "value": 205,
          "unit": "Cel"
        },
        "setpoint_source": "kitchen"
      },
      "until": {
        "any_of": [
          {
            "observable": "facet",
            "facet": "form",
            "value": "liquid",
            "comparison": "exactly"
          }
        ],
        "max_duration": {
          "max": 3,
          "unit": "min"
        }
      },
      "observables_required": [
        {
          "observable": "facet",
          "facet": "form"
        }
      ],
      "hazards": [
        "hot_surface",
        "scorching"
      ],
      "text": "Heat the ghee in a small pan until shimmering.",
      "critical": false,
      "slack_s": 1920
    },
    {
      "id": "t_add_tomato",
      "op": "mix",
      "source": "recipe",
      "start_s": 2400,
      "end_s": 2700,
      "duration_s": 300,
      "duration_source": "task",
      "attended": 0.9,
      "equipment": [
        "saucepan"
      ],
      "resources": {
        "cook": 0.9,
        "eq:saucepan": 1
      },
      "consumes": [
        {
          "id": "dal_cooked",
          "kind": "intermediate",
          "from_task": "t_boil_dal",
          "label": "cooked dal",
          "state": {
            "texture": "soft",
            "doneness": "cooked_through"
          },
          "mass_g": 202.0
        },
        {
          "id": "tomato",
          "kind": "ingredient",
          "substance": {
            "ref": "foodon:03301453",
            "label": "tomato"
          },
          "state": {
            "form": "chopped"
          },
          "quantity": {
            "kind": "count",
            "count": 1,
            "unit": "{each}",
            "size_class": "medium",
            "mass_equivalent": {
              "value": 123,
              "unit": "g",
              "tolerance": 0.3,
              "source": "vocabulary"
            }
          },
          "mass_g": 123
        },
        {
          "id": "salt",
          "kind": "ingredient",
          "substance": {
            "ref": "foodon:00002250",
            "label": "salt"
          },
          "quantity": {
            "kind": "to_taste",
            "seed": {
              "kind": "exact",
              "value": 6,
              "unit": "g"
            }
          }
        }
      ],
      "produces": [
        {
          "id": "dal_seasoned",
          "label": "seasoned dal",
          "mass_g": 325.0
        }
      ],
      "after": [
        "t_boil_dal"
      ],
      "in": "pot",
      "text": "Stir in the chopped tomato and salt.",
      "critical": false,
      "slack_s": 90
    },
    {
      "id": "t_temper",
      "op": "fry",
      "source": "recipe",
      "start_s": 2700,
      "end_s": 2790,
      "duration_s": 90,
      "duration_source": "until",
      "attended": 1.0,
      "equipment": [
        "small_pan"
      ],
      "resources": {
        "cook": 1.0,
        "eq:small_pan": 1
      },
      "consumes": [
        {
          "id": "hot_ghee",
          "kind": "intermediate",
          "from_task": "t_melt_ghee",
          "state": {
            "form": "liquid",
            "thermal": "very_hot"
          },
          "mass_g": 30.0
        },
        {
          "id": "mustard_seed",
          "kind": "ingredient",
          "substance": {
            "ref": "foodon:00003420",
            "label": "black mustard seed"
          },
          "state": {
            "form": "whole"
          },
          "quantity": {
            "kind": "exact",
            "value": 3,
            "unit": "g"
          },
          "mass_g": 3
        },
        {
          "id": "cumin_seed",
          "kind": "ingredient",
          "substance": {
            "ref": "foodon:03311872",
            "label": "cumin seed"
          },
          "state": {
            "form": "whole"
          },
          "quantity": {
            "kind": "exact",
            "value": 3,
            "unit": "g"
          },
          "mass_g": 3
        },
        {
          "id": "chili",
          "kind": "ingredient",
          "substance": {
            "ref": "foodon:03302554",
            "label": "dried chili pepper"
          },
          "state": {
            "form": "whole"
          },
          "quantity": {
            "kind": "count",
            "count": 2,
            "unit": "{each}"
          }
        },
        {
          "id": "garlic",
          "kind": "ingredient",
          "substance": {
            "ref": "sous:garlic_peeled",
            "label": "garlic (peeled)"
          },
          "state": {
            "form": "sliced"
          },
          "quantity": {
            "kind": "count",
            "count": 3,
            "unit": "{clove}"
          }
        },
        {
          "id": "asafoetida",
          "kind": "ingredient",
          "substance": {
            "ref": "foodon:00002936",
            "label": "asafoetida"
          },
          "state": {
            "form": "ground"
          },
          "quantity": {
            "kind": "exact",
            "value": 0.3,
            "unit": "g"
          },
          "optional": true,
          "mass_g": 0.3
        }
      ],
      "produces": [
        {
          "id": "tadka",
          "label": "tempered spice fat",
          "state": {
            "browning": "golden_brown"
          },
          "mass_g": 29.0
        }
      ],
      "after": [
        "t_melt_ghee"
      ],
      "timing": {
        "max_hold": {
          "max": 60,
          "unit": "s"
        }
      },
      "in": "tadka_pan",
      "heat": {
        "level": "medium_high",
        "level_source": "task",
        "setpoint": {
          "kind": "exact",
          "value": 205,
          "unit": "Cel"
        },
        "setpoint_source": "kitchen"
      },
      "until": {
        "any_of": [
          {
            "observable": "sound",
            "description": "the mustard seeds finish popping",
            "machine_hint": "Popping subsides roughly 30-45 s after the seeds are added.",
            "requires_human": true
          },
          {
            "observable": "facet",
            "facet": "browning",
            "value": "golden_brown",
            "comparison": "at_least"
          }
        ],
        "max_duration": {
          "max": 90,
          "unit": "s"
        },
        "on_timeout": "fail"
      },
      "observables_required": [
        {
          "observable": "sound",
          "requires_human": true
        },
        {
          "observable": "facet",
          "facet": "browning"
        }
      ],
      "control_points": [
        {
          "task": "t_temper",
          "type": "control",
          "condition": {
            "observable": "elapsed",
            "duration": {
              "max": 90,
              "unit": "s"
            }
          },
          "rationale": "Whole spices go from fragrant to acrid in seconds; past 90 s the tadka is unusable.",
          "on_failure": "discard"
        }
      ],
      "hazards": [
        "hot_oil",
        "spatter"
      ],
      "text": "Add mustard seeds; when they pop, add cumin, chili, garlic and a pinch of asafoetida and fry until fragrant.",
      "critical": true,
      "slack_s": 0
    },
    {
      "id": "t_pour_tadka",
      "op": "transfer",
      "source": "recipe",
      "start_s": 2790,
      "end_s": 2820,
      "duration_s": 30,
      "duration_source": "operation",
      "attended": 0.9,
      "equipment": [
        "saucepan"
      ],
      "resources": {
        "cook": 0.9,
        "eq:saucepan": 1
      },
      "consumes": [
        {
          "id": "tadka",
          "kind": "intermediate",
          "from_task": "t_temper",
          "label": "tempered spice fat",
          "state": {
            "browning": "golden_brown"
          },
          "mass_g": 29.0
        },
        {
          "id": "dal_seasoned",
          "kind": "intermediate",
          "from_task": "t_add_tomato",
          "label": "seasoned dal",
          "mass_g": 325.0
        }
      ],
      "produces": [
        {
          "id": "dal_tadka",
          "label": "finished dal tadka",
          "mass_g": 354.0
        }
      ],
      "after": [
        "t_add_tomato",
        "t_temper"
      ],
      "timing": {
        "sync_with": [
          "t_add_tomato"
        ],
        "sync_tolerance": {
          "max": 2,
          "unit": "min"
        }
      },
      "in": "pot",
      "params": {
        "mode": "pour",
        "destination": "pot"
      },
      "hazards": [
        "hot_liquid",
        "spill"
      ],
      "text": "Pour the sizzling tadka over the dal.",
      "critical": true,
      "slack_s": 0
    },
    {
      "id": "t_garnish",
      "op": "garnish",
      "source": "recipe",
      "start_s": 2820,
      "end_s": 2880,
      "duration_s": 60,
      "duration_source": "operation",
      "attended": 0.9,
      "attention_visits": {
        "count": 1,
        "each_s": 30,
        "every_s": 33,
        "at_s": [
          2820
        ]
      },
      "resources": {
        "cook": 0.9
      },
      "consumes": [
        {
          "id": "dal_tadka",
          "kind": "intermediate",
          "from_task": "t_pour_tadka",
          "label": "finished dal tadka",
          "mass_g": 354.0
        },
        {
          "id": "coriander",
          "kind": "ingredient",
          "substance": {
            "ref": "foodon:03000029",
            "label": "cilantro"
          },
          "state": {
            "form": "chopped"
          },
          "quantity": {
            "kind": "count",
            "count": 1,
            "unit": "{bunch}"
          }
        }
      ],
      "produces": [
        {
          "id": "dal_plated",
          "label": "garnished dal",
          "mass_g": 354.0
        }
      ],
      "after": [
        "t_pour_tadka"
      ],
      "params": {
        "placement": "scattered"
      },
      "text": "Scatter chopped coriander over the top.",
      "critical": true,
      "slack_s": 0
    }
  ],
  "utilisation": {
    "cook": {
      "capacity": 1.0,
      "peak": 1.0,
      "mean": 0.185
    },
    "pool:hob": {
      "capacity": 2.0,
      "peak": 2.0,
      "mean": 1.948
    },
    "eq:saucepan": {
      "capacity": 1.0,
      "peak": 1.0,
      "mean": 0.979
    },
    "eq:small_pan": {
      "capacity": 1.0,
      "peak": 1.0,
      "mean": 0.969
    }
  },
  "safety": {
    "allergens": {
      "declared": [
        "milk",
        "mustard",
        "gluten"
      ]
    },
    "hazards": [
      "hot_oil",
      "spatter",
      "hot_surface",
      "blade"
    ]
  },
  "goal": {
    "serve": [
      {
        "material": "dal_plated",
        "vessel": "serving_vessel",
        "portions": 4,
        "temperature": "hot",
        "immediately": true,
        "arrangement": [
          {
            "relation": "centred",
            "material": "dal_plated"
          }
        ]
      }
    ],
    "accompaniments": [
      {
        "substance": {
          "label": "steamed basmati rice"
        },
        "optional": false
      },
      {
        "substance": {
          "label": "roti"
        },
        "optional": true
      }
    ],
    "storage": {
      "make_ahead": true,
      "keeps_for": {
        "target": 3,
        "unit": "d"
      },
      "at": "chilled",
      "reheat": "Reheat the dal and make a fresh tadka; a reheated tadka loses the aromatics."
    }
  },
  "warnings": []
}
