{
  "schemaVersion": 1,
  "engineVersion": 3,
  "version": 1,
  "weekId": "cold-start-warm-finish",
  "title": "Cold salads first, warm pots later",
  "goal": "Use chilled noodles on Monday and dressed chickpeas on Tuesday within their short windows. Assemble Wednesday’s slaw fresh and freeze both late-week cooked bases.",
  "servings": 2,
  "firstDate": "2026-10-26",
  "prepStartHour": 19,
  "prepStartMinute": 0,
  "input": {
    "servings": 2,
    "mealStartDate": "2026-10-26",
    "potLitres": 4,
    "availableEquipment": [
      "stove",
      "oven"
    ],
    "prepSelections": [
      "prep-roast-pepper-bean-soup",
      "prep-coconut-chickpea-curry"
    ],
    "pantryItems": [
      {
        "ingredientId": "chickpea",
        "quantity": 200,
        "unit": "g",
        "state": "drained",
        "userConfirmed": true
      }
    ],
    "excludeTags": [],
    "preparedBatches": {},
    "thawedPortions": {}
  },
  "dinners": [
    {
      "dayIndex": 0,
      "date": "2026-10-26",
      "recipe": {
        "id": "soba-edamame-salad",
        "slug": "soba-edamame-salad",
        "title": "Soba and edamame cold salad",
        "version": 2,
        "locale": "en",
        "baseServings": 2,
        "ingredients": [
          {
            "ingredientId": "soba",
            "quantity": 160,
            "unit": "g",
            "state": "dry"
          },
          {
            "ingredientId": "edamame",
            "quantity": 200,
            "unit": "g",
            "state": "frozen"
          },
          {
            "ingredientId": "cucumber",
            "quantity": 200,
            "unit": "g",
            "state": "raw"
          },
          {
            "ingredientId": "carrot",
            "quantity": 100,
            "unit": "g",
            "state": "raw"
          },
          {
            "ingredientId": "soy-sauce",
            "quantity": 20,
            "unit": "ml",
            "state": "canned"
          },
          {
            "ingredientId": "lemon",
            "quantity": 20,
            "unit": "ml",
            "state": "raw"
          },
          {
            "ingredientId": "oil",
            "quantity": 10,
            "unit": "ml",
            "state": "raw"
          },
          {
            "ingredientId": "sesame",
            "quantity": 10,
            "unit": "g",
            "state": "dry"
          }
        ],
        "equipment": [
          "stove"
        ],
        "activeMinutes": 20,
        "elapsedMinutes": 25,
        "potLitres": 4,
        "provenance": {
          "type": "AI-assisted original",
          "accessedAt": "2026-10-13",
          "licenseStatus": "Original project content; MIT"
        },
        "familyId": "cold-assembly",
        "summary": "Rinsed buckwheat noodles, tender edamame and crisp cucumber take a light soy and lemon dressing.",
        "processingWaterMl": 2000,
        "batchServings": 4,
        "steps": [
          {
            "id": "soba-edamame-salad-1",
            "instructions": "Boil about 2L processing water per two servings in a pot. Add 200g shelled edamame and cook for the packet time, usually 4–6 minutes, until the beans are tender rather than chalky. Lift out with a sieve and rinse under cold drinking water; drain well.",
            "ingredientRefs": [
              "edamame"
            ],
            "durationRange": [
              4,
              6
            ],
            "equipmentIds": [
              "stove"
            ],
            "dependsOn": [],
            "doneCondition": "the beans are tender rather than chalky"
          },
          {
            "id": "soba-edamame-salad-2",
            "instructions": "In the same boiling water cook 160g wheat and buckwheat soba for the packet time, usually 4–6 minutes, until tender. Drain and rinse thoroughly under cold drinking water, rubbing gently to remove starch. Drain until no water drips steadily; if preparing ahead, chill promptly in a shallow covered container.",
            "ingredientRefs": [
              "soba"
            ],
            "durationRange": [
              4,
              6
            ],
            "equipmentIds": [
              "stove"
            ],
            "dependsOn": [
              "soba-edamame-salad-1"
            ],
            "doneCondition": "tender"
          },
          {
            "id": "soba-edamame-salad-3",
            "instructions": "Cut 200g cucumber into 5mm half-moons and 100g carrots into fine 2mm matchsticks. Whisk 20ml simple soy sauce, 20ml lemon juice and 10ml olive oil. Check the soba label because many brands contain wheat as well as buckwheat.",
            "ingredientRefs": [
              "cucumber",
              "carrot",
              "soy-sauce",
              "lemon",
              "oil"
            ],
            "durationRange": [
              1,
              5
            ],
            "equipmentIds": [
              "stove"
            ],
            "dependsOn": [
              "soba-edamame-salad-2"
            ],
            "doneCondition": "Complete the stated preparation, texture and serving checks before continuing."
          },
          {
            "id": "soba-edamame-salad-4",
            "instructions": "Toss the cold noodles and edamame with the vegetables and dressing. Sprinkle over 10g sesame seeds. If noodles cling, separate them with wet fingers before tossing; serve cold without reheating.",
            "ingredientRefs": [
              "sesame"
            ],
            "durationRange": [
              1,
              5
            ],
            "equipmentIds": [
              "stove"
            ],
            "dependsOn": [
              "soba-edamame-salad-3"
            ],
            "doneCondition": "Complete the stated preparation, texture and serving checks before continuing."
          },
          {
            "id": "soba-edamame-salad-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 cold promptly. Keep dressed salads and cut produce covered at 4°C or below and refrigerate within two hours, or one hour above 32°C. Follow the shortest ingredient use-by or opened-package limit; these cold components need no reheating.",
            "ingredientRefs": [],
            "durationRange": [
              1,
              5
            ],
            "equipmentIds": [
              "stove"
            ],
            "dependsOn": [
              "soba-edamame-salad-4"
            ],
            "doneCondition": "Complete the stated preparation, texture and serving checks before continuing."
          }
        ],
        "storagePolicy": {
          "maxRefrigeratedHours": 48,
          "reheatC": null,
          "sourceRefs": [
            "usda",
            "storage"
          ]
        },
        "makeAhead": {
          "id": "prep-soba-edamame-salad",
          "title": "Cold soba and edamame",
          "ingredientIds": [
            "edamame",
            "soba"
          ],
          "freezable": false,
          "storageKind": "cooked",
          "serveCold": true,
          "maxRefrigeratedHours": 24,
          "prepMinutes": 18,
          "finishMinutes": 8,
          "prepInstructions": [
            "Boil about 2L processing water per two servings in a pot. Add {qty:edamame} and cook for the packet time, usually 4–6 minutes, until the beans are tender rather than chalky. Lift out with a sieve and rinse under cold drinking water; drain well.",
            "In the same boiling water cook {qty:soba} for the packet time, usually 4–6 minutes, until tender. Drain and rinse thoroughly under cold drinking water, rubbing gently to remove starch. Drain until no water drips steadily; if preparing ahead, chill promptly in a shallow covered container.",
            "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 cold promptly. Keep dressed salads and cut produce covered at 4°C or below and refrigerate within two hours, or one hour above 32°C. Follow the shortest ingredient use-by or opened-package limit; these cold components need no reheating."
          ],
          "finishInstructions": [
            "Keep the labelled component chilled. Use the original portion for this dinner and follow its ingredient use-by limits. Serve this component cold without reheating and complete the fresh finishing steps below.",
            "Cut {qty:cucumber} into 5mm half-moons and {qty:carrot} into fine 2mm matchsticks. Whisk {qty:soy-sauce}, {qty:lemon} and {qty:oil}. Check the soba label because many brands contain wheat as well as buckwheat.",
            "Toss the cold noodles and edamame with the vegetables and dressing. Sprinkle over {qty:sesame}. If noodles cling, separate them with wet fingers before tossing; serve cold without reheating."
          ],
          "qualityNotes": "This component is cooked but intended to be served cold. Chill promptly; loosen with a little cold drinking water. Noodles are best within 24 hours. Keep cucumber and dressing separate."
        },
        "freezable": false,
        "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": 25
    },
    {
      "dayIndex": 1,
      "date": "2026-10-27",
      "recipe": {
        "id": "cucumber-chickpea-salad",
        "slug": "cucumber-chickpea-salad",
        "title": "Cucumber chickpea chopped salad",
        "version": 2,
        "locale": "en",
        "baseServings": 2,
        "ingredients": [
          {
            "ingredientId": "chickpea",
            "quantity": 300,
            "unit": "g",
            "state": "drained"
          },
          {
            "ingredientId": "cucumber",
            "quantity": 250,
            "unit": "g",
            "state": "raw"
          },
          {
            "ingredientId": "fresh-tomato",
            "quantity": 250,
            "unit": "g",
            "state": "raw"
          },
          {
            "ingredientId": "onion",
            "quantity": 50,
            "unit": "g",
            "state": "raw"
          },
          {
            "ingredientId": "lemon",
            "quantity": 25,
            "unit": "ml",
            "state": "raw"
          },
          {
            "ingredientId": "bread",
            "quantity": 160,
            "unit": "g",
            "state": "cooked"
          },
          {
            "ingredientId": "oil",
            "quantity": 15,
            "unit": "ml",
            "state": "raw"
          },
          {
            "ingredientId": "salt",
            "quantity": 3,
            "unit": "g",
            "state": "dry"
          },
          {
            "ingredientId": "pepper",
            "quantity": 1,
            "unit": "g",
            "state": "dry"
          }
        ],
        "equipment": [
          "stove"
        ],
        "activeMinutes": 18,
        "elapsedMinutes": 18,
        "potLitres": 1,
        "provenance": {
          "type": "AI-assisted original",
          "accessedAt": "2026-10-13",
          "licenseStatus": "Original project content; MIT"
        },
        "familyId": "cold-assembly",
        "summary": "Well-drained chickpeas, cucumber and tomato make a crisp chopped salad with bread on the side.",
        "batchServings": 4,
        "steps": [
          {
            "id": "cucumber-chickpea-salad-1",
            "instructions": "Drain 300g chickpeas thoroughly. Cut 50g onions into very fine 3mm dice and mix with 25ml lemon juice, 15ml olive oil, 3g salt and 1g black pepper. Fold in chickpeas and let stand while preparing the vegetables; keep chilled if made ahead.",
            "ingredientRefs": [
              "chickpea",
              "onion",
              "lemon",
              "oil",
              "salt",
              "pepper"
            ],
            "durationRange": [
              1,
              5
            ],
            "equipmentIds": [
              "stove"
            ],
            "dependsOn": [],
            "doneCondition": "Complete the stated preparation, texture and serving checks before continuing."
          },
          {
            "id": "cucumber-chickpea-salad-2",
            "instructions": "Wash 250g cucumber and 250g fresh tomatoes. Cut into 1cm pieces. If cucumber seeds are very wet, scoop the loose seed core before cutting; weigh the edible portion after trimming.",
            "ingredientRefs": [
              "cucumber",
              "fresh-tomato"
            ],
            "durationRange": [
              1,
              5
            ],
            "equipmentIds": [
              "stove"
            ],
            "dependsOn": [
              "cucumber-chickpea-salad-1"
            ],
            "doneCondition": "Complete the stated preparation, texture and serving checks before continuing."
          },
          {
            "id": "cucumber-chickpea-salad-3",
            "instructions": "Fold the vegetables through the chickpeas immediately before serving. Lift with a spoon rather than mashing. If liquid accumulates, serve with a slotted spoon so the bread stays crisp.",
            "ingredientRefs": [],
            "durationRange": [
              1,
              5
            ],
            "equipmentIds": [
              "stove"
            ],
            "dependsOn": [
              "cucumber-chickpea-salad-2"
            ],
            "doneCondition": "Complete the stated preparation, texture and serving checks before continuing."
          },
          {
            "id": "cucumber-chickpea-salad-4",
            "instructions": "Toast 160g plain bread in a dry skillet over medium heat for 1–2 minutes per side until lightly crisp. Serve beside the cold salad; do not store the bread mixed into it.",
            "ingredientRefs": [
              "bread"
            ],
            "durationRange": [
              1,
              2
            ],
            "equipmentIds": [
              "stove"
            ],
            "dependsOn": [
              "cucumber-chickpea-salad-3"
            ],
            "doneCondition": "lightly crisp"
          },
          {
            "id": "cucumber-chickpea-salad-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 cold promptly. Keep dressed salads and cut produce covered at 4°C or below and refrigerate within two hours, or one hour above 32°C. Follow the shortest ingredient use-by or opened-package limit; these cold components need no reheating.",
            "ingredientRefs": [],
            "durationRange": [
              1,
              5
            ],
            "equipmentIds": [
              "stove"
            ],
            "dependsOn": [
              "cucumber-chickpea-salad-4"
            ],
            "doneCondition": "Complete the stated preparation, texture and serving checks before continuing."
          }
        ],
        "storagePolicy": {
          "maxRefrigeratedHours": 48,
          "reheatC": null,
          "sourceRefs": [
            "usda",
            "storage"
          ]
        },
        "makeAhead": {
          "id": "prep-cucumber-chickpea-salad",
          "title": "Lemon chickpeas for chopped salad",
          "ingredientIds": [
            "chickpea",
            "onion",
            "lemon",
            "oil",
            "salt",
            "pepper"
          ],
          "freezable": false,
          "storageKind": "assembled",
          "serveCold": true,
          "maxRefrigeratedHours": 48,
          "prepMinutes": 8,
          "finishMinutes": 12,
          "prepInstructions": [
            "Drain {qty:chickpea} thoroughly. Cut {qty:onion} into very fine 3mm dice and mix with {qty:lemon}, {qty:oil}, {qty:salt} and {qty:pepper}. Fold in chickpeas and let stand while preparing the vegetables; keep chilled if made ahead.",
            "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 cold promptly. Keep dressed salads and cut produce covered at 4°C or below and refrigerate within two hours, or one hour above 32°C. Follow the shortest ingredient use-by or opened-package limit; these cold components need no reheating."
          ],
          "finishInstructions": [
            "Keep the labelled component chilled. Use the original portion for this dinner and follow its ingredient use-by limits. Serve this component cold without reheating and complete the fresh finishing steps below.",
            "Wash {qty:cucumber} and {qty:fresh-tomato}. Cut into 1cm pieces. If cucumber seeds are very wet, scoop the loose seed core before cutting; weigh the edible portion after trimming.",
            "Fold the vegetables through the chickpeas immediately before serving. Lift with a spoon rather than mashing. If liquid accumulates, serve with a slotted spoon so the bread stays crisp.",
            "Toast {qty:bread} in a dry skillet over medium heat for 1–2 minutes per side until lightly crisp. Serve beside the cold salad; do not store the bread mixed into it."
          ],
          "qualityNotes": "Keep dressed chickpeas cold for up to 48 hours or the shorter package limit. Cut cucumber and tomato at dinner to prevent watery salad."
        },
        "freezable": false,
        "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": 18
    },
    {
      "dayIndex": 2,
      "date": "2026-10-28",
      "recipe": {
        "id": "sesame-chickpea-slaw",
        "slug": "sesame-chickpea-slaw",
        "title": "Sesame chickpea slaw wraps",
        "version": 2,
        "locale": "en",
        "baseServings": 2,
        "ingredients": [
          {
            "ingredientId": "chickpea",
            "quantity": 240,
            "unit": "g",
            "state": "drained"
          },
          {
            "ingredientId": "cabbage",
            "quantity": 220,
            "unit": "g",
            "state": "raw"
          },
          {
            "ingredientId": "carrot",
            "quantity": 150,
            "unit": "g",
            "state": "raw"
          },
          {
            "ingredientId": "tahini",
            "quantity": 35,
            "unit": "g",
            "state": "raw"
          },
          {
            "ingredientId": "lemon",
            "quantity": 30,
            "unit": "ml",
            "state": "raw"
          },
          {
            "ingredientId": "tortilla",
            "quantity": 4,
            "unit": "count",
            "state": "cooked"
          },
          {
            "ingredientId": "sesame",
            "quantity": 10,
            "unit": "g",
            "state": "dry"
          },
          {
            "ingredientId": "salt",
            "quantity": 2,
            "unit": "g",
            "state": "dry"
          },
          {
            "ingredientId": "pepper",
            "quantity": 1,
            "unit": "g",
            "state": "dry"
          }
        ],
        "equipment": [
          "stove"
        ],
        "activeMinutes": 20,
        "elapsedMinutes": 20,
        "potLitres": 1,
        "provenance": {
          "type": "AI-assisted original",
          "accessedAt": "2026-10-13",
          "licenseStatus": "Original project content; MIT"
        },
        "familyId": "cold-assembly",
        "summary": "Lemon tahini chickpeas add substance to finely shredded cabbage and carrot in a cold wrap.",
        "batchServings": 4,
        "steps": [
          {
            "id": "sesame-chickpea-slaw-1",
            "instructions": "Drain 240g chickpeas well and mash one-third with a fork. Leave the rest whole for texture. Check that no can liquid remains pooled in the bowl.",
            "ingredientRefs": [
              "chickpea"
            ],
            "durationRange": [
              1,
              5
            ],
            "equipmentIds": [
              "stove"
            ],
            "dependsOn": [],
            "doneCondition": "Complete the stated preparation, texture and serving checks before continuing."
          },
          {
            "id": "sesame-chickpea-slaw-2",
            "instructions": "Stir 35g plain tahini, 30ml lemon juice, 2g salt and 1g black pepper into the chickpeas. If the tahini tightens, add cool drinking water a teaspoon at a time until the filling is spreadable; it should hold on a spoon rather than run.",
            "ingredientRefs": [
              "tahini",
              "lemon",
              "salt",
              "pepper"
            ],
            "durationRange": [
              1,
              5
            ],
            "equipmentIds": [
              "stove"
            ],
            "dependsOn": [
              "sesame-chickpea-slaw-1"
            ],
            "doneCondition": "the filling is spreadable; it should hold on a spoon rather than run"
          },
          {
            "id": "sesame-chickpea-slaw-3",
            "instructions": "Wash and dry 220g cabbage; shred into 2mm ribbons. Grate 150g carrots coarsely. Fold both into the filling just before dinner and add 10g sesame seeds. If the vegetables release water, drain the puddle before filling wraps.",
            "ingredientRefs": [
              "cabbage",
              "carrot",
              "sesame"
            ],
            "durationRange": [
              1,
              5
            ],
            "equipmentIds": [
              "stove"
            ],
            "dependsOn": [
              "sesame-chickpea-slaw-2"
            ],
            "doneCondition": "Complete the stated preparation, texture and serving checks before continuing."
          },
          {
            "id": "sesame-chickpea-slaw-4",
            "instructions": "Warm 4 pieces plain flour tortillas briefly in a dry skillet until flexible, then let cool for a minute. Divide the cold slaw filling evenly and roll tightly. Keep any remaining filling chilled; it needs no reheating.",
            "ingredientRefs": [
              "tortilla"
            ],
            "durationRange": [
              1,
              5
            ],
            "equipmentIds": [
              "stove"
            ],
            "dependsOn": [
              "sesame-chickpea-slaw-3"
            ],
            "doneCondition": "flexible, then let cool for a minute"
          },
          {
            "id": "sesame-chickpea-slaw-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 cold promptly. Keep dressed salads and cut produce covered at 4°C or below and refrigerate within two hours, or one hour above 32°C. Follow the shortest ingredient use-by or opened-package limit; these cold components need no reheating.",
            "ingredientRefs": [],
            "durationRange": [
              1,
              5
            ],
            "equipmentIds": [
              "stove"
            ],
            "dependsOn": [
              "sesame-chickpea-slaw-4"
            ],
            "doneCondition": "Complete the stated preparation, texture and serving checks before continuing."
          }
        ],
        "storagePolicy": {
          "maxRefrigeratedHours": 48,
          "reheatC": null,
          "sourceRefs": [
            "usda",
            "storage"
          ]
        },
        "makeAhead": {
          "id": "prep-sesame-chickpea-slaw",
          "title": "Tahini chickpea filling",
          "ingredientIds": [
            "chickpea",
            "tahini",
            "lemon",
            "salt",
            "pepper"
          ],
          "freezable": false,
          "storageKind": "assembled",
          "serveCold": true,
          "maxRefrigeratedHours": 48,
          "prepMinutes": 10,
          "finishMinutes": 10,
          "prepInstructions": [
            "Drain {qty:chickpea} well and mash one-third with a fork. Leave the rest whole for texture. Check that no can liquid remains pooled in the bowl.",
            "Stir {qty:tahini}, {qty:lemon}, {qty:salt} and {qty:pepper} into the chickpeas. If the tahini tightens, add cool drinking water a teaspoon at a time until the filling is spreadable; it should hold on a spoon rather than run.",
            "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 cold promptly. Keep dressed salads and cut produce covered at 4°C or below and refrigerate within two hours, or one hour above 32°C. Follow the shortest ingredient use-by or opened-package limit; these cold components need no reheating."
          ],
          "finishInstructions": [
            "Keep the labelled component chilled. Use the original portion for this dinner and follow its ingredient use-by limits. Serve this component cold without reheating and complete the fresh finishing steps below.",
            "Wash and dry {qty:cabbage}; shred into 2mm ribbons. Grate {qty:carrot} coarsely. Fold both into the filling just before dinner and add {qty:sesame}. If the vegetables release water, drain the puddle before filling wraps.",
            "Warm {qty:tortilla} briefly in a dry skillet until flexible, then let cool for a minute. Divide the cold slaw filling evenly and roll tightly. Keep any remaining filling chilled; it needs no reheating."
          ],
          "qualityNotes": "Keep the dressed chickpeas chilled and follow the earliest opened-package or use-by limit. Add freshly shredded vegetables at dinner; serve the filling cold."
        },
        "freezable": false,
        "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": 20
    },
    {
      "dayIndex": 3,
      "date": "2026-10-29",
      "recipe": {
        "id": "roast-pepper-bean-soup",
        "slug": "roast-pepper-bean-soup",
        "title": "Roast pepper and white bean soup",
        "version": 2,
        "locale": "en",
        "baseServings": 2,
        "ingredients": [
          {
            "ingredientId": "bell-pepper",
            "quantity": 400,
            "unit": "g",
            "state": "raw"
          },
          {
            "ingredientId": "onion",
            "quantity": 150,
            "unit": "g",
            "state": "raw"
          },
          {
            "ingredientId": "white-bean",
            "quantity": 300,
            "unit": "g",
            "state": "drained"
          },
          {
            "ingredientId": "canned-tomato",
            "quantity": 200,
            "unit": "g",
            "state": "canned"
          },
          {
            "ingredientId": "garlic",
            "quantity": 10,
            "unit": "g",
            "state": "raw"
          },
          {
            "ingredientId": "paprika",
            "quantity": 2,
            "unit": "g",
            "state": "dry"
          },
          {
            "ingredientId": "water",
            "quantity": 500,
            "unit": "ml",
            "state": "raw"
          },
          {
            "ingredientId": "bread",
            "quantity": 160,
            "unit": "g",
            "state": "cooked"
          },
          {
            "ingredientId": "oil",
            "quantity": 15,
            "unit": "ml",
            "state": "raw"
          },
          {
            "ingredientId": "salt",
            "quantity": 3,
            "unit": "g",
            "state": "dry"
          },
          {
            "ingredientId": "pepper",
            "quantity": 1,
            "unit": "g",
            "state": "dry"
          }
        ],
        "equipment": [
          "stove",
          "oven"
        ],
        "activeMinutes": 22,
        "elapsedMinutes": 55,
        "potLitres": 4,
        "provenance": {
          "type": "AI-assisted original",
          "accessedAt": "2026-10-13",
          "licenseStatus": "Original project content; MIT"
        },
        "familyId": "tray-roast",
        "summary": "Roasted pepper and onion give a smoky edge to a chunky, hand-mashed white bean soup.",
        "batchServings": 4,
        "steps": [
          {
            "id": "roast-pepper-bean-soup-1",
            "instructions": "Heat the oven to 220°C. Halve 400g bell pepper, removing stems and seeds; cut 150g onions into 2cm wedges. Toss with 15ml olive oil and place peppers skin-side up with onion beside them. Roast for 25–30 minutes until pepper skins blister in patches and flesh softens. Turn onion halfway; move browned pieces aside.",
            "ingredientRefs": [
              "bell-pepper",
              "onion",
              "oil"
            ],
            "durationRange": [
              25,
              30
            ],
            "equipmentIds": [
              "stove",
              "oven"
            ],
            "dependsOn": [],
            "doneCondition": "pepper skins blister in patches and flesh softens"
          },
          {
            "id": "roast-pepper-bean-soup-2",
            "instructions": "Let peppers cool just enough to handle, about 5 minutes. Pull off loose blackened skin where it lifts easily, then chop flesh and onion into 1cm pieces. Put in a pot with 300g white beans, 200g canned tomatoes, minced 10g garlic, 2g ground paprika, 500ml recipe water, 3g salt and 1g black pepper.",
            "ingredientRefs": [
              "white-bean",
              "canned-tomato",
              "garlic",
              "paprika",
              "water",
              "salt",
              "pepper"
            ],
            "durationRange": [
              5,
              7
            ],
            "equipmentIds": [
              "stove",
              "oven"
            ],
            "dependsOn": [
              "roast-pepper-bean-soup-1"
            ],
            "doneCondition": "Complete the stated preparation, texture and serving checks before continuing."
          },
          {
            "id": "roast-pepper-bean-soup-3",
            "instructions": "Simmer over medium-low heat for 10 minutes until garlic is tender and beans steam throughout. Mash half the beans against the pot to thicken the soup. If too watery, simmer uncovered; if thick, add a little processing water. No blender is needed.",
            "ingredientRefs": [],
            "durationRange": [
              10,
              12
            ],
            "equipmentIds": [
              "stove",
              "oven"
            ],
            "dependsOn": [
              "roast-pepper-bean-soup-2"
            ],
            "doneCondition": "garlic is tender and beans steam throughout"
          },
          {
            "id": "roast-pepper-bean-soup-4",
            "instructions": "Toast 160g plain bread in a dry skillet or the warm oven until lightly crisp. Ladle soup into bowls and serve toast separately.",
            "ingredientRefs": [
              "bread"
            ],
            "durationRange": [
              1,
              5
            ],
            "equipmentIds": [
              "stove",
              "oven"
            ],
            "dependsOn": [
              "roast-pepper-bean-soup-3"
            ],
            "doneCondition": "lightly crisp"
          },
          {
            "id": "roast-pepper-bean-soup-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-pepper-bean-soup-4"
            ],
            "doneCondition": "Complete the stated preparation, texture and serving checks before continuing."
          }
        ],
        "storagePolicy": {
          "maxRefrigeratedHours": 72,
          "reheatC": 74,
          "sourceRefs": [
            "usda",
            "storage"
          ]
        },
        "makeAhead": {
          "id": "prep-roast-pepper-bean-soup",
          "title": "Roast pepper bean soup",
          "ingredientIds": [
            "bell-pepper",
            "onion",
            "oil",
            "white-bean",
            "canned-tomato",
            "garlic",
            "paprika",
            "water",
            "salt",
            "pepper"
          ],
          "freezable": true,
          "storageKind": "cooked",
          "serveCold": false,
          "maxRefrigeratedHours": 72,
          "prepMinutes": 50,
          "finishMinutes": 12,
          "prepInstructions": [
            "Heat the oven to 220°C. Halve {qty:bell-pepper}, removing stems and seeds; cut {qty:onion} into 2cm wedges. Toss with {qty:oil} and place peppers skin-side up with onion beside them. Roast for 25–30 minutes until pepper skins blister in patches and flesh softens. Turn onion halfway; move browned pieces aside.",
            "Let peppers cool just enough to handle, about 5 minutes. Pull off loose blackened skin where it lifts easily, then chop flesh and onion into 1cm pieces. Put in a pot with {qty:white-bean}, {qty:canned-tomato}, minced {qty:garlic}, {qty:paprika}, {qty:water}, {qty:salt} and {qty:pepper}.",
            "Simmer over medium-low heat for 10 minutes until garlic is tender and beans steam throughout. Mash half the beans against the pot to thicken the soup. If too watery, simmer uncovered; if thick, add a little processing water. No blender is needed.",
            "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.",
            "Toast {qty:bread} in a dry skillet or the warm oven until lightly crisp. Ladle soup into bowls and serve toast separately."
          ],
          "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": 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": 12
    },
    {
      "dayIndex": 4,
      "date": "2026-10-30",
      "recipe": {
        "id": "coconut-chickpea-curry",
        "slug": "coconut-chickpea-curry",
        "title": "Coconut chickpea and cauliflower curry",
        "version": 2,
        "locale": "en",
        "baseServings": 2,
        "ingredients": [
          {
            "ingredientId": "chickpea",
            "quantity": 240,
            "unit": "g",
            "state": "drained"
          },
          {
            "ingredientId": "cauliflower",
            "quantity": 300,
            "unit": "g",
            "state": "raw"
          },
          {
            "ingredientId": "coconut-milk",
            "quantity": 300,
            "unit": "ml",
            "state": "canned"
          },
          {
            "ingredientId": "onion",
            "quantity": 100,
            "unit": "g",
            "state": "raw"
          },
          {
            "ingredientId": "ginger",
            "quantity": 15,
            "unit": "g",
            "state": "raw"
          },
          {
            "ingredientId": "garlic",
            "quantity": 8,
            "unit": "g",
            "state": "raw"
          },
          {
            "ingredientId": "cumin",
            "quantity": 3,
            "unit": "g",
            "state": "dry"
          },
          {
            "ingredientId": "rice",
            "quantity": 150,
            "unit": "g",
            "state": "dry"
          },
          {
            "ingredientId": "water",
            "quantity": 300,
            "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"
          }
        ],
        "equipment": [
          "stove"
        ],
        "activeMinutes": 20,
        "elapsedMinutes": 35,
        "potLitres": 3,
        "provenance": {
          "type": "AI-assisted original",
          "accessedAt": "2026-10-13",
          "licenseStatus": "Original project content; MIT"
        },
        "familyId": "simmered-pots",
        "summary": "Cauliflower and chickpeas simmer gently in a ginger coconut sauce, with rice cooked at dinner.",
        "batchServings": 4,
        "steps": [
          {
            "id": "coconut-chickpea-curry-1",
            "instructions": "Cut 100g onions into 5mm dice and 300g cauliflower into 2cm florets. Mince 15g ginger and 8g garlic. Heat 15ml olive oil in a pot over medium heat; soften onion for 5 minutes, then stir in ginger, garlic and 3g ground cumin for 30 seconds until fragrant.",
            "ingredientRefs": [
              "onion",
              "cauliflower",
              "ginger",
              "garlic",
              "oil",
              "cumin"
            ],
            "durationRange": [
              5,
              7
            ],
            "equipmentIds": [
              "stove"
            ],
            "dependsOn": [],
            "doneCondition": "fragrant"
          },
          {
            "id": "coconut-chickpea-curry-2",
            "instructions": "Add cauliflower, 240g chickpeas, 300ml plain coconut milk, 3g salt and 1g black pepper. Bring to a gentle simmer, cover loosely and cook over low heat for 12–18 minutes until a knife enters cauliflower stalks easily. Avoid a rolling boil. If the sauce becomes oily, lower the heat and stir in a small splash of processing water.",
            "ingredientRefs": [
              "chickpea",
              "coconut-milk",
              "salt",
              "pepper"
            ],
            "durationRange": [
              12,
              18
            ],
            "equipmentIds": [
              "stove"
            ],
            "dependsOn": [
              "coconut-chickpea-curry-1"
            ],
            "doneCondition": "a knife enters cauliflower stalks easily"
          },
          {
            "id": "coconut-chickpea-curry-3",
            "instructions": "With two burners, cook rice while the curry simmers. On one burner make the curry first and allow extra time. Rinse 150g rice. Cook with 300ml recipe water in a covered saucepan after checking the packet ratio: bring to a boil, reduce to low for 12–18 minutes until tender, then rest off the heat for 5 minutes. Add a little boiling processing water if grains remain firm.",
            "ingredientRefs": [
              "rice",
              "water"
            ],
            "durationRange": [
              12,
              18
            ],
            "equipmentIds": [
              "stove"
            ],
            "dependsOn": [],
            "doneCondition": "tender, then rest off the heat for 5 minutes"
          },
          {
            "id": "coconut-chickpea-curry-4",
            "instructions": "Fluff the rice and ladle the curry over it. If curry is too thin, simmer uncovered briefly; if too thick, loosen with a little hot processing water before serving.",
            "ingredientRefs": [],
            "durationRange": [
              1,
              5
            ],
            "equipmentIds": [
              "stove"
            ],
            "dependsOn": [
              "coconut-chickpea-curry-2",
              "coconut-chickpea-curry-3"
            ],
            "doneCondition": "Complete the stated preparation, texture and serving checks before continuing."
          },
          {
            "id": "coconut-chickpea-curry-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": [
              "coconut-chickpea-curry-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."
        },
        "makeAhead": {
          "id": "prep-coconut-chickpea-curry",
          "title": "Coconut chickpea curry",
          "ingredientIds": [
            "onion",
            "cauliflower",
            "ginger",
            "garlic",
            "oil",
            "cumin",
            "chickpea",
            "coconut-milk",
            "salt",
            "pepper"
          ],
          "freezable": true,
          "storageKind": "cooked",
          "serveCold": false,
          "maxRefrigeratedHours": 72,
          "prepMinutes": 25,
          "finishMinutes": 22,
          "prepInstructions": [
            "Cut {qty:onion} into 5mm dice and {qty:cauliflower} into 2cm florets. Mince {qty:ginger} and {qty:garlic}. Heat {qty:oil} in a pot over medium heat; soften onion for 5 minutes, then stir in ginger, garlic and {qty:cumin} for 30 seconds until fragrant.",
            "Add cauliflower, {qty:chickpea}, {qty:coconut-milk}, {qty:salt} and {qty:pepper}. Bring to a gentle simmer, cover loosely and cook over low heat for 12–18 minutes until a knife enters cauliflower stalks easily. Avoid a rolling boil. If the sauce becomes oily, lower the heat and stir in a small splash of processing water.",
            "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.",
            "With two burners, cook rice while the curry simmers. On one burner make the curry first and allow extra time. Rinse {qty:rice}. Cook with {qty:water} in a covered saucepan after checking the packet ratio: bring to a boil, reduce to low for 12–18 minutes until tender, then rest off the heat for 5 minutes. Add a little boiling processing water if grains remain firm.",
            "Fluff the rice and ladle the curry over it. If curry is too thin, simmer uncovered briefly; if too thick, loosen with a little hot processing water before serving."
          ],
          "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": 22,
        "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": 22
    }
  ],
  "shopping": [
    {
      "ingredientId": "soba",
      "name": "Wheat and buckwheat soba",
      "required": 160,
      "prepared": 0,
      "pantryUsed": 0,
      "initial": 0,
      "net": 160,
      "purchased": 250,
      "remaining": 90,
      "unit": "g",
      "state": "dry",
      "packageQty": 250,
      "packCount": 1,
      "notPurchased": false,
      "packAssumption": "Reference soba contains wheat. Brands differ; confirm actual ingredients and cooking time.",
      "retained": 0
    },
    {
      "ingredientId": "edamame",
      "name": "Shelled edamame",
      "required": 200,
      "prepared": 0,
      "pantryUsed": 0,
      "initial": 0,
      "net": 200,
      "purchased": 400,
      "remaining": 200,
      "unit": "g",
      "state": "frozen",
      "packageQty": 400,
      "packCount": 1,
      "notPurchased": false,
      "packAssumption": "Example package: 400g usable quantity. Confirm label/edible weight.",
      "retained": 0
    },
    {
      "ingredientId": "cucumber",
      "name": "Cucumber",
      "required": 450,
      "prepared": 0,
      "pantryUsed": 0,
      "initial": 0,
      "net": 450,
      "purchased": 450,
      "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": 250,
      "prepared": 0,
      "pantryUsed": 0,
      "initial": 0,
      "net": 250,
      "purchased": 1000,
      "remaining": 750,
      "unit": "g",
      "state": "raw",
      "packageQty": 1000,
      "packCount": 1,
      "notPurchased": false,
      "packAssumption": "Example package: 1000g usable quantity. Confirm label/edible weight.",
      "retained": 0
    },
    {
      "ingredientId": "soy-sauce",
      "name": "Simple soy sauce",
      "required": 20,
      "prepared": 0,
      "pantryUsed": 0,
      "initial": 0,
      "net": 20,
      "purchased": 150,
      "remaining": 130,
      "unit": "ml",
      "state": "canned",
      "packageQty": 150,
      "packCount": 1,
      "notPurchased": false,
      "packAssumption": "Example package: 150ml usable quantity. Confirm label/edible weight.",
      "retained": 0
    },
    {
      "ingredientId": "lemon",
      "name": "Lemon juice",
      "required": 75,
      "prepared": 0,
      "pantryUsed": 0,
      "initial": 0,
      "net": 75,
      "purchased": 250,
      "remaining": 175,
      "unit": "ml",
      "state": "raw",
      "packageQty": 250,
      "packCount": 1,
      "notPurchased": false,
      "packAssumption": "Example package: 250ml usable quantity. Confirm label/edible weight.",
      "retained": 0
    },
    {
      "ingredientId": "oil",
      "name": "Olive oil",
      "required": 55,
      "prepared": 0,
      "pantryUsed": 0,
      "initial": 0,
      "net": 55,
      "purchased": 500,
      "remaining": 445,
      "unit": "ml",
      "state": "raw",
      "packageQty": 500,
      "packCount": 1,
      "notPurchased": false,
      "packAssumption": "Example package: 500ml usable quantity. Confirm label/edible weight.",
      "retained": 0
    },
    {
      "ingredientId": "sesame",
      "name": "Sesame seeds",
      "required": 20,
      "prepared": 0,
      "pantryUsed": 0,
      "initial": 0,
      "net": 20,
      "purchased": 100,
      "remaining": 80,
      "unit": "g",
      "state": "dry",
      "packageQty": 100,
      "packCount": 1,
      "notPurchased": false,
      "packAssumption": "Example package: 100g usable quantity. Confirm label/edible weight.",
      "retained": 0
    },
    {
      "ingredientId": "chickpea",
      "name": "Chickpeas",
      "required": 780,
      "prepared": 0,
      "pantryUsed": 200,
      "initial": 200,
      "net": 580,
      "purchased": 720,
      "remaining": 140,
      "unit": "g",
      "state": "drained",
      "packageQty": 240,
      "packCount": 3,
      "notPurchased": false,
      "packAssumption": "Example: 400g gross can, 240g drained. Confirm your label.",
      "retained": 0
    },
    {
      "ingredientId": "fresh-tomato",
      "name": "Fresh tomatoes",
      "required": 250,
      "prepared": 0,
      "pantryUsed": 0,
      "initial": 0,
      "net": 250,
      "purchased": 250,
      "remaining": 0,
      "unit": "g",
      "state": "raw",
      "packageQty": 0,
      "packCount": 1,
      "notPurchased": false,
      "packAssumption": "Buy exact edible weight; record any trimming losses.",
      "retained": 0
    },
    {
      "ingredientId": "onion",
      "name": "Onions",
      "required": 300,
      "prepared": 0,
      "pantryUsed": 0,
      "initial": 0,
      "net": 300,
      "purchased": 500,
      "remaining": 200,
      "unit": "g",
      "state": "raw",
      "packageQty": 500,
      "packCount": 1,
      "notPurchased": false,
      "packAssumption": "Example package: 500g usable quantity. Confirm label/edible weight.",
      "retained": 0
    },
    {
      "ingredientId": "bread",
      "name": "Plain bread",
      "required": 320,
      "prepared": 0,
      "pantryUsed": 0,
      "initial": 0,
      "net": 320,
      "purchased": 400,
      "remaining": 80,
      "unit": "g",
      "state": "cooked",
      "packageQty": 400,
      "packCount": 1,
      "notPurchased": false,
      "packAssumption": "Reference loaf: wheat, water, yeast, salt. Actual products may differ.",
      "retained": 0
    },
    {
      "ingredientId": "salt",
      "name": "Salt",
      "required": 11,
      "prepared": 0,
      "pantryUsed": 0,
      "initial": 0,
      "net": 11,
      "purchased": 250,
      "remaining": 239,
      "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": 4,
      "prepared": 0,
      "pantryUsed": 0,
      "initial": 0,
      "net": 4,
      "purchased": 50,
      "remaining": 46,
      "unit": "g",
      "state": "dry",
      "packageQty": 50,
      "packCount": 1,
      "notPurchased": false,
      "packAssumption": "Example package: 50g usable quantity. Confirm label/edible weight.",
      "retained": 0
    },
    {
      "ingredientId": "cabbage",
      "name": "Cabbage",
      "required": 220,
      "prepared": 0,
      "pantryUsed": 0,
      "initial": 0,
      "net": 220,
      "purchased": 800,
      "remaining": 580,
      "unit": "g",
      "state": "raw",
      "packageQty": 800,
      "packCount": 1,
      "notPurchased": false,
      "packAssumption": "Example package: 800g usable quantity. Confirm label/edible weight.",
      "retained": 0
    },
    {
      "ingredientId": "tahini",
      "name": "Plain tahini",
      "required": 35,
      "prepared": 0,
      "pantryUsed": 0,
      "initial": 0,
      "net": 35,
      "purchased": 300,
      "remaining": 265,
      "unit": "g",
      "state": "raw",
      "packageQty": 300,
      "packCount": 1,
      "notPurchased": false,
      "packAssumption": "Reference tahini is sesame only. Check the actual label and opened-package storage instructions.",
      "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": "bell-pepper",
      "name": "Bell pepper",
      "required": 400,
      "prepared": 0,
      "pantryUsed": 0,
      "initial": 0,
      "net": 400,
      "purchased": 400,
      "remaining": 0,
      "unit": "g",
      "state": "raw",
      "packageQty": 0,
      "packCount": 1,
      "notPurchased": false,
      "packAssumption": "Buy exact edible weight; record any trimming losses.",
      "retained": 0
    },
    {
      "ingredientId": "white-bean",
      "name": "White beans",
      "required": 300,
      "prepared": 0,
      "pantryUsed": 0,
      "initial": 0,
      "net": 300,
      "purchased": 480,
      "remaining": 180,
      "unit": "g",
      "state": "drained",
      "packageQty": 240,
      "packCount": 2,
      "notPurchased": false,
      "packAssumption": "Example package: 240g usable quantity. Confirm label/edible weight.",
      "retained": 0
    },
    {
      "ingredientId": "canned-tomato",
      "name": "Canned tomatoes",
      "required": 200,
      "prepared": 0,
      "pantryUsed": 0,
      "initial": 0,
      "net": 200,
      "purchased": 400,
      "remaining": 200,
      "unit": "g",
      "state": "canned",
      "packageQty": 400,
      "packCount": 1,
      "notPurchased": false,
      "packAssumption": "Example package: 400g usable quantity. Confirm label/edible weight.",
      "retained": 0
    },
    {
      "ingredientId": "garlic",
      "name": "Garlic",
      "required": 18,
      "prepared": 0,
      "pantryUsed": 0,
      "initial": 0,
      "net": 18,
      "purchased": 18,
      "remaining": 0,
      "unit": "g",
      "state": "raw",
      "packageQty": 0,
      "packCount": 1,
      "notPurchased": false,
      "packAssumption": "Buy exact edible weight; record any trimming losses.",
      "retained": 0
    },
    {
      "ingredientId": "paprika",
      "name": "Ground paprika",
      "required": 2,
      "prepared": 0,
      "pantryUsed": 0,
      "initial": 0,
      "net": 2,
      "purchased": 40,
      "remaining": 38,
      "unit": "g",
      "state": "dry",
      "packageQty": 40,
      "packCount": 1,
      "notPurchased": false,
      "packAssumption": "Example package: 40g usable quantity. Confirm label/edible weight.",
      "retained": 0
    },
    {
      "ingredientId": "water",
      "name": "Recipe water",
      "required": 800,
      "prepared": 0,
      "pantryUsed": 0,
      "initial": 0,
      "net": 800,
      "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": "cauliflower",
      "name": "Cauliflower",
      "required": 300,
      "prepared": 0,
      "pantryUsed": 0,
      "initial": 0,
      "net": 300,
      "purchased": 300,
      "remaining": 0,
      "unit": "g",
      "state": "raw",
      "packageQty": 0,
      "packCount": 1,
      "notPurchased": false,
      "packAssumption": "Buy exact edible weight; record any trimming losses.",
      "retained": 0
    },
    {
      "ingredientId": "coconut-milk",
      "name": "Plain coconut milk",
      "required": 300,
      "prepared": 0,
      "pantryUsed": 0,
      "initial": 0,
      "net": 300,
      "purchased": 400,
      "remaining": 100,
      "unit": "ml",
      "state": "canned",
      "packageQty": 400,
      "packCount": 1,
      "notPurchased": false,
      "packAssumption": "Reference product contains coconut and water; check actual ingredients and opened-package instructions.",
      "retained": 0
    },
    {
      "ingredientId": "ginger",
      "name": "Ginger",
      "required": 15,
      "prepared": 0,
      "pantryUsed": 0,
      "initial": 0,
      "net": 15,
      "purchased": 15,
      "remaining": 0,
      "unit": "g",
      "state": "raw",
      "packageQty": 0,
      "packCount": 1,
      "notPurchased": false,
      "packAssumption": "Buy exact edible weight; record any trimming losses.",
      "retained": 0
    },
    {
      "ingredientId": "cumin",
      "name": "Ground cumin",
      "required": 3,
      "prepared": 0,
      "pantryUsed": 0,
      "initial": 0,
      "net": 3,
      "purchased": 40,
      "remaining": 37,
      "unit": "g",
      "state": "dry",
      "packageQty": 40,
      "packCount": 1,
      "notPurchased": false,
      "packAssumption": "Example package: 40g usable quantity. Confirm label/edible weight.",
      "retained": 0
    },
    {
      "ingredientId": "rice",
      "name": "Rice",
      "required": 150,
      "prepared": 0,
      "pantryUsed": 0,
      "initial": 0,
      "net": 150,
      "purchased": 500,
      "remaining": 350,
      "unit": "g",
      "state": "dry",
      "packageQty": 500,
      "packCount": 1,
      "notPurchased": false,
      "packAssumption": "Example package: 500g 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": "simmer-3",
      "late": false,
      "minimumFinish": 0,
      "minimumStart": 0,
      "duration": 50,
      "resources": [
        "person",
        "stove",
        "oven"
      ],
      "dependsOn": [
        "check"
      ],
      "label": "Prepare Roast pepper bean soup in 1 load(s). Heat the oven to 220°C. Halve 400g bell pepper, removing stems and seeds; cut 150g onions into 2cm wedges. Toss with 15ml olive oil and place peppers skin-side up with onion beside them. Roast for 25–30 minutes until pepper skins blister in patches and flesh softens. Turn onion halfway; move browned pieces aside. Let peppers cool just enough to handle, about 5 minutes. Pull off loose blackened skin where it lifts easily, then chop flesh and onion into 1cm pieces. Put in a pot with 300g white beans, 200g canned tomatoes, minced 10g garlic, 2g ground paprika, 500ml recipe water, 3g salt and 1g black pepper. Simmer over medium-low heat for 10 minutes until garlic is tender and beans steam throughout. Mash half the beans against the pot to thicken the soup. If too watery, simmer uncovered; if thick, add a little processing water. No blender is needed. 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.",
      "start": 5,
      "end": 55
    },
    {
      "id": "freeze-3",
      "late": false,
      "minimumFinish": 0,
      "duration": 5,
      "resources": [
        "person"
      ],
      "dependsOn": [
        "simmer-3"
      ],
      "label": "Divide Roast pepper bean soup into 1 labelled Y/1 shares. Chill promptly in shallow containers; refrigerate or freeze within 2 hours, or 1 hour above 32°C.",
      "start": 55,
      "end": 60
    },
    {
      "id": "simmer-4",
      "late": false,
      "minimumFinish": 0,
      "minimumStart": 0,
      "duration": 25,
      "resources": [
        "person",
        "stove"
      ],
      "dependsOn": [
        "check"
      ],
      "label": "Prepare Coconut chickpea curry in 1 load(s). Cut 100g onions into 5mm dice and 300g cauliflower into 2cm florets. Mince 15g ginger and 8g garlic. Heat 15ml olive oil in a pot over medium heat; soften onion for 5 minutes, then stir in ginger, garlic and 3g ground cumin for 30 seconds until fragrant. Add cauliflower, 240g chickpeas, 300ml plain coconut milk, 3g salt and 1g black pepper. Bring to a gentle simmer, cover loosely and cook over low heat for 12–18 minutes until a knife enters cauliflower stalks easily. Avoid a rolling boil. If the sauce becomes oily, lower the heat and stir in a small splash of processing water. 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.",
      "start": 60,
      "end": 85
    },
    {
      "id": "freeze-4",
      "late": false,
      "minimumFinish": 0,
      "duration": 5,
      "resources": [
        "person"
      ],
      "dependsOn": [
        "simmer-4"
      ],
      "label": "Divide Coconut chickpea curry into 1 labelled Y/1 shares. Chill promptly in shallow containers; refrigerate or freeze within 2 hours, or 1 hour above 32°C.",
      "start": 85,
      "end": 90
    }
  ],
  "transitions": [
    {
      "from": "roast-pepper-bean-soup",
      "componentId": "prep-roast-pepper-bean-soup",
      "to": "roast-pepper-bean-soup",
      "dayIndex": 3,
      "preparedAt": "2026-10-25T20:00:00",
      "useAt": "2026-10-29T18:00:00",
      "storageType": "frozen",
      "hours": 94,
      "allowed": true,
      "action": "Freeze promptly at −18°C; thaw in the refrigerator. Reheat cooked food to 74°C, checked with a thermometer.",
      "freezeAt": "2026-10-25T20:00:00",
      "thawAt": "2026-10-28T20:00:00",
      "thawed": false,
      "plannedThawAt": "2026-10-28T20:00:00",
      "useBy": "2026-10-29T20:00:00",
      "portion": "Y/1"
    },
    {
      "from": "coconut-chickpea-curry",
      "componentId": "prep-coconut-chickpea-curry",
      "to": "coconut-chickpea-curry",
      "dayIndex": 4,
      "preparedAt": "2026-10-25T20:30:00",
      "useAt": "2026-10-30T18:00:00",
      "storageType": "frozen",
      "hours": 117.5,
      "allowed": true,
      "action": "Freeze promptly at −18°C; thaw in the refrigerator. Reheat cooked food to 74°C, checked with a thermometer.",
      "freezeAt": "2026-10-25T20:30:00",
      "thawAt": "2026-10-29T20:00:00",
      "thawed": false,
      "plannedThawAt": "2026-10-29T20:00:00",
      "useBy": "2026-10-30T20:00:00",
      "portion": "Y/1"
    }
  ],
  "prepComponents": [
    {
      "id": "prep-soba-edamame-salad",
      "title": "Cold soba and edamame",
      "ingredientIds": [
        "edamame",
        "soba"
      ],
      "freezable": false,
      "storageKind": "cooked",
      "serveCold": true,
      "maxRefrigeratedHours": 24,
      "prepMinutes": 18,
      "finishMinutes": 8,
      "prepInstructions": [
        "Boil about 2L processing water per two servings in a pot. Add 200g shelled edamame and cook for the packet time, usually 4–6 minutes, until the beans are tender rather than chalky. Lift out with a sieve and rinse under cold drinking water; drain well.",
        "In the same boiling water cook 160g wheat and buckwheat soba for the packet time, usually 4–6 minutes, until tender. Drain and rinse thoroughly under cold drinking water, rubbing gently to remove starch. Drain until no water drips steadily; if preparing ahead, chill promptly in a shallow covered container.",
        "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 cold promptly. Keep dressed salads and cut produce covered at 4°C or below and refrigerate within two hours, or one hour above 32°C. Follow the shortest ingredient use-by or opened-package limit; these cold components need no reheating."
      ],
      "finishInstructions": [
        "Keep the labelled component chilled. Use the original portion for this dinner and follow its ingredient use-by limits. Serve this component cold without reheating and complete the fresh finishing steps below.",
        "Cut 200g cucumber into 5mm half-moons and 100g carrots into fine 2mm matchsticks. Whisk 20ml simple soy sauce, 20ml lemon juice and 10ml olive oil. Check the soba label because many brands contain wheat as well as buckwheat.",
        "Toss the cold noodles and edamame with the vegetables and dressing. Sprinkle over 10g sesame seeds. If noodles cling, separate them with wet fingers before tossing; serve cold without reheating."
      ],
      "qualityNotes": "This component is cooked but intended to be served cold. Chill promptly; loosen with a little cold drinking water. Noodles are best within 24 hours. Keep cucumber and dressing separate.",
      "recipeIds": [
        "soba-edamame-salad"
      ],
      "baseAmounts": {
        "soba": 160,
        "edamame": 200
      },
      "rawAmounts": [
        {
          "ingredientId": "soba",
          "quantity": 160,
          "unit": "g"
        },
        {
          "ingredientId": "edamame",
          "quantity": 200,
          "unit": "g"
        }
      ],
      "portions": 1,
      "servings": 2,
      "signature": "[{\"ingredientId\":\"soba\",\"quantity\":160,\"unit\":\"g\"},{\"ingredientId\":\"edamame\",\"quantity\":200,\"unit\":\"g\"}]",
      "selected": false,
      "prepared": false,
      "preparedAt": null,
      "storage": null,
      "retainedPortions": 0,
      "scheduledPortions": 1,
      "uses": [
        {
          "dayIndex": 0,
          "recipeId": "soba-edamame-salad",
          "date": "2026-10-26"
        }
      ],
      "eligibleStorage": [
        "refrigerated"
      ],
      "pantryAllocations": {},
      "sourceRefs": [
        "fda-storage",
        "fda-chill",
        "foodsafety-cold-storage"
      ]
    },
    {
      "id": "prep-cucumber-chickpea-salad",
      "title": "Lemon chickpeas for chopped salad",
      "ingredientIds": [
        "chickpea",
        "onion",
        "lemon",
        "oil",
        "salt",
        "pepper"
      ],
      "freezable": false,
      "storageKind": "assembled",
      "serveCold": true,
      "maxRefrigeratedHours": 48,
      "prepMinutes": 8,
      "finishMinutes": 12,
      "prepInstructions": [
        "Drain 300g chickpeas thoroughly. Cut 50g onions into very fine 3mm dice and mix with 25ml lemon juice, 15ml olive oil, 3g salt and 1g black pepper. Fold in chickpeas and let stand while preparing the vegetables; keep chilled if made ahead.",
        "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 cold promptly. Keep dressed salads and cut produce covered at 4°C or below and refrigerate within two hours, or one hour above 32°C. Follow the shortest ingredient use-by or opened-package limit; these cold components need no reheating."
      ],
      "finishInstructions": [
        "Keep the labelled component chilled. Use the original portion for this dinner and follow its ingredient use-by limits. Serve this component cold without reheating and complete the fresh finishing steps below.",
        "Wash 250g cucumber and 250g fresh tomatoes. Cut into 1cm pieces. If cucumber seeds are very wet, scoop the loose seed core before cutting; weigh the edible portion after trimming.",
        "Fold the vegetables through the chickpeas immediately before serving. Lift with a spoon rather than mashing. If liquid accumulates, serve with a slotted spoon so the bread stays crisp.",
        "Toast 160g plain bread in a dry skillet over medium heat for 1–2 minutes per side until lightly crisp. Serve beside the cold salad; do not store the bread mixed into it."
      ],
      "qualityNotes": "Keep dressed chickpeas cold for up to 48 hours or the shorter package limit. Cut cucumber and tomato at dinner to prevent watery salad.",
      "recipeIds": [
        "cucumber-chickpea-salad"
      ],
      "baseAmounts": {
        "chickpea": 300,
        "onion": 50,
        "lemon": 25,
        "oil": 15,
        "salt": 3,
        "pepper": 1
      },
      "rawAmounts": [
        {
          "ingredientId": "chickpea",
          "quantity": 300,
          "unit": "g"
        },
        {
          "ingredientId": "onion",
          "quantity": 50,
          "unit": "g"
        },
        {
          "ingredientId": "lemon",
          "quantity": 25,
          "unit": "ml"
        },
        {
          "ingredientId": "oil",
          "quantity": 15,
          "unit": "ml"
        },
        {
          "ingredientId": "salt",
          "quantity": 3,
          "unit": "g"
        },
        {
          "ingredientId": "pepper",
          "quantity": 1,
          "unit": "g"
        }
      ],
      "portions": 1,
      "servings": 2,
      "signature": "[{\"ingredientId\":\"chickpea\",\"quantity\":300,\"unit\":\"g\"},{\"ingredientId\":\"onion\",\"quantity\":50,\"unit\":\"g\"},{\"ingredientId\":\"lemon\",\"quantity\":25,\"unit\":\"ml\"},{\"ingredientId\":\"oil\",\"quantity\":15,\"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": 1,
          "recipeId": "cucumber-chickpea-salad",
          "date": "2026-10-27"
        }
      ],
      "eligibleStorage": [
        "refrigerated"
      ],
      "pantryAllocations": {},
      "sourceRefs": [
        "fda-storage",
        "fda-chill",
        "foodsafety-cold-storage"
      ]
    },
    {
      "id": "prep-sesame-chickpea-slaw",
      "title": "Tahini chickpea filling",
      "ingredientIds": [
        "chickpea",
        "tahini",
        "lemon",
        "salt",
        "pepper"
      ],
      "freezable": false,
      "storageKind": "assembled",
      "serveCold": true,
      "maxRefrigeratedHours": 48,
      "prepMinutes": 10,
      "finishMinutes": 10,
      "prepInstructions": [
        "Drain 240g chickpeas well and mash one-third with a fork. Leave the rest whole for texture. Check that no can liquid remains pooled in the bowl.",
        "Stir 35g plain tahini, 30ml lemon juice, 2g salt and 1g black pepper into the chickpeas. If the tahini tightens, add cool drinking water a teaspoon at a time until the filling is spreadable; it should hold on a spoon rather than run.",
        "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 cold promptly. Keep dressed salads and cut produce covered at 4°C or below and refrigerate within two hours, or one hour above 32°C. Follow the shortest ingredient use-by or opened-package limit; these cold components need no reheating."
      ],
      "finishInstructions": [
        "Keep the labelled component chilled. Use the original portion for this dinner and follow its ingredient use-by limits. Serve this component cold without reheating and complete the fresh finishing steps below.",
        "Wash and dry 220g cabbage; shred into 2mm ribbons. Grate 150g carrots coarsely. Fold both into the filling just before dinner and add 10g sesame seeds. If the vegetables release water, drain the puddle before filling wraps.",
        "Warm 4 pieces plain flour tortillas briefly in a dry skillet until flexible, then let cool for a minute. Divide the cold slaw filling evenly and roll tightly. Keep any remaining filling chilled; it needs no reheating."
      ],
      "qualityNotes": "Keep the dressed chickpeas chilled and follow the earliest opened-package or use-by limit. Add freshly shredded vegetables at dinner; serve the filling cold.",
      "recipeIds": [
        "sesame-chickpea-slaw"
      ],
      "baseAmounts": {
        "chickpea": 240,
        "tahini": 35,
        "lemon": 30,
        "salt": 2,
        "pepper": 1
      },
      "rawAmounts": [
        {
          "ingredientId": "chickpea",
          "quantity": 240,
          "unit": "g"
        },
        {
          "ingredientId": "tahini",
          "quantity": 35,
          "unit": "g"
        },
        {
          "ingredientId": "lemon",
          "quantity": 30,
          "unit": "ml"
        },
        {
          "ingredientId": "salt",
          "quantity": 2,
          "unit": "g"
        },
        {
          "ingredientId": "pepper",
          "quantity": 1,
          "unit": "g"
        }
      ],
      "portions": 1,
      "servings": 2,
      "signature": "[{\"ingredientId\":\"chickpea\",\"quantity\":240,\"unit\":\"g\"},{\"ingredientId\":\"tahini\",\"quantity\":35,\"unit\":\"g\"},{\"ingredientId\":\"lemon\",\"quantity\":30,\"unit\":\"ml\"},{\"ingredientId\":\"salt\",\"quantity\":2,\"unit\":\"g\"},{\"ingredientId\":\"pepper\",\"quantity\":1,\"unit\":\"g\"}]",
      "selected": false,
      "prepared": false,
      "preparedAt": null,
      "storage": null,
      "retainedPortions": 0,
      "scheduledPortions": 1,
      "uses": [
        {
          "dayIndex": 2,
          "recipeId": "sesame-chickpea-slaw",
          "date": "2026-10-28"
        }
      ],
      "eligibleStorage": [
        "refrigerated"
      ],
      "pantryAllocations": {},
      "sourceRefs": [
        "fda-storage",
        "fda-chill",
        "foodsafety-cold-storage"
      ]
    },
    {
      "id": "prep-roast-pepper-bean-soup",
      "title": "Roast pepper bean soup",
      "ingredientIds": [
        "bell-pepper",
        "onion",
        "oil",
        "white-bean",
        "canned-tomato",
        "garlic",
        "paprika",
        "water",
        "salt",
        "pepper"
      ],
      "freezable": true,
      "storageKind": "cooked",
      "serveCold": false,
      "maxRefrigeratedHours": 72,
      "prepMinutes": 50,
      "finishMinutes": 12,
      "prepInstructions": [
        "Heat the oven to 220°C. Halve 400g bell pepper, removing stems and seeds; cut 150g onions into 2cm wedges. Toss with 15ml olive oil and place peppers skin-side up with onion beside them. Roast for 25–30 minutes until pepper skins blister in patches and flesh softens. Turn onion halfway; move browned pieces aside.",
        "Let peppers cool just enough to handle, about 5 minutes. Pull off loose blackened skin where it lifts easily, then chop flesh and onion into 1cm pieces. Put in a pot with 300g white beans, 200g canned tomatoes, minced 10g garlic, 2g ground paprika, 500ml recipe water, 3g salt and 1g black pepper.",
        "Simmer over medium-low heat for 10 minutes until garlic is tender and beans steam throughout. Mash half the beans against the pot to thicken the soup. If too watery, simmer uncovered; if thick, add a little processing water. No blender is needed.",
        "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.",
        "Toast 160g plain bread in a dry skillet or the warm oven until lightly crisp. Ladle soup into bowls and serve toast separately."
      ],
      "qualityNotes": "Freeze promptly on preparation day for dinners outside the refrigerated window. Texture may soften after freezing; keep the fresh finish separate.",
      "recipeIds": [
        "roast-pepper-bean-soup"
      ],
      "baseAmounts": {
        "bell-pepper": 400,
        "onion": 150,
        "white-bean": 300,
        "canned-tomato": 200,
        "garlic": 10,
        "paprika": 2,
        "water": 500,
        "oil": 15,
        "salt": 3,
        "pepper": 1
      },
      "rawAmounts": [
        {
          "ingredientId": "bell-pepper",
          "quantity": 400,
          "unit": "g"
        },
        {
          "ingredientId": "onion",
          "quantity": 150,
          "unit": "g"
        },
        {
          "ingredientId": "white-bean",
          "quantity": 300,
          "unit": "g"
        },
        {
          "ingredientId": "canned-tomato",
          "quantity": 200,
          "unit": "g"
        },
        {
          "ingredientId": "garlic",
          "quantity": 10,
          "unit": "g"
        },
        {
          "ingredientId": "paprika",
          "quantity": 2,
          "unit": "g"
        },
        {
          "ingredientId": "water",
          "quantity": 500,
          "unit": "ml"
        },
        {
          "ingredientId": "oil",
          "quantity": 15,
          "unit": "ml"
        },
        {
          "ingredientId": "salt",
          "quantity": 3,
          "unit": "g"
        },
        {
          "ingredientId": "pepper",
          "quantity": 1,
          "unit": "g"
        }
      ],
      "portions": 1,
      "servings": 2,
      "signature": "[{\"ingredientId\":\"bell-pepper\",\"quantity\":400,\"unit\":\"g\"},{\"ingredientId\":\"onion\",\"quantity\":150,\"unit\":\"g\"},{\"ingredientId\":\"white-bean\",\"quantity\":300,\"unit\":\"g\"},{\"ingredientId\":\"canned-tomato\",\"quantity\":200,\"unit\":\"g\"},{\"ingredientId\":\"garlic\",\"quantity\":10,\"unit\":\"g\"},{\"ingredientId\":\"paprika\",\"quantity\":2,\"unit\":\"g\"},{\"ingredientId\":\"water\",\"quantity\":500,\"unit\":\"ml\"},{\"ingredientId\":\"oil\",\"quantity\":15,\"unit\":\"ml\"},{\"ingredientId\":\"salt\",\"quantity\":3,\"unit\":\"g\"},{\"ingredientId\":\"pepper\",\"quantity\":1,\"unit\":\"g\"}]",
      "selected": true,
      "prepared": false,
      "preparedAt": "2026-10-25T20:00:00",
      "storage": "frozen",
      "retainedPortions": 0,
      "scheduledPortions": 1,
      "uses": [
        {
          "dayIndex": 3,
          "recipeId": "roast-pepper-bean-soup",
          "date": "2026-10-29"
        }
      ],
      "eligibleStorage": [
        "refrigerated",
        "frozen"
      ],
      "pantryAllocations": {},
      "sourceRefs": [
        "fda-storage",
        "fda-chill",
        "foodsafety-cold-storage"
      ],
      "finishTaskId": "freeze-3",
      "useBy": null,
      "openedAt": null
    },
    {
      "id": "prep-coconut-chickpea-curry",
      "title": "Coconut chickpea curry",
      "ingredientIds": [
        "onion",
        "cauliflower",
        "ginger",
        "garlic",
        "oil",
        "cumin",
        "chickpea",
        "coconut-milk",
        "salt",
        "pepper"
      ],
      "freezable": true,
      "storageKind": "cooked",
      "serveCold": false,
      "maxRefrigeratedHours": 72,
      "prepMinutes": 25,
      "finishMinutes": 22,
      "prepInstructions": [
        "Cut 100g onions into 5mm dice and 300g cauliflower into 2cm florets. Mince 15g ginger and 8g garlic. Heat 15ml olive oil in a pot over medium heat; soften onion for 5 minutes, then stir in ginger, garlic and 3g ground cumin for 30 seconds until fragrant.",
        "Add cauliflower, 240g chickpeas, 300ml plain coconut milk, 3g salt and 1g black pepper. Bring to a gentle simmer, cover loosely and cook over low heat for 12–18 minutes until a knife enters cauliflower stalks easily. Avoid a rolling boil. If the sauce becomes oily, lower the heat and stir in a small splash of processing water.",
        "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.",
        "With two burners, cook rice while the curry simmers. On one burner make the curry first and allow extra time. Rinse 150g rice. Cook with 300ml recipe water in a covered saucepan after checking the packet ratio: bring to a boil, reduce to low for 12–18 minutes until tender, then rest off the heat for 5 minutes. Add a little boiling processing water if grains remain firm.",
        "Fluff the rice and ladle the curry over it. If curry is too thin, simmer uncovered briefly; if too thick, loosen with a little hot processing water before serving."
      ],
      "qualityNotes": "Freeze promptly on preparation day for dinners outside the refrigerated window. Texture may soften after freezing; keep the fresh finish separate.",
      "recipeIds": [
        "coconut-chickpea-curry"
      ],
      "baseAmounts": {
        "chickpea": 240,
        "cauliflower": 300,
        "coconut-milk": 300,
        "onion": 100,
        "ginger": 15,
        "garlic": 8,
        "cumin": 3,
        "oil": 15,
        "salt": 3,
        "pepper": 1
      },
      "rawAmounts": [
        {
          "ingredientId": "chickpea",
          "quantity": 240,
          "unit": "g"
        },
        {
          "ingredientId": "cauliflower",
          "quantity": 300,
          "unit": "g"
        },
        {
          "ingredientId": "coconut-milk",
          "quantity": 300,
          "unit": "ml"
        },
        {
          "ingredientId": "onion",
          "quantity": 100,
          "unit": "g"
        },
        {
          "ingredientId": "ginger",
          "quantity": 15,
          "unit": "g"
        },
        {
          "ingredientId": "garlic",
          "quantity": 8,
          "unit": "g"
        },
        {
          "ingredientId": "cumin",
          "quantity": 3,
          "unit": "g"
        },
        {
          "ingredientId": "oil",
          "quantity": 15,
          "unit": "ml"
        },
        {
          "ingredientId": "salt",
          "quantity": 3,
          "unit": "g"
        },
        {
          "ingredientId": "pepper",
          "quantity": 1,
          "unit": "g"
        }
      ],
      "portions": 1,
      "servings": 2,
      "signature": "[{\"ingredientId\":\"chickpea\",\"quantity\":240,\"unit\":\"g\"},{\"ingredientId\":\"cauliflower\",\"quantity\":300,\"unit\":\"g\"},{\"ingredientId\":\"coconut-milk\",\"quantity\":300,\"unit\":\"ml\"},{\"ingredientId\":\"onion\",\"quantity\":100,\"unit\":\"g\"},{\"ingredientId\":\"ginger\",\"quantity\":15,\"unit\":\"g\"},{\"ingredientId\":\"garlic\",\"quantity\":8,\"unit\":\"g\"},{\"ingredientId\":\"cumin\",\"quantity\":3,\"unit\":\"g\"},{\"ingredientId\":\"oil\",\"quantity\":15,\"unit\":\"ml\"},{\"ingredientId\":\"salt\",\"quantity\":3,\"unit\":\"g\"},{\"ingredientId\":\"pepper\",\"quantity\":1,\"unit\":\"g\"}]",
      "selected": true,
      "prepared": false,
      "preparedAt": "2026-10-25T20:30:00",
      "storage": "frozen",
      "retainedPortions": 0,
      "scheduledPortions": 1,
      "uses": [
        {
          "dayIndex": 4,
          "recipeId": "coconut-chickpea-curry",
          "date": "2026-10-30"
        }
      ],
      "eligibleStorage": [
        "refrigerated",
        "frozen"
      ],
      "pantryAllocations": {
        "0": 200
      },
      "sourceRefs": [
        "fda-storage",
        "fda-chill",
        "foodsafety-cold-storage"
      ],
      "finishTaskId": "freeze-4",
      "useBy": null,
      "openedAt": null
    }
  ],
  "portionLabels": [
    {
      "id": "prep-roast-pepper-bean-soup-1",
      "componentId": "prep-roast-pepper-bean-soup",
      "title": "Roast pepper bean soup",
      "portion": "Y/1",
      "portionNumber": 1,
      "servings": 2,
      "preparedAt": "2026-10-25T20:00:00",
      "storage": "frozen",
      "originalStorage": "frozen",
      "freezeAt": "2026-10-25T20:00:00",
      "plannedThawAt": "2026-10-28T20:00:00",
      "thawAt": "2026-10-28T20:00:00",
      "thawed": false,
      "useBy": "2026-10-29T20:00:00",
      "dinnerDate": "2026-10-29",
      "recipeId": "roast-pepper-bean-soup",
      "status": "planned",
      "instructions": "Freeze promptly at −18°C; thaw in the refrigerator. Reheat cooked food to 74°C, checked with a thermometer."
    },
    {
      "id": "prep-coconut-chickpea-curry-1",
      "componentId": "prep-coconut-chickpea-curry",
      "title": "Coconut chickpea curry",
      "portion": "Y/1",
      "portionNumber": 1,
      "servings": 2,
      "preparedAt": "2026-10-25T20:30:00",
      "storage": "frozen",
      "originalStorage": "frozen",
      "freezeAt": "2026-10-25T20:30:00",
      "plannedThawAt": "2026-10-29T20:00:00",
      "thawAt": "2026-10-29T20:00:00",
      "thawed": false,
      "useBy": "2026-10-30T20:00:00",
      "dinnerDate": "2026-10-30",
      "recipeId": "coconut-chickpea-curry",
      "status": "planned",
      "instructions": "Freeze promptly at −18°C; thaw in the refrigerator. Reheat cooked food to 74°C, checked with a thermometer."
    }
  ],
  "leftovers": {
    "pantry": [
      {
        "lotId": "purchase-soba",
        "source": "planned-purchase",
        "ingredientId": "soba",
        "name": "Wheat and buckwheat soba",
        "quantity": 90,
        "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-edamame",
        "source": "planned-purchase",
        "ingredientId": "edamame",
        "name": "Shelled edamame",
        "quantity": 200,
        "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-carrot",
        "source": "planned-purchase",
        "ingredientId": "carrot",
        "name": "Carrots",
        "quantity": 750,
        "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-soy-sauce",
        "source": "planned-purchase",
        "ingredientId": "soy-sauce",
        "name": "Simple soy sauce",
        "quantity": 130,
        "unit": "ml",
        "state": "canned",
        "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": 175,
        "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-oil",
        "source": "planned-purchase",
        "ingredientId": "oil",
        "name": "Olive oil",
        "quantity": 445,
        "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-sesame",
        "source": "planned-purchase",
        "ingredientId": "sesame",
        "name": "Sesame seeds",
        "quantity": 80,
        "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-chickpea",
        "source": "planned-purchase",
        "ingredientId": "chickpea",
        "name": "Chickpeas",
        "quantity": 140,
        "unit": "g",
        "state": "drained",
        "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": 200,
        "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-bread",
        "source": "planned-purchase",
        "ingredientId": "bread",
        "name": "Plain bread",
        "quantity": 80,
        "unit": "g",
        "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-salt",
        "source": "planned-purchase",
        "ingredientId": "salt",
        "name": "Salt",
        "quantity": 239,
        "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": 46,
        "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-cabbage",
        "source": "planned-purchase",
        "ingredientId": "cabbage",
        "name": "Cabbage",
        "quantity": 580,
        "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-tahini",
        "source": "planned-purchase",
        "ingredientId": "tahini",
        "name": "Plain tahini",
        "quantity": 265,
        "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-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-white-bean",
        "source": "planned-purchase",
        "ingredientId": "white-bean",
        "name": "White beans",
        "quantity": 180,
        "unit": "g",
        "state": "drained",
        "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-canned-tomato",
        "source": "planned-purchase",
        "ingredientId": "canned-tomato",
        "name": "Canned tomatoes",
        "quantity": 200,
        "unit": "g",
        "state": "canned",
        "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-paprika",
        "source": "planned-purchase",
        "ingredientId": "paprika",
        "name": "Ground paprika",
        "quantity": 38,
        "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-coconut-milk",
        "source": "planned-purchase",
        "ingredientId": "coconut-milk",
        "name": "Plain coconut milk",
        "quantity": 100,
        "unit": "ml",
        "state": "canned",
        "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-cumin",
        "source": "planned-purchase",
        "ingredientId": "cumin",
        "name": "Ground cumin",
        "quantity": 37,
        "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": 350,
        "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."
      }
    ],
    "prepared": []
  },
  "component": null,
  "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:12.844Z"
  }
}
