מדיניות חיות, כשירות ועדכניות — Local Engine Pilot
1.מטרת המסמך
מסמך זה מגדיר כיצד InvestIQ קובע ומדווח האם Local Engine חי, מחובר, כשיר, מתאושש, או פועל עם מידע שאינו עדכני. המדיניות מפרידה במפורש בין Engine Health לבין Source Data Freshness, בהתאם למסמכים המחייבים.
המטרה המרכזית: לעולם לא להציג מנוע או נתון כ-LIVE כאשר אין ראיות מספקות לכך, ולעולם לא להמשיך capability תלוי-נתונים על בסיס מידע stale כאילו הוא עדכני.
2.מסמכים מחייבים
| מסמך | סטטוס | השפעה |
|---|---|---|
| Target Architecture v0.2 | מאושר | Heartbeat/Freshness canonical monitor; configurable policy defaults |
| Migration Plan v0.2 | מאושר | Shadow First, evidence, rollback/health gates |
| Local Engine Pilot Specification v0.31 | מאושר | LIVE/STALE/DEGRADED/OFFLINE/RECOVERING; 15/60 defaults configurable |
| Canonical Event Schema v0.11 | מאושר | health event, source_data_age_ms, warning, metrics, timestamps |
| Trigger Engine Specification v0.11 | מאושר | Freshness Gate; stale input → UNKNOWN/STALE_DATA; DEGRADED/HOLD behavior |
מסמך זה אינו משנה Event Schema או Trigger Schema. הוא מגדיר policy semantics ו-state transitions שעליהם הרכיבים נשענים.
3.Out-of-Scope
- •אין שינוי Risk/Decision/Execution authority.
- •אין Broker connectivity או AI/LLM.
- •אין hardcoded thresholds בקוד.
- •אין קביעה סופית של SLA מוצר רב-משתמשים; זהו Pilot Policy.
- •אין הגדרה של market-data provider סופי.
- •אין קביעה ש-Engine Health תקין מבטיח ש-Source Data טרי; אלה שני צירים נפרדים.
- •אין automatic fallback ל-Base44 ללא health/freshness check של ה-fallback עצמו.
4.שני צירי כשירות נפרדים
| ציר | שאלה | מקור אמת |
|---|---|---|
| Engine Health | האם ה-Local Engine חי, מתקשר וכשיר לבצע capability מקומית? | heartbeat + local diagnostics + Control Plane observation |
| Source Data Freshness | האם הנתון שעליו capability נשענת עדכני מספיק למדיניות שלו? | source timestamp / receive timestamp / freshness policy |
Engine יכול להיות LIVE כאשר feed מסוים stale; במקרה כזה capability התלויה באותו feed אינה LIVE. מנגד, נתון אחרון יכול להיות צעיר אך Engine שחדל לשלוח heartbeat אינו נחשב LIVE.
5.Engine Health States
| State | הגדרה | התנהגות |
|---|---|---|
| LIVE | Heartbeat מתקבל במסגרת policy וכל בדיקות הכשירות הקריטיות תקינות. | capabilities מורשות לפי milestone/policy. |
| STALE | Heartbeat/communication evidence ישן מעבר לסף STALE אך טרם עבר OFFLINE. | אין להציג כ-LIVE; capabilities רגישות נעצרות/מוגבלות לפי policy. |
| DEGRADED | Engine חי אך רכיב קריטי/משאב/זמן/נתונים אינו כשיר במלואו. | HOLD capability רלוונטית; diagnostics/warning. |
| OFFLINE | אין heartbeat/ראיית חיות מעבר לסף OFFLINE או service ידוע כ-down. | אין capability תלויה ב-Engine; Control Plane מציג OFFLINE. |
| RECOVERING | Engine חזר לאחר STALE/OFFLINE/DEGRADED אך טרם השלים recovery checks/resync. | אין קידום אוטומטי ל-LIVE עד PASS recovery. |
6.Pilot Policy Defaults — configurable, לא hardcoded
| פרמטר | Default תכנוני | משמעות |
|---|---|---|
| heartbeat_interval | Policy-defined; יינעל לפני M1 execution | תדירות heartbeat producer. |
| stale_after | 15 דקות | ברירת מחדל ארכיטקטונית מ-v0.31; configurable/versioned. |
| offline_after | 60 דקות | ברירת מחדל ארכיטקטונית מ-v0.31; configurable/versioned. |
| clock_skew_target | ≤ 5 שניות | יעד תכנון מ-v0.31/v0.11; סף PASS סופי ב-Acceptance Plan. |
| recovery_success_samples | Policy-defined | מספר heartbeat/health samples תקינים לפני LIVE. |
| recovery_min_duration | Policy-defined | משך מינימלי של recovery observation אם נדרש. |
15/60 דקות אינם קבועים בקוד ואינם SLA סופי. הם defaults versioned. ה-heartbeat interval עצמו חייב להיות קצר משמעותית מ-stale_after כדי לאפשר detection אמין; היחס המספרי יינעל ב-Acceptance Test Plan.
7.State Transition Rules
| From | Condition | To |
|---|---|---|
| START/UNKNOWN | service starts + identity/config loaded | RECOVERING |
| RECOVERING | recovery checks PASS לפי policy | LIVE |
| RECOVERING | critical check fails | DEGRADED |
| LIVE | heartbeat evidence age > stale_after | STALE |
| STALE | evidence age > offline_after | OFFLINE |
| STALE | heartbeat חוזר | RECOVERING |
| OFFLINE | heartbeat חוזר | RECOVERING |
| LIVE | critical local check fails | DEGRADED |
| DEGRADED | critical condition clears | RECOVERING |
| ANY | service explicitly stopped/shutdown confirmed | OFFLINE |
| DEGRADED | heartbeat evidence age > stale_after | STALE |
| DEGRADED | heartbeat evidence age > offline_after | OFFLINE |
8.מי קובע את מצב ה-Engine?
קיימים שני observers: Local Engine מדווח health event; Base44/Control Plane מודד באופן עצמאי את גיל ה-heartbeat האחרון. מצב התצוגה/ניהול ב-Control Plane אינו יכול להסתמך רק על state שה-Engine דיווח על עצמו.
| מצב | כלל הכרעה |
|---|---|
| Engine reports LIVE, heartbeat fresh | LIVE אם יתר checks ב-Control Plane תקינים. |
| Engine reports LIVE, heartbeat stale | STALE/OFFLINE לפי גיל evidence — דיווח עצמי אינו גובר. |
| Engine reports DEGRADED | DEGRADED גם אם heartbeat fresh. |
| No heartbeat | STALE/OFFLINE לפי policy. |
| Conflicting evidence | המצב המחמיר יותר גובר עד reconciliation. |
עיקרון: Health הוא evidence-based. במקרה של ספק, אין שדרוג אופטימי של state.
9.Heartbeat Event Requirements
| שדה/מידע | דרישה |
|---|---|
| event_type | health |
| status | חייב להיות עקבי עם payload.health_state לפי Canonical Event Schema v0.11 |
| occurred_at | זמן health observation ב-Engine |
| sent_at | זמן delivery attempt |
| service_uptime_sec | נדרש |
| last_successful_sync_at | נדרש/null לפי schema |
| queue_depth | נדרש |
| storage_state | נדרש |
| clock_skew_ms | נדרש/null אם טרם נמדד |
| reason_code | נדרש כאשר state אינו LIVE |
| recovery_action | לפי צורך |
| policy_version/config_version | נדרשים ב-envelope |
Heartbeat אינו "ping" ריק; הוא snapshot מינימלי של כשירות המנוע.
10.Source Data Freshness Model
| שדה | הגדרה |
|---|---|
| source_timestamp | הזמן שבו מקור הנתונים מציין שהנתון נוצר/עודכן, כאשר זמין ואמין. |
| received_at | הזמן שבו Local Engine קיבל את הנתון. |
| observed_at | הזמן שבו capability השתמשה/בדקה את הנתון. |
| source_data_age_ms | observed_at - source_timestamp כאשר source timestamp אמין; אחרת לפי fallback policy מפורש. |
| freshness_policy_ref | ה-policy שמגדירה את max age לפי source/capability/market state. |
אין להמציא source timestamp. כאשר מקור אינו מספק timestamp אמין, יש לתעד את בסיס החישוב החלופי ולהבדיל אותו מ-source-native timestamp.
11.Freshness Classification
| Classification | משמעות | שימוש |
|---|---|---|
| FRESH | age בתוך הסף המאושר | מותר ל-capability לפי יתר gates. |
| AGING | קרוב לסף; עדיין כשיר לפי policy | visibility/metrics; אין שינוי סמכות. |
| STALE | age מעבר לסף הכשירות | אין שימוש כאילו live; Trigger evaluation → UNKNOWN/STALE_DATA לפי v0.11 Trigger Spec. |
| UNKNOWN | אין timestamp/basis אמין לחישוב | Fail Closed עבור capability שדורשת freshness. |
AGING הוא classification של נתון בלבד ואינו Engine Health state.
12.Freshness Policy Dimensions
סף freshness אינו מספר גלובלי יחיד. הוא versioned policy שיכול להיות שונה לפי:
- •data source / adapter;
- •market (US / IL);
- •market state (open / closed / pre/post אם רלוונטי ומאושר);
- •capability (scan, trigger, display, reconciliation וכו׳);
- •data type (price, volume, indicator, config, news metadata בעתיד);
- •criticality.
כל combination שאינו מכוסה ב-policy מאושר → UNKNOWN, לא default סמוי.
13.Market Closed / Scheduled Silence
היעדר market ticks כאשר השוק סגור אינו הופך אוטומטית Engine ל-STALE. Engine Health נמדד באמצעות heartbeat. Freshness של market data מוערכת לפי market-state-aware policy.
לכן, נתון closing price יכול להיות תקין לתצוגה/ניתוח מסוימים כשהשוק סגור אך לא כשיר ל-capability הדורשת live quote. ה-policy חייב להגדיר זאת במפורש.
14.Clock Synchronization
- • Local Engine נדרש לסנכרון שעון מול מקור זמן אמין של מערכת ההפעלה/NTP-equivalent.
- • clock_skew_ms מדווח ב-health.
- • חריגה מסף מאושר אינה "מתוקנת" על ידי שינוי timestamps באירועים.
- • Clock skew מהותי → DEGRADED/HOLD ל-capabilities התלויות בסדר/זמן עד recovery.
- • יעד 5 שניות הוא planning target בלבד עד נעילת Acceptance Plan.
15.Recovery Protocol
| שלב | בדיקה | תוכן |
|---|---|---|
| R1 | Identity | engine_id/user context/auth תקינים |
| R2 | Config | config_version/policy_version ידועים ומאושרים |
| R3 | Clock | clock skew בתוך policy |
| R4 | Storage | local store/queue readable ו-state recovery תקין |
| R5 | Queue | pending events נטענו ללא silent loss |
| R6 | Sync | Control Plane sync/reconciliation בסיסי הושלם |
| R7 | Data | required sources/capabilities עומדים ב-freshness policy |
| R8 | Samples | מספר/משך health samples תקינים לפי recovery policy |
רק לאחר PASS של כל הבדיקות הנדרשות ל-capability ניתן לעבור RECOVERING → LIVE. Failure שאינו רלוונטי לכל המנוע יכול להשאיר Engine DEGRADED עם HOLD נקודתי במקום OFFLINE.
16.DEGRADED/HOLD Semantics
HOLD במסמך זה הוא תפעולי ומקומי בלבד. הוא אינו Trade HOLD, אינו Decision HOLD ואינו משנה Risk Gate.
| Condition | Health | Local behavior |
|---|---|---|
| Disk full | DEGRADED | עצירת stateful writes/triggers שאינם בטוחים; warning. |
| Clock skew חריג | DEGRADED | עצירת time-sensitive capability. |
| Market feed stale | LIVE או DEGRADED לפי criticality | עצירת capability התלויה ב-feed; אין שימוש כ-live. |
| Config invalid | DEGRADED | אין evaluation תחת config לא ידוע. |
| Base44 unreachable אך local policy תקף | יכול להישאר DEGRADED/STALE לפי policy | queue events; אין הרחבת סמכות. |
17.Control Plane Watchdog
- •Base44 שומר last_received_health_at לכל engine_id.
- •Watchdog מחשב evidence age באופן עצמאי.
- •Watchdog מחיל stale_after/offline_after מה-policy version הפעילה.
- •absence-of-heartbeat מזהה גם crash/panic שבו Engine לא הצליח לשלוח warning.
- •Watchdog אינו מפעיל execution fallback אוטומטי.
- •אם בעתיד מופעל fallback, עליו לעבור health/freshness check משלו לפני שימוש.
18.Event & Warning Behavior
| מצב | Event/תגובה |
|---|---|
| Periodic healthy heartbeat | health status=LIVE |
| Transition to DEGRADED | health + warning עם reason_code/category |
| Control Plane detects STALE | Control Plane state update/audit; Engine event אינו נדרש כי ייתכן שאינו זמין |
| Control Plane detects OFFLINE | Control Plane state update/audit/alert לפי policy |
| Engine returns | health status=RECOVERING |
| Recovery PASS | health status=LIVE |
| Freshness violation | metrics/audit; warning או STALE_DATA trigger לפי policy/Trigger Spec |
State transition משמעותי חייב להיות auditable גם כאשר מקור ה-transition הוא Watchdog ולא event מה-Engine.
19.Metrics / Telemetry
| Metric | מטרה |
|---|---|
| heartbeat_sent_total | Heartbeats שנוצרו |
| heartbeat_accepted_total | Heartbeats שהתקבלו |
| heartbeat_delivery_latency_ms | Latency transport |
| heartbeat_age_ms | גיל evidence בצד Control Plane |
| health_state_transitions_total | מעברים לפי from/to |
| time_in_state_ms | זמן בכל health state |
| recovery_attempts_total | ניסיונות recovery |
| recovery_failures_total | כשלי recovery |
| freshness_checks_total | בדיקות freshness |
| freshness_stale_total | חריגות stale |
| freshness_unknown_total | ללא בסיס זמן אמין |
| clock_skew_ms | סטיית שעון |
המדדים ישולבו ב-metrics_snapshot בהתאם ל-Canonical Event Schema v0.11. הרחבת payload תהיה backward-compatible ומאושרת.
20.Failure Modes
| Failure | Safe behavior |
|---|---|
| Heartbeat delivery fails | queue/retry; Control Plane עלול לעבור STALE לפי evidence age; אין זיוף LIVE. |
| Engine crash/panic | Watchdog מזהה absence-of-heartbeat → STALE/OFFLINE. |
| Clock source unavailable | clock confidence יורד; UNKNOWN/DEGRADED לפי policy. |
| Source timestamp missing | Freshness UNKNOWN אלא אם fallback basis מאושר. |
| Market-data source frozen | STALE data; capability תלויה נעצרת. |
| Control Plane unavailable | local events queued; health self-state אינו מבטל חובת reconciliation. |
| Persistent store corrupt/full | DEGRADED/HOLD; recovery נדרש. |
| Policy missing/invalid | Fail Closed; אין default סמוי. |
21.Restart & Persistence
- •restart אינו מאפס evidence היסטורי ב-Control Plane.
- •Local Engine טוען persisted queue/state ומתחיל ב-RECOVERING, לא LIVE.
- •Trigger state persistence נשלט לפי Trigger Engine v0.11.
- •service_uptime_sec מתאפס לאחר restart; engine_id נשאר יציב.
- •recovery event chain חייב לאפשר לזהות restart מתוכנן מול crash ככל שהראיות מאפשרות.
- •אין להסתיר gap באמצעות backdated heartbeat.
22.Policy Versioning & Runtime Change
- •שינוי heartbeat/freshness policy יוצר version חדש/מאושר.
- •כל health event נושא policy_version/config_version הפעילים.
- •Control Plane חייב לדעת איזו policy חלה בעת קביעת state.
- •שינוי stale/offline/freshness threshold אינו משכתב היסטוריה; הוא חל מ-effective_from.
- •Policy update בזמן RECOVERING מחייב הערכה מחדש תחת הגרסה החדשה לפני LIVE.
- •Policy/config update בזמן LIVE מחייב re-verification תחת הגרסה החדשה. מרגע effective_from אין להמשיך להציג LIVE על סמך verification של הגרסה הישנה בלבד; Engine עובר RECOVERING לצורך checks הרלוונטיים, וחוזר ל-LIVE רק לאחר PASS. שינוי שאינו משפיע על health/freshness יכול להיות מסווג מראש כ-non-health-impacting ורק אז אינו מחייב transition, אך הסיווג חייב להיות versioned/auditable.
- •Rollback policy traceable; אין ערבוב thresholds משתי גרסאות באותה evaluation.
23.דוגמת Policy — תיעודית בלבד
{
"policy_id": "health-freshness-pilot",
"policy_version": "pol-vX",
"effective_from": "2026-09-09T00:00:00.000Z",
"heartbeat": {
"interval_ms": null,
"stale_after_ms": 900000,
"offline_after_ms": 3600000
},
"clock": {
"target_max_skew_ms": 5000
},
"recovery": {
"success_samples": null,
"min_duration_ms": null
},
"freshness_rules": [
{
"source": "configured-source",
"market": "US",
"market_state": "OPEN",
"capability": "trigger",
"data_type": "price",
"fresh_max_age_ms": null,
"aging_after_ms": null
}
]
}900000/3600000 ו-5000 משקפים את defaults/יעדי התכנון שכבר תועדו במסמכים המאושרים; הם אינם hardcoded. ערכי null חייבים להינעל ב-policy/Acceptance Plan לפני execution.
24.Acceptance Categories
| קטגוריה | PASS עקרוני |
|---|---|
| No False LIVE | אין מצב שבו evidence stale/offline מוצג כ-LIVE. |
| State Machine | כל transition חוקי ועובר RECOVERING כנדרש. |
| Independent Watchdog | Control Plane מזהה absence-of-heartbeat ללא תלות בדיווח עצמי. |
| Freshness | stale/unknown data אינו משמש כאילו live. |
| Clock | clock skew מזוהה ומוביל להתנהגות policy. |
| Recovery | restart/reconnect אינו עובר LIVE לפני checks. |
| Persistence | queue/state recovery ללא silent loss. |
| Policy Versioning | כל evaluation ניתנת לשיוך לגרסה. |
| Authority Boundary | אין side effect על Risk/Decision/Trade/Execution. |
| Observability | state transitions/freshness/recovery ניתנים למדידה. |
הספים המספריים הסופיים ו-test cases יינעלו במסמך 5 — Pilot Acceptance Test Plan v0.1.
25.Derivation Trace
| דרישה | מקור |
|---|---|
| LIVE/STALE/DEGRADED/OFFLINE/RECOVERING | Local Engine Pilot v0.31 §9, §14 |
| 15/60 configurable defaults | Target Architecture v0.2; Local Engine Pilot v0.31 §9 |
| source_data_age_ms נפרד מ-Engine Health | Canonical Event Schema v0.11 §5 |
| health payload | Canonical Event Schema v0.11 §7 |
| absence-of-heartbeat / crash risk | Canonical Event Schema v0.11 §20 |
| Freshness Gate | Trigger Engine v0.11 §15 |
| DEGRADED/HOLD | Local Engine Pilot v0.31; Trigger Engine v0.11 §19 |
| Clock skew | Local Engine Pilot v0.31 §14; Canonical Event Schema v0.11 §14 |
| Recovery/restart | Local Engine Pilot v0.31 §14; Trigger Engine v0.11 persistence |
| No fallback unless healthy | Migration Plan v0.2 M8 rollback policy |
New Requirement מפורט במסמך זה: Control Plane Watchdog arbitration, FRESH/AGING/STALE/UNKNOWN data classification, recovery checklist ו-market-state-aware freshness dimensions. אלה נגזרים מהדרישה למדידה אמינה של health/freshness ומובאים לאישור מפורש במסגרת G-HEALTH.
26.שאלות לצוות לפני G-HEALTH
- האם חמשת Engine Health states והמעברים ביניהם מלאים וברורים?
- האם נכון שכל חזרה מ-STALE/OFFLINE/DEGRADED תעבור RECOVERING ללא חריג?
- האם 15/60 דקות נשארים defaults תכנוניים בלבד עד Acceptance Plan, כפי שנקבע?
- איזה heartbeat_interval נדרש לפיילוט כדי לספק detection אמין בלי צריכת Base44 מיותרת?
- האם Control Plane Watchdog צריך להיות הסמכות המחמירה במקרה של סתירה מול self-reported health?
- האם FRESH/AGING/STALE/UNKNOWN מספקים ל-data freshness?
- האם freshness policy dimensions מפורטים מספיק לשוק US/IL ול-market open/closed?
- האם recovery checklist R1-R8 מלא?
- האם מצב Base44 unavailable אך Local Engine חי צריך להיות DEGRADED כברירת מחדל, או להיקבע per-capability/policy כפי שמוצע?
- האם יש blocker לפני כתיבת Pilot Acceptance Test Plan v0.1?
27.Gate G-HEALTH
אישור Heartbeat/Freshness Policy v0.1 נועל את מדיניות החיות, ההתאוששות ועדכניות הנתונים לפיילוט. האישור אינו הרשאת קוד, הרצה או שינוי ב-Base44.
לאחר אישור G-HEALTH, נותר מסמך תכנון אחד בלבד: Pilot Acceptance Test Plan v0.1.
28.החלטה מוצעת
לאשר את InvestIQ Heartbeat/Freshness Policy v0.11 כמדיניות המחייבת לפיילוט, בכפוף להערות הצוות ולנעילת G-HEALTH.
InvestIQ Heartbeat/Freshness Policy v0.11 | Candidate for Approval | 9 September 2026