CH5-003 · DecisionContextSnapshot, מזהי מחזור וקורלציה

גרסה 0.3 · 9.8.2026, 09:05 · המפרט השלישי של CH5 — Snapshots קפואים ושחזור מלא

נכון לעדכון אחרון: 23.10.2026, 20:41

Approved v0.3

Approved for Implementation — Version 0.3 אושר סופית לביצוע

מפרט CH5-003 v0.3 משלב את תשעת תיקוני הסקירה: הפרדה בין Snapshot לבין Risk Gate עדכני לפני Order, הגדרת משמעות מזהים, בנייה אטומית ו-Idempotency, כללי שינוי מחיר באמצע מחזור (TTL/Max Age), Immutability ו-Status מחושב, חישוב Hash קנוני, השלמת קישור לכל ישויות המסלול, תיקוני סיווג (fx_rate ו-market_status ל-Market, CH3-004 בתלויות, Shadow mode), שינוי שם ל-DecisionContextSnapshot, וכללי Rollback מחמירים. המפרט נשען על CH5-002 המאושר ומאפשר שחזור מלא של כל החלטה מתוך תמונת מצב אחת.

עיקרון מחייב: קפוא לניתוח, עדכני לביצוע

כל החלטה ניזונית מתמונת מצב קפואה. סוכנים אינם צורכים נתונים חיים במהלך ניתוח — הם צורכים מתוך Snapshots שנוצרו בתחילתו. אך ה-Snapshot הוא ראיית ההחלטה בלבד — לפני יצירת Order חייב להתבצע Risk Gate עצמאי ועדכני הבודק מחדש מול המצב החי. CIO נשאר Shadow. אין העברת סמכות. אין שליחת Order חי.

0.1 · היסטוריית גרסאות
גרסהתאריך ושעהמהות השינויסטטוס
v0.109.08.2026 08:24טיוטה ראשונה — הגדרת חמשת סוגי Snapshot, מזהי מחזור וקורלציה, קישור מלא של מחזור החלטה, Shadow ו-RollbackReview
v0.209.08.2026 08:35תשעת תיקוני סקירה: הפרדת Snapshot מ-Risk Gate עדכני לפני Order; הגדרת משמעות מזהים (cycle vs trace, retry, late broker event); בנייה אטומית BUILDING→PUBLISHED/FAILED + Idempotency; כללי שינוי מחיר (TTL/Max Age, סף Trade Validity, ביטול מיידי בשינוי מדיניות/Freeze); Immutability ו-Status מחושב; Hash קנוני (sorted JSON, hash_algorithm/version, Content Hash נפרד); השלמת קישור ל-Candidate/Decision/RiskResult/Order/Fill/PositionUpdate/AuditEvent; תיקוני סיווג (fx_rate→Market, market_status per-venue, CH3-004 בתלויות, Shadow mode); שינוי שם DecisionSnapshot→DecisionContextSnapshot; Rollback מחמירReview
v0.309.08.2026 08:48תיקוני עקביות (3 סתירות + טעות הקלדה): (1) מודל עדכון build_status — ארבעת ה-Snapshots המרכיבים Append-Only; DecisionContextSnapshot ניתן לעדכון ב-CAS רק ב-BUILDING, Immutable לאחר PUBLISHED/FAILED; קוראים צורכים Snapshots רק כשה-DecisionContext המקשר PUBLISHED; (2) computed_status מחושב גם מהשוואת policy_hash נוכחי מול Policy Snapshot, מצב Global Freeze ו-SnapshotInvalidationEvent/מחזור מחליף — לא רק created_at+expires_at; (3) החלפת decision_snapshot_id→decision_context_snapshot_id בכל המסמך; (4) תיקון טעות הקלדה "אינו נשמש"→"אינו נשמר"Review
v0.309.08.2026 09:05אישור סופי — Approved for Implementation. כל התיקונים הארכיטקטוניים ותיקוני העקביות יושמו במלואם. המסמך מאושר כמפרט המחייב לביצוע. לא נדרש סבב Review נוסף. לאחר המימוש, הבדיקות ואישור דוח הביצוע ניתן יהיה לסגור את CH5-003 כ-Version 1.0.Approved
1 · בעיה ויעד

כיום אין תמונת מצב קפואה של מחזור החלטה. סוכנים צורכים נתונים חיים שעשויים להשתנות באמצע המחזור, ואין מזהה יחיד החוצה את כל המערכת — Candidate, Analysis, Trade, Order, Fill ו-Position אינם מקושרים למחזור אחיד. כתוצאה, לא ניתן לשחזר מחזור החלטה מבלי לחפש ידנית בלוגים, שני סוכנים באותו מחזור עלולים לצרוך גרסאות שונות של מחיר, ושינוי מחיר או הגדרה באמצע מחזור אינו מתועד כשינוי מהותי. CH5-001 זיהה זאת כפער קריטי: אין DecisionContextSnapshot, אין decision_cycle_id, ואין correlation_id.

להבטיח שכל החלטה ניתנת לשחזור מתוך תמונת מצב קפואה אחת ומזהים החוצים את כל המערכת. בתחילת כל מחזור החלטה ייווצרו: (א) חמישה Snapshots קפואים — Market, Portfolio, Policy, System ו-DecisionContext המקשר ביניהם; (ב) decision_cycle_id יחיד; (ג) correlation_id עקבי. כל ישות במסלול ההחלטה תקושר לשני המזהים, וניתן יהיה לשחזר את המחזור המלא ללא חיפוש ידני ב-Log. CIO Shadow וניתוח ההחלטה יפעלו על ה-Snapshot הקפוא — אך לפני יצירת Order חייב להתבצע Risk Gate עצמאי ועדכני הבודק מחדש מול המצב החי. ה-Snapshot הוא ראיית ההחלטה ואינו מחליף בדיקת סיכון עדכנית לפני ביצוע.

2 · חמשת סוגי ה-Snapshot
Market Snapshot

תמונת מצב קפואה של כל המחירים, נתוני השוק ואיכות הנתונים בתחילת המחזור.

asset_prices[] (asset_id, symbol, price, currency, data_as_of)market_status[] (per market/venue: TASE/NYSE/NASDAQ — open/closed/halt)fx_rate_usd_ils (שער המרה)data_quality_summary (VALID/STALE/MISSING/CONFLICTED)source_ids[]schema_versionexpires_athash
בעלים: Backend / Dataמקור: MarketData (Raw/Canonical מ-CH5-004)
Portfolio Snapshot

תמונת מצב קפואה של כל הפוזיציות, המזומן, החשיפות וההגנות בתחילת המחזור.

positions[] (asset_id, quantity, avg_price, value, pnl)available_cash (מ-Cash Ledger)reserved_cash (פקודות פתוחות)sector_exposure[]allocation_pct[]protections[] (stop_loss, take_profit, is_protected)schema_versionexpires_athash
בעלים: Backend / Portfolioמקור: Portfolio + Cash Ledger (CH5-002)
Policy Snapshot

תמונת מצב קפואה של כל הגדרות המערכת, ספי סיכון, מצב אוטומציה ומצב מסחר.

automation_mode (manual/semi_auto/full_auto)trading_mode (paper/live)max_per_trade_pct, max_single_position_pct, max_sector_exposure_pctdaily_loss_limit_pctauto_execute_thresholdglobal_freeze, freeze_reasontax_rate, tax_methodapproval_ttl_hours, proposal_ttl_hoursprice_drift_thresholdsschema_versionexpires_athash
בעלים: Backend / Systemמקור: SystemSettings (גרסאי מ-CH5-005)
System Snapshot

תמונת מצב קפואה של זהויות ותצורות הסוכנים הפעילים במחזור.

agent_configs[] (agent_id, identity_hash, config_hash, effective_schedule_signature)agent_profiles[] (agent_version, model_profile, activation_policy)broker_connections[] (status, mode)schema_versionexpires_athash
בעלים: Backend / Agentsמקור: AgentConfig + AgentProfile (CH4-001)
DecisionContextSnapshot

ה-Snapshot המקשר — מאחד את ארבעת ה-Snapshots לתמונת מצב אחת של המחזור כולו. שם הישות שונה מ-Decision כדי למנוע בלבול עם ישות Decision שנוצרת לאחר הניתוח.

decision_cycle_id (יחיד, עסקי)correlation_id (Trace עקבי)build_status (BUILDING/PUBLISHED/FAILED)market_snapshot_id, portfolio_snapshot_id, policy_snapshot_id, system_snapshot_idinput_refs[] (מזהי כל קלט)created_at, expires_at (UTC)schema_versioncontent_hash (SHA-256 על ארבעת ה-Snapshot Hashes בסדר קבוע)hash_algorithm, hash_versioncomputed_status (FRESH/STALE/EXPIRED/SUPERSEDED — מחושב, לא נשמר בישות)
בעלים: Backend / Decisionמקור: Snapshot Builder דטרמיניסטי
3 · תכולת המימוש

הגדרת חמישה סוגי Snapshot: Market, Portfolio, Policy, System ו-DecisionContext (המקשר ביניהם).

יצירת decision_cycle_id (מזהה עסקי קבוע למחזור אחד) ו-correlation_id (מזהה Trace החוצה רכיבים ואירועים) בתחילת כל מחזור החלטה.

מחזור החלטה נוצר רק על-ידי Orchestrator או מקור החלטה מוסמך — לא על-ידי refreshPortfolioPrices (רענון מחירים מקבל correlation_id תפעולי ו-data_as_of בלבד).

Retry של אותו מחזור אינו יוצר Snapshots כפולים — משתמש באותו decision_cycle_id ובאותם Snapshots (Idempotency Key). מחזור חדש מקבל מזהים חדשים.

אירוע ברוקר מאוחר שומר את מזהה המחזור המקורי ומקבל קשר ל-Reconciliation Case.

קישור כל ישויות המסלול לשני המזהים: Candidate, AnalysisOutput, Decision, RiskResult, Trade, Order, Fill/BrokerEvent, PositionUpdate, AuditEvent.

שמירת source_refs, data_as_of, schema_version, quality_summary, expires_at ו-content_hash בכל Snapshot.

מניעת ערבוב גרסאות או מחירים בין סוכנים באותו מחזור — כולם צורכים מאותו Market Snapshot.

CIO Shadow וניתוח ההחלטה פועלים על ה-Snapshot הקפוא — אך לפני יצירת Order חייב להתבצע Risk Gate עצמאי ועדכני.

Risk Gate לפני Order בודק מחדש: מזומן והון משוריין, פוזיציות וחשיפות, Global Freeze והגנות, מצב שוק, Trade Validity וסטיית מחיר — מול המצב החי, לא מול ה-Snapshot.

בנייה אטומית של חמשת ה-Snapshots: BUILDING → PUBLISHED או FAILED. Unique Constraint ו-Idempotency Key על decision_cycle_id. Snapshot חלקי אינו מתפרסם.

כללי שינוי מחיר באמצע מחזור: TTL ו-Max Data Age; סף שינוי מהותי לפי Trade Validity; שינוי מדיניות סיכון או Global Freeze מבטל מיידית את כשירות המחזור (SUPERSEDED).

Immutability ומודל עדכון: ארבעת ה-Snapshots המרכיבים (Market, Portfolio, Policy, System) הם Append-Only — אין עדכון לאחר יצירה. DecisionContextSnapshot ניתן לעדכון ב-CAS רק בעודו במצב BUILDING (מעבר build_status: BUILDING→PUBLISHED או BUILDING→FAILED). לאחר מעבר ל-PUBLISHED או FAILED הוא הופך Immutable — אין עדכון נוסף. קוראים (סוכנים, CIO Shadow, Risk Gate) רשאים לצרוך Snapshots רק כאשר ה-DecisionContextSnapshot המקשר הוא PUBLISHED — Snapshot במצב BUILDING או FAILED אינו זמין לקריאה עסקית.

computed_status: status (FRESH/STALE/EXPIRED/SUPERSEDED) הוא מצב מחושב על בסיס: created_at ו-expires_at; השוואת policy_hash הנוכחי לעבר Policy Snapshot; מצב Global Freeze; SnapshotInvalidationEvent או מחזור מחליף שנוצר. הוא אינו נשמר בישות Append-Only — הוא מחושב בזמן קריאה או נרשם כאירוע נפרד (SnapshotInvalidationEvent).

חישוב Hash קנוני: Canonical JSON עם סידור שדות קבוע; סדר קבוע של ארבעת ה-Snapshot Hashes; hash_algorithm ו-hash_version; הפרדה בין Content Hash לבין מזהים וזמנים משתנים; זמנים ב-UTC.

בדיקת תוקף: Snapshot שפג תוקפו חוסם פתיחת פוזיציה והגדלת חשיפה, אך אינו חוסם יציאה, צמצום או פעולת חירום מאושרת.

כלי שחזור: שאילתה לפי decision_cycle_id מחזירה את כל הישויות הקשורות ללא חיפוש ידני ב-Log.

Shadow mode: CH5-003 פועל זמנית על מקורות As-Is עד למימוש CH5-004/005. תיוג data_source=AS_IS; מעבר ל-CANONICAL מחייב Feature Flag נפרד.

Feature Flag להפעלה מדורגת: Shadow (השוואה בלבד) → קריאה קנונית → כיבוי וחזרה למסלול קריאה קודם (לא מסלול שעוקף הגנות).

4 · תוצרים מחייבים
Schemas לכל חמשת סוגי ה-Snapshot (כולל DecisionContextSnapshot עם build_status ו-content_hash).Snapshot Builder דטרמיניסטי — בנייה אטומית BUILDING→PUBLISHED/FAILED, Idempotency Key על decision_cycle_id.Risk Gate עדכני לפני Order — בודק מחדש מזומן, פוזיציות, Freeze, מצב שוק וסטיית מחיר מול המצב החי.Correlation middleware — מזריק decision_cycle_id ו-correlation_id לכל ישות במסלול, כולל late broker events.כלי שחזור — שאילתה לפי decision_cycle_id/correlation_id.Feature Flag ו-Shadow comparison — השוואת תוצאות הנתיב החדש מול הקיים.מנגנון computed_status — חישוב FRESH/STALE/EXPIRED/SUPERSEDED על בסיס: created_at, expires_at, השוואת policy_hash נוכחי מול Policy Snapshot, מצב Global Freeze, SnapshotInvalidationEvent או מחזור מחליף.מנגנון CAS ל-build_status של DecisionContextSnapshot — עדכון מותר רק ב-BUILDING; לאחר PUBLISHED/FAILED הישות Immutable. קוראים צורכים Snapshots רק כש-build_status=PUBLISHED.
5 · מגבלות והגנות

Snapshot שפורסם אינו משתנה — שינוי מהותי מחייב מחזור חדש ו-Snapshot חדש.

ה-Snapshot הוא ראיית ההחלטה ואינו מחליף בדיקת סיכון עדכנית לפני ביצוע (Risk Gate עדכני לפני Order).

CIO נשאר Shadow — אין העברת סמכות ל-CIO או לסוכן כלשהו.

אין Candidate→Order ישיר — כל המסלול נשמר ומתועד.

אין לשמור Secrets, Tokens או נתוני הרשאה בתוך Snapshot.

אין שינוי לוגיקת השקעה או שליחת Order חי במסגרת מפרט זה.

Snapshot אינו מחליף Audit מחייב (AuditEvent, CH5-005) — הוא מקושר אליו.

status (FRESH/STALE/EXPIRED/SUPERSEDED) אינו יכול להשתנות בישות Append-Only — הוא מצב מחושב (created_at, expires_at, policy_hash נוכחי מול Policy Snapshot, Global Freeze, SnapshotInvalidationEvent) או אירוע נפרד.

ארבעת ה-Snapshots המרכיבים הם Append-Only. DecisionContextSnapshot ניתן לעדכון ב-CAS רק ב-BUILDING; לאחר PUBLISHED/FAILED הוא Immutable. קוראים צורכים Snapshots רק כשה-DecisionContext המקשר הוא PUBLISHED.

כיבוי Feature Flag אינו רשאי להחזיר למסלול ישן שעוקף Risk Gate, State Machine או Audit — החזרה למסלול קריאה קודם בלבד; נתוני Snapshot שנכתבו נשמרים.

6 · זרימת מחזור החלטה (Correlation Flow)
שלבפעולהפירוט
1תחילת מחזור (אטומית)Orchestrator או מקור החלטה מוסמך מקצה decision_cycle_id ו-correlation_id. Snapshot Builder בונה ארבעה Snapshots (Market, Portfolio, Policy, System) ו-DecisionContextSnapshot מקשר. מצב: BUILDING → PUBLISHED או FAILED. אם אחד ה-Snapshots נכשל, המחזור כולו נכשל ואינו מתפרסם.
2ניתוח סוכניםכל סוכן צורך מתוך ה-Snapshots הקפואים בלבד — לא מנתונים חיים. AnalysisOutput מקושר ל-decision_cycle_id ו-correlation_id.
3CIO ShadowCIO פועל ב-Shadow בלבד — ניזון מה-Snapshots, אינו מעביר סמכות, אינו שולח Order.
4DecisionDecision נוצר עם frozen snapshot ומקושר ל-decision_cycle_id, correlation_id ו-decision_context_snapshot_id.
5Risk Gate עדכני (לפני Order)לפני יצירת Order חייב להתבצע Risk Gate עצמאי ועדכני הבודק מחדש מול המצב החי: מזומן והון משוריין, פוזיציות וחשיפות, Global Freeze והגנות, מצב שוק, Trade Validity וסטיית מחיר. ה-Snapshot הוא ראיית ההחלטה ואינו מחליף בדיקה זו.
6Trade + OrderTrade ו-Order (כשייווצר) מקושרים לשני המזהים ול-decision_context_snapshot_id. execution_state מתועד. אי-עמידה ב-Risk Gate חוסמת יצירת Order.
7Fill + PositionFill ו-PositionUpdate מקושרים למזהים. אירוע ברוקר מאוחר שומר את מזהה המחזור המקורי ומקבל קשר ל-Reconciliation Case — אינו יוצר מחזור חדש.
8Audit + שחזורכל אירוע AuditEvent מקושר למזהים. שאילתה אחת לפי decision_cycle_id משחזרת את המחזור המלא ללא חיפוש ידני ב-Log.
7 · שינויי סכמה
ישותשינוישדות
MarketSnapshot (Planned)ישות חדשהsnapshot_id, decision_cycle_id, asset_prices[], market_status[] (per venue), fx_rate_usd_ils, data_quality_summary, source_ids[], data_as_of (UTC), expires_at (UTC), schema_version, content_hash, hash_algorithm, hash_version, data_source (AS_IS/CANONICAL)
PortfolioSnapshot (Planned)ישות חדשהsnapshot_id, decision_cycle_id, positions[], available_cash, reserved_cash, sector_exposure[], protections[], data_as_of (UTC), expires_at (UTC), schema_version, content_hash, hash_algorithm, hash_version
PolicySnapshot (Planned)ישות חדשהsnapshot_id, decision_cycle_id, automation_mode, trading_mode, risk_thresholds{}, global_freeze, tax_settings{}, ttl_settings{}, data_as_of (UTC), expires_at (UTC), schema_version, content_hash, hash_algorithm, hash_version
SystemSnapshot (Planned)ישות חדשהsnapshot_id, decision_cycle_id, agent_configs[], agent_profiles[], broker_connections[], data_as_of (UTC), expires_at (UTC), schema_version, content_hash, hash_algorithm, hash_version
DecisionContextSnapshot (Planned)ישות חדשה (מקשרת)snapshot_id, decision_cycle_id (Unique), correlation_id, build_status (BUILDING/PUBLISHED/FAILED), idempotency_key, market_snapshot_id, portfolio_snapshot_id, policy_snapshot_id, system_snapshot_id, input_refs[], created_at (UTC), expires_at (UTC), schema_version, content_hash (על ארבעת ה-Snapshot Hashes בסדר קבוע), hash_algorithm, hash_version
Candidate (Planned)קישורdecision_cycle_id, correlation_id, decision_context_snapshot_id
AnalysisOutput (existing)הוספת שדותdecision_cycle_id (string) — כבר קיים בסכמה, יש לאכוף מילוי; correlation_id (string), decision_context_snapshot_id (string)
Decision (Planned, CH3-005)קישורdecision_cycle_id, correlation_id, decision_context_snapshot_id
RiskResult (Planned)קישורdecision_cycle_id, correlation_id, decision_context_snapshot_id
Trade (existing)הוספת שדותdecision_cycle_id (string), correlation_id (string), decision_context_snapshot_id (string)
Order (Planned, CH3-003)קישורdecision_cycle_id, correlation_id, decision_context_snapshot_id
Fill / BrokerEvent (Planned, CH3-003)קישורdecision_cycle_id (שומר מזהה מחזור מקורי), correlation_id, reconciliation_case_id (קשר ל-Reconciliation)
PositionUpdate (Planned)קישורdecision_cycle_id, correlation_id
AuditEvent (Planned, CH5-005)קישורdecision_cycle_id, correlation_id — כל אירוע Audit מקושר למחזור
8 · מודולים משותפים
קובץתיאור
base44/shared/snapshotBuilder.ts (חדש)buildDecisionCycle(): יוצר ארבעה Snapshots + DecisionContextSnapshot בבנייה אטומית (BUILDING→PUBLISHED/FAILED). מקצה decision_cycle_id ו-correlation_id. Idempotency Key על decision_cycle_id — Retry אינו יוצר עותקים. מחשב content_hash לכל Snapshot: SHA-256 על Canonical JSON (sorted keys), hash_algorithm ו-hash_version, הפרדה בין Content Hash למזהים/זמנים משתנים, זמנים ב-UTC. דטרמיניסטי — אותם קלטים מניבים אותם hash.
base44/shared/correlationMiddleware.ts (חדש)injectCorrelationIds(entity, decisionCycleId, correlationId): מזריק מזהים לכל ישות במסלול. handleLateBrokerEvent(event): שומר מזהה מחזור מקורי ומקשר ל-Reconciliation Case. refreshPortfolioPrices מקבל correlation_id תפעולי ו-data_as_of בלבד — אינו יוצר מחזור החלטה.
base44/shared/riskGateExecution.ts (חדש)executeRiskGateBeforeOrder(decisionCycleId): בודק מחדש מול המצב החי — מזומן והון משוריין, פוזיציות וחשיפות, Global Freeze והגנות, מצב שוק, Trade Validity וסטיית מחיר. ה-Snapshot אינו מחליף בדיקה זו. אי-עמידה חוסמת יצירת Order, אינה חוסמת יציאה/צמצום/חירום.
base44/shared/snapshotRecovery.ts (חדש)recoverDecisionCycle(decisionCycleId): שאילתה המחזירה את כל הישויות הקשורות למחזור — Snapshots, Candidate, Analysis, Decision, RiskResult, Trade, Order, Fill, PositionUpdate, AuditEvent. computeSnapshotStatus(snapshot): מחשב FRESH/STALE/EXPIRED/SUPERSEDED על בסיס created_at, expires_at, השוואת policy_hash נוכחי מול Policy Snapshot, מצב Global Freeze, SnapshotInvalidationEvent או מחזור מחליף — מצב מחושב, לא נשמר בישות Append-Only. assertBuildStatus(snapshot): חוסם קריאה עסקית אם build_status אינו PUBLISHED.
9 · תנאי קבלה

כל מחזור חדש מקבל decision_cycle_id (מזהה עסקי קבוע למחזור אחד) ו-correlation_id (מזהה Trace החוצה רכיבים).

Retry של אותו מחזור אינו יוצר Snapshots כפולים — משתמש באותו decision_cycle_id ובאותם Snapshots.

מחזור חדש מקבל מזהים חדשים.

אירוע ברוקר מאוחר שומר את מזהה המחזור המקורי ומקבל קשר ל-Reconciliation Case.

refreshPortfolioPrices אינו יוצר מחזור החלטה — הוא מקבל correlation_id תפעולי ו-data_as_of בלבד.

בנייה אטומית: חמשת ה-Snapshots נבנים כ-BUILDING → PUBLISHED או FAILED. Snapshot חלקי אינו מתפרסם.

Unique Constraint ו-Idempotency Key על decision_cycle_id — Retry אינו יוצר עותקים.

כל ארבעת ה-Snapshots המרכיבים — Market, Portfolio, Policy ו-System — קיימים או שהמחזור נחסם.

נוצר DecisionContextSnapshot המקשר בין ארבעת ה-Snapshots עם content_hash משלו.

שני סוכנים באותו מחזור צורכים אותה גרסת Market Snapshot — אין ערבוב גרסאות.

לפני יצירת Order מתבצע Risk Gate עצמאי ועדכני הבודק מחדש: מזומן והון משוריין, פוזיציות וחשיפות, Global Freeze והגנות, מצב שוק, Trade Validity וסטיית מחיר — מול המצב החי, לא מול ה-Snapshot.

אי-עמידה ב-Risk Gate חוסם יצירת Order, אך אינה חוסמת יציאה, צמצום או פעולת חירום מאושרת.

שחזור לפי decision_cycle_id מציג את כל הישויות (Candidate, Analysis, Decision, RiskResult, Trade, Order, Fill, PositionUpdate, AuditEvent) ללא חיפוש ידני ב-Log.

TTL ו-Max Data Age מוגדרים לכל סוג Snapshot; חריגה מ- expires_at מסמנת את ה-Snapshot כ-STALE/EXPIRED.

סף שינוי מהותי מוגדר לפי Trade Validity (price_drift_threshold) — חריגה מחייבת בדיקה מחדש, לאו דווקא Snapshot חדש.

שינוי מדיניות סיכון או Global Freeze מבטל מיידית את כשירות המחזור (SUPERSEDED) — נדרש מחזור חדש.

לפני Order מתבצעת בדיקת סטיית מחיר מול השוק העדכני (לא מול ה-Snapshot).

Snapshot חסר או פג תוקף חוסם פתיחת פוזיציה והגדלת חשיפה, אך אינו חוסם יציאה, צמצום או פעולת חירום מאושרת.

status (FRESH/STALE/EXPIRED/SUPERSEDED) הוא מצב מחושב על בסיס: created_at, expires_at, השוואת policy_hash נוכחי מול Policy Snapshot, מצב Global Freeze, SnapshotInvalidationEvent או מחזור מחליף — אינו נשמר בישות Append-Only.

ארבעת ה-Snapshots המרכיבים הם Append-Only. DecisionContextSnapshot ניתן לעדכון ב-CAS רק ב-BUILDING; לאחר PUBLISHED/FAILED הוא Immutable. קוראים צורכים Snapshots רק כשה-DecisionContext המקשר הוא PUBLISHED.

חישוב Hash כולל: Canonical JSON עם סידור שדות קבוע; סדר קבוע של ארבעת ה-Snapshot Hashes; hash_algorithm ו-hash_version; הפרדה בין Content Hash למזהים/זמנים משתנים; זמנים ב-UTC.

Shadow comparison בין הנתיב החדש לקיים עומד בסבילות המאושרת.

CIO Shadow וניתוח ההחלטה פועלים על ה-Snapshot בלבד — לא מנתונים חיים.

אין Secrets או Tokens בשום Snapshot.

כל אירוע Audit ו-Message במחזור מקושר ל-decision_cycle_id ו-correlation_id.

כיבוי Feature Flag אינו רשאי להחזיר למסלול ישן שעוקף Risk Gate, State Machine או Audit — נתוני Snapshot נשמרים, החזרה למסלול קריאה קודם בלבד.

10 · ראיות נדרשות בדוח הביצוע
צילום מחזור מלא — כל חמשת ה-Snapshots + ישויות מקושרות.שאילתת שחזור לפי decision_cycle_id — תוצאה מלאה.בדיקת Idempotency — Retry עם אותו מזהה אינו יוצר עותקים.בדיקת בנייה אטומית — Snapshot חלקי אינו מתפרסם (FAILED).בדיקת Risk Gate עדכני לפני Order — בדיקה מול מצב חי, לא מול Snapshot.בדיקת late broker event — שומר מזהה מחזור מקורי + קשר ל-Reconciliation.בדיקת refreshPortfolioPrices — אינו יוצר מחזור החלטה.בדיקת TTL/Max Age — Snapshot פג תוקף חוסם פתיחה, אינו חוסם יציאה.בדיקת שינוי מדיניות/Freeze — מבטל מיידית כשירות מחזור (SUPERSEDED).בדיקת computed_status — FRESH/STALE/EXPIRED/SUPERSEDED מחושב מ-created_at, expires_at, policy_hash נוכחי מול Policy Snapshot, Global Freeze, SnapshotInvalidationEvent — לא נשמר בישות.בדיקת build_status CAS — עדכון מותר רק ב-BUILDING; PUBLISHED/FAILED Immutable; קוראים צורכים רק כש-PUBLISHED.בדיקת Hash קנוני — אותם קלטים מניבים אותו hash; Content Hash נפרד ממזהים.דוח Shadow — השוואת תוצאות הנתיב החדש מול הקיים.הוכחת Rollback — כיבוי Feature Flag מחזיר למסלול קריאה קודם; נתוני Snapshot נשמרים; אין עקיפת Risk Gate/State Machine/Audit.
11 · Definition of Done

המפרט אושר לפני תחילת ביצוע.

כל סוג Snapshot קיבל Schema, בעלים ומקור נתונים.

כל תנאי קבלה קיבל בדיקה ותוצאה.

לא נוצרה נסיגה בהגנות, ב-State Machine או ב-Idempotency של CH3.

חוזי הסוכנים וה-CIO Shadow של CH4 נשמרו.

CIO נשאר Shadow; אין העברת סמכות.

הופק דוח ביצוע הכולל ראיות, חריגות והמלצת סגירה.

רק לאחר אישור דוח הביצוע משתנה סטטוס המפרט ל-Version 1.0 — Closed.

12 · קבצים מושפעים

base44/entities/MarketSnapshot.jsonc — ישות חדשה (Append-Only) עם market_status per-venue, fx_rate_usd_ils.

base44/entities/PortfolioSnapshot.jsonc — ישות חדשה (Append-Only).

base44/entities/PolicySnapshot.jsonc — ישות חדשה (Append-Only).

base44/entities/SystemSnapshot.jsonc — ישות חדשה (Append-Only, ללא fx_rate — הועבר ל-Market).

base44/entities/DecisionContextSnapshot.jsonc — ישות חדשה מקשרת; ניתנת לעדכון ב-CAS רק במצב BUILDING, ו-Immutable לאחר PUBLISHED או FAILED (עם build_status, content_hash, idempotency_key).

base44/entities/Trade.jsonc — הוספת decision_cycle_id, correlation_id, decision_context_snapshot_id.

base44/entities/AnalysisOutput.jsonc — אכיפת מילוי decision_cycle_id; הוספת correlation_id, decision_context_snapshot_id.

base44/shared/snapshotBuilder.ts (חדש) — בנייה אטומית, Idempotency, hash קנוני.

base44/shared/correlationMiddleware.ts (חדש) — הזרקת מזהים, late broker events, refreshPortfolioPrices correlation_id תפעולי.

base44/shared/riskGateExecution.ts (חדש) — Risk Gate עדכני לפני Order.

base44/shared/snapshotRecovery.ts (חדש) — שאילתת שחזור + computed_status.

base44/functions/runAgentScan/entry.ts — יצירת מחזור (Orchestrator) והזנה מ-Snapshots.

base44/functions/refreshPortfolioPrices/entry.ts — correlation_id תפעולי בלבד, ללא יצירת מחזור.

src/pages/Ch5Spec003.jsx — עמוד מפרט זה (תיעוד).

13 · סדר ביצוע

1. יצירת חמש ישויות Snapshot: ארבעת המרכיבים (Market, Portfolio, Policy, System) — Append-Only. DecisionContextSnapshot — CAS-updatable רק ב-BUILDING, Immutable לאחר PUBLISHED/FAILED. כולל build_status, content_hash, hash_algorithm, hash_version.

2. יצירת base44/shared/snapshotBuilder.ts — בנייה אטומית (BUILDING→PUBLISHED/FAILED), Idempotency Key על decision_cycle_id, hash קנוני.

3. יצירת base44/shared/correlationMiddleware.ts — הזרקת מזהים, טיפול ב-late broker events, refreshPortfolioPrices מקבל correlation_id תפעולי בלבד.

4. יצירת base44/shared/riskGateExecution.ts — Risk Gate עדכני לפני Order (מצב חי, לא Snapshot).

5. יצירת base44/shared/snapshotRecovery.ts — שאילתת שחזור + computed_status.

6. הוספת decision_cycle_id, correlation_id ו-decision_context_snapshot_id ל-Trade, AnalysisOutput.

7. סימון Candidate, Decision, RiskResult, Order, Fill/BrokerEvent, PositionUpdate, AuditEvent כ-Planned/GAP עם קישור למזהים.

8. הזרקת מזהים ב-runAgentScan — יצירת מחזור בתחילת סריקה (Orchestrator).

9. הזרקת correlation_id תפעולי ב-refreshPortfolioPrices — ללא יצירת מחזור החלטה.

10. הזנת סוכנים מה-Snapshots בלבד (לא מנתונים חיים) בשלב הניתוח.

11. Risk Gate עדכני לפני יצירת Order — בדיקה מול מצב חי.

12. Feature Flag: Shadow comparison — השוואת תוצאות הנתיב החדש מול הקיים.

13. בדיקות קבלה: בנייה אטומית, Idempotency, Risk Gate, TTL/Max Age, computed_status, Hash קנוני, late broker event, Rollback מחמיר.

14. הפקת דוח ביצוע CH5-003 עם כל הראיות.

תלות

CH5-002 מאושר (מודל בעלות); פרקים 1–5 הנעולים; CH3 (001/002/003/004/005) ו-CH4 (001) — חוזי סוכנים. CH3-004 נוסף לתלויות בהתאם ל-CH5-002.

מחוץ לתכולה

הפעלת CIO, שינוי לוגיקת השקעה, שליחת Order חי, יצירת AuditEvent (CH5-005), או שינוי חוזי סוכן. CH5-004 (שכבות נתוני שוק) ו-CH5-005 (Audit ו-Lineage) אינם ממומשים — CH5-003 פועל זמנית על מקורות As-Is במצב Shadow עם תיוג data_source=AS_IS; מעבר ל-CANONICAL מחייה Feature Flag נפרד ובדיקת השוואה.

Approved for Implementation — v0.3מפרט שלישי מתוך ששת מפרטי CH5. נשען על CH5-002 המאושר; CH3-004 נוסף לתלויות. פועל זמנית על מקורות As-Is במצב Shadow עד למימוש CH5-004/005. לאחר המימוש, הבדיקות ואישור דוח הביצוע ניתן יהיה לסגור את CH5-003 כ-Version 1.0. המפרט הבא להכנה הוא CH5-004 (שכבות נתוני שוק ואירועים תאגידיים) — כבר נוצר בטיוטת v0.1.