schema واحد، خمسة تطبيقات: كيف بنينا أداة حكومية ومنصة AI ولعبتين بنفس اللغة
نظام تفتيش حكومي. منصة تعلم بالذكاء الاصطناعي. متتبع لياقة شخصي. لعبة استراتيجية تكتيكية. لعبة زنزانات ثلاثية الأبعاد.
خمسة تطبيقات. خمسة مجالات مختلفة تمامًا. لغة واحدة.
إليك الكيفية — ولماذا يهم ذلك.
الادعاء
تدّعي كل لغة برمجة أنها "general purpose." لكن متى كانت آخر مرة استخدمت فيها نفس الـ framework لبناء لعبة و أداة compliance حكومية؟
تعتبر الـ Orbital architecture لـ Almadar محايدة المجال بالتصميم. الـ Orbital هو: Entity + Traits + Pages. تعمل تلك الصيغة لأي مجال لأنها تُنمذج السلوك، وليس التقنية.
لنستعرض الخمسة جميعًا — وهذه المرة، سنريك كود الـ schema الفعلي.
كيف يعمل الـ Orbital Schema
قبل الغوص في التطبيقات الخمسة، إليك تعريفًا سريعًا لما ستراه في الكود. كل orbital schema هو ملف JSON بهذا الشكل:
{
"name": "app-name",
"version": "1.0.0",
"orbitals": [
{
"name": "OrbitalName",
"entity": { ... },
"traits": [ ... ],
"pages": [ ... ]
}
]
}
- Entity يحدد شكل البيانات — الحقول، الأنواع، نمط الـ persistence
- Traits تحدد السلوك — state machines بحالات، events، transitions، guards، و effects
- Pages تربط الـ traits بالـ routes — مسار URL يُفعّل trait واحد أو أكثر
الـ Effects هي الأوليات الجانبية: set يُحدّث حقلاً، render-ui يعرض مكوّنًا، persist يحفظ في قاعدة البيانات، emit يرسل events عبر الـ orbitals، navigate يغيّر الـ route، notify يعرض رسالة.
الـ Guards هي شروط بصيغة S-expression يجب أن تتحقق ليحدث الـ transition. إذا فشل الـ guard، الـ transition غير موجود.
الآن لنرَ هذا مطبّقًا عبر خمسة مجالات.
1. نظام التفتيش الحكومي — سير عمل الـ Compliance
المجال: تفتيش ميداني منظم للمنظمين الحكوميين التحدي الرئيسي: فرض workflow من 5 مراحل، guards المتطلبات القانونية، audit trails
يرشد هذا النظام، المبني للمفتشين الحكوميين، المفتش عبر مراحل المقدمة → المحتوى → التحضير → السجل → الإغلاق. تُفرض المتطلبات القانونية بالـ guards — لا يمكنك التقدم دون إكمال الحقول الإلزامية.
الـ Entity
الـ Inspection entity يلتقط كل ما يحتاجه المفتش في الميدان:
{
"entity": {
"name": "Inspection",
"persistence": "persistent",
"collection": "inspections",
"fields": [
{ "name": "id", "type": "string", "required": true },
{ "name": "inspectorId", "type": "string", "required": true },
{ "name": "companyId", "type": "string", "required": true },
{ "name": "legalBasis", "type": "string" },
{ "name": "findings", "type": "array", "items": { "type": "object" } },
{ "name": "measures", "type": "array", "items": { "type": "object" } },
{ "name": "inspectorSignature", "type": "boolean", "default": false },
{ "name": "subjectSignature", "type": "boolean", "default": false },
{ "name": "createdAt", "type": "timestamp" },
{ "name": "status", "type": "enum", "values": ["draft", "in_progress", "completed", "archived"] }
]
}
}
الـ Traits
الـ workflow ذو المراحل الخمس هو الـ trait الأساسي. كل transition للمرحلة التالية له guards تفرض المتطلبات القانونية:
{
"name": "InspectionWorkflow",
"linkedEntity": "Inspection",
"stateMachine": {
"states": [
{ "name": "Introduction", "isInitial": true },
{ "name": "Content" },
{ "name": "Preparation" },
{ "name": "Record" },
{ "name": "Closing", "isTerminal": true }
],
"events": [
{ "key": "PROCEED", "name": "Proceed to Next Phase" },
{ "key": "SAVE_FINDINGS", "name": "Save Findings", "payload": [
{ "name": "findings", "type": "array", "required": true }
]},
{ "key": "SIGN", "name": "Sign Document" },
{ "key": "CLOSE", "name": "Close Inspection" }
],
"transitions": [
{
"from": "Introduction",
"event": "PROCEED",
"to": "Content",
"guard": ["not-empty", "@entity.legalBasis"],
"effects": [
["persist", "update", "Inspection", "@entity"],
["render-ui", "main", {
"type": "form",
"entity": "Inspection",
"fields": [
{ "name": "findings", "label": "Findings", "type": "textarea", "required": true }
]
}]
]
},
{ "from": "Content", "event": "PROCEED", "to": "Preparation" },
{
"from": "Preparation",
"event": "SAVE_FINDINGS",
"to": "Record",
"effects": [
["set", "@entity.findings", "@payload.findings"],
["persist", "update", "Inspection", "@entity"]
]
},
{
"from": "Record",
"event": "CLOSE",
"to": "Closing",
"guard": ["and",
["not-empty", "@entity.legalBasis"],
["not-empty", "@entity.findings"],
["not-empty", "@entity.measures"],
["=", "@entity.inspectorSignature", true],
["=", "@entity.subjectSignature", true]
],
"effects": [
["set", "@entity.status", "completed"],
["persist", "update", "Inspection", "@entity"],
["notify", "success", "Inspection closed successfully"]
]
}
]
}
}
guard الإغلاق هو الجزء الأكثر أهمية: خمسة شروط يجب أن تتحقق جميعها. الأساس القانوني يجب أن يك ون مملوءًا. النتائج يجب أن تكون موجودة. الإجراءات يجب أن تكون محددة. كل من المفتش والخاضع للتفتيش يجب أن يكونا قد وقّعا. إذا غاب أي واحد، الـ CLOSE event ببساطة لا يُطلق. لا يوجد زر "تخطي"، لا يوجد override — الـ state machine لا تملك أي transition.
كل persist effect يُولّد audit trail تلقائيًا. التفتيش ينتقل عبر الحالات، وكل transition يُسجَّل بالـ timestamp والمستخدم والـ payload. الـ audit trail ليس ميزة — إنه نتيجة للـ architecture.
الـ Pages
"pages": [
{
"name": "InspectionFormPage",
"path": "/inspection/:id",
"traits": [
{ "ref": "InspectionWorkflow", "linkedEntity": "Inspection" }
]
},
{
"name": "InspectionListPage",
"path": "/inspections",
"traits": [
{ "ref": "InspectionBrowser", "linkedEntity": "Inspection" }
]
}
]
صفحة النموذج تستخدم trait واحد يعرض forms مختلفة لكل مرحلة عبر render-ui. الـ route /inspection/:id يحمّل التفتيش المحدد ويعرض أي مرحلة يمر بها حاليًا.