At a Glance
Persona: Chef / Kitchen Manager (+ Kitchen Staff read-only) · Module: recipe · Workflow stages: DRAFT → PUBLISHED → ARCHIVED (+ un-publish round-trip) · Key permissions: create, edit, publish, archive, edit-published (with versioning), clone
What this persona does: Authors and maintains the recipe library — ingredients, steps, yield variants, sub-recipes — and owns publish and archive authority.
The Chef persona is the Chef / Kitchen Manager (with the Kitchen Staff subset as a read-only consumer during service) — the person who owns the recipe library at the operational level. The Chef creates new recipes, revises existing ones, maintains the sub-recipe library (mother sauces, stocks, pastry bases, spice mixes), ensures consistency across outlets within the same cuisine / category, and approves publication and revisions. On entry the Chef is logged in with recipe:create and recipe:edit permissions on the relevant category (RBAC may scope chefs to specific categories — e.g. Pastry Chef → Desserts, Executive Chef → all). The Chef owns the editable DRAFT (full edit rights on header, ingredients, steps, variants), holds the publish authority (recipe:publish per REC_AUTH_003), and owns the archive authority (recipe:archive per REC_AUTH_004); for tenant policies that require Cost Controller co-approval when actual food-cost % exceeds target by more than tolerance, the Chef coordinates that co-approval (REC_AUTH_007) but the Chef is the formal author of every state transition. The Kitchen Staff subset is read-only (recipe:read only) and reads PUBLISHED recipes during service — they execute the formula but do not change it; feedback from Kitchen Staff (portion-control issues, missing steps, accuracy concerns) flows back to the Chef as input for the next revision.
Entry point: Three paths into the recipe-create / edit screen.
tb_recipe at status = DRAFT; code is assigned per tenant numbering policy; created_by_id = the chef.DRAFT. The clone copies header / ingredients / steps / variants; code and name are blanked for the chef to set; status = DRAFT, published_at and archived_at cleared.DRAFT or revise PUBLISHED — the Chef opens an existing recipe. DRAFT is fully editable. PUBLISHED is edited either in-place (with versioning per REC_POST_004) or via un-publish round-trip (PUBLISHED → DRAFT → PUBLISHED per REC_POST_005) depending on tenant policy.Primary flow (happy path, 12 steps):
tb_recipe_category.default_cost_settings to inherit) and cuisine. The system writes tb_recipe at status = DRAFT; code assigned; defaults populated (target_food_cost_percentage, labor_cost_percentage, overhead_percentage inherited from category settings).name (e.g. "House Burger"), description (rich text), difficulty (EASY / MEDIUM / HARD), base_yield (e.g. 1) and base_yield_unit (e.g. "portion"), prep_time (minutes), cook_time (minutes), allergens (gluten / dairy / nuts / shellfish flags), tags (free-text — "vegan", "halal", "summer-menu", "house-special"). Add main image and gallery (images JSON).ingredient_type (product or recipe); search the product catalog (for product) or the published recipe library (for recipe); enter qty and the recipe unit; if the inventory unit differs, enter the conversion_factor; enter wastage_percentage (per-line — different ingredients have very different waste profiles, e.g. 5% for diced onion, 60% peeling loss for whole salmon, 0% for flour); the system computes net_cost and wastage_cost per REC_CALC_001–REC_CALC_002 and writes the row. Repeat for each ingredient.ingredient_type = recipe and select the sub-recipe from the PUBLISHED library. The sub-recipe's cost_per_portion feeds cost_per_unit on the line (translated to per-ingredient_unit_id basis); per-line net_cost rolls up the same way. Sub-recipes must be PUBLISHED to be referenced (REC_VAL_010 and REC_VAL_014); the no-cycle rule prevents A→B→A loops (REC_VAL_011).sequence_no, title, description (the full instruction), duration (minutes), temperature and temperature_unit if relevant, equipment (reference to tb_recipe_equipment master via JSON ref), techniques (sous-vide / flambé / etc.), chef_notes and safety_warnings for HACCP-critical control points. Reorder via drag-and-drop; the application rewrites sequence_no on touched rows.tb_recipe_yield_variant rows with variant_name, variant_unit, variant_quantity, conversion_rate (multiplier on base ingredient quantities — or use variant-scoped ingredient lines via tb_recipe_ingredient.tb_recipe_yield_variantId for stepped-quantity ingredients), cost_per_unit, selling_price. Mark one variant as default via tb_recipe.default_variant_id.total_ingredient_cost (Σ active line net_cost), labor_cost (computed from prep_time + cook_time and labor rate), overhead_cost (% of ingredient cost), cost_per_portion (the sum divided by base_yield), suggested_price (cost / (1 − target%)), and — if selling_price is set — actual_food_cost_percentage, gross_margin, gross_margin_percentage. Adjust ingredients, wastage, or pricing inputs to hit the target margin.actual_food_cost_percentage exceeds target_food_cost_percentage by more than tenant tolerance (commonly 2 percentage points), publication is gated on Cost Controller co-approval per REC_AUTH_007. Chef shares the cost analysis with the Cost Controller; the Cost Controller either co-approves the publish (recipe is intentionally a loss leader, or strategic-priced) or requests revisions (reduce ingredient cost, change vendor, reduce portion size).REC_VAL_015–REC_VAL_018 (at least one ingredient, at least one prep step, valid cost rollup, selling_price > cost_per_portion if set), and REC_AUTH_003. On success: status = DRAFT → PUBLISHED, published_at = now(); tb_recipe_version row written with version_number = 1, published = true; tb_recipe_pricing_history row written at the publication snapshot. The recipe is now eligible for menu-item linkage and theoretical-consumption drives.PUBLISHED recipes are typically presented to F&B Ops for menu-item approval per REC_AUTH_011. The linkage itself lives outside the recipe schema (POS-integration layer or application mapping per REC_XMOD_008); the Chef confirms the recipe is ready for sale.REC_XMOD_005), the Cost Controller may flag recipes whose margin has drifted; the Chef revises (in-place with versioning per REC_POST_004, or via un-publish round-trip per REC_POST_005); each revision writes a new tb_recipe_version and (if cost changed) a new tb_recipe_pricing_history row. Sub-recipe cost changes cascade automatically (REC_POST_006).PUBLISHED recipe, the Chef chooses per tenant policy. In-place (REC_POST_004) applies the edit immediately and writes a new tb_recipe_version row; the recipe stays PUBLISHED and continues to drive theoretical consumption with the new formula from the edit timestamp onward. Un-publish round-trip (REC_POST_005) moves the recipe to DRAFT first, allowing extensive edits with no live impact, then re-publishes; while in DRAFT the recipe does not drive theoretical consumption — linked menu items are blocked or fall back to the previous published version (POS-integration policy).DRAFT with the alternate ingredient (preserves the original; heavier library but cleaner audit). Decision is driven by how permanent the substitution is.tb_recipe for the component, costs it once, references it from many parents — sub-recipe cost cascade REC_POST_006 keeps all parents in sync automatically) or to inline the ingredients directly in each parent (lighter sub-recipe library but every parent re-costs separately and inconsistencies are possible). The sub-recipe pattern is preferred whenever the component appears in 2+ recipes.tb_recipe, multiple tb_recipe_yield_variant; ingredients scale via conversion_rate or via variant-scoped ingredient lines for stepped quantities) or as separate recipes (one recipe per size; less scaling math but more library entries). Yield variants are preferred for true linear-scale variants (Small = 0.5x, Large = 1.5x); separate recipes are preferred when the size variants have meaningfully different preparation (different cook times, different equipment).wastage_percentage per line based on observed trim / peel loss — the net_cost = qty × cost_per_unit × (1 + wastage%) is the cost the recipe carries; under-stating wastage understates true food cost.REC_AUTH_007 for an intentional off-target publish (loss leader, strategic-priced, signature dish).PUBLISHED → ARCHIVED per REC_POST_007; recipe terminates; no longer drives theoretical consumption; readable for audit) for permanent retirement, or un-publish (PUBLISHED → DRAFT per REC_POST_008) when the recipe is being substantially overhauled and will be re-published. Archive is intended for end-of-life; un-publish is intended for revision.The Chef's involvement on a given recipe ends at one of several boundaries:
REC_AUTH_011); the recipe is PUBLISHED and eligible for menu-item linkage and theoretical-consumption drives. The Chef returns to maintenance mode (monitoring cost drift, revising as needed).REC_AUTH_007); recipe stays DRAFT until co-approval recorded; on approval the Chef publishes, on rejection the Chef revises.REC_POST_004 / REC_POST_005. The handoff is informal (operational feedback channel) but flows through the Chef's editing authority.REC_POST_007. F&B Ops is notified to sever menu-item linkages. The recipe terminates.The Chef may also act as read-only consumer of recipes they did not author — Kitchen Staff during service execute PUBLISHED recipes without edit authority; a Pastry Chef may read but not edit recipes in the Mains category if RBAC is category-scoped.
DRAFT / PUBLISHED / ARCHIVED) on enum_recipe_status and the cross-persona handoff table; Section 4 rows "Chef → Cost Controller (co-approval)", "Chef → F&B Ops (menu-item linkage)", "Chef → Archive" anchor this persona's exits.../carmen/docs/recipe-module/RECIPE-Overview.md § Kitchen Management — carmen/docs source for the chef's responsibility scope.../carmen/docs/recipe-module/RECIPE-PRD.md § Kitchen Management user stories — carmen/docs user stories ("As a kitchen manager, I want to create and manage standardized recipes...").../carmen/docs/recipe-module/RECIPE-Business-Requirements.md § Recipe Creation (REC_CR_001–REC_CR_005), Ingredient Management (REC_IN_001–REC_IN_005), Recipe Status (REC_ST_001–REC_ST_004) — feeds the validation gates the Chef encounters.../carmen/docs/recipe/recipe-create-edit-page.md — page-spec source for the chef's primary editing surface (tabbed form: Basic Info, Ingredients, Method, Media, Costing, Nutritional).../carmen/docs/recipe/recipe-management.md — layout-level reference for the master list, create / edit, costing sheet, preparation page, media gallery, scaling calculator, and category management — the Chef's full operational surface.tb_recipe_version history.enum_recipe_status, tb_recipe_ingredient discriminator (enum_ingredient_type), sub-recipe self-relation, yield-variant model.REC_VAL_001–REC_VAL_018 (validation gates), REC_CALC_001–REC_CALC_015 (the cost math the Chef sees), REC_AUTH_001–REC_AUTH_005 (Chef's authority scope), REC_POST_001–REC_POST_008 (state-transition effects).cost_per_unit and is_used_in_recipe flag are upstream of every Chef line entry.