InvestIQ

InvestIQ

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

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

V2-CH1-001 — מיפוי As-Is

כרך 2 · פרק 1 · משימה 001 · מיפוי רכיבי קוד וישויות קיימים

Review 0.2 · 11.8.2026

מטרת המסמך

מיפוי קריאת-קוד מלא של שמונת רכיבי הקוד והישויות שכרך 2 נשען עליהם. המסמך מתעד את המצב הנוכחי (As-Is), את תפקיד הרכיב בכרך 2, ראיות קוד (קובץ, פונקציה, קורא, כותב), פרטים תפעוליים (טריגרים, קלטים, פלטים, שמירה, מצבים, כשל, WAIT, NO_OPINION, Shadow, Prompt/Model), ואת הפערים שכרך 2 יצטרך לסגור. זהו הבסיס ל-V2-CH1-002 (Decision Doctrine) ולנעילת גבולות הסמכות. קריאת קוד בלבד — ללא שינוי במערכת.

גבול כרך 1: כל הרכיבים הממופים כאן נחתמו בכרך 1 (244/244 PASS). כרך 2 אינו משנה אותם ואינו גורע מהם. שינוי הכרחי בחוזה שננעל מחייב ADR וגרסה חדשה.

מיפוי 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)
צינור A: runAgentScan (שלבים 1–3) · צינור B: refreshPortfolioPrices (שלבים 4–6, בעלים הביצוע היחיד)
שלבפאזהטריגרפונקציהקובץקלטפלטישות נשמרת
1CIO_SCANCron 10min / ManualanalyzeAgent()runAgentScan/entry.ts:452portfolioSymbols, agent config, LLM promptLLM result: { symbols[], sentiment, summary }AgentLog, Alert, WatchList, Message
1aDual WriteWithin CIO_SCANadaptAgentOutput()agentAdapters.ts:11LLM result, agent, profileAnalysisOutput (conclusion, confidence, evidence)AnalysisOutput
2PRE_RISK_CHECKAfter CIO_SCAN(inline in runAgentScan)runAgentScan/entry.ts:203phase1 results, live quotes, settingsgate-approved decisions (score ≥ 8.5 full_auto / ≥ 9.5 semi_auto high-confidence)— (in-memory)
3APPROVALAfter PRE_RISK_CHECKcreateDecision() + publishDecision()decisionObject.ts:243,306DecisionData (action, symbol, confidence)Decision: DRAFT → ACTIVE (frozen snapshot)Decision
3aTrade CreationAfter Decision publishedcreateTradeWithAudit()stateMachine.tsTrade data + decision_idTrade (pending)Trade
3bAuto-approveIf full_auto + score ≥ 8.5transitionTradeStatus()stateMachine.tsTrade id, to: "approved"Trade (pending → approved)Trade
4PRICE_REFRESHCron 5min(inline)refreshPortfolioPrices/entry.ts:106Portfolio, Yahoo quotespriceMap, triggers (stop/TP/drop)Portfolio (updated)
5TRADE_VALIDITYAfter PRICE_REFRESHvalidateStaleProposals()orchestrator.ts:21Pending trades, live pricesrejected (price drift) / refreshedTrade (expired/updated)
6EXECUTIONAfter VALIDITYexecuteTrade()tradeExecution.tsApproved trades (protection sells first)Executed tradesTrade (executed)
6aRISK_GATEBefore each executeassertDecisionActive + checkRiskGatePassed + checkApprovalValiddecisionObject.ts:569,607,617Decision (canonical, ACTIVE)Pass (proceed) / Fail (block — has veto authority)RiskVerdict, ApprovalRecord

רכיבי קוד וישויות — מיפוי As-Is עם ראיות ופרטים תפעוליים

orchestrator.ts
base44/shared/orchestrator.tsיציב
תפקיד

ניהול שלבי ה-pipeline הדטרמיניסטיים

מצב נוכחי

שלבים: PRICE_REFRESH, TRADE_VALIDITY, RISK_GATE, APPROVAL, EXECUTION. שלבי LLM (CIO_SCAN) חיים ב-runAgentScan וב-refreshPortfolioPrices. ה-orchestrator אינו מכיל לוגיקת CIO — הוא מנהל שלבים דטרמיניסטיים בלבד.

תפקיד בכרך 2

תשתית הזרימה נשארת. כרך 2 מוסיף שלבי ניתוח והחלטה לפני Risk Gate, בלי לשנות את השלבים הקיימים.

פער: אין שלב איחוד ראיות (Evidence Fusion), אין שלב ציון ביטחון (Confidence Scoring), אין שלב אלגוריתם CIO.
ראיות קוד
orchestrator.ts:21validateStaleProposals()
נקרא ע"י: refreshPortfolioPrices/entry.ts:9 (Stage 2)
כותב: Trade (expired / updated)
הפונקציה היחידה המיוצאת מעבר ל-auditSteps — אין לוגיקת CIO כלל.
orchestrator.ts:10export { runStep, logStep, newRunId }
נקרא ע"י: runAgentScan + refreshPortfolioPrices
כותב: Message (audit step log)
runStep עוטף כל שלב בלוג גרסאי.
פרטים תפעוליים
טריגרים: Cron 5min (refreshPortfolioPrices) + Cron 10min (runAgentScan)
קלטים: Portfolio, pending trades, live Yahoo quotes, settings
פלטים: rejected/refreshed proposals, audit step events
שמירה: Trade entity (status updates), Message entity (step logs)
מצבים: N/A — אין מצבים פנימיים; פונקציות חסרות מצב (stateless)
טיפול בכשל: כל שגיאה נתפסת ב-try/catch ואינה שוברת את השלב; נרשמת ל-Message
WAIT: N/A — אין מצב WAIT ב-orchestrator
NO_OPINION: N/A — אינו סוכן
Shadow: N/A
Prompt/Model: N/A — אין LLM
decisionObject.ts
base44/shared/decisionObject.tsיציב
תפקיד

חוזה ה-Decision הגרסאי עם Snapshot קפוא

מצב נוכחי

CH3-005 v1.0 — Enforced. ישויות נפרדות: Decision (immutable post-publish), RiskVerdict, ApprovalRecord. CAS + Idempotency + supersedeDecision אטומי. action-dependent validation (ENTRY/POSITION/EXIT). TTL + expiry.

תפקיד בכרך 2

Decision נשאר חוזה הפלט של כרך 2. ה-CIO יוצר Decision דרך createDecision ומפרסם דרך publishDecision — בלי לשנות את החוזה.

פער: כיום Decision נוצר ישירות מתוך agent scan (single-agent). אין שלב איחוד ראיות מרובה-סוכנים לפני יצירת ה-Decision.
ראיות קוד
decisionObject.ts:243createDecision()
נקרא ע"י: runAgentScan/entry.ts:299 (buy) + :359 (sell)
כותב: Decision entity (DRAFT)
PROOF single-agent: createDecision מקבל agent_name יחיד (line 270: agent_name: data.agent_name). אין ריבוי סוכנים לפני יצירת ה-Decision.
decisionObject.ts:306publishDecision()
נקרא ע"י: runAgentScan/entry.ts:312 (buy) + :370 (sell)
כותב: Decision entity (ACTIVE + frozen snapshot + hash)
publishDecision מקפיא snapshot ומחשב SHA-256.
decisionObject.ts:569assertDecisionActive()
נקרא ע"י: tradeExecution.ts (before executeTrade)
כותב: n/a — read-only gate
שער חובה לפני ביצוע: בודק ACTIVE + TTL + snapshot_frozen.
decisionObject.ts:607checkRiskGatePassed()
נקרא ע"י: tradeExecution.ts
כותב: RiskVerdict entity (read)
בודק שקיים RiskVerdict עם verdict=PASS.
decisionObject.ts:617checkApprovalValid()
נקרא ע"י: tradeExecution.ts
כותב: ApprovalRecord entity (read)
בודק שקיים ApprovalRecord עם approval_status=approved.
decisionObject.ts:70DECISION_OBJECT_MODE = "enforced"
נקרא ע"י: כל הפונקציות
כותב: n/a
מצב Enforced — כל Trade חייב Decision פעיל, אחרת נחסם.
פרטים תפעוליים
טריגרים: קריאה מ-runAgentScan (APPROVAL stage) ומ-tradeExecution (before execute)
קלטים: DecisionData (action, symbol, confidence, agent_name, decision_cycle_id, ...)
פלטים: Decision (DRAFT → ACTIVE → SUPERSEDED/CANCELLED/EXPIRED)
שמירה: Decision entity + RiskVerdict + ApprovalRecord
מצבים: DRAFT → ACTIVE → SUPERSEDED / CANCELLED / EXPIRED
טיפול בכשל: Enforced: כשל ב-createDecision/publishDecision חוסם את ה-Trade (continue). Shadow: נופל דרך (fall-through).
WAIT: Decision עם action=WAIT נוצר כאשר הסוכן אינו בטוח; context=POSITION בלבד. דורש reasoning.
NO_OPINION: AnalysisOutput.conclusion=NO_OPINION אינו יוצר Decision כלל — נשמר כ-output בלבד.
Shadow: Feature flag: enforced | shadow | disabled. כיום enforced מאז CH3-005 v1.0.
Prompt/Model: DecisionData.model_version ו-prompt_version קיימים בחוזה אך כיום ריקים/ברירת מחדל ("gemini_3_flash").
agentAdapters.ts
base44/shared/agentAdapters.tsיציב
תפקיד

התאמת פלטי סוכנים לחוזה AnalysisOutput (Dual Write)

מצב נוכחי

CH4-004 v1.0 — 5 סוכנים פעילים (US Scanner, IL Scanner, News, Technical, Portfolio Risk). Financial Reports מושהה. כל adapter רץ במקביל לנתיב הקיים (Dual Write) ולא משנה לוגיקה.

תפקיד בכרך 2

Adapters הם מקור ה-AnalysisOutput שכרך 2 יאחד. כל סוכן מניב output מובנה עם conclusion, evidence, confidence, uncertainty.

פער: אין צרכן — ה-AnalysisOutput נשמר אך אף רכיב אינו קורא אותו לאיחוד. compareOutputs קיים אך לא מחובר.
ראיות קוד
agentAdapters.ts:11adaptAgentOutput()
נקרא ע"י: runAgentScan/entry.ts:492 (inside analyzeAgent)
כותב: AnalysisOutput entity
Dual Write: רץ במקביל לנתיב הקיים. כשל אינו שובר את ה-scan (line 493: catch + ignore).
agentAdapters.ts:87ADAPTER_FLAGS
נקרא ע"י: isAdapterEnabled()
כותב: n/a
5 true, 1 false (Financial Reports). Feature flag per agent.
agentAdapters.ts:96isAdapterEnabled()
נקרא ע"י: runAgentScan/entry.ts:490
כותב: n/a
שומר על ה-adapters הפעילים בלבד.
agentAdapters.ts:102compareOutputs()
נקרא ע"י: אף קובץ אינו מייבא/קורא — UNCONNECTED
כותב: n/a
PROOF: compareOutputs מוגדרת אך אינה מיובאת או נקראת בשום מקום בקוד. פונקציית dead code.
פרטים תפעוליים
טריגרים: Within CIO_SCAN (runAgentScan), per-agent, במקביל
קלטים: LLM result, agent config, active profile
פלטים: AnalysisOutput entity (conclusion, confidence, evidence, uncertainty, missing_data)
שמירה: AnalysisOutput entity (30-min TTL: expires_at)
מצבים: VALID | STALE | EXPIRED | REJECTED | NO_OPINION
טיפול בכשל: Dual Write: כשל ב-adaptation/storage אינו שובר את הנתיב הקיים. נרשם ל-Message (risk_warning).
WAIT: N/A — אין מצב WAIT ב-adapters
NO_OPINION: אם LLM החזיר symbols ריק → conclusion=NO_OPINION, status=NO_OPINION, reason_code=LLM_RETURNED_NO_SYMBOLS
Shadow: Feature flag per agent (ADAPTER_FLAGS). Financial Reports = false (paused).
Prompt/Model: model_profile נלקח מ-profile (ברירת מחדל: gemini_3_flash). prompt נבנה ב-buildPrompt (runAgentScan:620).
analysisOutput.ts
base44/shared/analysisOutput.tsיציב
תפקיד

חוזה פלט ניתוח מאוחד, מובנה וגרסאי

מצב נוכחי

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

זהו החוזה המרכזי שכרך 2 צורך. כל ניתוח מגיע כ-AnalysisOutput ואיחוד ראיות יקרא ממנו.

פער: אין שדה source_weight או reliability_profile — לא ניתן להבחין בין סוכן P0 (Portfolio Risk) ל-P1 (Scanner). אין שדה conflict_flag לסימון מחלוקות. אין analysis_role.
ראיות קוד
analysisOutput.ts:8interface AnalysisOutput
נקרא ע"י: agentAdapters.ts + decisionObject.ts
כותב: n/a — type definition
Schema v1. אין source_weight, authority_weight, veto_power, conflict_flag, או analysis_role.
analysisOutput.ts:45createOutputTemplate()
נקרא ע"י: fromLLMAnalysis() (line 155)
כותב: AnalysisOutput object (in-memory)
יוצר template עם ברירת מחדל: conclusion=NO_OPINION, confidence=0, uncertainty=1.
analysisOutput.ts:148fromLLMAnalysis()
נקרא ע"י: adaptAgentOutput() (agentAdapters.ts:30)
כותב: AnalysisOutput (in-memory)
ממפה LLM result → AnalysisOutput. מסיק conclusion מ-recommendation.
analysisOutput.ts:76validateOutput()
נקרא ע"י: adaptAgentOutput() (agentAdapters.ts:33)
כותב: n/a — validation
מוודא: confidence 0-10, uncertainty 0-1, NO_OPINION מחייב reason_code, non-NO_OPINION מחייב evidence.
analysisOutput.ts:129checkFreshness()
נקרא ע"י: לא מחובר בקוד הפעיל — UNCONNECTED
כותב: n/a
PROOF: checkFreshness מוגדרת אך אינה נקראת בשום נתיב פעיל. טריות נבדקת רק דרך expires_at ב-Decision.
analysisOutput.ts:201storeOutput()
נקרא ע"י: לא מחובר — UNCONNECTED (adaptAgentOutput עושה create משלו)
כותב: AnalysisOutput entity
PROOF: storeOutput אינה נקראת. adaptAgentOutput מבצע b.entities.AnalysisOutput.create ישירות (agentAdapters.ts:50).
פרטים תפעוליים
טריגרים: נקרא דרך adaptAgentOutput במהלך CIO_SCAN
קלטים: LLM result (symbols[], sentiment, summary), agent, profile
פלטים: AnalysisOutput object (conclusion, confidence, evidence[], risks[], missing_data[])
שמירה: AnalysisOutput entity (TTL 30 דקות)
מצבים: VALID | STALE | EXPIRED | REJECTED | NO_OPINION
טיפול בכשל: כשל ב-validation נרשם ל-Message ואינו שובר את ה-scan. storeOutput זורק שגיאה.
WAIT: N/A — אין מצב WAIT בחוזה
NO_OPINION: conclusion=NO_OPINION + status=NO_OPINION + reason_code (NOT_YET_POPULATED / LLM_NO_CLEAR_RECOMMENDATION / LLM_RETURNED_NO_SYMBOLS). אינו יוצר Decision.
Shadow: N/A — חוזה נתונים, אין feature flag
Prompt/Model: N/A — אין LLM בחוזה עצמו
agentProfile.ts
base44/shared/agentProfile.tsיציב
תפקיד

פרופיל גרסאי לכל סוכן — משימה, קלטים, יציאה, הרשאות

מצב נוכחי

CH4-002 v1.0 — 5 סוגים: scanner, news, technical, financials, portfolio. DEFAULT_PROHIBITED כולל executeTrade. ולידציה: Financial Reports חייב shadow, CIO חייב shadow, Portfolio Risk חייב P0.

תפקיד בכרך 2

פרופילים נשארים. כרך 2 עשוי להוסיף פרופיל CIO רשמי (כיום CIO הוא shadow בלבד, ללא פרופיל ייעודי).

פער: אין פרופיל CIO רשמי. אין שדה analysis_role או reliability_profile בפרופיל — הכרחי לאיחוד ראיות בפרק 5. אין veto_power (נכון — וטו שייך רק ל-Risk Gate).
ראיות קוד
agentProfile.ts:22buildProfileTemplate()
נקרא ע"י: createAllProfiles() (line 135)
כותב: AgentProfile entity
5 templates: scanner, news, technical, financials, portfolio. אין template ל-CIO.
agentProfile.ts:72portfolio: { priority_class: "P0_PROTECTION" }
נקרא ע"י: buildProfileTemplate
כותב: n/a
Portfolio Risk = P0_PROTECTION. אך זהו סוכן ניתוח — אינו Risk Gate.
agentProfile.ts:121CIO must be shadow
נקרא ע"י: validateProfile()
כותב: n/a
PROOF: אין template ל-CIO, אך ולידציה מחייבת ש-CIO (אם ייווצר) יהיה shadow בלבד.
agentProfile.ts:208getActiveProfile()
נקרא ע"י: adaptAgentOutput() (agentAdapters.ts:24)
כותב: AgentProfile entity (read)
מחזיר את ה-profile התקף האחרון לכל agent.
agentProfile.ts:11DEFAULT_PROHIBITED
נקרא ע"י: buildProfileTemplate
כותב: n/a
PROOF: כל הסוכנים אסורים ב-executeTrade, modify_risk_rule, change_global_freeze, access_broker_credentials. אין וטו לאף סוכן.
פרטים תפעוליים
טריגרים: createAllProfiles (initCH4), getActiveProfile (per scan)
קלטים: AgentConfig entity (agent list)
פלטים: AgentProfile entity (versioned, immutable)
שמירה: AgentProfile entity
מצבים: is_valid=true/false. גרסאות: agent_version (monotonic).
טיפול בכשל: כשל ב-validation נרשם וה-profile אינו נוצר. הסוכן ממשיך ללא profile (fallback).
WAIT: N/A — אין WAIT בפרופיל
NO_OPINION: fallback_action: "NO_OPINION" (כל הסוגים) — אם הסוכן נכשל/פ�ם תוקף, התוצאה היא NO_OPINION.
Shadow: Financial Reports: visibility=shadow, activation_policy=manual_only. CIO: חייב shadow.
Prompt/Model: model_profile: ברירת מחדל gemini_3_flash (line 87). אין PromptVersion/ModelVersion מחובר.
canaryLimits.ts
base44/shared/canaryLimits.tsיציב
תפקיד

מגבלות ניסוי Phase 0 — manual בלבד

מצב נוכחי

MAX_OPEN_PROPOSALS = 1. בודק: מקסימום הצעה פתוחה אחת, אין כפילות symbol, שמירת מזומן. פעיל ל-management_mode=manual בלבד.

תפקיד בכרך 2

כרך 2 ירחיב את הקנררי למנוע החלטה: מגבלת Decisions פתוחים, מגבלת סמכויות, מגבלת הפסדים ב-Shadow.

פער: קנררי נוכחי מוגבל למסחר ידני. אין קנררי למנוע החלטה (confidence thresholds, max decisions per cycle, veto limits).
ראיות קוד
canaryLimits.tscheckCanaryManualBuy()
נקרא ע"י: runAgentScan/entry.ts:240 (PRE_RISK_CHECK, manual path only)
כותב: n/a — gate check
PROOF: נקרא רק כאשר useManual=true (line 239). אין קנררי ל-full_auto/semi_auto/hard_semi (רק manual מוגן).
canaryLimits.tsMAX_OPEN_PROPOSALS = 1
נקרא ע"י: checkCanaryManualBuy
כותב: n/a
מגבלה: הצעה פתוחה אחת בלבד למצב ידני.
פרטים תפעוליים
טריגרים: PRE_RISK_CHECK ב-runAgentScan (רק מצב manual)
קלטים: symbol, cashManualUsd, maxTradeValueUsd
פלטים: { allowed, reason, availableBudgetUsd, openCount }
שמירה: n/a — gate check ללא שמירה
מצבים: N/A — stateless gate
טיפול בכשל: אם הקנררי חוסם, ההצעה אינה נוצרת. נרשם ל-logStep.
WAIT: N/A
NO_OPINION: N/A
Shadow: N/A — פעיל רק ב-manual, אין shadow mode
Prompt/Model: N/A — אין LLM
PromptVersion (entity)
base44/entities/PromptVersion.jsoncריק
תפקיד

ישות לניהול גרסאות Prompt לפי סוג סוכן

מצב נוכחי

סכמה v1 — שדות: prompt_version_id, agent_type, version, prompt_text, change_reason, approved_by, effective_from, supersedes_version, is_active. הסכמה קיימת אך לא מאוכלסת — אין גרסאות Prompt פעילות.

תפקיד בכרך 2

פרק 4 (Prompt ומודלים) יאכלס את הישות ויחבר אותה ל-Decision (prompt_version field כבר קיים ב-DecisionData).

פער: ישות ריקה. אין flow ליצירת/אישור/הפעלת גרסת Prompt. אין חיבור ל-Decision.prompt_version בפועל.
ראיות קוד
entities/PromptVersion.jsoncschema v1
נקרא ע"י: n/a — לא מאוכלסת
כותב: n/a
PROOF: ישות ריקה. 0 רשומות. שדה prompt_version ב-DecisionData קיים (decisionObject.ts:53) אך תמיד ריק/undefined.
runAgentScan/entry.ts:620buildPrompt()
נקרא ע"י: analyzeAgent
כותב: n/a — inline prompt string
PROOF: prompts נבנים inline בקוד, לא דרך PromptVersion entity. אין גרסאות, אין אישור, אין audit.
פרטים תפעוליים
טריגרים: N/A — ישות ריקה
קלטים: N/A
פלטים: N/A
שמירה: PromptVersion entity (0 records)
מצבים: N/A
טיפול בכשל: N/A
WAIT: N/A
NO_OPINION: N/A
Shadow: N/A — ישות ריקה
Prompt/Model: כיום: prompts נבנים inline ב-buildPrompt (runAgentScan:620). model=gemini_3_flash hardcoded.
ModelVersion (entity)
base44/entities/ModelVersion.jsoncריק
תפקיד

ישות לניהול גרסאות מודל לפי סוג סוכן

מצב נוכחי

סכמה v1 — שדות: model_version_id, agent_type, model_profile, version, change_reason, approved_by, effective_from, supersedes_version, is_active. הסכמה קיימת אך לא מאוכלסת.

תפקיד בכרך 2

פרק 4 יאכלס את הישות. Decision.model_version כבר קיים בחוזה.

פער: ישות ריקה. אין flow ליצירת/אישור/הפעלת גרסת מודל. אין חיבור ל-Decision.model_version בפועל.
ראיות קוד
entities/ModelVersion.jsoncschema v1
נקרא ע"י: n/a — לא מאוכלסת
כותב: n/a
PROOF: ישות ריקה. 0 רשומות. שדה model_version ב-DecisionData קיים (decisionObject.ts:53) אך מקבל "gemini_3_flash" hardcoded.
runAgentScan/entry.ts:459model: "gemini_3_flash"
נקרא ע"י: InvokeLLM
כותב: n/a
PROOF: model hardcoded בקוד. אין קריאה מ-ModelVersion entity. אין גרסאות, אין אישור.
פרטים תפעוליים
טריגרים: N/A — ישות ריקה
קלטים: N/A
פלטים: N/A
שמירה: ModelVersion entity (0 records)
מצבים: N/A
טיפול בכשל: N/A
WAIT: N/A
NO_OPINION: N/A
Shadow: N/A — ישות ריקה
Prompt/Model: כיום: model=gemini_3_flash hardcoded ב-runAgentScan:459 ו-refreshPortfolioPrices. אין ניהול גרסאות.

ניתוח פערים לכרך 2

מזההפערחומרהפרק מטפל
G1
אין שלב איחוד ראיות (Evidence Fusion)
לא קיים רכיב שקורא מספר AnalysisOutput-ים לאותו סמל/cycle ומאחד אותם לחבילת ראיות אחת. כיום כל סוכן יוצר Decision משלו בנפרד.
P0V2-CH5
G2
אין ציון ביטחון מאוחד (Confidence Scoring)
confidence נקבע על-ידי סוכן בודד. אין רכיב שמשקלל מספר דעות לציון אחד עם משמעות מדידה.
P0V2-CH6
G3
אין אלגוריתם CIO
אין רכיב שמקבל חבילת ראיות ומפיק Decision אחד מנומק. כיום Decision נוצר ישירות מ-output של סוכן בודד.
P0V2-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.
P1V2-CH1
G5
ישויות PromptVersion ו-ModelVersion ריקות
הסכמות קיימות אך לא מאוכלסות. אין flow ליצירה/אישור/הפעלה. אין חיבור בפועל ל-Decision. Prompts ו-models מוגדרים inline בקוד.
P1V2-CH4
G6
אין חבילת Candidate רשמית
אין ישות/רכיב שמייצג הזדמנות מזוהה ולא-כפולה לפני ניתוח עמוק. כיום כל סריקה יוצרת Trade/Decision ישירות.
P1V2-CH2
G7
אין טיפול במחלוקות
אין לוגיקה לזיהוי וטיפול בדעות סותרות בין סוכנים (למשל Scanner אומר BUY ו-Portfolio Risk אומר SELL). אין שדה conflict_flag ב-AnalysisOutput.
P1V2-CH5
G8
אין קנררי למנוע החלטה
canaryLimits.ts מוגבל למסחר ידני (checkCanaryManualBuy, manual path only). אין מגבלות ניסוי למנוע ההחלטה (max decisions/cycle, confidence floor, מגבלות סמכויות החלטה ב-Shadow).
P2V2-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.

קריאת קוד בלבד — ללא שינוי במערכת · Review 0.2 · 11.8.2026
חזרה למפרטים ומסמכים
info@investiq.co.il054-4860090