V2-CH1-001 — מיפוי As-Is
כרך 2 · פרק 1 · משימה 001 · מיפוי רכיבי קוד וישויות קיימים
מטרת המסמך
מיפוי קריאת-קוד מלא של שמונת רכיבי הקוד והישויות שכרך 2 נשען עליהם. המסמך מתעד את המצב הנוכחי (As-Is), את תפקיד הרכיב בכרך 2, ראיות קוד (קובץ, פונקציה, קורא, כותב), פרטים תפעוליים (טריגרים, קלטים, פלטים, שמירה, מצבים, כשל, WAIT, NO_OPINION, Shadow, Prompt/Model), ואת הפערים שכרך 2 יצטרך לסגור. זהו הבסיס ל-V2-CH1-002 (Decision Doctrine) ולנעילת גבולות הסמכות. קריאת קוד בלבד — ללא שינוי במערכת.
מיפוי End-to-End — תרשים זרימה וטבלת שלבים
תרשים זרימה End-to-End
Trigger runAgentScan / refreshPortfolioPrices | ← | Agent (LLM) analyzeAgent → InvokeLLM | ← | Adapter adaptAgentOutput (Dual Write) | ← | AnalysisOutput entity (conclusion, confidence, evidence) | ← | Decision createDecision + publishDecision | ← | Risk Gate assertDecisionActive + checkRiskGatePassed | ← | Approval checkApprovalValid (full_auto/semi_auto/manual) | ← | Execution executeTrade (sole owner) |
| שלב | פאזה | טריגר | פונקציה | קובץ | קלט | פלט | ישות נשמרת |
|---|---|---|---|---|---|---|---|
| 1 | CIO_SCAN | Cron 10min / Manual | analyzeAgent() | runAgentScan/entry.ts:452 | portfolioSymbols, agent config, LLM prompt | LLM result: { symbols[], sentiment, summary } | AgentLog, Alert, WatchList, Message |
| 1a | Dual Write | Within CIO_SCAN | adaptAgentOutput() | agentAdapters.ts:11 | LLM result, agent, profile | AnalysisOutput (conclusion, confidence, evidence) | AnalysisOutput |
| 2 | PRE_RISK_CHECK | After CIO_SCAN | (inline in runAgentScan) | runAgentScan/entry.ts:203 | phase1 results, live quotes, settings | gate-approved decisions (score ≥ 8.5 full_auto / ≥ 9.5 semi_auto high-confidence) | — (in-memory) |
| 3 | APPROVAL | After PRE_RISK_CHECK | createDecision() + publishDecision() | decisionObject.ts:243,306 | DecisionData (action, symbol, confidence) | Decision: DRAFT → ACTIVE (frozen snapshot) | Decision |
| 3a | Trade Creation | After Decision published | createTradeWithAudit() | stateMachine.ts | Trade data + decision_id | Trade (pending) | Trade |
| 3b | Auto-approve | If full_auto + score ≥ 8.5 | transitionTradeStatus() | stateMachine.ts | Trade id, to: "approved" | Trade (pending → approved) | Trade |
| 4 | PRICE_REFRESH | Cron 5min | (inline) | refreshPortfolioPrices/entry.ts:106 | Portfolio, Yahoo quotes | priceMap, triggers (stop/TP/drop) | Portfolio (updated) |
| 5 | TRADE_VALIDITY | After PRICE_REFRESH | validateStaleProposals() | orchestrator.ts:21 | Pending trades, live prices | rejected (price drift) / refreshed | Trade (expired/updated) |
| 6 | EXECUTION | After VALIDITY | executeTrade() | tradeExecution.ts | Approved trades (protection sells first) | Executed trades | Trade (executed) |
| 6a | RISK_GATE | Before each execute | assertDecisionActive + checkRiskGatePassed + checkApprovalValid | decisionObject.ts:569,607,617 | Decision (canonical, ACTIVE) | Pass (proceed) / Fail (block — has veto authority) | RiskVerdict, ApprovalRecord |
רכיבי קוד וישויות — מיפוי As-Is עם ראיות ופרטים תפעוליים
ניהול שלבי ה-pipeline הדטרמיניסטיים
שלבים: PRICE_REFRESH, TRADE_VALIDITY, RISK_GATE, APPROVAL, EXECUTION. שלבי LLM (CIO_SCAN) חיים ב-runAgentScan וב-refreshPortfolioPrices. ה-orchestrator אינו מכיל לוגיקת CIO — הוא מנהל שלבים דטרמיניסטיים בלבד.
תשתית הזרימה נשארת. כרך 2 מוסיף שלבי ניתוח והחלטה לפני Risk Gate, בלי לשנות את השלבים הקיימים.
חוזה ה-Decision הגרסאי עם Snapshot קפוא
CH3-005 v1.0 — Enforced. ישויות נפרדות: Decision (immutable post-publish), RiskVerdict, ApprovalRecord. CAS + Idempotency + supersedeDecision אטומי. action-dependent validation (ENTRY/POSITION/EXIT). TTL + expiry.
Decision נשאר חוזה הפלט של כרך 2. ה-CIO יוצר Decision דרך createDecision ומפרסם דרך publishDecision — בלי לשנות את החוזה.
התאמת פלטי סוכנים לחוזה AnalysisOutput (Dual Write)
CH4-004 v1.0 — 5 סוכנים פעילים (US Scanner, IL Scanner, News, Technical, Portfolio Risk). Financial Reports מושהה. כל adapter רץ במקביל לנתיב הקיים (Dual Write) ולא משנה לוגיקה.
Adapters הם מקור ה-AnalysisOutput שכרך 2 יאחד. כל סוכן מניב output מובנה עם conclusion, evidence, confidence, uncertainty.
חוזה פלט ניתוח מאוחד, מובנה וגרסאי
CH4-003 v1.0 — schema v1. שדות: conclusion (BUY/SELL/HOLD/NO_OPINION), evidence[], risks[], confidence (0-10), uncertainty (0-1), missing_data[], limitations[]. תמיכה מפורשת ב-NO_OPINION. טריות: 30 דקות.
זהו החוזה המרכזי שכרך 2 צורך. כל ניתוח מגיע כ-AnalysisOutput ואיחוד ראיות יקרא ממנו.
פרופיל גרסאי לכל סוכן — משימה, קלטים, יציאה, הרשאות
CH4-002 v1.0 — 5 סוגים: scanner, news, technical, financials, portfolio. DEFAULT_PROHIBITED כולל executeTrade. ולידציה: Financial Reports חייב shadow, CIO חייב shadow, Portfolio Risk חייב P0.
פרופילים נשארים. כרך 2 עשוי להוסיף פרופיל CIO רשמי (כיום CIO הוא shadow בלבד, ללא פרופיל ייעודי).
מגבלות ניסוי Phase 0 — manual בלבד
MAX_OPEN_PROPOSALS = 1. בודק: מקסימום הצעה פתוחה אחת, אין כפילות symbol, שמירת מזומן. פעיל ל-management_mode=manual בלבד.
כרך 2 ירחיב את הקנררי למנוע החלטה: מגבלת Decisions פתוחים, מגבלת סמכויות, מגבלת הפסדים ב-Shadow.
ישות לניהול גרסאות Prompt לפי סוג סוכן
סכמה v1 — שדות: prompt_version_id, agent_type, version, prompt_text, change_reason, approved_by, effective_from, supersedes_version, is_active. הסכמה קיימת אך לא מאוכלסת — אין גרסאות Prompt פעילות.
פרק 4 (Prompt ומודלים) יאכלס את הישות ויחבר אותה ל-Decision (prompt_version field כבר קיים ב-DecisionData).
ישות לניהול גרסאות מודל לפי סוג סוכן
סכמה v1 — שדות: model_version_id, agent_type, model_profile, version, change_reason, approved_by, effective_from, supersedes_version, is_active. הסכמה קיימת אך לא מאוכלסת.
פרק 4 יאכלס את הישות. Decision.model_version כבר קיים בחוזה.
ניתוח פערים לכרך 2
| מזהה | פער | חומרה | פרק מטפל |
|---|---|---|---|
| G1 | אין שלב איחוד ראיות (Evidence Fusion) לא קיים רכיב שקורא מספר AnalysisOutput-ים לאותו סמל/cycle ומאחד אותם לחבילת ראיות אחת. כיום כל סוכן יוצר Decision משלו בנפרד. | P0 | V2-CH5 |
| G2 | אין ציון ביטחון מאוחד (Confidence Scoring) confidence נקבע על-ידי סוכן בודד. אין רכיב שמשקלל מספר דעות לציון אחד עם משמעות מדידה. | P0 | V2-CH6 |
| G3 | אין אלגוריתם CIO אין רכיב שמקבל חבילת ראיות ומפיק Decision אחד מנומק. כיום Decision נוצר ישירות מ-output של סוכן בודד. | P0 | V2-CH7 |
| G4 | אין פרופיל CIO רשמי — ללא veto_power / authority_weight לסוכנים CIO מוזכר ב-agentProfile.ts (shadow) אך אין לו פרופיל ייעודי. זכות וטו שייכת רק ל-Risk Gate הדטרמיניסטי — אין להעניק אותה לסוכן או ל-CIO. במקום authority_weight, יש לתעד analysis_role, priority_class ו-reliability_profile; המשקולות עצמן מנוהלות במדיניות ה-CIO ואינן מעניקות סמכות החלטה או וטו. גם Portfolio Risk כסוכן ניתוח אינו זהה ל-Risk Gate. | P1 | V2-CH1 |
| G5 | ישויות PromptVersion ו-ModelVersion ריקות הסכמות קיימות אך לא מאוכלסות. אין flow ליצירה/אישור/הפעלה. אין חיבור בפועל ל-Decision. Prompts ו-models מוגדרים inline בקוד. | P1 | V2-CH4 |
| G6 | אין חבילת Candidate רשמית אין ישות/רכיב שמייצג הזדמנות מזוהה ולא-כפולה לפני ניתוח עמוק. כיום כל סריקה יוצרת Trade/Decision ישירות. | P1 | V2-CH2 |
| G7 | אין טיפול במחלוקות אין לוגיקה לזיהוי וטיפול בדעות סותרות בין סוכנים (למשל Scanner אומר BUY ו-Portfolio Risk אומר SELL). אין שדה conflict_flag ב-AnalysisOutput. | P1 | V2-CH5 |
| G8 | אין קנררי למנוע החלטה canaryLimits.ts מוגבל למסחר ידני (checkCanaryManualBuy, manual path only). אין מגבלות ניסוי למנוע ההחלטה (max decisions/cycle, confidence floor, מגבלות סמכויות החלטה ב-Shadow). | P2 | V2-CH8 |
תיקון ארכיטקטוני — G4: גבולות סמכות ווטו
וטו שייך רק ל-Risk Gate: זכות וטו (veto_power) אינה מוענקת לאף סוכן או ל-CIO. ה-Risk Gate הדטרמיניסטי (assertDecisionActive + checkRiskGatePassed) הוא השער היחיד שיכול לחסום ביצוע. סוכן ניתוח — גם Portfolio Risk — אינו Risk Gate.
במקום authority_weight: יש לתעד בפרופיל הסוכן שלושה שדות נפרדים: analysis_role (תפקיד הניתוח: scanner/news/technical/portfolio_risk), priority_class (כבר קיים: P0_PROTECTION / P1_ANALYSIS / P2_BACKGROUND), ו-reliability_profile (תיעוד היסטוריית דיוק). המשקולות עצמן מנוהלות במדיניות ה-CIO ואינן מעניקות לסוכן סמכות החלטה או וטו.
Portfolio Risk ≠ Risk Gate: Portfolio Risk Agent הוא סוכן ניתוח (P0_PROTECTION) שמספק קלט. Risk Gate הוא מנוע דטרמיניסטי שבודק חוקים קשיחים (freeze, TTL, budget, canary). אין להעניק לסוכן Portfolio Risk סמכות וטו — הוא רק מזהה סיכונים ומעביר אותם כ-AnalysisOutput.
סיכום והמלצה
8/8 רכיבים קיימים ויציבים — 6 מאוכלסים ופעילים, 2 (PromptVersion, ModelVersion) ריקים אך סכמתית מוכנים. כרך 2 אינו בונה מסלול מקביל.
3 פערי P0 (G1-G3): איחוד ראיות, ציון ביטחון, אלגוריתם CIO — אלו לב העבודה בפרקים 5–7.
4 פערי P1-P2 (G4-G8): פרופיל CIO (ללא veto_power), ישויות ריקות, Candidate, מחלוקות, קנררי — יטופלו בפרקים 1, 2, 4, 5, 8.
ראיות קוד מלאות: נוספו הפניות לפונקציות, קוראים (callers), כותבים והוכחות לכל רכיב. PROOF: Decision נוצר מסוכן יחיד (decisionObject.ts:270 — agent_name יחיד). PROOF: compareOutputs אינו מחובר (dead code). PROOF: storeOutput אינו נקרא. PROOF: checkFreshness אינו נקרא.
חלק תפעולי מלא: לכל רכיב תועדו: טריגרים, קלטים, פלטים, שמירה, מצבים, טיפול בכשל, WAIT, NO_OPINION, Shadow, ו-Prompt/Model פעילים.
המלצה: לעבור ל-V2-CH1-002 (Decision Doctrine) — נעילת הגדרה רשמית של מנוע ההחלטה, סמכויות ה-CIO (ללא veto_power), וגבולות הסמכות. לאחר אישור שלושת התוצרים (מיפוי As-Is, Decision Doctrine, נעילת גבולות) ניתן להפיק את V2-CH1 ב-Review 0.2 ולפתוח את V2-CH2.