InvestIQ

InvestIQ

ניהול השקעות אוטומטי 1.0

דאשבורדהתראותתיק השקעותחיפוש וניתוח ניירות ערךעסקאותהודעותשווקיםדוח כספים יומישאלות ותשובותשאל את המערכתדוחות מסהגדרותמדריךדף הנחייה למערכת
מצב: PAPER TRADING
info@investiq.co.il054-4860090
InvestIQ — Heartbeat / Freshness Policy

מדיניות חיות, כשירות ועדכניות — Local Engine Pilot

גרסה: v0.11תאריך: 9 בספטמבר 2026סטטוס: Candidate for Approvalמסמך: 4 מתוך 5
Candidate for G-HEALTH — ללא הרשאת קוד, הרצה או שינוי במערכת. מסמך זה מגדיר כיצד InvestIQ קובע ומדווח האם Local Engine חי, מחובר, כשיר, מתאושש, או פועל עם מידע שאינו עדכני. המדיניות מפרידה במפורש בין Engine Health לבין Source Data Freshness. כל 5 הערות הסקירה שולבו.

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הגדרההתנהגות
LIVEHeartbeat מתקבל במסגרת policy וכל בדיקות הכשירות הקריטיות תקינות.capabilities מורשות לפי milestone/policy.
STALEHeartbeat/communication evidence ישן מעבר לסף STALE אך טרם עבר OFFLINE.אין להציג כ-LIVE; capabilities רגישות נעצרות/מוגבלות לפי policy.
DEGRADEDEngine חי אך רכיב קריטי/משאב/זמן/נתונים אינו כשיר במלואו.HOLD capability רלוונטית; diagnostics/warning.
OFFLINEאין heartbeat/ראיית חיות מעבר לסף OFFLINE או service ידוע כ-down.אין capability תלויה ב-Engine; Control Plane מציג OFFLINE.
RECOVERINGEngine חזר לאחר STALE/OFFLINE/DEGRADED אך טרם השלים recovery checks/resync.אין קידום אוטומטי ל-LIVE עד PASS recovery.

6.Pilot Policy Defaults — configurable, לא hardcoded

פרמטרDefault תכנונימשמעות
heartbeat_intervalPolicy-defined; יינעל לפני M1 executionתדירות heartbeat producer.
stale_after15 דקותברירת מחדל ארכיטקטונית מ-v0.31; configurable/versioned.
offline_after60 דקותברירת מחדל ארכיטקטונית מ-v0.31; configurable/versioned.
clock_skew_target≤ 5 שניותיעד תכנון מ-v0.31/v0.11; סף PASS סופי ב-Acceptance Plan.
recovery_success_samplesPolicy-definedמספר heartbeat/health samples תקינים לפני LIVE.
recovery_min_durationPolicy-definedמשך מינימלי של recovery observation אם נדרש.

15/60 דקות אינם קבועים בקוד ואינם SLA סופי. הם defaults versioned. ה-heartbeat interval עצמו חייב להיות קצר משמעותית מ-stale_after כדי לאפשר detection אמין; היחס המספרי יינעל ב-Acceptance Test Plan.

7.State Transition Rules

FromConditionTo
START/UNKNOWNservice starts + identity/config loadedRECOVERING
RECOVERINGrecovery checks PASS לפי policyLIVE
RECOVERINGcritical check failsDEGRADED
LIVEheartbeat evidence age > stale_afterSTALE
STALEevidence age > offline_afterOFFLINE
STALEheartbeat חוזרRECOVERING
OFFLINEheartbeat חוזרRECOVERING
LIVEcritical local check failsDEGRADED
DEGRADEDcritical condition clearsRECOVERING
ANYservice explicitly stopped/shutdown confirmedOFFLINE
DEGRADEDheartbeat evidence age > stale_afterSTALE
DEGRADEDheartbeat evidence age > offline_afterOFFLINE
כלל מחייב: אין מעבר ישיר STALE/OFFLINE/DEGRADED → LIVE. כל חזרה עוברת RECOVERING.

8.מי קובע את מצב ה-Engine?

קיימים שני observers: Local Engine מדווח health event; Base44/Control Plane מודד באופן עצמאי את גיל ה-heartbeat האחרון. מצב התצוגה/ניהול ב-Control Plane אינו יכול להסתמך רק על state שה-Engine דיווח על עצמו.

מצבכלל הכרעה
Engine reports LIVE, heartbeat freshLIVE אם יתר checks ב-Control Plane תקינים.
Engine reports LIVE, heartbeat staleSTALE/OFFLINE לפי גיל evidence — דיווח עצמי אינו גובר.
Engine reports DEGRADEDDEGRADED גם אם heartbeat fresh.
No heartbeatSTALE/OFFLINE לפי policy.
Conflicting evidenceהמצב המחמיר יותר גובר עד reconciliation.

עיקרון: Health הוא evidence-based. במקרה של ספק, אין שדרוג אופטימי של state.

בידוד Engine: כל health state, last_received_health_at, Watchdog timer, recovery state, metrics ו-policy evaluation נשמרים ומחושבים בנפרד לכל engine_id בתוך user context. מצב של Engine אחד אינו משדרג, מוריד או מאפס מצב של Engine אחר. כל aggregate multi-user/multi-engine view הוא תצוגה בלבד ואינו מחליף state per-engine.

9.Heartbeat Event Requirements

שדה/מידעדרישה
event_typehealth
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 מינימלי של כשירות המנוע.

אימות Heartbeat: Heartbeat עם שדה חובה חסר, type לא תקין או cross-validation כושל נדחה לפי Canonical Event Schema v0.11 ואינו נחשב reliable liveness evidence. Engine אינו יכול להיות LIVE על בסיס heartbeat כזה; ה-Watchdog ממשיך לחשב evidence age מה-heartbeat התקין האחרון, ובמקביל נרשם validation/audit signal.

10.Source Data Freshness Model

שדההגדרה
source_timestampהזמן שבו מקור הנתונים מציין שהנתון נוצר/עודכן, כאשר זמין ואמין.
received_atהזמן שבו Local Engine קיבל את הנתון.
observed_atהזמן שבו capability השתמשה/בדקה את הנתון.
source_data_age_msobserved_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משמעותשימוש
FRESHage בתוך הסף המאושרמותר ל-capability לפי יתר gates.
AGINGקרוב לסף; עדיין כשיר לפי policyvisibility/metrics; אין שינוי סמכות.
STALEage מעבר לסף הכשירותאין שימוש כאילו live; Trigger evaluation → UNKNOWN/STALE_DATA לפי v0.11 Trigger Spec.
UNKNOWNאין timestamp/basis אמין לחישובFail Closed עבור capability שדורשת freshness.

AGING הוא classification של נתון בלבד ואינו Engine Health state.

סף AGING חייב להיות policy-defined: AGING threshold חייב להיות מוגדר במפורש ב-freshness policy (למשל aging_after_ms או כלל versioned אחר). אין implicit percentage ואין hardcoded "קרוב לסף". אם policy אינו מגדיר AGING, classification זו אינה מופעלת והמעבר הוא FRESH → STALE לפי הסף המאושר.

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

שלבבדיקהתוכן
R1Identityengine_id/user context/auth תקינים
R2Configconfig_version/policy_version ידועים ומאושרים
R3Clockclock skew בתוך policy
R4Storagelocal store/queue readable ו-state recovery תקין
R5Queuepending events נטענו ללא silent loss
R6SyncControl Plane sync/reconciliation בסיסי הושלם
R7Datarequired sources/capabilities עומדים ב-freshness policy
R8Samplesמספר/משך health samples תקינים לפי recovery policy

רק לאחר PASS של כל הבדיקות הנדרשות ל-capability ניתן לעבור RECOVERING → LIVE. Failure שאינו רלוונטי לכל המנוע יכול להשאיר Engine DEGRADED עם HOLD נקודתי במקום OFFLINE.

16.DEGRADED/HOLD Semantics

HOLD במסמך זה הוא תפעולי ומקומי בלבד. הוא אינו Trade HOLD, אינו Decision HOLD ואינו משנה Risk Gate.

ConditionHealthLocal behavior
Disk fullDEGRADEDעצירת stateful writes/triggers שאינם בטוחים; warning.
Clock skew חריגDEGRADEDעצירת time-sensitive capability.
Market feed staleLIVE או DEGRADED לפי criticalityעצירת capability התלויה ב-feed; אין שימוש כ-live.
Config invalidDEGRADEDאין evaluation תחת config לא ידוע.
Base44 unreachable אך local policy תקףיכול להישאר DEGRADED/STALE לפי policyqueue 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 heartbeathealth status=LIVE
Transition to DEGRADEDhealth + warning עם reason_code/category
Control Plane detects STALEControl Plane state update/audit; Engine event אינו נדרש כי ייתכן שאינו זמין
Control Plane detects OFFLINEControl Plane state update/audit/alert לפי policy
Engine returnshealth status=RECOVERING
Recovery PASShealth status=LIVE
Freshness violationmetrics/audit; warning או STALE_DATA trigger לפי policy/Trigger Spec

State transition משמעותי חייב להיות auditable גם כאשר מקור ה-transition הוא Watchdog ולא event מה-Engine.

19.Metrics / Telemetry

Metricמטרה
heartbeat_sent_totalHeartbeats שנוצרו
heartbeat_accepted_totalHeartbeats שהתקבלו
heartbeat_delivery_latency_msLatency 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

FailureSafe behavior
Heartbeat delivery failsqueue/retry; Control Plane עלול לעבור STALE לפי evidence age; אין זיוף LIVE.
Engine crash/panicWatchdog מזהה absence-of-heartbeat → STALE/OFFLINE.
Clock source unavailableclock confidence יורד; UNKNOWN/DEGRADED לפי policy.
Source timestamp missingFreshness UNKNOWN אלא אם fallback basis מאושר.
Market-data source frozenSTALE data; capability תלויה נעצרת.
Control Plane unavailablelocal events queued; health self-state אינו מבטל חובת reconciliation.
Persistent store corrupt/fullDEGRADED/HOLD; recovery נדרש.
Policy missing/invalidFail 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 WatchdogControl Plane מזהה absence-of-heartbeat ללא תלות בדיווח עצמי.
Freshnessstale/unknown data אינו משמש כאילו live.
Clockclock skew מזוהה ומוביל להתנהגות policy.
Recoveryrestart/reconnect אינו עובר LIVE לפני checks.
Persistencequeue/state recovery ללא silent loss.
Policy Versioningכל evaluation ניתנת לשיוך לגרסה.
Authority Boundaryאין side effect על Risk/Decision/Trade/Execution.
Observabilitystate transitions/freshness/recovery ניתנים למדידה.

הספים המספריים הסופיים ו-test cases יינעלו במסמך 5 — Pilot Acceptance Test Plan v0.1.

25.Derivation Trace

דרישהמקור
LIVE/STALE/DEGRADED/OFFLINE/RECOVERINGLocal Engine Pilot v0.31 §9, §14
15/60 configurable defaultsTarget Architecture v0.2; Local Engine Pilot v0.31 §9
source_data_age_ms נפרד מ-Engine HealthCanonical Event Schema v0.11 §5
health payloadCanonical Event Schema v0.11 §7
absence-of-heartbeat / crash riskCanonical Event Schema v0.11 §20
Freshness GateTrigger Engine v0.11 §15
DEGRADED/HOLDLocal Engine Pilot v0.31; Trigger Engine v0.11 §19
Clock skewLocal Engine Pilot v0.31 §14; Canonical Event Schema v0.11 §14
Recovery/restartLocal Engine Pilot v0.31 §14; Trigger Engine v0.11 persistence
No fallback unless healthyMigration 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

  1. האם חמשת Engine Health states והמעברים ביניהם מלאים וברורים?
  2. האם נכון שכל חזרה מ-STALE/OFFLINE/DEGRADED תעבור RECOVERING ללא חריג?
  3. האם 15/60 דקות נשארים defaults תכנוניים בלבד עד Acceptance Plan, כפי שנקבע?
  4. איזה heartbeat_interval נדרש לפיילוט כדי לספק detection אמין בלי צריכת Base44 מיותרת?
  5. האם Control Plane Watchdog צריך להיות הסמכות המחמירה במקרה של סתירה מול self-reported health?
  6. האם FRESH/AGING/STALE/UNKNOWN מספקים ל-data freshness?
  7. האם freshness policy dimensions מפורטים מספיק לשוק US/IL ול-market open/closed?
  8. האם recovery checklist R1-R8 מלא?
  9. האם מצב Base44 unavailable אך Local Engine חי צריך להיות DEGRADED כברירת מחדל, או להיקבע per-capability/policy כפי שמוצע?
  10. האם יש 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

info@investiq.co.il054-4860090