Mise · Persona Flows · companion to the X-Ray wireframe

Five Kitchens, Walked Through

The X-ray storyboard walked one recipe through the product. Here the same two-layer view — what the operator sees on top, what the engine does underneath — is stepped through for each of the five kitchens. The point: the flow bends differently for each of them, and that's what shapes the receipt.

▲ Top — what the operator actually sees (screen, text, or voice) ⚙ Bottom — what the engine does + the ledger it writes

Maya — the new bistro

greenfield · bulk onboarding

How her flow bends: she isn't costing one dish — she's onboarding a whole menu at once, with no purchase history. The flow becomes bulk capture → bulk silent-cost → a batched verify sweep where ask-once pays off hugely (answer "which chèvre" once, it resolves across every dish).

F1Bulk Captureconcierge in beta

what Maya sees

Send me your menu, chef — photos of the cards and your vendor quote sheets. I'll price the whole book.

She texts 30 recipe-card photos + 4 quote-sheet PDFs.

under the hood

extract_recipe ×30 → 30 RecipeDrafts.

Quote sheets ingested as tenant prices, tagged stated · basis:quote — not invoices, not corpus.

No costing yet. Her own_history store is empty; quotes are her only tenant data.

A book, not a dish. The quote sheet is a third kind of price the receipt has to name.
F2Silent Bulk Costingreal engine

what Maya sees

Pricing all 30… most from market rates near you, a few from your quotes.
Beet Salad ~$2.23Chicken ~$4.07

Each dish lands with a cost + a low "% from your own prices."

under the hood — one dish's receipt (Beet Salad)

Every line walks the ladder → mostly rung 3.

{ "line":"goat cheese 55g",
  "provenance":"corpus", "basis":"market_median",
  "price_scope":{ "scope":"corpus_nearby",
    "geo":"Portland", "n_kitchens":9, "range":[3.10,3.60] },
  "swing":0.19, "material":true }   // → asks

corpus carries its evidence; pct_from_own_prices: 0.00 — the cold-start signature.

The rigor runs invisibly on all 30 at once. Ranges, not fake precision — because these aren't her prices yet.
F3Batched Verify Sweepdollar-gated · ask-once

what Maya sees

Across your menu, a handful of things would sharpen real cost. Which chèvre?
house / local ✓commodity

She answers ~2–4 per dish — mostly produce yields + a few "no nearby price, what did your forager quote?"

under the hood

generate_questions over 30 ledgers → dedup by (kind, subject).

"Which chèvre?" answered once resolves it on every dish that uses it. Chanterelle has no nearby price → error → question, never invented.

The dollar gate suppresses the pennies; the sweep is short because ask-once collapses the vocabulary.

The batched sweep is only tolerable because one answer propagates. Without ask-once, 30 dishes = 60+ questions.
F5The Living Menudecisions before opening

what Maya sees

Avg food cost 29%3 at risk
Chanterelle Toast & the scallop are your margin-killers — both lean on prices I'm not sure of. Confirm those two and print.

under the hood

margin_report across the book; her answers wrote to memory → pct_from_own_prices climbing from 0.

Every dish traceable: which lines are her quotes, which are market estimates.

She sets prices before she prints menus — the thing she came for.
What Maya's flow adds to the receipt: the basis:quote kind, price_scope as an evidence-bearing object, the pct_from_own_prices trust dial, and errors that surface as questions and never a fabricated number.

Chomp — the donut shop

established · nested recursion

How her flow bends: closest to the original X-ray, but the recipe is a tree. Costing one donut means costing two batches first and pulling small amounts up — and the receipt has to show that build-up without drowning.

F2Silent Costing — with recursionown history

what Chomp sees

Pricing your Salted Caramel Donut from your invoices…

✓ costed the caramel batch · ✓ costed the shells · applying the 90% shell yield

under the hood — the recursion block

Children cost first (cached), parent pulls per-unit up:

{ "line":"shells 65g", "role":"sub_recipe",
  "sub_recipe":{ "batch_cost":56.39, "per_g":0.0025,
    "child_rollup":{ "max_delta_at_parent":0.00 } },
  "yield":{ "factor":0.90, "applied":true },
  "line_cost":0.18 }   // 0.1617 ÷ 0.90

The 90% yield is the only one in the donut — the difference between $0.40 and $0.38.

Recursion is referenced, not duplicated; the child's materiality bubbles up so the parent's gate can see it.
F5Living Answer + the thing MarginEdge can't do

what Chomp sees

$0.40 / donut · 10.7% food cost
Matches your MarginEdge number. One thing they can't tell you: your cocoa butter runs $68/kg — kitchens near you pay less. Want the comparison?

under the hood

Cost + margin off own_history; the outlier guard flagged cocoa butter (not silently absorbed).

The corpus benchmark is the wedge over the incumbent — same engine, one more read.

Match the incumbent on cost, add the market comparison it structurally can't.
What Chomp's flow adds: the recursion block with materiality propagation, the visible yield.applied, and the outlier_flag that surfaces a real specialty price for review without refusing it.

Alta Burger — the 8-location chain

multi-location · scope

How her flow bends: capture happens once at HQ, then costing happens eight times — once per store against that store's invoices. The receipt has to carry which location, and who owns each fact.

F1HQ defines the burger — once

what HQ sees

The Alta Classic saved as your standard: $2.42/plate, target 27% food cost. Pushing to all 8 locations.

under the hood

Recipe + standard + menu price are fact_scope: org — owned by HQ, shared to all, editable only by HQ.

The recipe is org-owned. The prices that fill it will be location-owned.
F2It costs 8 times — once per location

what a Culver City GM sees

Culver City: $2.53 · 28.3%
You're $0.11 over the standard — it's your beef.

Sacramento's GM sees $2.37, under standard.

under the hood — same recipe, two receipts

{ "costed_for":"loc_la_culver",
  "line":"ground beef 4oz",
  "price_scope":"tenant", "fact_scope":"location",
  "unit_cost_lb":4.85, "source":"USF Vernon inv" }
// Sacramento: same line, $4.35, its own invoice

costed_for + fact_scope are why "your price" means something.

One recipe, eight true costs. The spread lives entirely in which location's invoices the ladder read.
F6Fleet roll-up + overpaythe corporate view

what the VP of Supply Chain sees

Spread $2.31–$2.55
Beef drives 55% of your cross-store variance. Culver City pays $0.50/lb over Sacramento — ~$14k/yr on one SKU. Match the contract?

under the hood

Cross-location benchmark: each store's price vs. sister stores + corpus vicinity. location facts compared, corpus anonymized.

The overpay block is the differentiated value — and the reason The Stand's founder pointed here.

Recipe costing is table stakes; the cross-store price intelligence is what a chain buys.
What Alta's flow adds: costed_for on the envelope, the orthogonal fact_scope (org / location / corpus), the benchmark/overpay block, and answer_scope so an org fact isn't re-answered per store.

Diego — the taco truck

solo · voice-first

How his flow bends: there's no screen mid-service. The same receipt renders to a spoken sentence and an SMS, and the verify budget drops to one question. The engine doesn't change — only the door.

F2·F3Cost + the one question — by text

what Diego sees (SMS, 5:55pm)

Al pastor taco ≈ $0.74/plate · 21% FC @ $3.50

pork: market ~$2.49/lb, ~30% cook loss (my guess)

reply "pork loss 35" or "good"

under the hood — one ledger, gated for context

7 lines, 3 material. Mid-service budget = 1.

gate: swing≥$0.10 & rank≤1
 pork yield  swing 0.13 → ASK
 pork price  swing 0.07 → CONFESS
 tortilla    swing 0.02 → SILENT
 ...4 more   → SILENT

The FrictionPolicy lives in the door, not the ledger. The ledger just carries swing.

One recipe costed, zero taps, one optional question ignored. That's the friction budget working.
F3·F4Answered by voice → memory

what Diego hears (griddle, hands full)

"Mise, what's my al pastor taco cost?"

"About 74 cents — 21% at $3.50, solid. Biggest guess: pork loses about a third. Know it closer?"

"More like 35, I trim a lot."

"Got it — 35%. New cost 78 cents, still 22%. Saved, won't ask again."

under the hood — same ledger, three renders

The spoken sentence is a render of the ledger: number from portion_cost, confession from the pork entry's variance:yield.

"35" → save_answerusable_factor 0.65, chef_confirmed, tenant-scoped. Deduped by (kind, subject) → never re-asked.

One spoken word flips a line from guess to confirmed and lifts "% own price" from 0 → 77.
What Diego's flow proves: the ledger is interface-agnostic — no voice/chip fields, ever. The door phrases and gates; the receipt only carries facts + swing. That's what lets voice ship as "a skin, zero engine changes."

Coastline — the migrating caterer

legacy · diff-verified

How his flow bends: there's no capture at all — the front door is the translator. The distinctive frame isn't Verify, it's the Diff: re-cost the old book and explain every difference from the numbers they've trusted for years.

F0Import — not capture

what Coastline sees

Imported 12 years of your ChefTec book — 8,400 items, 340 recipes. Re-costing everything against your own invoices now.

under the hood

translator → staging. Duplicates merged (seed-id → SKU → fuzzy). 1.0 yields imported as NULL (unknown), not zero-waste.

The messy catalog is deduped into one canonical identity — the merge is the migration.
F-DIFFThe Diff — the trust framethe distinctive step

what Coastline sees

Vinaigrette: $8.01 — matches your old number exactly.
Short Rib: we get $486 vs your $403 — but 93% of that is a 2021 price that never updated. Not a bug, a re-price.

under the hood — the diff object

{ "new_cost":486.20, "cached":402.75,
  "buckets":[
    {"stale_cache":78.00, "beef price rose since 2021"},
    {"excluded_rows":1.20, "zero-cost junk row"},
    {"legacy_incomplete":4.25} ],
  "residual_bug":0.00, "verdict":"verified" }

Every difference bucketed & explained → residual 0 = engine proven, not broken.

Continuity earns trust: a clean match, and any difference explained in one sentence.
F-WORKCleanup as a worklist, not a wall

what Coastline sees

Your book is live now. When you have a minute: 2 things I flagged — beef tenderloin has no trim yield entered (I'm underselling that dish), and "bunch of basil" needs a weight.

under the hood

data_quality: yield_unknown → cost flagged understated (not silently 1.0). Missing conversion → question seeded from ConvMissing.

The book stays live; debts are carried, not gates.

Never a 2,000-question cleanup wall — the mismatch report is the worklist they pull.
What Coastline's flow adds: the diff object + bucket enum, data_quality[] flags, split identity/price provenance (legacy_catalog identity + own_history price), and the yield.status: unknown bit that keeps an unentered yield honest instead of silently zero-waste.