Plan-aware reports
When the input is a .menu meal plan, templates receive a plan value.
{{ plan.start_date }} โ {{ plan.end_date }}
{{ plan.total_meal_count }} meals ยท {{ plan.unique_recipe_count }} unique recipes
{% for day in plan.days %}
{{ day.date }}
{% set t = macros(day.ingredients) %}
{% for meal in day.meals %}{% for recipe in meal.recipes %}โฆ{% endfor %}{% endfor %}
{% endfor %}
{{ plan.all_ingredients }} {# flat, scaled list for whole-plan aggregation #}
Available fields: plan.days, plan.all_ingredients,
plan.total_meal_count, plan.unique_recipe_count, plan.start_date,
plan.end_date. Each day exposes day.date, day.meals, and
day.ingredients; each meal exposes meal.recipes.
Allergens
Plan reports get the batch allergen rollup the same way recipes do โ via
aggregate_nutrition(plan.all_ingredients).allergen_summary for the whole
plan, or aggregate_nutrition(day.ingredients).allergen_summary per day.
Render the standard Contains/incomplete lines with the registered
"allergens" partial:
{% set alg = aggregate_nutrition(plan.all_ingredients).allergen_summary -%}
{% if alg %}{% filter trim %}{% include "allergens" %}{% endfilter %}{% endif %}
contains unions verified items only โ a floor, not a ceiling, whenever
unverified_ingredients is non-empty; unverified never means allergen-free.
See the allergens section of the
function reference for the full field reference.
Variety checks across a plan
category_servings(plan, slug) counts meals containing at least one ingredient
in a category (tree-aware), which powers variety targets like omega-3 servings:
{% import "ck" as ck %}
{{ ck.min(category_servings(plan, "omega3_source"), client.targets.omega3_servings, "Omega-3 servings") }}
See Checks & client profiles for the ck macros and
Confidence & provenance for whole-plan estimate
quality.