Starter contract

ppds_menu_item

45 rules · plain YAML · starts in observation mode

OpenDQV Cloud starter template (v0.1) — your tenant inherits this baseline. First customer edit creates v1.0 in your audit trail; pin by yaml_hash for replay. Natasha's Law (Food Information (Amendment) (England) Regulations 2019) compliance contract for Pre-Packed for Direct Sale (PPDS) menu items. Enforces explicit declaration of all 14 major allergens at the point of write — before the item is labelled or served. Every allergen field is mandatory; omission is structurally impossible and triggers a 422 before the record enters the system. Applies to any food business making Pre-Packed for Direct Sale food on the same premises — QSRs, cafés, bakeries, delis, school canteens, and hospital food services.

These are starting points you own. Every rule below ships in the trial, starts in observation mode, and is yours to read, edit, or delete from day one. Rules that reference a lookup list (lookup_file) validate against reference data you control in your tenant.
Rules as at 29 August 2026 — starting points you own, not a maintained regulatory feed. We correct errors in these samples; tracking regulatory change in your active contracts is yours.
RuleFieldSeverityWhat it enforces (the message your team sees)
item_id_requireditem_iderroritem_id is required — every PPDS menu item must be uniquely identifiable
item_name_requireditem_nameerroritem_name is required
item_name_max_lengthitem_nameerroritem_name must not exceed 200 characters
sku_requiredskuerrorsku is required
category_requiredcategoryerrorcategory is required
category_validcategoryerrorcategory must be one of: sandwich, wrap, hot_food, pastry, salad, beverage, dessert, side, sauce, other
ingredients_text_requiredingredients_texterroringredients_text is required — Natasha's Law mandates a full ingredients list on every PPDS label
ingredients_text_max_lengthingredients_texterroringredients_text must not exceed 2000 characters
contains_celery_requiredcontains_celeryerrorcontains_celery must be declared (true or false) — Natasha's Law requires explicit allergen declaration
contains_celery_validcontains_celeryerrorcontains_celery must be 'true' or 'false'
contains_gluten_requiredcontains_glutenerrorcontains_gluten must be declared (true or false) — cereals containing gluten (wheat, rye, barley, oats) are a controlled allergen
contains_gluten_validcontains_glutenerrorcontains_gluten must be 'true' or 'false'
contains_crustaceans_requiredcontains_crustaceanserrorcontains_crustaceans must be declared (true or false)
contains_crustaceans_validcontains_crustaceanserrorcontains_crustaceans must be 'true' or 'false'
contains_eggs_requiredcontains_eggserrorcontains_eggs must be declared (true or false)
contains_eggs_validcontains_eggserrorcontains_eggs must be 'true' or 'false'
contains_fish_requiredcontains_fisherrorcontains_fish must be declared (true or false)
contains_fish_validcontains_fisherrorcontains_fish must be 'true' or 'false'
contains_lupin_requiredcontains_lupinerrorcontains_lupin must be declared (true or false)
contains_lupin_validcontains_lupinerrorcontains_lupin must be 'true' or 'false'
contains_milk_requiredcontains_milkerrorcontains_milk must be declared (true or false)
contains_milk_validcontains_milkerrorcontains_milk must be 'true' or 'false'
contains_molluscs_requiredcontains_molluscserrorcontains_molluscs must be declared (true or false)
contains_molluscs_validcontains_molluscserrorcontains_molluscs must be 'true' or 'false'
contains_mustard_requiredcontains_mustarderrorcontains_mustard must be declared (true or false)
contains_mustard_validcontains_mustarderrorcontains_mustard must be 'true' or 'false'
contains_peanuts_requiredcontains_peanutserrorcontains_peanuts must be declared (true or false)
contains_peanuts_validcontains_peanutserrorcontains_peanuts must be 'true' or 'false'
contains_sesame_requiredcontains_sesameerrorcontains_sesame must be declared (true or false)
contains_sesame_validcontains_sesameerrorcontains_sesame must be 'true' or 'false'
contains_soybeans_requiredcontains_soybeanserrorcontains_soybeans must be declared (true or false)
contains_soybeans_validcontains_soybeanserrorcontains_soybeans must be 'true' or 'false'
contains_sulphites_requiredcontains_sulphiteserrorcontains_sulphites must be declared (true or false) — sulphur dioxide / sulphites are a controlled allergen above 10ppm
contains_sulphites_validcontains_sulphiteserrorcontains_sulphites must be 'true' or 'false'
contains_tree_nuts_requiredcontains_tree_nutserrorcontains_tree_nuts must be declared (true or false)
contains_tree_nuts_validcontains_tree_nutserrorcontains_tree_nuts must be 'true' or 'false'
gluten_cereal_types_required_if_glutengluten_cereal_typeserrorgluten_cereal_types is required when contains_gluten is true — specify the cereal(s): wheat, rye, barley, oats, spelt, or kamut
gluten_cereal_types_validgluten_cereal_typeserrorgluten_cereal_types must only contain: wheat, rye, barley, oats, spelt, kamut
tree_nut_types_required_if_tree_nutstree_nut_typeserrortree_nut_types is required when contains_tree_nuts is true — specify the nut(s): almonds, hazelnuts, walnuts, cashews, pecans, brazil_nuts, pistachios, macadamia, queensland_nuts
tree_nut_types_validtree_nut_typeserrortree_nut_types must only contain recognised tree nut types
sulphites_ppm_required_if_sulphitessulphites_ppmerrorsulphites_ppm is required when contains_sulphites is true — record the concentration in ppm (must be >= 10, the statutory declaration threshold)
sulphites_ppm_minsulphites_ppmerrorsulphites_ppm must be >= 10 when contains_sulphites is true — sulphites only require declaration above the 10ppm statutory threshold
ppds_reviewed_by_requiredppds_compliant_reviewed_byerrorppds_compliant_reviewed_by is required — record who verified the allergen declarations before the item was labelled or served
ppds_review_date_requiredppds_review_dateerrorppds_review_date is required — record the date of allergen compliance review
ppds_review_date_formatppds_review_dateerrorppds_review_date must be a valid ISO 8601 date (YYYY-MM-DD) — required for FSA audit trail

Run your own data against this contract in the free trial — drop a CSV in the dashboard, no code, no credit card. Start free trial →