# core/ — הליבה האנליטית השכבה הטהורה של OrgState Engine. **stdlib בלבד, ללא I/O, ללא state.** אם רכיב כאן צריך לייבא מ‑`infra/`, `verticals/` או `delivery/` — הוא לא שייך לכאן. ## תוכן | קובץ | מה יש בו | |---|---| | `events.py` | `CanonicalEvent` — אירוע ארגוני אחיד | | `state.py` | `EntityState` — מצב ישות ליום נתון | | `ontology.py` | `Entity`, `ENTITY_TYPES` — סוגי ישויות ארגוניות | | `signals.py` | מתמטיקת האותות: Δ (שינוי), ψ (יציבות), ξ (חריגה), γ (זמן תגובה), κ (קוהרנטיות), Ω (בריאות) | | `drift.py` | `DriftIssue`, `drift_score` (סכום משוקלל, weights אופציונליים), `severity_from_score` | | `decisions.py` | `DecisionItem`, `recommendation_for_issue` | | `config.py` | **Stage 1** — `MetricConfig` / `EntityTypeConfig` / `VerticalConfig`, טעינה מ‑YAML | | `calibration.py` | **Stage 1** — `calibrate` / `Calibration`, סקיילים robust (MAD) מדאטת הלקוח | | `pipeline.py` | **Stage 1** — `Observation`, `run_pipeline` — הצינור הגנרי מונע‑הקונפיג | ## שימוש ```python from core import drift_score, severity_from_score, health_omega signals = {"delta": 0.3, "psi": 0.7, "xi": 0.5, "gamma": 0.4, "kappa": 0.8} score = drift_score(signals) # 0.0 (בריא) .. 1.0 (מדורדר) severity = severity_from_score(score) # low / medium / high / critical ``` ## בדיקות `tests/test_core_*.py` — 36 בדיקות correctness אמיתיות (לא בדיקות טווח בלבד): תכונות מתמטיות של כל אות, משקלי `drift_score`, ספי החומרה בגבולות, מיפוי ההמלצות, ובדיקה אינטגרטיבית שמוכיחה **lead‑time חיובי** על סדרה מדורדרת. ## Stage 1 — בוצע הסקיילים והמשקלים כבר לא hardcoded: `config.py` הופך אותם לקונפיג, `calibration.py` גוזר את הסקיילים מדאטת הלקוח, ו‑`pipeline.py` הוא צינור גנרי אחד מונע‑קונפיג. הדיפולטים ההיסטוריים נשארו מקובעים ב‑`drift.py` (`DEFAULT_DRIFT_WEIGHTS` / `DEFAULT_SEVERITY_THRESHOLDS`) והבדיקות מוודאות שהם לא משתנים בשקט.