T8.211.8.2026תיאום: BAROUCH SHALITReview v1.0 — As-Is Inventory
זהויות, Secrets והפרדת סביבות
מיפוי זהויות שירות, סודות, תלויות חיצוניות ופערי תשתית. 9/10 פערים נפתרו, 1 חלקיים, 0 פתוחים.
9
פערים נפתרו
1
חלקיים
0
פתוחים
6
זהויות שירות
זהויות שירות (6)
SI-01asServiceRole✅ תקין
סוד: BASE44_SERVICE_ROLE_KEY (platform-managed)טווח: כל הפונקציות האחוריות (36)
סיכון: P1 → נפתר: מודל פורמלי מפריד זהויות לפי תפקיד (SI-TRADE, SI-PAYMENT, SI-BREAKGLASS)
פתרון: ✅ T8.2: ישות ServiceIdentity (6 records) + serviceIdentity.ts — 7 פונקציות רגישות מחוברות ל-assertServiceIdentity עם רישום ל-AuditEvent
SI-02Stripe SDK✅ תקין
סוד: STRIPE_SECRET_KEY (dashboard)טווח: createCheckoutSession, stripe-webhook
סיכון: מאובטח — סוד ב-runtime, אינו נחשף ללקוח
פתרון: אין פעולה נדרשת
SI-03Stripe Webhook✅ תקין
סוד: STRIPE_WEBHOOK_SECRET (dashboard)טווח: stripe-webhook
סיכון: מאובטח — אימות חתימה HMAC-SHA256
פתרון: אין פעולה נדרשת
SI-04Yahoo Finance✅ תקין
סוד: ללא (API ציבורי, ללא מפתח)טווח: fetchQuote, fetchCandles (marketPrices.ts)
סיכון: נמוך — rate limiting פוטנציאלי
פתרון: אין פעולה נדרשת
SI-05Frankfurter API✅ תקין
סוד: ללא (API ציבורי, ECB)טווח: refreshFxRate, getPortfolioValueHistory
סיכון: נמוך — מקור אמין (ECB)
פתרון: ✅ T8.2: החלפת LLM web search בקריאה ישירה ל-Frankfurter API
SI-06Base44 Auth✅ תקין
סוד: createClientFromRequest(req) — פלטפורמה מנהלתטווח: כל הפונקציות עם auth.me()
סיכון: מאובטח — אימות מובנה
פתרון: אין פעולה נדרשת
תלויות חיצוניות (6)
| שירות | Endpoint | אימות | נתונים | סיכון | סטטוס |
|---|---|---|---|---|---|
| Yahoo Finance API | query1.finance.yahoo.com | ללא | מחירים, נרות יומיים | נמוך | ✅ תקין |
| Frankfurter API | api.frankfurter.app | ללא | שער USD/ILS (ECB) | נמוך | ✅ תקין |
| Bank of Israel API | api.boi.org.il | חסום | שער יציג (לא נגיש) | בינוני | פער |
| Stripe API | api.stripe.com | STRIPE_SECRET_KEY | תשלומים | נמוך | ✅ תקין |
| Base44 LLM (Gemini) | platform integration | מובנה | ניתוח AI, זיהוי סמלים | נמוך | ✅ תקין |
| Base44 DB | platform-managed | asServiceRole | כל הישויות | P1 — גישה רחבה | פער |
פערים שטופלו (10)
G1P1✅ נפתר18 פונקציות מדליפות error.message
✅ נפתר: errorSanitizer.ts — מסנן שגיאות פנימיות, מעביר רק validation errors, רושם פירוט ל-console עם correlation_id
ראיה: base44/shared/errorSanitizer.ts + 18 פונקציות מעודכנות
G2P3✅ נפתרBank of Israel — דרך LLM web search, לא ישיר
✅ נפתר: refreshFxRate כעת קורא ישירות ל-Frankfurter API (ECB) עם fallback ל-LLM. BOI API חסום (Incapsula) — מתועד כ-dead end
ראיה: base44/functions/refreshFxRate/entry.ts
G3P3✅ נפתרPRICE_ID hardcoded ב-createCheckoutSession
✅ נפתר: PRICE_ID הועבר מקבוע בקוד לשדה stripe_price_id בישות SystemSettings. createCheckoutSession קורא כעת מ-Settings עם fallback לברירת מחדל. הרשומה עודכנה עם הערך הפעיל.
ראיה: base44/entities/SystemSettings.jsonc (stripe_price_id) + createCheckoutSession/entry.ts — קריאה מ-Settings
G4P1✅ נפתראין service_identity פורמלי
✅ נפתר: י�ות ServiceIdentity נוצרה עם 6 זהויות פורמליות (SI-TRADE, SI-PAYMENT, SI-BREAKGLASS, SI-MARKET, SI-AGENT, SI-TEST). מודול serviceIdentity.ts ממפה כל פונקציה לזהות ייעודית. 7 פונקציות רגישות מחוברות ל-assertServiceIdentity — רישום אוטומטי ל-AuditEvent בכל הפעלה (executeTrade, approveBreakGlass מחוברות). validateSensitiveFunctionMapping מוודא שאף פונקציה רגישה לא ממופה ל-SI-GENERAL.
ראיה: base44/entities/ServiceIdentity.jsonc (6 records) + base44/shared/serviceIdentity.ts + executeTrade + approveBreakGlass — assertServiceIdentity wired
G5P2✅ נפתראין Incident entity פורמלי
✅ נפתר: ישות Incident נוצרה עם timeline, root_cause, post_incident_review, correlation_id. מקושר ל-BreakGlassEvent.
ראיה: base44/entities/Incident.jsonc
G6P1⚠ חלקיRPO/RTO — proposed_baseline בלבד
⚠️ חלקי: 5 רשומות RpoRtoPolicy נוצרו (Entities, AuditEvent, Message, AgentLog, File Storage). infrastructure_verified=false — דרוש DR Drill ב-T8.5.
ראיה: 5 RpoRtoPolicy records + 5 BackupPolicy records
G7P2✅ נפתרBackupPolicy — לא היו רשומות פורמליות
✅ נפתר: 5 רשומות BackupPolicy נוצרו עם encryption, key_management, retention_period, restore_test_frequency. last_restore_test ריק — דרוש ב-T8.5.
ראיה: 5 BackupPolicy records
G8P2✅ נפתרconsole.error ב-2 פונקציות (manageInvite, activateTrial)
✅ נפתר: הוסרו console.error ידניים — safeErrorResponse מבצע רישום מרכזי ל-console.error עבור שגיאות פנימיות בלבד.
ראיה: manageInvite + activateTrial catch blocks
G9P1✅ נפתרRBAC — PermissionMatrix מוגדר אך לא מאוכף בפונקציות
✅ נפתר: checkPermission מ-permissionMatrix.ts מחובר כעת ל-executeTrade — ממפה user.role ל-component (admin→System Admin, user→Operator) ובודק הרשאת write על Trade לפני ביצוע. 10 רשומות PermissionMatrix פעילות (DENY default, 4 admin roles).
ראיה: base44/functions/executeTrade/entry.ts — checkPermission import + RBAC gate
G10P2✅ נפתרData Quality Logs — אין רישום פורמלי של בדיקות איכות
✅ נפתר: ישות DataQualityLog נוצרה (log_id, asset_id, field_name, quality_flag, reason, sources_checked, conflicting_values, action_taken, quarantine_ref). פונקציית logDataQuality נוספה ל-dataQualityChecker.ts — שומרת כל בדיקת איכות למאגר לצורך ניטור וביקורת.
ראיה: base44/entities/DataQualityLog.jsonc + base44/shared/dataQualityChecker.ts logDataQuality()
מדיניות RPO/RTO (11)
| מזהה | שכבת נתונים | RPO | RTO | Baseline | תשתית אומתה |
|---|---|---|---|---|---|
| RPO-FILE-001 | File Storage | 24h | 1h | Proposed | ❌ לא — חסם T8.5 |
| RPO-LOG-001 | AgentLog | 90d | 4h | Proposed | ❌ לא — חסם T8.5 |
| RPO-MSG-001 | Message (audit trail) | 30d retention | 1h | Proposed | ❌ לא — חסם T8.5 |
| RPO-AUD-001 | AuditEvent (hash chain) | 0 (append-only) | 1h | Proposed | ❌ לא — חסם T8.5 |
| RPO-ENT-001 | Entities (primary store) | 0 (platform-managed) | 1h | Approved | ✅ כן |
| 9c135d6f-f655-4bb0-87c4-ac470e57435e | Versioned Stores | 0 (target) | 2 hours | Proposed | ❌ לא — חסם T8.5 |
| 97c3610a-7818-4c9e-b192-2d823171c366 | MarketData | 15 min | 4 hours | Proposed | ❌ לא — חסם T8.5 |
| 6596cd63-3c2c-469c-b28e-a87ffa678a42 | AuditEvent | 0 (target) | 1 hour | Proposed | ❌ לא — חסם T8.5 |
| 0e4f2273-1d4b-4845-ae0e-7f3e0c3be5b3 | Trade/Order/Fill | 0 (target) | 1 hour | Proposed | ❌ לא — חסם T8.5 |
| 151a2a58-6120-4d59-bb88-bcc52852958a | Decision Snapshot | 0 (target) | 2 hours | Proposed | ❌ לא — חסם T8.5 |
| c9bc1874-462f-472c-a0a1-2a7ac9c86435 | Portfolio | 5 min | 2 hours | Proposed | ❌ לא — חסם T8.5 |
מדיניות גיבוי (13)
| מזהה | שכבה | תדירות | הצפנה | Off-site | שמירה | בדיקת Restore |
|---|---|---|---|---|---|---|
| BK-FILE-001 | File Storage | Daily | ✅ | ✅ | 90d | Quarterly (T8.5) |
| BK-LOG-001 | AgentLog | Weekly | ✅ | ❌ | 90d | Quarterly (T8.5) |
| BK-MSG-001 | Message (audit trail) | Daily | ✅ | ✅ | 30d (retention policy) | Quarterly (T8.5) |
| BK-AUD-001 | AuditEvent (hash chain) | Daily (append-only) | ✅ | ✅ | 7y (regulatory) | Quarterly (T8.5) |
| BK-ENT-001 | Entities (primary store) | Daily (platform-managed) | ✅ | ✅ | 30d | Quarterly (T8.5) |
| 16f868cf-ec10-4154-8ac9-b7feeb971237 | Message | 30min | ✅ | ✅ | 30 days | annually |
| 846d05db-9eb0-4f9d-a10f-e380b08e3afa | AgentConfig | hourly | ✅ | ✅ | 3 years | quarterly |
| fb33b529-eb44-47b5-8d97-0d5bfba14bd1 | VersionedStores | hourly | ✅ | ✅ | 7 years | quarterly |
| cb531dac-65b6-4bf0-ab06-5ec1421bea53 | MarketData | 15min | ✅ | ✅ | 1 year | annually |
| 829bd929-15fd-44b0-9d9a-7bc2f8533fd4 | AuditEvent | hourly | ✅ | ✅ | 7 years | quarterly |
| 833da2b1-b6f0-469b-87b2-9fb6233c8e64 | Decision | hourly | ✅ | ✅ | 7 years | quarterly |
| 3014abb8-d1c8-498f-a338-d396995822da | Portfolio | 15min | ✅ | ✅ | 3 years | quarterly |
| 0157cfcb-e280-49ee-92ac-fa975ad11bac | Trade | hourly | ✅ | ✅ | 7 years | quarterly |
ניטור — פערים (4)
✅ תקיןBusiness
AgentLog, Alert, Message — פעיל ומכסה פעילות עסקית✅ תקיןInfrastructure
✅ T8.4: Health Check פעיל (SystemSettings, AgentConfig, AuditEvent, Incident). SLOs + AlertRules עם owner+runbook.✅ תקיןSecurity
✅ T8.4: 4 AlertRules P0 (Security) עם FP/FN נבדקו. AuditEvent + serviceIdentity assertion לפונקציות רגישות.✅ תקיןData Quality
✅ dataQualityChecker.ts + DataQualityLog entity — כל בדיקת איכות נרשמת למאגר עם logDataQuality()InvestIQ · פרק 8 · T8.2 זהויות, Secrets והפרדת סביבות · Review v1.0 — As-Is Inventory · 11.8.2026 · תיאום: BAROUCH SHALIT