# תוכנית_בדיקה_מלאה — המערכת כולה מול המקור (15.9.2026) ## למה היום אנחנו יודעים "כמה ירד". אנחנו לא יודעים **מול מה**. כל דומיין צריך עץ בינארי אחד שמייצג את **המקור** (מה הספק מפרסם, כמה, באיזו גרסה), ורק מולו אפשר לומר "לא חסר לנו כלום". העץ הזה הוא נכס בפני עצמו: הוא מסונכרן מלא פעם אחת, ויומית — לפני שמסנכרנים את הטקסט. ## העיקרון **סנכרון = שלושה עצים שמושווים:** עץ-המקור (מה יש שם) ↔ עץ-אצלנו (מה קודד) ↔ עץ-ההבדל (מה חסר / השתנה / מיותר). כל השלושה בינאריים, קבועי-רשומה, עם sha8. שום סנכרון-טקסט לא רץ בלי שעץ-המקור שלו מעודכן קודם. ## פורמט אחיד: `_tree.bin` (מגיק 0x7EEE0001, רשומה 64B) | שדה | גודל | תוכן | |---|---|---| | id | u32 | מזהה-צומת (רציף) | | parent | u32 | הורה (0 = שורש) | | kind | u8 | 1 קטגוריה · 2 פריט-מקור (מהדורה/חיבור/דאמפ) · 3 תת-פריט (קובץ) | | depth | u8 | עומק | | status | u8 | 0 לא ידוע · 1 חסר אצלנו · 2 מסונכרן · 3 שונה במקור · 4 נכשל · 5 דילוג (אין במקור) | | flags | u8 | 1 קופסה · 2 מקומי · 4 מישור · 8 קורא | | name(off,len) | u32+u16 | שם-הפריט (pool) | | src_ref(off,len) | u32+u16 | הפניה למקור (URL/נתיב) | | src_ver(off,len) | u32+u16 | גרסה במקור (md5 / תאריך-דאמפ / updated) | | src_bytes | u64 | גודל במקור | | our_bytes | u64 | גודל אצלנו | | our_records | u32 | רשומות אצלנו | | last_sync | u32 | epoch של הסנכרון האחרון | | sha8 | u64 | על (id, name, src_ver, src_bytes) | כותרת: `-latest-md5sums.txt` לכל מהדורה | md5 של pages-articles + תאריך-דאמפ | 364 מהדורות × 4 סוגי-דאמפ (articles, langlinks, page_props, geo, cats) | | ויקימילון | sitematrix + md5sums | md5 + תאריך | 198 | | שכבות-עזר | נגזר מעץ-ויקיפדיה (kind 3) | md5 של כל sql.gz | 364 × 4 | | ספרייה | `table_of_contents.json` + רישום-דלי (name, md5Hash, updated) | md5Hash · last_export | 7,867 צמתים · 8,097 אובייקטים | | ויקינתונים | `entities/` + `wikidatawiki/latest` (md5sums) | md5 · תאריך | 3 דאמפים (lexemes, truthy, all) | ## שלבים ### שלב 0 — עצירה ומדידה (חצי שעה) - להקפיא משגרים; לרשום מצב-פתיחה: `system_spec.json`, `asset_ledger.json`, `lib_topics.json`. - **אורקל:** שלושת הקבצים עם `ts` של היום; `asset_ledger.totals.ours_gb` תואם ל-`system_spec.totals.gb_box+gb_local` ±2%. ### שלב 1 — עצי-המקור (יום) - `tree_build_.job.py` לכל דומיין: בונה `_tree.bin` **ישירות מהמקור** (לא מהמלאי הקיים), ישר לקופסה `magnet\trees\`. - ויקיפדיה: 364 בקשות md5sums (מראה); ויקימילון 198; ספרייה: רישום-דלי (8 עמודים); ויקינתונים: 2 קבצים. - **אורקל:** (א) מספר פריטי-המקור = מה שידוע ממקורות עצמאיים (sitematrix 364/198; ToC 6,608; entities 3). (ב) sha8 300/300. (ג) זרוע-B נכשלת בכוונה. (ד) **בדיקת-נקודה אנושית:** 5 פריטים אקראיים — הגודל בעץ = Content-Length ב-HEAD ישיר. - **מינוס ידוע:** md5sums של ויקימדיה מתעדכן ב-1 ו-20 לחודש; בין לבין העץ "ישן" — לא שגוי. ### שלב 2 — עץ-אצלנו והשוואה (יום) - `tree_ours_.job.py`: לכל פריט-מקור — מה יש אצלנו (קבצים, רשומות, בייטים, מישור, קורא, גרסה שנקלטה מ-`*_meta.bin`/מניפסט) → ממלא `our_*` + `status`. - `tree_diff_.json`: חסר / שונה / מיותר / נכשל, עם סיבה לכל פריט. - **אורקל:** סכום `our_bytes` בעץ = `asset_ledger` לדומיין ±1%; מספר status=2 = מספר `*_meta.bin` בפועל; **אין פריט עם status=0** (הכל סווג). - **מינוס ידוע:** מהדורה שסונכרנה יומית מ-recentchanges "שונה במקור" לעומת הדאמפ — לא חסר; מסומן 2 עם `src_ver` של הדאמפ + סימן-מים. ### שלב 3 — השלמת החסר (יום–יומיים) - לכל status=1/3/4: המשגר של הדומיין מקבל את הרשימה **מהעץ** (לא מקבצי-skip/inventory ישנים — הם מבוטלים). - **אורקל:** אחרי הסבב, `tree_diff` ריק פרט ל-status=5 (אין במקור) עם הוכחה (HEAD 404 מתועד ב-`src_ver`). - **מינוס ידוע:** en/דאמפים ענקיים — עד 3 שעות; לא לחסום את השאר (מכסות לפי מחלקה). ### שלב 4 — סנכרון-העץ עצמו (קבוע) - **מלא:** שלב 1 מחדש פעם בחודש (אחרי ה-1 לחודש, כשדאמפים חדשים עולים) + כל שינוי-סכימה. - **יומי (04:00Z = 06:00 ברלין):** `tree_sync_` — למקורות עם רישום זול (ספרייה: רישום-דלי; ויקימדיה: md5sums של מהדורות שהיו "בתור/נכשל"; ויקינתונים: md5sums) — עדכון `src_ver/src_bytes`, סימון status=3 לשינויים, ותור-עבודה למחר. **רק אחרי זה** רצים סנכרוני-הטקסט היומיים (recentchanges / דלתא). - **אורקל:** דוח-יומי בקבוצה: `עץ : N פריטים · M השתנו · K חסרים · 0 לא-מסווגים`; אם "לא-מסווגים" > 0 — כשל. ### שלב 5 — דשבורד "מול המקור" (חצי יום) - כרטיס לכל דומיין: פריטי-מקור · מסונכרנים · חסרים · שונו · דילוגים-מוכחים · עץ עודכן מתי (מלא/יומי). פס = מסונכרנים/(מקור − דילוגים-מוכחים). זה מחליף את "כיסוי %" המשוקלל-לפי-GB בפנקס. - **אורקל:** המספרים בדשבורד = מהעץ בלבד (Range על `_tree.bin`), לא מ-json מתווך. ### שלב 6 — בדיקות-רוחב על המערכת (יום) 1. **אחסון:** כל `*_text/chars/pages` >64MB — קישור לקופסה (0 עותקים מקומיים כפולים); מטאטא יבש: 0 מועמדים. **אורקל:** סריקה מדווחת 0. 2. **אורקלים בשבבים:** לכל שבב במדף — מגיק מוכר, נוסחת-אורך, sha8 בדגימה. **אורקל:** 0 כשלים; רשימת המגיקים = הרישום ב-MAGNET-DEV. 3. **קוראים:** לכל מהדורה עם קורא — 3 ערכים אקראיים נטענים ב-Range (כותרת, טקסט, sha8). **אורקל:** 0 שגיאות. 4. **סנכרון-יומי:** 24 שעות ללא כשל אמיתי (הפסקות-מ-restart אינן כשל); כל מהדורה עם `sync.last` < 26 שעות. 5. **משימות:** 0 מושבתות-בטעות (רשימת המושבתות ידנית ומוסברת); 0 רפאים. 6. **תיעוד:** MAGNET-DEV + STORAGE + עץ-הפורמט הזה מעודכנים; `pages.json` כולל את כל הדשבורדים. ## מינוסים מראש (מה יישבר ולמה) - md5sums חסר למהדורות סגורות → status=5 עם 404 מתועד, לא "חסר". - שני מופעים כותבים לאותם קבצים (skip/inventory) → הם מבוטלים; **העץ הוא מקור-האמת היחיד**, נכתב ע"י משימה אחת עם `# LOCK: tree_`. - זהות-פריט: ספרייה — (חיבור, שפה, אובייקט), לא כתובת; ויקיפדיה — (db, סוג-דאמפ). - זמן: העץ של ויקיפדיה = 364 בקשות ≈ 3 דקות; ספרייה ≈ 20 שניות; אין סיבה שלא ירוץ יומי. ## דלתות - אחרי שלב 2: "תראה לי מה חסר" — טבלה מהעץ. - אחרי שלב 4: העץ מזין גם את ישיבת-המומחים: איזה דומיין הבא (ויקינתונים truthy) לפי פערי-המקור. - העץ הוא אותו פורמט לכל דומיין עתידי (מוזיקה, משפט, רפואה) — הדומיין הבא מתחיל מהעץ, לא מהטקסט.