Lingo Vitamins — كل ما تحتاجه لتشغيل التطبيق وتنفيذه
تطبيق ويب عربي (RTL) يبني تصنيفًا لغويًّا مرجعيًّا واحدًا فوقه عناصرك — كلمات وعبارات بلغات
عدّة — ثم يولّد جملًا من أنماط رقمية تبنيها من تسلسل عُقد التصنيف، مثل 1 + 2 + 3.
يعمل كاملًا داخل المتصفّح: بلا خادم، وبلا قاعدة بيانات، وبلا تسجيل دخول.
ابدأ في ثلاث خطوات
cd client && npm install
npm run dev
يفتح الخادم على http://localhost:5173 — ثم ابدأ من تبويب Master Tree.
قاعدة الأمان الوحيدة
التخزين في هذا المتصفّح وحده. محو بيانات المتصفّح = فقدان العمل إن لم تكن صدّرت نسخة. التصدير إلى ملفّ خارجي شرط عمل لا خيار ثانوي — صدّر بعد كلّ جلسة عمل حقيقية.
ما هو التطبيق، ولماذا بُني بهذا الشكل
الفكرة المركزية: لا تُخزَّن الجمل جاهزة. تُخزَّن البنية (تصنيف هرميّ)، والمفردات (عناصرك مربوطة بالعُقد)، وقواعد التركيب (أنماط رقمية). والجملة تُولَّد عند الطلب بتنفيذ النمط على العناصر. فتصحيح بنية واحدة يصحّح آلاف الجمل دفعةً واحدة.
1 … 12 ومعرّفات ثابتة، وشجرة واحدة فارغة. بلا فروع وبلا عناصر وبلا أنماط. تُبنى عند أوّل تشغيل أو بعد تصفير متعمَّد فقط.sem، وعضوياتها في العُقد، وإعلانات اللغات. لا تُفقد بترقية ولا باستيراد؛ ولا يمسّها شيء قبل أخذ نسخة احتياطية.1 + 2 + 3 يشير إلى عُقد التصنيف بترتيبها، فتُملأ كل خانة من عناصر العُقدة وقيدها. تغيير النمط يغيّر كل الجمل المولَّدة منه فورًا.تصنيف واحد لا يتكرّر
التصنيف المرجعي مشترك ومكتوب مرّة واحدة. العناصر تُربط بالعُقد ولا تنسخ بنيتها، والهوية ثابتة لكل عقدة عبر أجهزة مختلفة.
مراجعة قابلة للقياس
لكل وظيفة فحص آليّ يعمل من الطرفية ويطبع سطر نتيجة صريحًا مع رمز خروج مطابق. الحكم بالتشغيل لا بالانطباع.
JSON هو المرجع
تصدير الحالة الكاملة يعيد إنتاج كل شيء: العُقد والعناصر والأنماط واللغات والأكواد المقيَّدة. ونسخة JSON هي وسيلة نقل العمل بين الأجهزة.
ما ليس فيه: لا خادم ولا قاعدة بيانات ولا حسابات ولا مزامنة سحابية، ولا تحقّق نحويّ أو دلاليّ بعد التوليد — التوليد يتبع النمط حرفيًّا، وصحّة الترتيب مسؤولية من بنى النمط.
من الصفر إلى تطبيق يعمل
المشروع كامل في مجلّد client/. لا تحتاج خادمًا ولا قاعدة بيانات — فقط Node.js ثم أمران.
| المتطلَّب | الحدّ الأدنى | ملاحظة |
|---|---|---|
| Node.js | 18 أو أحدث | مطلوب لتشغيل Vite وأدوات الفحص |
| npm | مرفق مع Node | يُثبِّت التبعيات مرّة واحدة |
| متصفّح حديث | Chrome / Edge / Firefox / Safari | يحتاج localStorage وWeb Speech API للنطق |
| محرّر نصوص | أيّ محرّر | للتعديل على الشيفرة إن أردت |
الأوامر
cd client
npm install # مرّة واحدة فقط (Node.js 18+)
npm run dev # خادم تطوير على http://localhost:5173
npm run build # حزمة الإنتاج في dist/
npm run preview # معاينة الحزمة المبنية محلّيًّا
npm run smoke # يرسم كل اللوحات بـReact ويفشل إن رمى أيّها استثناءً
البناء يهيّئ النشر بنفسه: أمر build يكتب dist/.igonre تلقائيًّا. انشر مجلّد dist كاملًا — index.html مع assets/ — ولا تنشر index.html وحده ولا مجلّد المصدر client/، وإلا ظهرت صفحة بيضاء.
ما بعد التشغيل: أوّل خمس دقائق
افتح Master Tree
ستجد الجذور الاثني عشر وحدها بلا فروع. هذا مقصود: البذرة لا تُنزل بنية جاهزة.
أنشئ شجرة
من لوحة الشجر والعناصر؛ البذرة تُنشئ TREE A فارغة تلقائيًّا.
ابنِ فرعًا واحدًا
جرّب NOUNS › PEOPLE › PROFESSIONS وأضف عنصرًا واحدًا بدوره ووحدته.
ابنِ نمطًا وولّد
نمط من خطوة واحدة ثم انتقل إلى تبويب «توليد من الشجرة» لترى الناتج.
تسع خطوات مرتّبة — لا تقفز بينها
الترتيب مقصود: كل خطوة تستهلك مخرج ما قبلها. القفز إلى الأنماط قبل بناء العُقد والعناصر يعطي نمطًا بلا معنى.
- ١
ابنِ الفروع تحت الجذور الاثني عشر
عبر لوحة التصنيف. البنية هرميّة بعمق غير محدود، ولكل عقدة كود ثابت يُشتقّ من مسارها مرّة واحدة ثم لا يتغيّر بعدها أبدًا.
الأثر: عُقد بأكواد ثابتة وهوية سفر بين الأجهزة - ٢
راجع أكواد العُقد
الكود هو العنوان الثابت الذي تشير إليه الأنماط والملفّات المصدَّرة. راجعه قبل بناء أي شيء يعتمد عليه — تعديله لاحقًا مكلف.
المخرج: شجرة بأكواد موثوقة مثل 1.1.1 - ٣
أنشئ شجرة
الشجرة وعاء يحتوي مجموعة العُقد التي تعمل عليها في جلسة أو مجال. يمكن أن يكون لديك أكثر من شجرة فوق نفس الجذور.
- ٤
أضِف العناصر
لكل عنصر: نصّ بلغته الأساس أوّلاً، ثم الدور (مثل
مفتاح الدلالة هو ما يربط عنصرًا بعنصر عبر اللغات بلا اعتماد على النصّVERB·PREP)، ونوعه كلمة أو عبارة، ثم مقابلاته في اللغات الأخرى، ومفتاح الدلالةsemعند الحاجة. - ٥
اربط العضويات
العضوية هي علاقة «هذا العنصر ينتمي إلى هذه العقدة». عنصر واحد قد ينتمي إلى عدّة عُقد، وهذا مشروع ومقصود.
- ٦
ابنِ نمطًا رقميًّا
النمط تسلسل خطوات، كل خطوة تشير إلى عقدة وعمق: هل تأخذ عناصر العقدة وحدها أم عناصرها وكل ما تحتها. أضف النمط واختبره على مجموعة صغيرة أوّلًا.
مثال: 1 + 2 + 3 = فاعل + فعل + وجهة - ٧
أعلِن اللغات
حدّد اللغات التي يكتب فيها العناصر، وأيّها أساسية (تُعرَض دائمًا) وأيّها ثانوية (تُعرَض كترجمة مختصرة بجانب النصّ). الصيغة النصّية للّغة هي
arأوfrأوpt-BR. - ٨
ولّد من التصنيف
من تبويب «توليد من الشجرة»: اختر الشجرة، وقيّد النطاق على باب إن أردت، ثم ركّب الجملة. النطاق يقلّص المجمّع قبل التوليد، فيتغيّر حجم الفضاء المتوقّع فورًا.
- ٩
صدّر نسخة JSON كاملة
الخطوة التي لا تُترك للنهاية. النسخة الكاملة وحدها تعيد بناء تصنيفك وعناصرك وأنماطك على جهاز آخر.
عُد إليها بعد كل جلسة عمل حقيقية
خريطة الشيفرة: أين تبحث عن ماذا
القاعدة: المنطق في taxonomy/ والواجهة في components/. هذا الفصل هو ما يجعل الفحوص ممكنة بلا متصفّح.
| المسار | المحتوى |
|---|---|
| client/src/App.jsx | التبويبات الأربعة وتبديلها، وشريط التنبيهات، وتحميل أحدث حالة محفوظة |
| client/src/taxonomy/model.js | المنطق: العُقد، الأكواد، العناصر، الوحدات، الأنماط، وحماية إعادة البذرة |
| client/src/taxonomy/io.js | تصدير واستيراد JSON · TXT · CSV · TSV · MD، وكشف الصيغة تلقائيًّا، وتقارير الاستيراد |
| client/src/taxonomy/storage.js | الحفظ في المتصفّح، والترقيات الإضافية فقط، وتنقية بقايا جلسات التحقّق |
| client/src/taxonomy/backup.js | حلقة النسخ الاحتياطية في المتصفّح (٨ نسخ · ٣ ميغابايت · تهذيب ٤٥ ثانية) |
| client/src/taxonomy/reset.js | الإصفار والاستعادة بالترتيب المحمي: نسخة ← تحقّق ← تنفيذ |
| client/src/taxonomy/reading.js | طبقة القراءة الدلالية: مفاتيح الربط sem ودور PREP-SET |
| client/src/taxonomy/seed.js | البذرة: ROOT_SEED (١٢ جذرًا) · rootId · SEED_REV |
| client/src/taxonomy/components/ | لوحات الواجهة: التصنيف · الشجر والعناصر · الأنماط · اللغات · متقدّم |
| client/src/scoped/ | تبويب «توليد من الشجرة» ونطاقه — ومنه genscope.js لقائمة الأبواب والمجمّع |
| client/src/proto/ | تبويبا البروفة: ProtoPanel وV5Panel ومنطقهما (proto.js · v3.js · v5.js · data.js) — حالات في الذاكرة لا تُحفظ ولا تمسّ تصنيفك |
| client/src/shell/ | الهيكل العام: shell.css · taxonomy.css (وهما المستورَدان في main.jsx) + ui.jsx · toaster.jsx · confirm.jsx |
| client/src/sentences/speech.js | النطق عبر محرّك المتصفّح — الملفّ الوحيد المستعمل من مجلّد الجمل القديم |
| tools/ | أدوات الفحص والقياس: ١٨ سكربتًا (acceptance-* · check-* · render-smoke · probe-compat-mainpath · check-go · port-main-tree · structure-extra) + ٩ سكربتات tmp-* + أداتا .py لتحويل CSS |
| tools/archive/ | port-main-tree.mjs + probes/ (٨ سكربتات قياس) — وما ليس في المسار الفعّال مُفصَّل في tools/archive/README.md |
حالة الشيفرة الميتة — مقيسة الآن لا منقولة: مدخل التطبيق client/src/main.jsx يستورد أربعة أشياء فقط: App.jsx وshell/shell.css وshell/taxonomy.css وReact. وبتحليل الوصول من هذا المدخل: من ٩٧ ملفًّا في client/src يُوصَل ٣٩ ويبقى ٥٨ ملفًّا غير موصول · ١٬٠١٦٬٠٠٥ بايت (≈٩٩٢ ك.ب)، وهي: مجلّد الجمل القديم كاملًا عدا sentences/speech.js (٣٦) · تبويب Main TREE القديم client/src/tree/ (١٤) · النطاق القديم scoped/scope.js وforest.js (٢) · أربع أوراق CSS قديمة tree.css · tree.src.css · sentences.css · sentences.src.css (٤) · proto/_before4.tmp.js (١) · taxonomy/seed.ported.js (١). ولأنّ استيراد tree.css وsentences.css أُزيل من main.jsx، فالحزمة المبنيّة نظيفة — مقيسة بـnpm run build: CSS ٤٤٫١٧ كيلوبايت (gzip ٨٫٢٨) · JS ٤٠٦٫٧٧ كيلوبايت (gzip ١٣٢٫١٤) · index.html ١٫٤٢ كيلوبايت، بلا أيّ ملفّ من المذكورة. تنبيه مطابقة: وثائق الأرشيف تقول إنّ هذه الملفّات نُقلت إلى tools/archive/legacy-app/ — وذلك المجلّد غير موجود في هذه النسخة، فالملفّات لا تزال في مواضعها والحذف الفعليّ منها خطوة تنظيم مؤجّلة.
لا تشغّل ما في tools/archive/: ملفّاتها مرجعٌ لا كود حيّ. وأخطرها مولِّد البذرة port-main-tree.mjs — ويعيد كتابة ملفّ بذرة من ١٨٥ عقدة يناقض التصميم الحالي (البذرة = ١٢ جذرًا). وهو مع ذلك لا يعمل الآن أصلًا في هذه النسخة: مدخله tools/archive/main-tree-seed.json غير موجود، فيتوقّف بـENOENT وexit 1 قبل أن يكتب أيّ ملفّ.
أربعة تبويبات — ما يفعل كلٌّ منها ومتى تستعمله
تبويب واحد هو مصدر العمل الحقيقي، وثلاثة للمعاينة والقياس. الاختيار محفوظ، فتعود إلى آخر تبويب فتحته.
Master Tree — قلب التطبيق
التصنيف المرجعي المشترك: بنية هرميّة بعمق غير محدود وهوية ثابتة لكل عقدة، وفوقه عناصرك، وأنماط التوليد التي تبنيها من تسلسل العُقد. وهو مصدر التوليد الوحيد في التطبيق.
- التصنيف: الجذور والفروع والأكواد الثابتة.
- الشجر والعناصر: إنشاء الشجر، وإضافة العناصر وربط عضوياتها.
- الأنماط: بناء الأنماط الرقمية وتحديد العمق لكل خطوة.
- اللغات: إعلان اللغات والأساسية منها، والأعلام والاتجاه.
- متقدّم: النسخ الاحتياطية، الاستيراد والتصدير، وإعادة البذرة.
كل تعديل ينسخ الحالة كاملة ثم يحفظها. لذلك الحفظ تلقائيّ ولا يوجد زرّ «حفظ».
توليد من الشجرة — التنفيذ
يُنفَّذ نمطك الرقمي على عناصرك وحدها: اختر الشجرة، وقيّد النطاق على باب إن أردت، ثم ركّب الجملة.
- يقرأ أحدث حالة محفوظة من Master Tree لحظة فتحه — فإن عدّلت ثم رجعت، اضغط «حدّث الحالة».
- الأبواب هي عُقد الجذور اللغوية. عقدة الحاوية البنيوية
PREP-SETSمستثناة من قائمة الأبواب لأنها وعاء عضوية لا موضع توليد؛ وتبقى كاملةً في الحالة وفي محرّر الشجرة. - تقييد النطاق على باب يقلّص المجمّع، فيتغيّر حجم الفضاء المتوقّع للتركيبات فورًا.
إن ظهر «موضع بلا عناصر» فالنمط يشير إلى عقدة لا عناصر لها داخل النطاق المقيَّد. هذا سلوك صحيح لا خطأ: وسّع النطاق أو أضف عناصر إلى تلك العقدة.
بروفة 4 — إثبات مصغّر للحالات الحدّية
حالة مستقلّة في الذاكرة: فاعل + فعل + وجهة، ثم لغة ثانية، ثم أربع حالات حدّية — فعل معتلّ · علاقة ثانية · علاقتان · بنية صرفية مختلفة.
لا تُحفظ ولا تمسّ تصنيفك. أغلقت التبويب أو حدّثت الصفحة = عادت البروفة إلى بدايتها. تُستعمل للقياس والاستنتاج، لا لإدخال بيانات.
بروفة 5 — الشكل النهائي المقترح للتصنيف
تعرض قرارين بنيويين قبل تعميمهما:
- الأفعال مباشرة تحت
VERBSبفروع الزمن ثم الأشخاص — بلا طبقة دومين وسيطة. - حروف الجرّ بتقاطع مجموعتين بالعضوية — بدل مفتاح علاقة ثابت لكل حرف.
حالة تجريبية مستقلّة في الذاكرة مثل بروفة 4: لا تُحفظ ولا تمسّ تصنيفك.
كيف يُبنى النمط، وكيف تُحسم المفاتيح
هذا القسم يشرح الجزء الذي يُخطئ فيه أكثر المستخدمين: النمط يشير إلى عُقد، والمفاتيح تُحسم بالمعنى لا بالنصّ.
النمط = تسلسل خطوات
كل خطوة تشير إلى عقدة وتحدّد عمقها: العقدة وحدها أم العقدة وكل ما تحتها. هذا الفرق وحده يغيّر حجم المجمّع كثيرًا — وقد قِيس الفرق بين ٥ عناصر و١٥ عنصرًا على نفس العقدة.
الصحّة النحوية ليست مسؤولية التطبيق: التوليد يتبع النمط حرفيًّا، فمن رتّب الخطوات ترتيبًا خاطئًا حصل على جملة خاطئة الترتيب.
مفتاح الدلالة sem
sem هو ما يجعل عنصرًا في لغة يقابل عنصرًا في لغة أخرى. هو مفتاح علاقة معنويّ مثل to أو at أو in، لا ترجمة نصّية للّفظ.
ولهذا لا تُكتب القيمة بلفظ اللغة المحلّي: تُكتب بالمعنى. ويمكن للعنصر الواحد أن يحمل أكثر من مفتاح.
التقاطع بالعضوية لا بمفتاح ثابت: حروف الجرّ تُحسم بتقاطع مجموعتين — مجموعة «يذهب إلى» ومجموعة «المدرسة إلى» — فالحرف الذي ينتمي إلى الاثنتين هو الصحيح. الطريقة القديمة كانت تُثبّت مفتاحًا واحدًا لكل حرف، فتنتج تركيبات لا وجود لها.
# الحالة المقيسة: مفتاحان مختلفان، ولبوس واحد مشترك GO { to · from } ∩ SCHOOL { to · at } = { to } GO { to · from } ∩ OFFICE { in · at } = { } # واللبوس الإيطالي مشترك بين المجموعتين: a · da ∩ a · in = "a" # النتيجة الصحيحة: لا نتيجة — لأن الحكم بالمعنى لا بالنصّ
قاعدة الحسم المعلنة: اللفظ الواحد لمفتاحين ليس تصادمًا. أن يحمل to وat القيمة النصّية نفسها في لغة ما أمر واقعيّ في اللغات، والمحرّك لا يقرأ النصّ أصلًا — يقرأ المفتاح. أما التصادم الحقيقي فهو تصادم في الهوية (مفتاحان بمعنى واحد) فيُفقد أحدهما، وهو مُستبعَد بتصميم الحقول المنفصلة.
مثال محسوس على حجم الفضاء
| الإعداد | المواضع | التركيبات المتوقّعة | ملاحظة |
|---|---|---|---|
نمط 1 + 2 + 3 على كلّ الأبواب | 3 · 8 · 2 | 48 | فاعل · فعل · مفعول/وجهة |
نفس النمط مقيَّدًا بباب PREPOSITIONS | 0 | 0 | موضع بلا عناصر — النطاق يحكم كما هو متوقّع |
عقدة PREPOSITIONS وحدها | 5 | 5 | إلى · من · نحو · في · مع |
الحاوية PREP-SETS كمجموعة | 15 | — | مجموع أعضاء المجموعات، ولا تُستعمل موضعًا في أيّ نمط |
درس مُقاس: قبل فصل الحاوية كان توسيع العقدة يسحب معه عناصر الأفعال (VERB:أذهب · يذهب · تذهب … عشرة عناصر متسرّبة)، فصار عدّادها ٥ بعد النقل بدل ١٥. التلوّث كان من توسيع الشجرة الفرعية، لا من العقدة نفسها.
أين يسكن عملك، وكيف تحميه
كل شيء في localStorage داخل هذا المتصفّح. معرفة المفاتيح تفيدك في التشخيص والتأكّد من وجود نسخة قبل أي إجراء كبير.
| المفتاح | ما يحمله | الحذف يعني |
|---|---|---|
| lingo.taxonomy.v1 | حالة التصنيف كاملة: العُقد والشجر والعناصر والأنماط واللغات والأكواد المقيَّدة | فقدان العمل إن لم تكن صدّرت نسخة |
| lingo.taxonomy.backups.v1 | حلقة النسخ التلقائية — ٨ نسخ بحدّ ٣ ميغابايت وتهذيب ٤٥ ثانية | فقدان خطّ الرجوع القريب |
| lingo.taxonomy.everEdited | راية مثبّتة: «التصنيف مرّ بمرحلة تحرير في هذا الجهاز». لا تُمسح تلقائيًّا أبدًا | فتح باب إعادة البذرة بلا تأكيد |
| lingo.tab.v1 | آخر تبويب فتحته | لا شيء يذكر |
| lingo.taxonomy.v1.backup.* | نسخ قديمة كتبتها ترقيات المخطّط | تُعرَض ضمن القائمة بوسم legacy حتى لا يبقى شيء مخفيًّا |
الترتيب المحمي قبل أي إجراء كبير
إعادة البذرة والاستعادة لا تمرّان إلا من مسار واحد بترتيب غير قابل للقلب:
- ١
- التحقّق من صحة الحالة الحالية
- ٢
- أخذ نسخة احتياطية
- ٣
- التأكّد من النسخة فعليًّا — تُقرأ من المخزن وتُطابَق بصمتها
- ٤
- التنفيذ
إن فشل أيّ شقّ من النسخة: لا إعادة بذرة ولا استبدال، ويظهر خطأ صريح. والحماية لا تعتمد على عدد العُقد: مؤشّر «بدأ التحرير» يبقى قائمًا حتى لو حُذفت كل الفروع.
التصدير والاستيراد
الصيغ المدعومة: JSON · TXT · CSV · TSV · MD. والاستيراد يكشف الصيغة تلقائيًّا ويطبع تقريرًا بما دخل وما رُفض ولماذا.
نسخة JSON الكاملة هي الوحيدة التي تعيد بناء كل شيء. الصيغ الجدولية للتشخيص والتبادل الجزئي، ومفيدة لمن أراد تعديل مئات العناصر في جدول ثم إعادتها.
أعمدة العناصر المصدَّرة: tree · code · path · role · unit · sem ثم رموز اللغات المعلَنة ثم note.
إعادة البذرة ليست أداة إدارة يومية. البذرة = ١٢ جذرًا بلا فروع ولا عناصر ولا أنماط. للتصحيح اليوميّ استعمل التحرير والاستيراد؛ ولا تلجأ إلى التصفير إلا بعد تصدير نسخة خارجية والاحتفاظ بها في مكان آخر غير المتصفّح.
كيف تتحقّق أن كل شيء سليم
تُشغَّل من جذر المشروع — حيث مجلّد tools — بلا متصفّح ولا إعداد. والحكم بإعادة التشغيل لا بالعدّ اليدويّ. وأغلب المجموعات تُغلق بسطر «النتيجة: …» مع رمز خروج مطابق، لكن الصيغة ليست واحدة: acceptance-cleanup تقول «١٥ ناجح · ٠ فاشل — من ١٥»، وcheck-langs-in-json تقول «كل الفحوص ناجحة»، وcheck-seed تقريرٌ وصفيّ لا يعلن نجاحًا ولا فشلًا، وacceptance-seed-guard تُتبِع سطر النتيجة بشريط =. فاقرأ السطر لا الذيل، ولا تعتمد على الشكل وحده.
cd client && npm install # مرّة واحدة — بلاها يطبع render-smoke «SKIP» cd .. node tools/acceptance-master-tree.mjs node tools/acceptance-seed-guard.mjs node tools/acceptance-io.mjs node tools/acceptance-identity-codes.mjs node tools/acceptance-cleanup.mjs node tools/check-units.mjs node tools/check-proto.mjs node tools/check-proto3.mjs node tools/check-proto4.mjs node tools/check-v5.mjs node tools/check-prep-sets-root.mjs node tools/check-langs-in-json.mjs node tools/check-seed.mjs node tools/render-smoke.mjs
for f in tools/acceptance-*.mjs tools/check-*.mjs tools/render-smoke.mjs; do
node "$f" >/dev/null 2>&1
printf '%-32s exit=%s\n' "$(basename "$f")" "$?"
done
لا تقرأ النتيجة بـ| tail -1. مخرج acceptance-seed-guard يُغلق بشريط = بعد جملة النتيجة، وcheck-go وport-main-tree يتوقّفان بخطأ قبل أيّ فحص — فـtail -1 يعطيك شريطًا أو أثر خطأ لا نتيجة. اقرأ سطر «النتيجة» أو رمز الخروج: acceptance-seed-guard وcheck-go وport-main-tree هي الوحيدة التي تُخرج exit 1 في هذه النسخة، والباقي exit 0.
سكربتان لا يُشغَّلان في هذه النسخة لغياب مدخلاتهما، ويفشلان بـENOENT وexit 1 قبل أوّل فحص — فاحسبهما «غير قابلين للتشغيل» لا «فاشلين»: tools/check-go.mjs (يحتاج documents/lingo-vitamins/master-taxonomy-ported.json)، وtools/port-main-tree.mjs (يحتاج tools/archive/main-tree-seed.json). وtools/structure-extra.mjs ليس فحصًا أصلًا: هو وحدة تصدير بلا مخرج.
| المجموعة | المجال | النتيجة المقيسة |
|---|---|---|
| check-prep-sets-root | فصل الحاوية · المجمّع · الأبواب · الضبط السالب | 53 · 0 فشل |
| check-proto | جولات البروفات الأساسية | 62 · 0 فشل |
| acceptance-seed-guard | حماية البذرة وعدم استيراد البذرة المنقولة | 60 · 1 فشل |
| acceptance-io | التصدير والاستيراد والتقارير | 36 · 0 فشل |
| check-proto3 | الجولة الثالثة: فعل معتلّ · علاقة ثانية · علاقتان | 36 · 0 فشل |
| acceptance-master-tree | البنية الهرمية وهوية العُقد | 35 · 0 فشل |
| check-v5 | بروفة 5: الأفعال والتقاطع | 30 · 0 فشل |
| check-units | الكلمة مقابل العبارة والوحدات | 28 · 0 فشل |
| render-smoke | يرسم كل اللوحات بـReact ويفشل إن رمى أيّها استثناءً — يحتاج npm install في client/، وإلّا طبع SKIP | 30 لوحة |
| acceptance-identity-codes | الأكواد الثابتة وعدم تغيّرها | 24 · 0 فشل |
| check-proto4 | بروفة 4: الحالات الحدّية | 21 · 0 فشل |
| acceptance-cleanup | تنقية بقايا جلسات التحقّق | 15 · 0 فشل |
| check-langs-in-json | عودة اللغات في ملفّ JSON | 5 · 0 فشل |
المجموع المقيس الآن: ٤٣٦ تأكيدًا · ٤٣٥ ناجح · ١ فاشل — موزَّعة: ١٩٩ للقبول (٣٥ · ٦١ · ٣٦ · ٢٤ · ١٥ + ٢٨ للوحدات) · ١٤٩ لفحوص البروفات (٦٢ · ٣٦ · ٢١ · ٣٠) · ٥٣ لـcheck-prep-sets-root · ٣٠ رسم اللوحات · ٥ لعودة اللغات في JSON. والفشل الواحد معروف ومُوثَّق أدناه، ولا يخصّ المنطق.
الفشل الوحيد — وموقفه المعلَن: الفحص G2 في acceptance-seed-guard يتحقّق أنّ ملفّ البذرة المنقولة (١٨٥ عقدة) محذوف. والملفّ client/src/taxonomy/seed.ported.js لا يزال موجودًا (٣٠٫٤ كيلوبايت · ٣٠٬٤٠٣ بايت). والموقف منه في هذه المرحلة موثَّق لا مُنفَّذ، وأربعته: الملفّ موجود · لا يستورده أيّ ملفّ (بند G1 يفحص سبعة ملفّات — storage · model · io · reset · backup · TaxonomyTab · TaxonomyPanel — فلا يجد ذكرًا لـPORTED ولا seed.ported فيمرّ) · وأثره على التشغيل معدوم فلا المصغِّر يشمله ولا الحزمة المبنيّة تحمله · وهو الفحص الأحمر الوحيد في الحزمة كاملة. فالحكم: الاتّهام صحيح والحذف قرارُ تنظيفٍ مؤجّل أُبقِي خارج هذه الجولة. وتنفيذه سطر واحد ← ثم ٦١ · ٠، ويصير مجموع الحزمة ٤٣٦ · ٤٣٦.
١٧ مشكلة متكرّرة — والعرَض والسبب والحلّ
ابحث في الصندوق العلوي أو اقرأ من الأعلى. الترتيب من الأخطر إلى الأندر. وكل بند ينتهي بطريقة تحقّق تُثبت أن الحلّ نجح فعلًا.
١٧ بندًا معروضًا
السبب الغالب
نُشر مجلّد المصدر client/ بدل مخرج البناء، أو index.html وحده بلا مجلّد assets/. المتصفّح لا يستطيع تشغيل JSX الخام.
الحلّ
- شغّل
npm run buildمن داخلclient/وانتظر خروجًا بلا خطأ. - افتح
client/distوتأكّد بعينك من وجودindex.htmlو مجلّدassets/. - انشر
client/distكاملًا — لاclient/ولا ملفّ واحد منه. - تأكّد أن
vite.config.jsفيهbase: './'لأن الموقع قد يُقدَّم من مسار فرعيّ لا من جذر النطاق.
التحقّق
افتح الموقع ثم Console في أدوات المطوّر: يجب أن يكون <div id="root"> ممتلئًا. وإن ظهر 404 على ملفّ .js فالسبب مسار الأصل لا الشيفرة.
اقرأ نصّ الخطأ — هو يحدّد الحلّ
[UNRESOLVED_IMPORT]أو Could not resolve ← ملفّ مفقود أو مسار استيراد خاطئ، وليس خطأ في إعداد Vite.Cannot find module '@vitejs/plugin-react'← لم تُثبَّت التبعيات. شغّلnpm install.JSONParseErrorفيpackage.json← ملفّ JSON مكسور (فاصلة زائدة أو علامة ناقصة). أصلحه ثم أعد المحاولة.Missing script: "build"← قسمscriptsفقد سطر البناء.
القاعدة
لا تنتقل إلى النشر قبل أن يخرج البناء بصفر خطأ. البناء الناقص يُنتج dist ناقصًا، ثم يُنشر على أنه سليم.
السبب
التطبيق بلا خادم وبلا مزامنة. الحالة في localStorage وحدها، وهو يُمسح بـ«مسح بيانات التصفّح»، وأيضًا عند تشغيل وضع التصفّح الخاص، وقد يُنقّى تلقائيًّا تحت ضغط المساحة.
الحلّ
- افتح Master Tree › متقدّم واطلب قائمة النسخ الاحتياطية — قد تجد الحالة خلال آخر جلسات.
- ابحث كذلك عن النسخ الموسومة
legacy؛ فهي نسخ كتبتها ترقيات المخطّط وتُعرَض عمدًا ولا تُحذف. - إن وُجدت نسخة، استعِدها — والمسار يأخذ نسخة من الحالة الحالية قبل الاستبدال.
- وإن لم توجد: أعد استيراد آخر ملفّ JSON صدّرته من متقدّم › الاستيراد.
الوقاية
صدّر نسخة JSON كاملة بعد كل جلسة عمل حقيقية، واحفظها خارج المتصفّح — على القرص أو في بريد أو تخزين سحابي. حلقة النسخ داخل المتصفّح ليست بديلًا: هي خطّ رجوع قريب لا أرشيف.
السبب
تبويب «توليد من الشجرة» يحمّل لقطة من أحدث حالة محفوظة عند فتحه، ولا يعيد القراءة مع كل تغيير يحدث في تبويب آخر.
الحلّ
اضغط زرّ «حدّث الحالة من Master Tree» في الشريط أعلى التبويب. اللقطة تُحدَّث ويظهر أثر تعديلك في العدّادات والمجموع.
التحقّق
قارن عدّاد الباب في «توليد من الشجرة» بعدد العناصر الذي تعرفه في العقدة. تغيّر العدّاد = اللقطة تحدّثت.
ثلاثة أسباب مختلفة، وكلّها سلوك صحيح
- النطاق مقيَّد بباب لا يحتوي إحدى عُقد النمط. مثال مقيس: نمط
1 + 2 + 3مقيَّدًا ببابPREPOSITIONSيعطي ثلاثة مواضع بلا عناصر — لأن الباب كلّه حرف جرّ واحد الدور. - العقدة بلا عناصر أصلًا: بنيت العقدة ولم تُدخِل عناصرها بعد.
- العمق خاطئ: النمط يطلب العقدة وحدها وعناصرك في الفروع تحتها — أو العكس.
الحلّ
- وسّع النطاق: أزل تقييد الأبواب أو أضف الباب الذي يحمل العناصر.
- أو أضف العناصر إلى العقدة المذكورة في رسالة التنبيه.
- أو عدّل راية العمق في خطوة النمط.
التحقّق
ارمز إلى حجم الفضاء المتوقّع: إن بقي صفرًا بعد توسيع النطاق فالمشكلة في العمق أو في العناصر، لا في النطاق.
التفسير
قائمة الأبواب = عُقد الجذور اللغوية فقط. وعقدة الحاوية البنيوية PREP-SETS — وهي وعاء عضوية يجمع مجموعات حروف الجرّ — مستثناة من العرض كباب لأنها ليست موضعًا يولّد منه المستخدم مباشرةً.
ما لم يتأثّر بالاستثناء
- العقدة حاضرة كاملة في الحالة وفي محرّر الشجرة، وببياناتها ووسمها.
- منطق التقاطع والعضوية لم يُمسّ، والمجمّع الكامل للحاوية ما زال ١٥ عنصرًا.
- الاستثناء عرضٌ فقط: لا حقل جديد ولا وسم جديد على العقدة.
التحقّق
افتح محرّر الشجرة: ستجدها. وافتح قائمة الأبواب: لن تجدها. الفحص check-prep-sets-root يثبت الحالتين معًا (٥٣ فحصًا · ٠ فشل).
السبب
راية العمق مفعّلة، فتسحب العقدة عناصر فرعها وفرع الفرع. ومثال مُقاس يوضّح الفرق: نفس العقدة أعطت ٥ عناصر بلا توسيع و١٥ معه، والتسرّب كان عشرة عناصر من دور آخر تمامًا.
الحلّ
- اطلب العدّاد مرّتين: مرّة بلا توسيع ومرّة به، واقرأ الفرق.
- إن كان الفرق عناصر من دور غير دور العقدة، فالبنية هي السبب لا عمق النمط — افصل المجموعة في جذرها الخاصّ.
- وإلا، عدّل راية العمق في النمط أو قيّد النطاق.
التحقّق
كثيرًا ما تكون المشكلة في موضع العقدة لا في دالّة التوسيع. افحص الأب قبل أن تعدّل الشيفرة.
السبب
النطق يعتمد على محرّك المتصفّح (Web Speech API) لا على خدمة خارجية. لذلك قد تكون اللاصقة كاملة على جهاز وبلا صوت على آخر، وقد لا يوجد صوت للغة المطلوبة أصلًا.
الحلّ
- ثبّت حِزم الأصوات في نظام التشغيل للغة المقصودة (ويندوز: الإعدادات › الوقت واللغة › النطق).
- رحّل الصفحة مرّة بعد تثبيت الأصوات — قائمة الأصوات تُحمَّل عند بدء الصفحة وتتحدّث عند تغيّرها.
- تأكّد أن صوت المتصفّح غير مكتوم وأن مستوى الصوت ليس صفرًا.
- إن لم يتوفّر صوت للغة، يقع الاختيار على صوت قريب — وهذا صنف لهجة لا خطأ.
التحقّق
لوحة «اللغات» توضّح اللغات المعلَنة ورموزها؛ والرمز هو ما يُترجم إلى وسم النطق. رمز غير قياسيّ مثل xx لن يجد صوتًا بأيّ حال.
التفسير
هذه ليست مشكلة — هذه الحماية تفعل عملها. متى ما مرّ التصنيف بمرحلة تحرير حقيقية، صار التصفير محميًّا بعبارة تأكيد يطلبها التطبيق. والحماية لا تعتمد على عدد العُقد: راية «مرّ بمرحلة تحرير» مثبّتة ولا تُمسح تلقائيًّا أبدًا، حتى لو حذفت كل الفروع وعادت الحالة ١٢ جذرًا.
ما تفعله
- اقرأ تقرير «ما سيُفقَد» الذي تعرضه الواجهة قبل التأكيد: عدد الفروع والعناصر والعضويات والأنماط.
- اطلب نسخة احتياطية الآن إن لم تكن واثقًا — النسخة تُؤخذ تلقائيًّا وتُتحقَّق قبل التنفيذ، وإن فشلت النسخة لا يُنفَّذ شيء.
- اكتب عبارة التأكيد التي يطلبها التطبيق ثم نفّذ.
تحذير
البذرة هي الجذور الاثنا عشر وحدها: بلا فروع وبلا عناصر وبلا أنماط. لا تستعمل التصفير للتصحيح اليوميّ — استعمل التحرير والاستيراد. وإن أردت التصفير فعلًا، صدّر نسخة JSON خارج المتصفّح قبلها.
الأسباب الشائعة، مرتّبة بالاحتمال
- ترويسة الأعمدة ناقصة. صفّ الترويسة هو ما يعرّف التطبيق بأسماء الأعمدة ورموز اللغات. بلا ترويسة لا يُعرف أيّ عمود لأيّ لغة.
- ترميز الملفّ. احفظ دائمًا
UTF-8؛ النصّ العربي بترميز آخر يُقرأ رموزًا أو يُرفض. - الفاصل الخاطئ. الفاصلة المنقوطة في ملفّ CSV قد تُقرأ جزءًا من القيمة. صدّر مثالًا من التطبيق ثم املأه — هذه أضمن طريقة.
- رموز لغات غير معلَنة. عمود بلغة لم تُعلنها يبقى خارج الاستيراد؛ أعلِن اللغة أوّلًا في لوحة اللغات.
التحقّق
اقرأ تقرير الاستيراد الذي يظهر بعد التنفيذ: يقول ما دخل وما رُفض ولماذا. الرفض مع سبب مكتوب أفضل من صمت.
ثلاث قواعد عملية
- عنصر واحد قد يحمل عدّة مفاتيح، والمفاتيح مفصولة بفاصل واحد — وتُفعَّل بأزرار ضغط في محرّر العنصر لا بالكتابة اليدوية.
- حالة الأحرف تفرّق.
iوIمفتاحان مختلفان، فانتبه للنسخ واللصق. - المفتاح بالمعنى لا باللفظ المحلّي. اكتب
toلا «إلى»، وatلا «في».
الحلّ
- افتح محرّر العنصر ووسّع حقل
sem— العرَض المطويّ لا يعرضه. - فعّل المفاتيح من أزرارها بدل كتابتها.
- إن كان مفتاحان بمعنى واحد ويجب أن يبقيا منفصلين، فالأولى دمجهما في مفتاح واحد لتجنّب فقدان أحد الشقّين عند الحسم.
السبب
بعض الأدوات ليست فحوصًا روتينية بل أدوات قياس تحتاج مدخلات خارجية. أبرزها أداة فحص اللغة check-go.mjs وأداة النقل port-main-tree.mjs: تقرآن ملفّات من documents/lingo-vitamins/ وهي غير موجودة في هذه النسخة، فيتوقّف التنفيذ بـENOENT قبل أي فحص.
الحلّ
- لا تحسبها فحصًا فاشلًا — هي غير قابلة للتشغيل بلا مدخلها.
- إن احتجتها فعلًا: أعِد ملفّات المدخل إلى مكانها المذكور في نصّ الخطأ.
- وإلا فاستثنِها من أمر التشغيل الجماعي، والتزم بالمجموعات التي تطبع سطر نتيجة صريحًا مع رمز خروج صفر.
علامة الفحص السليم
الفحص السليم يطبع نتيجة صريحة ويعيد رمز خروج صفرًا. فاسأل عن الرمز مباشرةً: node tools/check-proto.mjs; echo $? ← 0. وأداة لا تطبع شيئًا وتعود بسرعة مشكوك فيها — تحقّق من مخرجها قبل الاعتماد عليها. وفي هذه النسخة تُخرج ثلاث أدوات الرمز 1: acceptance-seed-guard (فشل حقيقي: بند G2) وcheck-go وport-main-tree (الاثنان يسقطان بمدخل مفقود، لا بفشل فحص) — أمّا مجرّد الكتابة فوق النتيجة بـ| tail -1 فتضيّع الرمز: البِنيَة cmd1 | cmd2 تُرجع رمز cmd2 لا رمز الفحص.
الحلّ
- هناك نسخة قديمة من الخادم تعمل في نافذة طرفية أخرى — أغلقها.
- أو دع Vite يختار منفذًا آخر تلقائيًّا فهو يفعل ذلك، واقرأ المنفذ الجديد من مخرج الأمر.
npm run dev -- --port 5174
الأسباب المرتّبة
- نسخة Node أقدم من ١٨ — تحقّق أولًا، فهذا أكثر سبب متكرّر.
- شبكة أو وكيل يحجب السجلّ — جرّب مرّة أخرى، أو اضبط الوكيل.
- تنصيب جزئيّ سابق ترك
node_modulesناقصًا — احذفه وأعد التنصيب.
node -v # يجب أن يكون 18 أو أحدث
rm -rf node_modules package-lock.json
npm install
حذف package-lock.json قد يجرّ نسخًا أحدث من التبعيات. إن أردت الثبات، احتفظ بالملفّ واحذف node_modules وحده.
السبب البنيويّ
كل تعديل ينسخ الحالة كاملة ثم يحفظها. النسخ الكامل هو ما يضمن سلامة الحالة وعدم تراكم أخطاء جزئية، وهو أيضًا ما يحدّ الأداء عند الأعداد الكبيرة. ولم يُقس الأداء على عشرات الآلاف من العناصر — هذا حدّ معروف لا مُخفى.
ما يساعد عمليًّا
- اقسم العمل على أكثر من شجرة، واعمل على شجرة واحدة في الجلسة.
- أدخل دفعات كبيرة بـالاستيراد من ملفّ جدوليّ، لا صفًّا صفًّا.
- أغلق التبويبات التي لا تحتاجها: تبويبات البروفات تحمل حالات مستقلّة في الذاكرة.
- صدّر نسخة ثم أعد تحميل الصفحة بعد جلسة طويلة، لبدء تشغيل نظيف.
الحالة
الفحص G2 يتحقّق أن ملفّ البذرة المنقولة (١٨٥ عقدة) محذوف، والملفّ client/src/taxonomy/seed.ported.js لا يزال موجودًا خلافًا لوثائق الأرشيف. أثره العمليّ معدوم على الحزمة لأن الفحص G1 يمرّ: لا ملفّ يستورده، فالمصغِّر لا يضمّه أبدًا.
الإصلاح — إن أردت الفحص أخضر كلّه
rm client/src/taxonomy/seed.ported.js
ثم node tools/acceptance-seed-guard.mjs ← يصير ٦١ · ٠ فشل.
قبل الحذف — تحقّق بنفسك
تأكّد أن لا شيء يستورده: ابحث عن الاسم seed.ported في client/src كلّه. واعلم أن إعادة توليده ممكنة من tools/archive/ إن احتجت قراءته — لكن لا يُبنى ولا يُنشر.
الأسباب
- خطوط Google Fonts تُحمّل من الشبكة؛ بلا إنترنت يقع النظام على خطّ بديل ويتغيّر القياس قليلًا.
- الأيقونات مكتبة داخلية في الحزمة، فلا تفشل عادةً — لكن نسخة قديمة من المتصفّح قد لا تدعم بعض الخصائص المستعملة.
- الانكسار على الجوال غالبًا من عرض جدول عريض أو نافذة منبثقة بلا حدّ أقصى للعرض.
التوجيه
الواجهة عربية فقط واتجاهها RTL بالكامل. جرّب العرض على ٣٧٥ بكسل: إن تجاوز عنصر عرضَ الشاشة فالمشكلة في حاوية overflow لا في المنطق. وأبلغ عن الصيغة الدقيقة (اسم اللوحة + رقم الإصدار + نصّ الخطأ في Console) لتسهيل الإصلاح.
سبعة حدود يجب معرفتها قبل الاعتماد على التطبيق
ليست عيوبًا مخفيّة — هي قرارات تصميم معروفة. معرفتها مبكرًا توفّر عليك وقتًا كثيرًا.
البذرة ١٢ جذرًا فقط
بلا فروع وبلا عناصر وبلا أنماط. التطبيق لا يولّد شيئًا قبل إدخال عناصرك وبناء نمط. واللائحة المرجعية الكاملة (١٨٥ عقدة) موجودة كملفّ خارجي لا داخل البذرة — تُقرأ ويُنقل منها يدويًّا عند الحاجة.
التخزين في المتصفّح وحده
لا مزامنة بين الأجهزة ولا نسخ سحابي. محو بيانات المتصفّح = فقدان العمل إن لم تُصدّر نسخة. التصدير شرط عمل لا خيار ثانوي.
لا تحقّق نحويّ أو دلاليّ
التوليد يتبع النمط حرفيًّا. صحّة الترتيب والصرف مسؤولية من بنى النمط. التطبيق يعطي ما طلبته، لا ما كان ينبغي أن تطلبه.
النطق متغيّر
يعتمد على محرّك المتصفّح، وقد لا يتوفّر صوت للّغة المطلوبة، وقد تختلف اللاصقة بين الأجهزة اختلافًا واضحًا.
لا فحص تفاعليّ (E2E)
الفحوص تغطّي المنطق وترسم اللوحات بـReact، لكنها لا تنقر الواجهة فعليًّا. أيّ عيب يظهر بالنقر وحده لا تكشفه الفحوص الحالية.
الواجهة عربية فقط
لا توجد لغة واجهة ثانية ولا تبديل اتجاه. هذا مقصود في النسخة الحالية، وليس نقصًا مؤقّتًا.
الأداء غير مقيس على نطاق واسع
لم يُقس على عشرات الآلاف من العناصر، لأن كل تعديل ينسخ الحالة كاملة. للحجم الكبير استعمل الاستيراد والقسمة على شجر.
أسئلة قصيرة بأجوبة مباشرة
لا. التطبيق يعمل كاملًا في المتصفّح بلا خادم ولا قاعدة بيانات. وإن أردت مشاركته مع آخرين فيكفي نشر مجلّد dist على أيّ استضافة ملفّات ثابتة — وكلّ مستخدم سيملك تصنيفه في متصفّحه.
لا في الوقت الحقيقيّ. الطريق العمليّ: يصدّر أحدكما نسخة JSON كاملة ويمرّرها للآخر ثم يستوردها. الصيغة الكاملة تعيد بناء كل شيء، فاحتفظ بنسخة قبل الاستيراد.
التصنيف الحقيقيّ وحده يُحفظ ويؤثّر في التوليد. البروفتان حالة مستقلّة في الذاكرة تُستعمل للقياس والاستنتاج قبل تعميم أيّ قرار بنيويّ — فإغلاق التبويب أو تحديث الصفحة يُعيدهما إلى بدايتهما.
لكل عقدة كود ثابت يُشتقّ من مسارها مرّة واحدة ثم لا يتغيّر بعدها أبدًا، ويعمل كعنوان مستقرّ تشير إليه الأنماط والملفّات المصدَّرة. لذلك راجع الأكواد قبل أن تبني عليها؛ تعديلها لاحقًا مكلف، والأسماء الجاهزة للمراجعة موجودة في لائحة العُقد المرجعية خارج التطبيق.
JSON الكاملة للنسخ والأرشفة ولنقل العمل بين الأجهزة. أما CSV · TSV · MD فللتشخيص والتبادل الجزئي ولتعديل مئات العناصر في جدول ثم إعادتها. لا تعتمد على الصيغ الجدولية كنسخة أمان.
ابدأ بالاستعمال. والمنطق معزول في taxonomy/model.js عمدًا، والفحوص تعمل من الطرفية بلا متصفّح — فإن أردت التعديل فغيّر المنطق أوّلاً ثم أعد تشغيل المجموعة المعنيّة. وأيّ تعديل يمرّ بفحص أوضح من أيّ مراجعة بالعين.
الوثائق، وحالتها الفعلية مقابل الواقع
هذا الجدول مقصود: يوفّر عليك ساعة من الحيرة عندما لا تجد ملفًّا يذكره دليل قديم.
| المرجع | ما فيه | الحالة |
|---|---|---|
| README.md | نظرة عامة والتشغيل والفحوص والبنية | محدَّث في هذه الجولة: العدّ صار ٤٣٦ · ٤٣٥ · ١ مع رموز الخروج، وأُضيف check-prep-sets-root (٥٣)، وصُحّح check-v5 إلى ٣٠ وrender-smoke إلى ٣٠ لوحة، وصار يسمّي الملفّات المرجعية الغائبة، ويصف حالة الشيفرة الميتة موضعيًّا |
| documents/lingo-vitamins/compatibility-schema.md | مخطّط التوافق والطبقات الثلاث ومفاتيح العلاقة | مطابق ومرجع القرار (§١٥ لاستثناء الحاوية من الأبواب) |
| documents/lingo-vitamins/probe-results.md | نتائج قياس البروفات | مطابق |
| documents/lingo-vitamins/prep-sets-move-results.md | سجلّ نقل الحاوية إلى جذر مستقلّ | محدَّث: أُضيف مقطع «تحديث الحالة» بإعادة قياس (٥٣ · ٠ · وcheck-v5 ٣٠ · والأبواب أربعة)، وبقي السجلّ الأصليّ معلَّمًا صريحًا كأرقام لحظته لا أرقام الحاضر |
| documents/lingo-vitamins/master-tree.example.json | مثال بنية شجرة رئيسية | موجود |
| documents/lingo-vitamins/knowledge.example.json | مثال ملفّ معرفة | موجود |
| documents/lingo-vitamins/extraction-prompt.md | مطالبة استخلاص البنية | موجود |
| documents/lingo-vitamins/verify-compatibility.mjs | سكربت تحقّق من التوافق | موجود |
| tools/archive/README.md | سجلّ ما أُرشف ولماذا وأرقامه | محدَّث: صُحِّح القول بحذف seed.ported.js (الملفّ موجود ولا يستورده شيء، وهو سبب الفحص الأحمر الوحيد)، وصُحِّح عدّ ملفّات المجلّد، ونُبِّه أنّ legacy-app/ وmain-tree-seed.json غير موجودين في هذه النسخة |
| tools/archive/legacy-app/ | الشيفرة القديمة المنقولة | غير موجود — وثائق الأرشيف تصف نقلًا لم يُنفَّذ هنا: ٥٨ ملفًّا ما زالت تحت client/src/ بلا مُوصِل من main.jsx |
| documents/lingo-vitamins/master-taxonomy-ported.json | نسخة بنية التصنيف المرجعي (١٨٥ عقدة) | غير موجود في هذه النسخة، وبغيابه يتوقّف check-go.mjs بـENOENT وexit 1 |
| documents/lingo-vitamins/taxonomy-outline.md | اللائحة المرجعية للعُقد (١٨٥ عقدة · ١٢ جذرًا · عمق ٤) | غير موجود في هذه النسخة، ومع غياب master-taxonomy-ported.json لا بديل محليّ عن اللائحة |
| documents/lingo-vitamins/realization-in-taxonomy-review.md | مراجعة الإنجاز في التصنيف (وفيها موضعا ظهور sem) | غير موجود في هذه النسخة، مع أنّ tools/archive/README.md يحيل إليه |
| documents/lingo-vitamins/round4-report.docx | تقرير الجولة الرابعة | غير موجود في هذه النسخة |
أسرع طريق للفهم: ابدأ بملفّ README.md للتشغيل، ثم هذا الدليل للتفاصيل، ثم compatibility-schema.md إن أردت الخلفية النظرية لقرارات التقاطع والطبقات. وإن اختلف أيّ ملفّ مع الواقع، فالواقع هو الحكم — شغّل الفحوص واقرأ مخرجها.