מפרט מנוע טריגרים קנוני — M3
שינויים מ-v0.1 ל-v0.11 — כל 6 הערות הסקירה שולבו
1. מטרת המסמך
מסמך זה מגדיר את Trigger Engine של InvestIQ: מנוע דטרמיניסטי, configurable ו-versioned שמזהה תנאים חריגים/משמעותיים ומפיק trigger_fired event קנוני בהתאם ל-Canonical Event Schema v0.11.
המנוע אינו מחליט אם לקנות/למכור, אינו יוצר Trade, אינו משנה Decision/CIO ואינו עוקף Risk Gate. תפקידו היחיד הוא להפוך Observation שעומד בתנאי policy מאושר ל-Event מתועד, ניתן לשחזור ולביקורת.
2. מסמכים מחייבים ותלות
| מסמך | סטטוס | השפעה על מפרט זה | |
|---|---|---|---|
| Target Architecture v0.2 | מאושר | Trigger Engine canonical component; configurable/versioned thresholds; no authority transfer | |
| Migration Plan v0.2 | מאושר | M3, Shadow First, Gates, rollback/stop principles | |
| Local Engine Pilot Specification v0.31 | מאושר | M1-M3 boundaries, no AI/Broker, Trigger ≠ Decision/Trade | |
| Canonical Event Schema v0.11 | מאושר | trigger_fired contract, envelope, idempotency, validation, schema versioning |
במקרה של סתירה, מסמכי היסוד המאושרים וגבולות הסמכות גוברים. שינוי Schema אינו נעשה במסמך זה.
3. Out-of-Scope
- • אין AI/LLM במנוע M3.
- • אין Broker connectivity או order creation.
- • אין Candidate, CIO/Decision או Trade creation.
- • אין שינוי Risk Gate.
- • אין שינוי System of Record; Base44 נשאר System of Record.
- • אין hardcoded operational thresholds.
- • אין production enforcement ב-M3; מצב M3 הוא SHADOW.
- • אין News interpretation ב-M3; NEWS category שמורה לחיבור עתידי לאחר milestone מתאים.
- • אין שינוי Event Schema v0.11 מתוך הקוד או מתוך Trigger configuration.
4. עקרונות מחייבים
| עיקרון | כלל מחייב | ||
|---|---|---|---|
| Deterministic | אותו input + אותה policy version + אותו state רלוונטי → אותה תוצאת evaluation. | ||
| Configurable | thresholds, windows, debounce, cooldown, priority ו-enablement מגיעים מ-policy/config. | ||
| Versioned | כל evaluation ו-trigger_fired ניתנים לשיוך ל-policy_version/config_version. | ||
| Shadow First | ב-M3 המנוע מתעד בלבד ואינו משנה סמכות/מצב מסחרי. | ||
| Event Driven | רק condition משמעותי שעבר gating מפיק trigger_fired. | ||
| Idempotent | אותו logical trigger instance אינו מייצר side effect כפול. | ||
| Fail Closed | policy לא תקין/חסר או input לא כשיר → אין trigger תקין; warning/health בהתאם. | ||
| Observable | כל evaluation aggregate, fire, suppress ו-error ניתנים למדידה ול-audit. |
5. Trigger Lifecycle
| # | שלב | פעולה | פלט |
|---|---|---|---|
| 1 | INPUT | קבלת observation/state עם timestamp/source/freshness | Evaluation Context |
| 2 | VALIDATE | schema, freshness, required fields, policy availability | VALID / REJECTED |
| 3 | EVALUATE | הפעלת condition דטרמיניסטי | TRUE / FALSE / UNKNOWN |
| 4 | DEBOUNCE | אימות persistence/מספר דגימות אם policy דורש | QUALIFIED / SUPPRESSED |
| 5 | DEDUP | בדיקת logical duplicate | NEW / DUPLICATE |
| 6 | COOLDOWN | בדיקת חלון השתקה | READY / SUPPRESSED |
| 7 | RATE LIMIT | הגבלת event flood | READY / SUPPRESSED |
| 8 | FIRE | יצירת trigger instance | trigger_fired event |
| 9 | RECORD | audit/metrics/state מקומי | Trace + counters |
FALSE אינו failure. UNKNOWN נוצר כאשר אין די מידע אמין להכרעה, ובמקרה כזה אין trigger_fired; הסיבה מתועדת.
6. Trigger Definition — חוזה לוגי
| שדה | טיפוס | חובה | משמעות |
|---|---|---|---|
| trigger_id | string | כן | מזהה יציב של הגדרת trigger. |
| name | string | כן | שם תפעולי. |
| enabled | boolean | כן | הפעלה/השבתה דרך config/policy. |
| category | enum | כן | MARKET / NEWS / STATE_RISK / OPERATIONAL. |
| scope | object | כן | market/watchlist/component/context שאליהם ההגדרה חלה. |
| condition_type | enum/string | כן | סוג evaluator דטרמיניסטי מאושר. |
| parameters | object | כן | thresholds/windows/parameters; ללא hardcoding. |
| priority | enum | כן | LOW / NORMAL / HIGH / CRITICAL. |
| debounce_policy | object | כן | כללי persistence/samples; NONE מותר. |
| cooldown_policy | object | כן | חלון cooldown; NONE מותר. |
| rate_limit_policy | object | כן | מגבלת fires; NONE רק אם אושר במפורש. |
| freshness_policy_ref | string | כן | הפניה למדיניות freshness החלה. |
| policy_version | string | כן | גרסת policy. |
| config_version | string | כן | גרסת config. |
| effective_from | timestamp UTC | כן | מועד תחולה. |
| effective_until | timestamp/null | כן | מועד סיום אם קיים. |
7. Trigger Categories
| קטגוריה | M3 | דוגמאות מותרות | הערה |
|---|---|---|---|
| MARKET | פעיל ב-Shadow | price movement, volume anomaly, spread/freshness threshold, indicator crossing | דטרמיניסטי בלבד |
| OPERATIONAL | פעיל | queue/storage/clock/config/data-source conditions | אינו trigger מסחרי |
| STATE_RISK | מוגבל/Shadow | state/exposure observation בלבד כאשר input קיים ומאושר | אינו Risk Gate ואינו חוסם Trade |
| NEWS | Reserved | new-item detection בלבד בעתיד | אין semantic/news AI ב-M3 |
הפעלת category או condition חדש דורשת configuration/policy מאושרים ובדיקת compatibility; אין הרחבה אד-הוק.
8. Condition Evaluators
| condition_type | תיאור | דוגמת פרמטרים |
|---|---|---|
| THRESHOLD_ABOVE | value > configured threshold | field, threshold |
| THRESHOLD_BELOW | value < configured threshold | field, threshold |
| CROSS_UP | מעבר מלמטה למעלה דרך threshold | field, threshold, prior_window |
| CROSS_DOWN | מעבר מלמעלה למטה דרך threshold | field, threshold, prior_window |
| PERCENT_CHANGE | שינוי אחוזי מול reference/window | field, reference, percent, window |
| RANGE_OUTSIDE | ערך מחוץ לטווח מאושר | field, min, max |
| STALE_DATA | גיל מקור חורג ממדיניות | source_data_age_ms, freshness_policy_ref |
| STATE_MATCH | state תפעולי שווה לערך מוגדר | field, expected_state |
הרשימה היא Registry ראשוני. evaluator חדש הוא שינוי מפרט/registry, לא string חופשי שמכניס לוגיקה בלתי מבוקרת.
9. Evaluation Context
| שדה | חובה | משמעות |
|---|---|---|
| evaluation_id | כן | מזהה evaluation יחיד. |
| trigger_id | כן | הגדרת trigger שנבדקת. |
| observed_at | כן | זמן observation ב-UTC. |
| source | כן | מקור observation. |
| source_timestamp | מותנה | זמן המקור כאשר קיים. |
| source_data_age_ms | מותנה | גיל המקור לפי Canonical Event semantics. |
| subject_key | כן | asset/component/context ללא PII. |
| observed_values | כן | ערכים נדרשים ל-condition בלבד. |
| prior_state | מותנה | נדרש ל-cross/debounce/stateful evaluators. |
| policy_version | כן | גרסת policy. |
| config_version | כן | גרסת config. |
| engine_version | כן | גרסת engine. |
10. Thresholds & Policy Governance
- • אין threshold מספרי מחייב במסמך זה.
- • כל threshold מגיע מ-SystemSettings/config/policy המאושרים ב-Base44 ומסונכרן ל-Local Engine.
- • כל trigger_fired שומר threshold_snapshot רק לערכים שהשתתפו בפועל בהחלטת trigger.
- • שינוי threshold יוצר config/policy version חדש או versioned revision לפי מנגנון ה-Config המאושר.
- • Local Engine אינו רשאי להמציא default תפעולי כאשר ערך מחייב חסר. Missing/invalid policy → evaluation UNKNOWN + warning.
- • Policy rollback חייב להיות traceable; events לאחר rollback נושאים את הגרסה הפעילה בפועל.
11. Debounce
Debounce נועד למנוע trigger על spike רגעי כאשר policy דורש persistence. הוא אינו משנה threshold אלא מגדיר כמה זמן/דגימות התנאי חייב להישאר TRUE.
| שדה | משמעות | |
|---|---|---|
| mode | NONE / CONSECUTIVE_SAMPLES / DURATION | |
| required_samples | מספר דגימות רצופות; רלוונטי רק ל-CONSECUTIVE_SAMPLES | |
| required_duration_ms | משך TRUE; רלוונטי רק ל-DURATION | |
| max_sample_gap_ms | פער מרבי בין דגימות כדי להיחשב רציפות |
דגימה UNKNOWN שוברת רצף אלא אם policy עתידי מאושר מגדיר אחרת.
12. Dedup & Logical Trigger Instance
- • trigger_instance_id מזהה fire יחיד לאחר qualification.
- • dedup_key נגזר באופן דטרמיניסטי מ-trigger_id + subject_key + logical condition window/context.
- • retry של אותו trigger_fired שומר event_id ו-idempotency_key בהתאם ל-Canonical Event Schema v0.11.
- • Dedup של Trigger Engine קודם ל-event delivery idempotency; אלה שתי שכבות שונות.
- • duplicate condition בתוך אותו dedup context אינו מפיק trigger_fired נוסף; counter של suppression מתעד זאת.
13. Cooldown
Cooldown מתחיל לאחר FIRE מוצלח לוגית, לא לאחר ACK transport. מטרתו למנוע fire חוזר תכוף של אותה תופעה.
| שדה | משמעות | |
|---|---|---|
| mode | NONE / FIXED_DURATION / UNTIL_CONDITION_RESET | |
| duration_ms | ל-FIXED_DURATION בלבד | |
| reset_condition | ל-UNTIL_CONDITION_RESET בלבד | |
| scope | TRIGGER_SUBJECT / TRIGGER_CATEGORY_SUBJECT / TRIGGER_GLOBAL. ב-M3 ברירת המחדל היא TRIGGER_SUBJECT; CATEGORY scope מותר רק אם הוגדר במפורש ב-policy. |
CRITICAL priority אינו עוקף cooldown אלא אם policy version מאושרת מגדירה override מפורש.
14. Rate Limiting
- • Rate limit נועד להגן על queue/Base44 מפני event storm, לא להסתיר מצב שוק.
- • Rate limiting מתבצע לאחר condition/debounce/dedup/cooldown.
- • suppressed event אינו נעלם: counter + reason נרשמים ב-metrics/audit.
- • CRITICAL אינו פטור אוטומטית מ-rate limit; מדיניות חריגה חייבת להיות מפורשת.
- • אם rate limit עצמו גורם לאובדן visibility מהותי, engine עובר DEGRADED ומפיק warning/health בהתאם.
15. Freshness Gate
- • Trigger המבוסס על market/data input לא יוערך כ-TRUE אם freshness policy מגדירה את הנתון כלא כשיר.
- • stale input → UNKNOWN או STALE_DATA trigger ייעודי, בהתאם להגדרה; אין שימוש בנתון ישן כאילו הוא live.
- • source_data_age_ms הוא per-observation; Engine Health הוא מצב מערכתי נפרד.
- • הספים המדויקים יינעלו ב-Heartbeat/Freshness Policy v0.1 ולא במסמך זה.
16. trigger_fired Mapping ל-Canonical Event Schema v0.11
| Canonical field | מקור ב-Trigger Engine | |
|---|---|---|
| event_type | trigger_fired | |
| status | FIRED | |
| source | trigger_engine | |
| correlation_id | scan/evaluation/flow correlation | |
| idempotency_key | stable key ל-logical event instance | |
| source_data_age_ms | Evaluation Context | |
| policy_version | Trigger Definition הפעילה | |
| config_version | Config הפעיל | |
| payload.trigger_id | Trigger Definition | |
| payload.trigger_instance_id | Fire instance | |
| payload.trigger_category | category | |
| payload.reason_code/text | evaluator result | |
| payload.threshold_snapshot | רק parameters רלוונטיים | |
| payload.observed_values | רק observed inputs רלוונטיים | |
| payload.priority | Trigger Definition | |
| payload.dedup_key | Dedup layer | |
| payload.cooldown_until | Cooldown state |
payload.policy_version חייב להתאים ל-envelope.policy_version; mismatch הוא REJECT_SCHEMA בהתאם ל-v0.11.
17. Suppression & Audit
| suppression_reason | מתי | |
|---|---|---|
| CONDITION_FALSE | condition לא התקיים | |
| INPUT_UNKNOWN | input חסר/לא אמין | |
| STALE_INPUT | freshness gate נכשל | |
| DEBOUNCE_PENDING | טרם הושלמה persistence | |
| DEDUPLICATED | logical duplicate | |
| COOLDOWN_ACTIVE | בתוך cooldown | |
| RATE_LIMITED | חריגה ממגבלת fire | |
| TRIGGER_DISABLED | הגדרה מושבתת | |
| POLICY_INVALID | policy/config חסר או לא תקין |
לא כל suppression מפיק warning event. כולם נמדדים ב-Metrics/Audit; warning מופק כאשר מדובר בכשל תפעולי/איכותי שמחייב visibility.
18. Metrics / Telemetry
| Metric | משמעות | |
|---|---|---|
| trigger_evaluations_total | מספר evaluations | |
| trigger_true_total | condition TRUE לפני gates | |
| trigger_fired_total | events לוגיים שנוצרו | |
| trigger_suppressed_total | סך suppressions | |
| trigger_suppressed_by_reason | פירוט לפי reason | |
| trigger_unknown_total | UNKNOWN evaluations | |
| evaluation_latency_ms | זמן evaluation | |
| policy_validation_failures | policy/config invalid | |
| trigger_event_delivery_failures | כשלי delivery לאחר fire |
Metrics אלה משתלבים ב-metrics_snapshot של Canonical Event Schema. אין חובה שכל metric יהיה field top-level; payload metrics יוכל להתרחב backward-compatibly בהתאם לאישור.
19. Failure Modes & Safe Behavior
| Failure | התנהגות | |
|---|---|---|
| Missing/invalid policy | UNKNOWN; אין fire תקין; warning; ללא fallback threshold. | |
| Stale market data | UNKNOWN/STALE_DATA לפי policy; אין market fire כאילו data live. | |
| Clock skew חריג | DEGRADED/HOLD capability לפי Health Policy. | |
| Disk full/local state unavailable | DEGRADED/HOLD; אין stateful trigger שאינו יכול להבטיח dedup/cooldown. | |
| Queue unavailable | אין אובדן שקט; local recovery/warning/DEGRADED לפי M1 rules. | |
| Base44 unavailable | evaluation מקומי יכול להמשיך רק אם config/policy המאושרים וה-freshness שלהם תקפים; events queued. | |
| Config version mismatch | אין הפעלה תחת גרסה לא מזוהה; warning/UNKNOWN. | |
| Evaluator exception | אין fire; error logged/redacted; warning/metrics. |
20. Shadow Mode — M3
- • כל trigger ב-M3 פועל במצב SHADOW.
- • אין שינוי Candidate/Decision/Trade/Portfolio/Execution כתוצאה מ-trigger_fired.
- • התוצאות מושוות להתנהגות/נתוני הייחוס המאושרים לצורך Quality Baseline.
- • False positives/false negatives, latency, coverage ו-suppression reasons נמדדים.
- • המעבר מ-SHADOW ל-PRODUCTION/ENFORCED אינו חלק מ-G-TRIGGER ודורש Gate עתידי מפורש.
21. Acceptance Categories ל-Trigger Engine
| קטגוריה | PASS עקרוני | |
|---|---|---|
| Determinism | אותו input/policy/state מייצר אותה evaluation result. | |
| Policy Integrity | אין hardcoded threshold ואין evaluation תחת policy לא מזוהה. | |
| Freshness | stale input אינו מוצג/מוערך כ-live. | |
| Dedup | logical duplicate אינו מייצר fire נוסף. | |
| Cooldown | fire חוזר suppressed לפי policy. | |
| Rate Limit | event storm נשלט בלי אובדן visibility שקט. | |
| Event Contract | כל trigger_fired עובר Canonical Schema v0.11 validation. | |
| Authority Boundary | אפס side effects על Candidate/Decision/Trade/Risk/Execution. | |
| Observability | evaluations/fires/suppressions/failures ניתנים למדידה. | |
| Recovery | restart/state recovery אינו יוצר duplicate fire בלתי מוסבר. |
הספים המספריים ו-test cases הסופיים יינעלו ב-Pilot Acceptance Test Plan v0.1.
22. דוגמת Trigger Definition — תיעודית בלבד
{
"trigger_id": "trg-example-market-change",
"name": "Example configured market change",
"enabled": true,
"category": "MARKET",
"scope": {
"market": "EXAMPLE",
"subjects": "configured-watchlist"
},
"condition_type": "PERCENT_CHANGE",
"parameters": {
"field": "price",
"reference": "configured-reference",
"percent": "configured-value",
"window": "configured-window"
},
"priority": "NORMAL",
"debounce_policy": {
"mode": "CONSECUTIVE_SAMPLES",
"required_samples": 0,
"max_sample_gap_ms": 0
},
"cooldown_policy": {
"mode": "FIXED_DURATION",
"duration_ms": 0,
"scope": "TRIGGER_SUBJECT"
},
"rate_limit_policy": {
"max_fires": 0,
"window_ms": 0
},
"freshness_policy_ref": "freshness-policy-ref",
"policy_version": "pol-vX",
"config_version": "cfg-vX",
"effective_from": "2026-09-09T00:00:00.000Z",
"effective_until": null
}כל הערכים בדוגמה הם placeholders. אין בדוגמה threshold, interval או limit תפעולי מאושר. ערכים מספריים מופיעים כ-0 להמחשת ה-type הצפוי (v0.11).
23. Derivation Trace
| דרישה | מקור | ||
|---|---|---|---|
| Trigger Engine deterministic/configurable/versioned | Target Architecture v0.2; Local Engine Pilot v0.31 §10 | ||
| M3 / Shadow First | Migration Plan v0.2 M3; v0.31 §6, §10 | ||
| Trigger ≠ Candidate/Decision/Trade | v0.31 §10; Canonical Event Schema v0.11 §12 | ||
| trigger_fired payload/envelope | Canonical Event Schema v0.11 §12, §16 | ||
| policy/config versions | Canonical Event Schema v0.11 envelope; v0.31 §7-10 | ||
| Freshness separation | v0.31 §9; Canonical Event Schema v0.11 §5 | ||
| Debounce/Cooldown/Rate Limit/Idempotency | v0.31 §10; Canonical Event Schema v0.11 §13 | ||
| Metrics/Telemetry | v0.31 §7; Canonical Event Schema v0.11 metrics_snapshot | ||
| No AI/Broker M1-M3 | v0.31 §12-13 | ||
| DEGRADED/HOLD failure behavior | v0.31 §9, §14; Canonical Event Schema v0.11 health/warning |
New Requirement מפורט במסמך זה: Trigger Definition contract, evaluator registry, suppression reason registry וסדר lifecycle מלא. אלה פירוט טכני הנדרש ליישום הדרישות המאושרות, ומובאים לאישור מפורש במסגרת G-TRIGGER.
24. שאלות לצוות לפני G-TRIGGER
- האם Trigger Definition contract כולל את כל השדות הדרושים ל-M3 ללא הכנסת סמכות מסחרית?
- האם evaluator registry הראשוני מספיק ל-M3, או חסר evaluator דטרמיניסטי חיוני?
- האם category STATE_RISK צריך להישאר מוגבל/Shadow כפי שמוגדר, כדי למנוע חפיפה עם Risk Gate?
- האם NEWS צריך להישאר Reserved בלבד ב-M3?
- האם סדר lifecycle: Validate → Evaluate → Debounce → Dedup → Cooldown → Rate Limit → Fire נכון?
- האם cooldown צריך להתחיל ב-FIRE הלוגי ולא ב-ACK transport כפי שמוצע?
- האם dedup_key scope צריך להינעל במסמך זה או להיות evaluator-specific לפי policy?
- האם suppression registry מספק לצורך audit ו-Acceptance Plan?
- האם metrics המוגדרים מספיקים למדידת false positives/false negatives, latency ו-coverage?
- האם קיים blocker לפני מעבר ל-Heartbeat/Freshness Policy v0.1?
25. Gate G-TRIGGER
אישור Trigger Engine Specification v0.11 נועל את החוזה הלוגי וההתנהגותי של מנוע הטריגרים עבור M3. האישור אינו הרשאת קוד, הרצה או שינוי ב-Base44.
לאחר אישור G-TRIGGER, המסמך הבא בסדר המחייב הוא Heartbeat/Freshness Policy v0.1.
26. החלטה מוצעת
לאשר את InvestIQ Trigger Engine Specification v0.11 כמפרט המחייב ל-M3, בכפוף להערות הצוות ולנעילת G-TRIGGER.
InvestIQ Trigger Engine Specification v0.11 | Candidate for Approval | 9 September 2026