أَثل منصّة سحابية متعدّدة المستأجرين لتشغيل المقاهي والمطاعم: نقطة بيعٍ تعمل دون اتصال، ومحطّات تحضير، ومخزون، وولاء، وفوترة زاتكا، وواجهة API مفتوحة. وهذه الصفحة ليست عرضاً للمنتج — بل لطريقة بنائه.
أكثر ما بُني في أَثل لم يأتِ من مواصفةٍ تقنية، بل من سنةٍ وأربعة أشهر خلف الطاولة نفسها.
انتهى عملي مديرَ فروعٍ في أبريل ٢٠٢٦. وأوّل كوميت في أَثل كان في ٢١ مايو ٢٠٢٦. الشهر الذي بينهما هو شهر التصميم — وما بُني بعده منصّةٌ متعدّدة الفروع كتبها من كان يشغّل عدّة فروع قبل أسابيع.
وفوق ذلك، لم يُكتفَ بالتجربة الشخصية:
الفرق يظهر في الشيفرة نفسها. حين اكتُشف لاحقاً أن شاشة الكاشير تُفرَّغ صامتةً بعد إرسال الطلب للمطبخ، لم يكن العطب تقنيّاً — الطلب أُرسل بنجاح والقاعدة سليمة. العطب أن الصمت كان يُقرأ «تمّت المحاسبة» بينما لم يُقبض شيء. حلُّه سطرٌ يقول الحقيقة: «أُرسل الطلب — لم يُحاسَب بعد».
عطبٌ كهذا لا يظهر في اختبار. يظهر لمن وقف خلف الكاشير ورأى كيف يقرأ الشاشة.
المنحنى الشهريّ ليس نمواً مطّرداً. فيه لحظةٌ تبدّل فيها طبع المشروع كلّه.
وفي الوسط تقع نقطة التحوّل: خطّ التكامل verify.yml وُلد في ٢٢ يوليو، وأول طلب دمجٍ حقيقيّ في ٣١ يوليو — وهو نفسه أكثف يومٍ في تاريخ المستودع (١٠٩ كوميتات). ومن أول أغسطس صار الدمج بالسحق حصراً: ٣١٠ طلباً في شهر واحد.
الخلاصة التي تلخّص المشروع: الانضباط لم يسبق الفوضى — وُلد منها.
عشرة سكربتات وظيفتها الوحيدة منع خطأ يعرف المشروع أنه يقع — لأن كلّ واحدٍ منها كُتب بعد أن وقع ذلك الخطأ فعلاً وبلغ الفرع الرئيس.
check-migration-orderفرعٌ قديم يُنزل رقم هجرةٍ مكرَّراً — بلا تعارضٍ يُنبّه، لأن الاصطدام على الرقم لا الاسمcheck-service-only-callersنداءٌ من المتصفّح لما يجب أن يبقى خادميّاًcheck-db-types-no-lossأنواعٌ مولَّدة تنحرف صامتةً عن سكيما القاعدةcheck-shell-utf8-varsمتغيّرٌ عارٍ يكسر النصّ العربي في سكربتات التشغيلcheck-shared-db-driftقياسٌ يُؤخذ على قاعدةٍ انحرفت — فيُنسب عطبُ البيئة إلى الشيفرةcheck-security-scanner-blockingفاحصٌ أمنيّ يمرّ في خطّ التكامل بلا أن يحجب شيئاًcheck-workflow-runnerوظيفة تكاملٍ بلا عدّاءٍ يلتقطها — فتبدو ناجحةً وهي لم تعملوأربعةٌ منها لها اختبارها الخاص — حارسٌ للحارس، لأن حارساً أعمى أسوأ من غيابه: يمنح طمأنينةً بلا حماية.
كل قرارٍ معماريٍّ في أَثل مسجَّلٌ بحكمه وبالقياس الذي برّره — و١٢٨ منها نقضها قرارٌ لاحق ولم تُمحَ. هذه ثلاثة منها.
قرارٌ سابق حدّد موضع قفلٍ في مسار المال بناءً على تحليلٍ سليمٍ لدورةٍ واحدة. فأُعيد القياس باتّصالين متزامنين على قاعدةٍ معزولة، فظهر deadlock detected من أول محاولة — فسقط القرار السابق وحلّ محلّه علاجٌ أصغر: ترقية قراءةٍ قائمة بدل إضافة قفلٍ ثالث.
دفترُ كلفةٍ يحمل صفوفاً كُتبت بسعرٍ قديم. والحكم كان ألّا تُصحَّح رجعيّاً، بسببٍ مكتوب: «لم أقس عدد الصفوف المصابة ولا أستطيع — وكتابة تحديثٍ على دفترٍ ماليٍّ بحجمٍ مجهول أخطر من الضرر الذي تعالجه».
جلسةٌ نفّذت خطوةً قبل أن تتحقّق من شرطها. الأثر كان صفراً، لكن الترتيب كان خطأً — فسُجّل: «يُسجَّل كي لا يُقرأ صمتُ السجلّ موافقةً».
أيّ مشروعٍ يستطيع أن يعرض عدد اختباراته. أمّا سجلٌّ يوثّق لماذا لم يُبنَ شيء — وقد تكرّر ذلك عشرات المرات — فهو ما يجعل النظام قابلاً للبناء عليه بعد سنة.
ما دخل الفرع الرئيس بين ١ و١٣ سبتمبر — ٦٤ طلب دمج. كلُّ بندٍ هنا مدموجٌ في الشيفرة، لا مخطَّط — ولم يشتغل منه شيءٌ بعد على مقهىً حقيقيّ.
API · MCPمفاتيح لكل منشأة، وقرّاء /api/v1، وطابور ويبهوك، وخادم MCP فوقها — فيقرأ وكيلُ ذكاءٍ بيانات المقهى بمفتاح صاحبه لا بمفتاح المنصّةprep stationsمحطّات تحضيرٍ يعرّفها كلُّ مقهى ويفعّلها لكل فرع، بلوحٍ لكل محطّة — وترفض المنصّة إطفاءَ محطّةٍ عليها شاشاتٌ حيّةtemplatesقوالبُ تشغيلٍ جاهزة (أربعٌ للبداية): تُعايَن قبل التطبيق، وتُطبَّق بنداً بنداً لا دفعةً واحدةdelivery channelsوسمُ قناة التوصيل على الطلب — بسعرها وتسويتها وتقريرها — من نقطة البيع حتى المطبخ والماليةcurbsideالاستلام من السيارة (لوحة · لون · نوع) للطلب الإلكتروني، وزرُّ «وصلت» للزبونrefund linesالاسترجاع على مستوى السطر، يعكس معه النقاط والأختام على السطر نفسهtenant lifecycleكاتبٌ واحدٌ لحالة المنشأة، وإيقافٌ بمهلة لا يقطع ورديةً مفتوحة في منتصفهاdeployالهجراتُ تُرفع آلياً عند الدمج بعد نسخةٍ احتياطيّةٍ طازجةٍ إلزاميّة، والشيفرةُ لا تُنشر قبل هجرتهامنذ آخر تحديثٍ لهذه الصفحة (١٣ سبتمبر) — ٤٤ طلب دمج جديد. كلُّ بندٍ هنا مدموجٌ في الشيفرة، لا مخطَّط. ولا حركة إنتاج حقيقية بعد، إلا اختباراً ميدانياً واحداً لشاشة المخزون في ١٩ سبتمبر.
fraud controlsشاشة «الرقابة» لصاحب المنشأة، وأربعة كواشف تعمل عند إقفال الوردية، وموافقةٌ ثانية على الاسترجاع، وكلمة مرورٍ للتوقيع على إجراءات الضبطMoyasarاتصال مدفوعات مستقلّ لكل مقهى، لا مفتاحاً واحداً للمنصّة كلّهاself-serve signupتسجيلٌ ذاتيّ من athl.cloud/register بفحص السجل التجاري، تعتمده المنصّة يدوياً لكل منشأةinventory entryشاشة إضافة صنفٍ وتنبيهات نفاد المخزون — أوّل تشغيلٍ فعليّ لها كان في ١٩ سبتمبر، في اختبارٍ ميدانيّZATCA phase 1–2سلسلة التوقيع المباشر مبنيّة؛ تسجيل كل مقهى لدى زاتكا (المرحلة التالية) قيد البناء — لا فاتورة زاتكا موقّعة صدرت من أَثل حتى الآنoffline boardsلوحات طلباتٍ للقراءة فقط، تعمل دون اتصال بالإنترنتdata importأساسٌ لاستيراد البيانات من أنظمةٍ سابقة — أساسٌ فقط، لا مسارُ ترحيلٍ كاملFrankfurtالخوادم انتقلت لفرانكفورت قرب القاعدة، وتُبقى دافئةً بدالّةٍ مجدولة — البطء الأول كان بردَ البداية، لا ضعف النظامكل رقمٍ هنا مأخوذ من المستودع بأمرٍ يمكن إعادة تشغيله.
124 daysأوّل كوميت ٢١ مايو ٢٠٢٦ إلى ٢٢ سبتمبر — النشاط في ٦٩ يوم عمل، بمعدّل ١٩ كوميتاً في اليوم النشط (١٬٢٨٥ كوميتاً إجمالاً). ويسبقها شهرٌ من التصميم قبل أن يُكتب سطرٌ واحد105 tables · 355 RPCsكما تظهر في الأنواع المولَّدة من القاعدة — وكلُّ كتابةٍ تمرّ بدالّةٍ مختومة، لا بكتابةٍ مباشرة من العميل474 error codesلكلّ حالة فشلٍ رمزٌ ورسالةٌ عربيّة — لا «حدث خطأ ما» — كلُّها في كتالوجٍ واحدٍ داخل القاعدة786 test files٥٢٨ بـvitest (٦٬٢٤٢ اختباراً ناجحاً، ٤ متخطّاة) و٢٥٨ بـpgTAP داخل القاعدة — نحو ١١٬١٠٠ توكيدٍ مجموعاً72,869 linesاختبارات SQL وحدها — أي ٧٠٪ من حجم الهجرات نفسها19 race proofsبراهين سباقٍ باتّصالين حقيقيين على قاعدةٍ معزولة — لا اختبار قاعدةٍ واحدة8 edge fnsمكتوبة، وواحدةٌ فقط منشورةٌ في الإنتاجهذا القسم موجودٌ عمداً. سجلٌّ بلا حدودٍ معلَنة دعايةٌ لا سجلّ.