{
  "schemaVersion": 1,
  "engineVersion": 3,
  "version": 1,
  "weekId": "soy-excluded-week",
  "title": "Soy-excluded simple week",
  "goal": "Skip tofu and soy sauce; use lemon, oil and measured seasoning.",
  "servings": 2,
  "firstDate": "2026-10-26",
  "prepStartHour": 19,
  "prepStartMinute": 0,
  "input": {
    "servings": 2,
    "mealStartDate": "2026-10-26",
    "potLitres": 4,
    "availableEquipment": [
      "stove",
      "oven"
    ],
    "excludeTags": [
      "soy",
      "sesame"
    ],
    "prepSelections": [
      "shared-roast"
    ],
    "preparedBatches": {},
    "thawedPortions": {},
    "pantryItems": []
  },
  "dinners": [
    {
      "dayIndex": 0,
      "date": "2026-10-26",
      "recipe": {
        "id": "lemon-chickpea-couscous",
        "slug": "lemon-chickpea-couscous",
        "title": "Lemon chickpea couscous",
        "summary": "Tender roasted carrots, zucchini and onion over fluffy couscous with warm lemon chickpeas.",
        "version": 1,
        "locale": "en",
        "baseServings": 2,
        "ingredients": [
          {
            "ingredientId": "couscous",
            "quantity": 160,
            "unit": "g",
            "state": "dry"
          },
          {
            "ingredientId": "chickpea",
            "quantity": 240,
            "unit": "g",
            "state": "drained"
          },
          {
            "ingredientId": "zucchini",
            "quantity": 300,
            "unit": "g",
            "state": "raw"
          },
          {
            "ingredientId": "carrot",
            "quantity": 150,
            "unit": "g",
            "state": "raw"
          },
          {
            "ingredientId": "onion",
            "quantity": 100,
            "unit": "g",
            "state": "raw"
          },
          {
            "ingredientId": "oil",
            "quantity": 20,
            "unit": "ml",
            "state": "raw"
          },
          {
            "ingredientId": "lemon",
            "quantity": 20,
            "unit": "ml",
            "state": "raw"
          },
          {
            "ingredientId": "salt",
            "quantity": 3,
            "unit": "g",
            "state": "dry"
          },
          {
            "ingredientId": "pepper",
            "quantity": 1,
            "unit": "g",
            "state": "dry"
          },
          {
            "ingredientId": "water",
            "quantity": 200,
            "unit": "ml",
            "state": "raw"
          }
        ],
        "equipment": [
          "stove",
          "oven"
        ],
        "activeMinutes": 15,
        "elapsedMinutes": 40,
        "steps": [
          {
            "id": "lemon-chickpea-couscous-1",
            "instructions": "Heat the oven to 200°C. Cut 300g zucchini into 2cm chunks, 150g carrots into 1cm pieces and 100g onions into 2cm wedges. Toss with 20ml olive oil, two-thirds of 3g salt and 1g black pepper. Spread in one layer and roast for 25–30 minutes, turning halfway, until the carrot yields to a fork and the edges brown. If the zucchini releases a puddle, spread onto another tray and continue roasting. For the shared-prep path use only this dinner’s labelled roast share, reheated to 74°C; skip this fresh roasting step.",
            "ingredientRefs": [
              "zucchini",
              "carrot",
              "onion",
              "oil",
              "salt",
              "pepper"
            ],
            "durationRange": [
              25,
              30
            ],
            "equipmentIds": [
              "stove",
              "oven"
            ],
            "dependsOn": [],
            "doneCondition": "the carrot yields to a fork and the edges brown"
          },
          {
            "id": "lemon-chickpea-couscous-2",
            "instructions": "While the vegetables roast, cook this component on the stove. Bring 200ml recipe water to a boil in a saucepan. Stir in 160g couscous, cover and remove from the heat for 5 minutes; fluff with a fork. Check the packet liquid ratio before cooking and record any adjustment. If grains remain hard, sprinkle in a little boiling processing water and cover for 2 minutes more.",
            "ingredientRefs": [
              "water",
              "couscous"
            ],
            "durationRange": [
              5,
              7
            ],
            "equipmentIds": [
              "stove",
              "oven"
            ],
            "dependsOn": [],
            "doneCondition": "Complete the stated preparation, texture and serving checks before continuing."
          },
          {
            "id": "lemon-chickpea-couscous-3",
            "instructions": "While the vegetables roast, cook this component on the stove. Warm 240g chickpeas in a saucepan with 10–20ml processing water per two servings over medium-low heat for 5 minutes, stirring until steaming. Stir in 20ml lemon juice and the remaining third of the measured salt.",
            "ingredientRefs": [
              "chickpea",
              "lemon"
            ],
            "durationRange": [
              5,
              7
            ],
            "equipmentIds": [
              "stove",
              "oven"
            ],
            "dependsOn": [],
            "doneCondition": "steaming"
          },
          {
            "id": "lemon-chickpea-couscous-4",
            "instructions": "Spoon couscous into bowls and add the chickpeas and this dinner’s entire roast share. Each fresh recipe makes one dinner; a shared batch has separately labelled shares for its other dinners.",
            "ingredientRefs": [],
            "durationRange": [
              1,
              5
            ],
            "equipmentIds": [
              "stove",
              "oven"
            ],
            "dependsOn": [
              "lemon-chickpea-couscous-1",
              "lemon-chickpea-couscous-2",
              "lemon-chickpea-couscous-3"
            ],
            "doneCondition": "Complete the stated preparation, texture and serving checks before continuing."
          },
          {
            "id": "lemon-chickpea-couscous-5",
            "instructions": "The displayed quantities already match your selected servings. For 1 or 2 servings, use a smaller pan and check early; keep the stated cut sizes. For 4 servings use a broad pan or uncrowded trays; for 8 split every ingredient evenly into two 4-serving batches (more if the pan or pot capacity requires it). Keep pans below 80% full and vegetables in one layer when browning. Repeat the cooking and doneness checks for each batch; elapsed time increases for sequential batches. Serve promptly. Cool any extra cooked food in shallow containers and refrigerate within two hours, or one hour above 32°C. Keep the fridge at 4°C or below. Reheat cooked leftovers evenly to 74°C, checking several places with a food thermometer. Keep raw garnishes and cold yogurt or tahini sauces separate and use them cold within their label limits.",
            "ingredientRefs": [],
            "durationRange": [
              1,
              5
            ],
            "equipmentIds": [
              "stove",
              "oven"
            ],
            "dependsOn": [
              "lemon-chickpea-couscous-4"
            ],
            "doneCondition": "Complete the stated preparation, texture and serving checks before continuing."
          }
        ],
        "storagePolicy": {
          "maxRefrigeratedHours": 72,
          "reheatC": 74,
          "sourceRefs": [
            "usda",
            "storage"
          ]
        },
        "provenance": {
          "type": "AI-assisted original",
          "accessedAt": "2026-10-04",
          "licenseStatus": "Original project content; MIT"
        },
        "component": "roast",
        "finishAfterPrep": 12,
        "potLitres": 1,
        "familyId": "tray-roast",
        "batchServings": 4,
        "makeAhead": null,
        "makeAheadNote": "The weekly shared roast is tracked as its own component; cook the grain or pasta and remaining ingredients at serving.",
        "servings": 2
      },
      "batches": 1,
      "capacityNote": "Use 1 batch(es) with your 4L pot. Keep each load below 80% of capacity; roast no more than four servings per tray.",
      "finishMinutes": 12
    },
    {
      "dayIndex": 1,
      "date": "2026-10-27",
      "recipe": {
        "id": "pea-rice-pot",
        "slug": "pea-rice-pot",
        "title": "Lemon pea rice pot",
        "summary": "Peas finish steaming on lemon-scented rice in one covered saucepan.",
        "version": 1,
        "locale": "en",
        "baseServings": 2,
        "ingredients": [
          {
            "ingredientId": "rice",
            "quantity": 160,
            "unit": "g",
            "state": "dry"
          },
          {
            "ingredientId": "pea",
            "quantity": 200,
            "unit": "g",
            "state": "frozen"
          },
          {
            "ingredientId": "onion",
            "quantity": 100,
            "unit": "g",
            "state": "raw"
          },
          {
            "ingredientId": "lemon",
            "quantity": 20,
            "unit": "ml",
            "state": "raw"
          },
          {
            "ingredientId": "oil",
            "quantity": 15,
            "unit": "ml",
            "state": "raw"
          },
          {
            "ingredientId": "salt",
            "quantity": 3,
            "unit": "g",
            "state": "dry"
          },
          {
            "ingredientId": "pepper",
            "quantity": 1,
            "unit": "g",
            "state": "dry"
          },
          {
            "ingredientId": "water",
            "quantity": 350,
            "unit": "ml",
            "state": "raw"
          }
        ],
        "equipment": [
          "stove"
        ],
        "activeMinutes": 10,
        "elapsedMinutes": 40,
        "steps": [
          {
            "id": "pea-rice-pot-1",
            "instructions": "Cut 100g onions into 5mm dice. Heat 15ml olive oil in a fitted-lid pot over medium-low heat and soften onion for 3 minutes. Rinse 160g rice, drain and stir it through the onion for 1 minute.",
            "ingredientRefs": [
              "onion",
              "oil",
              "rice"
            ],
            "durationRange": [
              3,
              5
            ],
            "equipmentIds": [
              "stove"
            ],
            "dependsOn": [],
            "doneCondition": "Complete the stated preparation, texture and serving checks before continuing."
          },
          {
            "id": "pea-rice-pot-2",
            "instructions": "Add 350ml recipe water, 3g salt and 1g black pepper, checking the rice packet ratio before cooking. Bring to a boil, cover and reduce to low for 12–15 minutes until most liquid is absorbed and rice has only a small firm centre.",
            "ingredientRefs": [
              "water",
              "salt",
              "pepper"
            ],
            "durationRange": [
              12,
              15
            ],
            "equipmentIds": [
              "stove"
            ],
            "dependsOn": [
              "pea-rice-pot-1"
            ],
            "doneCondition": "most liquid is absorbed and rice has only a small firm centre"
          },
          {
            "id": "pea-rice-pot-3",
            "instructions": "Scatter 200g peas over the rice, cover and cook for 5–7 minutes until peas are tender and rice is cooked through. If rice is dry but hard, add a little boiling processing water at the edge and cook covered for another 3 minutes. Rest off the heat for 5 minutes.",
            "ingredientRefs": [
              "pea"
            ],
            "durationRange": [
              5,
              7
            ],
            "equipmentIds": [
              "stove"
            ],
            "dependsOn": [
              "pea-rice-pot-2"
            ],
            "doneCondition": "peas are tender and rice is cooked through"
          },
          {
            "id": "pea-rice-pot-4",
            "instructions": "Fluff gently with a fork and stir through 20ml lemon juice. Divide into bowls while hot.",
            "ingredientRefs": [
              "lemon"
            ],
            "durationRange": [
              1,
              5
            ],
            "equipmentIds": [
              "stove"
            ],
            "dependsOn": [
              "pea-rice-pot-3"
            ],
            "doneCondition": "Complete the stated preparation, texture and serving checks before continuing."
          },
          {
            "id": "pea-rice-pot-5",
            "instructions": "The displayed quantities already match your selected servings. For 1 or 2 servings, use a smaller pan and check early; keep the stated cut sizes. For 4 servings use a broad pan or uncrowded trays; for 8 split every ingredient evenly into two 4-serving batches (more if the pan or pot capacity requires it). Keep pans below 80% full and vegetables in one layer when browning. Repeat the cooking and doneness checks for each batch; elapsed time increases for sequential batches. Serve promptly. Cool any extra cooked food in shallow containers and refrigerate within two hours, or one hour above 32°C. Keep the fridge at 4°C or below. Reheat cooked leftovers evenly to 74°C, checking several places with a food thermometer. Keep raw garnishes and cold yogurt or tahini sauces separate and use them cold within their label limits. For this planner, refrigerate cooked rice for at most 24 hours or freeze promptly on the preparation day after rapid cooling in shallow containers. This 24-hour rice limit is a conservative product choice, not a USDA-specific rice rule. Reheat the cooked portion evenly to 74°C with a thermometer.",
            "ingredientRefs": [],
            "durationRange": [
              1,
              5
            ],
            "equipmentIds": [
              "stove"
            ],
            "dependsOn": [
              "pea-rice-pot-4"
            ],
            "doneCondition": "Complete the stated preparation, texture and serving checks before continuing."
          }
        ],
        "storagePolicy": {
          "maxRefrigeratedHours": 24,
          "reheatC": 74,
          "sourceRefs": [
            "usda",
            "storage"
          ],
          "policyNote": "24 hours for cooked rice is a conservative product choice."
        },
        "provenance": {
          "type": "AI-assisted original",
          "accessedAt": "2026-10-04",
          "licenseStatus": "Original project content; MIT"
        },
        "potLitres": 2,
        "familyId": "grain-pots",
        "batchServings": 4,
        "makeAhead": {
          "id": "prep-pea-rice-pot",
          "title": "Pea rice pot",
          "ingredientIds": [
            "onion",
            "oil",
            "rice",
            "water",
            "salt",
            "pepper",
            "pea"
          ],
          "freezable": true,
          "storageKind": "cooked",
          "serveCold": false,
          "maxRefrigeratedHours": 24,
          "prepMinutes": 35,
          "finishMinutes": 10,
          "prepInstructions": [
            "Cut {qty:onion} into 5mm dice. Heat {qty:oil} in a fitted-lid pot over medium-low heat and soften onion for 3 minutes. Rinse {qty:rice}, drain and stir it through the onion for 1 minute.",
            "Add {qty:water}, {qty:salt} and {qty:pepper}, checking the rice packet ratio before cooking. Bring to a boil, cover and reduce to low for 12–15 minutes until most liquid is absorbed and rice has only a small firm centre.",
            "Scatter {qty:pea} over the rice, cover and cook for 5–7 minutes until peas are tender and rice is cooked through. If rice is dry but hard, add a little boiling processing water at the edge and cook covered for another 3 minutes. Rest off the heat for 5 minutes.",
            "The displayed quantities already match your selected servings. For 1 or 2 servings, use a smaller pan and check early; keep the stated cut sizes. For 4 servings use a broad pan or uncrowded trays; for 8 split every ingredient evenly into two 4-serving batches (more if the pan or pot capacity requires it). Keep pans below 80% full and vegetables in one layer when browning. Repeat the cooking and doneness checks for each batch; elapsed time increases for sequential batches.",
            "Serve promptly. Cool any extra cooked food in shallow containers and refrigerate within two hours, or one hour above 32°C. Keep the fridge at 4°C or below. Reheat cooked leftovers evenly to 74°C, checking several places with a food thermometer. Keep raw garnishes and cold yogurt or tahini sauces separate and use them cold within their label limits. For this planner, refrigerate cooked rice for at most 24 hours or freeze promptly on the preparation day after rapid cooling in shallow containers. This 24-hour rice limit is a conservative product choice, not a USDA-specific rice rule. Reheat the cooked portion evenly to 74°C with a thermometer."
          ],
          "finishInstructions": [
            "Use the labelled component for this dinner. If frozen promptly, thaw in the fridge the previous evening; if still frozen, heat gently from frozen, stirring where possible. Reheat cooked food evenly to 74°C with a thermometer before the fresh finishing steps. Add a splash of processing water if it catches, recording any extra water.",
            "Fluff gently with a fork and stir through {qty:lemon}. Divide into bowls while hot."
          ],
          "qualityNotes": "Cool quickly in shallow portions. The 24-hour refrigerated rice limit is this planner’s conservative choice; freeze promptly for later dinners. Add lemon after reheating."
        },
        "freezable": true,
        "finishAfterPrep": 10,
        "servings": 2
      },
      "batches": 1,
      "capacityNote": "Use 1 batch(es) with your 4L pot. Keep each load below 80% of capacity; roast no more than four servings per tray.",
      "finishMinutes": 40
    },
    {
      "dayIndex": 2,
      "date": "2026-10-28",
      "recipe": {
        "id": "roast-vegetable-pasta",
        "slug": "roast-vegetable-pasta",
        "title": "Roast vegetable pasta",
        "summary": "An uncrowded tray of caramelized vegetables folded through a simple tomato pasta sauce.",
        "version": 1,
        "locale": "en",
        "baseServings": 2,
        "ingredients": [
          {
            "ingredientId": "pasta",
            "quantity": 160,
            "unit": "g",
            "state": "dry"
          },
          {
            "ingredientId": "canned-tomato",
            "quantity": 400,
            "unit": "g",
            "state": "canned"
          },
          {
            "ingredientId": "zucchini",
            "quantity": 300,
            "unit": "g",
            "state": "raw"
          },
          {
            "ingredientId": "carrot",
            "quantity": 150,
            "unit": "g",
            "state": "raw"
          },
          {
            "ingredientId": "onion",
            "quantity": 100,
            "unit": "g",
            "state": "raw"
          },
          {
            "ingredientId": "oil",
            "quantity": 20,
            "unit": "ml",
            "state": "raw"
          },
          {
            "ingredientId": "salt",
            "quantity": 3,
            "unit": "g",
            "state": "dry"
          },
          {
            "ingredientId": "pepper",
            "quantity": 1,
            "unit": "g",
            "state": "dry"
          },
          {
            "ingredientId": "water",
            "quantity": 100,
            "unit": "ml",
            "state": "raw"
          }
        ],
        "equipment": [
          "stove",
          "oven"
        ],
        "activeMinutes": 12,
        "elapsedMinutes": 50,
        "steps": [
          {
            "id": "roast-vegetable-pasta-1",
            "instructions": "Heat the oven to 200°C. Cut 300g zucchini into 2cm pieces, 150g carrots into 1cm pieces and 100g onions into 2cm wedges. Toss with 20ml olive oil, two-thirds of 3g salt and 1g black pepper. Roast in one layer for 25–30 minutes, turning once, until carrots are tender and vegetable edges brown. Split crowded trays if vegetables steam. For shared preparation, skip this step and use only the labelled roast share for this dinner.",
            "ingredientRefs": [
              "zucchini",
              "carrot",
              "onion",
              "oil",
              "salt",
              "pepper"
            ],
            "durationRange": [
              25,
              30
            ],
            "equipmentIds": [
              "stove",
              "oven"
            ],
            "dependsOn": [],
            "doneCondition": "carrots are tender and vegetable edges brown"
          },
          {
            "id": "roast-vegetable-pasta-2",
            "instructions": "Simmer 400g canned tomatoes with 100ml recipe water and the remaining third of the measured salt over medium-low heat for 8–10 minutes, stirring until a spoon leaves a brief track. Add the roast share; if previously cooked and chilled, heat evenly to 74°C with a thermometer. Loosen a thick sauce with a little processing water.",
            "ingredientRefs": [
              "canned-tomato",
              "water"
            ],
            "durationRange": [
              8,
              10
            ],
            "equipmentIds": [
              "stove",
              "oven"
            ],
            "dependsOn": [
              "roast-vegetable-pasta-1"
            ],
            "doneCondition": "a spoon leaves a brief track"
          },
          {
            "id": "roast-vegetable-pasta-3",
            "instructions": "Start the pasta water while the roast finishes, using a separate pot from the tomato sauce. Boil about 2L processing water per two servings in a large pot. Add 160g pasta and cook for 8–12 minutes or the packet time, stirring early to prevent sticking. Taste a piece: the centre should be firm but no longer hard. Drain, retaining a little cooking water.",
            "ingredientRefs": [
              "pasta"
            ],
            "durationRange": [
              8,
              12
            ],
            "equipmentIds": [
              "stove",
              "oven"
            ],
            "dependsOn": [],
            "doneCondition": "Complete the stated preparation, texture and serving checks before continuing."
          },
          {
            "id": "roast-vegetable-pasta-4",
            "instructions": "Toss the pasta with the vegetable sauce over low heat for 1 minute. Add a spoonful of retained cooking water if the sauce clumps, then serve immediately.",
            "ingredientRefs": [],
            "durationRange": [
              1,
              5
            ],
            "equipmentIds": [
              "stove",
              "oven"
            ],
            "dependsOn": [
              "roast-vegetable-pasta-2",
              "roast-vegetable-pasta-3"
            ],
            "doneCondition": "Complete the stated preparation, texture and serving checks before continuing."
          },
          {
            "id": "roast-vegetable-pasta-5",
            "instructions": "The displayed quantities already match your selected servings. For 1 or 2 servings, use a smaller pan and check early; keep the stated cut sizes. For 4 servings use a broad pan or uncrowded trays; for 8 split every ingredient evenly into two 4-serving batches (more if the pan or pot capacity requires it). Keep pans below 80% full and vegetables in one layer when browning. Repeat the cooking and doneness checks for each batch; elapsed time increases for sequential batches. Serve promptly. Cool any extra cooked food in shallow containers and refrigerate within two hours, or one hour above 32°C. Keep the fridge at 4°C or below. Reheat cooked leftovers evenly to 74°C, checking several places with a food thermometer. Keep raw garnishes and cold yogurt or tahini sauces separate and use them cold within their label limits.",
            "ingredientRefs": [],
            "durationRange": [
              1,
              5
            ],
            "equipmentIds": [
              "stove",
              "oven"
            ],
            "dependsOn": [
              "roast-vegetable-pasta-4"
            ],
            "doneCondition": "Complete the stated preparation, texture and serving checks before continuing."
          }
        ],
        "storagePolicy": {
          "maxRefrigeratedHours": 72,
          "reheatC": 74,
          "sourceRefs": [
            "usda",
            "storage"
          ]
        },
        "provenance": {
          "type": "AI-assisted original",
          "accessedAt": "2026-10-04",
          "licenseStatus": "Original project content; MIT"
        },
        "component": "roast",
        "finishAfterPrep": 20,
        "potLitres": 4,
        "processingWaterMl": 2000,
        "familyId": "tray-roast",
        "batchServings": 4,
        "makeAhead": null,
        "makeAheadNote": "The weekly shared roast is tracked as its own component; cook the grain or pasta and remaining ingredients at serving.",
        "servings": 2
      },
      "batches": 1,
      "capacityNote": "Use 1 batch(es) with your 4L pot. Keep each load below 80% of capacity; roast no more than four servings per tray.",
      "finishMinutes": 20
    },
    {
      "dayIndex": 3,
      "date": "2026-10-29",
      "recipe": {
        "id": "lemon-bean-wraps",
        "slug": "lemon-bean-wraps",
        "title": "Lemon bean wraps",
        "summary": "Half-mashed white beans make a creamy lemon filling for crisp vegetable wraps.",
        "version": 1,
        "locale": "en",
        "baseServings": 2,
        "ingredients": [
          {
            "ingredientId": "tortilla",
            "quantity": 4,
            "unit": "count",
            "state": "cooked"
          },
          {
            "ingredientId": "white-bean",
            "quantity": 240,
            "unit": "g",
            "state": "drained"
          },
          {
            "ingredientId": "cabbage",
            "quantity": 200,
            "unit": "g",
            "state": "raw"
          },
          {
            "ingredientId": "carrot",
            "quantity": 150,
            "unit": "g",
            "state": "raw"
          },
          {
            "ingredientId": "lemon",
            "quantity": 20,
            "unit": "ml",
            "state": "raw"
          },
          {
            "ingredientId": "oil",
            "quantity": 10,
            "unit": "ml",
            "state": "raw"
          },
          {
            "ingredientId": "salt",
            "quantity": 3,
            "unit": "g",
            "state": "dry"
          },
          {
            "ingredientId": "pepper",
            "quantity": 1,
            "unit": "g",
            "state": "dry"
          }
        ],
        "equipment": [
          "stove"
        ],
        "activeMinutes": 12,
        "elapsedMinutes": 20,
        "steps": [
          {
            "id": "lemon-bean-wraps-1",
            "instructions": "Drain 240g white beans. Mash half with 20ml lemon juice, 3g salt and 1g black pepper; leave the other half whole for texture. The mash should hold together on a spoon rather than run.",
            "ingredientRefs": [
              "white-bean",
              "lemon",
              "salt",
              "pepper"
            ],
            "durationRange": [
              1,
              5
            ],
            "equipmentIds": [
              "stove"
            ],
            "dependsOn": [],
            "doneCondition": "Complete the stated preparation, texture and serving checks before continuing."
          },
          {
            "id": "lemon-bean-wraps-2",
            "instructions": "Heat 10ml olive oil in a skillet over medium-low heat. Add all the mashed and whole beans and cook for 5 minutes, stirring until steaming. If too stiff to spread, stir in a little processing water; if loose, cook uncovered briefly.",
            "ingredientRefs": [
              "oil"
            ],
            "durationRange": [
              5,
              7
            ],
            "equipmentIds": [
              "stove"
            ],
            "dependsOn": [
              "lemon-bean-wraps-1"
            ],
            "doneCondition": "steaming"
          },
          {
            "id": "lemon-bean-wraps-3",
            "instructions": "Wash and dry 200g cabbage, then shred into 2mm ribbons. Grate 150g carrots coarsely. Warm 4 pieces plain flour tortillas in a dry pan for 20–30 seconds on each side until supple; check the actual brand ingredients.",
            "ingredientRefs": [
              "cabbage",
              "carrot",
              "tortilla"
            ],
            "durationRange": [
              1,
              5
            ],
            "equipmentIds": [
              "stove"
            ],
            "dependsOn": [
              "lemon-bean-wraps-2"
            ],
            "doneCondition": "supple; check the actual brand ingredients"
          },
          {
            "id": "lemon-bean-wraps-4",
            "instructions": "Divide the bean filling and raw vegetables evenly between the warm tortillas. Fold in the sides and roll; add the crunchy vegetables just before serving so they stay crisp.",
            "ingredientRefs": [],
            "durationRange": [
              1,
              5
            ],
            "equipmentIds": [
              "stove"
            ],
            "dependsOn": [
              "lemon-bean-wraps-3"
            ],
            "doneCondition": "Complete the stated preparation, texture and serving checks before continuing."
          },
          {
            "id": "lemon-bean-wraps-5",
            "instructions": "The displayed quantities already match your selected servings. For 1 or 2 servings, use a smaller pan and check early; keep the stated cut sizes. For 4 servings use a broad pan or uncrowded trays; for 8 split every ingredient evenly into two 4-serving batches (more if the pan or pot capacity requires it). Keep pans below 80% full and vegetables in one layer when browning. Repeat the cooking and doneness checks for each batch; elapsed time increases for sequential batches. Serve promptly. Cool any extra cooked food in shallow containers and refrigerate within two hours, or one hour above 32°C. Keep the fridge at 4°C or below. Reheat cooked leftovers evenly to 74°C, checking several places with a food thermometer. Keep raw garnishes and cold yogurt or tahini sauces separate and use them cold within their label limits.",
            "ingredientRefs": [],
            "durationRange": [
              1,
              5
            ],
            "equipmentIds": [
              "stove"
            ],
            "dependsOn": [
              "lemon-bean-wraps-4"
            ],
            "doneCondition": "Complete the stated preparation, texture and serving checks before continuing."
          }
        ],
        "storagePolicy": {
          "maxRefrigeratedHours": 72,
          "reheatC": 74,
          "sourceRefs": [
            "usda",
            "storage"
          ]
        },
        "provenance": {
          "type": "AI-assisted original",
          "accessedAt": "2026-10-04",
          "licenseStatus": "Original project content; MIT"
        },
        "potLitres": 2,
        "familyId": "filled-wraps",
        "batchServings": 4,
        "makeAhead": {
          "id": "prep-lemon-bean-wraps",
          "title": "Lemon white bean filling",
          "ingredientIds": [
            "white-bean",
            "lemon",
            "salt",
            "pepper",
            "oil"
          ],
          "freezable": true,
          "storageKind": "cooked",
          "serveCold": false,
          "maxRefrigeratedHours": 72,
          "prepMinutes": 10,
          "finishMinutes": 8,
          "prepInstructions": [
            "Drain {qty:white-bean}. Mash half with {qty:lemon}, {qty:salt} and {qty:pepper}; leave the other half whole for texture. The mash should hold together on a spoon rather than run.",
            "Heat {qty:oil} in a skillet over medium-low heat. Add all the mashed and whole beans and cook for 5 minutes, stirring until steaming. If too stiff to spread, stir in a little processing water; if loose, cook uncovered briefly.",
            "The displayed quantities already match your selected servings. For 1 or 2 servings, use a smaller pan and check early; keep the stated cut sizes. For 4 servings use a broad pan or uncrowded trays; for 8 split every ingredient evenly into two 4-serving batches (more if the pan or pot capacity requires it). Keep pans below 80% full and vegetables in one layer when browning. Repeat the cooking and doneness checks for each batch; elapsed time increases for sequential batches.",
            "Serve promptly. Cool any extra cooked food in shallow containers and refrigerate within two hours, or one hour above 32°C. Keep the fridge at 4°C or below. Reheat cooked leftovers evenly to 74°C, checking several places with a food thermometer. Keep raw garnishes and cold yogurt or tahini sauces separate and use them cold within their label limits."
          ],
          "finishInstructions": [
            "Use the labelled component for this dinner. If frozen promptly, thaw in the fridge the previous evening; if still frozen, heat gently from frozen, stirring where possible. Reheat cooked food evenly to 74°C with a thermometer before the fresh finishing steps. Add a splash of processing water if it catches, recording any extra water.",
            "Wash and dry {qty:cabbage}, then shred into 2mm ribbons. Grate {qty:carrot} coarsely. Warm {qty:tortilla} in a dry pan for 20–30 seconds on each side until supple; check the actual brand ingredients.",
            "Divide the bean filling and raw vegetables evenly between the warm tortillas. Fold in the sides and roll; add the crunchy vegetables just before serving so they stay crisp."
          ],
          "qualityNotes": "Freeze promptly on preparation day for dinners outside the refrigerated window. Texture may soften after freezing; keep the fresh finish separate."
        },
        "freezable": true,
        "finishAfterPrep": 8,
        "servings": 2
      },
      "batches": 1,
      "capacityNote": "Use 1 batch(es) with your 4L pot. Keep each load below 80% of capacity; roast no more than four servings per tray.",
      "finishMinutes": 20
    },
    {
      "dayIndex": 4,
      "date": "2026-10-30",
      "recipe": {
        "id": "lentil-cabbage-soup",
        "slug": "lentil-cabbage-soup",
        "title": "Lentil cabbage soup",
        "summary": "A tomato-free lentil soup with soft potato cubes, sweet carrots and ribbons of cabbage.",
        "version": 1,
        "locale": "en",
        "baseServings": 2,
        "ingredients": [
          {
            "ingredientId": "lentil",
            "quantity": 160,
            "unit": "g",
            "state": "dry"
          },
          {
            "ingredientId": "cabbage",
            "quantity": 300,
            "unit": "g",
            "state": "raw"
          },
          {
            "ingredientId": "carrot",
            "quantity": 200,
            "unit": "g",
            "state": "raw"
          },
          {
            "ingredientId": "onion",
            "quantity": 100,
            "unit": "g",
            "state": "raw"
          },
          {
            "ingredientId": "potato",
            "quantity": 200,
            "unit": "g",
            "state": "raw"
          },
          {
            "ingredientId": "oil",
            "quantity": 15,
            "unit": "ml",
            "state": "raw"
          },
          {
            "ingredientId": "salt",
            "quantity": 3,
            "unit": "g",
            "state": "dry"
          },
          {
            "ingredientId": "pepper",
            "quantity": 1,
            "unit": "g",
            "state": "dry"
          },
          {
            "ingredientId": "water",
            "quantity": 900,
            "unit": "ml",
            "state": "raw"
          }
        ],
        "equipment": [
          "stove"
        ],
        "activeMinutes": 15,
        "elapsedMinutes": 50,
        "steps": [
          {
            "id": "lentil-cabbage-soup-1",
            "instructions": "Sort and rinse 160g red lentils. Cut 200g carrots and 200g potatoes into 1cm cubes, 100g onions into 5mm dice and 300g cabbage into 5mm ribbons. Heat 15ml olive oil in a large pot over medium heat and soften onion and carrot for 5 minutes.",
            "ingredientRefs": [
              "lentil",
              "carrot",
              "potato",
              "onion",
              "cabbage",
              "oil"
            ],
            "durationRange": [
              5,
              7
            ],
            "equipmentIds": [
              "stove"
            ],
            "dependsOn": [],
            "doneCondition": "Complete the stated preparation, texture and serving checks before continuing."
          },
          {
            "id": "lentil-cabbage-soup-2",
            "instructions": "Add lentils, potatoes and 900ml recipe water. Bring to a boil, partly cover and simmer over low heat for 20–30 minutes, stirring occasionally, until lentils break down and potatoes are fork-tender. If the base catches, lower the heat and add a little hot processing water.",
            "ingredientRefs": [
              "water"
            ],
            "durationRange": [
              20,
              30
            ],
            "equipmentIds": [
              "stove"
            ],
            "dependsOn": [
              "lentil-cabbage-soup-1"
            ],
            "doneCondition": "lentils break down and potatoes are fork-tender"
          },
          {
            "id": "lentil-cabbage-soup-3",
            "instructions": "Add cabbage, 3g salt and 1g black pepper; simmer for 5–8 minutes until the thickest cabbage ribs are tender. If it is too thick to ladle, add and record extra processing water.",
            "ingredientRefs": [
              "salt",
              "pepper"
            ],
            "durationRange": [
              5,
              8
            ],
            "equipmentIds": [
              "stove"
            ],
            "dependsOn": [
              "lentil-cabbage-soup-2"
            ],
            "doneCondition": "the thickest cabbage ribs are tender"
          },
          {
            "id": "lentil-cabbage-soup-4",
            "instructions": "Rest for 2 minutes and serve in warmed bowls. Freeze late-week prep portions promptly in shallow containers on preparation day.",
            "ingredientRefs": [],
            "durationRange": [
              2,
              4
            ],
            "equipmentIds": [
              "stove"
            ],
            "dependsOn": [
              "lentil-cabbage-soup-3"
            ],
            "doneCondition": "Complete the stated preparation, texture and serving checks before continuing."
          },
          {
            "id": "lentil-cabbage-soup-5",
            "instructions": "The displayed quantities already match your selected servings. For 1 serving use a small covered pot and check liquid early; for 2 use the stated method. For 4 or 8 use the planned pot-capacity batches and divide every ingredient proportionally. Keep each pot below 80% full. Maintain a gentle simmer and judge each batch by texture, not by multiplying the cooking time. Serve promptly. Cool any extra cooked food in shallow containers and refrigerate within two hours, or one hour above 32°C. Keep the fridge at 4°C or below. Reheat cooked leftovers evenly to 74°C, checking several places with a food thermometer. Keep raw garnishes and cold yogurt or tahini sauces separate and use them cold within their label limits.",
            "ingredientRefs": [],
            "durationRange": [
              1,
              5
            ],
            "equipmentIds": [
              "stove"
            ],
            "dependsOn": [
              "lentil-cabbage-soup-4"
            ],
            "doneCondition": "Complete the stated preparation, texture and serving checks before continuing."
          }
        ],
        "storagePolicy": {
          "maxRefrigeratedHours": 72,
          "reheatC": 74,
          "sourceRefs": [
            "usda",
            "storage"
          ]
        },
        "provenance": {
          "type": "AI-assisted original",
          "accessedAt": "2026-10-04",
          "licenseStatus": "Original project content; MIT"
        },
        "freezable": true,
        "potLitres": 4,
        "familyId": "simmered-pots",
        "batchServings": 8,
        "makeAhead": {
          "id": "prep-lentil-cabbage-soup",
          "title": "Lentil cabbage soup",
          "ingredientIds": [
            "lentil",
            "carrot",
            "potato",
            "onion",
            "cabbage",
            "oil",
            "water",
            "salt",
            "pepper"
          ],
          "freezable": true,
          "storageKind": "cooked",
          "serveCold": false,
          "maxRefrigeratedHours": 72,
          "prepMinutes": 48,
          "finishMinutes": 12,
          "prepInstructions": [
            "Sort and rinse {qty:lentil}. Cut {qty:carrot} and {qty:potato} into 1cm cubes, {qty:onion} into 5mm dice and {qty:cabbage} into 5mm ribbons. Heat {qty:oil} in a large pot over medium heat and soften onion and carrot for 5 minutes.",
            "Add lentils, potatoes and {qty:water}. Bring to a boil, partly cover and simmer over low heat for 20–30 minutes, stirring occasionally, until lentils break down and potatoes are fork-tender. If the base catches, lower the heat and add a little hot processing water.",
            "Add cabbage, {qty:salt} and {qty:pepper}; simmer for 5–8 minutes until the thickest cabbage ribs are tender. If it is too thick to ladle, add and record extra processing water.",
            "The displayed quantities already match your selected servings. For 1 serving use a small covered pot and check liquid early; for 2 use the stated method. For 4 or 8 use the planned pot-capacity batches and divide every ingredient proportionally. Keep each pot below 80% full. Maintain a gentle simmer and judge each batch by texture, not by multiplying the cooking time.",
            "Serve promptly. Cool any extra cooked food in shallow containers and refrigerate within two hours, or one hour above 32°C. Keep the fridge at 4°C or below. Reheat cooked leftovers evenly to 74°C, checking several places with a food thermometer. Keep raw garnishes and cold yogurt or tahini sauces separate and use them cold within their label limits."
          ],
          "finishInstructions": [
            "Use the labelled component for this dinner. If frozen promptly, thaw in the fridge the previous evening; if still frozen, heat gently from frozen, stirring where possible. Reheat cooked food evenly to 74°C with a thermometer before the fresh finishing steps. Add a splash of processing water if it catches, recording any extra water.",
            "Rest for 2 minutes and serve in warmed bowls. Freeze late-week prep portions promptly in shallow containers on preparation day."
          ],
          "qualityNotes": "Freeze promptly on preparation day for dinners outside the refrigerated window. Texture may soften after freezing; keep the fresh finish separate."
        },
        "finishAfterPrep": 12,
        "servings": 2
      },
      "batches": 1,
      "capacityNote": "Use 1 batch(es) with your 4L pot. Keep each load below 80% of capacity; roast no more than four servings per tray.",
      "finishMinutes": 50
    }
  ],
  "shopping": [
    {
      "ingredientId": "couscous",
      "name": "Couscous",
      "required": 160,
      "prepared": 0,
      "pantryUsed": 0,
      "initial": 0,
      "net": 160,
      "purchased": 500,
      "remaining": 340,
      "unit": "g",
      "state": "dry",
      "packageQty": 500,
      "packCount": 1,
      "notPurchased": false,
      "packAssumption": "Example package: 500g usable quantity. Confirm label/edible weight.",
      "retained": 0
    },
    {
      "ingredientId": "chickpea",
      "name": "Chickpeas",
      "required": 240,
      "prepared": 0,
      "pantryUsed": 0,
      "initial": 0,
      "net": 240,
      "purchased": 240,
      "remaining": 0,
      "unit": "g",
      "state": "drained",
      "packageQty": 240,
      "packCount": 1,
      "notPurchased": false,
      "packAssumption": "Example: 400g gross can, 240g drained. Confirm your label.",
      "retained": 0
    },
    {
      "ingredientId": "zucchini",
      "name": "Zucchini",
      "required": 600,
      "prepared": 0,
      "pantryUsed": 0,
      "initial": 0,
      "net": 600,
      "purchased": 600,
      "remaining": 0,
      "unit": "g",
      "state": "raw",
      "packageQty": 0,
      "packCount": 1,
      "notPurchased": false,
      "packAssumption": "Buy exact edible weight; record any trimming losses.",
      "retained": 0
    },
    {
      "ingredientId": "carrot",
      "name": "Carrots",
      "required": 650,
      "prepared": 0,
      "pantryUsed": 0,
      "initial": 0,
      "net": 650,
      "purchased": 1000,
      "remaining": 350,
      "unit": "g",
      "state": "raw",
      "packageQty": 1000,
      "packCount": 1,
      "notPurchased": false,
      "packAssumption": "Example package: 1000g usable quantity. Confirm label/edible weight.",
      "retained": 0
    },
    {
      "ingredientId": "onion",
      "name": "Onions",
      "required": 400,
      "prepared": 0,
      "pantryUsed": 0,
      "initial": 0,
      "net": 400,
      "purchased": 500,
      "remaining": 100,
      "unit": "g",
      "state": "raw",
      "packageQty": 500,
      "packCount": 1,
      "notPurchased": false,
      "packAssumption": "Example package: 500g usable quantity. Confirm label/edible weight.",
      "retained": 0
    },
    {
      "ingredientId": "oil",
      "name": "Olive oil",
      "required": 80,
      "prepared": 0,
      "pantryUsed": 0,
      "initial": 0,
      "net": 80,
      "purchased": 500,
      "remaining": 420,
      "unit": "ml",
      "state": "raw",
      "packageQty": 500,
      "packCount": 1,
      "notPurchased": false,
      "packAssumption": "Example package: 500ml usable quantity. Confirm label/edible weight.",
      "retained": 0
    },
    {
      "ingredientId": "lemon",
      "name": "Lemon juice",
      "required": 60,
      "prepared": 0,
      "pantryUsed": 0,
      "initial": 0,
      "net": 60,
      "purchased": 250,
      "remaining": 190,
      "unit": "ml",
      "state": "raw",
      "packageQty": 250,
      "packCount": 1,
      "notPurchased": false,
      "packAssumption": "Example package: 250ml usable quantity. Confirm label/edible weight.",
      "retained": 0
    },
    {
      "ingredientId": "salt",
      "name": "Salt",
      "required": 15,
      "prepared": 0,
      "pantryUsed": 0,
      "initial": 0,
      "net": 15,
      "purchased": 250,
      "remaining": 235,
      "unit": "g",
      "state": "dry",
      "packageQty": 250,
      "packCount": 1,
      "notPurchased": false,
      "packAssumption": "Example package: 250g usable quantity. Confirm label/edible weight.",
      "retained": 0
    },
    {
      "ingredientId": "pepper",
      "name": "Black pepper",
      "required": 5,
      "prepared": 0,
      "pantryUsed": 0,
      "initial": 0,
      "net": 5,
      "purchased": 50,
      "remaining": 45,
      "unit": "g",
      "state": "dry",
      "packageQty": 50,
      "packCount": 1,
      "notPurchased": false,
      "packAssumption": "Example package: 50g usable quantity. Confirm label/edible weight.",
      "retained": 0
    },
    {
      "ingredientId": "water",
      "name": "Recipe water",
      "required": 1550,
      "prepared": 0,
      "pantryUsed": 0,
      "initial": 0,
      "net": 1550,
      "purchased": 0,
      "remaining": 0,
      "unit": "ml",
      "state": "raw",
      "packageQty": 0,
      "packCount": 0,
      "notPurchased": true,
      "packAssumption": "Tap water; recipe water excludes processing water.",
      "retained": 0
    },
    {
      "ingredientId": "rice",
      "name": "Rice",
      "required": 160,
      "prepared": 0,
      "pantryUsed": 0,
      "initial": 0,
      "net": 160,
      "purchased": 500,
      "remaining": 340,
      "unit": "g",
      "state": "dry",
      "packageQty": 500,
      "packCount": 1,
      "notPurchased": false,
      "packAssumption": "Example package: 500g usable quantity. Confirm label/edible weight.",
      "retained": 0
    },
    {
      "ingredientId": "pea",
      "name": "Peas",
      "required": 200,
      "prepared": 0,
      "pantryUsed": 0,
      "initial": 0,
      "net": 200,
      "purchased": 500,
      "remaining": 300,
      "unit": "g",
      "state": "frozen",
      "packageQty": 500,
      "packCount": 1,
      "notPurchased": false,
      "packAssumption": "Example package: 500g usable quantity. Confirm label/edible weight.",
      "retained": 0
    },
    {
      "ingredientId": "pasta",
      "name": "Pasta",
      "required": 160,
      "prepared": 0,
      "pantryUsed": 0,
      "initial": 0,
      "net": 160,
      "purchased": 500,
      "remaining": 340,
      "unit": "g",
      "state": "dry",
      "packageQty": 500,
      "packCount": 1,
      "notPurchased": false,
      "packAssumption": "Example package: 500g usable quantity. Confirm label/edible weight.",
      "retained": 0
    },
    {
      "ingredientId": "canned-tomato",
      "name": "Canned tomatoes",
      "required": 400,
      "prepared": 0,
      "pantryUsed": 0,
      "initial": 0,
      "net": 400,
      "purchased": 400,
      "remaining": 0,
      "unit": "g",
      "state": "canned",
      "packageQty": 400,
      "packCount": 1,
      "notPurchased": false,
      "packAssumption": "Example package: 400g usable quantity. Confirm label/edible weight.",
      "retained": 0
    },
    {
      "ingredientId": "tortilla",
      "name": "Plain flour tortillas",
      "required": 4,
      "prepared": 0,
      "pantryUsed": 0,
      "initial": 0,
      "net": 4,
      "purchased": 8,
      "remaining": 4,
      "unit": "count",
      "state": "cooked",
      "packageQty": 8,
      "packCount": 1,
      "notPurchased": false,
      "packAssumption": "Reference recipe: wheat, water, oil, salt. Check the actual brand for milk, soy and other ingredients.",
      "retained": 0
    },
    {
      "ingredientId": "white-bean",
      "name": "White beans",
      "required": 240,
      "prepared": 0,
      "pantryUsed": 0,
      "initial": 0,
      "net": 240,
      "purchased": 240,
      "remaining": 0,
      "unit": "g",
      "state": "drained",
      "packageQty": 240,
      "packCount": 1,
      "notPurchased": false,
      "packAssumption": "Example package: 240g usable quantity. Confirm label/edible weight.",
      "retained": 0
    },
    {
      "ingredientId": "cabbage",
      "name": "Cabbage",
      "required": 500,
      "prepared": 0,
      "pantryUsed": 0,
      "initial": 0,
      "net": 500,
      "purchased": 800,
      "remaining": 300,
      "unit": "g",
      "state": "raw",
      "packageQty": 800,
      "packCount": 1,
      "notPurchased": false,
      "packAssumption": "Example package: 800g usable quantity. Confirm label/edible weight.",
      "retained": 0
    },
    {
      "ingredientId": "lentil",
      "name": "Red lentils",
      "required": 160,
      "prepared": 0,
      "pantryUsed": 0,
      "initial": 0,
      "net": 160,
      "purchased": 500,
      "remaining": 340,
      "unit": "g",
      "state": "dry",
      "packageQty": 500,
      "packCount": 1,
      "notPurchased": false,
      "packAssumption": "Example package: 500g usable quantity. Confirm label/edible weight.",
      "retained": 0
    },
    {
      "ingredientId": "potato",
      "name": "Potatoes",
      "required": 200,
      "prepared": 0,
      "pantryUsed": 0,
      "initial": 0,
      "net": 200,
      "purchased": 1000,
      "remaining": 800,
      "unit": "g",
      "state": "raw",
      "packageQty": 1000,
      "packCount": 1,
      "notPurchased": false,
      "packAssumption": "Example package: 1000g usable quantity. Confirm label/edible weight.",
      "retained": 0
    }
  ],
  "warnings": [
    "Reference packaged-food ingredients may differ by brand. Check actual labels and cross-contact information. Exclusions filter recipe ingredients and cannot certify allergy safety."
  ],
  "schedule": [
    {
      "id": "check",
      "duration": 5,
      "resources": [
        "person"
      ],
      "dependsOn": [],
      "label": "Check labels, edible pantry quantities, usable dates, containers and fridge / freezer temperatures.",
      "start": 0,
      "end": 5
    },
    {
      "id": "cut-roast",
      "duration": 15,
      "resources": [
        "person"
      ],
      "dependsOn": [
        "check"
      ],
      "label": "Heat the oven to 200°C. Cut zucchini into 2cm pieces, carrots into 1cm pieces and onion into 2cm wedges. Toss 600g zucchini, 300g carrots, 200g onions, 40ml olive oil, 4g salt and 2g black pepper.",
      "start": 5,
      "end": 20
    },
    {
      "id": "roast",
      "duration": 30,
      "resources": [
        "oven"
      ],
      "dependsOn": [
        "cut-roast"
      ],
      "label": "Spread in one uncrowded layer. Roast for 25–35 minutes, turning halfway, until carrots yield to a fork and the edges brown. Split crowded trays into separate oven loads.",
      "start": 20,
      "end": 50
    },
    {
      "id": "portion-roast",
      "duration": 5,
      "resources": [
        "person"
      ],
      "dependsOn": [
        "roast"
      ],
      "label": "Weigh actual cooked output Y. Divide into 2 equal shares (Y/2), label dates and chill promptly in shallow containers. Raw-equivalent weights are accounting only.",
      "start": 50,
      "end": 55
    }
  ],
  "transitions": [
    {
      "from": "shared-roast",
      "componentId": "shared-roast",
      "to": "lemon-chickpea-couscous",
      "dayIndex": 0,
      "preparedAt": "2026-10-25T19:55:00",
      "useAt": "2026-10-26T18:00:00",
      "storageType": "refrigerated",
      "hours": 22.083333333333332,
      "allowed": true,
      "action": "Refrigerate promptly at 4°C or below. Reheat cooked food to 74°C, checked with a thermometer.",
      "freezeAt": null,
      "thawAt": null,
      "thawed": false,
      "plannedThawAt": null,
      "useBy": "2026-10-28T19:55:00",
      "portion": "Y/2"
    },
    {
      "from": "shared-roast",
      "componentId": "shared-roast",
      "to": "roast-vegetable-pasta",
      "dayIndex": 2,
      "preparedAt": "2026-10-25T19:55:00",
      "useAt": "2026-10-28T18:00:00",
      "storageType": "refrigerated",
      "hours": 70.08333333333333,
      "allowed": true,
      "action": "Refrigerate promptly at 4°C or below. Reheat cooked food to 74°C, checked with a thermometer.",
      "freezeAt": null,
      "thawAt": null,
      "thawed": false,
      "plannedThawAt": null,
      "useBy": "2026-10-28T19:55:00",
      "portion": "Y/2"
    }
  ],
  "prepComponents": [
    {
      "id": "shared-roast",
      "title": "Shared roasted vegetables",
      "recipeIds": [
        "lemon-chickpea-couscous",
        "roast-vegetable-pasta"
      ],
      "ingredientIds": [
        "zucchini",
        "carrot",
        "onion",
        "oil",
        "salt",
        "pepper"
      ],
      "baseAmounts": {
        "zucchini": 300,
        "carrot": 150,
        "onion": 100,
        "oil": 20,
        "salt": 2,
        "pepper": 1
      },
      "freezable": true,
      "storageKind": "cooked",
      "maxRefrigeratedHours": 72,
      "prepMinutes": 50,
      "finishMinutes": 12,
      "qualityNotes": "Weigh the cooked output Y and divide it equally. Raw ingredient amounts are accounting equivalents, not cooked weights.",
      "prepInstructions": [
        "Heat the oven to 200°C. Cut zucchini into 2cm pieces, carrots into 1cm pieces and onion into 2cm wedges. Toss 600g zucchini, 300g carrots, 200g onions, 40ml olive oil, 4g salt and 2g black pepper.",
        "Spread in one uncrowded layer. Roast for 25–35 minutes, turning halfway, until carrots yield to a fork and the edges brown. Split crowded trays into separate oven loads.",
        "Weigh output Y, divide into the labelled shares and chill promptly in shallow containers."
      ],
      "finishInstructions": [
        "Use one original labelled share. Reheat the cooked vegetables to 74°C, checked with a thermometer, then follow the dinner’s fresh finishing steps."
      ],
      "rawAmounts": [
        {
          "ingredientId": "zucchini",
          "quantity": 600,
          "unit": "g"
        },
        {
          "ingredientId": "carrot",
          "quantity": 300,
          "unit": "g"
        },
        {
          "ingredientId": "onion",
          "quantity": 200,
          "unit": "g"
        },
        {
          "ingredientId": "oil",
          "quantity": 40,
          "unit": "ml"
        },
        {
          "ingredientId": "salt",
          "quantity": 4,
          "unit": "g"
        },
        {
          "ingredientId": "pepper",
          "quantity": 2,
          "unit": "g"
        }
      ],
      "portions": 2,
      "servings": 2,
      "signature": "[{\"ingredientId\":\"zucchini\",\"quantity\":600,\"unit\":\"g\"},{\"ingredientId\":\"carrot\",\"quantity\":300,\"unit\":\"g\"},{\"ingredientId\":\"onion\",\"quantity\":200,\"unit\":\"g\"},{\"ingredientId\":\"oil\",\"quantity\":40,\"unit\":\"ml\"},{\"ingredientId\":\"salt\",\"quantity\":4,\"unit\":\"g\"},{\"ingredientId\":\"pepper\",\"quantity\":2,\"unit\":\"g\"}]",
      "selected": true,
      "prepared": false,
      "preparedAt": "2026-10-25T19:55:00",
      "storage": "refrigerated",
      "retainedPortions": 0,
      "scheduledPortions": 2,
      "uses": [
        {
          "dayIndex": 0,
          "recipeId": "lemon-chickpea-couscous",
          "date": "2026-10-26"
        },
        {
          "dayIndex": 2,
          "recipeId": "roast-vegetable-pasta",
          "date": "2026-10-28"
        }
      ],
      "eligibleStorage": [
        "refrigerated",
        "frozen"
      ],
      "pantryAllocations": {},
      "sourceRefs": [
        "fda-storage",
        "fda-chill",
        "foodsafety-cold-storage"
      ],
      "finishTaskId": "portion-roast",
      "useBy": "2026-10-28T19:55:00",
      "openedAt": null
    },
    {
      "id": "prep-pea-rice-pot",
      "title": "Pea rice pot",
      "ingredientIds": [
        "onion",
        "oil",
        "rice",
        "water",
        "salt",
        "pepper",
        "pea"
      ],
      "freezable": true,
      "storageKind": "cooked",
      "serveCold": false,
      "maxRefrigeratedHours": 24,
      "prepMinutes": 35,
      "finishMinutes": 10,
      "prepInstructions": [
        "Cut 100g onions into 5mm dice. Heat 15ml olive oil in a fitted-lid pot over medium-low heat and soften onion for 3 minutes. Rinse 160g rice, drain and stir it through the onion for 1 minute.",
        "Add 350ml recipe water, 3g salt and 1g black pepper, checking the rice packet ratio before cooking. Bring to a boil, cover and reduce to low for 12–15 minutes until most liquid is absorbed and rice has only a small firm centre.",
        "Scatter 200g peas over the rice, cover and cook for 5–7 minutes until peas are tender and rice is cooked through. If rice is dry but hard, add a little boiling processing water at the edge and cook covered for another 3 minutes. Rest off the heat for 5 minutes.",
        "The displayed quantities already match your selected servings. For 1 or 2 servings, use a smaller pan and check early; keep the stated cut sizes. For 4 servings use a broad pan or uncrowded trays; for 8 split every ingredient evenly into two 4-serving batches (more if the pan or pot capacity requires it). Keep pans below 80% full and vegetables in one layer when browning. Repeat the cooking and doneness checks for each batch; elapsed time increases for sequential batches.",
        "Serve promptly. Cool any extra cooked food in shallow containers and refrigerate within two hours, or one hour above 32°C. Keep the fridge at 4°C or below. Reheat cooked leftovers evenly to 74°C, checking several places with a food thermometer. Keep raw garnishes and cold yogurt or tahini sauces separate and use them cold within their label limits. For this planner, refrigerate cooked rice for at most 24 hours or freeze promptly on the preparation day after rapid cooling in shallow containers. This 24-hour rice limit is a conservative product choice, not a USDA-specific rice rule. Reheat the cooked portion evenly to 74°C with a thermometer."
      ],
      "finishInstructions": [
        "Use the labelled component for this dinner. If frozen promptly, thaw in the fridge the previous evening; if still frozen, heat gently from frozen, stirring where possible. Reheat cooked food evenly to 74°C with a thermometer before the fresh finishing steps. Add a splash of processing water if it catches, recording any extra water.",
        "Fluff gently with a fork and stir through 20ml lemon juice. Divide into bowls while hot."
      ],
      "qualityNotes": "Cool quickly in shallow portions. The 24-hour refrigerated rice limit is this planner’s conservative choice; freeze promptly for later dinners. Add lemon after reheating.",
      "recipeIds": [
        "pea-rice-pot"
      ],
      "baseAmounts": {
        "rice": 160,
        "pea": 200,
        "onion": 100,
        "oil": 15,
        "salt": 3,
        "pepper": 1,
        "water": 350
      },
      "rawAmounts": [
        {
          "ingredientId": "rice",
          "quantity": 160,
          "unit": "g"
        },
        {
          "ingredientId": "pea",
          "quantity": 200,
          "unit": "g"
        },
        {
          "ingredientId": "onion",
          "quantity": 100,
          "unit": "g"
        },
        {
          "ingredientId": "oil",
          "quantity": 15,
          "unit": "ml"
        },
        {
          "ingredientId": "salt",
          "quantity": 3,
          "unit": "g"
        },
        {
          "ingredientId": "pepper",
          "quantity": 1,
          "unit": "g"
        },
        {
          "ingredientId": "water",
          "quantity": 350,
          "unit": "ml"
        }
      ],
      "portions": 1,
      "servings": 2,
      "signature": "[{\"ingredientId\":\"rice\",\"quantity\":160,\"unit\":\"g\"},{\"ingredientId\":\"pea\",\"quantity\":200,\"unit\":\"g\"},{\"ingredientId\":\"onion\",\"quantity\":100,\"unit\":\"g\"},{\"ingredientId\":\"oil\",\"quantity\":15,\"unit\":\"ml\"},{\"ingredientId\":\"salt\",\"quantity\":3,\"unit\":\"g\"},{\"ingredientId\":\"pepper\",\"quantity\":1,\"unit\":\"g\"},{\"ingredientId\":\"water\",\"quantity\":350,\"unit\":\"ml\"}]",
      "selected": false,
      "prepared": false,
      "preparedAt": null,
      "storage": null,
      "retainedPortions": 0,
      "scheduledPortions": 1,
      "uses": [
        {
          "dayIndex": 1,
          "recipeId": "pea-rice-pot",
          "date": "2026-10-27"
        }
      ],
      "eligibleStorage": [
        "refrigerated",
        "frozen"
      ],
      "pantryAllocations": {},
      "sourceRefs": [
        "fda-storage",
        "fda-chill",
        "foodsafety-cold-storage"
      ]
    },
    {
      "id": "prep-lemon-bean-wraps",
      "title": "Lemon white bean filling",
      "ingredientIds": [
        "white-bean",
        "lemon",
        "salt",
        "pepper",
        "oil"
      ],
      "freezable": true,
      "storageKind": "cooked",
      "serveCold": false,
      "maxRefrigeratedHours": 72,
      "prepMinutes": 10,
      "finishMinutes": 8,
      "prepInstructions": [
        "Drain 240g white beans. Mash half with 20ml lemon juice, 3g salt and 1g black pepper; leave the other half whole for texture. The mash should hold together on a spoon rather than run.",
        "Heat 10ml olive oil in a skillet over medium-low heat. Add all the mashed and whole beans and cook for 5 minutes, stirring until steaming. If too stiff to spread, stir in a little processing water; if loose, cook uncovered briefly.",
        "The displayed quantities already match your selected servings. For 1 or 2 servings, use a smaller pan and check early; keep the stated cut sizes. For 4 servings use a broad pan or uncrowded trays; for 8 split every ingredient evenly into two 4-serving batches (more if the pan or pot capacity requires it). Keep pans below 80% full and vegetables in one layer when browning. Repeat the cooking and doneness checks for each batch; elapsed time increases for sequential batches.",
        "Serve promptly. Cool any extra cooked food in shallow containers and refrigerate within two hours, or one hour above 32°C. Keep the fridge at 4°C or below. Reheat cooked leftovers evenly to 74°C, checking several places with a food thermometer. Keep raw garnishes and cold yogurt or tahini sauces separate and use them cold within their label limits."
      ],
      "finishInstructions": [
        "Use the labelled component for this dinner. If frozen promptly, thaw in the fridge the previous evening; if still frozen, heat gently from frozen, stirring where possible. Reheat cooked food evenly to 74°C with a thermometer before the fresh finishing steps. Add a splash of processing water if it catches, recording any extra water.",
        "Wash and dry 200g cabbage, then shred into 2mm ribbons. Grate 150g carrots coarsely. Warm 4 pieces plain flour tortillas in a dry pan for 20–30 seconds on each side until supple; check the actual brand ingredients.",
        "Divide the bean filling and raw vegetables evenly between the warm tortillas. Fold in the sides and roll; add the crunchy vegetables just before serving so they stay crisp."
      ],
      "qualityNotes": "Freeze promptly on preparation day for dinners outside the refrigerated window. Texture may soften after freezing; keep the fresh finish separate.",
      "recipeIds": [
        "lemon-bean-wraps"
      ],
      "baseAmounts": {
        "white-bean": 240,
        "lemon": 20,
        "oil": 10,
        "salt": 3,
        "pepper": 1
      },
      "rawAmounts": [
        {
          "ingredientId": "white-bean",
          "quantity": 240,
          "unit": "g"
        },
        {
          "ingredientId": "lemon",
          "quantity": 20,
          "unit": "ml"
        },
        {
          "ingredientId": "oil",
          "quantity": 10,
          "unit": "ml"
        },
        {
          "ingredientId": "salt",
          "quantity": 3,
          "unit": "g"
        },
        {
          "ingredientId": "pepper",
          "quantity": 1,
          "unit": "g"
        }
      ],
      "portions": 1,
      "servings": 2,
      "signature": "[{\"ingredientId\":\"white-bean\",\"quantity\":240,\"unit\":\"g\"},{\"ingredientId\":\"lemon\",\"quantity\":20,\"unit\":\"ml\"},{\"ingredientId\":\"oil\",\"quantity\":10,\"unit\":\"ml\"},{\"ingredientId\":\"salt\",\"quantity\":3,\"unit\":\"g\"},{\"ingredientId\":\"pepper\",\"quantity\":1,\"unit\":\"g\"}]",
      "selected": false,
      "prepared": false,
      "preparedAt": null,
      "storage": null,
      "retainedPortions": 0,
      "scheduledPortions": 1,
      "uses": [
        {
          "dayIndex": 3,
          "recipeId": "lemon-bean-wraps",
          "date": "2026-10-29"
        }
      ],
      "eligibleStorage": [
        "refrigerated",
        "frozen"
      ],
      "pantryAllocations": {},
      "sourceRefs": [
        "fda-storage",
        "fda-chill",
        "foodsafety-cold-storage"
      ]
    },
    {
      "id": "prep-lentil-cabbage-soup",
      "title": "Lentil cabbage soup",
      "ingredientIds": [
        "lentil",
        "carrot",
        "potato",
        "onion",
        "cabbage",
        "oil",
        "water",
        "salt",
        "pepper"
      ],
      "freezable": true,
      "storageKind": "cooked",
      "serveCold": false,
      "maxRefrigeratedHours": 72,
      "prepMinutes": 48,
      "finishMinutes": 12,
      "prepInstructions": [
        "Sort and rinse 160g red lentils. Cut 200g carrots and 200g potatoes into 1cm cubes, 100g onions into 5mm dice and 300g cabbage into 5mm ribbons. Heat 15ml olive oil in a large pot over medium heat and soften onion and carrot for 5 minutes.",
        "Add lentils, potatoes and 900ml recipe water. Bring to a boil, partly cover and simmer over low heat for 20–30 minutes, stirring occasionally, until lentils break down and potatoes are fork-tender. If the base catches, lower the heat and add a little hot processing water.",
        "Add cabbage, 3g salt and 1g black pepper; simmer for 5–8 minutes until the thickest cabbage ribs are tender. If it is too thick to ladle, add and record extra processing water.",
        "The displayed quantities already match your selected servings. For 1 serving use a small covered pot and check liquid early; for 2 use the stated method. For 4 or 8 use the planned pot-capacity batches and divide every ingredient proportionally. Keep each pot below 80% full. Maintain a gentle simmer and judge each batch by texture, not by multiplying the cooking time.",
        "Serve promptly. Cool any extra cooked food in shallow containers and refrigerate within two hours, or one hour above 32°C. Keep the fridge at 4°C or below. Reheat cooked leftovers evenly to 74°C, checking several places with a food thermometer. Keep raw garnishes and cold yogurt or tahini sauces separate and use them cold within their label limits."
      ],
      "finishInstructions": [
        "Use the labelled component for this dinner. If frozen promptly, thaw in the fridge the previous evening; if still frozen, heat gently from frozen, stirring where possible. Reheat cooked food evenly to 74°C with a thermometer before the fresh finishing steps. Add a splash of processing water if it catches, recording any extra water.",
        "Rest for 2 minutes and serve in warmed bowls. Freeze late-week prep portions promptly in shallow containers on preparation day."
      ],
      "qualityNotes": "Freeze promptly on preparation day for dinners outside the refrigerated window. Texture may soften after freezing; keep the fresh finish separate.",
      "recipeIds": [
        "lentil-cabbage-soup"
      ],
      "baseAmounts": {
        "lentil": 160,
        "cabbage": 300,
        "carrot": 200,
        "onion": 100,
        "potato": 200,
        "oil": 15,
        "salt": 3,
        "pepper": 1,
        "water": 900
      },
      "rawAmounts": [
        {
          "ingredientId": "lentil",
          "quantity": 160,
          "unit": "g"
        },
        {
          "ingredientId": "cabbage",
          "quantity": 300,
          "unit": "g"
        },
        {
          "ingredientId": "carrot",
          "quantity": 200,
          "unit": "g"
        },
        {
          "ingredientId": "onion",
          "quantity": 100,
          "unit": "g"
        },
        {
          "ingredientId": "potato",
          "quantity": 200,
          "unit": "g"
        },
        {
          "ingredientId": "oil",
          "quantity": 15,
          "unit": "ml"
        },
        {
          "ingredientId": "salt",
          "quantity": 3,
          "unit": "g"
        },
        {
          "ingredientId": "pepper",
          "quantity": 1,
          "unit": "g"
        },
        {
          "ingredientId": "water",
          "quantity": 900,
          "unit": "ml"
        }
      ],
      "portions": 1,
      "servings": 2,
      "signature": "[{\"ingredientId\":\"lentil\",\"quantity\":160,\"unit\":\"g\"},{\"ingredientId\":\"cabbage\",\"quantity\":300,\"unit\":\"g\"},{\"ingredientId\":\"carrot\",\"quantity\":200,\"unit\":\"g\"},{\"ingredientId\":\"onion\",\"quantity\":100,\"unit\":\"g\"},{\"ingredientId\":\"potato\",\"quantity\":200,\"unit\":\"g\"},{\"ingredientId\":\"oil\",\"quantity\":15,\"unit\":\"ml\"},{\"ingredientId\":\"salt\",\"quantity\":3,\"unit\":\"g\"},{\"ingredientId\":\"pepper\",\"quantity\":1,\"unit\":\"g\"},{\"ingredientId\":\"water\",\"quantity\":900,\"unit\":\"ml\"}]",
      "selected": false,
      "prepared": false,
      "preparedAt": null,
      "storage": null,
      "retainedPortions": 0,
      "scheduledPortions": 1,
      "uses": [
        {
          "dayIndex": 4,
          "recipeId": "lentil-cabbage-soup",
          "date": "2026-10-30"
        }
      ],
      "eligibleStorage": [
        "refrigerated",
        "frozen"
      ],
      "pantryAllocations": {},
      "sourceRefs": [
        "fda-storage",
        "fda-chill",
        "foodsafety-cold-storage"
      ]
    }
  ],
  "portionLabels": [
    {
      "id": "shared-roast-1",
      "componentId": "shared-roast",
      "title": "Shared roasted vegetables",
      "portion": "Y/2",
      "portionNumber": 1,
      "servings": 2,
      "preparedAt": "2026-10-25T19:55:00",
      "storage": "refrigerated",
      "originalStorage": "refrigerated",
      "freezeAt": null,
      "plannedThawAt": null,
      "thawAt": null,
      "thawed": false,
      "useBy": "2026-10-28T19:55:00",
      "dinnerDate": "2026-10-26",
      "recipeId": "lemon-chickpea-couscous",
      "status": "planned",
      "instructions": "Refrigerate promptly at 4°C or below. Reheat cooked food to 74°C, checked with a thermometer."
    },
    {
      "id": "shared-roast-2",
      "componentId": "shared-roast",
      "title": "Shared roasted vegetables",
      "portion": "Y/2",
      "portionNumber": 2,
      "servings": 2,
      "preparedAt": "2026-10-25T19:55:00",
      "storage": "refrigerated",
      "originalStorage": "refrigerated",
      "freezeAt": null,
      "plannedThawAt": null,
      "thawAt": null,
      "thawed": false,
      "useBy": "2026-10-28T19:55:00",
      "dinnerDate": "2026-10-28",
      "recipeId": "roast-vegetable-pasta",
      "status": "planned",
      "instructions": "Refrigerate promptly at 4°C or below. Reheat cooked food to 74°C, checked with a thermometer."
    }
  ],
  "leftovers": {
    "pantry": [
      {
        "lotId": "purchase-couscous",
        "source": "planned-purchase",
        "ingredientId": "couscous",
        "name": "Couscous",
        "quantity": 340,
        "unit": "g",
        "state": "dry",
        "openedAt": null,
        "useBy": null,
        "status": "projected",
        "instructions": "Package surplus if you buy the listed amount. Record the actual package use-by and opening date; keep it separate from existing lots."
      },
      {
        "lotId": "purchase-carrot",
        "source": "planned-purchase",
        "ingredientId": "carrot",
        "name": "Carrots",
        "quantity": 350,
        "unit": "g",
        "state": "raw",
        "openedAt": null,
        "useBy": null,
        "status": "projected",
        "instructions": "Package surplus if you buy the listed amount. Record the actual package use-by and opening date; keep it separate from existing lots."
      },
      {
        "lotId": "purchase-onion",
        "source": "planned-purchase",
        "ingredientId": "onion",
        "name": "Onions",
        "quantity": 100,
        "unit": "g",
        "state": "raw",
        "openedAt": null,
        "useBy": null,
        "status": "projected",
        "instructions": "Package surplus if you buy the listed amount. Record the actual package use-by and opening date; keep it separate from existing lots."
      },
      {
        "lotId": "purchase-oil",
        "source": "planned-purchase",
        "ingredientId": "oil",
        "name": "Olive oil",
        "quantity": 420,
        "unit": "ml",
        "state": "raw",
        "openedAt": null,
        "useBy": null,
        "status": "projected",
        "instructions": "Package surplus if you buy the listed amount. Record the actual package use-by and opening date; keep it separate from existing lots."
      },
      {
        "lotId": "purchase-lemon",
        "source": "planned-purchase",
        "ingredientId": "lemon",
        "name": "Lemon juice",
        "quantity": 190,
        "unit": "ml",
        "state": "raw",
        "openedAt": null,
        "useBy": null,
        "status": "projected",
        "instructions": "Package surplus if you buy the listed amount. Record the actual package use-by and opening date; keep it separate from existing lots."
      },
      {
        "lotId": "purchase-salt",
        "source": "planned-purchase",
        "ingredientId": "salt",
        "name": "Salt",
        "quantity": 235,
        "unit": "g",
        "state": "dry",
        "openedAt": null,
        "useBy": null,
        "status": "projected",
        "instructions": "Package surplus if you buy the listed amount. Record the actual package use-by and opening date; keep it separate from existing lots."
      },
      {
        "lotId": "purchase-pepper",
        "source": "planned-purchase",
        "ingredientId": "pepper",
        "name": "Black pepper",
        "quantity": 45,
        "unit": "g",
        "state": "dry",
        "openedAt": null,
        "useBy": null,
        "status": "projected",
        "instructions": "Package surplus if you buy the listed amount. Record the actual package use-by and opening date; keep it separate from existing lots."
      },
      {
        "lotId": "purchase-rice",
        "source": "planned-purchase",
        "ingredientId": "rice",
        "name": "Rice",
        "quantity": 340,
        "unit": "g",
        "state": "dry",
        "openedAt": null,
        "useBy": null,
        "status": "projected",
        "instructions": "Package surplus if you buy the listed amount. Record the actual package use-by and opening date; keep it separate from existing lots."
      },
      {
        "lotId": "purchase-pea",
        "source": "planned-purchase",
        "ingredientId": "pea",
        "name": "Peas",
        "quantity": 300,
        "unit": "g",
        "state": "frozen",
        "openedAt": null,
        "useBy": null,
        "status": "projected",
        "instructions": "Package surplus if you buy the listed amount. Record the actual package use-by and opening date; keep it separate from existing lots."
      },
      {
        "lotId": "purchase-pasta",
        "source": "planned-purchase",
        "ingredientId": "pasta",
        "name": "Pasta",
        "quantity": 340,
        "unit": "g",
        "state": "dry",
        "openedAt": null,
        "useBy": null,
        "status": "projected",
        "instructions": "Package surplus if you buy the listed amount. Record the actual package use-by and opening date; keep it separate from existing lots."
      },
      {
        "lotId": "purchase-tortilla",
        "source": "planned-purchase",
        "ingredientId": "tortilla",
        "name": "Plain flour tortillas",
        "quantity": 4,
        "unit": "count",
        "state": "cooked",
        "openedAt": null,
        "useBy": null,
        "status": "projected",
        "instructions": "Package surplus if you buy the listed amount. Record the actual package use-by and opening date; keep it separate from existing lots."
      },
      {
        "lotId": "purchase-cabbage",
        "source": "planned-purchase",
        "ingredientId": "cabbage",
        "name": "Cabbage",
        "quantity": 300,
        "unit": "g",
        "state": "raw",
        "openedAt": null,
        "useBy": null,
        "status": "projected",
        "instructions": "Package surplus if you buy the listed amount. Record the actual package use-by and opening date; keep it separate from existing lots."
      },
      {
        "lotId": "purchase-lentil",
        "source": "planned-purchase",
        "ingredientId": "lentil",
        "name": "Red lentils",
        "quantity": 340,
        "unit": "g",
        "state": "dry",
        "openedAt": null,
        "useBy": null,
        "status": "projected",
        "instructions": "Package surplus if you buy the listed amount. Record the actual package use-by and opening date; keep it separate from existing lots."
      },
      {
        "lotId": "purchase-potato",
        "source": "planned-purchase",
        "ingredientId": "potato",
        "name": "Potatoes",
        "quantity": 800,
        "unit": "g",
        "state": "raw",
        "openedAt": null,
        "useBy": null,
        "status": "projected",
        "instructions": "Package surplus if you buy the listed amount. Record the actual package use-by and opening date; keep it separate from existing lots."
      }
    ],
    "prepared": []
  },
  "component": {
    "id": "shared-roast",
    "title": "Shared roasted vegetables",
    "recipeIds": [
      "lemon-chickpea-couscous",
      "roast-vegetable-pasta"
    ],
    "ingredientIds": [
      "zucchini",
      "carrot",
      "onion",
      "oil",
      "salt",
      "pepper"
    ],
    "baseAmounts": {
      "zucchini": 300,
      "carrot": 150,
      "onion": 100,
      "oil": 20,
      "salt": 2,
      "pepper": 1
    },
    "freezable": true,
    "storageKind": "cooked",
    "maxRefrigeratedHours": 72,
    "prepMinutes": 50,
    "finishMinutes": 12,
    "qualityNotes": "Weigh the cooked output Y and divide it equally. Raw ingredient amounts are accounting equivalents, not cooked weights.",
    "prepInstructions": [
      "Heat the oven to 200°C. Cut zucchini into 2cm pieces, carrots into 1cm pieces and onion into 2cm wedges. Toss 600g zucchini, 300g carrots, 200g onions, 40ml olive oil, 4g salt and 2g black pepper.",
      "Spread in one uncrowded layer. Roast for 25–35 minutes, turning halfway, until carrots yield to a fork and the edges brown. Split crowded trays into separate oven loads.",
      "Weigh output Y, divide into the labelled shares and chill promptly in shallow containers."
    ],
    "finishInstructions": [
      "Use one original labelled share. Reheat the cooked vegetables to 74°C, checked with a thermometer, then follow the dinner’s fresh finishing steps."
    ],
    "rawAmounts": [
      {
        "ingredientId": "zucchini",
        "quantity": 600,
        "unit": "g"
      },
      {
        "ingredientId": "carrot",
        "quantity": 300,
        "unit": "g"
      },
      {
        "ingredientId": "onion",
        "quantity": 200,
        "unit": "g"
      },
      {
        "ingredientId": "oil",
        "quantity": 40,
        "unit": "ml"
      },
      {
        "ingredientId": "salt",
        "quantity": 4,
        "unit": "g"
      },
      {
        "ingredientId": "pepper",
        "quantity": 2,
        "unit": "g"
      }
    ],
    "portions": 2,
    "servings": 2,
    "signature": "[{\"ingredientId\":\"zucchini\",\"quantity\":600,\"unit\":\"g\"},{\"ingredientId\":\"carrot\",\"quantity\":300,\"unit\":\"g\"},{\"ingredientId\":\"onion\",\"quantity\":200,\"unit\":\"g\"},{\"ingredientId\":\"oil\",\"quantity\":40,\"unit\":\"ml\"},{\"ingredientId\":\"salt\",\"quantity\":4,\"unit\":\"g\"},{\"ingredientId\":\"pepper\",\"quantity\":2,\"unit\":\"g\"}]",
    "selected": true,
    "prepared": false,
    "preparedAt": "2026-10-25T19:55:00",
    "storage": "refrigerated",
    "retainedPortions": 0,
    "scheduledPortions": 2,
    "uses": [
      {
        "dayIndex": 0,
        "recipeId": "lemon-chickpea-couscous",
        "date": "2026-10-26"
      },
      {
        "dayIndex": 2,
        "recipeId": "roast-vegetable-pasta",
        "date": "2026-10-28"
      }
    ],
    "eligibleStorage": [
      "refrigerated",
      "frozen"
    ],
    "pantryAllocations": {},
    "sourceRefs": [
      "fda-storage",
      "fda-chill",
      "foodsafety-cold-storage"
    ],
    "finishTaskId": "portion-roast",
    "useBy": "2026-10-28T19:55:00",
    "openedAt": null,
    "yieldMode": "by_measured_output",
    "rawBatch": [
      {
        "ingredientId": "zucchini",
        "quantity": 600,
        "unit": "g"
      },
      {
        "ingredientId": "carrot",
        "quantity": 300,
        "unit": "g"
      },
      {
        "ingredientId": "onion",
        "quantity": 200,
        "unit": "g"
      },
      {
        "ingredientId": "oil",
        "quantity": 40,
        "unit": "ml"
      },
      {
        "ingredientId": "salt",
        "quantity": 4,
        "unit": "g"
      },
      {
        "ingredientId": "pepper",
        "quantity": 2,
        "unit": "g"
      }
    ]
  },
  "diff": [],
  "knownLimitations": [
    "Original recipes have not undergone real cooking trials. Package sizes are examples; confirm actual labels.",
    "Serving equivalents are cooking quantities, not individualized nutritional needs.",
    "Times are planning estimates. A saved record cannot verify actual cooling, temperatures or food handling."
  ],
  "validation": {
    "checks": [
      "quantities",
      "units",
      "exclusions",
      "equipment",
      "storage",
      "complete-recipes",
      "component-ledger"
    ],
    "validatedAt": "2026-10-25T06:05:06.660Z"
  }
}
