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.
| Rule | Field | Severity | What it enforces (the message your team sees) |
|---|---|---|---|
| item_id_required | item_id | error | item_id is required — every PPDS menu item must be uniquely identifiable |
| item_name_required | item_name | error | item_name is required |
| item_name_max_length | item_name | error | item_name must not exceed 200 characters |
| sku_required | sku | error | sku is required |
| category_required | category | error | category is required |
| category_valid | category | error | category must be one of: sandwich, wrap, hot_food, pastry, salad, beverage, dessert, side, sauce, other |
| ingredients_text_required | ingredients_text | error | ingredients_text is required — Natasha's Law mandates a full ingredients list on every PPDS label |
| ingredients_text_max_length | ingredients_text | error | ingredients_text must not exceed 2000 characters |
| contains_celery_required | contains_celery | error | contains_celery must be declared (true or false) — Natasha's Law requires explicit allergen declaration |
| contains_celery_valid | contains_celery | error | contains_celery must be 'true' or 'false' |
| contains_gluten_required | contains_gluten | error | contains_gluten must be declared (true or false) — cereals containing gluten (wheat, rye, barley, oats) are a controlled allergen |
| contains_gluten_valid | contains_gluten | error | contains_gluten must be 'true' or 'false' |
| contains_crustaceans_required | contains_crustaceans | error | contains_crustaceans must be declared (true or false) |
| contains_crustaceans_valid | contains_crustaceans | error | contains_crustaceans must be 'true' or 'false' |
| contains_eggs_required | contains_eggs | error | contains_eggs must be declared (true or false) |
| contains_eggs_valid | contains_eggs | error | contains_eggs must be 'true' or 'false' |
| contains_fish_required | contains_fish | error | contains_fish must be declared (true or false) |
| contains_fish_valid | contains_fish | error | contains_fish must be 'true' or 'false' |
| contains_lupin_required | contains_lupin | error | contains_lupin must be declared (true or false) |
| contains_lupin_valid | contains_lupin | error | contains_lupin must be 'true' or 'false' |
| contains_milk_required | contains_milk | error | contains_milk must be declared (true or false) |
| contains_milk_valid | contains_milk | error | contains_milk must be 'true' or 'false' |
| contains_molluscs_required | contains_molluscs | error | contains_molluscs must be declared (true or false) |
| contains_molluscs_valid | contains_molluscs | error | contains_molluscs must be 'true' or 'false' |
| contains_mustard_required | contains_mustard | error | contains_mustard must be declared (true or false) |
| contains_mustard_valid | contains_mustard | error | contains_mustard must be 'true' or 'false' |
| contains_peanuts_required | contains_peanuts | error | contains_peanuts must be declared (true or false) |
| contains_peanuts_valid | contains_peanuts | error | contains_peanuts must be 'true' or 'false' |
| contains_sesame_required | contains_sesame | error | contains_sesame must be declared (true or false) |
| contains_sesame_valid | contains_sesame | error | contains_sesame must be 'true' or 'false' |
| contains_soybeans_required | contains_soybeans | error | contains_soybeans must be declared (true or false) |
| contains_soybeans_valid | contains_soybeans | error | contains_soybeans must be 'true' or 'false' |
| contains_sulphites_required | contains_sulphites | error | contains_sulphites must be declared (true or false) — sulphur dioxide / sulphites are a controlled allergen above 10ppm |
| contains_sulphites_valid | contains_sulphites | error | contains_sulphites must be 'true' or 'false' |
| contains_tree_nuts_required | contains_tree_nuts | error | contains_tree_nuts must be declared (true or false) |
| contains_tree_nuts_valid | contains_tree_nuts | error | contains_tree_nuts must be 'true' or 'false' |
| gluten_cereal_types_required_if_gluten | gluten_cereal_types | error | gluten_cereal_types is required when contains_gluten is true — specify the cereal(s): wheat, rye, barley, oats, spelt, or kamut |
| gluten_cereal_types_valid | gluten_cereal_types | error | gluten_cereal_types must only contain: wheat, rye, barley, oats, spelt, kamut |
| tree_nut_types_required_if_tree_nuts | tree_nut_types | error | tree_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_valid | tree_nut_types | error | tree_nut_types must only contain recognised tree nut types |
| sulphites_ppm_required_if_sulphites | sulphites_ppm | error | sulphites_ppm is required when contains_sulphites is true — record the concentration in ppm (must be >= 10, the statutory declaration threshold) |
| sulphites_ppm_min | sulphites_ppm | error | sulphites_ppm must be >= 10 when contains_sulphites is true — sulphites only require declaration above the 10ppm statutory threshold |
| ppds_reviewed_by_required | ppds_compliant_reviewed_by | error | ppds_compliant_reviewed_by is required — record who verified the allergen declarations before the item was labelled or served |
| ppds_review_date_required | ppds_review_date | error | ppds_review_date is required — record the date of allergen compliance review |
| ppds_review_date_format | ppds_review_date | error | ppds_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 →