تنسيق وصفات Cookwala: وصفات تعمل مع Missions
الوصفة في Cookwala ليست مجرد قائمة من التعليمات. إنها معرفة طهي محمولة يقوم المخطط بتجميعها بناءً على مهمة محددة (household، الروبوتات، الأجهزة، الطاقة، الميزانية، الصحة، التوقيت) لتصبح خطة قابلة للتنفيذ. ثم يقوم الروبوت بتشغيل تلك الخطة، مع التكيف من خلال الطوارئ وplaybooks عندما يتغير الواقع.
المخطط: [recipe.schema.json](../schemas/recipe.schema.json). مثال كامل مشروح: [examples/shakshuka.cookwala.json](../examples/shakshuka.cookwala.json).
1. أربع طبقات (مقتبسة من نهج WHO SMART Guidelines) #
| الطبقة | ما تحتويه | من يكتبها | أين توجد |
|---|---|---|---|
| R1 Narrative | نص الوصفة البشري، القصة، الملاحظات الثقافية، الصور | الطهاة، الشيفات، fifi.cooking | text, dish.images |
| R2 Dish spec | ما هو وما يجب أن يكون عليه الطبق: الهوية (أساسية مقابل مرنة)، الأهداف الحسية، التغذية، أسلوب التقديم والأكل، التخزين، فحوصات القبول | محررو الوصفات، بمساعدة الذكاء الاصطناعي، تمت مراجعتها | identity, sensory, service, storage, nutrition, acceptance |
| R3 Executable IR | طريقة مستقلة عن الجهاز: الصيغة (النسب + الأدوار)، مخطط العملية للعمليات المحددة بنوع مع شروط ما قبل/ما بعد حالة الطعام، شروط until، البدائل، قواعد التوقف المؤقت، أنماط الفشل، الإمكانيات، المخاطر، نقاط التحكم الحرجة (CCPs)، تجهيز البيئة | خط تصدير البيانات + المراجعة؛ تم التحقق منها بواسطة المحاكي (V2) | formula, ingredients, equipment, prep, process, safety |
| R4 Bound plan | وصفة R3 المجمعة لهذه الـ Mission: الكميات الدقيقة، المتغيرات المختارة، الجهات والأجهزة المعينة، الجدول الزمني، عقود الإيجار، المراقبون، خطط الطوارئ | المخطط/المجمع، عند وقت التشغيل | داخل الـ Mission (plan)، وليس في الكتالوج أبداً |
مثل الكود المصدري والمترجم (compiler): الوصفة هي تمثيل وسيط قابل للنقل (R3 + R2). والمهمة هي الآلة المستهدفة. هذا ما يحافظ على صلاحية الوصفات مع تغير الروبوتات والذكاء الاصطناعي: المخطط الأفضل ينتج R4 أفضل من نفس الوصفة.
2. ماذا يفعل كل قسم في المهمة (Mission) #
| قسم الوصفة | تستخدمه المهمة من أجل... |
|---|---|
identity.essential / flexible / neverAdd | البدائل، أوضاع الميزانية والحصص، تكييف النظام الغذائي: تغيير الأجزاء الـ flexible، وعدم تغيير الـ essentials أبداً، لتبقى الوجبة هي نفسها |
formula (ratios, min/max, role, scaling) | التوسيع الدقيق لأي عدد من الأشخاص، تقنين المكونات على مدار أسبوع، تمديد الميزانية، استهلاك ما هو متاح (إعادة التوسيع بناءً على المكون المحدود) |
sensory | نقاط فحص الرؤية والرائحة والطعم؛ ملفات تعريف الطعم في الـ household context (ملح 2 مقابل 4)؛ قرارات إعادة الاستخدام والإصلاح |
prep (tools, surfaces, clearFirst, advanceTasks) | مهام تحضير البيئة: إذا كان الحوض أو الموقد مشغولاً، يضيف المخطط مهام "تنظيف، غسل، تجفيف"؛ يتم جدولة مهام النقع أو الإذابة قبل ساعات |
process.nodes[] مع حالات الطعام pre/post | التخطيط (البدء فقط بما هو جاهز)، التحقق (هل أنتجت الخطوة الحالة المطلوبة؟)، الاستئناف بعد الانقطاعات |
until, onTimeout, retry | معرفة متى تنتهي الخطوة وماذا تفعل عندما لا تنتهي |
alternatives[] + energy | الغاز مقابل الحث مقابل الفرن، موفر البطارية، المطابخ التي لا تحتوي على فرن، ساعات الهدوء |
pause (pausable, safeState, maxPause, onExceeded) | الانقطاعات: طفل يحتاج مساعدة، المالك يتصل، الكلب يوقع شيئاً ما. يضع الروبوت الخطوة في الـ safeState الخاص بها، ويتعامل مع الحدث، ثم يستأنف، أو يعيد التسخين، أو ينقذ أو يتخلص من الطعام بناءً على ميزانية الـ pause |
failureModes (incident, detect, prevent, playbook) | الكشف المبكر عن المشكلات المعروفة والـ playbook الدقيق للتعافي |
affordances, space | مطابقة الخطوات للروبوتات التي يمكنها القبض والرفع والوصول؛ إبقاء المناطق الساخنة بعيداً عن الأطفال |
safety (hazards, CCPs, supervision, abort) | نواة السلامة: الثوابت التي يجب أن يحافظ عليها كل مخطط |
service (temps, vessel, accompaniments, tableware, eating style, portioning, packable) | التقديم: ما يوضع على الطاولة، أو في الغرفة، أو في صندوق الغداء؛ التذكيرات وحدود الانتظار؛ أسلوب الأكل الثقافي |
storage | البقايا، مهام الطهي المسبق وصندوق الغداء |
acceptance | اختبارات الوصفة: تنتهي المهمة عندما تتحقق هذه الاختبارات |
nutrition, cost | الحصص الشخصية، الميزانية، حصص الإغاثة |
3. مثال: خطوة واحدة مع كل المرفقات #
{
"id": "n7", "op": "cw.op.simmer",
"inputs": ["aromatic_base", "tomato", "salt", "blackpepper"], "output": "sauce",
"params": { "heat": "medium_low", "lid": "off", "target": { "sensor": "cw.sense.liquid_temp", "value": 94, "unit": "degC", "tolerance": 3 } },
"until": { "any": [ { "sensor": "cw.sense.mass_loss_ratio", "gte": 0.25 }, { "vision": "cw.sense.sauce_coats_spoon" } ],
"minTime": "PT10M", "maxTime": "PT18M" },
"onTimeout": "extend",
"pause": { "pausable": true, "safeState": ["heat_hold_low", "lid_ajar"], "maxPause": "PT45M", "onExceeded": "reheat_then_resume" },
"failureModes": [
{ "incident": "cw.incident.too_salty", "likelihood": "low", "playbook": "cw.pb.too_salty_liquid" },
{ "incident": "cw.incident.too_thin", "likelihood": "medium", "playbook": "cw.pb.sauce_too_thin" } ],
"alternatives": [ { "id": "gas", "op": "cw.op.simmer", "when": ["gas_only"], "timeFactor": 1.0, "quality": "same" } ],
"hazards": ["hz_splatter", "hz_steam"], "attention": "monitor"
}4. تجميع وصفة لمهمة (ما يفعله المخطط) #
- اختر المتغير: النظام الغذائي، القوام (IDDSI)، المعدات، الطاقة، ونمط الاختيار من
alternatives. يجب أن تظل العناصر الأساسية للهوية قائمة. - المقياس: من
formulaوالحصص، الحصص لكل شخص (HEALTH.md)، المكون المحدِد، أو أفق الحصة. التوابل بشكل دون خطي، والوقت حسب أس exponent الكتلة. - الاستبدال ضمن الأدوار، مع احترام
identity.neverAddوالمواد المسببة للحساسية، والحزم الغذائية والمخزون. - تجهيز البيئة: قارن
prepمع جوانب مساحة المهمة (هل الحوض ممتلئ؟ هل الموقد مشغول؟ هل اللوح متسخ؟) وأضف مهام الترتيب، الغسيل، التجفيف، والتحضير. جدولةadvanceTasks(النقع، الإذابة، التتبيل، التسخين المسبق). - الربط: تعيين كل عقدة للروبوتات، أو الأجهزة، أو البشر بناءً على الإمكانيات والقدرات. استئجار المواقد، الأوعية، والمناطق. إرفاق أجهزة المراقبة (القدر الذكي، وقت الوصول المتوقع للتوصيل، كاشف الدخان).
- الجدولة عكسياً من وقت التقديم، مع احترام ميزانيات التوقف، وحدود البطارية والطاقة، ساعات الهدوء في household context، ونوافذ مشاركة المطبخ.
- إرفاق الطوارئ:
failureModesوقواعدpauseلكل عقدة، بالإضافة إلى سياسات المهمة العالمية (الانقطاعات، وجود طفل أو حيوان أليف بالقرب من الموقد، مراقب الموقد، مراقب التلف). - التحقق: فحص المخطط (schema) + الفحص الدلالي، حزم السياسات، تغطية CCP، dry run للمحاكي، ثوابت مكدس الأولويات (PROTOCOL §7.2).
- إصدار R4 في
planالمهمة، وتوقيعه، وتسليمه للروبوت.
5. التأليف والتحويل #
- من fifi.cooking: يقوم مسار EXPORT-FIFI بإنشاء R1 + R2 + R3. الأقسام الجديدة (identity, sensory, formula, prep, service, pause, failureModes, affordances) يتم إنشاؤها بواسطة نماذج محلية من النص الحالي ويتم التحقق منها بواسطة أدوات التحقق (validators) ومراجعة بشرية مختارة.
- من الويب:
cookwala convert --from schema-org← R1/R2 (V0)، ثم نفس عملية الإثراء. - إلى تنسيقات أخرى: schema.org Recipe (R1/R2 لمحركات البحث)، Cooklang (تعديل بشري)، PDDL أو المنطق الزمني (مخططو الأبحاث) يمكن جميعها أن تُنشأ من R3.
- يدوياً: يقوم
cookwala init recipeببناء جميع الطبقات؛ ويقومcookwala validateوcookwala simulateبالتحقق منها. - الإصدارات: المراجعات غير قابلة للتغيير ومُشفرة (hashed). تسجل الفروع (Forks) قيمة
meta.derivedFrom. يتم اقتراح patches الوصفة (من أدلة العمل أو الملاحظات) كفروقات (diffs) ولا يتم ترقيتها إلا بعد المراجعة والأدلة.
6. لغة نص الخطوة #
تُكتب جمل الخطوات لشخص أولاً ويتم تحليلها بواسطة آلة ثانياً. يستخدم نص الخطوات باللغة العربية في وصفات الأمثلة صيغة الأمر للمؤنث (قطّعي، سخّني)، وهو العرف الشائع في كتب الطبخ المصرية؛ وهو اختيار متعمد وليس سهواً، وقد يستخدم الناشر صيغة المبني للمجهول المحايدة جنسياً (تُقطَّع البصلة) بدلاً من ذلك. تحمل حقول op و params و until المعنى؛ أما الجملة فهي للطاهي.
7. لماذا يظل هذا مواكباً للمستقبل #
- تصف الوصفات نتائج وقيود الطعام، وليس الحركات. الروبوتات الجديدة والذكاء الاصطناعي الجديد ينتجان خطط R4 أفضل من نفس R3.
- جميع الأقسام الجديدة اختيارية وإضافية. وصفة V0 (R1 فقط) لا تزال تعمل للطهي البشري الموجه؛ كل طبقة مضافة تفتح المزيد من الأتمتة.
- الحقول غير المعروفة
x-تمر كما هي. يمكن للموردين والطهاة والهيئات الصحية توسيع الوصفات دون كسر أي شيء. - تسمح فحوصات القبول لأي منفذ، بشري أو روبوت، بإثبات أن الطبق خرج بشكل صحيح، وهي الطريقة التي ترتقي بها الوصفات إلى V3 مع أدلة ميدانية.