Recipe & SOP System | 食谱与 SOP 系统 For sign-off | 待确认

The data model for your recipe and SOP system食谱系统的数据模型导图

01

The model itself资料模型本身

Your six — recipes, dishes, sub-recipes, ingredients, versions, approval status — are the objects below. Two layers first.你问的六项——食谱、菜品、子配方、原料、版本、审批状态——都在下面这些物件里。先讲两层。先两层,再十个物件。

Bought in | 买进来的 Ingredients 原料

Supplier, pack, unit, allergens printed on the packaging. The kitchen doesn't make these — it uses them.

Made in-house | 自己做的 Recipes 食谱

Ingredient list + method + yield. Marked either sub-recipe (referenced by others) or dish (what leaves the pass). Same structure either way.

Why they must stay apart:为什么必须分开:把这两层分开不是为了整齐,是为了下面这件事:

Dish 菜品Pork Belly | base genep | pumpkin⚠ tree nut · crustacean — via base genep 经由 base genep
Ingredient 原料Pork belly 五花肉
Sub-recipe 子配方base genep⚠ tree nut · crustacean — from its ingredients 来自其原料
Ingredient 原料Aromatics 辛香料
Ingredient 原料Candlenut 烛果⚠ tree nut · 坚果
Ingredient 原料Shrimp paste 虾酱⚠ crustacean · 甲壳类
Sub-recipe 子配方Purée 泥状配件⋯ own ingredients · 各有自己的原料
Sub-recipe 子配方Pickle 腌渍配件⋯ own ingredients · 各有自己的原料
Sub-recipe 子配方Pickling liquor 腌渍底液another level down · 又一层⋯ own ingredients · 各有自己的原料
Sub-recipe 子配方Garnish 装饰配件⋯ own ingredients · 各有自己的原料

The dish and base genep are from your menu; everything under them is generic. I've used placeholder names for the components rather than guess at how you actually build them.菜名和 base genep 取自你们的菜单;底下的层级是通用示意。各个元素我用的是泛称,没有去猜你们实际怎么做。 Only base genep is opened up here — every sub-recipe has its own ingredient lines; expanding them all would make the diagram unreadable. 这里只展开了 base genep——每一份子配方底下都有自己的原料行,全展开的话图会挤成一团。

Why the layers matter为什么要分两层

The base genep sheet lists candlenut and shrimp paste — written down once, when that sheet was made. The Pork Belly sheet simply names base genep; nobody rewrites its contents on every dish that uses it, and there is no reason they should.base genep 那张纸上当然写了烛果和虾酱——写过一次,在它被建立的时候。Pork Belly 那张纸只写「base genep」;没有人会在每一道用到它的菜上再抄一遍,也没必要。

So the information exists — one document away. What it needs is joining up at the moment it matters: the station card reads crustacean at the top because the system walked down the recipe, collected what each ingredient record already says, and carried it back up. Traced through the recipe, rather than depending on someone remembering it at the pass.所以信息是有的——只是在另一张纸上。缺的是在真正需要的那一刻把它们接起来:出菜口那张卡最上面写着甲壳类,是因为系统顺着配方往下走,把每张原料卡上早已写好的东西收集起来,再一层层带回上面。顺着配方查出来的,而不是靠出菜的人记得住。

Ten objects and their fields十个物件和它们的字段

ObjectFields in scope 本次字段Rule that matters
Ingredient name · aliases (terasi / trassi / belacan) · category · base unit · unit conversions incl. density · supplier & pack · allergens · allergens_verified · verification source · trim/yield loss · status Allergens are derived from here, never guessed from recipe text.过敏原从这里推导,绝不从食谱文字猜。未核实 → 所有用到它的食谱全部卡住。 Not verified → every recipe using it is blocked.
Recipe code · name · role: dish | sub-recipe · section/station · created · archived Permanent facts only.只放永远不变的东西。配料、做法、产出量都不在这里——否则改一次食谱就等于改掉它自己的全部历史。 No ingredients, no method, no yield here — otherwise editing a recipe would silently rewrite its own history and "approved is frozen" would be false.
Recipe
version
version no. · status · yield qty + unit · portions & portion size · method steps (ordered) · equipment · storage · shelf life · plating photo & notes (optional) · missing_fields state · change reason · created/reviewed/approved by · approved date · effective date · source (photo / audio / transcript / extraction run) The only place content lives. Approved = frozen;内容的唯一归属地。批准即冻结,改动产生新版本,旧版保留。产出量必填——被引用时的换算基准。 changes create a new version and the old one is kept. Yield is mandatory — it's the conversion basis whenever this recipe is referenced by another.
Recipe
line
position · type: ingredient | recipe · target · binding: follow current approved | pinned · pinned version · quantity + unit · prep note · prep loss % · optional One row per line of a version.版本底下的每一行。它指向的是那个子配方,不是它的某一版——由引用规则决定跟不跟随。这一行就是十二道菜那题的全部答案。 It points at the sub-recipe, not at one of its versions — the binding field decides whether it follows. This row is the whole twelve-dishes answer.
Dependency ancestor recipe · descendant recipe · depth Maintained automatically. Answers "what uses this" instantly, blocks circular references, and finds every downstream item when something changes.系统自动维护。秒答「什么用到了它」、阻止循环引用、变更时找出全部下游。
Impact
record
source version · affected version · materiality: allergen | yield | method | cosmetic · allergen delta · yield delta · resolution · resolved at Generated automatically the moment a sub-recipe is approved.子配方一批准就自动生成一批。这是审核队列的输入。 This is what feeds the review queue.
Review
task
target version · type: new import | edit | upstream change · triggering version · assigned role & person · state · opened / closed · decision Where approval routing actually lives.approval routing 真正落地的地方。没有它,审核队列只是一个筛选视图——没法指派,也没法追踪。 Without it the review queue is only a filtered view — nothing to assign, nothing to chase.
ROOTS /
SOP doc
category · title · version · approval status · linked recipes · publish target An output document generated from approved content由已批准内容生成的输出文件——不是第二个要另外维护的资料库。 — not a second, separate library to maintain.
Audit log entity · actor · timestamp · action · before · after Append only.只增不改。「哪一版、谁批的、哪天」最后的凭据。 The final evidence for "which version, approved by whom, on what date".
RecipeName + role.
Nothing else.名称与角色,别的都不放
1 : N
VersionAll the content.
Frozen once approved.全部内容;批准即冻结
1 : N
Recipe lineQuantity + binding:
follow or pinned.用量 + 引用规则
points at
Ingredient
or Recipe ↺
Pointing back at a recipe is what creates nesting.指回配方,就形成巢状

The one field to confirm: binding, on the recipe line. Everything in section 02 depends on it.要确认的就是那一个字段:配料行上的「引用规则」。第 02 节讲的一切都靠它。

Approval states审批状态

Draft 草稿 In review 审核中 Approved 已批准 Published 已发布 Superseded 已停用
Needs info 缺资料 A draft missing allergens, shelf life or yield sits here instead, and cannot be sent for review at all until it is completed.缺过敏原、保质期或产出量的草稿会停在这里,补齐之前根本送不出去审核
These states belong to a version, not to the recipe. Editing an approved recipe never sends it backwards — it opens a new version starting at Draft, while the published one stays live in the kitchen until the new one is approved. A recipe can therefore hold a published v2 and a draft v3 at the same time.这些状态属于「版本」,不属于「食谱」。改一份已批准的食谱,永远不会把它退回去——而是另开一个从草稿开始的新版本,在新版批准之前,已发布的那一版继续在厨房有效。所以一份食谱可以同时有一个已发布的 v2 和一个草稿的 v3。
02

The version rule版本规则

One rule, three parts. This is what I'd recommend, and confirming it is the main thing I need.一条规则,三个部分。这是我的建议,确认它是我最需要的东西。

base genep — version history 版本历史
v1SUPERSEDED 已停用
Approved 12 Jul, published. Kept exactly as approved — never edited, never deleted.7 月 12 日批准并发布。原样保留——不会被改,也不会被删。
↓ chilli reduced — the published v1 is not touched; a new draft opens↓ 辣椒减量——已发布的 v1 不动,开一份新草稿
v2APPROVED · PUBLISHED 现行
Approved 28 Jul. This is what the kitchen is working from now. v1 became superseded at that moment — not before.7 月 28 日批准。厨房现在照着做的就是这一版。v1 在那一刻才转为已停用——不是更早。
↓ someone is editing again↓ 又有人在改
v3DRAFT 草稿
Being worked on. Invisible to the kitchen. They stay on v2 until you approve it.还在改。厨房看不到。在你批准之前,他们一直用 v2。

Nothing is ever overwritten. Editing an approved recipe does not change it — it opens the next version. That is what makes “which version was the kitchen using on the 20th” a question with an answer.没有任何东西会被覆盖。改一份已批准的食谱不会改到它本身,而是开出下一个版本。正因为这样,「20 号那天厨房用的是哪一版」才是一个答得出来的问题。

1Sub-recipe v4 approvedYou approve a change to a shared sub-recipe.你批准了某个共用子配方的改动
2System finds usersEvery dish holding v3 is located automatically.系统自动找出所有还在用 v3 的菜
3A draft per dishEach gets a new draft showing the change.每道菜生成一份新草稿,标出改动
4You approve — or notPublished documents only swap once you say so.你点头之后,已发布文件才会更换
Rule 规则What it means 意思是
Approved documents
are pinned
A published recipe holds the exact sub-recipe versions it was approved with. Nothing inside a document the kitchen is working from changes on its own.已批准的文件固定住批准时用的那些子配方版本。厨房正在用的文件,内容绝不会自己变。
An update creates
drafts, not changes
When a sub-recipe is approved, the system finds every affected dish and opens a new draft for each, showing what changed. You approve them in one pass instead of hunting for them.子配方一批准,系统找出每一道受影响的菜,各自生成新草稿并标出改动。你一次性批准,不用自己去找。
Allergen changes
need confirmation
If an allergen appears or disappears, the affected published documents are flagged immediately and cannot be replaced until you have reviewed each one.过敏原一旦增减,受影响的已发布文件立刻挂标记,在你逐份过目前不能被替换。
Why this way为什么这样定

The system does the finding and the drafting, but nothing reaches the kitchen that a person hasn't approved. A dish can also be held back deliberately to run out an existing batch.找下游、生成草稿都由系统做,但没有任何东西会在没人批准的情况下到达厨房。某道菜也可以刻意不跟进,把现有那批用完。

03

What happens when a sub-recipe used in twelve dishes changes一个被十二道菜使用的子配方改了,会怎样

Your question, under Option B. Both cases are clickable.你的问题,在方案 B 下的结果。两个情境都可以点。你的问题,用方案 B 走一遍。下面两个情境都可以点。

Illustration only. Menu names are real; which dishes use the sub-recipe, and both scenarios, are assumed.仅为演示。菜名是真的;哪几道用到该子配方、以及两个情境,都是假设。

base genep Sub-recipe 子配方 v3 · current Shallot, garlic, galangal, kencur, turmeric, candlenut, chilli, shrimp paste · carries tree nut + crustacean
BASÈ PURE — 13 courses | 13 道
What changed 改了什么What the system does 系统怎么做
An allergenPublished documents are flagged and held. Each affected dish is reviewed individually before anything is replaced.已发布文件挂标记并暂停替换。每一道受影响的菜逐份过目。
Method or yieldA new draft per affected dish, change shown. Approve in one pass.每道受影响的菜生成新草稿,标出改动,一次性批准。
Ingredient quantitySame — drafts, with quantities recalculated where the yield moved.同样生成草稿;产出量有变的,用量自动重算。
Wording onlyDrafts too, flagged as cosmetic so they can be accepted in bulk.也生成草稿,但标为纯文字,可批量接受。
04

What the AI is allowed to doAI 被允许做什么

You asked for allergens, shelf life and a description that is 100% right. That is only reachable if the system will refuse rather than guess.你要求过敏原、保质期和操作描述 100% 正确。唯一做得到的方式,是让系统宁可拒绝,也不猜你要求过敏原、保质期和操作描述 100% 正确。做到这一点的唯一方式,是让系统宁可拒绝,也不猜——手写纸上通常没写这两样,让模型去补,它会给出一个自信、合理、偶尔是错的答案。

Worked example, not one of your sheets. I wrote this prep sheet to show what the system does and does not fill in. The base genep ingredients follow the standard Balinese preparation.这是我编的示例,不是你们的纸。写它是为了演示系统会补什么、不补什么。base genep 的配料用的是巴厘岛通行做法。

Example photo in | 示例照片 · 手写
Base genep  8/5
shallot 1kg
garlic 400
galangal 300
kencur 150
turmeric 200
kemiri 200
chili 300
terasi 2 blocks
palm sugar a bit

grind all, fry low 45min
till oil separates
Draft out | 草稿出来
Name 名称Base geneptranscribed 照抄
Ingredients 配料Shallot 1kg · garlic 400g · galangal 300g · kencur 150g · turmeric 200g · candlenut 200g · chilli 300g红葱 1kg · 蒜 400g · 高良姜 300g · 沙姜 150g · 姜黄 200g · 烛果 200g · 辣椒 300gtranscribed 照抄
Shrimp paste "2 blocks" · palm sugar "a bit"left as written 原样保留 — 需要一个数字
Method 做法1. Grind everything to a paste 2. Fry over low heat 45 min until the oil separates1. 全部磨成泥 2. 小火炒 45 分钟,至出油分离split into steps only — never adds a step that wasn't written 只拆步骤 · 绝不添加纸上没有的工序
Yield 产出量— not on the sheet · 纸上没写blocks approval 阻断批准
Shelf life 保质期— not on the sheet · 纸上没写blocks approval 阻断批准
Allergens 过敏原Tree nut (candlenut) · crustacean (shrimp paste)坚果(烛果)· 甲壳类(虾酱)— 从原料资料推导,不是从纸上读的 ← derived from ingredient records, not read off the sheetshrimp paste record not yet verified 虾酱资料尚未核实

So it cannot publish. One unverified ingredient blocks every recipe that uses it.所以它发布不了。一样未核实的原料,会卡住所有用到它的食谱。所以这份食谱发布不了。它停在草稿,直到三件事补齐:产出多少、能放几天、谁核实虾酱那笔资料。一样未核实的原料会卡住所有用到它的食谱——这让每一条过敏原信息都是有人负责的。

Trigger 触发Any single ingredient in a recipe has unverified allergen data一份食谱里,任何一样原料的过敏原资料未经核实
Blocked 阻断That recipe cannot enter review · cannot be approved · cannot publish这份食谱不能送审 · 不能批准 · 不能发布
Routed 分流The ingredient goes to a verification queue with a named owner该原料进入待核实清单,指定负责人
Released 解除Once verified, every blocked recipe unblocks automatically核实完成后,被卡住的食谱自动全部解冻
An ingredient counts as verified in one of three ways: a supplier spec sheet, the packaging, or your own word — recorded with your name and the date.
The third one matters here. A terasi or palm sugar from a small local producer often carries no allergen declaration at all, and no document is coming. Rather than leave those recipes blocked forever, one person takes responsibility and the system records who, and when.一样原料要算「已核实」,有三种方式:供应商规格书、包装上写的,或你自己说的——记下名字和日期
第三种在这里很重要。本地小作坊做的虾酱、椰糖,常常什么申报都没有,而且以后也不会有。与其让那些食谱永远卡着,不如由一个人负责,系统记下是谁、哪一天。
05

Who can see, edit and approve谁能看、谁能改、谁能批准

This is the approval routing from your second milestone. Worth agreeing who does what before the queue is built.这是你第二个里程碑提到的 approval routing(审批路由)。谁能做什么,值得在建队列之前先谈定。

Role 角色Can see 能看Can edit 能改Can approve 能批准
AdminAll recipes and versions全部食谱与版本People, categories, settings人员、分类、系统设置Manages publishing rights管理发布权限
Head chefDrafts, review queue, history, impact lists草稿、审核队列、历史、影响清单Correct or reject anything修正或退回任何内容Yes — including the effective date可以,含生效日期
Recipe editorTheir own scope and its history负责范围及其历史Create and edit drafts建立与修改草稿No
ManagerVersions in force, plus change notices现行版本与变更通知Not in this project本次不开放Acknowledge receipt only仅确认已收到
KitchenThe current approved version当前批准版NoNo
06

What it looks like in use用起来大概长这样

Indicative layout only. Sketched to show what each person deals with day to day — not a design proposal, and not what the finished screens would look like.仅为示意排版。画出来是为了说明每个人每天面对什么,不是设计方案,也不是成品的样子。

REVIEW QUEUE — 审核队列Chef 主厨
Duck jus v5 → 3 dishes ■ ALLERGEN CHANGED · HELD 过敏原变更 · 已冻结
Base genep v4 ⚠ SHELF LIFE MISSING 缺保质期
Pickling liquor v3 → 4 drafts ready ◆ UPSTREAM UPDATE · APPROVE TOGETHER 上游更新 · 可一次批准
Pork belly — from photo, 5 Aug 2 QUANTITIES UNCLEAR 2 处分量待确认
STATION CARD — 出菜口Kitchen 厨房
Pork Belly v7 · approved 5 Aug
Allergens 过敏原Tree nut · Crustacean 坚果 · 甲壳类
Yield12 portions 12 份 Shelf life3 days, chilled 冷藏 3 天 UsesBase genep v4 · Pumpkin purée v2
1 · Cure overnight, rinse, pat dry.
2 · Confit 4 h at 82 °C.
3 · Press, portion, crisp to order.
The two things worth noticing: the chef only ever sees what needs a decision, and the kitchen card carries a version stamp and the allergens at the top — so what is on the pass is always traceable to a version someone approved.两个值得注意的点:主厨只会看到需要他做决定的东西;出菜口那张卡带着版本号,过敏原放在最上面——出菜口用的是哪一版、谁批的,永远查得到。
07

Timing时间

Your two-milestone structure is right and I'd keep it. Actual duration depends on the condition of the source material — how clear and consistent the recipes are — and may run to eight weeks.你分两个里程碑的结构是对的,我会保留。实际时长取决于原始素材的状况——食谱有多清楚、多一致——有可能到八周

Milestone 里程碑Indicative 大致
Milestone 1
schema · import
· 20 recipes
Two to three weeks where the source material is legible and reasonably consistent. Where it isn't — mixed handwriting, missing quantities, inconsistent naming — this is the part that stretches, because every one of those has to be resolved by a person before the recipe means anything.两到三周,前提是原始素材清楚、格式还算一致。若不是——手写混杂、分量缺漏、命名不统一——拉长的就是这一段,因为每一处都要有人确认,食谱才有意义。
Checkpoint Unchanged from your proposal. Below 60%, we stop and improve extraction before any interface work is started.与你的提议一致。低于 60% 就停下来先改进抽取,不动任何界面。
Milestone 2
queue · versioning
· staff view · ROOTS
Four to five weeks, on the basis of a read-only staff view, one-way publishing, and approval resting with you plus one named second. Anything beyond that we would scope separately.四到五周,前提是员工端只读、单向发布、批准权限在你和一位指定的人。超出这些的部分另行界定范围。

What Milestone 1 actually isMilestone 1 具体在做什么

Locking the schema, building the import, and proving the extraction against twenty real recipes. 锁定 schema、把导入建起来,以及用二十份真实食谱验证抽取

In this milestone 这个里程碑内Deliberately not yet 刻意先不做
Schema built · import running · twenty recipes converted · an accuracy report showing, per recipe, what the extraction produced and what a person had to change schema 建成 · 导入跑通 · 二十份食谱转换完成 · 一份逐份对照的准确率报表:抽取产出了什么、人工改了什么 The review queue, the staff view, the Notion publishing — all of that belongs to Milestone 2. Keeping this milestone that narrow is what makes the checkpoint mean something: it tests the reading, not the product. 审核队列、员工端、Notion 发布,都属于 Milestone 2。把这个里程碑收得这么窄,检查点才有意义——它验的是「读得准不准」,不是「产品好不好」
Two things that would help this milestone land on time:
1 · Having the twenty recipes to hand at the start — it is the one thing that sets the pace here.
2 · If there is a choice, twenty base recipes rather than the most heavily composed dishes — so the checkpoint measures the extraction rather than the complexity of what it was pointed at. 两件事会让这个里程碑准时落地:
1 · 开始时那二十份食谱就在手上——这是决定这个里程碑节奏的关键。
2 · 如果可以选,挑二十份基底类的食谱,而不是结构最复杂的那几道菜——这样检查点量的是抽取本身,而不是被丢进去的东西有多难。

A few things I need before I can quote报价前需要向您确认的几件事

  1. What file format the recipes are in today — the most important one那些食谱目前是什么档案格式 —— 最重要的一件 Typed documents, scans or photos of handwriting, voice notes, or already structured in the master file? 打字文件、手写的扫描或照片、语音,还是已经整理进 master file 了?

    Why this decides the timeline: the build is the same either way — the reading is not. A typed document already has structure, and the system can take it almost directly. A photograph of handwriting has to be read first, and every quantity, abbreviation or unclear word the system is not certain about has to be confirmed by a person. That confirmation happens recipe by recipe and does not get faster with volume. Twenty clean documents is a couple of days of it; twenty pages of mixed handwriting is closer to two weeks. 为什么这决定了时间:不管哪种格式,开发的部分是一样的——差别在「读」。 打字文件本身就有结构,系统几乎可以直接接收。手写照片得先认出来,而凡是系统没把握的分量、简写、看不清的字,都要有人逐一确认。 这个确认是一份一份做的,不会因为量大而变快。二十份干净的文件大约两三天;二十页混杂手写就接近两周。

  2. Which ways of putting recipes in you actually want你们实际想要哪些输入方式 Besides photographs of handwritten sheets — would you want to record straight into the system while you talk, or upload voice memos already sitting on your phone? Both are possible, but they are built differently, so it helps to know which you would really use. 除了手写纸的照片之外——你希望边说边直接录进系统,还是把手机里已经录好的语音档上传?两种都能做,但做法不一样,所以想先知道你们实际会用哪一种。
  3. One clarification on the 60% checkpoint关于 60% 检查点的一点澄清 The 60% should measure one thing: did the system read the sheet correctly. A recipe can be read perfectly and still not be publishable, because publishing also needs the ingredient records verified, and that information comes from your suppliers and packaging. Concretely: at the end of week two the system might have read all twenty correctly, but twelve of them use an ingredient whose details are still being gathered, so those twelve cannot publish yet. Measured on publishing that reads as 40% and the checkpoint fails. Measured on extraction it is 100%. Same twenty recipes, same week of work. 60% 应该只量一件事:系统有没有把纸读对。一份食谱可能读得一字不差,却仍然发布不了——因为发布还需要原料记录都已核实,而那些资料要从你们的供应商和包装上来。举个具体的:第二周结束时,系统可能把 20 份全部读对了,但其中 12 份用到的原料,资料还在收集中,所以那 12 份暂时发布不了。按「能不能发布」算,是 40%,检查点没过;按「读对了没有」算,是 100%。同样的 20 份,同样一周的工作。

Once I've seen a handful of your actual recipes I can narrow the range considerably.等我看过几份你们真实的食谱,这个区间可以收窄很多。

08

Ownership所有权

A proposal, not a position.这是建议,不是立场。

What 什么Proposed 建议
Your contentYour recipes, SOPs and source materials remain yours. They may be processed by authorised AI and cloud service providers solely to build, operate and support your system. They will not be reused for other clients, disclosed outside authorised service providers, or used to train any shared or general-purpose AI model. You may export your data at any time in standard formats, whether or not we continue working together.你们的食谱、SOP 与原始素材仍归你们所有。它们可能由经授权的 AI 与云端服务商处理,且仅用于建立、运行与维护你们的系统。不会挪用到其他客户、不会披露给授权服务商以外的任何一方、也不会用于训练任何共享或通用的 AI 模型。你们随时可以标准格式导出自己的资料,无论我们是否继续合作。
The delivered versionYour restaurants may keep using the version delivered in this project, internally, long term.你们的餐厅可以长期在内部继续使用本次交付的版本
Not includedSource code, schema and the extraction pipeline are not part of the delivery.源码、schema 与抽取流程不在交付范围内。
Future workAnything built after this project — new functionality, later versions — is a separate commercial conversation.本项目之后新建的东西——新功能、后续版本——属于另一次商务讨论