Skip to content

Separations

A whole egg is one thing on the shelf. The carbonara wants the yolk. The morning’s meringue wants the white. The eggshell goes in the bin. If the pantry only knows about whole eggs, the carbonara is paying for white it never used and the meringue is consuming yolks that don’t exist on any row. Real cooking constantly takes one thing apart into the parts it actually plates from — and those parts each need a row, a stock count, and a slice of the parent’s cost.

This page is for the chef who breaks down whole ingredients in the morning and the owner who reads the food-cost percentages downstream.

Why this page exists

Three problems separations solve at once.

First, stock that actually exists. When the chef cracks ten eggs into a bowl of yolks and saves the whites in a jar, the pantry has to know that there are 180 g of yolk in the prep fridge and 330 g of white in the dairy fridge, not ten whole eggs anywhere. The recipes that use yolks need to deduct from the yolk row; the recipes that use whites need to deduct from the white row. One whole-egg row can’t carry both jobs.

Second, cost that follows reality. Yolks and whites are not the same cost per gram. The yolk carries the fat, the colour, the binding power — the carbonara would not be carbonara without it. The white is a co-product, useful but cheaper. The same logic runs through every butchery and fish-fabrication task: a beef shoulder gives you roasting cuts (premium), trim (good for ragù, valuable), and fat-and-bones (low value, useful for stock). If the system splits the cost evenly by weight, the roasting cut looks artificially cheap and the bones look artificially expensive. The kitchen’s instinct — that the premium cut should carry more of the cost — needs to be expressible on the row.

Third, value where there used to be waste. A clean butchery log turns “fat and bones” from a line in the trash bin into a row with €4 of attributed cost on it, ready to feed a stock that yields €20 of brodo. The separation is the ledger that makes the math work.

The rule

A separation moves one parent down by what was processed and several children up by the configured weights. The cost of the parent splits across the children using a configurable share — equal by weight by default, weighted heavier on the premium child when the kitchen tells the system to.

How a separation is set up

A separation lives on the parent inventory row as a decomposition rule — open the parent (the whole egg, the beef chuck, the whole fish) from the inventory list, tap Edit, scroll to the Separation rule card on the right column.

If the row doesn’t have a rule yet, the card shows No rule configured and a button Configure separation outputs. Tapping it opens a dialog where the chef declares the children.

For each child, type a name (Tuorlo, Albume, Roasting cut, Trim, Fat and bones). The system reacts as the chef types: if a pantry row with a similar name already exists, a green note reads ✓ Will use existing item … — the child reuses the existing row and its history. If no match, a blue note reads ✨ Will create a new sub-product … in inventory — when the dialog saves, the system creates the row in the pantry automatically with sensible defaults, in the kitchen’s Kitchen production category at L2. The chef doesn’t have to pre-create the children; the rule editor handles the wiring.

For each child the chef sets two numbers. The Weight % is how much of the parent’s weight this child represents — 30 % for yolk in a whole egg, 65 % for roasting cuts in a beef chuck, 50 % for fillet in a whole fish. (When the parent’s net weight isn’t known yet, the chef types Qty per 1 [parent unit] directly in grams or millilitres instead — same effect, different entry path.) The Cost share (%) is how much of the parent’s cost goes to this child — by default the same as the weight share, override only when one child is genuinely worth more (yolks carry more of the egg’s cost than whites for the same weight).

The footer of the dialog shows the running totals (Outputs vs Waste) so the chef sees at a glance whether the shares add up. The sum of weight shares plus the cost shares must each be ≤ 100 % — the rest is implicit waste (eggshell, bone scrap, skin trim). The dialog blocks Save until every child has a unique name, every quantity is positive, and the totals stay in range. Clear rule at the bottom-left removes a rule entirely.

How a separation is run

Once a parent has a rule, it appears on /admin/preparations — the Separations hub — under What are you separating?. The chef picks the parent from the drop-down, types How many? in the parent’s stock unit (eggs, kilograms, whole fish), and the page shows two preview panels.

Stock change lists the parent (which will go down) and every child (which will go up) with the qty about to move. If the parent doesn’t have enough on hand, the panel shows the shortfall in red and the Confirm separation button stays disabled.

Cost split lists each child’s slice of the parent’s cost and the per-unit cost the child will carry going forward. When a child already has stock, the new arrival gets blended in: the child’s new cost-per-unit is the weighted average of what was already on the shelf and what just came out. That smoothing is intentional — the kitchen wants a stable cost on the child row, not a sawtooth that jumps with every separation event.

Tap Confirm separation. The parent’s stock drops, every child’s stock rises, the cost-split rows are written into the children’s per-unit costs, and an event lands in the Recent separations list at the bottom of the page so the chef can audit the day’s work.

Auto-separation during prep

The chef doesn’t have to remember to fire separations before service. When a batched recipe is being produced and it needs a child the kitchen has run out of (the carbonara wants yolks and there are zero on the shelf), the system fires the separation automatically — as long as the parent has stock. The number of parents cracked is rounded up to cover the recipe (40 g of yolk needed, 18 g of yolk per egg, three eggs cracked), the extra yolk and the corresponding white go back into stock for the next consumer, and the event shows up in Recent separations with a purple Auto pill so the chef can see what the system did without being asked.

If the parent is also empty, auto-separation can’t run — the recipe production reports a shortfall the same way it always did, and the chef either tops up the eggs or overrides through the existing force-log path.

Worked example

Wednesday morning, before service. The chef breaks down a 4 kg beef chuck — bought from the butcher at €18/kg, so the parent row carries €72 of cost. The decomposition rule on the chuck declares three children:

  • Roasting cut, 65 % of weight (2.6 kg), 70 % of cost share — the premium cut for the Tagliata on the menu.
  • Trim, 20 % of weight (0.8 kg), 25 % of cost share — slightly above its weight share because the trim from a quality chuck is what gives the ragù its body and the kitchen values it heavily.
  • Fat and bones, 10 % of weight (0.4 kg), 5 % of cost share — useful for stock, but the cost share is low because the kitchen doesn’t want this child carrying value the menu can’t recover.
  • Implicit waste: 5 % (sinew, drip loss).

The chef opens /admin/preparations, picks Beef chuck in the drop-down, types 4 in the kilogram field. The preview panels light up:

  • Stock change: Beef chuck −4 kg, Roasting cut +2.6 kg, Trim +0.8 kg, Fat and bones +0.4 kg.
  • Cost split: Roasting cut gets €50.40 (70 % of €72), per-unit cost €19.38/kg. Trim gets €18.00 (25 %), per-unit cost €22.50/kg — yes, the trim per kilo is worth more than the roasting cut per kilo, because the kitchen weighted the share that way and the trim is what carries the ragù. Fat and bones gets €3.60 (5 %), per-unit cost €9.00/kg.

The chef taps Confirm separation. The chuck row drops to whatever was on the shelf minus 4 kg. The three children rows rise by their respective weights. The Ragù recipe — which lists Beef trim at 600 g per batch — picks up the new per-unit cost on its next read: that batch’s beef cost goes from €0 (the trim wasn’t a costed row before the rule was configured) to €13.50, and the Tagliatelle al Ragù food-cost percentage on the dashboard ticks up a hair to reflect reality.

The owner reads the weekly report on Sunday. The €72 of beef chuck the kitchen processed last week is no longer one big lump tied to one dish; it’s three lines, three children, three recipes, three margins. One parent, three children, one ledger, four reconciled numbers.

  • Inventory — overview — the list where both parents (whole egg, beef chuck) and children (yolk, trim) live as rows; the children show up automatically when the rule is saved
  • Editing an inventory item — the Separation rule card on the right column of the edit form is where the rule is configured and cleared
  • Recipes — how the kitchen turns ingredients into a costed output — the recipes that consume the children pick up the new per-unit cost automatically; auto-separation fires from the prep board when a recipe needs an empty child
  • Stock counts — both the parent and the children get counted independently, on their own shelves; the count writes Current stock on each
  • Waste log — implicit waste from a separation (eggshell, bone scrap) is folded into the rule’s share math, so the chef doesn’t log it twice; unexpected waste (a child going off after the separation) is logged here
  • Where your information lives — the five rooms of the system; separations are the operation that lets one pantry row become several without leaving the pantry