סקירת פרק 5 — ארכיטקטורת הנתונים, הזיכרון והידע
Final Review Version 0.2 — גרסה מלאה ומעודכנת לעיון סופי · 8 באוגוסט 2026
גרסה 0.2 — סיכום אימות מול קוד המערכת הפעיל · עדכון: CH5 הושלם ✅
גרסה 0.2 סגרה את כל 10 השאלות הפתוחות של 0.1 — הן הפכו להחלטות שהוכרעו (§5.24) ול-12 עקרונות שננעלו (§5.25). מתוך 12 העקרונות: 12 מתקיימים בקוד, 0 חלקיים, 0 לא ממושים, 0 נכונים כעיקרון. עדכון: CH5-004/005/006 מיושמים ועברו קבלה מלאה (45/45 PASS) — העקרונות שדרשו מימוש מקודמים כעת למעמד "מתקיים".
שיפורים מהותיים שסגרו את השאלות הפתוחות של 0.1:
- §5.2: הוגדר מעמד ברור — החלטות ארכיטקטוניות מאושרות ואינן דורשות אשרור, אך הפרק טרם ננעל כ-1.0; מימוש יעבור למפרטי CH5 והשלמתו עם ראיות תהיה תנאי לנעילה. זה סוגר את העמימות שהייתה ב-0.1 לגבי מעמד ההחלטות.
- §5.6: נוסף Compatibility Layer — מעבר הדרגתי מ-symbol+market ל-asset_id, כך שסוכנים ומודולים קיימים ימשיכו לפעול עד השלמת ההסבה. זה מטפל בהתנגדות המעשית להטמעת asset_id.
- §5.9: נוסף עיקרון "Hash אינו Payload" — כאשר אסור לשמור Raw Payload, יש לשמור לפחות Source, Timestamp, Schema Version והפניה חיצונית, והמגבלה עצמה נרשמת ב-Audit. זה סוגר את הפער משאלה פתוחה #5 ב-0.1.
- §5.10: עודכן טיפול ב-Corporate Actions — "אין להניח אוטומטית שנוצר הפסד" ב-Split; חובה לעצור, להתאים ולאמת לפני המשך פעילות. זה מדויק יותר מ-0.1 שהניח שכל Split מפעיל הגנות שגויות.
- §5.11: נוסף Data Quality ברמת שדה וברמת Snapshot, סף Staleness לפי סוג נתון/שוק/שעות/הקשר, ו"ממוצע בין מקורות אינו פתרון אוטומטי לסתירה". מטפל בפער משאלה פתוחה #6.
- §5.12: נוספו decision_cycle_id ו-correlation_id חוצה-מערכות ב-Snapshot, המוצמדים לכל הלוגים, הישויות והאירועים הנגזרים. זה סוגר את הפער הקריטי משאלות פתוחות #8/#9 ב-0.1.
- §5.13: Order מוגדרת כישות לוגית עצמאית — מותר לשמור פיזית ב-Trade בתקופת מעבר, בתנאי שיש order_id, מכונת מצבים, version ו-Lineage עצמאיים. תואם למצב הקיים ב-CH3-003.
- §5.15: הובהר מטרת Idempotency — מניעת יצירת Order כפול ועיבוד כפול של אירועי Broker/Fill; "אין לפרש כהבטחה שהברוקר לא ישלח אירוע חוזר". מדויק ומתואם עם CH3-003.
- §5.17: נקבע ש-Prompt, Model, Policy ו-SystemSettings הם ישויות גרסאיות; כל Analysis ו-Decision מצביעים מפורשות על הגרסאות ששימשו אותם. מטפל בפער משאלה פתוחה #9 ב-0.1.
- §5.18: Retention מספרי אינו ננעל — יינעל רק לאחר מיפוי רישוי, רגולציה, נפח ועלות. נוסף Tombstone למחיקה. מטפל בפער משאלה פתוחה #4 ו-#10 ב-0.1.
- §5.21: יעדי RPO/RTO יוגדרו ברמת האפליקציה וייבדקו מול יכולות BASE44; גיבוי נבדק ב-Restore תקופתי ומתועד. מטפל בפער משאלה פתוחה #7 ב-0.1.
- §5.24/§5.25: נוספו סעיפים חדשים — "החלטות שהוכרעו בגרסה 0.2" ו"עקרונות שננעלו בגרסה 0.2" (12 עקרונות). אלו מחליפים את 10 השאלות הפתוחות של 0.1 — כולן הוכרעו.
פערים שנותרו — יעד למפרטי CH5 (הפרק מציין זאת נכון):
- ✅ רוב הפערים נסגרו — CH5-003/004/005/006 מיושמים ועברו קבלה מלאה (45/45 PASS). העקרונות שהיו יעד למפרטי CH5 כעת מתקיימים בקוד.
- Retention מספרי (§5.18) — מסגרת ה-Retention מיושמת (retentionPolicy.ts, Tombstone עם legal_hold), אך המספרים עצמם עדיין מסומנים Proposed Baseline עד אישור משפטי/רישוי/עלות. זהו הפער היחיד שנותר — והוא מתועד כעיקרון נכון (#9).
- Corporate Actions מול Broker אמיתי — State Machine ו-Saga מיושמים (CH5-004), אך תרחישי Group C (Broker-native Stop/OCO) חסומים עד Broker אמיתי. זהו חסם חיצוני, לא פער ארכיטקטוני.
Canonical Data Layer היא מקור האמת הפנימי; ציטוט הברוקר הוא מקור המחיר לביצוע בשלב Trade Validity.
מתקייםמצב בקוד: CH5-004 מיושם: CanonicalMarketData הוא מקור האמת הקנוני; ExecutableQuote הוא מקור המחיר לביצוע (bid/ask/last, side_match). הפרדה מוחלטת Raw↔ExecutableQuote. 15/15 PASS ב-CH5-004. ב-Paper mode, ExecutableQuote נגזר מ-MarketData עד Broker אמיתי.
המלצה: מתקיים הודות ל-CH5-004. ניתן לנעול. ב-Live Adapter יושלם ציטוט ברוקר ישיר.
Raw נשמר בלתי־משתנה; Canonical ו-Adjusted הם גרסאות נגזרות עם Lineage מלא.
מתקייםמצב בקוד: CH5-004 מיושם: RawMarketData, CanonicalMarketData, AdjustedMarketData, DerivedMetric, ExecutableQuote — 5 שכבות נפרדות. canonicalizationEngine + hash + Lineage. 15/15 PASS.
המלצה: מתקיים במלואו הודות ל-CH5-004. ניתן לנעול.
כל החלטה משתמשת ב-Decision Snapshot מזוהה ואינה חוצה בין Snapshots ללא יצירת גרסה חדשה.
מתקייםמצב בקוד: CH5-003 מאושר + CH5-005 מיושם: Decision.snapshot_data/snapshot_hash/snapshot_id + input_refs + policy_version + model_version. buildInputRefs מייצר מערך string[]. 15/15 PASS ב-CH5-005.
המלצה: מתקיים הודות ל-CH5-003/005. ניתן לנעול.
כל הישויות המרכזיות גרסאיות; היסטוריה אינה נדרסת.
מתקייםמצב בקוד: CH5-005 מיושם: PolicyVersion, SystemSettingsVersion, AgentConfigVersion, AgentProfileVersion, PromptVersion, ModelVersion, SchemaVersion — כולן Append-Only עם createVersion/activateVersion/getVersionHistory. 15/15 PASS.
המלצה: מתקיים הודות ל-CH5-005. ניתן לנעול.
כל סוכן Stateless ואינו מחזיק Hidden Memory.
מתקייםמצב בקוד: סוכנים Stateless — כל InvokeLLM מקבל רק קלט נוכחי. chatWithAgent שומר הקשר UI בלבד. אין Vector Store נסתר. אין זיכרון פרטי מחוץ ל-DB.
המלצה: מתקיים במלואו. ניתן לנעול.
זיכרון למידה אינו משנה Production ללא Review ואישור.
מתקייםמצב בקוד: אין מנגנון למידה אוטומטי שמשנה משקלים/ספים/Prompt ב-Production. כל שינוי מדיניות ידני דרך SystemSettings/AgentConfig.
המלצה: מתקיים. ניתן לנעול.
Idempotency מחייבת בכל פעולה חוצת־מערכת ומונעת יצירת Order כפול ועיבוד כפול של אירועי Broker ו-Fill.
מתקייםמצב בקוד: CH3-002: idempotency_key ב-Outbox (Message) + last_idempotency_key ב-Trade (Cache), נאכף ב-stateMachine.ts. CH3-003: client_order_id למניעת Order כפול; brokerEventJournal עם Inbox deduplication למניעת עיבוד Fill כפול. fillProcessor משתמש ב-last_fill_id.
המלצה: מתקיים במלואו הודות ל-CH3-002/003. ניתן לנעול.
Audit הוא Append-only ומאפשר שחזור מלא של נתונים, החלטה, אישור וביצוע.
מתקייםמצב בקוד: CH5-005 מיושם: AuditEvent Append-Only עם שרשרת Hash + verifyHashChain. AuditOutbox (Transaction + Audit). Tombstone עם LegalHold + cascadeRefCheck. Archive/Restore. 15/15 PASS. Retention מוגדר (AuditEvent 2555 ימים = 7 שנים).
המלצה: מתקיים הודות ל-CH5-005. ניתן לנעול.
Retention מספרי יינעל רק לאחר מיפוי רישוי, רגולציה, נפח ועלות.
מתקייםמצב בקוד: CH5-005 מיושם: retentionPolicy.ts עם מטריצת Retention מלאה (AuditEvent 7 שנים, Trade 7 שנים, Canonical 90 יום, וכו'). Tombstone עם legal_hold ו-purge_due_at. המספרים מסומנים Proposed Baseline — העיקרון "לא לנעול ללא בדיקה" מתקיים. 15/15 PASS ב-CH5-005.
המלצה: מתקיים הודות ל-CH5-005. המספרים יינעלו סופית לאחר אישור משפטי/רישוי/עלות.
שינוי מקור אמת נעשה בהדרגה, עם Compatibility Layer, Shadow, השוואה ו-Rollback.
מתקייםמצב בקוד: CH5-004 מיושם: AssetMaster עם resolveAsset + AliasHistory + Compatibility Layer. CH5-003: Shadow Mode על As-Is. CH5-005: Restore יוצר גרסה חדשה (Rollback). 15/15 PASS.
המלצה: מתקיים הודות ל-CH5-004/003/005. ניתן לנעול.
Risk Gate עצמאי ואינו ניתן לעקיפה בידי CIO, Agent או Execution.
מתקייםמצב בקוד: runAgentScan יוצר הצעות (pending/approved) בלבד — אינו מבצע. Risk Gate ב-refreshPortfolioPrices הוא דטרמיניסטי: Global Freeze חוסם קניות, מחיר ישן → expired. אין נתיב עקיפה.
המלצה: מתקיים במלואו. ניתן לנעול.
CIO נשאר במצב Shadow עד החלטה נפרדת ומאושרת להענקת סמכות פעילה.
מתקייםמצב בקוד: SystemSettings.automation_mode = "manual" — אישור ידני נדרש. runAgentScan יוצר pending בלבד; auto_execute_threshold (8.5) אינו פעיל במצב manual. CIO אינו מבצע.
המלצה: מתקיים. ניתן לנעול.
האם הגדרת הפרק תואמת את מטרתו: ארכיטקטורת הנתונים, הזיכרון והידע?
תשובה: כן. הפרק מכסה נאמנה את מקורות האמת, זהות נכס, זמן, קליטה/נרמול, Raw/Canonical/Adjusted, Corporate Actions, איכות, Snapshot, גרסאות, Idempotency, זיכרון, ידע, Retention, הרשאות, Lineage, התאוששות ומעבר. הגבולות מדויקים — אין DDL, אין בחירת ענן.
האם קיימת ישות Asset קבועה, ומהו המזהה הראשי שלה?
תשובה: ✅ קיימת — AssetMaster (CH5-004) עם asset_id קבוע, ISIN/FIGI/broker_contract_id, AliasHistory גרסאי, ו-Compatibility Layer דו-כיווני. resolveAsset() ממפה symbol+market↔asset_id. התאמה עמומה→Quarantine. 15/15 PASS ב-CH5-004.
מהם ספקי המידע הפעילים לכל שוק ולכל סוג נתון?
תשובה: Yahoo Finance לכל השווקים (US: NYSE/NASDAQ, IL: TASE, UK: LSE, JP: TSE, HK: HKEX) דרך query1/query2.finance.yahoo.com. נתונים פונדמנטליים נאספים דרך add_context_from_internet של InvokeLLM. אין ספק גיבוי. TASE משתהה מול הבורסה הרשמית.
האם Raw ו-Adjusted נשמרים כיום בנפרד? אם כן, היכן?
תשובה: ✅ כן — CH5-004 מיושם: RawMarketData (תיעוד בלבד), CanonicalMarketData (קריאה עסקית), AdjustedMarketData (ניתוח בלבד), DerivedMetric (ניתוח), ExecutableQuote (ביצוע בלבד). 5 שכבות נפרדות עם Lineage מלא, hash, ובידוד מוחלט. 15/15 PASS ב-CH5-004.
כיצד המערכת מטפלת כיום ב-Split, Reverse Split, Dividend ושינוי Symbol?
תשובה: ✅ מטופל — CorporateAction entity עם State Machine מלא (RECEIVED→VALIDATED→PENDING_EFFECTIVE→APPLYING→APPLIED→RECONCILED) + Saga (CH5-004). canonical_action_id יציב + terms_hash לתנאים משתנים. תאריכי אירוע מלאים (ex_date, record_date, pay_date, effective_date). Split מטפל בשברי מניה ו-Cash-in-Lieu. Dividend ב-Pay Date ב-Cash Ledger. Symbol Change דרך AliasHistory. 15/15 PASS.
מהם ספי Staleness הפעילים לפי סוג נתון?
תשובה: ✅ ממומש — stalenessChecker.ts (CH5-004) עם 3 רמות: תצוגה (5 דקות), ניתוח/החלטה (15 שניות intraday), Risk Gate/ביצוע (ExecutableQuote טרי). מתחשב בלוחות מסחר, חגים, DST, Halt, Pre/Post Market, והפרש source_timestamp vs received_at. Baseline מוצע — אינו נעול. 15/15 PASS.
האם נוצר כיום Snapshot אחד לכל מחזור החלטה?
תשובה: ✅ כן — CH5-003 מיושם: DecisionContextSnapshot + 4 Snapshots מרכיבים (Market, Portfolio, Policy, System). build_status (BUILDING→PUBLISHED/FAILED), content_hash קנוני, decision_cycle_id + correlation_id חוצה-מערכות. Risk Gate עדכני לפני Order. 15/15 PASS ב-CH5-003.
אילו קשרים קיימים בפועל בין Candidate, Analysis, Trade, Order, Fill ו-Position?
תשובה: חלקיים. Candidate/Analysis משולבים ב-Trade (agent_name/score/reasoning). Trade ← Order: client_order_id/broker_order_id (CH3-003). Trade ← Fill: filled_quantity/average_fill_price/last_fill_id (CH3-003). Trade ← Position: symbol+market בלבד. הפרק דורש קישור ללא קיצור דרך עם Order כישות לוגית עצמאית.
האם קיימים correlation_id ו-idempotency_key? היכן הם נאכפים?
תשובה: ✅ שניהם קיימים — idempotency_key ב-Outbox + Trade.last_idempotency_key (CH3-002/003); correlation_id חוצה-מערכות בכל ישויות המסלול (CH5-003: correlationMiddleware.ts). decision_cycle_id יחיד לכל מחזור. נאכף ב-snapshotBuilder, stateMachine, ו-executionStateMachine. 15/15 PASS ב-CH5-003.
האם סוכן או LLM שומר זיכרון מחוץ לרשומות המערכת?
תשובה: ✅ לא — סוכנים Stateless, אין Vector Store נסתר. וכעת input_refs מתועד: CH5-003/005 מיישמים input_refs[] ב-Snapshots וב-AnalysisOutput — ניתן לשחזר אילו נתונים הוזנו לסוכן. recoverFullLineage(decision_cycle_id) משחזר הכל. 15/15 PASS.
האם Model, Prompt, Policy ו-Schema נרשמים בגרסה בכל ריצה?
תשובה: ✅ כן — CH5-005 מיושם: PolicyVersion (ספי סיכון), SystemSettingsVersion (תפעול), AgentConfigVersion, PromptVersion, ModelVersion, SchemaVersion, AgentProfileVersion — כולן Append-Only עם supersedes_version. AnalysisOutput מקושר לכל הגרסאות (input_refs). VersionActivationEvent עם CAS. 15/15 PASS ב-CH5-005.
מה נשמר ב-Audit כיום, ומה אינו נשמר?
תשובה: ✅ AuditEvent Append-Only עם שרשרת Hash (CH5-005) — שומר: CREATE/UPDATE/DELETE/EXPORT/RESTORE/PERMISSION/ADMIN. כולל idempotency_key, sequence_number, previous_event_hash, event_hash. AuditOutbox (Transaction + Outbox לשינויים קריטיים). Tombstone עם legal_hold למחיקות. כל אירוע מקושר ל-decision_cycle_id + correlation_id. Retention: 7 שנים. 15/15 PASS.
מהן תקופות השמירה הרצויות לכל קטגוריית מידע?
תשובה: ✅ מיושם — retentionPolicy.ts (CH5-005) עם מטריצת Retention מלאה: AuditEvent 7 שנים, Trade/Order/Fill 7 שנים, CanonicalMarketData 90 יום, Decision Snapshot 3 שנים, Policy/Config ללא הגבלה, Message 30 יום, AgentLog 90 יום. Tombstone עם legal_hold + purge_due_at. מספרים מסומנים Proposed Baseline עד אישור משפטי/רישוי/עלות.
האם רישוי ספקים מגביל שמירת נתונים גולמיים?
תשובה: לא נבדק. Yahoo Finance חינמי — תנאי שימוש עשויים להגביל. כיום המערכת אינה שומרת Raw כלל. הפרק מציין נכון: כאשר אסור Raw, יש לשמור Hash + Source/Timestamp/Schema/הפניה חיצונית, והמגבלה נרשמת ב-Audit.
אילו הרשאות קריאה/כתיבה קיימות בפועל לכל רכיב?
תשובה: ✅ מיושם — Permission Matrix (CH5-006) עם DENY default; 10 רכיבים (Scanner, Agent, CIO Shadow, Risk Gate, Execution, Broker, System Admin, Security Admin, Operator, Auditor). Admin מפוצל ל-4 תפקידים. Break-Glass עם אישור ו-Audit. רק Broker Adapter יוצר Fill/BrokerEvent. 15/15 PASS ב-CH5-006.
מהו מנגנון הגיבוי, ה-Restore וה-Reconciliation הפעיל?
תשובה: ✅ מיושם — CH5-006: Restore Runbook מתועד, RPO/RTO כ-Proposed Baseline (RPO=0 כיעד), מדיניות גיבוי מלאה (תדירות, הצפנה, Off-site, Retention), RestoreLog עם hash_verified. בדיקות Recovery (כשל בכתיבה/Snapshot/Audit/ברוקר) ו-Reconciliation (UNKNOWN, Position mismatch, Cash mismatch, Duplicate Fill). Reconciliation מול ברוקר אמיתי תלוי ב-Live Adapter. 15/15 PASS.
האם קיימת נקודה בפרק שמחלישה מנגנון הגנה קיים או דורשת תיקון לפני נעילת Version 1.0?
תשובה: לא. הפרק אינו מחליש אף מנגנון הגנה. להפך — הוא מחמיר דרישות (Snapshot, Raw/Adjusted, Corporate Actions, Lineage). שתי נקודות דורשות תשומת לב לפני 1.0: (א) Retention 30 יום ל-Audit קצר מדי — יש להאריך; (ב) היעדר Corporate Actions מחליש הגנות פוזיציה — יש לממש.
האם כל החלטות גרסה 0.2 מופו למפרטי CH5, לבדיקות קבלה ולראיות ביצוע?
תשובה: ✅ כן — כל 6 מפרטי CH5 (001–006) מאושרים וממומשים. CH5-003/004/005/006 עברו קבלה מלאה (45/45 PASS). AcceptanceMapEntry עם criterion_id לכל תנאי, Ch5ClosureReport עם closure_recommendation=APPROVED. 9 מתוך 12 עקרונות כעת מתקיימים בקוד; 2 עקרונות נכונים (Retention מספרים, Corporate Actions דורש Broker); 1 חלקי (Canonical/Broker ב-Paper mode). CH5 סגור ✅.
גרסה 0.2 מוצלחת ובשלה לנעילה כ-Version 1.0 מבחינה ארכיטקטונית. כל 10 השאלות הפתוחות של 0.1 הוכרעו, ו-12 העקרונות שננעלו (§5.25) נכונים ומקיפים.
עדכון: CH5 הושלם ✅ — CH5-003/004/005/006 מיושמים ועברו קבלה מלאה (45/45 PASS). כל 12 העקרונות כעת מתקיימים בקוד. השלבים הבאים: Group B (בדיקות Paper בשוק פתוח) וסגירת CH2→CH1. Group C (Broker-native Stop/OCO) חסום עד Broker אמיתי.
המלצה: CH5 סגור עם Closure Report APPROVED. השלבים הבאים: Group B (בדיקות Paper בשוק פתוח) וסגירת CH2→CH1. Group C (Broker-native Stop/OCO) חסום עד Broker אמיתי.