InvestIQ

InvestIQ

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

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

V2-CH2-001 — דוח ביצוע Shadow

כרך 2 · פרק 2 · משימה 001 · ישות Candidate — יישום Shadow ואימות

v1.0 Shadow Active · 11.8.2026

סיכום ביצוע

6/6
רכיבים מומשו
8/10
קריטריונים PASS
1
EXCEPTION (C2)
1
PARTIAL (C10)

Shadow הופעל בהצלחה: ישות Candidate נוצרת בכל סריקת סוכן, מבוצעת דה-דופליקציה (Best Effort), מקושרת ל-AnalysisOutput, ומתוחזקת אוטומטית (תפוגה + Reconciliation). הנתיב הקיים (סוכן → Decision) לא השתנה. מעבר ל-Enforced חסום עד סגירת C2 (אטימיות) ו-V2-CH5 (Evidence Fusion).

רכיבים שמומשו

#רכיבקובץראיהסטטוס
1ישות Candidatebase44/entities/Candidate.jsoncסכמה מלאה: symbol, market, asset_id, dedup_key, idempotency_key, expected_agent_ids, analysis_deadline, status (6 מצבים כולל promoting), promotion_locked_at, decision_id, expires_at. כל השדות הנדרשים ב-C1 מוגדרים.PASS
2candidateService.tsbase44/shared/candidateService.ts7 פונקציות: resolveAssetId(), createCandidate() (דה-דופליקציה No-Op + AuditEvent), queueForAnalysis(), evaluateCandidate(), promoteCandidate() (PROMOTING אטומי), sweepExpired(), reconcileStuckPromoting() (60s timeout).PASS
3AnalysisOutput.candidate_idbase44/entities/AnalysisOutput.jsoncשדה candidate_id נוסף לישות AnalysisOutput. מקור האמת לקישור — AnalysisOutput.candidate_id (לא מערך נגזר ב-Candidate).PASS
4שילוב ב-runAgentScanbase44/functions/runAgentScan/entry.tscreateCandidate() נקרא לאחר analyzeAgent() בנוסף לנתיב הקיים (תוספתי, לא-חוסם). createDecision הקיים לא השתנה. Candidate נוצר ב-shadow ומקושר ל-AnalysisOutput.PASS
5sweepCandidates (פונקציה)base44/functions/sweepCandidates/entry.tsפונקציית תחזוקה: קוראת ל-sweepExpired() + reconcileStuckPromoting(). נבדקה — החזירה { expired: 3, reconciled: 0 }.PASS
6Candidate Lifecycle Sweep (workflow)base44/workflows/Candidate Lifecycle Sweep.jsoncWorkflow מתוזמן כל 5 דקות (interval) הקורא ל-sweepCandidates. עובד אוטומטית — Candidates שפג תוקפם מנוקים ללא התערבות ידנית.PASS

תוצאות בדיקה

runAgentScan (סריקת סוכן): Candidate נוצר בהצלחה עם asset_id קנוני, dedup_key, idempotency_key, expected_agent_ids (צילום קבוע). AnalysisOutput מקושר דרך candidate_id.

sweepCandidates (תחזוקה): נבדק — החזיר { expired: 3, reconciled: 0 }. 3 Candidates שפג תוקפם עברו ל-expired. 0 תקועים ב-PROMOTING.

Workflow (Candidate Lifecycle Sweep): פעיל — רץ כל 5 דקות אוטומטית.

דה-דופליקציה (Best Effort): filter + return existing פעיל אך אינו אטומי — עלול לאפשר כפילויות במקביל. מסומן EXCEPTION ב-C2.

סיכום קריטריוני קבלה

מזההסוגתוצאההערה
C1SchemaPASSישות Candidate עם כל השדות הנדרשים
C2DedupEXCEPTIONBest Effort ב-Shadow — filter+return אינו אטומי. חסום מ-Enforced עד Unique/Atomic Upsert או Claim ייחודי
C3LinkagePASSAnalysisOutput.candidate_id כמקור אמת
C4PromotionPASSquorum = ceil(60% × |expected_agent_ids|). אין קידום אוטומטי מחמת תום זמן
C5LinkagePASSShadow: מקשר ל-Decision הקיים, לא יוצר מקביל
C6InvariantPASSPROMOTING אטומי + reconcileStuckPromoting (60s)
C7TTLPASSsweepExpired פעיל + workflow מתוזמן
C8ModePASSShadow אינו יוצר Decision מקביל
C9InvariantPASSCandidate אינו Risk Gate — אין וטו
C10AuditPARTIALAuditEvent נרשם בדה-דופליקציה. נדרש אימות נוסף לכל מעברי המצב

חסמים למעבר ל-Enforced

P0B1C2 — אטימיות דה-דופליקציה

הפלטפורמה (Base44) אינה מספקת Unique/Atomic Upsert על dedup_key/idempotency_key. המנגנון הנוכחי (filter + return existing) אינו אטומי ועלול לאפשר יצירת כפילויות במקביל. פתרון אפשרי: ישות Claim נפרדת עם מפתח ייחודי, או מנעול אופטימי (CAS) על סטטוס. עד אז — Best Effort ב-Shadow בלבד.

P0B2V2-CH5 — Evidence Fusion

קידום Candidate (promoteCandidate) מצפה לאיחוד ראיות מרובה-סוכנים. כיום קידום מתבצע על בסיס רוב פשוט (majority vote). מעבר מלא ל-Fusion ב-V2-CH5.

P1B3C10 — Audit מלא למעברי מצב

AuditEvent נרשם בדה-דופליקציה (DUPLICATE_DISCOVERY_ATTEMPT). נדרש אימות שכל מעבר מצב (discovered→analyzing→promoting→promoted/rejected/expired) רושם AuditEvent עם פרטי המעבר.

דוח ביצוע · v1.0 · 11.8.2026 · Shadow Active
חזרה למפרט