{
 "$schema": "https://cookwala.ai/v1/schemas/recipe.schema.json",
 "cookwala": "0.2.0",
 "id": "example-molokhia",
 "revision": 1,
 "updated": "2026-10-04",
 "verification": {
  "level": "V1",
  "evidence": {
   "simulatorRuns": 0,
   "humanReviews": 1,
   "fieldReports": 0
  },
  "reviewedBy": "cookwala.ai editorial (structure only)",
  "notes": "Example recipe written to exercise the standard: structured steps, end conditions, hazards and critical control points. Not simulated and not field-verified; values are typical home-cooking values, not measurements."
 },
 "dish": {
  "names": {
   "en": "Molokhia with chicken",
   "ar": "ملوخية بالفراخ"
  },
  "cuisine": [
   "EG"
  ],
  "course": "main",
  "tags": [
   "molokhia",
   "chicken",
   "stew",
   "taqliya"
  ]
 },
 "yield": {
  "servings": 6,
  "totalMass": {
   "value": 2600,
   "unit": "g"
  }
 },
 "ingredients": [
  {
   "ref": "chicken",
   "ingredientId": "cw.ing.chicken_pieces_bone_in",
   "qty": {
    "value": 1000,
    "unit": "g",
    "tolerance": 0.1
   },
   "display": {
    "en": "1 kg chicken pieces, bone in (halal)",
    "ar": "1 كجم قطع فراخ بالعظم حلال"
   }
  },
  {
   "ref": "water",
   "ingredientId": "cw.ing.water",
   "qty": {
    "value": 1800,
    "unit": "ml",
    "tolerance": 0.1
   },
   "display": {
    "en": "1.8 l water",
    "ar": "1.8 لتر ماء"
   }
  },
  {
   "ref": "onion_stock",
   "ingredientId": "cw.ing.onion_yellow",
   "qty": {
    "value": 100,
    "unit": "g",
    "tolerance": 0.3
   },
   "display": {
    "en": "1 small onion, halved",
    "ar": "بصلة صغيرة مقسومة"
   }
  },
  {
   "ref": "cardamom",
   "ingredientId": "cw.ing.cardamom_pod",
   "qty": {
    "value": 2,
    "unit": "g",
    "tolerance": 0.5
   },
   "display": {
    "en": "3 cardamom pods",
    "ar": "3 حبات حبهان"
   },
   "scaling": "sublinear"
  },
  {
   "ref": "salt",
   "ingredientId": "cw.ing.salt",
   "qty": {
    "value": 8,
    "unit": "g",
    "tolerance": 0.3
   },
   "display": {
    "en": "1½ tsp salt",
    "ar": "1½ ملعقة صغيرة ملح"
   },
   "scaling": "sublinear",
   "toTaste": true
  },
  {
   "ref": "molokhia",
   "ingredientId": "cw.ing.molokhia_minced_frozen",
   "qty": {
    "value": 400,
    "unit": "g",
    "tolerance": 0.1
   },
   "display": {
    "en": "400 g frozen minced molokhia",
    "ar": "400 جم ملوخية مفرومة مجمدة"
   }
  },
  {
   "ref": "garlic",
   "ingredientId": "cw.ing.garlic",
   "qty": {
    "value": 25,
    "unit": "g",
    "tolerance": 0.3
   },
   "display": {
    "en": "8 garlic cloves",
    "ar": "8 فصوص ثوم"
   }
  },
  {
   "ref": "coriander",
   "ingredientId": "cw.ing.coriander_ground",
   "qty": {
    "value": 6,
    "unit": "g",
    "tolerance": 0.3
   },
   "display": {
    "en": "1 tbsp ground coriander",
    "ar": "ملعقة كبيرة كسبرة ناشفة"
   },
   "scaling": "sublinear"
  },
  {
   "ref": "ghee",
   "ingredientId": "cw.ing.ghee",
   "qty": {
    "value": 30,
    "unit": "ml",
    "tolerance": 0.3
   },
   "display": {
    "en": "2 tbsp ghee",
    "ar": "2 ملعقة كبيرة سمن"
   }
  }
 ],
 "equipment": [
  {
   "ref": "pot",
   "class": "cw.eq.vessel.pot.stock",
   "constraints": {
    "capacityMl": {
     "min": 4000
    },
    "lid": true
   }
  },
  {
   "ref": "pan",
   "class": "cw.eq.vessel.pan.skillet",
   "constraints": {
    "diameterMm": {
     "min": 180
    }
   }
  },
  {
   "ref": "hob",
   "class": "cw.eq.heat.hob"
  },
  {
   "ref": "colander",
   "class": "cw.eq.tool.colander"
  },
  {
   "ref": "ladle",
   "class": "cw.eq.tool.ladle"
  },
  {
   "ref": "probe",
   "class": "cw.eq.sensor.probe"
  },
  {
   "ref": "board",
   "class": "cw.eq.tool.cutting_board"
  },
  {
   "ref": "knife",
   "class": "cw.eq.tool.knife.chef"
  }
 ],
 "process": {
  "nodes": [
   {
    "id": "n1",
    "op": "cw.op.boil",
    "inputs": [
     "chicken",
     "water",
     "onion_stock",
     "cardamom",
     "salt"
    ],
    "output": "stock_boiling",
    "equipment": [
     "pot",
     "hob"
    ],
    "params": {
     "heat": "high",
     "lid": "off",
     "target": {
      "sensor": "cw.sense.liquid_temp",
      "value": 100,
      "unit": "degC",
      "tolerance": 2
     }
    },
    "until": {
     "any": [
      {
       "sensor": "cw.sense.liquid_temp",
       "gte": 98
      },
      {
       "vision": "cw.sense.boil_detect"
      }
     ],
     "minTime": "PT8M",
     "maxTime": "PT18M"
    },
    "onTimeout": "extend",
    "hazards": [
     "hz_raw_poultry",
     "hz_steam",
     "hz_boilover"
    ],
    "attention": "monitor",
    "notes": {
     "en": "Skim the foam as it rises."
    }
   },
   {
    "id": "n2",
    "op": "cw.op.simmer",
    "inputs": [
     "stock_boiling"
    ],
    "output": "chicken_cooked",
    "params": {
     "heat": "low",
     "lid": "ajar",
     "target": {
      "sensor": "cw.sense.liquid_temp",
      "value": 92,
      "unit": "degC",
      "tolerance": 4
     }
    },
    "until": {
     "all": [
      {
       "sensor": "cw.sense.core_temp",
       "target": "chicken",
       "gte": 74
      }
     ],
     "minTime": "PT40M",
     "maxTime": "PT70M"
    },
    "onTimeout": "extend",
    "ccp": "ccp_poultry",
    "hazards": [
     "hz_steam"
    ],
    "attention": "periodic"
   },
   {
    "id": "n3",
    "op": "cw.op.drain",
    "inputs": [
     "chicken_cooked"
    ],
    "output": "stock",
    "equipment": [
     "colander"
    ],
    "params": {
     "keepLiquid": true
    },
    "hazards": [
     "hz_hot_liquid"
    ],
    "attention": "continuous",
    "notes": {
     "en": "Lift the chicken out into a covered pot kept hot (step n12); the stock stays in the pot. Measure 1.5 l of stock."
    }
   },
   {
    "id": "n4",
    "op": "cw.op.simmer",
    "inputs": [
     "stock",
     "molokhia"
    ],
    "output": "molokhia_cooked",
    "equipment": [
     "pot",
     "hob"
    ],
    "params": {
     "heat": "medium_low",
     "lid": "off",
     "target": {
      "sensor": "cw.sense.liquid_temp",
      "value": 90,
      "unit": "degC",
      "tolerance": 4
     },
     "stir": {
      "intervalS": 60,
      "style": "gentle"
     }
    },
    "until": {
     "minTime": "PT5M",
     "maxTime": "PT9M",
     "all": [
      {
       "vision": "cw.sense.molokhia_dispersed"
      }
     ]
    },
    "onTimeout": "ask_human",
    "hazards": [
     "hz_steam",
     "hz_scorch"
    ],
    "attention": "monitor",
    "notes": {
     "en": "Keep it just under the boil; a hard boil separates the leaves from the liquid."
    }
   },
   {
    "id": "n5",
    "op": "cw.op.crush",
    "inputs": [
     "garlic"
    ],
    "output": "garlic_crushed",
    "params": {
     "texture": "coarse"
    }
   },
   {
    "id": "n6",
    "op": "cw.op.heat",
    "inputs": [
     "ghee"
    ],
    "output": "hot_ghee",
    "equipment": [
     "pan",
     "hob"
    ],
    "params": {
     "heat": "medium",
     "target": {
      "sensor": "cw.sense.pan_surface_temp",
      "value": 165,
      "unit": "degC",
      "tolerance": 15
     }
    },
    "until": {
     "any": [
      {
       "sensor": "cw.sense.pan_surface_temp",
       "gte": 150
      },
      {
       "vision": "cw.sense.oil_shimmer"
      }
     ],
     "minTime": "PT1M",
     "maxTime": "PT3M"
    },
    "onTimeout": "extend",
    "hazards": [
     "hz_oil"
    ],
    "attention": "continuous"
   },
   {
    "id": "n7",
    "op": "cw.op.saute",
    "inputs": [
     "hot_ghee",
     "garlic_crushed",
     "coriander"
    ],
    "output": "taqliya",
    "params": {
     "heat": "medium",
     "stir": {
      "intervalS": 10,
      "style": "normal"
     }
    },
    "until": {
     "all": [
      {
       "vision": "cw.sense.color_golden",
       "target": "garlic_crushed"
      }
     ],
     "minTime": "PT30S",
     "maxTime": "PT90S"
    },
    "onTimeout": "ask_human",
    "hazards": [
     "hz_oil",
     "hz_splatter"
    ],
    "attention": "continuous",
    "notes": {
     "en": "The taqliya: garlic and coriander fried until golden and fragrant, not brown."
    }
   },
   {
    "id": "n8",
    "op": "cw.op.transfer",
    "inputs": [
     "taqliya"
    ],
    "output": "molokhia_finished",
    "into": "molokhia_cooked",
    "params": {
     "method": "pour",
     "keepHot": true
    },
    "hazards": [
     "hz_splatter",
     "hz_steam"
    ],
    "attention": "continuous",
    "notes": {
     "en": "Pour the sizzling taqliya into the molokhia; it will spit. Stir once."
    }
   },
   {
    "id": "n9",
    "op": "cw.op.season",
    "inputs": [
     "molokhia_finished"
    ],
    "output": "molokhia_seasoned",
    "params": {
     "method": "taste_adjust",
     "ingredients": [
      "salt"
     ]
    },
    "humanOptional": true
   },
   {
    "id": "n10",
    "op": "cw.op.hold",
    "inputs": [
     "molokhia_seasoned"
    ],
    "output": "molokhia_hot",
    "params": {
     "heat": "very_low",
     "lid": "on",
     "target": {
      "sensor": "cw.sense.core_temp",
      "value": 68,
      "unit": "degC",
      "tolerance": 6
     }
    },
    "until": {
     "all": [
      {
       "sensor": "cw.sense.core_temp",
       "gte": 60
      }
     ],
     "maxTime": "PT30M"
    },
    "onTimeout": "ask_human",
    "attention": "periodic"
   },
   {
    "id": "n12",
    "op": "cw.op.hold",
    "inputs": [
     "chicken_cooked"
    ],
    "output": "chicken_hot",
    "equipment": [
     "pot",
     "hob"
    ],
    "params": {
     "heat": "very_low",
     "lid": "on",
     "target": {
      "sensor": "cw.sense.core_temp",
      "value": 68,
      "unit": "degC",
      "tolerance": 6
     }
    },
    "until": {
     "all": [
      {
       "sensor": "cw.sense.core_temp",
       "gte": 60
      }
     ],
     "maxTime": "PT45M"
    },
    "onTimeout": "ask_human",
    "hazards": [
     "hz_hot_liquid"
    ],
    "attention": "monitor",
    "notes": {
     "en": "Keep the chicken pieces at or above 60 °C core until serving; discard after 2 hours out of temperature control."
    }
   },
   {
    "id": "n11",
    "op": "cw.op.serve",
    "inputs": [
     "molokhia_hot",
     "chicken_hot"
    ],
    "params": {
     "serveWithin": "PT30M",
     "keepHot": {
      "gte": 60,
      "unit": "degC"
     }
    }
   }
  ],
  "edges": "implicit-from-inputs",
  "parallelGroups": [
   [
    "n4",
    "n5"
   ]
  ]
 },
 "safety": {
  "hazards": [
   {
    "id": "hz_raw_poultry",
    "type": "cw.hz.pathogen.raw_poultry",
    "severity": "high",
    "mitigation": [
     "dedicated_board",
     "wash_tools_and_grippers_after_contact",
     "no_cross_contact_with_ready_food"
    ]
   },
   {
    "id": "hz_steam",
    "type": "cw.hz.burn.steam",
    "severity": "medium",
    "mitigation": [
     "lift_lid_away_from_user"
    ]
   },
   {
    "id": "hz_boilover",
    "type": "cw.hz.boilover",
    "severity": "medium",
    "mitigation": [
     "pot_max_fill_66pct",
     "reduce_heat_at_boil"
    ]
   },
   {
    "id": "hz_hot_liquid",
    "type": "cw.hz.burn.hot_liquid",
    "severity": "high",
    "mitigation": [
     "blend_below_rim",
     "immersion_blender_fully_submerged",
     "move_pot_off_heat"
    ]
   },
   {
    "id": "hz_oil",
    "type": "cw.hz.burn.hot_oil",
    "severity": "high",
    "mitigation": [
     "oil_temp_max_200C",
     "lid_ready",
     "no_water_contact"
    ]
   },
   {
    "id": "hz_splatter",
    "type": "cw.hz.splatter",
    "severity": "low",
    "mitigation": [
     "partial_lid"
    ]
   },
   {
    "id": "hz_scorch",
    "type": "cw.hz.scorch",
    "severity": "low",
    "mitigation": [
     "stir_bottom",
     "lowest_heat_for_lid_on_steps"
    ]
   }
  ],
  "ccps": [
   {
    "id": "ccp_poultry",
    "hazard": "pathogen.salmonella_campylobacter",
    "node": "n2",
    "criticalLimit": "core temperature of the thickest piece at or above 74 °C",
    "limit": {
     "sensor": "cw.sense.core_temp",
     "gte": 74
    },
    "monitoring": [
     "cw.sense.core_temp"
    ],
    "corrective": "keep simmering and re-probe; never serve poultry below 74 °C"
   }
  ],
  "allergens": {
   "eu14": [
    "milk"
   ],
   "us9": [
    "milk"
   ],
   "mayContain": []
  },
  "dietary": [
   {
    "claim": "halal",
    "basis": "certified",
    "note": "Halal only when the chicken is halal-certified."
   },
   {
    "claim": "gluten_free",
    "basis": "ingredients"
   }
  ],
  "supervision": {
   "default": "presence_required",
   "reasons": {
    "n3": "lifting hot pot and liquid",
    "n6": "hot fat",
    "n7": "burns in seconds",
    "n8": "spitting fat into hot liquid"
   }
  },
  "abort": {
   "steps": [
    "heat_off",
    "lid_on",
    "alert_user"
   ],
   "neverLeave": [
    "n6",
    "n7",
    "n8"
   ]
  }
 },
 "nutrition": {
  "perServing": {
   "kcal": 330,
   "protein": 30,
   "fat": 20,
   "carbs": 6,
   "fiber": 3,
   "sugar": 1,
   "sodiumMg": 560
  },
  "basis": "Typical composition tables, estimate per serving; not measured"
 },
 "storage": {
  "fridgeDays": 2,
  "freezerDays": 60,
  "reheat": {
   "minCoreC": 75,
   "method": "gentle simmer; do not boil hard"
  },
  "coolingRequired": true
 },
 "text": {
  "en": {
   "title": "Molokhia with chicken",
   "intro": "Egypt's green soup-stew of jute leaves in chicken stock, finished with the taqliya: garlic and coriander fried in ghee and poured in sizzling.",
   "steps": {
    "n1": "Put the chicken, water, onion, cardamom and salt in the pot. Bring to the boil, skimming the foam.",
    "n2": "Lower to a simmer, lid ajar, until the thickest piece reads 74 °C at the bone (40 to 70 minutes).",
    "n3": "Lift the chicken out and keep it warm. Keep 1.5 litres of stock in the pot.",
    "n4": "Add the molokhia to the stock and heat just below the boil, stirring gently, until the leaves disperse (5 to 9 minutes). Never let it boil hard.",
    "n5": "Crush the garlic coarsely.",
    "n6": "Heat the ghee in a small pan.",
    "n7": "Fry the garlic and coriander in the ghee until golden and fragrant, 30 to 90 seconds.",
    "n8": "Pour the sizzling taqliya into the molokhia. It will spit; stir once.",
    "n9": "Taste; add salt if needed.",
    "n10": "Keep hot, at or above 60 °C, until serving.",
    "n11": "Serve with the chicken and rice with vermicelli.",
    "n12": "Keep the chicken pieces hot, at or above 60 °C, until serving."
   }
  },
  "ar": {
   "title": "ملوخية بالفراخ",
   "intro": "شوربة مصر الخضراء: ورق الملوخية في شوربة الفراخ، تُختم بالتقلية: ثوم وكسبرة في السمن تُسكب وهي تصدر صوتها.",
   "steps": {
    "n1": "ضعي الفراخ والماء والبصل والحبهان والملح في الحلة. اتركيها تغلي مع إزالة الرغوة.",
    "n2": "اخفضي النار إلى الهدوء مع الغطاء نصف مفتوح حتى يصل مركز أكبر قطعة عند العظم إلى 74 درجة (40 إلى 70 دقيقة).",
    "n3": "ارفعي الفراخ واحتفظي بها دافئة. احتفظي بلتر ونصف من الشوربة في الحلة.",
    "n4": "أضيفي الملوخية إلى الشوربة وسخّنيها تحت درجة الغليان مع التقليب بلطف حتى تتفرق الورقات (5 إلى 9 دقائق). لا تتركيها تغلي بقوة.",
    "n5": "اهرسي الثوم هرسًا خشنًا.",
    "n6": "سخّني السمن في مقلاة صغيرة.",
    "n7": "حمّري الثوم والكسبرة في السمن حتى يصبح ذهبيًا وتفوح رائحته، من 30 إلى 90 ثانية.",
    "n8": "اسكبي التقلية وهي تصدر صوتًا على الملوخية؛ ستطرطش، فقلّبي مرة واحدة.",
    "n9": "تذوّقي وأضيفي الملح إذا لزم.",
    "n10": "احتفظي بها ساخنة عند 60 درجة أو أكثر حتى التقديم.",
    "n11": "قدّميها مع الفراخ والأرز بالشعرية.",
    "n12": "احفظي قطع الدجاج ساخنة، عند 60 درجة أو أكثر، حتى التقديم."
   }
  }
 },
 "source": {
  "name": "cookwala.ai",
  "url": "https://cookwala.ai/",
  "citation": "Cookwala example recipe, written for the standard"
 },
 "license": "CC-BY-4.0",
 "layers": {
  "r1": true,
  "r2": false,
  "r3": true
 },
 "identity": {
  "essential": [
   "molokhia",
   "garlic",
   "coriander",
   "ghee"
  ],
  "flexible": [
   "chicken",
   "cardamom"
  ],
  "neverAdd": [
   "flour"
  ],
  "culturalNotes": {
   "en": "The pour of the taqliya and its sound are part of the dish; stir only once so the leaves stay suspended."
  }
 },
 "hash": "sha256:c6d0c0679eea22001414f60ff4121367908ca3ddd260c37eb7a35c4ff16a8e6b"
}
