InvestIQ

InvestIQ

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

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

חוזה אירועים קנוני בין Local Engine ל-Base44

גרסה: v0.11תאריך: 9 בספטמבר 2026סטטוס: Candidate for Approvalמסמך: 2 מתוך 5
Candidate for G-EVENT — ללא הרשאת קוד, הרצה או שינוי במערכת. v0.11 נגזר ישירות מ-Local Engine Pilot Specification v0.31 המאושר. אישור נועל את החוזה הלוגי שממנו ייגזר Trigger Engine Specification v0.1.

1. מטרת המסמך

מסמך זה מגדיר חוזה אירועים קנוני, versioned ו-idempotent לתקשורת בין InvestIQ Local Engine לבין Base44. הוא נגזר ישירות מ-Local Engine Pilot Specification v0.31 המאושר, ואינו משנה את גבולות הסמכות שנקבעו בו.

המטרה היא למנוע payloads נקודתיים או שונים בין רכיבים. כל event הנשלח מה-Local Engine ל-Control Plane חייב לעבור דרך Envelope אחיד, validation אחיד וכללי compatibility אחידים.

2. סמכות וגבולות

  • • Base44 נשאר Control Plane ו-System of Record.
  • • Event הוא דיווח/עובדה תפעולית; הוא אינו מעניק סמכות ל-Risk, CIO/Decision או Execution.
  • • Trigger event אינו Candidate, Decision או Trade.
  • • אין AI/LLM ואין Broker integration במסגרת M1-M3.
  • • אין credentials, tokens או secrets בתוך event.
  • • אין hardcoded thresholds בתוך schema; threshold/policy values מגיעים מ-configuration/policy versioned.
  • • כל הרחבה של event type, enum מחייב או breaking field מחייבת versioning ואישור לפי כללי מסמך זה.

3. עקרונות החוזה

עיקרוןכלל מחייב
Canonical Envelopeכל event משתמש באותה מעטפת ליבה; ההבדל בין event types נמצא ב-payload.
Schema Firstאין producer חדש לפני שקיים schema מאושר עבור event type.
Versionedschema_version נמצא בכל event; שינוי breaking יוצר major version חדש.
Idempotentidempotency_key מחייב; צרכן חייב להיות מסוגל לקבל duplicate ללא duplicate side effect.
Immutable Eventevent שנשלח אינו נערך; תיקון/עדכון הוא event חדש עם correlation/reason מתאים.
UTC Timeכל timestamps מועברים ב-UTC ISO-8601; זמן מקור נשמר בנפרד כאשר רלוונטי.
Traceableevent_id, correlation_id, engine_id, user_id, engine_version ו-policy/config versions מאפשרים audit.
Fail Closedevent לא תקין אינו מקודם כאילו התקבל בהצלחה; הוא נרשם/נכנס למסלול error/retry.

4. Canonical Event Envelope v1

שדהטיפוסחובההערה
event_idUUID/stringכןמזהה ייחודי immutable לאירוע יחיד.
event_typeenum/stringכןסוג האירוע לפי Event Registry במסמך זה.
schema_versionstringכןגרסת schema, בפורמט major.minor; v0.1 מגדיר envelope schema 1.0.
user_idstringכןמזהה פנימי של הקשר המשתמש; לא שם/דוא"ל.
engine_idstringכןמזהה Local Engine חד-משמעי.
sourcestringכןהרכיב המפיק, לדוגמה local_engine, market_monitor, trigger_engine.
occurred_attimestamp UTCכןמועד התרחשות העובדה/האירוע.
sent_attimestamp UTCכןמועד ניסיון השליחה הנוכחי. אינו מחליף occurred_at.
correlation_idstringכןקישור אירועים מאותו flow/scan/config cycle.
idempotency_keystringכןמפתח dedup יציב לאותה עובדה לוגית.
severityenumכןINFO / WARNING / ERROR / CRITICAL.
statusstring/enumכןסטטוס דומייני של event_type, לא סטטוס delivery/processing. כאשר קיים שדה מצב מקביל ב-payload, הערכים חייבים להיות עקביים; חוסר התאמה → REJECT_SCHEMA.
source_data_age_msinteger/nullמותנהגיל נתון המקור במילישניות בזמן occurred_at; null כאשר אין מקור נתונים חיצוני.
engine_versionstringכןגרסת build/runtime שהפיקה את האירוע.
config_versionstring/nullכןגרסת configuration הפעילה; null רק אם האירוע נוצר לפני טעינת config.
policy_versionstring/nullכןגרסת policy הרלוונטית; null אם event אינו תלוי policy.
payloadobjectכןנתוני event type בלבד; חייבים לעבור validation.

5. הבחנה בין Freshness של נתון לבין Health של Engine

בהתאם ל-v0.31, קיימים שני מושגים שונים ואסור לערבב ביניהם:

מושגשדה/מקורמשמעות
Source Data Freshnesssource_data_age_msכמה ישן נתון המקור שעליו מבוסס event מסוים. זהו מאפיין per-event.
Engine Freshness/Healthhealth payload + Heartbeat/Freshness Policyמצב המנוע כמערכת: LIVE / STALE / DEGRADED / OFFLINE / RECOVERING.

אין להסיק Engine Health רק מ-source_data_age_ms, ואין להשתמש ב-health state במקום גיל נתון המקור.

6. Event Registry v0.1

event_typeשלב ראשוןמטרהAuthority
healthM1Heartbeat/health/recovery state של Local Engine.Telemetry בלבד
config_syncedM1אישור config/policy sync וגרסאות פעילות.Acknowledgement בלבד
metrics_snapshotM1מדדי reliability/latency/queue/cost counters.Telemetry בלבד
warningM1בעיה תפעולית/איכות נתונים/משאב מקומי.Alert בלבד
scan_summaryM2סיכום deterministic monitoring/scan ב-Shadow.Observation בלבד
trigger_firedM3תיעוד trigger קנוני שהופעל לפי policy.אינו Candidate/Decision/Trade

הוספת trigger_fired ל-v0.1 נועדה לאפשר למסמך הבא — Trigger Engine Specification — להישען על חוזה קנוני מאושר, בלי להמציא event חדש מחוץ ל-schema.

7. Event Type: health

שדהטיפוסחובההערה
health_stateenumכןLIVE / STALE / DEGRADED / OFFLINE / RECOVERING
service_uptime_secintegerכןזמן פעילות service מאז start/restart.
last_successful_sync_attimestamp/nullכןsync מוצלח אחרון עם Base44.
queue_depthintegerכןמספר events ממתינים מקומית.
storage_stateenumכןOK / WARNING / FULL / ERROR
clock_skew_msinteger/nullכןסטיית שעון שנמדדה; null אם טרם נמדדה.
reason_codestring/nullכןקוד סיבה כאשר state אינו LIVE.
recovery_actionstring/nullלאפעולת recovery נוכחית/אחרונה.

הספים המדויקים ל-LIVE/STALE/OFFLINE/DEGRADED אינם מוגדרים כאן; הם יוגדרו ב-Heartbeat/Freshness Policy v0.1 ויישארו configurable/versioned.

8. Event Type: config_synced

שדהטיפוסחובההערה
requested_config_versionstringכןגרסה שביקש Control Plane להחיל.
applied_config_versionstring/nullכןגרסה שהוחלה בפועל.
applied_policy_versionstring/nullכןpolicy version פעילה לאחר sync.
sync_resultenumכןAPPLIED / NO_CHANGE / REJECTED / ERROR
validation_errorsarrayכןריק בהצלחה; קודי validation ללא secrets.
settings_digeststringכןdigest/hash של ההגדרות הפעילות לצורכי audit; לא כולל secrets.

SystemSettings הקיימים ב-Base44 הם מקור configuration/policy בפיילוט. Local Engine אינו רשאי להחליף threshold מוגדר ב-SystemSettings בערך hardcoded.

9. Event Type: metrics_snapshot

שדהטיפוסחובההערה
window_starttimestamp UTCכןתחילת חלון המדידה.
window_endtimestamp UTCכןסוף חלון המדידה.
events_createdintegerכןמספר events שנוצרו.
events_sentintegerכןמספר delivery attempts ראשוניים בחלון; retries אינם נכללים כאן ונמדדים ב-events_retried.
events_acceptedintegerכןמספר delivery attempts שקיבלו ACCEPTED; יחד עם events_rejected חייב להשתוות ל-events_sent עבור attempts שהושלמו בחלון.
events_retriedintegerכןRetry attempts נמדדים בנפרד ואינם נכללים ב-events_sent.
events_rejectedintegerכןמספר delivery attempts שקיבלו REJECTED; events_accepted + events_rejected = events_sent עבור attempts שהושלמו בחלון.
queue_depth_currentintegerכןעומק queue בזמן snapshot.
queue_depth_maxintegerכןמקסימום בחלון.
heartbeat_latency_msnumber/nullכןlatency נמדד; null אם לא ניתן למדוד.
event_delivery_latency_ms_p50number/nullלאמדד latency אופציונלי בשלב M1.
event_delivery_latency_ms_p95number/nullלאמדד latency אופציונלי בשלב M1.
base44_calls_countintegerכןמספר calls הניתנים לייחוס ל-Engine.
base44_credit_unitsnumber/nullכןחייב להיות null אלא אם מקור המדידה אומת מול Base44 Dashboard/מקור חשבונאי מאושר. ערך לא מאומת אסור באירוע.

Cost/Credit metering ב-M1 הוא measurement בלבד. הוא אינו משנה תדירות, איכות או safety כדי לעמוד במכסה.

10. Event Type: warning

שדהטיפוסחובההערה
warning_codestringכןקוד יציב ומכונה-קריא.
categoryenumכןSTORAGE / CLOCK / NETWORK / CONFIG / DATA / QUEUE / SERVICE / SECURITY / OTHER
messagestringכןתיאור תפעולי קצר ללא secret/PII.
componentstringכןהרכיב שזיהה את הבעיה.
first_detected_attimestamp UTCכןזיהוי ראשון.
current_occurrence_countintegerכןמספר הופעות תחת אותו correlation/dedup context.
action_requiredbooleanכןהאם נדרשת התערבות.
hold_requiredbooleanכןtrue = Local Engine עצר capability רלוונטית. אינו מחייב action_required=true; עצירה אוטומטית שמתאוששת לבד יכולה להיות hold_required=true, action_required=false.

warning אינו משנה Risk/Decision/Execution state. HOLD כאן הוא תפעולי ל-capability המקומית בלבד, בהתאם לסמכות שהוגדרה ב-v0.31.

11. Event Type: scan_summary

שדהטיפוסחובההערה
scan_idstringכןמזהה scan cycle.
marketenum/stringכןUS / IL או market code מאושר.
modeenumכןSHADOW / PRODUCTION / ENFORCED. ב-M2 הערך המותר היחיד הוא SHADOW; הערכים האחרים שמורים לשלבים עתידיים לאחר Gate מפורש.
started_attimestamp UTCכןתחילת scan.
completed_attimestamp UTCכןסיום scan.
assets_evaluatedintegerכןמספר נכסים שנבדקו.
checks_executedintegerכןמספר deterministic checks.
exceptions_detectedintegerכןחריגים שזוהו.
data_sourcestringכןAdapter/source בפועל.
reference_sourcestringכןמקור הייחוס המאושר להשוואה.
freshness_violationsintegerכןמספר חריגות freshness.
resultenumכןCOMPLETED / PARTIAL / FAILED

scan_summary אינו מכיל Candidate/Decision/Trade ואינו מפעיל Execution. פרטי asset-level חריגים, אם יידרשו, יוגדרו בהרחבת schema מאושרת ולא כ-payload אד-הוק.

12. Event Type: trigger_fired

שדהטיפוסחובההערה
trigger_idstringכןמזהה trigger definition.
trigger_instance_idstringכןמזהה הפעלה יחידה.
trigger_categoryenumכןMARKET / NEWS / STATE_RISK / OPERATIONAL — בהתאם ל-scope milestone.
reason_codestringכןסיבה מכונה-קריאה.
reason_textstringכןהסבר תפעולי קצר.
policy_versionstringכןגרסת policy שהפעילה את trigger; חייב להתאים גם ל-envelope.
threshold_snapshotobjectכןהערכים הרלוונטיים שהיו בתוקף; ללא hardcoding.
observed_valuesobjectכןהערכים שנצפו והובילו להפעלה.
priorityenumכןLOW / NORMAL / HIGH / CRITICAL
dedup_keystringכןמפתח dedup ברמת trigger.
cooldown_untiltimestamp/nullכןמועד סיום cooldown אם קיים.

trigger_fired הוא עובדה תפעולית בלבד. אין בו field מסוג action=BUY/SELL, order, trade_state או decision authority.

13. Idempotency, Dedup ו-Retry

  • • event_id חדש נוצר פעם אחת עבור event logical instance ונשמר לאורך retry.
  • • idempotency_key נשאר זהה בכל retry של אותה עובדה לוגית.
  • • sent_at רשאי להשתנות בכל ניסיון שליחה; occurred_at אינו משתנה.
  • • Base44/consumer חייב לשמור dedup record לפי idempotency_key או event_id בהתאם ל-event type.
  • • duplicate delivery חייב להחזיר acknowledgement idempotent ולא ליצור duplicate side effect.
  • • retry policy עצמה אינה מוגדרת במסמך schema; היא תישען על M1 reliability rules ו-Acceptance Plan.
  • • event שנדחה בגלל schema violation אינו "מתוקן במקום"; producer יוצר event חדש רק לאחר תיקון המקור, עם trace/correlation מתאים.

14. Timestamp, Ordering ו-Clock Skew

  • • כל timestamp הוא UTC ISO-8601 עם millisecond precision לפחות.
  • • occurred_at מייצג זמן עובדה; sent_at מייצג זמן transport.
  • • סדר arrival אינו מבטיח סדר occurrence. consumer חייב להשתמש ב-occurred_at + correlation/context ולא ב-arrival order בלבד.
  • • clock_skew_ms נמדד ומדווח ב-health. חריגה מהסף העתידי תוביל ל-DEGRADED/HOLD לפי Heartbeat/Freshness Policy.
  • • יעד התכנון הראשוני של 5 שניות נשאר non-binding עד Acceptance Test Plan.

15. Validation Rules

כללתגובה
Missing required envelope fieldREJECT_SCHEMA; אין קידום האירוע.
Unknown event_typeREJECT_SCHEMA אלא אם registry/version מאושר תומך בו.
Unsupported major schema versionREJECT_VERSION.
Invalid enum/value/typeREJECT_SCHEMA.
Secret/credential detectedREJECT_SECURITY + warning/audit ללא הדפסת secret.
Duplicate idempotency keyACK_DUPLICATE; ללא side effect נוסף.
Stale source dataה-event יכול להתקבל כעובדה אך יסומן/יטופל לפי policy; אין הצגה כ-live בניגוד ל-Freshness Policy.
Envelope status vs payload state mismatchREJECT_SCHEMA. status הוא דומייני וחייב להיות עקבי עם שדה המצב המקביל ב-payload, כאשר קיים.
trigger_fired policy_version mismatchREJECT_SCHEMA אם payload.policy_version שונה מ-envelope.policy_version.
Event/payload exceeds size limitREJECT_SIZE. יעד v0.11: serialized event כולל envelope ≤ 256KB; שינוי limit הוא configuration/versioned policy ולא שינוי אד-הוק.

16. Versioning & Compatibility

  • • schema_version בפורמט major.minor. גרסת envelope הראשונה המאושרת תהיה 1.0.
  • • Minor change מותר רק כאשר הוא backward-compatible, כגון optional field חדש.
  • • Major change נדרש למחיקה/שינוי משמעות/שינוי type/הפיכת optional ל-required או שינוי enum שאינו backward-compatible.
  • • Producer ו-consumer חייבים לדווח supported major versions.
  • • במהלך rollout ניתן לתמוך זמנית ביותר מ-major אחד; deprecation דורש חלון מעבר ותיעוד.
  • • אין silent coercion של type לא תקין.

17. Security & Privacy

  • • אין API keys, passwords, access tokens, refresh tokens, broker credentials או OS secrets באירועים.
  • • user_id הוא internal identifier; אין צורך בשם, אימייל או מידע אישי לצורך schema זה.
  • • settings_digest אינו כולל secret values.
  • • payload logging כפוף ל-redaction rules; raw secret לעולם אינו נרשם.
  • • Transport נדרש להיות TLS בהתאם ל-v0.31.
  • • Authentication של Engine Identity הוא דרישת M1 אך credential format אינו חלק מה-event schema.
מגבלת גודל: serialized event מלא, כולל envelope ו-payload, לא יעלה על 256KB בפיילוט. זהו limit תפעולי ראשוני שנועד להגן על queue/storage/transport; שינויו מחייב configuration/versioning ואישור במסגרת Acceptance Plan.

18. Delivery Acknowledgement — חוזה מינימלי

שדה responseטיפוסמשמעות
event_idstringה-event שאליו מתייחס ה-ack.
receipt_statusenumACCEPTED / DUPLICATE / REJECTED
received_attimestamp UTCמועד קבלה ב-Control Plane.
schema_versionstringהגרסה שנבדקה.
error_codestring/nullקוד rejection אם קיים.
retryablebooleanהאם producer רשאי לנסות שוב ללא שינוי event content.

HTTP/API transport details, endpoint paths ו-auth headers אינם ננעלים במסמך זה; הם יוגדרו ב-M1 implementation contract. החוזה הלוגי של acknowledgement כן ננעל כאן.

כלל retry: כאשר receipt_status=REJECTED ו-retryable=false, אין לשלוח שוב את אותו event ללא שינוי. אם לאחר תיקון המקור נוצרת עובדה תקינה חדשה, producer ייצור event_id חדש, ישמור correlation_id מתאים לצורך trace, ויחיל idempotency_key לפי העובדה הלוגית החדשה.

19. דוגמאות קנוניות

דוגמה 1 — health event:

{
  "event_id": "evt-uuid-001",
  "event_type": "health",
  "schema_version": "1.0",
  "user_id": "usr-internal-01",
  "engine_id": "eng-01",
  "source": "local_engine",
  "occurred_at": "2026-09-09T07:30:00.000Z",
  "sent_at": "2026-09-09T07:30:00.120Z",
  "correlation_id": "health-20260909-0730",
  "idempotency_key": "eng-01:health:20260909T073000Z",
  "severity": "INFO",
  "status": "LIVE",
  "source_data_age_ms": null,
  "engine_version": "pilot-m1-build",
  "config_version": "cfg-vX",
  "policy_version": "pol-vX",
  "payload": {
    "health_state": "LIVE",
    "service_uptime_sec": 3600,
    "last_successful_sync_at": "2026-09-09T07:29:58.000Z",
    "queue_depth": 0,
    "storage_state": "OK",
    "clock_skew_ms": 120,
    "reason_code": null,
    "recovery_action": null
  }
}

דוגמה 2 — trigger_fired event:

{
  "event_id": "evt-uuid-002",
  "event_type": "trigger_fired",
  "schema_version": "1.0",
  "user_id": "usr-internal-01",
  "engine_id": "eng-01",
  "source": "trigger_engine",
  "occurred_at": "2026-09-09T08:00:00.000Z",
  "sent_at": "2026-09-09T08:00:00.080Z",
  "correlation_id": "scan-cycle-example",
  "idempotency_key": "trigger-example-instance",
  "severity": "WARNING",
  "status": "FIRED",
  "source_data_age_ms": 1500,
  "engine_version": "pilot-m3-build",
  "config_version": "cfg-vX",
  "policy_version": "pol-vX",
  "payload": {
    "trigger_id": "trg-example",
    "trigger_instance_id": "tri-example",
    "trigger_category": "MARKET",
    "reason_code": "THRESHOLD_CROSSED",
    "reason_text": "Example only",
    "policy_version": "pol-vX",
    "threshold_snapshot": { "example_threshold": "configured-value" },
    "observed_values": { "example_value": "observed-value" },
    "priority": "NORMAL",
    "dedup_key": "dedup-example",
    "cooldown_until": null
  }
}

הערה: cfg-vX / pol-vX / pilot-m1-build הם placeholders תיעודיים בלבד; אין במסמך זה קביעה של גרסה תפעולית אמיתית. הדוגמה אינה מגדירה threshold, symbol, BUY/SELL או פעולה מסחרית; היא מדגימה את מבנה החוזה בלבד.

20. Error/Failure Events

v0.11 משתמש ב-warning + health לצורך failure reporting ואינו מוסיף event_type נפרד בשם error. הסיבה: למנוע כפילות בין severity לבין event type בשלב M1.

סיכון מתועד: crash/panic עלול להתרחש לפני שהמנוע מספיק לשלוח warning/health; לכן זיהוי absence-of-heartbeat חייב להתבצע בצד Control Plane לפי Heartbeat/Freshness Policy. אם במהלך M1 יתברר שנדרש lifecycle נפרד לשגיאות, הדבר יובא כ-schema change לאישור ולא יתווסף אד-הוק.

21. Derivation Trace

דרישה ב-Canonical Event Schemaמקור מחייב
Canonical, versioned, idempotent eventsLocal Engine Pilot Specification v0.31 §4, §7, §8
Base44 = System of Recordv0.31 §1, §2, §5
Envelope core fieldsv0.31 §8
source_data_age נפרד מ-engine freshnessv0.31 §8-9
health states כולל DEGRADEDv0.31 §9, §14
config_synced + metrics_snapshotv0.31 §8; תיקוני צוות שננעלו ב-v0.31
Cost/Credit countersv0.31 §7
trigger_fired אינו Decision/Tradev0.31 §10; נדרש כדי לאפשר את המסמך הבא
No secrets in eventsv0.31 §15
Clock skew / storage failurev0.31 §14
No AI/Broker in M1-M3v0.31 §12-13

New Requirement המסומן במסמך זה: acknowledgement logical contract ו-schema compatibility rules מפורטים. הם נגזרים פונקציונלית מדרישות reliability/idempotency/versioning של v0.31, אך לא פורטו שם ברמת שדות; לכן הם מובאים כאן לאישור מפורש כחלק מ-G-EVENT.

22. שאלות לצוות לפני G-EVENT

  1. האם Envelope fields מלאים ומינימליים, או שיש שדה חובה נוסף שחסר לפני M1?
  2. האם source_data_age_ms במילישניות הוא היחידה הנכונה, או להעדיף timestamp של source ולחשב age בצרכן?
  3. האם event types: health, config_synced, metrics_snapshot, warning, scan_summary, trigger_fired מספיקים ל-M1-M3?
  4. האם נכון להשאיר error כ-severity/health-warning ולא ליצור event_type נפרד בשלב זה?
  5. האם ACK logical contract צריך להינעל כבר ב-v0.1 כפי שמוצע?
  6. האם user_id + engine_id מספיקים isolation/audit לפיילוט יחיד בלי להוסיף account_id בשלב M1?
  7. האם metrics_snapshot צריך לכלול base44_credit_units nullable, או להסתפק ב-base44_calls_count עד שקיימת מדידת credits אמינה?
  8. האם threshold_snapshot ב-trigger_fired צריך להכיל רק ערכים רלוונטיים ל-trigger ולא policy מלא? ההמלצה במסמך: רק הערכים הרלוונטיים.
  9. האם קיימת דרישת retention/audit ב-Base44 שיש לנעול כבר ברמת schema, או להשאיר ל-M1 implementation/Acceptance Plan?
  10. האם יש blocker שמונע מעבר ל-Trigger Engine Specification v0.1 לאחר אישור מסמך זה?

23. Gate G-EVENT

אישור Canonical Event Schema v0.1 נועל את החוזה הלוגי שממנו ייגזר Trigger Engine Specification v0.1. האישור אינו הרשאת קוד, הרצה או שינוי ב-Base44.

לאחר אישור G-EVENT, המסמך הבא בסדר המחייב הוא Trigger Engine Specification v0.1.

24. החלטה מוצעת

לאשר את InvestIQ Canonical Event Schema v0.11 כחוזה האירועים המחייב לפיילוט M1-M3, בכפוף להערות הצוות ולנעילת G-EVENT.

InvestIQ Canonical Event Schema v0.11 | Candidate for Approval | 9 September 2026

info@investiq.co.il054-4860090