fahali-mcp
Fahali MCP exposes tier-gated market-intelligence and detection tools for crypto, US equities, and ETFs, returning uncertainty-aware signals and provenance rather than just raw prices.
Get market/symbol verdicts, 72h crash/pump/neutral forecasts with p10/p50/p90 uncertainty cones, snapshots, sentiment, regime, conviction signals, and daily briefings.
Assess risk with flash-crash precursor strength, institutional risk scores, portfolio/custom-portfolio risk, VaR/drawdown breakdowns, shock tests, correlation matrices, and contagion maps.
Inspect detection activity and market proxies: dark-pool proxy, smart-money alert lean (not institutional flow), whale activity that abstains without on-chain data, capital-flow imbalance, realtime alert clusters, engine status, and visual intelligence.
Verify performance and provenance via track-record scorecard, case studies, lead-time metrics, engine status, and explicit disclaimers/data-origin notes.
Use agent/account utilities: save/search memories, create custom alerts, and list agent sessions, subject to Free/Professional/Elite tier limits. Informational only — not financial advice.
Provides CrewAI adapter to integrate market-risk intelligence tools into CrewAI multi-agent systems.
Provides LangChain adapter to integrate market-risk intelligence tools into LangChain agent workflows.
Allows ChatGPT to access market-risk intelligence tools using the OpenAI tools format, providing structured market judgment and reasoning.
Provides adapters for Vercel AI SDK to integrate market-risk intelligence tools into AI applications.
Fahali MCP Server
Market-intelligence MCP server that ships uncertainty-aware intelligence with provenance on every response. Fahali runs an ensemble of independent detection engines across ~2,000 live crypto and US equity/ETF instruments in real time — public-market absorption patterns, liquidity anomalies, crash precursors, regime shifts — and detections are tracked against realized market outcomes in a signal→outcome ledger.
Informational only — not financial advice. Fahali detects anomalies; it does not tell you or your agent what to buy or sell.
Tools
Markets & verdict
Tool | What it returns | Minimum tier |
| Primary market-wide judgment: what changed, why it matters, horizon, evidence, conflicts, and invalidation | Professional |
| Primary binding judgment for exactly one named instrument | Professional |
| Audit-compatible canonical verdict path retained for existing integrations | Professional |
| Live prices, changes, asset class for all instruments | Free |
| HMM 4-regime detection: bullish/bearish/neutral/high_vol | Professional |
| Sentiment history with score, source, direction | Free |
| Priority risk clusters with risk conviction separated from directional conviction | Free |
| Yesterday vs today market intelligence diff (alert deltas, regime, intel reference) | Free teaser / Professional |
Risk & crash
Tool | What it returns | Minimum tier |
| Global 0-100 market-risk context from the canonical detection snapshot; not participant or portfolio risk | Professional |
| Uncalibrated early-warning strength and triggers; probability/action withheld unless calibrated | Professional |
| Risk score, VaR, drawdown, per-position breakdown | Elite |
| Stateless risk, canonical direction reconciliation, and covariance coverage for a supplied book; binding action withheld | Elite |
| Natural-language scenario stress test with capital at risk | Free |
Detection activity & flow proxies
Tool | What it returns | Minimum tier |
| Per-symbol detection counts and bullish-versus-bearish alert-type balance; this is alert activity, not executed trade flow | Professional |
| Participant-agnostic, candle-derived buy-versus-sell volume imbalance with conflicts and freshness explicit | Professional |
| Absorption observations derived from public aggregate trades and order-book snapshots, with source and limitations explicit | Professional |
| Measured 60-minute USD buy-vs-sell imbalance for requested symbols, or the strongest available readings. Candle-derived proxy; zero detector score does not erase measured flow | Professional |
| Crash/pump/neutral probabilities with a p10/p50/p90 uncertainty cone over the registered horizon | Professional |
| Per engine: measured hours of warning ahead of correct calls, misses included. Quote | Free |
| Full executive market analysis for today; PARTIAL when subsystems disagree | Professional |
Contagion & correlation
Tool | What it returns | Minimum tier |
| Contagion graph with tail-dependence edges and clusters | Elite |
| Requested-book Pearson matrix from the canonical 45-day covariance artifact, with pair observations and coverage | Free |
Portfolio & alerts
Tool | What it returns | Minimum tier |
| Sentiment momentum, cascade risk, liquidity stress, leverage | Professional |
| Unified detection feed from the active fleet right now | Professional |
Persistent monitoring, history & delivery
Tool | What it returns | Minimum tier |
| Durable portfolio + mandate + thresholds; evaluates immediately and continuously | Elite |
| Existing watches, sources, mandates, cadence and latest verdict IDs | Elite |
| Update positions or mandate and immediately see the new judgment | Elite |
| Binding HOLD/WATCH/REDUCE/EXIT judgment with what, why, when and invalidation | Elite |
| What changed since the previous immutable judgment and why | Elite |
| Cursor- and time-queryable immutable replay, including | Elite |
| One permanent judgment with its evidence and content hashes | Elite |
| Signed webhook/callback, Slack, Teams, account email or registered push delivery | Elite |
| Delivery configuration and health without exposing secrets | Elite |
| Pause, resume, filter or rotate a delivery target | Elite |
| Stop delivery while preserving its audit trail | Elite |
The monitor stores only user-scoped positions, mandate and evidence references. Callback configuration is encrypted. Delivery is deduplicated through a durable outbox, retried after transient failures, and marked failed rather than reported as sent when a channel does not accept it.
Proof & system
Tool | What it returns | Minimum tier |
| Honest 4-axis accuracy with base-rate lift | Professional |
| 40 verified signal→outcome cases with track record | Professional |
| Liveness report for the active detection fleet | Free |
| Unified constellation graph of the active fleet | Free |
Related MCP server: HPSILab - Quant Finance MCP Server for Stock Analysis and Options Analytics
Connect (remote SSE)
SSE endpoint: https://mcp.fahaliai.com/sse
Auth: Authorization: Bearer <your sk_live_ key>
OAuth is preferred. Query-string keys are legacy-only because URLs may be logged.Bring your own API key. Create one free in the Fahali app: app.fahaliai.com/developer (sign in → Developer / API).
Free developer key — the canonical market-decision path (
fahali_get_market_decision,fahali_get_symbol_decision, and the compatiblefahali_get_market_verdict) with reduced depth, 50 calls/day.Full key (Professional tier and above) — all tools at your subscription tier.
Local / stdio
npm install && npm run build
FAHALI_API_KEY=sk_live_... node dist/index.js --stdioClaude Desktop config:
{
"mcpServers": {
"fahali": {
"command": "node",
"args": ["/path/to/mcp-server/dist/index.js", "--stdio"],
"env": { "FAHALI_API_KEY": "sk_live_..." }
}
}
}Cursor config (~/.cursor/mcp.json):
{
"mcpServers": {
"fahali": {
"type": "sse",
"url": "https://mcp.fahaliai.com/sse?api_key=sk_live_..."
}
}
}Windsurf config: open Settings → Cascade → MCP, click Add custom server, and paste:
{
"mcpServers": {
"fahali": {
"type": "sse",
"url": "https://mcp.fahaliai.com/sse?api_key=sk_live_..."
}
}
}Or edit Windsurf's MCP config file directly (location varies by OS; use the UI if unsure).
Why this server
Most market-data MCP servers proxy raw prices. Fahali returns judged intelligence: each verdict carries a confidence score, the reasoning chain that produced it, and provenance you can audit. Detection accuracy is measured continuously against realized outcomes — engines that haven't earned a number report "calibrating", never an invented one.
API reference: https://app.fahaliai.com/openapi.json
Methodology: https://fahaliai.com/methodology
Pricing: https://app.fahaliai.com/pricing
Multi-tenant: each SSE connection is isolated with its own key; keys are never shared across sessions. Informational only, not financial advice.
Available Tools
58 toolsfahali_acknowledge_incidentAIdempotent
Record that an incident has been seen, which stops its escalation clock. Acknowledgment does NOT close the incident and asserts nothing about whether the risk passed — only a later verdict showing the breach cleared can resolve it. Idempotent by state: acknowledging twice returns the first acknowledgment unchanged, preserving the true responder and time, so no idempotency key is needed.
| Name | Required | Description | Default |
|---|---|---|---|
| note | No | Optional free text recorded with the acknowledgment. | |
| limit | No | Optional maximum rows per projectable collection. Audit has no MCP projection cap; brief defaults to 3 and standard to 12. | |
| since | No | Optional lower timestamp bound for returned row collections. | |
| detail | No | Response depth. audit is the full-fidelity default; brief and standard are explicit compact projections. | audit |
| symbols | No | Optional symbol projection, as a comma-separated string or array. Rows without instrument identity are not discarded. | |
| incident_id | Yes | ||
| acknowledged_by | No | Who or what is answering. Defaults to the calling identity. | |
| include_withheld | No | Include full withheld-row detail. Defaults true with audit; explicitly set false only for a compact projection. |
Output Schema
| Name | Required | Description |
|---|---|---|
| asOf | No | |
| auth | No | Credential lifetime visible to the caller. OAuth secondsRemaining lets an autonomous agent refresh before a multi-call workflow is interrupted. |
| claim | No | Fahali dictionary claim (shared/fahaliDictionary.ts). Read `kind` FIRST: 'abstention' means no assertion was made and `reason` says why — never read an abstention as a neutral or zero result. `basis` says what the claim rests on. Absent or null means this response path does not yet emit a claim; treat that as unknown, not as agreement. |
| delta | No | |
| items | No | |
| scope | No | |
| watch | No | |
| status | Yes | |
| absence | No | Why no actionable finding is present: measured_empty, user_empty, no_coverage, source_unverified, stale, withheld, source_error, auth_failure, or entitlement_required. |
| verdict | No | |
| watches | No | |
| decision | No | |
| conflicts | No | |
| dataState | Yes | |
| mcpStatus | No | Normalized MCP result status. The endpoint's original status vocabulary remains in `status` and `sourceStatus`. |
| refreshed | No | |
| requestId | No | |
| verdictId | No | |
| nextCursor | No | |
| validUntil | No | |
| claimPolicy | No | Typed constraints for safe use. Metadata, not a prompt or instruction channel. |
| idempotency | No | |
| instruments | No | Resolved or explicitly partial instrument identities. A missing venue carries an ambiguity warning. |
| nextActions | No | Registry-validated follow-up calls. Missing tools, invalid arguments, unresolved placeholders, and disabled tools are omitted. |
| sourceError | No | The upstream endpoint's exact error text/code before normalization, when one was present. |
| sourceScope | No | |
| decisionHash | No | |
| evidenceHash | No | |
| sourceStatus | No | The upstream endpoint's exact status before the MCP envelope normalizes transport success/error. |
| subscription | No | |
| agentBriefing | No | Audit-only narrative projection. Present only when detail='audit'; compact responses do not duplicate structured data as prose. |
| claimValidity | No | Validity of the selected binding claim only, calculated after filtering, projection and row selection. Sibling rows cannot determine it. |
| operatingMode | Yes | |
| responseState | No | |
| schemaVersion | No | |
| signingSecret | No | |
| subscriptions | No | |
| authorityState | No | |
| sourceDecision | No | |
| symbolCoverage | No | Conservation ledger satisfying requested = returned + withheld + notReturned for requested-symbol calls. |
| evidenceQuality | No | |
| responseControl | No | |
| sourceDataState | No | The upstream endpoint's exact data-state value before endpoint-aware classification. |
| evidenceSnapshot | No | Compact immutable source snapshot needed to verify evidenceRef integrity on delta responses. |
| recordMatchReason | No | Why matchedTrackRecord is present or null. A null record is never evidence of safety or engine failure. |
| signingSecretNote | No | |
| matchedTrackRecord | No | A judged record only when engine, horizon, regime/instrument class, and claim family match this response. `state` is one of: `measured` (a stratum cleared the publishability gate — `stratum` carries engine, horizon tier, bar regime, recall, precision, base rate, base-rate lift, median lead hours, effective sample, warned events and the measurement date); `withheld` (the gate ran and refused — `reason` says why, in words); `unavailable` (the record could not be read at all — an infrastructure failure that says nothing about the record). It is ONE stratum selected by recall, never a platform-wide accuracy. Null means no exact record match; read recordMatchReason. |
| methodologyVersion | No | |
| confidenceSemantics | No | Every confidence-bearing value with its score type, scale, calibration status, and probability flag. |
| decisionEligibility | No | Fail-closed binding-authority policy. WITHHELD means source evidence remains available for audit while normalized direction, actionability and execution fields are revoked. |
| directionEligibility | No | Current market-direction eligibility. Direction is authorized only by an exact, eligible producer stratum (canonical_verdict, canonical_symbol_verdict, committee_verdict) — read bindingAuthority to see which one bound. Widening WHO may bind did not weaken WHAT binding requires: the named producer must still hold a matching horizon/class/family record on a verified-only judged population, so an authority without a record still cannot bind. |
| executionEligibility | No | Fail-closed execution boundary. Portfolio monitoring tools always return WITHHELD with MONITOR_ONLY_NO_EXECUTION_AUTHORITY while Fahali has no capital path. |
| legacyFieldSemantics | Yes | |
| outputClassification | Yes | |
| monitoringEligibility | No | Current portfolio-monitoring validity based on captured identity, freshness, integrity, and the caller-supplied monitoring policy. ELIGIBLE authorizes observation/delivery only, never financial action. |
| sourceEvidenceQuality | No | |
| currentActionEligibility | No | Current eligibility of an immutable historical portfolio verdict. It never mutates the stored judgment being replayed. |
| sourceConfidenceSemantics | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare idempotentHint=true and destructiveHint=false, but the description earns credit by spelling out what idempotency means here ('returns the first acknowledgment unchanged, preserving the true responder and time') and by warning that the operation has a side effect (stopping the escalation clock) without resolving anything. It does not mention permission requirements or who may acknowledge, which is the remaining gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, each doing distinct work: what the tool does, what it does not do, and how repeat calls behave. The scope/effect statement is front-loaded ahead of the idempotency detail.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need no explanation, and the description covers the mutation's semantics and its limits completely. The only unaddressed complexity is the set of projection parameters (detail, limit, since, symbols, include_withheld), which are left entirely to the schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 88%, so the schema already documents incident_id, note, acknowledged_by, and the projection controls; the description adds no parameter-level meaning at all. Baseline 3 applies — nothing misleading, but nothing additive either.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a precise verb and resource ('Record that an incident has been seen') and immediately scopes it against the two things an agent would confuse it with: closing an incident and issuing a verdict. That makes it distinguishable from the many sibling read tools and from the verdict/history tools without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives a clear trigger ('record that an incident has been seen') and an explicit exclusion ('does NOT close the incident', 'asserts nothing about whether the risk passed'), routing resolution work elsewhere. It stops short of naming the sibling verdict tools by name, so the agent must infer which call actually resolves the incident.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fahali_analyze_custom_portfolioARead-onlyIdempotent
Analyze measured risk for a custom inline portfolio. Returns historical VaR/expected shortfall, detection-risk observations, canonical direction reconciliation, and a requested-book covariance matrix with per-position correlation coverage. It does not apply stored monitoring thresholds; legacy hold/watch/reduce labels are non-binding monitoring priority only. fahali_get_portfolio_decision adds durable thresholds but remains monitor-only and cannot authorize portfolio or order action.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Optional maximum rows per projectable collection. Audit has no MCP projection cap; brief defaults to 3 and standard to 12. | |
| since | No | Optional lower timestamp bound for returned row collections. | |
| detail | No | Response depth. audit is the full-fidelity default; brief and standard are explicit compact projections. | audit |
| symbols | No | Alternative to positions: comma-separated symbol names. NO position sizes are assumed — you get per-symbol observations only, and every portfolio-level figure is withheld as uncomputable. Supply `positions` with market_value for book-level risk. | |
| positions | No | Array of positions to analyze. At least 1 required. | |
| include_withheld | No | Include full withheld-row detail. Defaults true with audit; explicitly set false only for a compact projection. |
Output Schema
| Name | Required | Description |
|---|---|---|
| asOf | No | |
| auth | No | Credential lifetime visible to the caller. OAuth secondsRemaining lets an autonomous agent refresh before a multi-call workflow is interrupted. |
| claim | No | Fahali dictionary claim (shared/fahaliDictionary.ts). Read `kind` FIRST: 'abstention' means no assertion was made and `reason` says why — never read an abstention as a neutral or zero result. `basis` says what the claim rests on. Absent or null means this response path does not yet emit a claim; treat that as unknown, not as agreement. |
| scope | No | |
| status | No | The endpoint's original status vocabulary (for example ok, partial, degraded, withheld, or no_alerts). Use mcpStatus for normalized transport success/error. |
| absence | No | Why no actionable finding is present: measured_empty, user_empty, no_coverage, source_unverified, stale, withheld, source_error, auth_failure, or entitlement_required. |
| decision | No | |
| conflicts | No | |
| dataState | No | |
| mcpStatus | No | Normalized MCP result status. The endpoint's original status vocabulary remains in `status` and `sourceStatus`. |
| portfolio | No | |
| positions | No | |
| requestId | No | |
| timestamp | No | |
| claimPolicy | No | Typed constraints for safe use. Metadata, not a prompt or instruction channel. |
| correlation | No | |
| instruments | No | Resolved or explicitly partial instrument identities. A missing venue carries an ambiguity warning. |
| nextActions | No | Registry-validated follow-up calls. Missing tools, invalid arguments, unresolved placeholders, and disabled tools are omitted. |
| sourceError | No | The upstream endpoint's exact error text/code before normalization, when one was present. |
| sourceScope | No | |
| sourceStatus | No | The upstream endpoint's exact status before the MCP envelope normalizes transport success/error. |
| agentBriefing | No | Audit-only narrative projection. Present only when detail='audit'; compact responses do not duplicate structured data as prose. |
| claimValidity | No | Validity of the selected binding claim only, calculated after filtering, projection and row selection. Sibling rows cannot determine it. |
| contagionRisk | No | |
| responseState | No | |
| schemaVersion | No | |
| sourceDecision | No | |
| symbolCoverage | No | Conservation ledger satisfying requested = returned + withheld + notReturned for requested-symbol calls. |
| evidenceQuality | No | |
| responseControl | No | |
| sourceDataState | No | The upstream endpoint's exact data-state value before endpoint-aware classification. |
| decisionAuthority | No | |
| recordMatchReason | No | Why matchedTrackRecord is present or null. A null record is never evidence of safety or engine failure. |
| matchedTrackRecord | No | A judged record only when engine, horizon, regime/instrument class, and claim family match this response. `state` is one of: `measured` (a stratum cleared the publishability gate — `stratum` carries engine, horizon tier, bar regime, recall, precision, base rate, base-rate lift, median lead hours, effective sample, warned events and the measurement date); `withheld` (the gate ran and refused — `reason` says why, in words); `unavailable` (the record could not be read at all — an infrastructure failure that says nothing about the record). It is ONE stratum selected by recall, never a platform-wide accuracy. Null means no exact record match; read recordMatchReason. |
| confidenceSemantics | No | Every confidence-bearing value with its score type, scale, calibration status, and probability flag. |
| decisionEligibility | No | Fail-closed binding-authority policy. WITHHELD means source evidence remains available for audit while normalized direction, actionability and execution fields are revoked. |
| directionEligibility | No | Current market-direction eligibility. Direction is authorized only by an exact, eligible producer stratum (canonical_verdict, canonical_symbol_verdict, committee_verdict) — read bindingAuthority to see which one bound. Widening WHO may bind did not weaken WHAT binding requires: the named producer must still hold a matching horizon/class/family record on a verified-only judged population, so an authority without a record still cannot bind. |
| executionEligibility | No | Fail-closed execution boundary. Portfolio monitoring tools always return WITHHELD with MONITOR_ONLY_NO_EXECUTION_AUTHORITY while Fahali has no capital path. |
| monitoringEligibility | No | Current portfolio-monitoring validity based on captured identity, freshness, integrity, and the caller-supplied monitoring policy. ELIGIBLE authorizes observation/delivery only, never financial action. |
| sourceEvidenceQuality | No | |
| currentActionEligibility | No | Current eligibility of an immutable historical portfolio verdict. It never mutates the stored judgment being replayed. |
| sourceConfidenceSemantics | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover safety (readOnly, idempotent, non-destructive), so the bar is lower, and the description still adds real context: stored thresholds are not applied, legacy hold/watch/reduce labels are non-binding priority only, and nothing here authorizes portfolio or order action. It does not add pagination or rate-limit behavior, keeping it from a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose and outputs are front-loaded in the first two sentences, and the threshold/authorization caveats follow logically. The final sentence partly restates the 'does not apply stored thresholds' point about fahali_get_portfolio_decision, but it is dense rather than padded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values need not be spelled out, and annotations plus a 100%-covered schema carry the rest. The description supplies the key semantic caveats (no thresholds, non-binding labels, monitor-only, no authorization) so an agent can call it correctly; only explicit input-shape guidance is thin.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the schema itself explains the symbols-vs-positions tradeoff and the detail/limit defaults. The description adds essentially no parameter guidance beyond mentioning a 'requested-book covariance matrix', so the baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Analyze measured risk for a custom inline portfolio') and enumerates the concrete outputs (VaR/expected shortfall, detection-risk observations, direction reconciliation, covariance matrix). The 'custom inline' qualifier distinguishes it from stored-portfolio siblings like fahali_get_portfolio_risk and fahali_get_portfolio_metrics.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says it does not apply stored monitoring thresholds and names fahali_get_portfolio_decision as the alternative that adds durable thresholds. This gives a clear use-vs-alternative signal, though it never states the positive trigger (e.g. 'use when you have an ad-hoc position list not saved as a watch').
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fahali_create_alertA
Create a custom alert. Agent-created alerts appear in the in-app realtime feed, hard-marked with an agent_ type prefix so they are never confused with engine detections; they do not trigger push/SMS to other users, and severity is capped at high (critical is reserved for engines).
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Optional maximum rows per projectable collection. Audit has no MCP projection cap; brief defaults to 3 and standard to 12. | |
| since | No | Optional lower timestamp bound for returned row collections. | |
| detail | No | Response depth. audit is the full-fidelity default; brief and standard are explicit compact projections. | audit |
| symbol | Yes | Trading symbol (e.g. 'BTCUSDT'). | |
| message | Yes | Human-readable alert message. | |
| symbols | No | Optional symbol projection, as a comma-separated string or array. Rows without instrument identity are not discarded. | |
| severity | Yes | Severity level. `critical` is intentionally not offered: the upstream caps it to `high` (critical fans out to holder SMS/email and is reserved for engines), so asking for it would store something other than what was requested. | |
| alert_type | Yes | Alert classification (e.g. 'agent_insight', 'custom_pattern'). | |
| confidence | No | Confidence score 0-1 (optional, default 0.5). | |
| idempotency_key | No | Stable retry key. Repeating the same key returns the original alert instead of creating a duplicate. | |
| include_withheld | No | Include full withheld-row detail. Defaults true with audit; explicitly set false only for a compact projection. |
Output Schema
| Name | Required | Description |
|---|---|---|
| asOf | No | |
| auth | No | Credential lifetime visible to the caller. OAuth secondsRemaining lets an autonomous agent refresh before a multi-call workflow is interrupted. |
| alert | No | |
| claim | No | Fahali dictionary claim (shared/fahaliDictionary.ts). Read `kind` FIRST: 'abstention' means no assertion was made and `reason` says why — never read an abstention as a neutral or zero result. `basis` says what the claim rests on. Absent or null means this response path does not yet emit a claim; treat that as unknown, not as agreement. |
| scope | No | |
| status | No | The endpoint's original status vocabulary (for example ok, partial, degraded, withheld, or no_alerts). Use mcpStatus for normalized transport success/error. |
| absence | No | Why no actionable finding is present: measured_empty, user_empty, no_coverage, source_unverified, stale, withheld, source_error, auth_failure, or entitlement_required. |
| success | No | |
| decision | No | |
| conflicts | No | |
| dataState | No | |
| mcpStatus | No | Normalized MCP result status. The endpoint's original status vocabulary remains in `status` and `sourceStatus`. |
| requestId | No | |
| claimPolicy | No | Typed constraints for safe use. Metadata, not a prompt or instruction channel. |
| instruments | No | Resolved or explicitly partial instrument identities. A missing venue carries an ambiguity warning. |
| nextActions | No | Registry-validated follow-up calls. Missing tools, invalid arguments, unresolved placeholders, and disabled tools are omitted. |
| sourceError | No | The upstream endpoint's exact error text/code before normalization, when one was present. |
| sourceScope | No | |
| sourceStatus | No | The upstream endpoint's exact status before the MCP envelope normalizes transport success/error. |
| agentBriefing | No | Audit-only narrative projection. Present only when detail='audit'; compact responses do not duplicate structured data as prose. |
| claimValidity | No | Validity of the selected binding claim only, calculated after filtering, projection and row selection. Sibling rows cannot determine it. |
| responseState | No | |
| schemaVersion | No | |
| sourceDecision | No | |
| symbolCoverage | No | Conservation ledger satisfying requested = returned + withheld + notReturned for requested-symbol calls. |
| evidenceQuality | No | |
| responseControl | No | |
| sourceDataState | No | The upstream endpoint's exact data-state value before endpoint-aware classification. |
| idempotentReplay | No | True when this idempotency key already created an alert and the original was returned. |
| recordMatchReason | No | Why matchedTrackRecord is present or null. A null record is never evidence of safety or engine failure. |
| matchedTrackRecord | No | A judged record only when engine, horizon, regime/instrument class, and claim family match this response. `state` is one of: `measured` (a stratum cleared the publishability gate — `stratum` carries engine, horizon tier, bar regime, recall, precision, base rate, base-rate lift, median lead hours, effective sample, warned events and the measurement date); `withheld` (the gate ran and refused — `reason` says why, in words); `unavailable` (the record could not be read at all — an infrastructure failure that says nothing about the record). It is ONE stratum selected by recall, never a platform-wide accuracy. Null means no exact record match; read recordMatchReason. |
| confidenceSemantics | No | Every confidence-bearing value with its score type, scale, calibration status, and probability flag. |
| decisionEligibility | No | Fail-closed binding-authority policy. WITHHELD means source evidence remains available for audit while normalized direction, actionability and execution fields are revoked. |
| directionEligibility | No | Current market-direction eligibility. Direction is authorized only by an exact, eligible producer stratum (canonical_verdict, canonical_symbol_verdict, committee_verdict) — read bindingAuthority to see which one bound. Widening WHO may bind did not weaken WHAT binding requires: the named producer must still hold a matching horizon/class/family record on a verified-only judged population, so an authority without a record still cannot bind. |
| executionEligibility | No | Fail-closed execution boundary. Portfolio monitoring tools always return WITHHELD with MONITOR_ONLY_NO_EXECUTION_AUTHORITY while Fahali has no capital path. |
| monitoringEligibility | No | Current portfolio-monitoring validity based on captured identity, freshness, integrity, and the caller-supplied monitoring policy. ELIGIBLE authorizes observation/delivery only, never financial action. |
| sourceEvidenceQuality | No | |
| currentActionEligibility | No | Current eligibility of an immutable historical portfolio verdict. It never mutates the stored judgment being replayed. |
| sourceConfidenceSemantics | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations by disclosing real side effects: alerts surface in the in-app realtime feed, are prefixed with agent_ so they cannot be mistaken for engine detections, do not fan out to push/SMS, and severity is capped at high. This is exactly the kind of consequence an agent needs before writing. It omits the idempotency_key retry behavior, which lives only in the schema, and does not describe what the call returns.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single compact paragraph with the core action front-loaded and each clause carrying distinct behavioral content (feed visibility, prefix, no push/SMS, severity cap). Dense but no filler; slightly long as one unbroken sentence.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With 11 parameters at full schema coverage and an output schema present, the description does not need to explain params or return values. It covers the key behavioral risks (visibility, notification fan-out, severity ceiling) well; the only meaningful gap is the absence of usage routing toward related read tools.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so parameters are already fully documented, including the severity enum rationale and idempotency_key semantics. The description restates the severity cap that the schema also explains, adding emphasis but not new parameter-level information. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb and resource: 'Create a custom alert.' That is unambiguous and distinguishable from the read-only alert siblings such as fahali_get_realtime_alerts. It stops short of naming alternatives or stating scope constraints an agent would use for routing.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by 'Create a custom alert' and the agent-oriented framing, but there is no explicit when-to-use / when-not-to-use guidance, no mention of prerequisites, and no routing to sibling tools (e.g. reading alerts via fahali_get_realtime_alerts). An agent can infer intent but is not steered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fahali_daily_briefARead-onlyIdempotent
Lightweight daily orientation for agents that need the market state without a large payload. Returns the key change, why it matters, evidence quality, and next actions. Use market briefing for depth or market verdict for named symbols.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Optional maximum rows per projectable collection. Audit has no MCP projection cap; brief defaults to 3 and standard to 12. | |
| since | No | Optional lower timestamp bound for returned row collections. | |
| detail | No | Response depth. audit is the full-fidelity default; brief and standard are explicit compact projections. | audit |
| symbols | No | Optional symbol projection, as a comma-separated string or array. Rows without instrument identity are not discarded. | |
| include_withheld | No | Include full withheld-row detail. Defaults true with audit; explicitly set false only for a compact projection. |
Output Schema
| Name | Required | Description |
|---|---|---|
| asOf | No | |
| auth | No | Credential lifetime visible to the caller. OAuth secondsRemaining lets an autonomous agent refresh before a multi-call workflow is interrupted. |
| note | No | |
| as_of | No | |
| claim | No | Fahali dictionary claim (shared/fahaliDictionary.ts). Read `kind` FIRST: 'abstention' means no assertion was made and `reason` says why — never read an abstention as a neutral or zero result. `basis` says what the claim rests on. Absent or null means this response path does not yet emit a claim; treat that as unknown, not as agreement. |
| scope | No | |
| since | No | |
| regime | No | |
| status | No | The endpoint's original status vocabulary (for example ok, partial, degraded, withheld, or no_alerts). Use mcpStatus for normalized transport success/error. |
| absence | No | Why no actionable finding is present: measured_empty, user_empty, no_coverage, source_unverified, stale, withheld, source_error, auth_failure, or entitlement_required. |
| decision | No | |
| withheld | No | |
| conflicts | No | |
| dataState | No | |
| mcpStatus | No | Normalized MCP result status. The endpoint's original status vocabulary remains in `status` and `sourceStatus`. |
| requestId | No | |
| data_state | No | |
| risk_level | No | |
| risk_score | No | |
| top_signal | No | |
| claimPolicy | No | Typed constraints for safe use. Metadata, not a prompt or instruction channel. |
| instruments | No | Resolved or explicitly partial instrument identities. A missing venue carries an ambiguity warning. |
| nextActions | No | Registry-validated follow-up calls. Missing tools, invalid arguments, unresolved placeholders, and disabled tools are omitted. |
| prior_intel | No | |
| sourceError | No | The upstream endpoint's exact error text/code before normalization, when one was present. |
| sourceScope | No | |
| regime_state | No | |
| sourceStatus | No | The upstream endpoint's exact status before the MCP envelope normalizes transport success/error. |
| agentBriefing | No | Audit-only narrative projection. Present only when detail='audit'; compact responses do not duplicate structured data as prose. |
| claimValidity | No | Validity of the selected binding claim only, calculated after filtering, projection and row selection. Sibling rows cannot determine it. |
| responseState | No | |
| schemaVersion | No | |
| alert_activity | No | |
| response_state | No | |
| sourceDecision | No | |
| symbolCoverage | No | Conservation ledger satisfying requested = returned + withheld + notReturned for requested-symbol calls. |
| evidenceQuality | No | |
| responseControl | No | |
| sourceDataState | No | The upstream endpoint's exact data-state value before endpoint-aware classification. |
| regime_freshness | No | |
| withheld_reasons | No | |
| recordMatchReason | No | Why matchedTrackRecord is present or null. A null record is never evidence of safety or engine failure. |
| matchedTrackRecord | No | A judged record only when engine, horizon, regime/instrument class, and claim family match this response. `state` is one of: `measured` (a stratum cleared the publishability gate — `stratum` carries engine, horizon tier, bar regime, recall, precision, base rate, base-rate lift, median lead hours, effective sample, warned events and the measurement date); `withheld` (the gate ran and refused — `reason` says why, in words); `unavailable` (the record could not be read at all — an infrastructure failure that says nothing about the record). It is ONE stratum selected by recall, never a platform-wide accuracy. Null means no exact record match; read recordMatchReason. |
| confidenceSemantics | No | Every confidence-bearing value with its score type, scale, calibration status, and probability flag. |
| decisionEligibility | No | Fail-closed binding-authority policy. WITHHELD means source evidence remains available for audit while normalized direction, actionability and execution fields are revoked. |
| directionEligibility | No | Current market-direction eligibility. Direction is authorized only by an exact, eligible producer stratum (canonical_verdict, canonical_symbol_verdict, committee_verdict) — read bindingAuthority to see which one bound. Widening WHO may bind did not weaken WHAT binding requires: the named producer must still hold a matching horizon/class/family record on a verified-only judged population, so an authority without a record still cannot bind. |
| executionEligibility | No | Fail-closed execution boundary. Portfolio monitoring tools always return WITHHELD with MONITOR_ONLY_NO_EXECUTION_AUTHORITY while Fahali has no capital path. |
| monitoringEligibility | No | Current portfolio-monitoring validity based on captured identity, freshness, integrity, and the caller-supplied monitoring policy. ELIGIBLE authorizes observation/delivery only, never financial action. |
| sourceEvidenceQuality | No | |
| currentActionEligibility | No | Current eligibility of an immutable historical portfolio verdict. It never mutates the stored judgment being replayed. |
| sourceConfidenceSemantics | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive and open-world, so safety is covered; the description adds payload-size intent and the shape of the response. However, it claims the tool is lightweight 'without a large payload' while the schema's `detail` parameter defaults to `audit` (described as full-fidelity), and the description never reconciles that — an agent following the prose alone would get the opposite of what is promised.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences: purpose first, then return contents, then sibling routing. No filler and the most decision-relevant information is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be re-explained. But for a tool whose entire selling point is a small payload, the description omits the one thing an agent must know to honor that: the `detail` default is `audit`, not `brief`, and `include_withheld` defaults to true, so the caller must override parameters to actually get the lightweight response described.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all five parameters (limit, since, detail, symbols, include_withheld) with defaults and enum semantics. The description adds no parameter-level meaning beyond that, which is the expected baseline when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly frames the tool as a compact daily market orientation and enumerates what it returns (key change, why it matters, evidence quality, next actions). It names the two sibling tools it is not (market briefing, market verdict), so an agent can distinguish it without opening the schema. It falls short of a 5 only because the framing is payload-centric rather than a crisp verb+resource statement.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly routes the agent: use market briefing for depth, market verdict for named symbols, implying this is the default-shallow, symbol-agnostic entry point. There is no explicit when-not guidance (e.g. don't use this for a specific instrument question), but the alternatives are named and the selection condition is inferable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fahali_fact_check_narrativeARead-onlyIdempotent
Verify a proposed market narrative before repeating it. Each assertion returns SUPPORTED, CONTRADICTED, NO_READ, UNSUPPORTED_SOURCE, OUT_OF_SCOPE, or UNVERIFIABLE with safeToRepeat. Only SUPPORTED is repeatable; NO_READ is not agreement. The worst assertion determines the summary.
| Name | Required | Description | Default |
|---|---|---|---|
| claim | Yes | The narrative text you are about to state. Sentences are checked individually; pass the whole paragraph rather than one clause. | |
| limit | No | Optional maximum rows per projectable collection. Audit has no MCP projection cap; brief defaults to 3 and standard to 12. | |
| since | No | Optional lower timestamp bound for returned row collections. | |
| detail | No | Response depth. audit is the full-fidelity default; brief and standard are explicit compact projections. | audit |
| symbols | No | Optional. Instruments the claim is about, if they are not written as plain tickers in the text. | |
| include_withheld | No | Include full withheld-row detail. Defaults true with audit; explicitly set false only for a compact projection. |
Output Schema
| Name | Required | Description |
|---|---|---|
| asOf | No | |
| auth | No | Credential lifetime visible to the caller. OAuth secondsRemaining lets an autonomous agent refresh before a multi-call workflow is interrupted. |
| claim | No | |
| scope | No | |
| status | No | The endpoint's original status vocabulary (for example ok, partial, degraded, withheld, or no_alerts). Use mcpStatus for normalized transport success/error. |
| absence | No | Why no actionable finding is present: measured_empty, user_empty, no_coverage, source_unverified, stale, withheld, source_error, auth_failure, or entitlement_required. |
| coverage | No | Which named symbols Fahali actually holds a read on, and — when the lookup itself failed — that the check did not run. A failed lookup is reported as NO_READ, never as a pass. |
| decision | No | |
| checkedAt | No | |
| conflicts | No | |
| dataState | No | |
| mcpStatus | No | Normalized MCP result status. The endpoint's original status vocabulary remains in `status` and `sourceStatus`. |
| requestId | No | |
| assertions | No | |
| claimPolicy | No | Typed constraints for safe use. Metadata, not a prompt or instruction channel. |
| instruction | No | What to do with the narrative, in a sentence. |
| instruments | No | Resolved or explicitly partial instrument identities. A missing venue carries an ambiguity warning. |
| nextActions | No | Registry-validated follow-up calls. Missing tools, invalid arguments, unresolved placeholders, and disabled tools are omitted. |
| sourceError | No | The upstream endpoint's exact error text/code before normalization, when one was present. |
| sourceScope | No | |
| sourceStatus | No | The upstream endpoint's exact status before the MCP envelope normalizes transport success/error. |
| agentBriefing | No | Audit-only narrative projection. Present only when detail='audit'; compact responses do not duplicate structured data as prose. |
| claimValidity | No | Validity of the selected binding claim only, calculated after filtering, projection and row selection. Sibling rows cannot determine it. |
| responseState | No | |
| safeToPublish | No | True ONLY when every assertion is SUPPORTED by a current reading. Unchecked assertions make this false. |
| schemaVersion | No | |
| verdictCounts | No | |
| sourceDecision | No | |
| symbolCoverage | No | Conservation ledger satisfying requested = returned + withheld + notReturned for requested-symbol calls. |
| evidenceQuality | No | |
| responseControl | No | |
| sourceDataState | No | The upstream endpoint's exact data-state value before endpoint-aware classification. |
| recordMatchReason | No | Why matchedTrackRecord is present or null. A null record is never evidence of safety or engine failure. |
| symbolsRecognised | No | |
| matchedTrackRecord | No | A judged record only when engine, horizon, regime/instrument class, and claim family match this response. `state` is one of: `measured` (a stratum cleared the publishability gate — `stratum` carries engine, horizon tier, bar regime, recall, precision, base rate, base-rate lift, median lead hours, effective sample, warned events and the measurement date); `withheld` (the gate ran and refused — `reason` says why, in words); `unavailable` (the record could not be read at all — an infrastructure failure that says nothing about the record). It is ONE stratum selected by recall, never a platform-wide accuracy. Null means no exact record match; read recordMatchReason. |
| confidenceSemantics | No | Every confidence-bearing value with its score type, scale, calibration status, and probability flag. |
| decisionEligibility | No | Fail-closed binding-authority policy. WITHHELD means source evidence remains available for audit while normalized direction, actionability and execution fields are revoked. |
| directionEligibility | No | Current market-direction eligibility. Direction is authorized only by an exact, eligible producer stratum (canonical_verdict, canonical_symbol_verdict, committee_verdict) — read bindingAuthority to see which one bound. Widening WHO may bind did not weaken WHAT binding requires: the named producer must still hold a matching horizon/class/family record on a verified-only judged population, so an authority without a record still cannot bind. |
| executionEligibility | No | Fail-closed execution boundary. Portfolio monitoring tools always return WITHHELD with MONITOR_ONLY_NO_EXECUTION_AUTHORITY while Fahali has no capital path. |
| monitoringEligibility | No | Current portfolio-monitoring validity based on captured identity, freshness, integrity, and the caller-supplied monitoring policy. ELIGIBLE authorizes observation/delivery only, never financial action. |
| sourceEvidenceQuality | No | |
| currentActionEligibility | No | Current eligibility of an immutable historical portfolio verdict. It never mutates the stored judgment being replayed. |
| sourceConfidenceSemantics | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, but the description adds the substantive behavior: the full six-value result taxonomy, the safeToRepeat flag, the non-obvious semantics of NO_READ (not agreement), and the aggregation rule that the worst assertion drives the summary. These are interpretive facts an agent cannot get from the structured fields.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four short sentences, front-loaded with the purpose, then the result vocabulary, then the decision rule. Every sentence carries new information—no restatement of the name or annotations.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present and full schema coverage, the description covers the main interpretive burden (status meanings, safeToRepeat, summary aggregation). It leaves the ordering of 'worst' in the severity ladder implicit, which the agent must infer to predict the summary value.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all six parameters (claim, limit, since, detail, symbols, include_withheld) are already documented, and the enum plus defaults are described inline. The description adds no parameter-level guidance of its own, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Verify a proposed market narrative') plus the scope condition ('before repeating it'). It reads as an assertion-level verification tool, clearly distinct from sibling verdict/decision tools like fahali_get_market_verdict or fahali_get_symbol_decision.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The gating condition 'before repeating it' and the rule 'Only SUPPORTED is repeatable; NO_READ is not agreement' tell the agent exactly when the tool is applicable and how to act on results. It stops short of naming alternative sibling tools for nearby needs, so it is clear context rather than explicit alternative routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fahali_fetch_resourceARead-onlyIdempotent
Fetch any catalogued Fahali resource by path. The path must come from fahali_list_resources: catalogued paths only, never arbitrary URLs and never write routes. Supply :params via path_params, filters via query. Listed does not mean entitled — a gated resource still returns its own refusal, which describes your credential, not the data.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Optional maximum rows per projectable collection. Audit has no MCP projection cap; brief defaults to 3 and standard to 12. | |
| query | No | Query-string filters the resource accepts. | |
| since | No | Optional lower timestamp bound for returned row collections. | |
| detail | No | Response depth. audit is the full-fidelity default; brief and standard are explicit compact projections. | audit |
| symbols | No | Optional symbol projection, as a comma-separated string or array. Rows without instrument identity are not discarded. | |
| resource | Yes | Exact path from fahali_list_resources, e.g. /api/situations or /api/symbol-judgment/:symbol | |
| path_params | No | Values for :params in the path, e.g. { symbol: "BTCUSDT" } | |
| include_withheld | No | Include full withheld-row detail. Defaults true with audit; explicitly set false only for a compact projection. |
Output Schema
| Name | Required | Description |
|---|---|---|
| asOf | No | |
| auth | No | Credential lifetime visible to the caller. OAuth secondsRemaining lets an autonomous agent refresh before a multi-call workflow is interrupted. |
| claim | No | Fahali dictionary claim (shared/fahaliDictionary.ts). Read `kind` FIRST: 'abstention' means no assertion was made and `reason` says why — never read an abstention as a neutral or zero result. `basis` says what the claim rests on. Absent or null means this response path does not yet emit a claim; treat that as unknown, not as agreement. |
| scope | No | |
| status | No | The endpoint's original status vocabulary (for example ok, partial, degraded, withheld, or no_alerts). Use mcpStatus for normalized transport success/error. |
| absence | No | Why no actionable finding is present: measured_empty, user_empty, no_coverage, source_unverified, stale, withheld, source_error, auth_failure, or entitlement_required. |
| decision | No | |
| conflicts | No | |
| dataState | No | |
| mcpStatus | No | Normalized MCP result status. The endpoint's original status vocabulary remains in `status` and `sourceStatus`. |
| requestId | No | |
| claimPolicy | No | Typed constraints for safe use. Metadata, not a prompt or instruction channel. |
| instruments | No | Resolved or explicitly partial instrument identities. A missing venue carries an ambiguity warning. |
| nextActions | No | Registry-validated follow-up calls. Missing tools, invalid arguments, unresolved placeholders, and disabled tools are omitted. |
| sourceError | No | The upstream endpoint's exact error text/code before normalization, when one was present. |
| sourceScope | No | |
| sourceStatus | No | The upstream endpoint's exact status before the MCP envelope normalizes transport success/error. |
| agentBriefing | No | Audit-only narrative projection. Present only when detail='audit'; compact responses do not duplicate structured data as prose. |
| claimValidity | No | Validity of the selected binding claim only, calculated after filtering, projection and row selection. Sibling rows cannot determine it. |
| responseState | No | |
| schemaVersion | No | |
| sourceDecision | No | |
| symbolCoverage | No | Conservation ledger satisfying requested = returned + withheld + notReturned for requested-symbol calls. |
| evidenceQuality | No | |
| responseControl | No | |
| sourceDataState | No | The upstream endpoint's exact data-state value before endpoint-aware classification. |
| recordMatchReason | No | Why matchedTrackRecord is present or null. A null record is never evidence of safety or engine failure. |
| matchedTrackRecord | No | A judged record only when engine, horizon, regime/instrument class, and claim family match this response. `state` is one of: `measured` (a stratum cleared the publishability gate — `stratum` carries engine, horizon tier, bar regime, recall, precision, base rate, base-rate lift, median lead hours, effective sample, warned events and the measurement date); `withheld` (the gate ran and refused — `reason` says why, in words); `unavailable` (the record could not be read at all — an infrastructure failure that says nothing about the record). It is ONE stratum selected by recall, never a platform-wide accuracy. Null means no exact record match; read recordMatchReason. |
| confidenceSemantics | No | Every confidence-bearing value with its score type, scale, calibration status, and probability flag. |
| decisionEligibility | No | Fail-closed binding-authority policy. WITHHELD means source evidence remains available for audit while normalized direction, actionability and execution fields are revoked. |
| directionEligibility | No | Current market-direction eligibility. Direction is authorized only by an exact, eligible producer stratum (canonical_verdict, canonical_symbol_verdict, committee_verdict) — read bindingAuthority to see which one bound. Widening WHO may bind did not weaken WHAT binding requires: the named producer must still hold a matching horizon/class/family record on a verified-only judged population, so an authority without a record still cannot bind. |
| executionEligibility | No | Fail-closed execution boundary. Portfolio monitoring tools always return WITHHELD with MONITOR_ONLY_NO_EXECUTION_AUTHORITY while Fahali has no capital path. |
| monitoringEligibility | No | Current portfolio-monitoring validity based on captured identity, freshness, integrity, and the caller-supplied monitoring policy. ELIGIBLE authorizes observation/delivery only, never financial action. |
| sourceEvidenceQuality | No | |
| currentActionEligibility | No | Current eligibility of an immutable historical portfolio verdict. It never mutates the stored judgment being replayed. |
| sourceConfidenceSemantics | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, openWorld, and non-destructive. The description adds important behavioral context beyond annotations: listing does not imply entitlement, and a gated resource returns a refusal describing the credential rather than the data.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences, front-loaded with the core action and constraints. Every sentence carries a distinct operational rule with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Annotations cover safety, schema covers all parameters in detail, and an output schema exists. The description completes the picture with the source-of-truth path requirement and the entitlement/refusal nuance, leaving no major ambiguity for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description still adds meaning by explaining the path_params/query mapping ('Supply :params via path_params, filters via query') and reinforcing that resource paths are not free-form URLs.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Fetch any catalogued Fahali resource by path') and immediately distinguishes it from siblings by tying the path source to fahali_list_resources. An agent can tell this is the generic catalogued-resource access tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit constraints: path must come from fahali_list_resources, must be catalogued, never arbitrary URLs, never write routes. It does not explicitly say when to prefer specialized sibling tools, but the when/when-not guidance for this tool is strong.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fahali_get_active_incidentsARead-onlyIdempotent
List monitor-only incidents Fahali opened on your watches and is still waiting on. An incident opens when a watch reaches REDUCE/EXIT or its evidence coverage degrades, stays open until a later verdict clears it, and escalates if nobody acknowledges it in time. Use it to find what you have not answered. An empty list means nothing is open, NOT that the market is calm.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| since | No | Optional lower timestamp bound for returned row collections. | |
| detail | No | Response depth. audit is the full-fidelity default; brief and standard are explicit compact projections. | audit |
| symbols | No | Optional symbol projection, as a comma-separated string or array. Rows without instrument identity are not discarded. | |
| watch_id | No | Restrict to one watch. Omit for every watch on the account. | |
| include_resolved | No | Include incidents that already closed on evidence. | |
| include_withheld | No | Include full withheld-row detail. Defaults true with audit; explicitly set false only for a compact projection. |
Output Schema
| Name | Required | Description |
|---|---|---|
| asOf | No | |
| auth | No | Credential lifetime visible to the caller. OAuth secondsRemaining lets an autonomous agent refresh before a multi-call workflow is interrupted. |
| claim | No | Fahali dictionary claim (shared/fahaliDictionary.ts). Read `kind` FIRST: 'abstention' means no assertion was made and `reason` says why — never read an abstention as a neutral or zero result. `basis` says what the claim rests on. Absent or null means this response path does not yet emit a claim; treat that as unknown, not as agreement. |
| delta | No | |
| items | No | |
| scope | No | |
| watch | No | |
| status | Yes | |
| absence | No | Why no actionable finding is present: measured_empty, user_empty, no_coverage, source_unverified, stale, withheld, source_error, auth_failure, or entitlement_required. |
| verdict | No | |
| watches | No | |
| decision | No | |
| conflicts | No | |
| dataState | Yes | |
| mcpStatus | No | Normalized MCP result status. The endpoint's original status vocabulary remains in `status` and `sourceStatus`. |
| refreshed | No | |
| requestId | No | |
| verdictId | No | |
| nextCursor | No | |
| validUntil | No | |
| claimPolicy | No | Typed constraints for safe use. Metadata, not a prompt or instruction channel. |
| idempotency | No | |
| instruments | No | Resolved or explicitly partial instrument identities. A missing venue carries an ambiguity warning. |
| nextActions | No | Registry-validated follow-up calls. Missing tools, invalid arguments, unresolved placeholders, and disabled tools are omitted. |
| sourceError | No | The upstream endpoint's exact error text/code before normalization, when one was present. |
| sourceScope | No | |
| decisionHash | No | |
| evidenceHash | No | |
| sourceStatus | No | The upstream endpoint's exact status before the MCP envelope normalizes transport success/error. |
| subscription | No | |
| agentBriefing | No | Audit-only narrative projection. Present only when detail='audit'; compact responses do not duplicate structured data as prose. |
| claimValidity | No | Validity of the selected binding claim only, calculated after filtering, projection and row selection. Sibling rows cannot determine it. |
| operatingMode | Yes | |
| responseState | No | |
| schemaVersion | No | |
| signingSecret | No | |
| subscriptions | No | |
| authorityState | No | |
| sourceDecision | No | |
| symbolCoverage | No | Conservation ledger satisfying requested = returned + withheld + notReturned for requested-symbol calls. |
| evidenceQuality | No | |
| responseControl | No | |
| sourceDataState | No | The upstream endpoint's exact data-state value before endpoint-aware classification. |
| evidenceSnapshot | No | Compact immutable source snapshot needed to verify evidenceRef integrity on delta responses. |
| recordMatchReason | No | Why matchedTrackRecord is present or null. A null record is never evidence of safety or engine failure. |
| signingSecretNote | No | |
| matchedTrackRecord | No | A judged record only when engine, horizon, regime/instrument class, and claim family match this response. `state` is one of: `measured` (a stratum cleared the publishability gate — `stratum` carries engine, horizon tier, bar regime, recall, precision, base rate, base-rate lift, median lead hours, effective sample, warned events and the measurement date); `withheld` (the gate ran and refused — `reason` says why, in words); `unavailable` (the record could not be read at all — an infrastructure failure that says nothing about the record). It is ONE stratum selected by recall, never a platform-wide accuracy. Null means no exact record match; read recordMatchReason. |
| methodologyVersion | No | |
| confidenceSemantics | No | Every confidence-bearing value with its score type, scale, calibration status, and probability flag. |
| decisionEligibility | No | Fail-closed binding-authority policy. WITHHELD means source evidence remains available for audit while normalized direction, actionability and execution fields are revoked. |
| directionEligibility | No | Current market-direction eligibility. Direction is authorized only by an exact, eligible producer stratum (canonical_verdict, canonical_symbol_verdict, committee_verdict) — read bindingAuthority to see which one bound. Widening WHO may bind did not weaken WHAT binding requires: the named producer must still hold a matching horizon/class/family record on a verified-only judged population, so an authority without a record still cannot bind. |
| executionEligibility | No | Fail-closed execution boundary. Portfolio monitoring tools always return WITHHELD with MONITOR_ONLY_NO_EXECUTION_AUTHORITY while Fahali has no capital path. |
| legacyFieldSemantics | Yes | |
| outputClassification | Yes | |
| monitoringEligibility | No | Current portfolio-monitoring validity based on captured identity, freshness, integrity, and the caller-supplied monitoring policy. ELIGIBLE authorizes observation/delivery only, never financial action. |
| sourceEvidenceQuality | No | |
| currentActionEligibility | No | Current eligibility of an immutable historical portfolio verdict. It never mutates the stored judgment being replayed. |
| sourceConfidenceSemantics | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, and the description adds substantial domain semantics on top: what opens an incident (REDUCE/EXIT or degraded evidence coverage), what closes it (a later verdict), and escalation on non-acknowledgement. The 'empty list means nothing is open, NOT that the market is calm' line is exactly the interpretive guardrail an agent needs and cannot get from structured fields.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four compact sentences, front-loaded with the purpose, then lifecycle, then usage, then the caveat. The lifecycle sentence is dense but every clause (open condition, close condition, escalation) carries distinct information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need no explanation, and zero required parameters means there is no calling precondition to state. The description covers definition, lifecycle and empty-result semantics; it omits any pointer to the detail/include_withheld projections, which materially change the payload but are documented in the schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 86%, so the schema already documents limit, since, detail, symbols, watch_id, include_resolved and include_withheld well. The description adds no parameter-level guidance of its own — notably it never clarifies how include_resolved interacts with the 'still waiting on' framing, which is the one ambiguity worth addressing. Baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List monitor-only incidents') with precise scope ('Fahali opened on your watches and is still waiting on'), which cleanly separates it from siblings like fahali_get_incident_timeline (history) and fahali_acknowledge_incident (mutation). An agent can identify the tool without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Use it to find what you have not answered' gives a clear situational trigger, and the empty-list caveat prevents a common misread. It stops short of naming the alternative tools (e.g. acknowledge or timeline) for follow-up actions, so routing is implied rather than explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fahali_get_bundleARead-onlyIdempotent
One compact, authenticated market-intelligence bundle for autonomous workflows. Select the views needed and receive them under one response envelope; failed views are named explicitly and never disappear into a partial market read. Defaults include the canonical market decision, briefing, risk, regime, and conviction. Use detail='brief' unless raw evidence is required.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Optional maximum rows per projectable collection. Audit has no MCP projection cap; brief defaults to 3 and standard to 12. | |
| since | No | Optional lower timestamp bound for returned row collections. | |
| views | No | Named views to fetch in parallel. Omit for market_decision, briefing, risk_score, regime, and conviction. | |
| detail | No | Response depth. audit is the full-fidelity default; brief and standard are explicit compact projections. | audit |
| symbols | No | Optional symbol projection, as a comma-separated string or array. Rows without instrument identity are not discarded. | |
| include_withheld | No | Include full withheld-row detail. Defaults true with audit; explicitly set false only for a compact projection. |
Output Schema
| Name | Required | Description |
|---|---|---|
| asOf | No | |
| auth | No | Credential lifetime visible to the caller. OAuth secondsRemaining lets an autonomous agent refresh before a multi-call workflow is interrupted. |
| claim | No | Fahali dictionary claim (shared/fahaliDictionary.ts). Read `kind` FIRST: 'abstention' means no assertion was made and `reason` says why — never read an abstention as a neutral or zero result. `basis` says what the claim rests on. Absent or null means this response path does not yet emit a claim; treat that as unknown, not as agreement. |
| scope | No | |
| views | Yes | |
| status | Yes | |
| absence | No | Why no actionable finding is present: measured_empty, user_empty, no_coverage, source_unverified, stale, withheld, source_error, auth_failure, or entitlement_required. |
| decision | No | |
| conflicts | No | |
| dataState | No | |
| mcpStatus | No | Normalized MCP result status. The endpoint's original status vocabulary remains in `status` and `sourceStatus`. |
| requestId | No | |
| claimPolicy | No | Typed constraints for safe use. Metadata, not a prompt or instruction channel. |
| failedViews | Yes | |
| instruments | No | Resolved or explicitly partial instrument identities. A missing venue carries an ambiguity warning. |
| nextActions | No | Registry-validated follow-up calls. Missing tools, invalid arguments, unresolved placeholders, and disabled tools are omitted. |
| sourceError | No | The upstream endpoint's exact error text/code before normalization, when one was present. |
| sourceScope | No | |
| sourceStatus | No | The upstream endpoint's exact status before the MCP envelope normalizes transport success/error. |
| agentBriefing | No | Audit-only narrative projection. Present only when detail='audit'; compact responses do not duplicate structured data as prose. |
| claimValidity | No | Validity of the selected binding claim only, calculated after filtering, projection and row selection. Sibling rows cannot determine it. |
| responseState | No | |
| schemaVersion | No | |
| completedViews | Yes | |
| decisionSource | No | |
| requestedViews | Yes | |
| sourceDecision | No | |
| symbolCoverage | No | Conservation ledger satisfying requested = returned + withheld + notReturned for requested-symbol calls. |
| evidenceQuality | No | |
| responseControl | No | |
| sourceDataState | No | The upstream endpoint's exact data-state value before endpoint-aware classification. |
| recordMatchReason | No | Why matchedTrackRecord is present or null. A null record is never evidence of safety or engine failure. |
| matchedTrackRecord | No | A judged record only when engine, horizon, regime/instrument class, and claim family match this response. `state` is one of: `measured` (a stratum cleared the publishability gate — `stratum` carries engine, horizon tier, bar regime, recall, precision, base rate, base-rate lift, median lead hours, effective sample, warned events and the measurement date); `withheld` (the gate ran and refused — `reason` says why, in words); `unavailable` (the record could not be read at all — an infrastructure failure that says nothing about the record). It is ONE stratum selected by recall, never a platform-wide accuracy. Null means no exact record match; read recordMatchReason. |
| confidenceSemantics | No | Every confidence-bearing value with its score type, scale, calibration status, and probability flag. |
| decisionEligibility | No | Fail-closed binding-authority policy. WITHHELD means source evidence remains available for audit while normalized direction, actionability and execution fields are revoked. |
| directionEligibility | No | Current market-direction eligibility. Direction is authorized only by an exact, eligible producer stratum (canonical_verdict, canonical_symbol_verdict, committee_verdict) — read bindingAuthority to see which one bound. Widening WHO may bind did not weaken WHAT binding requires: the named producer must still hold a matching horizon/class/family record on a verified-only judged population, so an authority without a record still cannot bind. |
| executionEligibility | No | Fail-closed execution boundary. Portfolio monitoring tools always return WITHHELD with MONITOR_ONLY_NO_EXECUTION_AUTHORITY while Fahali has no capital path. |
| monitoringEligibility | No | Current portfolio-monitoring validity based on captured identity, freshness, integrity, and the caller-supplied monitoring policy. ELIGIBLE authorizes observation/delivery only, never financial action. |
| sourceEvidenceQuality | No | |
| currentActionEligibility | No | Current eligibility of an immutable historical portfolio verdict. It never mutates the stored judgment being replayed. |
| sourceConfidenceSemantics | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive, open-world), so the description is free to add genuine value: it is authenticated, views run in parallel, and failed views are named explicitly rather than silently producing a partial read. That failure-mode disclosure is exactly the kind of context annotations cannot convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four front-loaded sentences with no filler; the core promise and the failure semantics come first and the detail guidance closes it. Minor tension: it calls the bundle 'compact' while the schema defaults detail to full-fidelity 'audit', which is slightly confusing in an otherwise tight statement.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, the description needn't explain return values, and it covers what matters for correct invocation: view selection, defaults, depth tradeoff, and partial-failure behavior. The default mismatch between 'brief' advice and the schema's 'audit' default is the one unresolved wrinkle.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3; the description goes beyond it by naming the default view set and by recommending the 'brief' depth over the schema's actual default of 'audit', which an agent would otherwise miss. It does not explain the symbols or since parameters, keeping it at 4.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a concrete verb and resource — fetch a named set of market-intelligence views in a single response envelope — and the emphasis on bundling implicitly separates it from the many single-view siblings. It never names a specific sibling to avoid, so it stops short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit operating guidance: choose only the views needed, defaults are stated (market_decision, briefing, risk_score, regime, conviction), and 'use detail=brief unless raw evidence is required' is a clear conditional. No explicit when-not-to-use versus the individual getters, so not a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fahali_get_capabilitiesARead-onlyIdempotent
Start here when planning an autonomous Fahali workflow. Returns the canonical live tool catalogue, primary-versus-audit taxonomy, executable registry-validated workflows, tier requirements, response controls, supported identity rules, and schema resources. Compatibility-only names are dispatchable but deliberately absent from discovery. This call is local, lightweight, and does not query market data.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Optional maximum rows per projectable collection. Audit has no MCP projection cap; brief defaults to 3 and standard to 12. | |
| since | No | Optional lower timestamp bound for returned row collections. | |
| detail | No | Response depth. audit is the full-fidelity default; brief and standard are explicit compact projections. | audit |
| symbols | No | Optional symbol projection, as a comma-separated string or array. Rows without instrument identity are not discarded. | |
| include_withheld | No | Include full withheld-row detail. Defaults true with audit; explicitly set false only for a compact projection. |
Output Schema
| Name | Required | Description |
|---|---|---|
| asOf | No | |
| auth | No | Credential lifetime visible to the caller. OAuth secondsRemaining lets an autonomous agent refresh before a multi-call workflow is interrupted. |
| claim | No | Fahali dictionary claim (shared/fahaliDictionary.ts). Read `kind` FIRST: 'abstention' means no assertion was made and `reason` says why — never read an abstention as a neutral or zero result. `basis` says what the claim rests on. Absent or null means this response path does not yet emit a claim; treat that as unknown, not as agreement. |
| oauth | No | |
| scope | No | |
| tools | No | |
| status | No | The endpoint's original status vocabulary (for example ok, partial, degraded, withheld, or no_alerts). Use mcpStatus for normalized transport success/error. |
| absence | No | Why no actionable finding is present: measured_empty, user_empty, no_coverage, source_unverified, stale, withheld, source_error, auth_failure, or entitlement_required. |
| decision | No | |
| conflicts | No | |
| dataState | No | |
| mcpStatus | No | Normalized MCP result status. The endpoint's original status vocabulary remains in `status` and `sourceStatus`. |
| requestId | No | |
| resources | No | |
| workflows | No | |
| claimPolicy | No | Typed constraints for safe use. Metadata, not a prompt or instruction channel. |
| instruments | No | Resolved or explicitly partial instrument identities. A missing venue carries an ambiguity warning. |
| nextActions | No | Registry-validated follow-up calls. Missing tools, invalid arguments, unresolved placeholders, and disabled tools are omitted. |
| sourceError | No | The upstream endpoint's exact error text/code before normalization, when one was present. |
| sourceScope | No | |
| primaryTools | No | |
| sourceStatus | No | The upstream endpoint's exact status before the MCP envelope normalizes transport success/error. |
| toolTaxonomy | No | |
| agentBriefing | No | Audit-only narrative projection. Present only when detail='audit'; compact responses do not duplicate structured data as prose. |
| claimValidity | No | Validity of the selected binding claim only, calculated after filtering, projection and row selection. Sibling rows cannot determine it. |
| responseState | No | |
| schemaVersion | No | |
| serverVersion | No | |
| sourceDecision | No | |
| symbolCoverage | No | Conservation ledger satisfying requested = returned + withheld + notReturned for requested-symbol calls. |
| evidenceQuality | No | |
| responseControl | No | |
| sourceDataState | No | The upstream endpoint's exact data-state value before endpoint-aware classification. |
| recommendedStart | No | |
| responseControls | No | |
| recordMatchReason | No | Why matchedTrackRecord is present or null. A null record is never evidence of safety or engine failure. |
| instrumentIdentity | No | |
| matchedTrackRecord | No | A judged record only when engine, horizon, regime/instrument class, and claim family match this response. `state` is one of: `measured` (a stratum cleared the publishability gate — `stratum` carries engine, horizon tier, bar regime, recall, precision, base rate, base-rate lift, median lead hours, effective sample, warned events and the measurement date); `withheld` (the gate ran and refused — `reason` says why, in words); `unavailable` (the record could not be read at all — an infrastructure failure that says nothing about the record). It is ONE stratum selected by recall, never a platform-wide accuracy. Null means no exact record match; read recordMatchReason. |
| confidenceSemantics | No | Every confidence-bearing value with its score type, scale, calibration status, and probability flag. |
| decisionEligibility | No | Fail-closed binding-authority policy. WITHHELD means source evidence remains available for audit while normalized direction, actionability and execution fields are revoked. |
| directionEligibility | No | Current market-direction eligibility. Direction is authorized only by an exact, eligible producer stratum (canonical_verdict, canonical_symbol_verdict, committee_verdict) — read bindingAuthority to see which one bound. Widening WHO may bind did not weaken WHAT binding requires: the named producer must still hold a matching horizon/class/family record on a verified-only judged population, so an authority without a record still cannot bind. |
| executionEligibility | No | Fail-closed execution boundary. Portfolio monitoring tools always return WITHHELD with MONITOR_ONLY_NO_EXECUTION_AUTHORITY while Fahali has no capital path. |
| monitoringEligibility | No | Current portfolio-monitoring validity based on captured identity, freshness, integrity, and the caller-supplied monitoring policy. ELIGIBLE authorizes observation/delivery only, never financial action. |
| sourceEvidenceQuality | No | |
| currentActionEligibility | No | Current eligibility of an immutable historical portfolio verdict. It never mutates the stored judgment being replayed. |
| sourceConfidenceSemantics | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only, idempotent, non-destructive, and non-open-world behavior. The description adds useful context beyond annotations: the call is local, lightweight, does not query market data, and compatibility-only names are dispatchable but absent from discovery.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the key instruction ('Start here...'), followed by concise statements about what is returned and important caveats. Every sentence contributes useful routing or behavioral information without repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With a rich output schema, complete parameter documentation, and strong annotations, the description supplies the remaining context an agent needs: when to use it, what kind of catalogue it returns, and that it is local and does not query market data.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all five optional parameters in detail. The description itself only loosely gestures at 'response controls' and adds no parameter-specific syntax or defaults beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb and resource: it returns the canonical live tool catalogue, taxonomy, workflows, tier requirements, identity rules, and schema resources. It also clearly positions itself as the starting discovery/meta tool, distinguishing it from the many specific Fahali data tools in the sibling list.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly says to start here when planning an autonomous Fahali workflow, which gives strong usage context. It does not name exclusions or specific alternative tools, but the 'start here' framing is clear enough for routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fahali_get_capital_flowARead-onlyIdempotent
Measured 60-minute USD order-flow imbalance for requested symbols, or the strongest available readings when none are supplied. Zero detector score does not erase netFlowUsd: the score measures unusualness, not data presence. Candle-derived proxy only; no exchange aggressor tape, participant identity, fund-flow attribution, or forecast.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Source-side row depth. | |
| since | No | ISO-8601 lower bound, no more than 7 days ago. Defaults to 96h ago; out-of-range values are rejected with invalid_since, never silently defaulted. | |
| detail | No | Response depth. audit is the full-fidelity default; brief and standard are explicit compact projections. | audit |
| symbol | No | Optional single instrument. Base aliases such as BTC resolve transparently to a preferred quoted pair and the resolution is returned. | |
| symbols | No | Optional comma-separated instruments (max 100). Applied in SQL at the source. | |
| include_withheld | No | Include full withheld-row detail. Defaults true with audit; explicitly set false only for a compact projection. |
Output Schema
| Name | Required | Description |
|---|---|---|
| asOf | No | |
| auth | No | Credential lifetime visible to the caller. OAuth secondsRemaining lets an autonomous agent refresh before a multi-call workflow is interrupted. |
| data | No | |
| basis | No | |
| claim | No | Fahali dictionary claim (shared/fahaliDictionary.ts). Read `kind` FIRST: 'abstention' means no assertion was made and `reason` says why — never read an abstention as a neutral or zero result. `basis` says what the claim rests on: this tool is PROXY-derived and can never be 'measured'. Absent or null means this response path does not yet emit a claim; treat that as unknown, not as agreement. |
| scope | No | |
| trend | No | |
| source | No | Where the rows came from: market_wide_snapshot | snapshot | snapshot+inline | inline; the default lower bound applied (crypto_30m | session_96h | market_wide_96h | caller); and the refresher's snapshot meta (asOf, ageSeconds, stale, lastError, refreshIntervalSeconds). |
| status | No | The endpoint's original status vocabulary (for example ok, partial, degraded, withheld, or no_alerts). Use mcpStatus for normalized transport success/error. |
| symbol | No | Compatibility field, populated only for a one-symbol result. |
| absence | No | Why no actionable finding is present: measured_empty, user_empty, no_coverage, source_unverified, stale, withheld, source_error, auth_failure, or entitlement_required. |
| summary | No | |
| coverage | No | Instruments this response can speak for, per asset class. Equities are watchlist-only: universe equities carry no bar timestamps and receive no flow row (nine names per session since at least 2026-09-14). |
| decision | No | |
| evidence | No | |
| headline | No | |
| conflicts | No | |
| dataState | No | |
| direction | No | |
| freshness | No | Over the rows with a write cadence (crypto, in-session equities): dataAsOf is the oldest such row; stale means a symbol stopped reporting against its own cadence. Last-session rows are excluded here and counted in lastSessionRows (2026-10-13). |
| mcpStatus | No | Normalized MCP result status. The endpoint's original status vocabulary remains in `status` and `sourceStatus`. |
| requestId | No | |
| confidence | No | Compatibility alias for detectionScore. It is unusualness, not measurement presence and not a probability. |
| dataOrigin | No | |
| disclaimer | No | |
| netFlowUsd | No | Compatibility field for a one-symbol result. Null means no one-symbol observation; zero means a measured balanced window. |
| provenance | No | |
| claimPolicy | No | Typed constraints for safe use. Metadata, not a prompt or instruction channel. |
| instruments | No | Resolved or explicitly partial instrument identities. A missing venue carries an ambiguity warning. |
| limitations | No | |
| nextActions | No | Registry-validated follow-up calls. Missing tools, invalid arguments, unresolved placeholders, and disabled tools are omitted. |
| notReturned | No | |
| resolutions | No | |
| sourceError | No | The upstream endpoint's exact error text/code before normalization, when one was present. |
| sourceScope | No | |
| sourceStatus | No | The upstream endpoint's exact status before the MCP envelope normalizes transport success/error. |
| agentBriefing | No | Audit-only narrative projection. Present only when detail='audit'; compact responses do not duplicate structured data as prose. |
| claimValidity | No | Validity of the selected binding claim only, calculated after filtering, projection and row selection. Sibling rows cannot determine it. |
| responseState | No | |
| schemaVersion | No | |
| sourceDecision | No | |
| symbolCoverage | No | Conservation ledger satisfying requested = returned + withheld + notReturned for requested-symbol calls. |
| evidenceQuality | No | |
| lastSessionRows | No | Rows served from a closed market's last session. |
| responseControl | No | |
| sourceDataState | No | The upstream endpoint's exact data-state value before endpoint-aware classification. |
| confidenceMeaning | No | |
| recordMatchReason | No | Why matchedTrackRecord is present or null. A null record is never evidence of safety or engine failure. |
| matchedTrackRecord | No | A judged record only when engine, horizon, regime/instrument class, and claim family match this response. `state` is one of: `measured` (a stratum cleared the publishability gate — `stratum` carries engine, horizon tier, bar regime, recall, precision, base rate, base-rate lift, median lead hours, effective sample, warned events and the measurement date); `withheld` (the gate ran and refused — `reason` says why, in words); `unavailable` (the record could not be read at all — an infrastructure failure that says nothing about the record). It is ONE stratum selected by recall, never a platform-wide accuracy. Null means no exact record match; read recordMatchReason. |
| confidenceSemantics | No | Every confidence-bearing value with its score type, scale, calibration status, and probability flag. |
| decisionEligibility | No | Fail-closed binding-authority policy. WITHHELD means source evidence remains available for audit while normalized direction, actionability and execution fields are revoked. |
| trendWithheldReason | No | |
| directionEligibility | No | Current market-direction eligibility. Direction is authorized only by an exact, eligible producer stratum (canonical_verdict, canonical_symbol_verdict, committee_verdict) — read bindingAuthority to see which one bound. Widening WHO may bind did not weaken WHAT binding requires: the named producer must still hold a matching horizon/class/family record on a verified-only judged population, so an authority without a record still cannot bind. |
| executionEligibility | No | Fail-closed execution boundary. Portfolio monitoring tools always return WITHHELD with MONITOR_ONLY_NO_EXECUTION_AUTHORITY while Fahali has no capital path. |
| freshnessByAssetClass | No | crypto and equity blocks with the same shape as freshness; an equity block made only of last-session rows reports the age and stale: null, because a closed market has no cadence to be late against. |
| monitoringEligibility | No | Current portfolio-monitoring validity based on captured identity, freshness, integrity, and the caller-supplied monitoring policy. ELIGIBLE authorizes observation/delivery only, never financial action. |
| sourceEvidenceQuality | No | |
| currentActionEligibility | No | Current eligibility of an immutable historical portfolio verdict. It never mutates the stored judgment being replayed. |
| sourceConfidenceSemantics | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only, idempotent, open-world, non-destructive, so the safety bar is low; the description nonetheless adds substantive traits: the data is a candle-derived proxy, lacks aggressor tape and participant identity, and carries no forecast. It also pre-empts a likely misread of the payload ('Zero detector score does not erase netFlowUsd: the score measures unusualness, not data presence'), which is exactly the kind of value beyond structured fields that matters.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, no waste, with the core capability front-loaded before the caveats. The zero-score caveat and the proxy-limitation sentence each carry distinct information an agent would otherwise have to discover empirically.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Return shape is covered by the output schema and safety by annotations, so the description's job is scope, defaults, and limits — all three are addressed. An agent can call it with no arguments, with symbols, and correctly interpret a zero score without further context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3; the description adds the one thing the schema cannot convey — the semantic default when symbol/symbols are omitted (return the strongest available readings rather than nothing). It does not elaborate on limit/since/detail, but those are already fully documented in-schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific measurement (60-minute USD order-flow imbalance) with the resource (symbols) and its default fallback behavior, so the agent knows exactly what it is retrieving. The closing disclaimers ('candle-derived proxy only; no aggressor tape, fund-flow attribution') sharply separate it from attribution/forecast-style siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'or the strongest available readings when none are supplied' tells the agent it can call with zero arguments and what happens then, which is real usage guidance. However, it never names an alternative sibling (e.g. fahali_get_unusual_money_movement, fahali_get_microstructure_proxy) or states when to prefer this tool over them, so the when-to-use-vs-alternatives dimension is left implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fahali_get_case_studiesBRead-onlyIdempotent
Get verified case studies from the resolved signal-outcome moat. Returns 40 time-diverse cases with: symbol, alert type, confidence, direction (bullish/bearish/neutral), entry price, outcome price, profit/loss percent, correctness boolean, outcome kind (direction/magnitude/volatility/crash_catch), and 4h/24h returns. Covers the walk_forward engine.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Optional maximum rows per projectable collection. Audit has no MCP projection cap; brief defaults to 3 and standard to 12. | |
| since | No | Optional lower timestamp bound for returned row collections. | |
| detail | No | Response depth. audit is the full-fidelity default; brief and standard are explicit compact projections. | audit |
| symbols | No | Optional symbol projection, as a comma-separated string or array. Rows without instrument identity are not discarded. | |
| include_withheld | No | Include full withheld-row detail. Defaults true with audit; explicitly set false only for a compact projection. |
Output Schema
| Name | Required | Description |
|---|---|---|
| asOf | No | |
| auth | No | Credential lifetime visible to the caller. OAuth secondsRemaining lets an autonomous agent refresh before a multi-call workflow is interrupted. |
| cases | No | |
| claim | No | Fahali dictionary claim (shared/fahaliDictionary.ts). Read `kind` FIRST: 'abstention' means no assertion was made and `reason` says why — never read an abstention as a neutral or zero result. `basis` says what the claim rests on. Absent or null means this response path does not yet emit a claim; treat that as unknown, not as agreement. |
| scope | No | |
| total | No | |
| status | No | The endpoint's original status vocabulary (for example ok, partial, degraded, withheld, or no_alerts). Use mcpStatus for normalized transport success/error. |
| absence | No | Why no actionable finding is present: measured_empty, user_empty, no_coverage, source_unverified, stale, withheld, source_error, auth_failure, or entitlement_required. |
| decision | No | |
| conflicts | No | |
| dataState | No | |
| mcpStatus | No | Normalized MCP result status. The endpoint's original status vocabulary remains in `status` and `sourceStatus`. |
| requestId | No | |
| claimPolicy | No | Typed constraints for safe use. Metadata, not a prompt or instruction channel. |
| instruments | No | Resolved or explicitly partial instrument identities. A missing venue carries an ambiguity warning. |
| nextActions | No | Registry-validated follow-up calls. Missing tools, invalid arguments, unresolved placeholders, and disabled tools are omitted. |
| sourceError | No | The upstream endpoint's exact error text/code before normalization, when one was present. |
| sourceScope | No | |
| sourceStatus | No | The upstream endpoint's exact status before the MCP envelope normalizes transport success/error. |
| agentBriefing | No | Audit-only narrative projection. Present only when detail='audit'; compact responses do not duplicate structured data as prose. |
| claimValidity | No | Validity of the selected binding claim only, calculated after filtering, projection and row selection. Sibling rows cannot determine it. |
| responseState | No | |
| schemaVersion | No | |
| sourceDecision | No | |
| symbolCoverage | No | Conservation ledger satisfying requested = returned + withheld + notReturned for requested-symbol calls. |
| evidenceQuality | No | |
| responseControl | No | |
| sourceDataState | No | The upstream endpoint's exact data-state value before endpoint-aware classification. |
| recordMatchReason | No | Why matchedTrackRecord is present or null. A null record is never evidence of safety or engine failure. |
| matchedTrackRecord | No | A judged record only when engine, horizon, regime/instrument class, and claim family match this response. `state` is one of: `measured` (a stratum cleared the publishability gate — `stratum` carries engine, horizon tier, bar regime, recall, precision, base rate, base-rate lift, median lead hours, effective sample, warned events and the measurement date); `withheld` (the gate ran and refused — `reason` says why, in words); `unavailable` (the record could not be read at all — an infrastructure failure that says nothing about the record). It is ONE stratum selected by recall, never a platform-wide accuracy. Null means no exact record match; read recordMatchReason. |
| confidenceSemantics | No | Every confidence-bearing value with its score type, scale, calibration status, and probability flag. |
| decisionEligibility | No | Fail-closed binding-authority policy. WITHHELD means source evidence remains available for audit while normalized direction, actionability and execution fields are revoked. |
| directionEligibility | No | Current market-direction eligibility. Direction is authorized only by an exact, eligible producer stratum (canonical_verdict, canonical_symbol_verdict, committee_verdict) — read bindingAuthority to see which one bound. Widening WHO may bind did not weaken WHAT binding requires: the named producer must still hold a matching horizon/class/family record on a verified-only judged population, so an authority without a record still cannot bind. |
| executionEligibility | No | Fail-closed execution boundary. Portfolio monitoring tools always return WITHHELD with MONITOR_ONLY_NO_EXECUTION_AUTHORITY while Fahali has no capital path. |
| monitoringEligibility | No | Current portfolio-monitoring validity based on captured identity, freshness, integrity, and the caller-supplied monitoring policy. ELIGIBLE authorizes observation/delivery only, never financial action. |
| sourceEvidenceQuality | No | |
| currentActionEligibility | No | Current eligibility of an immutable historical portfolio verdict. It never mutates the stored judgment being replayed. |
| sourceConfidenceSemantics | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive, openWorld), so the bar is lower. The description adds real context — cases are verified/resolved, time-diverse, and sourced from a specific engine — but the fixed '40 cases' claim sits uneasily beside a limit parameter allowing up to 100, and the description never resolves whether 40 is a hard cap or a default.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded and the prose is not padded, but the long field enumeration largely restates what the output schema already provides and crowds out higher-value information about when to use the tool. Roughly half the text is recoverable from the structured schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present and full schema coverage on five parameters, the description only needs to establish what the data represents — which it does via 'verified', 'resolved', 'time-diverse', and the engine name. The one meaningful gap is the unresolved interaction between the stated 40 cases and the limit parameter.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents limit, since, detail, symbols, and include_withheld in detail. The description adds only the implicit notion of a default sample size ('40 time-diverse cases') and says nothing about the detail projection levels or symbol projection semantics. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Names a specific verb and resource ('Get verified case studies') and pins the source domain ('resolved signal-outcome moat'), plus names the producing engine ('walk_forward'). It is clear what the tool returns, but it never distinguishes itself from adjacent evidence/performance siblings such as fahali_get_track_record_scorecard or fahali_get_evidence.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no statement of when to reach for this over the many other signal/performance tools in the sibling list, and no exclusions. 'Verified' and 'resolved' hint that these are historically graded outcomes rather than live signals, but that inference is left entirely to the agent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fahali_get_contagion_mapARead-onlyIdempotent
One-hour lower-tail-dependence associations with a measured temporal layer. Arrow order is the producer's and does not prove causal transmission. Pairs in the lead-lag graph carry lagHours and leadSymbol: precedence, not causation. Check measurement.edgesWithMeasuredLag; most pairs have none. propagation gives origins, paths and arrival hours, each flagged measured or composed, with symbolsEligible for coverage. sampleSize is recurrence count. High/extreme needs repeated evidence. Requested-book Pearson: fahali_get_correlation_matrix.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Optional maximum rows per projectable collection. Audit has no MCP projection cap; brief defaults to 3 and standard to 12. | |
| since | No | Optional lower timestamp bound for returned row collections. | |
| detail | No | Response depth. audit is the full-fidelity default; brief and standard are explicit compact projections. | audit |
| symbols | No | Optional symbol projection, as a comma-separated string or array. Rows without instrument identity are not discarded. | |
| include_withheld | No | Include full withheld-row detail. Defaults true with audit; explicitly set false only for a compact projection. |
Output Schema
| Name | Required | Description |
|---|---|---|
| asOf | No | |
| auth | No | Credential lifetime visible to the caller. OAuth secondsRemaining lets an autonomous agent refresh before a multi-call workflow is interrupted. |
| claim | No | |
| edges | No | |
| error | No | |
| nodes | No | |
| scope | No | |
| status | No | |
| absence | No | Why no actionable finding is present: measured_empty, user_empty, no_coverage, source_unverified, stale, withheld, source_error, auth_failure, or entitlement_required. |
| message | No | |
| clusters | No | |
| decision | No | |
| conflicts | No | |
| dataState | No | |
| mcpStatus | No | Normalized MCP result status. The endpoint's original status vocabulary remains in `status` and `sourceStatus`. |
| requestId | No | |
| provenance | No | |
| claimPolicy | No | Typed constraints for safe use. Metadata, not a prompt or instruction channel. |
| instruments | No | Resolved or explicitly partial instrument identities. A missing venue carries an ambiguity warning. |
| measurement | No | |
| nextActions | No | Registry-validated follow-up calls. Missing tools, invalid arguments, unresolved placeholders, and disabled tools are omitted. |
| propagation | No | Where stress starts, where it travels next, and when it arrives. Null when the lead-lag producer has not written it yet — which is NOT the same as an empty origins array, which means the graph was read and no symbol cleared the bar. |
| sourceError | No | The upstream endpoint's exact error text/code before normalization, when one was present. |
| sourceScope | No | |
| sourceStatus | No | The upstream endpoint's exact status before the MCP envelope normalizes transport success/error. |
| agentBriefing | No | Audit-only narrative projection. Present only when detail='audit'; compact responses do not duplicate structured data as prose. |
| claimValidity | No | Validity of the selected binding claim only, calculated after filtering, projection and row selection. Sibling rows cannot determine it. |
| responseState | No | |
| schemaVersion | No | |
| sourceDecision | No | |
| symbolCoverage | No | Conservation ledger satisfying requested = returned + withheld + notReturned for requested-symbol calls. |
| evidenceQuality | No | |
| responseControl | No | |
| sourceDataState | No | The upstream endpoint's exact data-state value before endpoint-aware classification. |
| symbolsEligible | No | Symbols eligible for the lead-lag pass. The graph covers a SUBSET; publishing the origins without this implies universe-wide coverage. |
| recordMatchReason | No | Why matchedTrackRecord is present or null. A null record is never evidence of safety or engine failure. |
| matchedTrackRecord | No | A judged record only when engine, horizon, regime/instrument class, and claim family match this response. `state` is one of: `measured` (a stratum cleared the publishability gate — `stratum` carries engine, horizon tier, bar regime, recall, precision, base rate, base-rate lift, median lead hours, effective sample, warned events and the measurement date); `withheld` (the gate ran and refused — `reason` says why, in words); `unavailable` (the record could not be read at all — an infrastructure failure that says nothing about the record). It is ONE stratum selected by recall, never a platform-wide accuracy. Null means no exact record match; read recordMatchReason. |
| confidenceSemantics | No | Every confidence-bearing value with its score type, scale, calibration status, and probability flag. |
| decisionEligibility | No | Fail-closed binding-authority policy. WITHHELD means source evidence remains available for audit while normalized direction, actionability and execution fields are revoked. |
| directionEligibility | No | Current market-direction eligibility. Direction is authorized only by an exact, eligible producer stratum (canonical_verdict, canonical_symbol_verdict, committee_verdict) — read bindingAuthority to see which one bound. Widening WHO may bind did not weaken WHAT binding requires: the named producer must still hold a matching horizon/class/family record on a verified-only judged population, so an authority without a record still cannot bind. |
| executionEligibility | No | Fail-closed execution boundary. Portfolio monitoring tools always return WITHHELD with MONITOR_ONLY_NO_EXECUTION_AUTHORITY while Fahali has no capital path. |
| monitoringEligibility | No | Current portfolio-monitoring validity based on captured identity, freshness, integrity, and the caller-supplied monitoring policy. ELIGIBLE authorizes observation/delivery only, never financial action. |
| sourceEvidenceQuality | No | |
| currentActionEligibility | No | Current eligibility of an immutable historical portfolio verdict. It never mutates the stored judgment being replayed. |
| sourceConfidenceSemantics | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover safety (readOnly, idempotent, non-destructive), and the description adds substantial interpretation context beyond them: arrow order and lagHours are precedence, not causation; most pairs lack a measured lag; propagation entries are flagged measured or composed; high/extreme requires repeated evidence. These are exactly the caveats an agent needs to avoid over-claiming causality from the output.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Seven short sentences, each carrying information, with the core object stated first and no filler. It is telegraphic to the point of density (field paths like measurement.edgesWithMeasuredLag and symbolsEligible arrive without setup), which costs some readability but not length.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex analytical tool with an output schema, the description covers what the schema cannot: causal-interpretation caveats, data-coverage warnings, field semantics for measured vs composed, and an alternative route. Return shape is left to the output schema, which is correct.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents limit, since, detail, symbols and include_withheld fully. The description adds no parameter-level guidance at all – no advice on choosing detail levels or on the audit default – so it neither compensates nor detracts. Baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific analytical object (one-hour lower-tail-dependence associations with a measured temporal layer) and its components (lead-lag graph, propagation, sampleSize), so an agent knows what it gets. It also names the sibling it is not (fahali_get_correlation_matrix for Pearson). It stops short of a clean single-sentence statement of the operation, which makes the first read harder than necessary.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It routes the agent to an alternative with a condition: 'Requested-book Pearson: fahali_get_correlation_matrix.' It also sets an expectation about when the temporal layer is usable ('Check measurement.edgesWithMeasuredLag; most pairs have none'). It never states exclusions or prerequisites for calling this tool versus the other risk/verdict siblings, so the routing is narrow rather than complete.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fahali_get_correlation_matrixARead-onlyIdempotent
Requested-book Pearson correlation from the canonical 45-day covariance artifact, with per-pair observations, alignment policy, and explicit missing coverage. Historical association only: not causality, future correlation, or a contagion direction.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Optional maximum rows per projectable collection. Audit has no MCP projection cap; brief defaults to 3 and standard to 12. | |
| since | No | Optional lower timestamp bound for returned row collections. | |
| detail | No | Response depth. audit is the full-fidelity default; brief and standard are explicit compact projections. | audit |
| symbols | No | Optional requested book. Omit for Fahali's fixed six-asset reference set. | |
| include_withheld | No | Include full withheld-row detail. Defaults true with audit; explicitly set false only for a compact projection. |
Output Schema
| Name | Required | Description |
|---|---|---|
| asOf | No | |
| auth | No | Credential lifetime visible to the caller. OAuth secondsRemaining lets an autonomous agent refresh before a multi-call workflow is interrupted. |
| basis | No | |
| claim | No | |
| error | No | Machine-readable error code on invalid_request, query_failed, invalid_artifact, or transport failures. |
| scope | No | |
| matrix | No | |
| reason | No | Why the canonical covariance artifact was unavailable. Present with every unavailable artifact response. |
| status | No | |
| absence | No | Why no actionable finding is present: measured_empty, user_empty, no_coverage, source_unverified, stale, withheld, source_error, auth_failure, or entitlement_required. |
| message | No | Source-preserved explanation of the unavailable artifact state; never replace it with a calm-market inference. |
| symbols | No | |
| coverage | No | |
| decision | No | |
| policies | No | |
| conflicts | No | |
| dataState | No | |
| mcpStatus | No | Normalized MCP result status. The endpoint's original status vocabulary remains in `status` and `sourceStatus`. |
| perSymbol | No | |
| requestId | No | |
| claimPolicy | No | Typed constraints for safe use. Metadata, not a prompt or instruction channel. |
| instruments | No | Resolved or explicitly partial instrument identities. A missing venue carries an ambiguity warning. |
| nextActions | No | Registry-validated follow-up calls. Missing tools, invalid arguments, unresolved placeholders, and disabled tools are omitted. |
| sourceError | No | The upstream endpoint's exact error text/code before normalization, when one was present. |
| sourceScope | No | |
| observations | No | |
| sourceStatus | No | The upstream endpoint's exact status before the MCP envelope normalizes transport success/error. |
| agentBriefing | No | Audit-only narrative projection. Present only when detail='audit'; compact responses do not duplicate structured data as prose. |
| claimValidity | No | Validity of the selected binding claim only, calculated after filtering, projection and row selection. Sibling rows cannot determine it. |
| responseState | No | |
| schemaVersion | No | |
| artifactStatus | No | |
| interpretation | No | |
| sourceDecision | No | |
| symbolCoverage | No | Conservation ledger satisfying requested = returned + withheld + notReturned for requested-symbol calls. |
| evidenceQuality | No | |
| responseControl | No | |
| sourceDataState | No | The upstream endpoint's exact data-state value before endpoint-aware classification. |
| recordMatchReason | No | Why matchedTrackRecord is present or null. A null record is never evidence of safety or engine failure. |
| requestedCoverage | No | |
| matchedTrackRecord | No | A judged record only when engine, horizon, regime/instrument class, and claim family match this response. `state` is one of: `measured` (a stratum cleared the publishability gate — `stratum` carries engine, horizon tier, bar regime, recall, precision, base rate, base-rate lift, median lead hours, effective sample, warned events and the measurement date); `withheld` (the gate ran and refused — `reason` says why, in words); `unavailable` (the record could not be read at all — an infrastructure failure that says nothing about the record). It is ONE stratum selected by recall, never a platform-wide accuracy. Null means no exact record match; read recordMatchReason. |
| confidenceSemantics | No | Every confidence-bearing value with its score type, scale, calibration status, and probability flag. |
| decisionEligibility | No | Fail-closed binding-authority policy. WITHHELD means source evidence remains available for audit while normalized direction, actionability and execution fields are revoked. |
| directionEligibility | No | Current market-direction eligibility. Direction is authorized only by an exact, eligible producer stratum (canonical_verdict, canonical_symbol_verdict, committee_verdict) — read bindingAuthority to see which one bound. Widening WHO may bind did not weaken WHAT binding requires: the named producer must still hold a matching horizon/class/family record on a verified-only judged population, so an authority without a record still cannot bind. |
| executionEligibility | No | Fail-closed execution boundary. Portfolio monitoring tools always return WITHHELD with MONITOR_ONLY_NO_EXECUTION_AUTHORITY while Fahali has no capital path. |
| monitoringEligibility | No | Current portfolio-monitoring validity based on captured identity, freshness, integrity, and the caller-supplied monitoring policy. ELIGIBLE authorizes observation/delivery only, never financial action. |
| sourceEvidenceQuality | No | |
| currentActionEligibility | No | Current eligibility of an immutable historical portfolio verdict. It never mutates the stored judgment being replayed. |
| sourceConfidenceSemantics | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish readOnly, idempotent, non-destructive, open-world behavior, so the description only needed to add context — and it does: the 45-day canonical covariance artifact, per-pair observation counts, alignment policy, and explicit missing coverage. Those are real behavioral traits an agent cannot get from the annotation block. It stops short of noting cost or latency characteristics.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two dense sentences with no filler: the provenance/methodology claim first, then the interpretive boundary. Every clause carries distinct information and the most decision-relevant content is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present and 100% schema description coverage, the description needn't explain return shape or defaults, and it correctly focuses on provenance and interpretive limits. It could still note that omitting symbols yields the fixed six-asset reference set, though that is covered in the schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so all five parameters (including the oneOf symbols form, detail enum, and include_withheld default) are documented in structured data. The description adds only indirect meaning — 'requested-book' maps to symbols and 'explicit missing coverage' hints at include_withheld — so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Pearson correlation ... from the canonical 45-day covariance artifact') with the data provenance and window, and explicitly disclaims contagion direction, which separates it from the nearby fahali_get_contagion_map sibling.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The disclaimer 'Historical association only: not causality, future correlation, or a contagion direction' frames the interpretive scope, which implicitly signals when to prefer contagion or forecast siblings. However, no explicit when-to-use/when-not or named alternative is given, so routing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fahali_get_detection_activityARead-onlyIdempotent
Recent detection activity per symbol with bullish and bearish alert counts. This measures what fired, not institutional identity, capital flow, or conviction. Use highest-conviction signals to apply the evidence gate and market verdict to obtain a decision.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Optional maximum rows per projectable collection. Audit has no MCP projection cap; brief defaults to 3 and standard to 12. | |
| since | No | Optional lower timestamp bound for returned row collections. | |
| detail | No | Response depth. audit is the full-fidelity default; brief and standard are explicit compact projections. | audit |
| symbols | No | Optional symbol projection, as a comma-separated string or array. Rows without instrument identity are not discarded. | |
| include_withheld | No | Include full withheld-row detail. Defaults true with audit; explicitly set false only for a compact projection. |
Output Schema
| Name | Required | Description |
|---|---|---|
| asOf | No | |
| auth | No | Credential lifetime visible to the caller. OAuth secondsRemaining lets an autonomous agent refresh before a multi-call workflow is interrupted. |
| claim | No | Fahali dictionary claim (shared/fahaliDictionary.ts). Read `kind` FIRST: 'abstention' means no assertion was made and `reason` says why — never read an abstention as a neutral or zero result. `basis` says what the claim rests on: this tool is PROXY-derived and can never be 'measured'. Absent or null means this response path does not yet emit a claim; treat that as unknown, not as agreement. |
| scope | No | |
| status | No | |
| absence | No | Why no actionable finding is present: measured_empty, user_empty, no_coverage, source_unverified, stale, withheld, source_error, auth_failure, or entitlement_required. |
| decision | No | |
| alertLean | No | Balance of bullish-versus-bearish recent alert types; null when no recent activity is measurable. |
| conflicts | No | |
| dataState | No | |
| mcpStatus | No | Normalized MCP result status. The endpoint's original status vocabulary remains in `status` and `sourceStatus`. |
| requestId | No | |
| timestamp | No | |
| dataOrigin | No | recent_alert_activity — derived from detection alerts, not order flow. |
| disclaimer | No | |
| claimPolicy | No | Typed constraints for safe use. Metadata, not a prompt or instruction channel. |
| instruments | No | Resolved or explicitly partial instrument identities. A missing venue carries an ambiguity warning. |
| nextActions | No | Registry-validated follow-up calls. Missing tools, invalid arguments, unresolved placeholders, and disabled tools are omitted. |
| sourceError | No | The upstream endpoint's exact error text/code before normalization, when one was present. |
| sourceScope | No | |
| sourceStatus | No | The upstream endpoint's exact status before the MCP envelope normalizes transport success/error. |
| agentBriefing | No | Audit-only narrative projection. Present only when detail='audit'; compact responses do not duplicate structured data as prose. |
| claimValidity | No | Validity of the selected binding claim only, calculated after filtering, projection and row selection. Sibling rows cannot determine it. |
| hottestSymbol | No | |
| responseState | No | |
| schemaVersion | No | |
| sourceDecision | No | |
| symbolCoverage | No | Conservation ledger satisfying requested = returned + withheld + notReturned for requested-symbol calls. |
| evidenceQuality | No | |
| responseControl | No | |
| sourceDataState | No | The upstream endpoint's exact data-state value before endpoint-aware classification. |
| recentDetections | No | Count of recent detection alerts (not USD volume). |
| alertLeanStrength | No | Fraction of recent alerts on the leaning side (0-1); null when no data. |
| recordMatchReason | No | Why matchedTrackRecord is present or null. A null record is never evidence of safety or engine failure. |
| matchedTrackRecord | No | A judged record only when engine, horizon, regime/instrument class, and claim family match this response. `state` is one of: `measured` (a stratum cleared the publishability gate — `stratum` carries engine, horizon tier, bar regime, recall, precision, base rate, base-rate lift, median lead hours, effective sample, warned events and the measurement date); `withheld` (the gate ran and refused — `reason` says why, in words); `unavailable` (the record could not be read at all — an infrastructure failure that says nothing about the record). It is ONE stratum selected by recall, never a platform-wide accuracy. Null means no exact record match; read recordMatchReason. |
| confidenceSemantics | No | Every confidence-bearing value with its score type, scale, calibration status, and probability flag. |
| decisionEligibility | No | Fail-closed binding-authority policy. WITHHELD means source evidence remains available for audit while normalized direction, actionability and execution fields are revoked. |
| directionEligibility | No | Current market-direction eligibility. Direction is authorized only by an exact, eligible producer stratum (canonical_verdict, canonical_symbol_verdict, committee_verdict) — read bindingAuthority to see which one bound. Widening WHO may bind did not weaken WHAT binding requires: the named producer must still hold a matching horizon/class/family record on a verified-only judged population, so an authority without a record still cannot bind. |
| executionEligibility | No | Fail-closed execution boundary. Portfolio monitoring tools always return WITHHELD with MONITOR_ONLY_NO_EXECUTION_AUTHORITY while Fahali has no capital path. |
| alertDerivedSentiment | No | |
| monitoringEligibility | No | Current portfolio-monitoring validity based on captured identity, freshness, integrity, and the caller-supplied monitoring policy. ELIGIBLE authorizes observation/delivery only, never financial action. |
| sourceEvidenceQuality | No | |
| topSymbolByDetections | No | |
| currentActionEligibility | No | Current eligibility of an immutable historical portfolio verdict. It never mutates the stored judgment being replayed. |
| sourceConfidenceSemantics | No | |
| symbolsWithRecentDetections | No | Distinct symbols with recent alerts. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive, and openWorld, so the safety profile is covered. The description adds epistemic scope by saying it 'measures what fired, not institutional identity, capital flow, or conviction,' which is genuinely useful context. It does not add further behavioral detail (aggregation window, ordering), so a 3 is fair with annotations doing heavy lifting.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with the core purpose before the caveat and next step. No filler. Some jargon ('evidence gate,' 'market verdict') but overall tight.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists so return values need not be described, and annotations cover the safety profile. The description supplies purpose, scope, and a next step; only the sibling-routing usage guidance is thin. Complete for a read-only detection-summary tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the parameters (limit, since, detail, symbols, include_withheld) are fully documented in structured data. The description adds nothing about how to set them. Baseline 3 is appropriate when the schema carries the semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a concrete verb and resource: recent detection activity per symbol with bullish/bearish alert counts. The second sentence explicitly distinguishes it from siblings by ruling out institutional identity, capital flow, and conviction, which maps to fahali_get_capital_flow and fahali_get_highest_conviction_signals. Clear enough to select it confidently.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The third sentence describes a downstream step (use highest-conviction signals to apply the evidence gate and market verdict), not when to pick this tool over alternatives. Usage is implied by 'recent detection activity' but there is no explicit 'use this when / not when' routing. Adequate but leaves the selection boundary to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fahali_get_engine_boardBRead-onlyIdempotent
Board of any contract engine by key: live claims with probability P (the served fit block states whether and how it is calibrated), attribution, input census, health, and the engine's own judged record. Adds findings[], matchedTrackRecord, recordMatchReason, ownStrataCount, record.withheldOnly. Unmeasured inputs are missing data, never calm; read the own stratum, never the headline.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Optional maximum rows per projectable collection. Audit has no MCP projection cap; brief defaults to 3 and standard to 12. | |
| since | No | Optional lower timestamp bound for returned row collections. | |
| detail | No | Response depth. audit is the full-fidelity default; brief and standard are explicit compact projections. | audit |
| engine | Yes | Engine key, e.g. fall_warning_8h | |
| symbol | No | ||
| symbols | No | Optional symbol projection, as a comma-separated string or array. Rows without instrument identity are not discarded. | |
| include_withheld | No | Include full withheld-row detail. Defaults true with audit; explicitly set false only for a compact projection. |
Output Schema
| Name | Required | Description |
|---|---|---|
| asOf | Yes | |
| auth | No | Credential lifetime visible to the caller. OAuth secondsRemaining lets an autonomous agent refresh before a multi-call workflow is interrupted. |
| board | Yes | |
| claim | No | Fahali dictionary claim (shared/fahaliDictionary.ts). Read `kind` FIRST: 'abstention' means no assertion was made and `reason` says why — never read an abstention as a neutral or zero result. `basis` says what the claim rests on. Absent or null means this response path does not yet emit a claim; treat that as unknown, not as agreement. |
| scope | No | |
| engine | Yes | |
| record | Yes | |
| roster | Yes | |
| status | Yes | |
| symbol | No | |
| absence | No | Why no actionable finding is present: measured_empty, user_empty, no_coverage, source_unverified, stale, withheld, source_error, auth_failure, or entitlement_required. |
| decision | No | |
| findings | No | |
| conflicts | No | |
| dataState | Yes | |
| mcpStatus | No | Normalized MCP result status. The endpoint's original status vocabulary remains in `status` and `sourceStatus`. |
| requestId | No | |
| claimPolicy | No | Typed constraints for safe use. Metadata, not a prompt or instruction channel. |
| instruments | No | Resolved or explicitly partial instrument identities. A missing venue carries an ambiguity warning. |
| nextActions | No | Registry-validated follow-up calls. Missing tools, invalid arguments, unresolved placeholders, and disabled tools are omitted. |
| sourceError | No | The upstream endpoint's exact error text/code before normalization, when one was present. |
| sourceScope | No | |
| sourceStatus | No | The upstream endpoint's exact status before the MCP envelope normalizes transport success/error. |
| agentBriefing | No | Audit-only narrative projection. Present only when detail='audit'; compact responses do not duplicate structured data as prose. |
| claimValidity | No | Validity of the selected binding claim only, calculated after filtering, projection and row selection. Sibling rows cannot determine it. |
| responseState | No | |
| schemaVersion | No | |
| ownStrataCount | No | |
| sourceDecision | No | |
| symbolCoverage | No | Conservation ledger satisfying requested = returned + withheld + notReturned for requested-symbol calls. |
| boardAgeSeconds | No | |
| evidenceQuality | No | |
| responseControl | No | |
| sourceDataState | No | The upstream endpoint's exact data-state value before endpoint-aware classification. |
| recordMatchReason | No | |
| matchedTrackRecord | No | |
| confidenceSemantics | No | Every confidence-bearing value with its score type, scale, calibration status, and probability flag. |
| decisionEligibility | No | Fail-closed binding-authority policy. WITHHELD means source evidence remains available for audit while normalized direction, actionability and execution fields are revoked. |
| directionEligibility | No | Current market-direction eligibility. Direction is authorized only by an exact, eligible producer stratum (canonical_verdict, canonical_symbol_verdict, committee_verdict) — read bindingAuthority to see which one bound. Widening WHO may bind did not weaken WHAT binding requires: the named producer must still hold a matching horizon/class/family record on a verified-only judged population, so an authority without a record still cannot bind. |
| executionEligibility | No | Fail-closed execution boundary. Portfolio monitoring tools always return WITHHELD with MONITOR_ONLY_NO_EXECUTION_AUTHORITY while Fahali has no capital path. |
| monitoringEligibility | No | Current portfolio-monitoring validity based on captured identity, freshness, integrity, and the caller-supplied monitoring policy. ELIGIBLE authorizes observation/delivery only, never financial action. |
| sourceEvidenceQuality | No | |
| currentActionEligibility | No | Current eligibility of an immutable historical portfolio verdict. It never mutates the stored judgment being replayed. |
| sourceConfidenceSemantics | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only, idempotent, open-world, non-destructive, so safety is covered. The description adds real behavioral substance not in the annotations: the served `fit` block discloses whether probability is calibrated, unmeasured inputs mean missing data rather than calm, and withheld-only rows are surfaced via record.withheldOnly. That materially changes how an agent should treat the returned numbers.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The opening clause front-loads purpose well, and the interpretation cautions earn their place. However, the middle sentence enumerating added fields (findings[], matchedTrackRecord, recordMatchReason, ownStrataCount, record.withheldOnly) is partially redundant against the existing output schema and is ambiguous about what they are 'added' relative to.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema, full annotations, and 86% schema coverage, the description only needs to add the interpretive frame, and it does: calibration disclosure, missing-data semantics, stratum-over-headline reading. The main residual gap is the absence of any routing versus the engine_status sibling.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 86%, so limit, since, detail, symbols, and include_withheld are already documented in the schema. The description only contributes the semantic that engine is a 'key' and that a `fit` block is included; it adds nothing about how symbol/symbols or detail interact with the board output. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a concrete verb+resource ('board of any contract engine by key') and enumerates the payload components: live claims with probability, attribution, input census, health, judged record. An agent can tell it is an engine-level inspection tool, though it never distinguishes itself from the sibling fahali_get_engine_status, which sounds adjacent.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no statement of when to reach for this tool versus fahali_get_engine_status, fahali_get_market_decision, or other engine-related siblings. The closing advice ('read the own stratum, never the headline') is output-interpretation guidance, not selection guidance, and no prerequisites or exclusions are given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fahali_get_engine_statusARead-onlyIdempotent
Engine liveness with event-gated, continuous, validation-only, retired, and structurally unattributed states. Incomplete measurements are null; zero is emitted only for a complete empty window and never proves an engine is down. Read dataState and freshness, then use the track-record scorecard for skill; liveness is not accuracy.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Optional maximum rows per projectable collection. Audit has no MCP projection cap; brief defaults to 3 and standard to 12. | |
| since | No | Optional lower timestamp bound for returned row collections. | |
| detail | No | Response depth. audit is the full-fidelity default; brief and standard are explicit compact projections. | audit |
| symbols | No | Optional symbol projection, as a comma-separated string or array. Rows without instrument identity are not discarded. | |
| include_withheld | No | Include full withheld-row detail. Defaults true with audit; explicitly set false only for a compact projection. |
Output Schema
| Name | Required | Description |
|---|---|---|
| asOf | No | |
| asof | No | |
| auth | No | Credential lifetime visible to the caller. OAuth secondsRemaining lets an autonomous agent refresh before a multi-call workflow is interrupted. |
| claim | No | Fahali dictionary claim (shared/fahaliDictionary.ts). Read `kind` FIRST: 'abstention' means no assertion was made and `reason` says why — never read an abstention as a neutral or zero result. `basis` says what the claim rests on. Absent or null means this response path does not yet emit a claim; treat that as unknown, not as agreement. |
| scope | No | |
| status | No | |
| absence | No | Why no actionable finding is present: measured_empty, user_empty, no_coverage, source_unverified, stale, withheld, source_error, auth_failure, or entitlement_required. |
| engines | No | |
| decision | No | |
| registry | No | Generated cross-repository registry digest and heartbeat-contract validation state. |
| authority | No | Distinct authorities for engine identity, compute liveness, and publication diagnostics. |
| conflicts | No | |
| dataState | No | |
| mcpStatus | No | Normalized MCP result status. The endpoint's original status vocabulary remains in `status` and `sourceStatus`. |
| requestId | No | |
| data_state | No | |
| attribution | No | |
| claimPolicy | No | Typed constraints for safe use. Metadata, not a prompt or instruction channel. |
| instruments | No | Resolved or explicitly partial instrument identities. A missing venue carries an ambiguity warning. |
| nextActions | No | Registry-validated follow-up calls. Missing tools, invalid arguments, unresolved placeholders, and disabled tools are omitted. |
| sourceError | No | The upstream endpoint's exact error text/code before normalization, when one was present. |
| sourceScope | No | |
| probe_errors | No | |
| sourceStatus | No | The upstream endpoint's exact status before the MCP envelope normalizes transport success/error. |
| agentBriefing | No | Audit-only narrative projection. Present only when detail='audit'; compact responses do not duplicate structured data as prose. |
| claimValidity | No | Validity of the selected binding claim only, calculated after filtering, projection and row selection. Sibling rows cannot determine it. |
| responseState | No | |
| schemaVersion | No | |
| market_context | No | |
| sourceDecision | No | |
| symbolCoverage | No | Conservation ledger satisfying requested = returned + withheld + notReturned for requested-symbol calls. |
| evidenceQuality | No | |
| measured_window | No | Scheduled-rollup coverage, producer freshness, probe failures and count reliability. |
| responseControl | No | |
| sourceDataState | No | The upstream endpoint's exact data-state value before endpoint-aware classification. |
| recordMatchReason | No | Why matchedTrackRecord is present or null. A null record is never evidence of safety or engine failure. |
| matchedTrackRecord | No | A judged record only when engine, horizon, regime/instrument class, and claim family match this response. `state` is one of: `measured` (a stratum cleared the publishability gate — `stratum` carries engine, horizon tier, bar regime, recall, precision, base rate, base-rate lift, median lead hours, effective sample, warned events and the measurement date); `withheld` (the gate ran and refused — `reason` says why, in words); `unavailable` (the record could not be read at all — an infrastructure failure that says nothing about the record). It is ONE stratum selected by recall, never a platform-wide accuracy. Null means no exact record match; read recordMatchReason. |
| confidenceSemantics | No | Every confidence-bearing value with its score type, scale, calibration status, and probability flag. |
| decisionEligibility | No | Fail-closed binding-authority policy. WITHHELD means source evidence remains available for audit while normalized direction, actionability and execution fields are revoked. |
| directionEligibility | No | Current market-direction eligibility. Direction is authorized only by an exact, eligible producer stratum (canonical_verdict, canonical_symbol_verdict, committee_verdict) — read bindingAuthority to see which one bound. Widening WHO may bind did not weaken WHAT binding requires: the named producer must still hold a matching horizon/class/family record on a verified-only judged population, so an authority without a record still cannot bind. |
| executionEligibility | No | Fail-closed execution boundary. Portfolio monitoring tools always return WITHHELD with MONITOR_ONLY_NO_EXECUTION_AUTHORITY while Fahali has no capital path. |
| unmapped_alert_types | No | |
| monitoringEligibility | No | Current portfolio-monitoring validity based on captured identity, freshness, integrity, and the caller-supplied monitoring policy. ELIGIBLE authorizes observation/delivery only, never financial action. |
| sourceEvidenceQuality | No | |
| agent_authored_excluded | No | |
| currentActionEligibility | No | Current eligibility of an immutable historical portfolio verdict. It never mutates the stored judgment being replayed. |
| sourceConfidenceSemantics | No | |
| unmatched_subsystem_heartbeats | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover readOnly/idempotent/non-destructive, so the description wisely spends its words on interpretation semantics: incomplete measurements are null, and zero only appears for a complete empty window and never proves an engine is down. That is genuinely useful context not present in annotations, though it omits what happens with withheld rows despite the include_withheld param.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
It is short and front-loaded, but the opening clause is a dense string of unexplained jargon ('event-gated, continuous, validation-only, retired, and structurally unattributed states') that costs readability without earning comprehension. Later sentences are tighter and more valuable than the first.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return format need not be explained, and the description supplies the interpretive caveats an agent needs (nulls vs. zeros, dataState/freshness, liveness vs. skill). Remaining gaps are minor, such as the interaction between include_withheld and the 'withheld' liveness state.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and every parameter carries its own documentation (limit defaults, detail enum semantics, include_withheld behavior), so the schema does the heavy lifting. The description adds no parameter-level guidance, which is acceptable at this coverage but not additive.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Names the resource concretely as engine liveness and enumerates the liveness states it distinguishes, and explicitly separates itself from the track-record scorecard ('liveness is not accuracy'). It does not, however, clarify how it differs from the close sibling fahali_get_engine_board, leaving some ambiguity in a crowded namespace.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear direction: read dataState and freshness here, and go to the track-record scorecard for skill/accuracy questions. It states a when-not explicitly ('liveness is not accuracy'), though it says nothing about when to prefer the engine board or other status-adjacent siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fahali_get_evidenceARead-onlyIdempotent
Fetch the compact, content-addressed evidence behind one immutable portfolio verdict. Returns the evidence snapshot hashed at decision time plus retained source events, explicit retention gaps, canonical instrument resolution, and hash verification. Use summary detail for routine audit and full only when raw source metadata is required.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| since | No | Optional lower timestamp bound for returned row collections. | |
| detail | No | summary returns source keys and resolved claim fields; full includes the retained raw source data object. | summary |
| offset | No | ||
| symbols | No | Optional symbol projection, as a comma-separated string or array. Rows without instrument identity are not discarded. | |
| verdict_id | Yes | Permanent verdict ID returned by verdict history, watch delta, or verdict-by-ID. | |
| evidence_ids | No | ||
| include_withheld | No | Include full withheld-row detail. Defaults true with audit; explicitly set false only for a compact projection. |
Output Schema
| Name | Required | Description |
|---|---|---|
| asOf | No | |
| auth | No | Credential lifetime visible to the caller. OAuth secondsRemaining lets an autonomous agent refresh before a multi-call workflow is interrupted. |
| claim | No | Fahali dictionary claim (shared/fahaliDictionary.ts). Read `kind` FIRST: 'abstention' means no assertion was made and `reason` says why — never read an abstention as a neutral or zero result. `basis` says what the claim rests on. Absent or null means this response path does not yet emit a claim; treat that as unknown, not as agreement. |
| scope | No | |
| detail | No | |
| offset | No | |
| status | Yes | |
| absence | No | Why no actionable finding is present: measured_empty, user_empty, no_coverage, source_unverified, stale, withheld, source_error, auth_failure, or entitlement_required. |
| watchId | No | |
| coverage | Yes | |
| dataAsOf | No | |
| decision | No | |
| conflicts | No | |
| dataState | Yes | |
| immutable | No | |
| integrity | Yes | |
| mcpStatus | No | Normalized MCP result status. The endpoint's original status vocabulary remains in `status` and `sourceStatus`. |
| requestId | No | |
| verdictId | Yes | |
| nextOffset | No | |
| claimPolicy | No | Typed constraints for safe use. Metadata, not a prompt or instruction channel. |
| instruments | No | Resolved or explicitly partial instrument identities. A missing venue carries an ambiguity warning. |
| nextActions | No | Registry-validated follow-up calls. Missing tools, invalid arguments, unresolved placeholders, and disabled tools are omitted. |
| sourceError | No | The upstream endpoint's exact error text/code before normalization, when one was present. |
| sourceScope | No | |
| evidenceRefs | No | |
| sourceEvents | Yes | |
| sourceStatus | No | The upstream endpoint's exact status before the MCP envelope normalizes transport success/error. |
| agentBriefing | No | Audit-only narrative projection. Present only when detail='audit'; compact responses do not duplicate structured data as prose. |
| claimValidity | No | Validity of the selected binding claim only, calculated after filtering, projection and row selection. Sibling rows cannot determine it. |
| operatingMode | Yes | |
| responseState | No | |
| schemaVersion | No | |
| snapshotState | No | Legacy verdicts predate durable source snapshots and therefore remain partial even if a retained event row is still readable. |
| sourceDecision | No | |
| symbolCoverage | No | Conservation ledger satisfying requested = returned + withheld + notReturned for requested-symbol calls. |
| evidenceQuality | No | |
| responseControl | No | |
| sourceDataState | No | The upstream endpoint's exact data-state value before endpoint-aware classification. |
| immutableSnapshot | Yes | Requested page from the exact stored evidence snapshot. Integrity is verified against the complete snapshot, not this page alone. |
| recordMatchReason | No | Why matchedTrackRecord is present or null. A null record is never evidence of safety or engine failure. |
| matchedTrackRecord | No | A judged record only when engine, horizon, regime/instrument class, and claim family match this response. `state` is one of: `measured` (a stratum cleared the publishability gate — `stratum` carries engine, horizon tier, bar regime, recall, precision, base rate, base-rate lift, median lead hours, effective sample, warned events and the measurement date); `withheld` (the gate ran and refused — `reason` says why, in words); `unavailable` (the record could not be read at all — an infrastructure failure that says nothing about the record). It is ONE stratum selected by recall, never a platform-wide accuracy. Null means no exact record match; read recordMatchReason. |
| methodologyVersion | No | |
| missingEvidenceIds | No | |
| confidenceSemantics | No | Every confidence-bearing value with its score type, scale, calibration status, and probability flag. |
| decisionEligibility | No | Fail-closed binding-authority policy. WITHHELD means source evidence remains available for audit while normalized direction, actionability and execution fields are revoked. |
| directionEligibility | No | Current market-direction eligibility. Direction is authorized only by an exact, eligible producer stratum (canonical_verdict, canonical_symbol_verdict, committee_verdict) — read bindingAuthority to see which one bound. Widening WHO may bind did not weaken WHAT binding requires: the named producer must still hold a matching horizon/class/family record on a verified-only judged population, so an authority without a record still cannot bind. |
| executionEligibility | No | Fail-closed execution boundary. Portfolio monitoring tools always return WITHHELD with MONITOR_ONLY_NO_EXECUTION_AUTHORITY while Fahali has no capital path. |
| legacyFieldSemantics | Yes | |
| outputClassification | Yes | |
| monitoringEligibility | No | Current portfolio-monitoring validity based on captured identity, freshness, integrity, and the caller-supplied monitoring policy. ELIGIBLE authorizes observation/delivery only, never financial action. |
| sourceEvidenceQuality | No | |
| currentActionEligibility | No | Current eligibility of an immutable historical portfolio verdict. It never mutates the stored judgment being replayed. |
| sourceConfidenceSemantics | No | |
| identityMismatchEvidenceIds | Yes | Retained source-event IDs whose current captured instrument identity no longer matches the immutable verdict snapshot. |
| sourceMaterialMismatchEvidenceIds | Yes | Retained source-event IDs whose current producer-row material no longer matches the exact row hash consumed by the verdict. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only, idempotent, non-destructive, so the safety profile is settled. The description adds substantive context beyond that: the snapshot is hashed at decision time and hash verification is returned, and 'explicit retention gaps' signals that missing data is a normal, disclosed outcome rather than an error. It does not discuss pagination or how large the retained event sets can get.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with identity and followed by the contents and the one actionable usage rule. The middle sentence is a dense enumeration but each item earns its place; nothing is padded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so enumerating return fields is partly redundant, but naming hash verification and retention gaps tells the agent what to look for in the response. The main gap is routing: with this many adjacent verdict/evidence siblings, an explicit alternative would have closed the definition.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is a moderate 63%, and the description reinforces the detail enum tradeoff rather than adding new syntax. Five parameters (limit, offset, since, symbols, evidence_ids, include_withheld) carry no guidance in the description, though symbols/include_withheld are documented in the schema itself.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Fetch the ... evidence behind one immutable portfolio verdict') with scope qualifiers: compact, content-addressed, single verdict. This clearly separates it from sibling tools like fahali_get_verdict_by_id (the verdict itself) and fahali_get_verdict_history (the list).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives a decision rule for the detail parameter ('summary for routine audit, full only when raw source metadata is required'), which is genuinely useful. But it never says when to reach for this tool instead of fahali_get_portfolio_decision, fahali_get_verdict_by_id, or fahali_get_bundle, all of which sit close to the same data.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fahali_get_fall_warningsARead-onlyIdempotent
8-hour fall-warning board: standing warnings with probability P (the served fit block states whether and how it is calibrated) of a >=5% drawdown within 8h, attribution, input census, and the engine's own judged record. Adds findings[], matchedTrackRecord, recordMatchReason, ownStrataCount, record.withheldOnly. Unmeasured inputs are missing data, never calm; 'late' is not a claim; read the own stratum, never the headline.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| since | No | Optional lower timestamp bound for returned row collections. | |
| detail | No | Response depth. audit is the full-fidelity default; brief and standard are explicit compact projections. | audit |
| symbol | No | Optional instrument, e.g. BTCUSDT | |
| symbols | No | Optional symbol projection, as a comma-separated string or array. Rows without instrument identity are not discarded. | |
| include_withheld | No | Include full withheld-row detail. Defaults true with audit; explicitly set false only for a compact projection. |
Output Schema
| Name | Required | Description |
|---|---|---|
| asOf | Yes | |
| auth | No | Credential lifetime visible to the caller. OAuth secondsRemaining lets an autonomous agent refresh before a multi-call workflow is interrupted. |
| board | Yes | |
| claim | No | Fahali dictionary claim (shared/fahaliDictionary.ts). Read `kind` FIRST: 'abstention' means no assertion was made and `reason` says why — never read an abstention as a neutral or zero result. `basis` says what the claim rests on. Absent or null means this response path does not yet emit a claim; treat that as unknown, not as agreement. |
| scope | No | |
| engine | Yes | |
| record | Yes | |
| roster | Yes | |
| status | Yes | |
| symbol | No | |
| absence | No | Why no actionable finding is present: measured_empty, user_empty, no_coverage, source_unverified, stale, withheld, source_error, auth_failure, or entitlement_required. |
| decision | No | |
| findings | No | |
| conflicts | No | |
| dataState | Yes | |
| mcpStatus | No | Normalized MCP result status. The endpoint's original status vocabulary remains in `status` and `sourceStatus`. |
| requestId | No | |
| claimPolicy | No | Typed constraints for safe use. Metadata, not a prompt or instruction channel. |
| instruments | No | Resolved or explicitly partial instrument identities. A missing venue carries an ambiguity warning. |
| nextActions | No | Registry-validated follow-up calls. Missing tools, invalid arguments, unresolved placeholders, and disabled tools are omitted. |
| sourceError | No | The upstream endpoint's exact error text/code before normalization, when one was present. |
| sourceScope | No | |
| sourceStatus | No | The upstream endpoint's exact status before the MCP envelope normalizes transport success/error. |
| agentBriefing | No | Audit-only narrative projection. Present only when detail='audit'; compact responses do not duplicate structured data as prose. |
| claimValidity | No | Validity of the selected binding claim only, calculated after filtering, projection and row selection. Sibling rows cannot determine it. |
| responseState | No | |
| schemaVersion | No | |
| ownStrataCount | No | |
| sourceDecision | No | |
| symbolCoverage | No | Conservation ledger satisfying requested = returned + withheld + notReturned for requested-symbol calls. |
| boardAgeSeconds | No | |
| evidenceQuality | No | |
| responseControl | No | |
| sourceDataState | No | The upstream endpoint's exact data-state value before endpoint-aware classification. |
| recordMatchReason | No | |
| matchedTrackRecord | No | |
| confidenceSemantics | No | Every confidence-bearing value with its score type, scale, calibration status, and probability flag. |
| decisionEligibility | No | Fail-closed binding-authority policy. WITHHELD means source evidence remains available for audit while normalized direction, actionability and execution fields are revoked. |
| directionEligibility | No | Current market-direction eligibility. Direction is authorized only by an exact, eligible producer stratum (canonical_verdict, canonical_symbol_verdict, committee_verdict) — read bindingAuthority to see which one bound. Widening WHO may bind did not weaken WHAT binding requires: the named producer must still hold a matching horizon/class/family record on a verified-only judged population, so an authority without a record still cannot bind. |
| executionEligibility | No | Fail-closed execution boundary. Portfolio monitoring tools always return WITHHELD with MONITOR_ONLY_NO_EXECUTION_AUTHORITY while Fahali has no capital path. |
| monitoringEligibility | No | Current portfolio-monitoring validity based on captured identity, freshness, integrity, and the caller-supplied monitoring policy. ELIGIBLE authorizes observation/delivery only, never financial action. |
| sourceEvidenceQuality | No | |
| currentActionEligibility | No | Current eligibility of an immutable historical portfolio verdict. It never mutates the stored judgment being replayed. |
| sourceConfidenceSemantics | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish a safe read (readOnlyHint, idempotent, non-destructive), so the bar is lower, and the description still adds real substance: calibration is disclosed via the served `fit` block, unmeasured inputs are framed as missing rather than calm, and "late" is explicitly not a claim. These are meaningful caveats an agent would not get from structured fields.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core purpose is front-loaded, which is good, but the middle sentence is a raw enumeration of output field names (findings[], matchedTrackRecord, recordMatchReason, ownStrataCount, record.withheldOnly) that an output schema already covers, and the jargon density makes it slower to parse than needed.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a semantically heavy risk-board tool with an output schema present, the description covers the conceptual burden well: what the probability means, that calibration is conditional, and how to read strata versus headline. Return-value detail is redundant but not missing anything an agent needs to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 83%, so the schema already carries most parameter meaning. The description adds nothing about limit, since, detail, symbols or include_withheld, leaving baseline 3 as the correct ceiling for this dimension.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names the specific resource and horizon: an 8-hour fall-warning board with standing warnings at probability P of a >=5% drawdown within 8h, plus attribution, input census and judged record. That is far more specific than the name alone. It does not, however, explicitly distinguish itself from close siblings such as fahali_get_flash_crash_risk or fahali_get_market_risk_score.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Guidance given is about interpretation rather than selection: "read the own stratum, never the headline," "Unmeasured inputs are missing data, never calm." Those are useful directives, but there is no statement of when to call this versus the flash-crash or risk-score siblings, and no exclusion conditions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fahali_get_flash_crash_riskARead-onlyIdempotent
Current flash-crash precursor activity and affected symbols. The strength value is an uncalibrated detection score, not the probability of a crash. Use the canonical market verdict before stating direction, and the matched judged record before stating performance.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Optional maximum rows per projectable collection. Audit has no MCP projection cap; brief defaults to 3 and standard to 12. | |
| since | No | Optional lower timestamp bound for returned row collections. | |
| detail | No | Response depth. audit is the full-fidelity default; brief and standard are explicit compact projections. | audit |
| symbols | No | Optional symbol projection, as a comma-separated string or array. Rows without instrument identity are not discarded. | |
| include_withheld | No | Include full withheld-row detail. Defaults true with audit; explicitly set false only for a compact projection. |
Output Schema
| Name | Required | Description |
|---|---|---|
| asOf | No | |
| auth | No | Credential lifetime visible to the caller. OAuth secondsRemaining lets an autonomous agent refresh before a multi-call workflow is interrupted. |
| claim | No | Fahali dictionary claim (shared/fahaliDictionary.ts). Read `kind` FIRST: 'abstention' means no assertion was made and `reason` says why — never read an abstention as a neutral or zero result. `basis` says what the claim rests on. Absent or null means this response path does not yet emit a claim; treat that as unknown, not as agreement. |
| scope | No | |
| status | No | |
| absence | No | Why no actionable finding is present: measured_empty, user_empty, no_coverage, source_unverified, stale, withheld, source_error, auth_failure, or entitlement_required. |
| signals | No | |
| summary | No | |
| decision | No | |
| conflicts | No | |
| dataState | No | |
| mcpStatus | No | Normalized MCP result status. The endpoint's original status vocabulary remains in `status` and `sourceStatus`. |
| requestId | No | |
| timestamp | No | |
| calibrated | No | Always false — detectionStrength is not a calibrated probability. |
| dataOrigin | No | alert_weight_x_confidence |
| disclaimer | No | |
| claimPolicy | No | Typed constraints for safe use. Metadata, not a prompt or instruction channel. |
| instruments | No | Resolved instrument identities carried across from the api-server (every top name here is typically a leveraged/inverse product — read identity before reading direction). |
| nextActions | No | Registry-validated follow-up calls. Missing tools, invalid arguments, unresolved placeholders, and disabled tools are omitted. |
| sourceError | No | The upstream endpoint's exact error text/code before normalization, when one was present. |
| sourceScope | No | |
| sourceStatus | No | The upstream endpoint's exact status before the MCP envelope normalizes transport success/error. |
| agentBriefing | No | Audit-only narrative projection. Present only when detail='audit'; compact responses do not duplicate structured data as prose. |
| claimValidity | No | Validity of the selected binding claim only, calculated after filtering, projection and row selection. Sibling rows cannot determine it. |
| responseState | No | |
| schemaVersion | No | |
| sourceDecision | No | |
| symbolCoverage | No | Conservation ledger satisfying requested = returned + withheld + notReturned for requested-symbol calls. |
| evidenceQuality | No | |
| responseControl | No | |
| sourceDataState | No | The upstream endpoint's exact data-state value before endpoint-aware classification. |
| recordMatchReason | No | Why matchedTrackRecord is present or null. A null record is never evidence of safety or engine failure. |
| matchedTrackRecord | No | A judged record only when engine, horizon, regime/instrument class, and claim family match this response. `state` is one of: `measured` (a stratum cleared the publishability gate — `stratum` carries engine, horizon tier, bar regime, recall, precision, base rate, base-rate lift, median lead hours, effective sample, warned events and the measurement date); `withheld` (the gate ran and refused — `reason` says why, in words); `unavailable` (the record could not be read at all — an infrastructure failure that says nothing about the record). It is ONE stratum selected by recall, never a platform-wide accuracy. Null means no exact record match; read recordMatchReason. |
| confidenceSemantics | No | Every confidence-bearing value with its score type, scale, calibration status, and probability flag. |
| decisionEligibility | No | Fail-closed binding-authority policy. WITHHELD means source evidence remains available for audit while normalized direction, actionability and execution fields are revoked. |
| directionEligibility | No | Current market-direction eligibility. Direction is authorized only by an exact, eligible producer stratum (canonical_verdict, canonical_symbol_verdict, committee_verdict) — read bindingAuthority to see which one bound. Widening WHO may bind did not weaken WHAT binding requires: the named producer must still hold a matching horizon/class/family record on a verified-only judged population, so an authority without a record still cannot bind. |
| executionEligibility | No | Fail-closed execution boundary. Portfolio monitoring tools always return WITHHELD with MONITOR_ONLY_NO_EXECUTION_AUTHORITY while Fahali has no capital path. |
| monitoringEligibility | No | Current portfolio-monitoring validity based on captured identity, freshness, integrity, and the caller-supplied monitoring policy. ELIGIBLE authorizes observation/delivery only, never financial action. |
| sourceEvidenceQuality | No | |
| currentActionEligibility | No | Current eligibility of an immutable historical portfolio verdict. It never mutates the stored judgment being replayed. |
| sourceConfidenceSemantics | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive), so the bar is lower — and the description still adds real value by warning that the strength value is an uncalibrated detection score rather than a crash probability, which prevents the most likely misinterpretation. It doesn't discuss row volume, withholding behavior, or freshness, which are handled elsewhere.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with what is returned, then the two caveats that matter. Mostly efficient, though 'matched judged record' is internal jargon that costs the agent a little parsing effort.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return shape needn't be described, and annotations cover safety. What remains — the interpretive limits of the headline score and the corroboration path — is exactly what the description supplies.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so limit, since, detail, symbols, and include_withheld are all documented in the schema itself. The description adds nothing about parameter behavior, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific resource — current flash-crash precursor activity — and what comes with it (affected symbols), which is distinct from the risk-score, sentiment, and detection-activity siblings. It doesn't explicitly name which sibling to prefer when precursor activity overlaps with market risk, so it falls short of full differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete downstream routing: consult the canonical market verdict before asserting direction and the matched judged record before asserting performance. That is clear guidance on interpretation and cross-tool sequencing, but it doesn't state when to call this tool instead of get_market_risk_score or get_detection_activity.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fahali_get_forecastARead-onlyIdempotent
Forward distribution for one symbol — ALWAYS served: direction (up | down | range), upside / downside / range probabilities summing to 1 over the declared horizon, expected move, and cone. Read evidenceTier and judged-record reliability; caveats name what was withheld. Probabilities, never certainties; observation is not advice. Requires Agent Starter; a denial returns a typed upgrade object.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Optional maximum rows per projectable collection. Audit has no MCP projection cap; brief defaults to 3 and standard to 12. | |
| since | No | Optional lower timestamp bound for returned row collections. | |
| detail | No | Response depth. audit is the full-fidelity default; brief and standard are explicit compact projections. | audit |
| symbol | Yes | Trading symbol (e.g. 'BTCUSDT'). Required. | |
| include | No | Optional comma-separated extras: 'reasoning,history'. | |
| symbols | No | Optional symbol projection, as a comma-separated string or array. Rows without instrument identity are not discarded. | |
| include_withheld | No | Include full withheld-row detail. Defaults true with audit; explicitly set false only for a compact projection. |
Output Schema
| Name | Required | Description |
|---|---|---|
| asOf | No | |
| auth | No | Credential lifetime visible to the caller. OAuth secondsRemaining lets an autonomous agent refresh before a multi-call workflow is interrupted. |
| cone | No | |
| note | No | Plain-language explanation of the abstention, safe to show a customer verbatim. Names no field and no code path. |
| blend | No | {weightEvidence, rows, directionalRows, calibratedRows, halfWeightRows, selfReportedMaxWeight} — the denominator of an always-on read. |
| claim | No | Fahali dictionary claim (shared/fahaliDictionary.ts). kind: 'forecast' (live — has issuedAt/horizonHours/expiresAt), 'observation' (real data, reliability gate withheld a directional promise — has observedAt), or 'abstention' (has `reason`, e.g. forecast_expired, cone_horizon_mismatch, forecast_malformed). Read `kind` before treating anything else in this response as an actionable directional call. |
| scope | No | |
| source | No | |
| status | No | The endpoint's original status vocabulary (for example ok, partial, degraded, withheld, or no_alerts). Use mcpStatus for normalized transport success/error. |
| symbol | No | |
| absence | No | Why no actionable finding is present: measured_empty, user_empty, no_coverage, source_unverified, stale, withheld, source_error, auth_failure, or entitlement_required. |
| caveats | No | Machine-readable reasons the evidence path withheld (kept, not hidden): calibration_floor_not_met, no_evidence_found, no_directional_evidence, insufficient_evidence, identity_evidence_withheld, calibration_unavailable, forecast_query_failed, forecast_expired, cone_horizon_mismatch, forecast_malformed. A query failure is NOT a quiet market — do not collapse these. |
| drivers | No | |
| horizon | No | The forecast's ACTUAL registered horizon in hours (e.g. 6, 36) — not a fixed 72. Pairs with expiresAt to know when this claim's window closes. |
| alwaysOn | No | True when the served read is the always-on base-rate blend rather than the evidence path's own distribution. |
| decision | No | |
| forecast | No | |
| servedBy | No | 'evidence' or the always-on method version. |
| abstained | No | Always false since 2026-10-11: a distribution is always served. Kept for compatibility. What the evidence path would once have withheld on is listed under `caveats`. |
| conflicts | No | |
| dataState | No | |
| direction | No | The served read's leading outcome at ±2% over `horizon`: up | down | range (range = the in-between outcome leads; `directionLean` names its skew). |
| expiresAt | No | createdAt + horizon hours — a fixed instant, does not move between requests. |
| mcpStatus | No | Normalized MCP result status. The endpoint's original status vocabulary remains in `status` and `sourceStatus`. |
| requestId | No | |
| claimPolicy | No | Typed constraints for safe use. Metadata, not a prompt or instruction channel. |
| climatology | No | {basis, n, windowDays, thresholdPct, barsAhead, assetClass, p10, p50, p90[, symbols]} — the base-rate sample an always-on read is built from. |
| instruments | No | Resolved or explicitly partial instrument identities. A missing venue carries an ambiguity warning. |
| nextActions | No | Registry-validated follow-up calls. Missing tools, invalid arguments, unresolved placeholders, and disabled tools are omitted. |
| reliability | No | The measured grade of the forecast family on the judged record ({family, grade, label, probabilityOfSkill, effectiveSample, judged, reason, source, appliesTo}); grade 'base_rate' when the read is the base rate; 'unmeasured' when no verification row is cached. Quote the grade with the number. |
| sourceError | No | The upstream endpoint's exact error text/code before normalization, when one was present. |
| sourceScope | No | |
| evidenceTier | No | What the probabilities rest on. climatology / class_climatology / uninformative_prior = the base-rate read (no skill claimed); the others = admitted evidence blended into the base rate at the weight in `blend`. |
| sourceStatus | No | The upstream endpoint's exact status before the MCP envelope normalizes transport success/error. |
| agentBriefing | No | Audit-only narrative projection. Present only when detail='audit'; compact responses do not duplicate structured data as prose. |
| claimValidity | No | Validity of the selected binding claim only, calculated after filtering, projection and row selection. Sibling rows cannot determine it. |
| directionLean | No | When direction is range, which tail is heavier. |
| responseState | No | |
| schemaVersion | No | |
| missingSignals | No | |
| sourceDecision | No | |
| symbolCoverage | No | Conservation ledger satisfying requested = returned + withheld + notReturned for requested-symbol calls. |
| evidenceQuality | No | |
| expiredForecast | No | Present only when claim.kind is 'abstention' with an expiry reason. The stale forecast that expired by its own registered horizon, kept visible for audit rather than silently withheld. |
| responseControl | No | |
| sourceDataState | No | The upstream endpoint's exact data-state value before endpoint-aware classification. |
| abstentionReason | No | Legacy; null. See `caveats`. |
| recordMatchReason | No | Why matchedTrackRecord is present or null. A null record is never evidence of safety or engine failure. |
| matchedTrackRecord | No | A judged record only when engine, horizon, regime/instrument class, and claim family match this response. `state` is one of: `measured` (a stratum cleared the publishability gate — `stratum` carries engine, horizon tier, bar regime, recall, precision, base rate, base-rate lift, median lead hours, effective sample, warned events and the measurement date); `withheld` (the gate ran and refused — `reason` says why, in words); `unavailable` (the record could not be read at all — an infrastructure failure that says nothing about the record). It is ONE stratum selected by recall, never a platform-wide accuracy. Null means no exact record match; read recordMatchReason. |
| confidenceSemantics | No | Every confidence-bearing value with its score type, scale, calibration status, and probability flag. |
| decisionEligibility | No | Fail-closed binding-authority policy. WITHHELD means source evidence remains available for audit while normalized direction, actionability and execution fields are revoked. |
| directionEligibility | No | Current market-direction eligibility. Direction is authorized only by an exact, eligible producer stratum (canonical_verdict, canonical_symbol_verdict, committee_verdict) — read bindingAuthority to see which one bound. Widening WHO may bind did not weaken WHAT binding requires: the named producer must still hold a matching horizon/class/family record on a verified-only judged population, so an authority without a record still cannot bind. |
| executionEligibility | No | Fail-closed execution boundary. Portfolio monitoring tools always return WITHHELD with MONITOR_ONLY_NO_EXECUTION_AUTHORITY while Fahali has no capital path. |
| monitoringEligibility | No | Current portfolio-monitoring validity based on captured identity, freshness, integrity, and the caller-supplied monitoring policy. ELIGIBLE authorizes observation/delivery only, never financial action. |
| sourceEvidenceQuality | No | |
| currentActionEligibility | No | Current eligibility of an immutable historical portfolio verdict. It never mutates the stored judgment being replayed. |
| sourceConfidenceSemantics | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, openWorld, non-destructive), and the description adds genuinely new behavior: an Agent Starter entitlement gate and, on denial, a typed upgrade object rather than an error. It also guarantees the payload is 'ALWAYS served' and that withholding is disclosed via caveats. It stops short of describing latency, rate limits, or caching.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the resource and its guaranteed payload, then gated access last — a sensible ordering. The 'Probabilities, never certainties; observation is not advice' clause is a useful framing but sits closer to boilerplate than operational instruction.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only, output-schema-backed tool the essential calling information (required symbol, entitlement gate, denial shape, interpretation caveats) is all present. The description leans on restating return fields that the output schema already carries, but nothing needed to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so every one of the seven parameters is already documented, and the description adds no format, default, or interaction detail for limit, detail, include, or include_withheld. Per the coverage rule, baseline 3 is appropriate; the phrase 'declared horizon' gestures at scope but without tying it to any parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Names a specific verb+resource (forward distribution for one symbol) and enumerates exactly what is returned: direction with three states, three summing probabilities, expected move, and cone. It does not, however, differentiate itself from close siblings such as fahali_get_symbol_decision, fahali_get_market_verdict, or fahali_get_lead_time, so the agent must infer the boundary.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It tells the agent to read evidenceTier and judged-record reliability and warns that caveats name withheld data, which is consumption guidance rather than selection guidance. There is no explicit statement of when to call this instead of the other forecast-like siblings, so usage is only implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fahali_get_highest_conviction_signalsBRead-onlyIdempotent
Audit current risk forecasts and the complete non-binding committee product: membership, dissent, raw evidence, limitations, invalidation, current canonical-roster evidence rows, and runtime telemetry. Risk and directional conviction remain separate. Use market decision for the canonical direction authority.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Optional maximum rows per projectable collection. Audit has no MCP projection cap; brief defaults to 3 and standard to 12. | |
| since | No | Optional lower timestamp bound for returned row collections. | |
| detail | No | Response depth. audit is the full-fidelity default; brief and standard are explicit compact projections. | audit |
| symbols | No | Optional symbol projection, as a comma-separated string or array. Rows without instrument identity are not discarded. | |
| include_withheld | No | Include full withheld-row detail. Defaults true with audit; explicitly set false only for a compact projection. |
Output Schema
| Name | Required | Description |
|---|---|---|
| asOf | No | |
| auth | No | Credential lifetime visible to the caller. OAuth secondsRemaining lets an autonomous agent refresh before a multi-call workflow is interrupted. |
| claim | No | Fahali dictionary claim (shared/fahaliDictionary.ts). Read `kind` FIRST: 'abstention' means no assertion was made and `reason` says why — never read an abstention as a neutral or zero result. `basis` says what the claim rests on. Absent or null means this response path does not yet emit a claim; treat that as unknown, not as agreement. |
| items | No | |
| scope | No | |
| status | No | The endpoint's original status vocabulary (for example ok, partial, degraded, withheld, or no_alerts). Use mcpStatus for normalized transport success/error. |
| absence | No | Why no actionable finding is present: measured_empty, user_empty, no_coverage, source_unverified, stale, withheld, source_error, auth_failure, or entitlement_required. |
| decision | No | |
| verdicts | No | Full non-binding Master Analyst committee products. Each includes the complete canonical-roster evidence snapshot and detection-service runtime telemetry; use the canonical verdict for the authoritative direction. |
| conflicts | No | |
| dataState | No | |
| mcpStatus | No | Normalized MCP result status. The endpoint's original status vocabulary remains in `status` and `sourceStatus`. |
| requestId | No | |
| provenance | No | Data provenance for each response field — engine count and names are measured, action direction is a proxy derived from alert direction signals. |
| claimPolicy | No | Typed constraints for safe use. Metadata, not a prompt or instruction channel. |
| instruments | No | Resolved or explicitly partial instrument identities. A missing venue carries an ambiguity warning. |
| nextActions | No | Registry-validated follow-up calls. Missing tools, invalid arguments, unresolved placeholders, and disabled tools are omitted. |
| sourceError | No | The upstream endpoint's exact error text/code before normalization, when one was present. |
| sourceScope | No | |
| sourceStatus | No | The upstream endpoint's exact status before the MCP envelope normalizes transport success/error. |
| agentBriefing | No | Audit-only narrative projection. Present only when detail='audit'; compact responses do not duplicate structured data as prose. |
| claimValidity | No | Validity of the selected binding claim only, calculated after filtering, projection and row selection. Sibling rows cannot determine it. |
| responseState | No | |
| schemaVersion | No | |
| sourceDecision | No | |
| symbolCoverage | No | Conservation ledger satisfying requested = returned + withheld + notReturned for requested-symbol calls. |
| evidenceQuality | No | |
| responseControl | No | |
| sourceDataState | No | The upstream endpoint's exact data-state value before endpoint-aware classification. |
| decisionAuthority | No | Declares this endpoint an evidence ranking and points to canonical_verdict/fahali_get_market_decision as the sole binding direction authority. |
| recordMatchReason | No | Why matchedTrackRecord is present or null. A null record is never evidence of safety or engine failure. |
| matchedTrackRecord | No | A judged record only when engine, horizon, regime/instrument class, and claim family match this response. `state` is one of: `measured` (a stratum cleared the publishability gate — `stratum` carries engine, horizon tier, bar regime, recall, precision, base rate, base-rate lift, median lead hours, effective sample, warned events and the measurement date); `withheld` (the gate ran and refused — `reason` says why, in words); `unavailable` (the record could not be read at all — an infrastructure failure that says nothing about the record). It is ONE stratum selected by recall, never a platform-wide accuracy. Null means no exact record match; read recordMatchReason. |
| confidenceSemantics | No | Every confidence-bearing value with its score type, scale, calibration status, and probability flag. |
| decisionEligibility | No | Fail-closed binding-authority policy. WITHHELD means source evidence remains available for audit while normalized direction, actionability and execution fields are revoked. |
| directionEligibility | No | Current market-direction eligibility. Direction is authorized only by an exact, eligible producer stratum (canonical_verdict, canonical_symbol_verdict, committee_verdict) — read bindingAuthority to see which one bound. Widening WHO may bind did not weaken WHAT binding requires: the named producer must still hold a matching horizon/class/family record on a verified-only judged population, so an authority without a record still cannot bind. |
| executionEligibility | No | Fail-closed execution boundary. Portfolio monitoring tools always return WITHHELD with MONITOR_ONLY_NO_EXECUTION_AUTHORITY while Fahali has no capital path. |
| guardrailBlockedCount | No | Verdicts blocked by the Guardrail Agent this cycle (blocked verdicts are never served) |
| monitoringEligibility | No | Current portfolio-monitoring validity based on captured identity, freshness, integrity, and the caller-supplied monitoring policy. ELIGIBLE authorizes observation/delivery only, never financial action. |
| sourceEvidenceQuality | No | |
| currentActionEligibility | No | Current eligibility of an immutable historical portfolio verdict. It never mutates the stored judgment being replayed. |
| sourceConfidenceSemantics | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive, and open-world, so the safety profile is covered. The description adds domain-specific behavioral context: the output is a 'non-binding committee product,' includes limitations and invalidation, and keeps risk separate from directional conviction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
It is only three sentences with little filler, but the first sentence is a dense run-on list of jargon-heavy items and is not front-loaded around a clear verb-resource purpose. The routing sentence is useful but comes after the opaque content list.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists and annotations cover safety, so the description need not explain return shape in detail. Still, for a complex tool in a very crowded sibling set, it leaves the core selection question unresolved beyond the market-decision alternative.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and every parameter is documented in-schema, including detail, limit, since, symbols, and include_withheld. The description adds no parameter-level guidance, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific audit surface—current risk forecasts plus a 'non-binding committee product'—and enumerates contents like dissent, raw evidence, limitations, and invalidation. But it never ties this back to the tool name's 'highest conviction signals' or explains what a 'committee product' is, so an agent cannot confidently tell what core resource is being fetched or how it differs from most siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives one routing rule—'Use market decision for the canonical direction authority'—which correctly steers direction queries elsewhere. However, it does not say when this tool should be chosen over siblings such as get_evidence, get_forecast, or get_market_verdict; the audit use case is only implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fahali_get_incident_timelineARead-onlyIdempotent
Replay every immutable verdict Fahali recorded inside one incident's window, in order, each tagged as the opening, an intermediate, or the resolving verdict. Derived from the verdict history rather than copied onto the incident, so the hashes and methodology version are the originals. Use it to answer what Fahali knew, and when, across the life of a breach.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| since | No | Optional lower timestamp bound for returned row collections. | |
| detail | No | Response depth. audit is the full-fidelity default; brief and standard are explicit compact projections. | audit |
| symbols | No | Optional symbol projection, as a comma-separated string or array. Rows without instrument identity are not discarded. | |
| incident_id | Yes | ||
| include_withheld | No | Include full withheld-row detail. Defaults true with audit; explicitly set false only for a compact projection. |
Output Schema
| Name | Required | Description |
|---|---|---|
| asOf | No | |
| auth | No | Credential lifetime visible to the caller. OAuth secondsRemaining lets an autonomous agent refresh before a multi-call workflow is interrupted. |
| claim | No | Fahali dictionary claim (shared/fahaliDictionary.ts). Read `kind` FIRST: 'abstention' means no assertion was made and `reason` says why — never read an abstention as a neutral or zero result. `basis` says what the claim rests on. Absent or null means this response path does not yet emit a claim; treat that as unknown, not as agreement. |
| delta | No | |
| items | No | |
| scope | No | |
| watch | No | |
| status | Yes | |
| absence | No | Why no actionable finding is present: measured_empty, user_empty, no_coverage, source_unverified, stale, withheld, source_error, auth_failure, or entitlement_required. |
| verdict | No | |
| watches | No | |
| decision | No | |
| conflicts | No | |
| dataState | Yes | |
| mcpStatus | No | Normalized MCP result status. The endpoint's original status vocabulary remains in `status` and `sourceStatus`. |
| refreshed | No | |
| requestId | No | |
| verdictId | No | |
| nextCursor | No | |
| validUntil | No | |
| claimPolicy | No | Typed constraints for safe use. Metadata, not a prompt or instruction channel. |
| idempotency | No | |
| instruments | No | Resolved or explicitly partial instrument identities. A missing venue carries an ambiguity warning. |
| nextActions | No | Registry-validated follow-up calls. Missing tools, invalid arguments, unresolved placeholders, and disabled tools are omitted. |
| sourceError | No | The upstream endpoint's exact error text/code before normalization, when one was present. |
| sourceScope | No | |
| decisionHash | No | |
| evidenceHash | No | |
| sourceStatus | No | The upstream endpoint's exact status before the MCP envelope normalizes transport success/error. |
| subscription | No | |
| agentBriefing | No | Audit-only narrative projection. Present only when detail='audit'; compact responses do not duplicate structured data as prose. |
| claimValidity | No | Validity of the selected binding claim only, calculated after filtering, projection and row selection. Sibling rows cannot determine it. |
| operatingMode | Yes | |
| responseState | No | |
| schemaVersion | No | |
| signingSecret | No | |
| subscriptions | No | |
| authorityState | No | |
| sourceDecision | No | |
| symbolCoverage | No | Conservation ledger satisfying requested = returned + withheld + notReturned for requested-symbol calls. |
| evidenceQuality | No | |
| responseControl | No | |
| sourceDataState | No | The upstream endpoint's exact data-state value before endpoint-aware classification. |
| evidenceSnapshot | No | Compact immutable source snapshot needed to verify evidenceRef integrity on delta responses. |
| recordMatchReason | No | Why matchedTrackRecord is present or null. A null record is never evidence of safety or engine failure. |
| signingSecretNote | No | |
| matchedTrackRecord | No | A judged record only when engine, horizon, regime/instrument class, and claim family match this response. `state` is one of: `measured` (a stratum cleared the publishability gate — `stratum` carries engine, horizon tier, bar regime, recall, precision, base rate, base-rate lift, median lead hours, effective sample, warned events and the measurement date); `withheld` (the gate ran and refused — `reason` says why, in words); `unavailable` (the record could not be read at all — an infrastructure failure that says nothing about the record). It is ONE stratum selected by recall, never a platform-wide accuracy. Null means no exact record match; read recordMatchReason. |
| methodologyVersion | No | |
| confidenceSemantics | No | Every confidence-bearing value with its score type, scale, calibration status, and probability flag. |
| decisionEligibility | No | Fail-closed binding-authority policy. WITHHELD means source evidence remains available for audit while normalized direction, actionability and execution fields are revoked. |
| directionEligibility | No | Current market-direction eligibility. Direction is authorized only by an exact, eligible producer stratum (canonical_verdict, canonical_symbol_verdict, committee_verdict) — read bindingAuthority to see which one bound. Widening WHO may bind did not weaken WHAT binding requires: the named producer must still hold a matching horizon/class/family record on a verified-only judged population, so an authority without a record still cannot bind. |
| executionEligibility | No | Fail-closed execution boundary. Portfolio monitoring tools always return WITHHELD with MONITOR_ONLY_NO_EXECUTION_AUTHORITY while Fahali has no capital path. |
| legacyFieldSemantics | Yes | |
| outputClassification | Yes | |
| monitoringEligibility | No | Current portfolio-monitoring validity based on captured identity, freshness, integrity, and the caller-supplied monitoring policy. ELIGIBLE authorizes observation/delivery only, never financial action. |
| sourceEvidenceQuality | No | |
| currentActionEligibility | No | Current eligibility of an immutable historical portfolio verdict. It never mutates the stored judgment being replayed. |
| sourceConfidenceSemantics | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, so the bar is lower, and the description still adds real value: results are derived from the verdict history rather than copied, preserving original hashes and methodology version, and rows are ordered and tagged by verdict stage. It omits practical behavior such as the limit ceiling or the default inclusion of withheld rows.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with the core action, and each sentence carries distinct information (purpose, provenance, use case). Slightly dense branding ('immutable verdict', 'Fahali recorded') adds a little weight without harm.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists and read-only annotations cover the safety profile, so return values and risk need not be restated. What remains thin is guidance on narrowing a long timeline via since/limit and the detail projections, plus when not to use this tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is only 67% (incident_id and limit carry no description), and the description mentions none of the six parameters — not the since lower bound, the brief/standard/audit detail projections, the symbols filter, or include_withheld. An agent must infer all of that from the schema alone.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (replay) and resource (immutable verdicts inside one incident's window), plus the ordering and the opening/intermediate/resolving tagging — far more precise than a bare 'get timeline'. It implicitly separates itself from generic siblings like fahali_get_verdict_history by scoping to a single incident, but never names an alternative outright.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The closing line gives a clear use case: 'answer what Fahali knew, and when, across the life of a breach.' That sets context well, but there are no exclusions (e.g. when to prefer fahali_get_verdict_history, fahali_get_active_incidents, or fahali_get_evidence instead).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fahali_get_lead_timeARead-onlyIdempotent
Verified warning time by exact engine, horizon, regime, and claim family, with recall, precision, base rate, and effective sample. Use headline for a single summary and quote its stratum. Never select a flattering row yourself; null headline means report headlineWithheldReason.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Optional maximum rows per projectable collection. Audit has no MCP projection cap; brief defaults to 3 and standard to 12. | |
| since | No | Optional lower timestamp bound for returned row collections. | |
| detail | No | Response depth. audit is the full-fidelity default; brief and standard are explicit compact projections. | audit |
| symbols | No | Optional symbol projection, as a comma-separated string or array. Rows without instrument identity are not discarded. | |
| include_withheld | No | Include full withheld-row detail. Defaults true with audit; explicitly set false only for a compact projection. |
Output Schema
| Name | Required | Description |
|---|---|---|
| asOf | No | |
| auth | No | Credential lifetime visible to the caller. OAuth secondsRemaining lets an autonomous agent refresh before a multi-call workflow is interrupted. |
| claim | No | Fahali dictionary claim (shared/fahaliDictionary.ts). Read `kind` FIRST: 'abstention' means no assertion was made and `reason` says why — never read an abstention as a neutral or zero result. `basis` says what the claim rests on. Absent or null means this response path does not yet emit a claim; treat that as unknown, not as agreement. |
| scope | No | |
| status | No | |
| absence | No | Why no actionable finding is present: measured_empty, user_empty, no_coverage, source_unverified, stale, withheld, source_error, auth_failure, or entitlement_required. |
| decision | No | |
| headline | No | The one stratum Fahali stands behind, chosen server-side by recall among strata that clear the publishability gate with positive base-rate lift, collapsed to each stratum's most recent measurement day. Null when nothing qualifies — read headlineWithheldReason, never substitute another row. |
| claimTier | No | |
| conflicts | No | |
| dataState | No | |
| mcpStatus | No | Normalized MCP result status. The endpoint's original status vocabulary remains in `status` and `sourceStatus`. |
| requestId | No | |
| dataOrigin | No | |
| provenance | No | |
| snapshotId | No | |
| claimPolicy | No | Typed constraints for safe use. Metadata, not a prompt or instruction channel. |
| instruments | No | Resolved or explicitly partial instrument identities. A missing venue carries an ambiguity warning. |
| nextActions | No | Registry-validated follow-up calls. Missing tools, invalid arguments, unresolved placeholders, and disabled tools are omitted. |
| sourceError | No | The upstream endpoint's exact error text/code before normalization, when one was present. |
| sourceScope | No | |
| trackRecord | No | |
| sourceStatus | No | The upstream endpoint's exact status before the MCP envelope normalizes transport success/error. |
| agentBriefing | No | Audit-only narrative projection. Present only when detail='audit'; compact responses do not duplicate structured data as prose. |
| claimValidity | No | Validity of the selected binding claim only, calculated after filtering, projection and row selection. Sibling rows cannot determine it. |
| responseState | No | |
| schemaVersion | No | |
| sourceDecision | No | |
| symbolCoverage | No | Conservation ledger satisfying requested = returned + withheld + notReturned for requested-symbol calls. |
| evidenceQuality | No | |
| responseControl | No | |
| sourceDataState | No | The upstream endpoint's exact data-state value before endpoint-aware classification. |
| abstentionReason | No | |
| calculationStatus | No | How this snapshot was produced. A 'stale_' prefix means the data is past its freshness window (see staleAfterHours/dataAgeHours) — treat it as dated, not as absent. 'no_pool' and 'error' mean nothing was measured; never read either as a zero result. |
| headlineSelection | No | The selection rule in force, so the choice is auditable rather than implicit. |
| recordMatchReason | No | Why matchedTrackRecord is present or null. A null record is never evidence of safety or engine failure. |
| matchedTrackRecord | No | A judged record only when engine, horizon, regime/instrument class, and claim family match this response. `state` is one of: `measured` (a stratum cleared the publishability gate — `stratum` carries engine, horizon tier, bar regime, recall, precision, base rate, base-rate lift, median lead hours, effective sample, warned events and the measurement date); `withheld` (the gate ran and refused — `reason` says why, in words); `unavailable` (the record could not be read at all — an infrastructure failure that says nothing about the record). It is ONE stratum selected by recall, never a platform-wide accuracy. Null means no exact record match; read recordMatchReason. |
| confidenceSemantics | No | Every confidence-bearing value with its score type, scale, calibration status, and probability flag. |
| decisionEligibility | No | Fail-closed binding-authority policy. WITHHELD means source evidence remains available for audit while normalized direction, actionability and execution fields are revoked. |
| directionEligibility | No | Current market-direction eligibility. Direction is authorized only by an exact, eligible producer stratum (canonical_verdict, canonical_symbol_verdict, committee_verdict) — read bindingAuthority to see which one bound. Widening WHO may bind did not weaken WHAT binding requires: the named producer must still hold a matching horizon/class/family record on a verified-only judged population, so an authority without a record still cannot bind. |
| executionEligibility | No | Fail-closed execution boundary. Portfolio monitoring tools always return WITHHELD with MONITOR_ONLY_NO_EXECUTION_AUTHORITY while Fahali has no capital path. |
| trackRecordCollapsed | No | Collapse disclosure: one row per (engine · horizon_tier · bar_regime), most recent day. `returned` rows shown out of `collapsedFrom` daily re-publications — repeats of the same strata, not independent observations. |
| monitoringEligibility | No | Current portfolio-monitoring validity based on captured identity, freshness, integrity, and the caller-supplied monitoring policy. ELIGIBLE authorizes observation/delivery only, never financial action. |
| sourceEvidenceQuality | No | |
| headlineWithheldReason | No | Why no headline was chosen. Present exactly when headline is null. Report it verbatim — a withheld claim is not the same as an absent one. |
| instrumentClassCoverage | No | Per-instrument-class coverage (crypto/equity/…). measuredButWithheld means the stratum was measured and did not clear the gate — a disclosed limitation, never an all-clear. No equity stratum is published; read the block, not the headline, for what IS measured per class. |
| currentActionEligibility | No | Current eligibility of an immutable historical portfolio verdict. It never mutates the stored judgment being replayed. |
| sourceConfidenceSemantics | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and non-destructive behavior. The description adds important integrity context beyond annotations: a null headline must be reported via headlineWithheldReason, and the agent must not select a flattering row. It does not cover auth, rate limits, or pagination, but the withheld-headline guardrail is substantive.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three compact sentences, front-loaded with what the tool returns and followed by usage and integrity guidance. No filler is present, and every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given an output schema, rich annotations, and full parameter schema coverage, the description supplies the purpose plus the critical withheld-headline handling rule. It is complete enough for correct invocation, though it leaves terms like 'verified' and the exact stratum definitions implicit.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with each of the five optional parameters documented in the schema. The description adds no parameter-level meaning or defaults, so the schema fully carries parameter semantics; baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific resource and scope: retrieves 'verified warning time' broken down by engine, horizon, regime, and claim family, with associated metrics. It is clearly a lead-time statistics tool, but it does not name or explicitly distinguish itself from any sibling tool, leaving that inference to the agent.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides output-consumption guidance ('Use headline for a single summary and quote its stratum') and forbids cherry-picking rows, but does not state when to call this tool instead of alternatives such as fahali_get_track_record_scorecard or fahali_get_market_verdict. Selection guidance is only implied by the resource name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fahali_get_market_briefingARead-onlyIdempotent
Current market briefing compressed from measured risk, regime, conviction, and active detections. Use for orientation, not as a substitute for a per-symbol decision. Partial, withheld, stale, and no-coverage states remain explicit.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Optional maximum rows per projectable collection. Audit has no MCP projection cap; brief defaults to 3 and standard to 12. | |
| since | No | Optional lower timestamp bound for returned row collections. | |
| detail | No | Response depth. audit is the full-fidelity default; brief and standard are explicit compact projections. | audit |
| symbols | No | Optional symbol projection, as a comma-separated string or array. Rows without instrument identity are not discarded. | |
| include_withheld | No | Include full withheld-row detail. Defaults true with audit; explicitly set false only for a compact projection. |
Output Schema
| Name | Required | Description |
|---|---|---|
| asOf | No | |
| auth | No | Credential lifetime visible to the caller. OAuth secondsRemaining lets an autonomous agent refresh before a multi-call workflow is interrupted. |
| claim | No | Fahali dictionary claim (shared/fahaliDictionary.ts). Read `kind` FIRST: 'abstention' means no assertion was made and `reason` says why — never read an abstention as a neutral or zero result. `basis` says what the claim rests on. Absent or null means this response path does not yet emit a claim; treat that as unknown, not as agreement. |
| scope | No | |
| regime | No | |
| status | No | |
| absence | No | Why no actionable finding is present: measured_empty, user_empty, no_coverage, source_unverified, stale, withheld, source_error, auth_failure, or entitlement_required. |
| outlook | No | |
| decision | No | |
| withheld | No | |
| conflicts | No | |
| dataState | No | |
| mcpStatus | No | Normalized MCP result status. The endpoint's original status vocabulary remains in `status` and `sourceStatus`. |
| requestId | No | |
| riskLevel | No | |
| disclaimer | No | |
| claimPolicy | No | Typed constraints for safe use. Metadata, not a prompt or instruction channel. |
| instruments | No | Resolved or explicitly partial instrument identities. A missing venue carries an ambiguity warning. |
| nextActions | No | Registry-validated follow-up calls. Missing tools, invalid arguments, unresolved placeholders, and disabled tools are omitted. |
| regimeState | No | |
| sourceError | No | The upstream endpoint's exact error text/code before normalization, when one was present. |
| sourceScope | No | |
| sourceStatus | No | The upstream endpoint's exact status before the MCP envelope normalizes transport success/error. |
| agentBriefing | No | Audit-only narrative projection. Present only when detail='audit'; compact responses do not duplicate structured data as prose. |
| claimValidity | No | Validity of the selected binding claim only, calculated after filtering, projection and row selection. Sibling rows cannot determine it. |
| responseState | No | |
| schemaVersion | No | |
| sourceDecision | No | |
| symbolCoverage | No | Conservation ledger satisfying requested = returned + withheld + notReturned for requested-symbol calls. |
| evidenceQuality | No | |
| marketRiskScore | No | |
| regimeFreshness | No | |
| responseControl | No | |
| sourceDataState | No | The upstream endpoint's exact data-state value before endpoint-aware classification. |
| withheldReasons | No | |
| topOpportunities | No | |
| detectionActivity | No | |
| recordMatchReason | No | Why matchedTrackRecord is present or null. A null record is never evidence of safety or engine failure. |
| matchedTrackRecord | No | A judged record only when engine, horizon, regime/instrument class, and claim family match this response. `state` is one of: `measured` (a stratum cleared the publishability gate — `stratum` carries engine, horizon tier, bar regime, recall, precision, base rate, base-rate lift, median lead hours, effective sample, warned events and the measurement date); `withheld` (the gate ran and refused — `reason` says why, in words); `unavailable` (the record could not be read at all — an infrastructure failure that says nothing about the record). It is ONE stratum selected by recall, never a platform-wide accuracy. Null means no exact record match; read recordMatchReason. |
| confidenceSemantics | No | Every confidence-bearing value with its score type, scale, calibration status, and probability flag. |
| contributingEngines | No | |
| decisionEligibility | No | Fail-closed binding-authority policy. WITHHELD means source evidence remains available for audit while normalized direction, actionability and execution fields are revoked. |
| marketWideCrashRisk | No | |
| directionEligibility | No | Current market-direction eligibility. Direction is authorized only by an exact, eligible producer stratum (canonical_verdict, canonical_symbol_verdict, committee_verdict) — read bindingAuthority to see which one bound. Widening WHO may bind did not weaken WHAT binding requires: the named producer must still hold a matching horizon/class/family record on a verified-only judged population, so an authority without a record still cannot bind. |
| executionEligibility | No | Fail-closed execution boundary. Portfolio monitoring tools always return WITHHELD with MONITOR_ONLY_NO_EXECUTION_AUTHORITY while Fahali has no capital path. |
| monitoringEligibility | No | Current portfolio-monitoring validity based on captured identity, freshness, integrity, and the caller-supplied monitoring policy. ELIGIBLE authorizes observation/delivery only, never financial action. |
| sourceEvidenceQuality | No | |
| currentActionEligibility | No | Current eligibility of an immutable historical portfolio verdict. It never mutates the stored judgment being replayed. |
| sourceConfidenceSemantics | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover safety (readOnly, idempotent, non-destructive), so the bar is lower, and the description still adds genuine behavioral value by stating that partial, withheld, stale, and no-coverage states remain explicit. That tells the agent to expect and interpret incomplete data rather than assuming completeness.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences with the core purpose front-loaded and the usage caveat following. No filler, though a slightly sharper differentiation from sibling aggregates could be folded in without bloat.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return-value explanation is not required, and annotations plus the data-quality sentence cover behavior. The remaining gap is routing guidance among the many aggregate siblings, but nothing essential for invoking the tool is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents limit, since, detail, symbols, and include_withheld thoroughly. The description adds no parameter-level meaning beyond the schema, warranting the baseline 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific resource (market briefing) and what it is synthesized from (risk, regime, conviction, detections), which tells the agent it is an aggregate orientation view. It distinguishes itself from per-symbol decision tools but does not clarify how it differs from nearby siblings like fahali_daily_brief or fahali_get_market_snapshot.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
"Use for orientation, not as a substitute for a per-symbol decision" gives clear when-to-use and a when-not-to-use pointing at the per-symbol decision path. It stops short of naming sibling tools or explaining how to choose between briefing, snapshot, and daily_brief.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fahali_get_market_decisionARead-onlyIdempotent
Primary market judgment entry point and thin alias over the canonical arbiter. Returns its authoritative direction plus forecast, record, invalidation, complete non-binding committee evidence, current canonical-roster engine rows, and runtime telemetry. It performs no second computation. A market-wide call promotes one row; read decisionSelection.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Optional maximum rows per projectable collection. Audit has no MCP projection cap; brief defaults to 3 and standard to 12. | |
| since | No | Optional lower timestamp bound for returned row collections. | |
| detail | No | Response depth. audit is the full-fidelity default; brief and standard are explicit compact projections. | audit |
| symbols | No | Optional comma-separated symbols or symbol array. Omit for Fahali's current market-wide priorities. | |
| includeContagion | No | Include downside co-movement context when the caller is entitled to it. | |
| include_withheld | No | Include full withheld-row detail. Defaults true with audit; explicitly set false only for a compact projection. |
Output Schema
| Name | Required | Description |
|---|---|---|
| asOf | No | |
| auth | No | Credential lifetime visible to the caller. OAuth secondsRemaining lets an autonomous agent refresh before a multi-call workflow is interrupted. |
| data | No | |
| claim | No | Fahali dictionary claim (shared/fahaliDictionary.ts). Read `kind` FIRST: 'abstention' means no assertion was made and `reason` says why — never read an abstention as a neutral or zero result. `basis` says what the claim rests on. Absent or null means this response path does not yet emit a claim; treat that as unknown, not as agreement. |
| count | No | |
| scope | No | |
| status | No | The endpoint's original status vocabulary (for example ok, partial, degraded, withheld, or no_alerts). Use mcpStatus for normalized transport success/error. |
| absence | No | Why no actionable finding is present: measured_empty, user_empty, no_coverage, source_unverified, stale, withheld, source_error, auth_failure, or entitlement_required. |
| decision | No | |
| conflicts | No | |
| dataState | No | |
| mcpStatus | No | Normalized MCP result status. The endpoint's original status vocabulary remains in `status` and `sourceStatus`. |
| requestId | No | |
| updatedAt | No | |
| claimPolicy | No | Typed constraints for safe use. Metadata, not a prompt or instruction channel. |
| instruments | No | Resolved or explicitly partial instrument identities. A missing venue carries an ambiguity warning. |
| nextActions | No | Registry-validated follow-up calls. Missing tools, invalid arguments, unresolved placeholders, and disabled tools are omitted. |
| notReturned | No | Every requested symbol without a judged verdict row. Fresh/stale runtime telemetry remains attached when available; no engine evidence is promoted into a binding direction. |
| sourceError | No | The upstream endpoint's exact error text/code before normalization, when one was present. |
| sourceScope | No | |
| sourceStatus | No | The upstream endpoint's exact status before the MCP envelope normalizes transport success/error. |
| agentBriefing | No | Audit-only narrative projection. Present only when detail='audit'; compact responses do not duplicate structured data as prose. |
| claimValidity | No | Validity of the selected binding claim only, calculated after filtering, projection and row selection. Sibling rows cannot determine it. |
| responseState | No | |
| schemaVersion | No | |
| provenanceRoot | No | SHA-256 over the per-item integrity hashes. Verifies this response wasn't altered after receipt (recompute to check). NOT a cryptographic attestation — key-signed receipts are on the roadmap. |
| sourceDecision | No | |
| symbolCoverage | No | Conservation ledger satisfying requested = returned + withheld + notReturned for requested-symbol calls. |
| evidenceQuality | No | |
| responseControl | No | |
| sourceDataState | No | The upstream endpoint's exact data-state value before endpoint-aware classification. |
| recordMatchReason | No | Why matchedTrackRecord is present or null. A null record is never evidence of safety or engine failure. |
| requestedCoverage | No | |
| matchedTrackRecord | No | A judged record only when engine, horizon, regime/instrument class, and claim family match this response. `state` is one of: `measured` (a stratum cleared the publishability gate — `stratum` carries engine, horizon tier, bar regime, recall, precision, base rate, base-rate lift, median lead hours, effective sample, warned events and the measurement date); `withheld` (the gate ran and refused — `reason` says why, in words); `unavailable` (the record could not be read at all — an infrastructure failure that says nothing about the record). It is ONE stratum selected by recall, never a platform-wide accuracy. Null means no exact record match; read recordMatchReason. |
| confidenceSemantics | No | Every confidence-bearing value with its score type, scale, calibration status, and probability flag. |
| decisionEligibility | No | Fail-closed binding-authority policy. WITHHELD means source evidence remains available for audit while normalized direction, actionability and execution fields are revoked. |
| directionEligibility | No | Current market-direction eligibility. Direction is authorized only by an exact, eligible producer stratum (canonical_verdict, canonical_symbol_verdict, committee_verdict) — read bindingAuthority to see which one bound. Widening WHO may bind did not weaken WHAT binding requires: the named producer must still hold a matching horizon/class/family record on a verified-only judged population, so an authority without a record still cannot bind. |
| executionEligibility | No | Fail-closed execution boundary. Portfolio monitoring tools always return WITHHELD with MONITOR_ONLY_NO_EXECUTION_AUTHORITY while Fahali has no capital path. |
| monitoringEligibility | No | Current portfolio-monitoring validity based on captured identity, freshness, integrity, and the caller-supplied monitoring policy. ELIGIBLE authorizes observation/delivery only, never financial action. |
| sourceEvidenceQuality | No | |
| currentActionEligibility | No | Current eligibility of an immutable historical portfolio verdict. It never mutates the stored judgment being replayed. |
| sourceConfidenceSemantics | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only, idempotent, non-destructive, open-world behavior, so the description need not cover safety. It does add useful context beyond annotations: it is a thin alias, performs no second computation, returns non-binding committee evidence as part of the output, and a market-wide call 'promotes one row' with decisionSelection to read. That is meaningful behavior disclosure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences and front-loads the primary purpose before listing output contents and the alias/no-recomputation caveat. It is dense but not padded; the main cost is jargon that reduces immediate clarity rather than verbosity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema and complete parameter descriptions, the description gives enough context: entry-point role, alias behavior, returned artifacts, and the decisionSelection pointer. Minor gaps remain around what 'decisionSelection' contains and how this differs from related sibling tools, but the core call context is complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already defines limit, since, detail, symbols, includeContagion, and include_withheld. The description adds no parameter-level syntax or semantics beyond schema content, which matches the baseline 3 when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states that this is the primary market judgment entry point and a thin alias over the canonical arbiter, and lists what it returns (direction, forecast, record, invalidation, evidence, engine rows, telemetry). That is a clear verb/resource purpose, though the jargon ('canonical arbiter', 'decisionSelection') and lack of explicit distinction from siblings like fahali_get_market_verdict keep it below 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'Primary market judgment entry point' implies when to use it, but the description names no alternatives or exclusions despite many sibling tools covering verdicts, symbols, forecasts, and risk. An agent must infer that this is the default market-wide call rather than being told directly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fahali_get_market_moodARead-onlyIdempotent
How fearful or greedy prices are, scored 0-100 separately for US stocks and crypto. Each measured price fact (trend vs 50-day average, breadth, volatility, safe-haven and junk-bond demand, alt appetite) is ranked against its own past; read ranked beside any percentile. Unreadable measures are null with a reason, never a neutral 50. A description, not a forecast or a grade. Observation, not advice.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Optional maximum rows per projectable collection. Audit has no MCP projection cap; brief defaults to 3 and standard to 12. | |
| since | No | Optional lower timestamp bound for returned row collections. | |
| detail | No | Response depth. audit is the full-fidelity default; brief and standard are explicit compact projections. | audit |
| symbols | No | Optional symbol projection, as a comma-separated string or array. Rows without instrument identity are not discarded. | |
| include_withheld | No | Include full withheld-row detail. Defaults true with audit; explicitly set false only for a compact projection. |
Output Schema
| Name | Required | Description |
|---|---|---|
| asOf | No | |
| auth | No | Credential lifetime visible to the caller. OAuth secondsRemaining lets an autonomous agent refresh before a multi-call workflow is interrupted. |
| kind | No | |
| claim | No | Fahali dictionary claim (shared/fahaliDictionary.ts). Read `kind` FIRST: 'abstention' means no assertion was made and `reason` says why — never read an abstention as a neutral or zero result. `basis` says what the claim rests on. Absent or null means this response path does not yet emit a claim; treat that as unknown, not as agreement. |
| scope | No | |
| crypto | No | |
| equity | No | |
| method | No | |
| status | No | The endpoint's original status vocabulary (for example ok, partial, degraded, withheld, or no_alerts). Use mcpStatus for normalized transport success/error. |
| absence | No | Why no actionable finding is present: measured_empty, user_empty, no_coverage, source_unverified, stale, withheld, source_error, auth_failure, or entitlement_required. |
| decision | No | |
| conflicts | No | |
| dataState | No | |
| mcpStatus | No | Normalized MCP result status. The endpoint's original status vocabulary remains in `status` and `sourceStatus`. |
| requestId | No | |
| calibrated | No | |
| isForecast | No | |
| claimPolicy | No | Typed constraints for safe use. Metadata, not a prompt or instruction channel. |
| generatedAt | No | |
| instruments | No | Resolved or explicitly partial instrument identities. A missing venue carries an ambiguity warning. |
| nextActions | No | Registry-validated follow-up calls. Missing tools, invalid arguments, unresolved placeholders, and disabled tools are omitted. |
| sourceError | No | The upstream endpoint's exact error text/code before normalization, when one was present. |
| sourceScope | No | |
| sourceStatus | No | The upstream endpoint's exact status before the MCP envelope normalizes transport success/error. |
| agentBriefing | No | Audit-only narrative projection. Present only when detail='audit'; compact responses do not duplicate structured data as prose. |
| claimValidity | No | Validity of the selected binding claim only, calculated after filtering, projection and row selection. Sibling rows cannot determine it. |
| responseState | No | |
| schemaVersion | No | |
| sourceDecision | No | |
| symbolCoverage | No | Conservation ledger satisfying requested = returned + withheld + notReturned for requested-symbol calls. |
| evidenceQuality | No | |
| responseControl | No | |
| sourceDataState | No | The upstream endpoint's exact data-state value before endpoint-aware classification. |
| recordMatchReason | No | Why matchedTrackRecord is present or null. A null record is never evidence of safety or engine failure. |
| matchedTrackRecord | No | A judged record only when engine, horizon, regime/instrument class, and claim family match this response. `state` is one of: `measured` (a stratum cleared the publishability gate — `stratum` carries engine, horizon tier, bar regime, recall, precision, base rate, base-rate lift, median lead hours, effective sample, warned events and the measurement date); `withheld` (the gate ran and refused — `reason` says why, in words); `unavailable` (the record could not be read at all — an infrastructure failure that says nothing about the record). It is ONE stratum selected by recall, never a platform-wide accuracy. Null means no exact record match; read recordMatchReason. |
| confidenceSemantics | No | Every confidence-bearing value with its score type, scale, calibration status, and probability flag. |
| decisionEligibility | No | Fail-closed binding-authority policy. WITHHELD means source evidence remains available for audit while normalized direction, actionability and execution fields are revoked. |
| directionEligibility | No | Current market-direction eligibility. Direction is authorized only by an exact, eligible producer stratum (canonical_verdict, canonical_symbol_verdict, committee_verdict) — read bindingAuthority to see which one bound. Widening WHO may bind did not weaken WHAT binding requires: the named producer must still hold a matching horizon/class/family record on a verified-only judged population, so an authority without a record still cannot bind. |
| executionEligibility | No | Fail-closed execution boundary. Portfolio monitoring tools always return WITHHELD with MONITOR_ONLY_NO_EXECUTION_AUTHORITY while Fahali has no capital path. |
| monitoringEligibility | No | Current portfolio-monitoring validity based on captured identity, freshness, integrity, and the caller-supplied monitoring policy. ELIGIBLE authorizes observation/delivery only, never financial action. |
| sourceEvidenceQuality | No | |
| currentActionEligibility | No | Current eligibility of an immutable historical portfolio verdict. It never mutates the stored judgment being replayed. |
| sourceConfidenceSemantics | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive), so the bar is lower, and the description still adds real behavioral detail: unreadable measures return null with a reason rather than a fabricated neutral 50, and each fact is ranked against its own history. It does not discuss the response envelope or pagination, which keeps it below a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core definition is front-loaded in the first sentence, and the ranking/null semantics follow logically. The closing pair 'A description, not a forecast or a grade. Observation, not advice.' is somewhat redundant with itself, costing a little density but still serving as a disambiguation guard.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return shape needn't be described, and the description still covers the one thing an agent could misread — that nulls mean unreadable, not neutral — plus the `ranked` companion field. What's missing is guidance on how detail/limit interact with the response, though the schema already covers that.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so limit, since, detail, symbols, and include_withheld are already fully documented in the schema. The description mentions the `ranked` output field but says nothing about any of the five input parameters, so it adds no parameter-level meaning. Baseline 3 is correct.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening clause states a specific resource (fear/greed score, 0-100) with scope (US stocks and crypto separately) and even lists the underlying measures. It implicitly differentiates from siblings via 'not a forecast or a grade,' which contrasts with fahali_get_forecast and fahali_get_market_verdict, but never names an alternative outright.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'A description, not a forecast or a grade. Observation, not advice.' implies the tool is for descriptive sentiment context rather than predictive calls, but there is no explicit when-to-use statement, no prerequisites, and no named sibling to route to. The agent must infer the selection rule.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fahali_get_market_regimeARead-onlyIdempotent
One market-wide regime reading: bullish, bearish, neutral_range_bound or high_volatility, with volatility, trend strength and window return. This endpoint is market-wide only and a symbol filter cannot narrow it; per-symbol regime exists via fahali_get_realtime_alerts(alert_types: 'regime_state'). The direction word the producer emits is withheld with its reason; read trendStrength. Empty array when nothing is persisted. Observation, not advice.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Optional maximum rows per projectable collection. Audit has no MCP projection cap; brief defaults to 3 and standard to 12. | |
| since | No | Optional lower timestamp bound for returned row collections. | |
| detail | No | Response depth. audit is the full-fidelity default; brief and standard are explicit compact projections. | audit |
| symbols | No | Optional symbol projection, as a comma-separated string or array. Rows without instrument identity are not discarded. | |
| include_withheld | No | Include full withheld-row detail. Defaults true with audit; explicitly set false only for a compact projection. |
Output Schema
| Name | Required | Description |
|---|---|---|
| asOf | No | |
| auth | No | Credential lifetime visible to the caller. OAuth secondsRemaining lets an autonomous agent refresh before a multi-call workflow is interrupted. |
| claim | No | Fahali dictionary claim (shared/fahaliDictionary.ts). Read `kind` FIRST: 'abstention' means no assertion was made and `reason` says why — never read an abstention as a neutral or zero result. `basis` says what the claim rests on. Absent or null means this response path does not yet emit a claim; treat that as unknown, not as agreement. |
| count | No | |
| scope | No | |
| status | No | The endpoint's original status vocabulary (for example ok, partial, degraded, withheld, or no_alerts). Use mcpStatus for normalized transport success/error. |
| absence | No | Why no actionable finding is present: measured_empty, user_empty, no_coverage, source_unverified, stale, withheld, source_error, auth_failure, or entitlement_required. |
| regimes | No | |
| decision | No | |
| conflicts | No | |
| dataState | No | |
| mcpStatus | No | Normalized MCP result status. The endpoint's original status vocabulary remains in `status` and `sourceStatus`. |
| requestId | No | |
| timestamp | No | Observation timestamp. Current API responses use ISO-8601; integer epoch values remain accepted for compatibility with older persisted rows. |
| claimPolicy | No | Typed constraints for safe use. Metadata, not a prompt or instruction channel. |
| instruments | No | Resolved or explicitly partial instrument identities. A missing venue carries an ambiguity warning. |
| nextActions | No | Registry-validated follow-up calls. Missing tools, invalid arguments, unresolved placeholders, and disabled tools are omitted. |
| sourceError | No | The upstream endpoint's exact error text/code before normalization, when one was present. |
| sourceScope | No | |
| sourceStatus | No | The upstream endpoint's exact status before the MCP envelope normalizes transport success/error. |
| agentBriefing | No | Audit-only narrative projection. Present only when detail='audit'; compact responses do not duplicate structured data as prose. |
| claimValidity | No | Validity of the selected binding claim only, calculated after filtering, projection and row selection. Sibling rows cannot determine it. |
| responseState | No | |
| schemaVersion | No | |
| sourceDecision | No | |
| symbolCoverage | No | Conservation ledger satisfying requested = returned + withheld + notReturned for requested-symbol calls. |
| evidenceQuality | No | |
| responseControl | No | |
| sourceDataState | No | The upstream endpoint's exact data-state value before endpoint-aware classification. |
| recordMatchReason | No | Why matchedTrackRecord is present or null. A null record is never evidence of safety or engine failure. |
| matchedTrackRecord | No | A judged record only when engine, horizon, regime/instrument class, and claim family match this response. `state` is one of: `measured` (a stratum cleared the publishability gate — `stratum` carries engine, horizon tier, bar regime, recall, precision, base rate, base-rate lift, median lead hours, effective sample, warned events and the measurement date); `withheld` (the gate ran and refused — `reason` says why, in words); `unavailable` (the record could not be read at all — an infrastructure failure that says nothing about the record). It is ONE stratum selected by recall, never a platform-wide accuracy. Null means no exact record match; read recordMatchReason. |
| confidenceSemantics | No | Every confidence-bearing value with its score type, scale, calibration status, and probability flag. |
| decisionEligibility | No | Fail-closed binding-authority policy. WITHHELD means source evidence remains available for audit while normalized direction, actionability and execution fields are revoked. |
| directionEligibility | No | Current market-direction eligibility. Direction is authorized only by an exact, eligible producer stratum (canonical_verdict, canonical_symbol_verdict, committee_verdict) — read bindingAuthority to see which one bound. Widening WHO may bind did not weaken WHAT binding requires: the named producer must still hold a matching horizon/class/family record on a verified-only judged population, so an authority without a record still cannot bind. |
| executionEligibility | No | Fail-closed execution boundary. Portfolio monitoring tools always return WITHHELD with MONITOR_ONLY_NO_EXECUTION_AUTHORITY while Fahali has no capital path. |
| monitoringEligibility | No | Current portfolio-monitoring validity based on captured identity, freshness, integrity, and the caller-supplied monitoring policy. ELIGIBLE authorizes observation/delivery only, never financial action. |
| sourceEvidenceQuality | No | |
| currentActionEligibility | No | Current eligibility of an immutable historical portfolio verdict. It never mutates the stored judgment being replayed. |
| sourceConfidenceSemantics | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, openWorld and non-destructive, so the safety profile is covered. The description adds genuinely new behavioral detail: the direction word is withheld along with its reason, the return is an empty array when nothing is persisted, and the output is framed as observation rather than advice — all things no annotation conveys.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core definition and the scope constraint, and every sentence carries information. It is dense to the point of terseness in places — 'the direction word the producer emits is withheld with its reason' takes a second read — but there is no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return-value shapes need not be spelled out, and the description still covers the empty-array edge case and field-selection guidance. For a zero-required-parameter read tool with full annotation and schema coverage, this is close to complete; only the relationship to adjacent market-level endpoints is left implicit.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, which sets a baseline of 3. The description earns more by explicitly warning that a symbol filter cannot narrow this endpoint, resolving a real ambiguity created by the presence of a `symbols` parameter in the schema, and by pointing the reader to trendStrength when the direction word is withheld.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific resource (one market-wide regime reading) and enumerates the possible regime values plus the accompanying metrics (volatility, trend strength, window return). It explicitly carves out the scope — 'market-wide only' — and names the sibling that handles the per-symbol case, so an agent can separate it from fahali_get_realtime_alerts without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear use context (market-wide regime, cannot be narrowed by symbol) and routes per-symbol regime requests to fahali_get_realtime_alerts with the exact alert_types value. It does not, however, distinguish this from other market-level siblings such as fahali_get_market_verdict or fahali_get_market_mood, which an agent could plausibly confuse it with.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fahali_get_market_risk_scoreARead-onlyIdempotent
Global 0-100 market-risk context from the canonical 24-hour detection snapshot. It is not institution identity, participant positioning, or portfolio-specific risk. Read coverage and snapshot identity with the score.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Optional maximum rows per projectable collection. Audit has no MCP projection cap; brief defaults to 3 and standard to 12. | |
| since | No | Optional lower timestamp bound for returned row collections. | |
| detail | No | Response depth. audit is the full-fidelity default; brief and standard are explicit compact projections. | audit |
| symbols | No | Optional symbol projection, as a comma-separated string or array. Rows without instrument identity are not discarded. | |
| include_withheld | No | Include full withheld-row detail. Defaults true with audit; explicitly set false only for a compact projection. |
Output Schema
| Name | Required | Description |
|---|---|---|
| asOf | No | |
| auth | No | Credential lifetime visible to the caller. OAuth secondsRemaining lets an autonomous agent refresh before a multi-call workflow is interrupted. |
| claim | No | Fahali dictionary claim (shared/fahaliDictionary.ts). Read `kind` FIRST: 'abstention' means no assertion was made and `reason` says why — never read an abstention as a neutral or zero result. `basis` says what the claim rests on. Absent or null means this response path does not yet emit a claim; treat that as unknown, not as agreement. |
| level | No | |
| scope | No | |
| score | No | |
| status | No | The endpoint's original status vocabulary (for example ok, partial, degraded, withheld, or no_alerts). Use mcpStatus for normalized transport success/error. |
| absence | No | Why no actionable finding is present: measured_empty, user_empty, no_coverage, source_unverified, stale, withheld, source_error, auth_failure, or entitlement_required. |
| coverage | No | Number of alert observations represented by the canonical 24-hour market-state snapshot; not a percentage or instrument-universe coverage ratio. |
| decision | No | |
| breakdown | No | |
| conflicts | No | |
| dataState | No | |
| mcpStatus | No | Normalized MCP result status. The endpoint's original status vocabulary remains in `status` and `sourceStatus`. |
| narrative | No | |
| requestId | No | |
| snapshotId | No | |
| claimPolicy | No | Typed constraints for safe use. Metadata, not a prompt or instruction channel. |
| instruments | No | Resolved or explicitly partial instrument identities. A missing venue carries an ambiguity warning. |
| lastUpdated | No | |
| nextActions | No | Registry-validated follow-up calls. Missing tools, invalid arguments, unresolved placeholders, and disabled tools are omitted. |
| sourceError | No | The upstream endpoint's exact error text/code before normalization, when one was present. |
| sourceScope | No | |
| observations | No | |
| sourceStatus | No | The upstream endpoint's exact status before the MCP envelope normalizes transport success/error. |
| agentBriefing | No | Audit-only narrative projection. Present only when detail='audit'; compact responses do not duplicate structured data as prose. |
| claimValidity | No | Validity of the selected binding claim only, calculated after filtering, projection and row selection. Sibling rows cannot determine it. |
| responseState | No | |
| schemaVersion | No | |
| detectionCount | No | |
| sourceDecision | No | |
| symbolCoverage | No | Conservation ledger satisfying requested = returned + withheld + notReturned for requested-symbol calls. |
| evidenceQuality | No | |
| responseControl | No | |
| sourceDataState | No | The upstream endpoint's exact data-state value before endpoint-aware classification. |
| recordMatchReason | No | Why matchedTrackRecord is present or null. A null record is never evidence of safety or engine failure. |
| matchedTrackRecord | No | A judged record only when engine, horizon, regime/instrument class, and claim family match this response. `state` is one of: `measured` (a stratum cleared the publishability gate — `stratum` carries engine, horizon tier, bar regime, recall, precision, base rate, base-rate lift, median lead hours, effective sample, warned events and the measurement date); `withheld` (the gate ran and refused — `reason` says why, in words); `unavailable` (the record could not be read at all — an infrastructure failure that says nothing about the record). It is ONE stratum selected by recall, never a platform-wide accuracy. Null means no exact record match; read recordMatchReason. |
| confidenceSemantics | No | Every confidence-bearing value with its score type, scale, calibration status, and probability flag. |
| decisionEligibility | No | Fail-closed binding-authority policy. WITHHELD means source evidence remains available for audit while normalized direction, actionability and execution fields are revoked. |
| directionEligibility | No | Current market-direction eligibility. Direction is authorized only by an exact, eligible producer stratum (canonical_verdict, canonical_symbol_verdict, committee_verdict) — read bindingAuthority to see which one bound. Widening WHO may bind did not weaken WHAT binding requires: the named producer must still hold a matching horizon/class/family record on a verified-only judged population, so an authority without a record still cannot bind. |
| executionEligibility | No | Fail-closed execution boundary. Portfolio monitoring tools always return WITHHELD with MONITOR_ONLY_NO_EXECUTION_AUTHORITY while Fahali has no capital path. |
| monitoringEligibility | No | Current portfolio-monitoring validity based on captured identity, freshness, integrity, and the caller-supplied monitoring policy. ELIGIBLE authorizes observation/delivery only, never financial action. |
| sourceEvidenceQuality | No | |
| currentActionEligibility | No | Current eligibility of an immutable historical portfolio verdict. It never mutates the stored judgment being replayed. |
| sourceConfidenceSemantics | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish readOnly, idempotent, non-destructive, open-world behavior, so the description only needs to add context — and it does: the 24-hour detection window, the canonical-snapshot provenance, the 0-100 normalization, and the fact that coverage and snapshot identity accompany the score. It stops short of explaining the induced 'withheld-row' behavior or the detail projections, though the schema covers those.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, zero filler, with the core definition and scale front-loaded before the disambiguation and the consumption caveat. Every sentence carries distinct information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values needn't be described, and the description covers scope, scale, time window, and anti-scope. The remaining gap is navigational: among ~58 siblings, an agent still has to infer when this score beats flash_crash_risk or market_verdict.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the five parameters (limit, since, detail, symbols, include_withheld) are already fully documented, and the description adds no parameter-level syntax or trade-off guidance. Baseline 3 applies when the schema carries the load.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific resource and scale: a global 0-100 market-risk score drawn from a 24-hour detection snapshot. The negative scoping ('not institution identity, participant positioning, or portfolio-specific risk') does useful work against siblings like fahali_get_portfolio_risk, but it doesn't differentiate itself from close neighbors such as fahali_get_flash_crash_risk, fahali_get_market_verdict, or fahali_get_market_regime.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is a consumption instruction ('Read coverage and snapshot identity with the score'), which implies the tool shouldn't be used as a bare number. However, no condition says when to choose this tool over the many adjacent market-state tools, and no prerequisites or exclusions are given beyond the negative scope sentence.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fahali_get_market_sentimentARead-onlyIdempotent
Get seven days of sentiment alerts and judged sentiment claims. Both lifecycle streams are returned separately and in one chronological history; one never replaces the other. limit applies per source, defaulting to the maximum 200. A verified empty slice means no qualifying claim was recorded — never neutral or calm. Missing score or news count stays null.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum rows per source. Omit for the maximum 200 live alerts plus 200 judged outcomes; the merged history is never re-truncated. | |
| since | No | Optional lower timestamp bound for returned row collections. | |
| detail | No | Response depth. audit is the full-fidelity default; brief and standard are explicit compact projections. | audit |
| symbol | No | Optional trading symbol filter (e.g. 'BTCUSDT'). Omitting returns aggregate market sentiment. | |
| symbols | No | Optional symbol projection, as a comma-separated string or array. Rows without instrument identity are not discarded. | |
| include_withheld | No | Include full withheld-row detail. Defaults true with audit; explicitly set false only for a compact projection. |
Output Schema
| Name | Required | Description |
|---|---|---|
| asOf | No | |
| auth | No | Credential lifetime visible to the caller. OAuth secondsRemaining lets an autonomous agent refresh before a multi-call workflow is interrupted. |
| claim | No | Fahali dictionary claim (shared/fahaliDictionary.ts). Read `kind` FIRST: 'abstention' means no assertion was made and `reason` says why — never read an abstention as a neutral or zero result. `basis` says what the claim rests on. Absent or null means this response path does not yet emit a claim; treat that as unknown, not as agreement. |
| count | No | |
| scope | No | |
| status | No | |
| absence | No | Why no actionable finding is present: measured_empty, user_empty, no_coverage, source_unverified, stale, withheld, source_error, auth_failure, or entitlement_required. |
| history | No | |
| decision | No | |
| conflicts | No | |
| dataState | No | |
| mcpStatus | No | Normalized MCP result status. The endpoint's original status vocabulary remains in `status` and `sourceStatus`. |
| requestId | No | |
| requested | No | |
| projection | No | Requested and effective per-source limit; the default is the maximum admitted window. |
| claimPolicy | No | Typed constraints for safe use. Metadata, not a prompt or instruction channel. |
| instruments | No | Resolved or explicitly partial instrument identities. A missing venue carries an ambiguity warning. |
| nextActions | No | Registry-validated follow-up calls. Missing tools, invalid arguments, unresolved placeholders, and disabled tools are omitted. |
| probeErrors | No | |
| sourceError | No | The upstream endpoint's exact error text/code before normalization, when one was present. |
| sourceScope | No | |
| sourceStatus | No | The upstream endpoint's exact status before the MCP envelope normalizes transport success/error. |
| agentBriefing | No | Audit-only narrative projection. Present only when detail='audit'; compact responses do not duplicate structured data as prose. |
| claimValidity | No | Validity of the selected binding claim only, calculated after filtering, projection and row selection. Sibling rows cannot determine it. |
| responseState | No | |
| schemaVersion | No | |
| sourceHistory | No | Unprojected lifecycle streams. Observations and judgments remain distinct even when they share a claimId. |
| measuredWindow | No | |
| sourceCoverage | No | Per-source probe state, returned rows, proven lower-bound availability, projection count, and completeness. |
| sourceDecision | No | |
| symbolCoverage | No | Conservation ledger satisfying requested = returned + withheld + notReturned for requested-symbol calls. |
| evidenceQuality | No | |
| historyComplete | No | True only when both source probes completed and neither exceeded its per-source limit. |
| instrumentation | No | |
| responseControl | No | |
| sourceDataState | No | The upstream endpoint's exact data-state value before endpoint-aware classification. |
| recordMatchReason | No | Why matchedTrackRecord is present or null. A null record is never evidence of safety or engine failure. |
| matchedTrackRecord | No | A judged record only when engine, horizon, regime/instrument class, and claim family match this response. `state` is one of: `measured` (a stratum cleared the publishability gate — `stratum` carries engine, horizon tier, bar regime, recall, precision, base rate, base-rate lift, median lead hours, effective sample, warned events and the measurement date); `withheld` (the gate ran and refused — `reason` says why, in words); `unavailable` (the record could not be read at all — an infrastructure failure that says nothing about the record). It is ONE stratum selected by recall, never a platform-wide accuracy. Null means no exact record match; read recordMatchReason. |
| confidenceSemantics | No | Every confidence-bearing value with its score type, scale, calibration status, and probability flag. |
| decisionEligibility | No | Fail-closed binding-authority policy. WITHHELD means source evidence remains available for audit while normalized direction, actionability and execution fields are revoked. |
| directionEligibility | No | Current market-direction eligibility. Direction is authorized only by an exact, eligible producer stratum (canonical_verdict, canonical_symbol_verdict, committee_verdict) — read bindingAuthority to see which one bound. Widening WHO may bind did not weaken WHAT binding requires: the named producer must still hold a matching horizon/class/family record on a verified-only judged population, so an authority without a record still cannot bind. |
| executionEligibility | No | Fail-closed execution boundary. Portfolio monitoring tools always return WITHHELD with MONITOR_ONLY_NO_EXECUTION_AUTHORITY while Fahali has no capital path. |
| monitoringEligibility | No | Current portfolio-monitoring validity based on captured identity, freshness, integrity, and the caller-supplied monitoring policy. ELIGIBLE authorizes observation/delivery only, never financial action. |
| sourceEvidenceQuality | No | |
| currentActionEligibility | No | Current eligibility of an immutable historical portfolio verdict. It never mutates the stored judgment being replayed. |
| sourceConfidenceSemantics | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, so the description wisely spends its words elsewhere: the 7-day window, the fact that the two streams coexist in one chronological history and never replace each other, per-source limit semantics, and null behavior. The empty-slice rule ('never neutral or calm') is exactly the kind of non-obvious semantic an agent could otherwise misread.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the resource and time window, then the stream semantics, then edge-case behavior; every sentence carries information. Minor density cost from the em-dash and semicolon phrasing, but no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, the description need not explain return shape, and it covers the non-obvious parts: dual streams, per-source limit, empty-vs-neutral distinction, and null fields. Missing only explicit guidance on which sibling to pick for adjacent sentiment questions.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents limit, since, detail, symbol(s), and include_withheld in detail. The description's line about limit applying per source largely restates the schema's 'Maximum rows per source' and 'never re-truncated' wording, adding little beyond it. Baseline 3 applies when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('seven days of sentiment alerts and judged sentiment claims') and clarifies that two distinct lifecycle streams are returned, which distinguishes it from mood/regime/alert siblings by data scope. It does not explicitly name an alternative tool, so sibling differentiation is implicit rather than stated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to choose this over fahali_get_market_mood, fahali_get_realtime_alerts, or fahali_get_market_verdict. The sentences about empty slices and nulls are interpretation hints, not usage selection criteria, so an agent must infer the routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fahali_get_market_snapshotARead-onlyIdempotent
Live prices and changes, with asset class, venue and identity. Crypto is the full Binance USDT book; US equities are a small watchlist PLUS any symbol you name in symbols, fetched on demand — so an unrequested equity is absent because nobody asked, not because it is quiet. Read coverage for what was searched, and coverage.volume.comparableAcrossBases before ranking by volume. Public data.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Optional maximum assets to return. Omitting it returns everything this snapshot holds — which is the full Binance USDT book plus a configured US watchlist, NOT every instrument Fahali monitors. Max 800. | |
| since | No | Optional lower timestamp bound for returned row collections. | |
| detail | No | Response depth. audit is the full-fidelity default; brief and standard are explicit compact projections. | audit |
| compact | No | When true, returns symbol+price+change only (drops volume/assetClass/venue) | |
| sort_by | No | Sort field (default symbol). `volume` ranks only rows whose source publishes a volume; rows without one follow in symbol order and are counted in `ordering.rowsUnranked` — their position is not a statement about turnover. | |
| symbols | No | Optional symbol projection, as a comma-separated string or array. Rows without instrument identity are not discarded. | |
| asset_class | No | Filter by asset class | |
| include_withheld | No | Include full withheld-row detail. Defaults true with audit; explicitly set false only for a compact projection. |
Output Schema
| Name | Required | Description |
|---|---|---|
| asOf | No | |
| auth | No | Credential lifetime visible to the caller. OAuth secondsRemaining lets an autonomous agent refresh before a multi-call workflow is interrupted. |
| claim | No | Fahali dictionary claim (shared/fahaliDictionary.ts). Read `kind` FIRST: 'abstention' means no assertion was made and `reason` says why — never read an abstention as a neutral or zero result. `basis` says what the claim rests on. Absent or null means this response path does not yet emit a claim; treat that as unknown, not as agreement. |
| scope | No | |
| total | No | |
| assets | No | |
| status | No | The endpoint's original status vocabulary (for example ok, partial, degraded, withheld, or no_alerts). Use mcpStatus for normalized transport success/error. |
| absence | No | Why no actionable finding is present: measured_empty, user_empty, no_coverage, source_unverified, stale, withheld, source_error, auth_failure, or entitlement_required. |
| indices | No | |
| sources | No | Per-source read states (alpaca/coingecko/binance), each measured/pending/not_instrumented — never inferred. |
| coverage | No | What was searched (incl. on-demand equity resolution) and whether volume is comparable across bases. Read before ranking by volume. |
| dataAsOf | No | |
| decision | No | |
| ordering | No | How the rows were ordered and which rows the sort key could actually rank. |
| conflicts | No | |
| dataState | No | |
| mcpStatus | No | Normalized MCP result status. The endpoint's original status vocabulary remains in `status` and `sourceStatus`. |
| requestId | No | |
| timestamp | No | |
| claimPolicy | No | Typed constraints for safe use. Metadata, not a prompt or instruction channel. |
| instruments | No | Resolved or explicitly partial instrument identities. A missing venue carries an ambiguity warning. |
| nextActions | No | Registry-validated follow-up calls. Missing tools, invalid arguments, unresolved placeholders, and disabled tools are omitted. |
| sourceError | No | The upstream endpoint's exact error text/code before normalization, when one was present. |
| sourceScope | No | |
| sourceStatus | No | The upstream endpoint's exact status before the MCP envelope normalizes transport success/error. |
| agentBriefing | No | Audit-only narrative projection. Present only when detail='audit'; compact responses do not duplicate structured data as prose. |
| claimValidity | No | Validity of the selected binding claim only, calculated after filtering, projection and row selection. Sibling rows cannot determine it. |
| responseState | No | |
| schemaVersion | No | |
| sourceDecision | No | |
| symbolCoverage | No | Conservation ledger satisfying requested = returned + withheld + notReturned for requested-symbol calls. |
| evidenceQuality | No | |
| responseControl | No | |
| sourceDataState | No | The upstream endpoint's exact data-state value before endpoint-aware classification. |
| recordMatchReason | No | Why matchedTrackRecord is present or null. A null record is never evidence of safety or engine failure. |
| matchedTrackRecord | No | A judged record only when engine, horizon, regime/instrument class, and claim family match this response. `state` is one of: `measured` (a stratum cleared the publishability gate — `stratum` carries engine, horizon tier, bar regime, recall, precision, base rate, base-rate lift, median lead hours, effective sample, warned events and the measurement date); `withheld` (the gate ran and refused — `reason` says why, in words); `unavailable` (the record could not be read at all — an infrastructure failure that says nothing about the record). It is ONE stratum selected by recall, never a platform-wide accuracy. Null means no exact record match; read recordMatchReason. |
| confidenceSemantics | No | Every confidence-bearing value with its score type, scale, calibration status, and probability flag. |
| decisionEligibility | No | Fail-closed binding-authority policy. WITHHELD means source evidence remains available for audit while normalized direction, actionability and execution fields are revoked. |
| directionEligibility | No | Current market-direction eligibility. Direction is authorized only by an exact, eligible producer stratum (canonical_verdict, canonical_symbol_verdict, committee_verdict) — read bindingAuthority to see which one bound. Widening WHO may bind did not weaken WHAT binding requires: the named producer must still hold a matching horizon/class/family record on a verified-only judged population, so an authority without a record still cannot bind. |
| executionEligibility | No | Fail-closed execution boundary. Portfolio monitoring tools always return WITHHELD with MONITOR_ONLY_NO_EXECUTION_AUTHORITY while Fahali has no capital path. |
| monitoringEligibility | No | Current portfolio-monitoring validity based on captured identity, freshness, integrity, and the caller-supplied monitoring policy. ELIGIBLE authorizes observation/delivery only, never financial action. |
| sourceEvidenceQuality | No | |
| currentActionEligibility | No | Current eligibility of an immutable historical portfolio verdict. It never mutates the stored judgment being replayed. |
| sourceConfidenceSemantics | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only, idempotent, open-world, non-destructive, so the safety profile is covered; the description goes further by disclosing the exact data scope (full Binance USDT book vs. configured watchlist plus on-demand `symbols` fetching) and the semantics of missing rows. It also warns about a real analytical pitfall: volume rows are not comparable across bases. This is substantial context beyond structured fields.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with what the tool returns, then scope, then the caveat about coverage. Dense but every clause carries information; the long em-dash sentence is slightly heavy but not wasteful.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return-value details are not required, and the description covers scope, absence semantics and the volume-comparability caveat. Minor omissions such as default page size or the meaning of the `since` bound are handled by the schema, so an agent has everything needed to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline would be 3, but the description adds real meaning beyond the schema: naming a symbol in `symbols` triggers an on-demand equity fetch, and non-requested equities are absent rather than quiet. That behavior is not derivable from the parameter descriptions alone.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource: live prices and changes, enriched with asset class, venue and identity. It also scopes the data precisely (full Binance USDT book for crypto, watchlist plus on-demand equities). It does not explicitly differentiate itself from siblings like get_market_verdict or get_market_regime, which keeps it below a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives interpretive guidance (read `coverage` for what was searched; check `coverage.volume.comparableAcrossBases` before ranking by volume) and explains that an absent equity means it was not requested. However, it never states when to choose this snapshot over alternatives such as fahali_get_market_verdict or fahali_get_market_briefing, so tool-selection guidance is only implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fahali_get_market_verdictCRead-onlyIdempotent
Canonical per-symbol judgment and sole direction authority: state, reliability, conflict, forecast, record, invalidation, committee evidence, canonical engine rows, and runtime telemetry. Always-on base-rate blend ensures direction is never withheld; notReturned preserves runtime telemetry for unjudged symbols. Audit defaults to full fidelity; quiet, stale, unavailable, and retired states remain explicit. Committee evidence is non-binding.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Optional maximum rows per projectable collection. Audit has no MCP projection cap; brief defaults to 3 and standard to 12. | |
| since | No | Optional lower timestamp bound for returned row collections. | |
| detail | No | Response depth. audit is the full-fidelity default; brief and standard are explicit compact projections. | audit |
| symbols | No | Comma-separated trading symbols (e.g. 'BTCUSDT,ETHUSDT'). Omitting returns top signals across all symbols. | |
| includeContagion | No | If true, enriches the response with downside co-movement (the hidden correlation chain) from the tail_dependence engine. Chain enrichment requires Elite tier. | |
| include_withheld | No | Include full withheld-row detail. Defaults true with audit; explicitly set false only for a compact projection. |
Output Schema
| Name | Required | Description |
|---|---|---|
| asOf | No | |
| auth | No | Credential lifetime visible to the caller. OAuth secondsRemaining lets an autonomous agent refresh before a multi-call workflow is interrupted. |
| data | No | |
| claim | No | Fahali dictionary claim (shared/fahaliDictionary.ts). Read `kind` FIRST: 'abstention' means no assertion was made and `reason` says why — never read an abstention as a neutral or zero result. `basis` says what the claim rests on. Absent or null means this response path does not yet emit a claim; treat that as unknown, not as agreement. |
| count | No | |
| scope | No | |
| status | No | The endpoint's original status vocabulary (for example ok, partial, degraded, withheld, or no_alerts). Use mcpStatus for normalized transport success/error. |
| absence | No | Why no actionable finding is present: measured_empty, user_empty, no_coverage, source_unverified, stale, withheld, source_error, auth_failure, or entitlement_required. |
| decision | No | |
| conflicts | No | |
| dataState | No | |
| mcpStatus | No | Normalized MCP result status. The endpoint's original status vocabulary remains in `status` and `sourceStatus`. |
| requestId | No | |
| updatedAt | No | |
| claimPolicy | No | Typed constraints for safe use. Metadata, not a prompt or instruction channel. |
| instruments | No | Resolved or explicitly partial instrument identities. A missing venue carries an ambiguity warning. |
| nextActions | No | Registry-validated follow-up calls. Missing tools, invalid arguments, unresolved placeholders, and disabled tools are omitted. |
| notReturned | No | Every requested symbol without a judged verdict row. Fresh/stale runtime telemetry remains attached when available; no engine evidence is promoted into a binding direction. |
| sourceError | No | The upstream endpoint's exact error text/code before normalization, when one was present. |
| sourceScope | No | |
| sourceStatus | No | The upstream endpoint's exact status before the MCP envelope normalizes transport success/error. |
| agentBriefing | No | Audit-only narrative projection. Present only when detail='audit'; compact responses do not duplicate structured data as prose. |
| claimValidity | No | Validity of the selected binding claim only, calculated after filtering, projection and row selection. Sibling rows cannot determine it. |
| responseState | No | |
| schemaVersion | No | |
| provenanceRoot | No | SHA-256 over the per-item integrity hashes. Verifies this response wasn't altered after receipt (recompute to check). NOT a cryptographic attestation — key-signed receipts are on the roadmap. |
| sourceDecision | No | |
| symbolCoverage | No | Conservation ledger satisfying requested = returned + withheld + notReturned for requested-symbol calls. |
| evidenceQuality | No | |
| responseControl | No | |
| sourceDataState | No | The upstream endpoint's exact data-state value before endpoint-aware classification. |
| recordMatchReason | No | Why matchedTrackRecord is present or null. A null record is never evidence of safety or engine failure. |
| requestedCoverage | No | |
| matchedTrackRecord | No | A judged record only when engine, horizon, regime/instrument class, and claim family match this response. `state` is one of: `measured` (a stratum cleared the publishability gate — `stratum` carries engine, horizon tier, bar regime, recall, precision, base rate, base-rate lift, median lead hours, effective sample, warned events and the measurement date); `withheld` (the gate ran and refused — `reason` says why, in words); `unavailable` (the record could not be read at all — an infrastructure failure that says nothing about the record). It is ONE stratum selected by recall, never a platform-wide accuracy. Null means no exact record match; read recordMatchReason. |
| confidenceSemantics | No | Every confidence-bearing value with its score type, scale, calibration status, and probability flag. |
| decisionEligibility | No | Fail-closed binding-authority policy. WITHHELD means source evidence remains available for audit while normalized direction, actionability and execution fields are revoked. |
| directionEligibility | No | Current market-direction eligibility. Direction is authorized only by an exact, eligible producer stratum (canonical_verdict, canonical_symbol_verdict, committee_verdict) — read bindingAuthority to see which one bound. Widening WHO may bind did not weaken WHAT binding requires: the named producer must still hold a matching horizon/class/family record on a verified-only judged population, so an authority without a record still cannot bind. |
| executionEligibility | No | Fail-closed execution boundary. Portfolio monitoring tools always return WITHHELD with MONITOR_ONLY_NO_EXECUTION_AUTHORITY while Fahali has no capital path. |
| monitoringEligibility | No | Current portfolio-monitoring validity based on captured identity, freshness, integrity, and the caller-supplied monitoring policy. ELIGIBLE authorizes observation/delivery only, never financial action. |
| sourceEvidenceQuality | No | |
| currentActionEligibility | No | Current eligibility of an immutable historical portfolio verdict. It never mutates the stored judgment being replayed. |
| sourceConfidenceSemantics | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With readOnlyHint/idempotent already set, the description adds real behavioral context beyond annotations: the always-on base-rate blend means direction is never withheld, notReturned preserves telemetry for unjudged symbols, and quiet/stale/unavailable/retired states remain explicit. This is meaningful disclosure of how the tool behaves on edge cases.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
It is a single overpacked sentence-string chaining every feature (state, reliability, conflict, forecast, record, invalidation, committee evidence, engine rows, telemetry, base-rate blend, notReturned, states). The front-loading exists but the sentence is dense and hard to parse, with jargon that obscures rather than clarifies.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists and annotations cover the safety profile, so the description doesn't need to explain return values. However, for a tool with six params and multiple explicit states, the description leaves the actual shape of the 'verdict' unclear, so it is adequate but with gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents limit, since, detail, symbols, includeContagion, and include_withheld thoroughly. The description adds little parameter-specific syntax or format beyond restating the audit/quiet/stale state semantics, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description asserts the tool is the 'canonical per-symbol judgment and sole direction authority' and enumerates the outputs it carries (state, reliability, conflict, forecast, record, invalidation). But the phrasing is dense jargon that never plainly says 'returns the market verdict for requested symbols', and distinguishing it from siblings like fahali_get_symbol_decision or fahali_get_market_decision requires inference.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states defaults (audit is full fidelity) and notes committee evidence is non-binding, but gives no explicit when-to-use-this-vs-alternatives guidance against the many overlapping sibling tools (symbol_decision, market_decision, verdict_by_id). An agent gets no routing criteria.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fahali_get_microstructure_proxyARead-onlyIdempotent
Latest absorption observations derived from public aggregate trades and order-book snapshots. Filter by symbol or time; omit symbols for the latest fleet-wide observations. The response reports price/volume behavior, freshness, conflicts, and venue only when the source identifies it; it does not attribute activity to a trader or report hidden executed volume.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| since | No | Optional ISO-8601 lower bound, no more than 30 days ago. Defaults to seven days. | |
| detail | No | Response depth. audit is the full-fidelity default; brief and standard are explicit compact projections. | audit |
| symbol | No | Optional single instrument, such as BTC, BTCUSDT, or ATOMUSDT. | |
| symbols | No | ||
| include_withheld | No | Include full withheld-row detail. Defaults true with audit; explicitly set false only for a compact projection. |
Output Schema
| Name | Required | Description |
|---|---|---|
| asOf | No | |
| auth | No | Credential lifetime visible to the caller. OAuth secondsRemaining lets an autonomous agent refresh before a multi-call workflow is interrupted. |
| data | No | |
| claim | No | |
| scope | No | |
| status | No | |
| absence | No | Why no actionable finding is present: measured_empty, user_empty, no_coverage, source_unverified, stale, withheld, source_error, auth_failure, or entitlement_required. |
| summary | No | |
| decision | No | |
| evidence | No | |
| headline | No | |
| conflicts | No | |
| dataState | No | |
| mcpStatus | No | Normalized MCP result status. The endpoint's original status vocabulary remains in `status` and `sourceStatus`. |
| requestId | No | |
| disclaimer | No | |
| provenance | No | |
| claimPolicy | No | Typed constraints for safe use. Metadata, not a prompt or instruction channel. |
| instruments | No | Resolved or explicitly partial instrument identities. A missing venue carries an ambiguity warning. |
| limitations | No | |
| nextActions | No | Registry-validated follow-up calls. Missing tools, invalid arguments, unresolved placeholders, and disabled tools are omitted. |
| notReturned | No | |
| resolutions | No | |
| sourceError | No | The upstream endpoint's exact error text/code before normalization, when one was present. |
| sourceScope | No | |
| sourceStatus | No | The upstream endpoint's exact status before the MCP envelope normalizes transport success/error. |
| agentBriefing | No | Audit-only narrative projection. Present only when detail='audit'; compact responses do not duplicate structured data as prose. |
| claimValidity | No | Validity of the selected binding claim only, calculated after filtering, projection and row selection. Sibling rows cannot determine it. |
| responseState | No | |
| schemaVersion | No | |
| sourceDecision | No | |
| symbolCoverage | No | Conservation ledger satisfying requested = returned + withheld + notReturned for requested-symbol calls. |
| evidenceQuality | No | |
| responseControl | No | |
| sourceDataState | No | The upstream endpoint's exact data-state value before endpoint-aware classification. |
| recordMatchReason | No | Why matchedTrackRecord is present or null. A null record is never evidence of safety or engine failure. |
| matchedTrackRecord | No | A judged record only when engine, horizon, regime/instrument class, and claim family match this response. `state` is one of: `measured` (a stratum cleared the publishability gate — `stratum` carries engine, horizon tier, bar regime, recall, precision, base rate, base-rate lift, median lead hours, effective sample, warned events and the measurement date); `withheld` (the gate ran and refused — `reason` says why, in words); `unavailable` (the record could not be read at all — an infrastructure failure that says nothing about the record). It is ONE stratum selected by recall, never a platform-wide accuracy. Null means no exact record match; read recordMatchReason. |
| confidenceSemantics | No | Every confidence-bearing value with its score type, scale, calibration status, and probability flag. |
| decisionEligibility | No | Fail-closed binding-authority policy. WITHHELD means source evidence remains available for audit while normalized direction, actionability and execution fields are revoked. |
| directionEligibility | No | Current market-direction eligibility. Direction is authorized only by an exact, eligible producer stratum (canonical_verdict, canonical_symbol_verdict, committee_verdict) — read bindingAuthority to see which one bound. Widening WHO may bind did not weaken WHAT binding requires: the named producer must still hold a matching horizon/class/family record on a verified-only judged population, so an authority without a record still cannot bind. |
| executionEligibility | No | Fail-closed execution boundary. Portfolio monitoring tools always return WITHHELD with MONITOR_ONLY_NO_EXECUTION_AUTHORITY while Fahali has no capital path. |
| monitoringEligibility | No | Current portfolio-monitoring validity based on captured identity, freshness, integrity, and the caller-supplied monitoring policy. ELIGIBLE authorizes observation/delivery only, never financial action. |
| sourceEvidenceQuality | No | |
| currentActionEligibility | No | Current eligibility of an immutable historical portfolio verdict. It never mutates the stored judgment being replayed. |
| sourceConfidenceSemantics | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish that this is a safe, read-only, idempotent operation. The description adds meaningful behavioral context by naming the public data sources, describing what the response can report, and explicitly limiting attribution to traders and hidden executed volume.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences are tightly organized: purpose first, filtering guidance second, and response limitations third. There is no redundant or wasted text.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema available and annotations covering safety, the description supplies enough provenance, response semantics, and limitation context for correct use. Minor gaps remain around limit behavior and detail projections, but the schema covers most of that ground.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 67%, so the schema itself documents most parameters. The description adds some meaning by explaining symbol filtering and fleet-wide defaults when symbols are omitted, but it does not explain limit, detail, or include_withheld beyond what the schema provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description identifies a specific resource—latest absorption observations—and explains that they are derived from public aggregate trades and order-book snapshots. It is clear what the tool returns, but it does not explicitly distinguish itself from the many sibling market-analysis tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives filtering guidance: use symbol or time, and omit symbols to get fleet-wide observations. It does not state when to use this tool instead of siblings such as market snapshot, capital flow, or detection activity, so usage is implied rather than fully guided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fahali_get_portfolio_decisionB
Get the current non-binding, monitor-only risk assessment for a persistent watch. Legacy HOLD/WATCH/REDUCE/EXIT values are escalation labels interpreted only inside the supplied monitoring thresholds; machine policy fields prohibit treating them as a personalized recommendation, portfolio action, order, or execution authority.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Optional maximum rows per projectable collection. Audit has no MCP projection cap; brief defaults to 3 and standard to 12. | |
| since | No | Optional lower timestamp bound for returned row collections. | |
| detail | No | Response depth. audit is the full-fidelity default; brief and standard are explicit compact projections. | audit |
| refresh | No | True re-evaluates and may persist a new verdict (requires write:portfolio). False reads the latest verdict only (read:portfolio). | |
| symbols | No | Optional symbol projection, as a comma-separated string or array. Rows without instrument identity are not discarded. | |
| watch_id | Yes | ||
| include_withheld | No | Include full withheld-row detail. Defaults true with audit; explicitly set false only for a compact projection. |
Output Schema
| Name | Required | Description |
|---|---|---|
| asOf | No | |
| auth | No | Credential lifetime visible to the caller. OAuth secondsRemaining lets an autonomous agent refresh before a multi-call workflow is interrupted. |
| claim | No | Fahali dictionary claim (shared/fahaliDictionary.ts). Read `kind` FIRST: 'abstention' means no assertion was made and `reason` says why — never read an abstention as a neutral or zero result. `basis` says what the claim rests on. Absent or null means this response path does not yet emit a claim; treat that as unknown, not as agreement. |
| delta | No | |
| items | No | |
| scope | No | |
| watch | No | |
| status | Yes | |
| absence | No | Why no actionable finding is present: measured_empty, user_empty, no_coverage, source_unverified, stale, withheld, source_error, auth_failure, or entitlement_required. |
| verdict | No | |
| watches | No | |
| decision | No | |
| conflicts | No | |
| dataState | Yes | |
| mcpStatus | No | Normalized MCP result status. The endpoint's original status vocabulary remains in `status` and `sourceStatus`. |
| refreshed | No | |
| requestId | No | |
| verdictId | No | |
| nextCursor | No | |
| validUntil | No | |
| claimPolicy | No | Typed constraints for safe use. Metadata, not a prompt or instruction channel. |
| idempotency | No | |
| instruments | No | Resolved or explicitly partial instrument identities. A missing venue carries an ambiguity warning. |
| nextActions | No | Registry-validated follow-up calls. Missing tools, invalid arguments, unresolved placeholders, and disabled tools are omitted. |
| sourceError | No | The upstream endpoint's exact error text/code before normalization, when one was present. |
| sourceScope | No | |
| decisionHash | No | |
| evidenceHash | No | |
| sourceStatus | No | The upstream endpoint's exact status before the MCP envelope normalizes transport success/error. |
| subscription | No | |
| agentBriefing | No | Audit-only narrative projection. Present only when detail='audit'; compact responses do not duplicate structured data as prose. |
| claimValidity | No | Validity of the selected binding claim only, calculated after filtering, projection and row selection. Sibling rows cannot determine it. |
| operatingMode | Yes | |
| responseState | No | |
| schemaVersion | No | |
| signingSecret | No | |
| subscriptions | No | |
| authorityState | No | |
| sourceDecision | No | |
| symbolCoverage | No | Conservation ledger satisfying requested = returned + withheld + notReturned for requested-symbol calls. |
| evidenceQuality | No | |
| responseControl | No | |
| sourceDataState | No | The upstream endpoint's exact data-state value before endpoint-aware classification. |
| evidenceSnapshot | No | Compact immutable source snapshot needed to verify evidenceRef integrity on delta responses. |
| recordMatchReason | No | Why matchedTrackRecord is present or null. A null record is never evidence of safety or engine failure. |
| signingSecretNote | No | |
| matchedTrackRecord | No | A judged record only when engine, horizon, regime/instrument class, and claim family match this response. `state` is one of: `measured` (a stratum cleared the publishability gate — `stratum` carries engine, horizon tier, bar regime, recall, precision, base rate, base-rate lift, median lead hours, effective sample, warned events and the measurement date); `withheld` (the gate ran and refused — `reason` says why, in words); `unavailable` (the record could not be read at all — an infrastructure failure that says nothing about the record). It is ONE stratum selected by recall, never a platform-wide accuracy. Null means no exact record match; read recordMatchReason. |
| methodologyVersion | No | |
| confidenceSemantics | No | Every confidence-bearing value with its score type, scale, calibration status, and probability flag. |
| decisionEligibility | No | Fail-closed binding-authority policy. WITHHELD means source evidence remains available for audit while normalized direction, actionability and execution fields are revoked. |
| directionEligibility | No | Current market-direction eligibility. Direction is authorized only by an exact, eligible producer stratum (canonical_verdict, canonical_symbol_verdict, committee_verdict) — read bindingAuthority to see which one bound. Widening WHO may bind did not weaken WHAT binding requires: the named producer must still hold a matching horizon/class/family record on a verified-only judged population, so an authority without a record still cannot bind. |
| executionEligibility | No | Fail-closed execution boundary. Portfolio monitoring tools always return WITHHELD with MONITOR_ONLY_NO_EXECUTION_AUTHORITY while Fahali has no capital path. |
| legacyFieldSemantics | Yes | |
| outputClassification | Yes | |
| monitoringEligibility | No | Current portfolio-monitoring validity based on captured identity, freshness, integrity, and the caller-supplied monitoring policy. ELIGIBLE authorizes observation/delivery only, never financial action. |
| sourceEvidenceQuality | No | |
| currentActionEligibility | No | Current eligibility of an immutable historical portfolio verdict. It never mutates the stored judgment being replayed. |
| sourceConfidenceSemantics | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes meaningfully beyond the annotations by declaring the assessment non-binding and monitor-only and by reinterpreting the legacy HOLD/WATCH/REDUCE/EXIT labels as threshold-scoped escalation labels rather than recommendations or execution authority — context no structured field carries. It does not, however, disclose the operational side effect implied by annotations (readOnlyHint=false, non-idempotent) and by refresh defaulting to true, which can persist a new verdict and requires write:portfolio.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with purpose front-loaded and no filler. The second sentence is legalistic and reference-heavy, but every clause carries an interpretive constraint that changes how the output should be treated.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return-value detail is rightly omitted, and the semantic-safety caveat is well covered. But for a 7-parameter tool whose default refresh=true triggers a persisted write requiring write:portfolio, the description omits the single behavior an agent most needs to know before calling.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 86%, so the schema already documents limit, since, detail, refresh, symbols, and include_withheld with enum and default detail. The description adds nothing about any parameter — notably it is silent on refresh's read-vs-write tradeoff, which is the single highest-stakes parameter choice.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: retrieve the current risk assessment for a persistent watch. The scope ('for a persistent watch') is clear, but it never distinguishes itself from adjacent siblings such as fahali_get_portfolio_risk, fahali_get_watch_delta, or fahali_get_symbol_decision/market_decision, leaving the agent to guess which decision-family tool applies.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use or when-not-to-use guidance and no named alternative, despite a dense sibling set of portfolio and decision tools. The only usage-adjacent content is an interpretation caveat, not a routing rule, so the agent gets no help selecting this over its siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fahali_get_portfolio_metricsBRead-onlyIdempotent
Get aggregate portfolio risk metrics. Returns sentiment momentum (bullish vs bearish signal balance), cascade risk score, liquidity stress score, and signal stress level (derived from leverage/derivative signal confidences). Synthesizes data from leverage, funding_stress, and volume_anomaly engines.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Optional maximum rows per projectable collection. Audit has no MCP projection cap; brief defaults to 3 and standard to 12. | |
| since | No | Optional lower timestamp bound for returned row collections. | |
| detail | No | Response depth. audit is the full-fidelity default; brief and standard are explicit compact projections. | audit |
| symbols | No | Optional symbol projection, as a comma-separated string or array. Rows without instrument identity are not discarded. | |
| include_withheld | No | Include full withheld-row detail. Defaults true with audit; explicitly set false only for a compact projection. |
Output Schema
| Name | Required | Description |
|---|---|---|
| asOf | No | |
| auth | No | Credential lifetime visible to the caller. OAuth secondsRemaining lets an autonomous agent refresh before a multi-call workflow is interrupted. |
| claim | No | Fahali dictionary claim (shared/fahaliDictionary.ts). Read `kind` FIRST: 'abstention' means no assertion was made and `reason` says why — never read an abstention as a neutral or zero result. `basis` says what the claim rests on. Absent or null means this response path does not yet emit a claim; treat that as unknown, not as agreement. |
| scope | No | |
| status | No | The endpoint's original status vocabulary (for example ok, partial, degraded, withheld, or no_alerts). Use mcpStatus for normalized transport success/error. |
| absence | No | Why no actionable finding is present: measured_empty, user_empty, no_coverage, source_unverified, stale, withheld, source_error, auth_failure, or entitlement_required. |
| decision | No | |
| conflicts | No | |
| dataState | No | |
| mcpStatus | No | Normalized MCP result status. The endpoint's original status vocabulary remains in `status` and `sourceStatus`. |
| requestId | No | |
| timestamp | No | |
| cascadeRisk | No | 0-1 cascade risk from crash/liquidation signal confidences. NULL when no crash/liquidation signals exist in the window — null means 'not computed', never 'calm' (see cascadeRiskReason). |
| claimPolicy | No | Typed constraints for safe use. Metadata, not a prompt or instruction channel. |
| instruments | No | Resolved or explicitly partial instrument identities. A missing venue carries an ambiguity warning. |
| nextActions | No | Registry-validated follow-up calls. Missing tools, invalid arguments, unresolved placeholders, and disabled tools are omitted. |
| signalCount | No | Number of alert/institutional-signal rows the metrics were computed over. 0 means the feed was empty and every metric is null. |
| sourceError | No | The upstream endpoint's exact error text/code before normalization, when one was present. |
| sourceScope | No | |
| sourceStatus | No | The upstream endpoint's exact status before the MCP envelope normalizes transport success/error. |
| agentBriefing | No | Audit-only narrative projection. Present only when detail='audit'; compact responses do not duplicate structured data as prose. |
| claimValidity | No | Validity of the selected binding claim only, calculated after filtering, projection and row selection. Sibling rows cannot determine it. |
| responseState | No | |
| schemaVersion | No | |
| sourceDecision | No | |
| symbolCoverage | No | Conservation ledger satisfying requested = returned + withheld + notReturned for requested-symbol calls. |
| evidenceQuality | No | |
| liquidityStress | No | 0-1 from liquidity/funding signals. NULL when no liquidity signals exist in the window — null means 'not computed', never 'calm' (see liquidityStressReason). |
| responseControl | No | |
| sourceDataState | No | The upstream endpoint's exact data-state value before endpoint-aware classification. |
| cascadeRiskReason | No | Why cascadeRisk is null (present only when it is). |
| recordMatchReason | No | Why matchedTrackRecord is present or null. A null record is never evidence of safety or engine failure. |
| sentimentMomentum | No | -1..1 net signal direction. NULL when no sentiment-tagged signals exist in the window — a null here is 'no view measured', never a claimed balance (see sentimentMomentumReason). |
| signalStressLevel | No | 0-1 from leverage/derivative signal confidences. NULL when no leverage/derivative signals exist in the window — null means 'not computed', never 'calm' (see signalStressLevelReason). |
| matchedTrackRecord | No | A judged record only when engine, horizon, regime/instrument class, and claim family match this response. `state` is one of: `measured` (a stratum cleared the publishability gate — `stratum` carries engine, horizon tier, bar regime, recall, precision, base rate, base-rate lift, median lead hours, effective sample, warned events and the measurement date); `withheld` (the gate ran and refused — `reason` says why, in words); `unavailable` (the record could not be read at all — an infrastructure failure that says nothing about the record). It is ONE stratum selected by recall, never a platform-wide accuracy. Null means no exact record match; read recordMatchReason. |
| confidenceSemantics | No | Every confidence-bearing value with its score type, scale, calibration status, and probability flag. |
| decisionEligibility | No | Fail-closed binding-authority policy. WITHHELD means source evidence remains available for audit while normalized direction, actionability and execution fields are revoked. |
| directionEligibility | No | Current market-direction eligibility. Direction is authorized only by an exact, eligible producer stratum (canonical_verdict, canonical_symbol_verdict, committee_verdict) — read bindingAuthority to see which one bound. Widening WHO may bind did not weaken WHAT binding requires: the named producer must still hold a matching horizon/class/family record on a verified-only judged population, so an authority without a record still cannot bind. |
| executionEligibility | No | Fail-closed execution boundary. Portfolio monitoring tools always return WITHHELD with MONITOR_ONLY_NO_EXECUTION_AUTHORITY while Fahali has no capital path. |
| liquidityStressReason | No | Why liquidityStress is null (present only when it is). |
| monitoringEligibility | No | Current portfolio-monitoring validity based on captured identity, freshness, integrity, and the caller-supplied monitoring policy. ELIGIBLE authorizes observation/delivery only, never financial action. |
| sourceEvidenceQuality | No | |
| sentimentMomentumReason | No | Why sentimentMomentum is null (present only when it is). |
| signalStressLevelReason | No | Why signalStressLevel is null (present only when it is). |
| currentActionEligibility | No | Current eligibility of an immutable historical portfolio verdict. It never mutates the stored judgment being replayed. |
| sourceConfidenceSemantics | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only, idempotent, non-destructive, and open-world behavior, so the safety profile is clear. The description adds useful context about synthesizing leverage, funding_stress, and volume_anomaly engine data, but it does not disclose operational details like rate limits, auth needs, or data freshness.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three tight sentences with no filler. It front-loads the purpose and then efficiently explains the returned metrics and their data sources.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the rich annotations, complete parameter schema, and existing output schema, the description provides enough context to understand the tool's purpose and returned metrics. The main missing element is explicit routing against sibling portfolio tools, but otherwise it is complete enough for invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all five parameters are documented in the input schema. The description adds no parameter-level meaning beyond the schema, which is acceptable at baseline 3 given complete schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb and resource: 'Get aggregate portfolio risk metrics.' It enumerates the returned metrics and names the underlying engines, but it does not explicitly differentiate this tool from the sibling fahali_get_portfolio_risk.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description states what the tool returns but gives no explicit guidance on when to use it instead of alternatives such as fahali_get_portfolio_risk or fahali_analyze_custom_portfolio. Any usage context is only implied by the word 'aggregate.'
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fahali_get_portfolio_riskARead-onlyIdempotent
Measured connected-book risk, VaR/expected shortfall, canonical covariance, and per-position monitoring evidence. Direction belongs to the canonical symbol verdict; this stateless surface withholds binding actions and points to the mandate-aware portfolio decision tool.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Optional maximum rows per projectable collection. Audit has no MCP projection cap; brief defaults to 3 and standard to 12. | |
| since | No | Optional lower timestamp bound for returned row collections. | |
| detail | No | Response depth. audit is the full-fidelity default; brief and standard are explicit compact projections. | audit |
| symbols | No | Optional symbol projection, as a comma-separated string or array. Rows without instrument identity are not discarded. | |
| include_withheld | No | Include full withheld-row detail. Defaults true with audit; explicitly set false only for a compact projection. |
Output Schema
| Name | Required | Description |
|---|---|---|
| asOf | No | |
| auth | No | Credential lifetime visible to the caller. OAuth secondsRemaining lets an autonomous agent refresh before a multi-call workflow is interrupted. |
| claim | No | Fahali dictionary claim (shared/fahaliDictionary.ts). Read `kind` FIRST: 'abstention' means no assertion was made and `reason` says why — never read an abstention as a neutral or zero result. `basis` says what the claim rests on. Absent or null means this response path does not yet emit a claim; treat that as unknown, not as agreement. |
| scope | No | |
| status | No | The endpoint's original status vocabulary (for example ok, partial, degraded, withheld, or no_alerts). Use mcpStatus for normalized transport success/error. |
| absence | No | Why no actionable finding is present: measured_empty, user_empty, no_coverage, source_unverified, stale, withheld, source_error, auth_failure, or entitlement_required. |
| decision | No | |
| conflicts | No | |
| dataState | No | |
| mcpStatus | No | Normalized MCP result status. The endpoint's original status vocabulary remains in `status` and `sourceStatus`. |
| portfolio | No | |
| positions | No | |
| requestId | No | |
| timestamp | No | |
| claimPolicy | No | Typed constraints for safe use. Metadata, not a prompt or instruction channel. |
| correlation | No | |
| instruments | No | Resolved or explicitly partial instrument identities. A missing venue carries an ambiguity warning. |
| nextActions | No | Registry-validated follow-up calls. Missing tools, invalid arguments, unresolved placeholders, and disabled tools are omitted. |
| sourceError | No | The upstream endpoint's exact error text/code before normalization, when one was present. |
| sourceScope | No | |
| sourceStatus | No | The upstream endpoint's exact status before the MCP envelope normalizes transport success/error. |
| agentBriefing | No | Audit-only narrative projection. Present only when detail='audit'; compact responses do not duplicate structured data as prose. |
| claimValidity | No | Validity of the selected binding claim only, calculated after filtering, projection and row selection. Sibling rows cannot determine it. |
| contagionRisk | No | |
| responseState | No | |
| schemaVersion | No | |
| sourceDecision | No | |
| symbolCoverage | No | Conservation ledger satisfying requested = returned + withheld + notReturned for requested-symbol calls. |
| evidenceQuality | No | |
| responseControl | No | |
| sourceDataState | No | The upstream endpoint's exact data-state value before endpoint-aware classification. |
| decisionAuthority | No | |
| recordMatchReason | No | Why matchedTrackRecord is present or null. A null record is never evidence of safety or engine failure. |
| matchedTrackRecord | No | A judged record only when engine, horizon, regime/instrument class, and claim family match this response. `state` is one of: `measured` (a stratum cleared the publishability gate — `stratum` carries engine, horizon tier, bar regime, recall, precision, base rate, base-rate lift, median lead hours, effective sample, warned events and the measurement date); `withheld` (the gate ran and refused — `reason` says why, in words); `unavailable` (the record could not be read at all — an infrastructure failure that says nothing about the record). It is ONE stratum selected by recall, never a platform-wide accuracy. Null means no exact record match; read recordMatchReason. |
| confidenceSemantics | No | Every confidence-bearing value with its score type, scale, calibration status, and probability flag. |
| decisionEligibility | No | Fail-closed binding-authority policy. WITHHELD means source evidence remains available for audit while normalized direction, actionability and execution fields are revoked. |
| directionEligibility | No | Current market-direction eligibility. Direction is authorized only by an exact, eligible producer stratum (canonical_verdict, canonical_symbol_verdict, committee_verdict) — read bindingAuthority to see which one bound. Widening WHO may bind did not weaken WHAT binding requires: the named producer must still hold a matching horizon/class/family record on a verified-only judged population, so an authority without a record still cannot bind. |
| executionEligibility | No | Fail-closed execution boundary. Portfolio monitoring tools always return WITHHELD with MONITOR_ONLY_NO_EXECUTION_AUTHORITY while Fahali has no capital path. |
| monitoringEligibility | No | Current portfolio-monitoring validity based on captured identity, freshness, integrity, and the caller-supplied monitoring policy. ELIGIBLE authorizes observation/delivery only, never financial action. |
| sourceEvidenceQuality | No | |
| currentActionEligibility | No | Current eligibility of an immutable historical portfolio verdict. It never mutates the stored judgment being replayed. |
| sourceConfidenceSemantics | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive, openWorld, so the safety profile is covered. The description still adds meaningful context beyond them: the surface is stateless and withholds binding actions, telling the agent this is measurement-only. It doesn't discuss cost, rate limits, or staleness of risk figures.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with no filler, and the core capability is front-loaded before the boundary/routing statement. Slight density of unexplained domain terms costs a point but every clause carries information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be described, and the description covers purpose, boundaries, and safe-use context. What remains missing is a positive usage trigger and any note on data freshness of the risk figures, which matters for a risk surface.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all five parameters (limit, since, detail, symbols, include_withheld) are already documented with defaults, enums, and bounds. The description adds no parameter guidance of its own, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States specific resources: connected-book risk, VaR/expected shortfall, covariance, and per-position monitoring evidence. It distinguishes itself from the canonical symbol verdict surface and names the portfolio decision tool as the action-capable sibling. The term 'connected-book' and 'canonical covariance' are opaque jargon, keeping it from a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes two alternatives: direction queries belong to the canonical symbol verdict, and binding actions belong to the mandate-aware portfolio decision tool. It doesn't state a positive trigger condition (when an agent should reach for risk measurement), so it falls just short of full when/when-not coverage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fahali_get_realtime_alertsARead-onlyIdempotent
Recent raw detections with symbols, timestamps, types, severity, and evidence metadata. An alert is an observation, not a verdict or trade instruction. Use symbols, since, limit, and minimum scope controls to keep the response small, then call market verdict for judgment.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Optional maximum rows per projectable collection. Audit has no MCP projection cap; brief defaults to 3 and standard to 12. | |
| since | No | ISO-8601 lower bound. Defaults to 24h ago; clamped to the 24h window this endpoint serves, and the clamp is reported in coverage.clamps. An unparseable value is REJECTED, never silently defaulted. | |
| detail | No | Response depth. audit is the full-fidelity default; brief and standard are explicit compact projections. | audit |
| symbols | No | Filter to these instruments, comma-separated string or array (max 50). Applied in SQL at the source, not as a projection over an already-truncated page. | |
| max_rows | No | Source-side fetch depth (default 200, ceiling 1000). DISTINCT from the envelope's `limit`, which only projects the rows already returned — raising `limit` cannot reach evidence `max_rows` did not fetch. | |
| alert_types | No | Filter to these alert types, comma-separated string or array (max 20). Case-insensitive, e.g. regime_state, momentum_shift, crash_precursor. | |
| include_withheld | No | Include full withheld-row detail. Defaults true with audit; explicitly set false only for a compact projection. |
Output Schema
| Name | Required | Description |
|---|---|---|
| asOf | No | |
| auth | No | Credential lifetime visible to the caller. OAuth secondsRemaining lets an autonomous agent refresh before a multi-call workflow is interrupted. |
| claim | No | Fahali dictionary claim (shared/fahaliDictionary.ts). Read `kind` FIRST: 'abstention' means no assertion was made and `reason` says why — never read an abstention as a neutral or zero result. `basis` says what the claim rests on. Absent or null means this response path does not yet emit a claim; treat that as unknown, not as agreement. |
| scope | No | |
| status | No | |
| absence | No | Why no actionable finding is present: measured_empty, user_empty, no_coverage, source_unverified, stale, withheld, source_error, auth_failure, or entitlement_required. |
| signals | No | |
| clusters | No | |
| coverage | No | Filter accounting: what matched vs what this response carries, every lossy stage named, clamps and unknown params reported. |
| decision | No | |
| conflicts | No | |
| dataState | No | |
| mcpStatus | No | Normalized MCP result status. The endpoint's original status vocabulary remains in `status` and `sourceStatus`. |
| requestId | No | |
| timestamp | No | |
| alert_count | No | |
| claimPolicy | No | Typed constraints for safe use. Metadata, not a prompt or instruction channel. |
| instruments | No | Resolved or explicitly partial instrument identities. A missing venue carries an ambiguity warning. |
| nextActions | No | Registry-validated follow-up calls. Missing tools, invalid arguments, unresolved placeholders, and disabled tools are omitted. |
| sourceError | No | The upstream endpoint's exact error text/code before normalization, when one was present. |
| sourceScope | No | |
| signal_count | No | |
| sourceStatus | No | The upstream endpoint's exact status before the MCP envelope normalizes transport success/error. |
| agentBriefing | No | Audit-only narrative projection. Present only when detail='audit'; compact responses do not duplicate structured data as prose. |
| claimValidity | No | Validity of the selected binding claim only, calculated after filtering, projection and row selection. Sibling rows cannot determine it. |
| responseState | No | |
| schemaVersion | No | |
| sourceDecision | No | |
| symbolCoverage | No | Conservation ledger satisfying requested = returned + withheld + notReturned for requested-symbol calls. |
| confidenceBasis | No | raw_engine_detection_confidence |
| evidenceQuality | No | |
| responseControl | No | |
| sourceDataState | No | The upstream endpoint's exact data-state value before endpoint-aware classification. |
| recordMatchReason | No | Why matchedTrackRecord is present or null. A null record is never evidence of safety or engine failure. |
| matchedTrackRecord | No | A judged record only when engine, horizon, regime/instrument class, and claim family match this response. `state` is one of: `measured` (a stratum cleared the publishability gate — `stratum` carries engine, horizon tier, bar regime, recall, precision, base rate, base-rate lift, median lead hours, effective sample, warned events and the measurement date); `withheld` (the gate ran and refused — `reason` says why, in words); `unavailable` (the record could not be read at all — an infrastructure failure that says nothing about the record). It is ONE stratum selected by recall, never a platform-wide accuracy. Null means no exact record match; read recordMatchReason. |
| confidenceSemantics | No | Every confidence-bearing value with its score type, scale, calibration status, and probability flag. |
| decisionEligibility | No | Fail-closed binding-authority policy. WITHHELD means source evidence remains available for audit while normalized direction, actionability and execution fields are revoked. |
| directionEligibility | No | Current market-direction eligibility. Direction is authorized only by an exact, eligible producer stratum (canonical_verdict, canonical_symbol_verdict, committee_verdict) — read bindingAuthority to see which one bound. Widening WHO may bind did not weaken WHAT binding requires: the named producer must still hold a matching horizon/class/family record on a verified-only judged population, so an authority without a record still cannot bind. |
| executionEligibility | No | Fail-closed execution boundary. Portfolio monitoring tools always return WITHHELD with MONITOR_ONLY_NO_EXECUTION_AUTHORITY while Fahali has no capital path. |
| monitoringEligibility | No | Current portfolio-monitoring validity based on captured identity, freshness, integrity, and the caller-supplied monitoring policy. ELIGIBLE authorizes observation/delivery only, never financial action. |
| sourceEvidenceQuality | No | |
| currentActionEligibility | No | Current eligibility of an immutable historical portfolio verdict. It never mutates the stored judgment being replayed. |
| sourceConfidenceSemantics | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the read-only, idempotent, non-destructive safety profile. The description adds semantic context beyond those: that these are raw observations, not verdicts or trade instructions, and that scoping controls shrink the response. It does not describe rate limits or auth, but the added interpretive guidance goes beyond structured fields.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with what the tool returns, followed by its interpretation and scoping/routing. Efficient and well-ordered, though 'minimum scope controls' is slightly vague phrasing that could be tighter.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return-value explanation isn't needed; the description covers content, interpretive nature, scoping, and a handoff to verdict. For a 7-param read-only tool with full schema coverage and annotations, this is nearly complete, missing only edge-case handling like the 24h clamp behavior noted in the schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with detailed descriptions for limit, since, max_rows, symbols, alert_types, detail, and include_withheld. The description mentions symbols, since, limit, and 'minimum scope controls' but adds no syntax or format meaning beyond the schema, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific resource and its contents: 'Recent raw detections with symbols, timestamps, types, severity, and evidence metadata.' It also disambiguates from siblings by declaring 'An alert is an observation, not a verdict or trade instruction,' which distinguishes it from fahali_get_market_verdict.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly directs the agent to use symbols, since, limit, and scope controls to keep responses small, then 'call market verdict for judgment' — a clear next-step and sibling handoff. It lacks an explicit when-not condition or exclusion, but the routing guidance is strong and actionable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fahali_get_sector_rotationARead-onlyIdempotent
Where market leadership is moving: US sectors vs the S&P 500, major coins vs Bitcoin, and Bitcoin, gold and bonds vs the S&P 500. Each member is leading, weakening, lagging or improving by its relative return over a short and a long window, with how unusual the recent move is. Relative price performance, not money flow, not a forecast. Observation, not advice.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Optional maximum rows per projectable collection. Audit has no MCP projection cap; brief defaults to 3 and standard to 12. | |
| since | No | Optional lower timestamp bound for returned row collections. | |
| detail | No | Response depth. audit is the full-fidelity default; brief and standard are explicit compact projections. | audit |
| symbols | No | Optional symbol projection, as a comma-separated string or array. Rows without instrument identity are not discarded. | |
| include_withheld | No | Include full withheld-row detail. Defaults true with audit; explicitly set false only for a compact projection. |
Output Schema
| Name | Required | Description |
|---|---|---|
| asOf | No | |
| auth | No | Credential lifetime visible to the caller. OAuth secondsRemaining lets an autonomous agent refresh before a multi-call workflow is interrupted. |
| kind | No | |
| basis | No | |
| claim | No | Fahali dictionary claim (shared/fahaliDictionary.ts). Read `kind` FIRST: 'abstention' means no assertion was made and `reason` says why — never read an abstention as a neutral or zero result. `basis` says what the claim rests on. Absent or null means this response path does not yet emit a claim; treat that as unknown, not as agreement. |
| scope | No | |
| groups | No | |
| method | No | |
| status | No | The endpoint's original status vocabulary (for example ok, partial, degraded, withheld, or no_alerts). Use mcpStatus for normalized transport success/error. |
| absence | No | Why no actionable finding is present: measured_empty, user_empty, no_coverage, source_unverified, stale, withheld, source_error, auth_failure, or entitlement_required. |
| decision | No | |
| conflicts | No | |
| dataState | No | |
| mcpStatus | No | Normalized MCP result status. The endpoint's original status vocabulary remains in `status` and `sourceStatus`. |
| requestId | No | |
| calibrated | No | |
| isForecast | No | |
| claimPolicy | No | Typed constraints for safe use. Metadata, not a prompt or instruction channel. |
| generatedAt | No | |
| instruments | No | Resolved or explicitly partial instrument identities. A missing venue carries an ambiguity warning. |
| nextActions | No | Registry-validated follow-up calls. Missing tools, invalid arguments, unresolved placeholders, and disabled tools are omitted. |
| sourceError | No | The upstream endpoint's exact error text/code before normalization, when one was present. |
| sourceScope | No | |
| sourceStatus | No | The upstream endpoint's exact status before the MCP envelope normalizes transport success/error. |
| agentBriefing | No | Audit-only narrative projection. Present only when detail='audit'; compact responses do not duplicate structured data as prose. |
| claimValidity | No | Validity of the selected binding claim only, calculated after filtering, projection and row selection. Sibling rows cannot determine it. |
| responseState | No | |
| schemaVersion | No | |
| sourceDecision | No | |
| symbolCoverage | No | Conservation ledger satisfying requested = returned + withheld + notReturned for requested-symbol calls. |
| evidenceQuality | No | |
| responseControl | No | |
| sourceDataState | No | The upstream endpoint's exact data-state value before endpoint-aware classification. |
| measuresMoneyFlow | No | Always false: no volume history long enough to say dollars moved. Never restate a leadership change as money moving. |
| recordMatchReason | No | Why matchedTrackRecord is present or null. A null record is never evidence of safety or engine failure. |
| matchedTrackRecord | No | A judged record only when engine, horizon, regime/instrument class, and claim family match this response. `state` is one of: `measured` (a stratum cleared the publishability gate — `stratum` carries engine, horizon tier, bar regime, recall, precision, base rate, base-rate lift, median lead hours, effective sample, warned events and the measurement date); `withheld` (the gate ran and refused — `reason` says why, in words); `unavailable` (the record could not be read at all — an infrastructure failure that says nothing about the record). It is ONE stratum selected by recall, never a platform-wide accuracy. Null means no exact record match; read recordMatchReason. |
| confidenceSemantics | No | Every confidence-bearing value with its score type, scale, calibration status, and probability flag. |
| decisionEligibility | No | Fail-closed binding-authority policy. WITHHELD means source evidence remains available for audit while normalized direction, actionability and execution fields are revoked. |
| directionEligibility | No | Current market-direction eligibility. Direction is authorized only by an exact, eligible producer stratum (canonical_verdict, canonical_symbol_verdict, committee_verdict) — read bindingAuthority to see which one bound. Widening WHO may bind did not weaken WHAT binding requires: the named producer must still hold a matching horizon/class/family record on a verified-only judged population, so an authority without a record still cannot bind. |
| executionEligibility | No | Fail-closed execution boundary. Portfolio monitoring tools always return WITHHELD with MONITOR_ONLY_NO_EXECUTION_AUTHORITY while Fahali has no capital path. |
| monitoringEligibility | No | Current portfolio-monitoring validity based on captured identity, freshness, integrity, and the caller-supplied monitoring policy. ELIGIBLE authorizes observation/delivery only, never financial action. |
| sourceEvidenceQuality | No | |
| currentActionEligibility | No | Current eligibility of an immutable historical portfolio verdict. It never mutates the stored judgment being replayed. |
| sourceConfidenceSemantics | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already carry readOnly, idempotent, non-destructive and open-world hints, so the safety profile is covered. The description adds genuinely useful framing beyond that: the comparison pairs, the short/long window structure, the notion of how unusual the recent move is, and an explicit disclaimer that this is observation, not advice or forecast.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences that lead with what is being compared. Mild redundancy between "not a forecast" and "Observation, not advice," and the opening is atmospheric rather than stating the operation, but nothing is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With full schema coverage, an output schema, and complete annotations, the description only needs to convey the analytical content and framing, which it does. An agent knows what comparison universe it gets and that it is descriptive rather than predictive.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and an output schema exists, so the baseline is 3. The description mentions the short and long windows but says nothing about limit, since, detail, symbols or include_withheld, adding no meaning beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names the specific content: relative performance of US sectors vs the S&P 500, major coins vs Bitcoin, and Bitcoin/gold/bonds vs the S&P 500, plus the classification labels (leading, weakening, lagging, improving). It never states a plain verb like "returns" and doesn't name a sibling, but the substance is clear enough to distinguish it from most peers.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied only through exclusion: "Relative price performance, not money flow, not a forecast" steers an agent away from capital-flow or forecast tools, and the sibling list does contain fahali_get_capital_flow and fahali_get_forecast. There is no explicit when-to-use statement or named alternative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fahali_get_symbol_decisionARead-onlyIdempotent
Primary single-instrument judgment and thin alias over the canonical arbiter. Returns its authoritative direction plus forecast, record, invalidation, complete non-binding committee evidence, current canonical-roster engine rows, and runtime telemetry. It performs no second computation.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Optional maximum rows per projectable collection. Audit has no MCP projection cap; brief defaults to 3 and standard to 12. | |
| since | No | Optional lower timestamp bound for returned row collections. | |
| detail | No | Response depth. audit is the full-fidelity default; brief and standard are explicit compact projections. | audit |
| symbol | Yes | One trading symbol or canonical instrument alias, for example BTCUSDT or NVDA. | |
| symbols | No | Optional symbol projection, as a comma-separated string or array. Rows without instrument identity are not discarded. | |
| includeContagion | No | Include downside co-movement context when the caller is entitled to it. | |
| include_withheld | No | Include full withheld-row detail. Defaults true with audit; explicitly set false only for a compact projection. |
Output Schema
| Name | Required | Description |
|---|---|---|
| asOf | No | |
| auth | No | Credential lifetime visible to the caller. OAuth secondsRemaining lets an autonomous agent refresh before a multi-call workflow is interrupted. |
| data | No | |
| claim | No | Fahali dictionary claim (shared/fahaliDictionary.ts). Read `kind` FIRST: 'abstention' means no assertion was made and `reason` says why — never read an abstention as a neutral or zero result. `basis` says what the claim rests on. Absent or null means this response path does not yet emit a claim; treat that as unknown, not as agreement. |
| count | No | |
| scope | No | |
| status | No | The endpoint's original status vocabulary (for example ok, partial, degraded, withheld, or no_alerts). Use mcpStatus for normalized transport success/error. |
| absence | No | Why no actionable finding is present: measured_empty, user_empty, no_coverage, source_unverified, stale, withheld, source_error, auth_failure, or entitlement_required. |
| decision | No | |
| conflicts | No | |
| dataState | No | |
| mcpStatus | No | Normalized MCP result status. The endpoint's original status vocabulary remains in `status` and `sourceStatus`. |
| requestId | No | |
| updatedAt | No | |
| claimPolicy | No | Typed constraints for safe use. Metadata, not a prompt or instruction channel. |
| instruments | No | Resolved or explicitly partial instrument identities. A missing venue carries an ambiguity warning. |
| nextActions | No | Registry-validated follow-up calls. Missing tools, invalid arguments, unresolved placeholders, and disabled tools are omitted. |
| notReturned | No | Every requested symbol without a judged verdict row. Fresh/stale runtime telemetry remains attached when available; no engine evidence is promoted into a binding direction. |
| sourceError | No | The upstream endpoint's exact error text/code before normalization, when one was present. |
| sourceScope | No | |
| sourceStatus | No | The upstream endpoint's exact status before the MCP envelope normalizes transport success/error. |
| agentBriefing | No | Audit-only narrative projection. Present only when detail='audit'; compact responses do not duplicate structured data as prose. |
| claimValidity | No | Validity of the selected binding claim only, calculated after filtering, projection and row selection. Sibling rows cannot determine it. |
| responseState | No | |
| schemaVersion | No | |
| provenanceRoot | No | SHA-256 over the per-item integrity hashes. Verifies this response wasn't altered after receipt (recompute to check). NOT a cryptographic attestation — key-signed receipts are on the roadmap. |
| sourceDecision | No | |
| symbolCoverage | No | Conservation ledger satisfying requested = returned + withheld + notReturned for requested-symbol calls. |
| evidenceQuality | No | |
| responseControl | No | |
| sourceDataState | No | The upstream endpoint's exact data-state value before endpoint-aware classification. |
| recordMatchReason | No | Why matchedTrackRecord is present or null. A null record is never evidence of safety or engine failure. |
| requestedCoverage | No | |
| matchedTrackRecord | No | A judged record only when engine, horizon, regime/instrument class, and claim family match this response. `state` is one of: `measured` (a stratum cleared the publishability gate — `stratum` carries engine, horizon tier, bar regime, recall, precision, base rate, base-rate lift, median lead hours, effective sample, warned events and the measurement date); `withheld` (the gate ran and refused — `reason` says why, in words); `unavailable` (the record could not be read at all — an infrastructure failure that says nothing about the record). It is ONE stratum selected by recall, never a platform-wide accuracy. Null means no exact record match; read recordMatchReason. |
| confidenceSemantics | No | Every confidence-bearing value with its score type, scale, calibration status, and probability flag. |
| decisionEligibility | No | Fail-closed binding-authority policy. WITHHELD means source evidence remains available for audit while normalized direction, actionability and execution fields are revoked. |
| directionEligibility | No | Current market-direction eligibility. Direction is authorized only by an exact, eligible producer stratum (canonical_verdict, canonical_symbol_verdict, committee_verdict) — read bindingAuthority to see which one bound. Widening WHO may bind did not weaken WHAT binding requires: the named producer must still hold a matching horizon/class/family record on a verified-only judged population, so an authority without a record still cannot bind. |
| executionEligibility | No | Fail-closed execution boundary. Portfolio monitoring tools always return WITHHELD with MONITOR_ONLY_NO_EXECUTION_AUTHORITY while Fahali has no capital path. |
| monitoringEligibility | No | Current portfolio-monitoring validity based on captured identity, freshness, integrity, and the caller-supplied monitoring policy. ELIGIBLE authorizes observation/delivery only, never financial action. |
| sourceEvidenceQuality | No | |
| currentActionEligibility | No | Current eligibility of an immutable historical portfolio verdict. It never mutates the stored judgment being replayed. |
| sourceConfidenceSemantics | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only, idempotent, and non-destructive semantics, so the description's added value here is real: it discloses that the committee evidence is 'non-binding', that it is a thin alias performing 'no second computation', and that the payload includes runtime telemetry. It does not mention rate limits or entitlement behavior for contagion (that is only in the schema), but it materially extends the annotation profile.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences with the core identity and the 'no second computation' caveat front-loaded; nothing is redundant. The dense noun-stacking ('canonical-roster engine rows', 'runtime telemetry') costs some readability but does not waste space.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a seven-parameter, output-schema-backed read tool, the description covers what is returned, the non-binding nature of evidence, and the alias/no-recompute behavior. The one gap is that it never identifies which sibling is the 'canonical arbiter', so an agent cannot fully reason about duplication with fahali_get_market_decision.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with per-parameter descriptions for limit, since, detail, symbols, includeContagion, and include_withheld, so the schema carries the parameter burden. The description adds nothing about how any of these seven parameters affect the response, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific resource and scope: 'Primary single-instrument judgment' returning an authoritative direction, forecast, record, and invalidation. The 'single-instrument' qualifier meaningfully separates it from fahali_get_market_decision and fahali_get_portfolio_decision, though the jargon ('canonical arbiter', 'thin alias') is not defined.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Primary single-instrument judgment' implies it is the default entry point for one symbol, which is implied usage guidance. However, it never states when to prefer fahali_get_market_decision or fahali_get_portfolio_decision, and gives no explicit exclusions or prerequisites, leaving routing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fahali_get_track_record_scorecardARead-onlyIdempotent
Judged outcomes by engine, claim family, asset class, regime, and horizon, including misses, recall, precision, base rate, and effective sample. Never turn one row into platform-wide accuracy. A figure is repeatable only when publishable and must travel with its exact stratum and recall.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Optional maximum rows per projectable collection. Audit has no MCP projection cap; brief defaults to 3 and standard to 12. | |
| since | No | Optional lower timestamp bound for returned row collections. | |
| detail | No | Response depth. audit is the full-fidelity default; brief and standard are explicit compact projections. | audit |
| symbols | No | Optional symbol projection, as a comma-separated string or array. Rows without instrument identity are not discarded. | |
| include_withheld | No | Include full withheld-row detail. Defaults true with audit; explicitly set false only for a compact projection. |
Output Schema
| Name | Required | Description |
|---|---|---|
| asOf | No | |
| auth | No | Credential lifetime visible to the caller. OAuth secondsRemaining lets an autonomous agent refresh before a multi-call workflow is interrupted. |
| claim | No | Fahali dictionary claim (shared/fahaliDictionary.ts). Read `kind` FIRST: 'abstention' means no assertion was made and `reason` says why — never read an abstention as a neutral or zero result. `basis` says what the claim rests on. Absent or null means this response path does not yet emit a claim; treat that as unknown, not as agreement. |
| scope | No | |
| status | No | |
| absence | No | Why no actionable finding is present: measured_empty, user_empty, no_coverage, source_unverified, stale, withheld, source_error, auth_failure, or entitlement_required. |
| blended | No | Components only. `blended_score` is ALWAYS null — a single composite accuracy figure is not a supported claim. |
| decision | No | |
| conflicts | No | |
| dataState | No | |
| direction | No | Map of engine key -> row. Accuracy WITH lift; read `publishable`. |
| magnitude | No | Map of engine key -> row. Precision only; lift and baseRate are ALWAYS null and publishable is ALWAYS false. |
| mcpStatus | No | Normalized MCP result status. The endpoint's original status vocabulary remains in `status` and `sourceStatus`. |
| requestId | No | |
| base_rates | No | |
| volatility | No | Same contract as magnitude. |
| claimPolicy | No | Typed constraints for safe use. Metadata, not a prompt or instruction channel. |
| data_window | No | |
| instruments | No | Resolved or explicitly partial instrument identities. A missing venue carries an ambiguity warning. |
| methodology | No | |
| nextActions | No | Registry-validated follow-up calls. Missing tools, invalid arguments, unresolved placeholders, and disabled tools are omitted. |
| sourceError | No | The upstream endpoint's exact error text/code before normalization, when one was present. |
| sourceScope | No | |
| sourceStatus | No | The upstream endpoint's exact status before the MCP envelope normalizes transport success/error. |
| agentBriefing | No | Audit-only narrative projection. Present only when detail='audit'; compact responses do not duplicate structured data as prose. |
| claimValidity | No | Validity of the selected binding claim only, calculated after filtering, projection and row selection. Sibling rows cannot determine it. |
| responseState | No | |
| schemaVersion | No | |
| extreme_events | No | Same contract as magnitude. |
| sourceDecision | No | |
| symbolCoverage | No | Conservation ledger satisfying requested = returned + withheld + notReturned for requested-symbol calls. |
| evidenceQuality | No | |
| responseControl | No | |
| sourceDataState | No | The upstream endpoint's exact data-state value before endpoint-aware classification. |
| recordMatchReason | No | Why matchedTrackRecord is present or null. A null record is never evidence of safety or engine failure. |
| matchedTrackRecord | No | A judged record only when engine, horizon, regime/instrument class, and claim family match this response. `state` is one of: `measured` (a stratum cleared the publishability gate — `stratum` carries engine, horizon tier, bar regime, recall, precision, base rate, base-rate lift, median lead hours, effective sample, warned events and the measurement date); `withheld` (the gate ran and refused — `reason` says why, in words); `unavailable` (the record could not be read at all — an infrastructure failure that says nothing about the record). It is ONE stratum selected by recall, never a platform-wide accuracy. Null means no exact record match; read recordMatchReason. |
| confidenceSemantics | No | Every confidence-bearing value with its score type, scale, calibration status, and probability flag. |
| decisionEligibility | No | Fail-closed binding-authority policy. WITHHELD means source evidence remains available for audit while normalized direction, actionability and execution fields are revoked. |
| directionEligibility | No | Current market-direction eligibility. Direction is authorized only by an exact, eligible producer stratum (canonical_verdict, canonical_symbol_verdict, committee_verdict) — read bindingAuthority to see which one bound. Widening WHO may bind did not weaken WHAT binding requires: the named producer must still hold a matching horizon/class/family record on a verified-only judged population, so an authority without a record still cannot bind. |
| executionEligibility | No | Fail-closed execution boundary. Portfolio monitoring tools always return WITHHELD with MONITOR_ONLY_NO_EXECUTION_AUTHORITY while Fahali has no capital path. |
| base_rates_by_horizon | No | |
| monitoringEligibility | No | Current portfolio-monitoring validity based on captured identity, freshness, integrity, and the caller-supplied monitoring policy. ELIGIBLE authorizes observation/delivery only, never financial action. |
| sourceEvidenceQuality | No | |
| currentActionEligibility | No | Current eligibility of an immutable historical portfolio verdict. It never mutates the stored judgment being replayed. |
| sourceConfidenceSemantics | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover safety (readOnly, idempotent, non-destructive), so the description earns credit for adding substance beyond them: stratification, inclusion of misses and effective sample, a 'publishable' gating concept, and an explicit warning against generalizing a single row. Withheld-row and projection behavior are left to the schema rather than restated.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with the scope and metric inventory before the cautionary rules. Every sentence carries weight; only the phrase 'must travel with its exact stratum and recall' is slightly cryptic in wording.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With a full output schema and rich annotations already in place, the description supplies the one thing structured fields cannot: the epistemic framing (stratified, publishable-only, sample-size aware). It does not explain what distinguishes 'publishable' from 'withheld' rows, which would complete the picture.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema fully documents limit, since, detail, symbols, and include_withheld. The description adds no parameter-level detail beyond the existing enum and default semantics, which is acceptable at this coverage level but not additive.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific resource (judged outcomes / track record) and enumerates the stratifying dimensions (engine, claim family, asset class, regime, horizon) plus the metrics included (misses, recall, precision, base rate, effective sample). It is clearly distinct from siblings like get_engine_status or get_lead_time, though it lacks an explicit verb, describing the payload rather than the action.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The two closing sentences give interpretive rules ('never turn one row into platform-wide accuracy', 'repeatable only when publishable'), which tells the agent how to use the output but not when to call this tool instead of a sibling such as get_engine_status or get_verdict_history. Usage is implied rather than stated with alternatives or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fahali_get_unusual_money_movementARead-onlyIdempotent
Find symbols with elevated candle-derived buy-versus-sell volume imbalance. Returns the latest proxy reading, raw volumes, net imbalance, uncalibrated detection score, freshness, and any conflict between the stored signal label and net-flow sign. The measurement is participant-agnostic and does not infer whether one account caused the movement.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Source-side row depth. | |
| since | No | ISO-8601 lower bound, no more than 7 days ago. Defaults to 24h ago; unparseable values are rejected, never silently defaulted. | |
| detail | No | Response depth. audit is the full-fidelity default; brief and standard are explicit compact projections. | audit |
| symbols | No | Filter to these instruments (comma-separated string or array, max 100). Applied in SQL at the source. | |
| include_withheld | No | Include full withheld-row detail. Defaults true with audit; explicitly set false only for a compact projection. | |
| minimum_flow_usd | No | Minimum measured net imbalance in USD. THIS IS THE PRIMARY FILTER. It is a measured dollar magnitude, not a score: (buy_volume - sell_volume) * price. Set 0 to remove the magnitude floor. | |
| minimum_confidence | No | Minimum uncalibrated order-flow detection score. Not an outcome probability, and NOT a magnitude filter — the score is normalised per symbol, so it is flat across six orders of magnitude of money and cannot rank size. It is also effectively a BOOLEAN: the engine emits 0.0 or a value in [0.75, 0.95] and nothing between (measured over 421,157 production rows, 2026-09-14). Any value in (0, 0.75] therefore means the same thing — 'only rows the engine fired on'. Defaults to 0 so magnitude decides. Setting this to 0.5 alongside the default $250,000 floor returned ZERO rows on the day this was written; the two floors rarely coincide. |
Output Schema
| Name | Required | Description |
|---|---|---|
| asOf | No | |
| auth | No | Credential lifetime visible to the caller. OAuth secondsRemaining lets an autonomous agent refresh before a multi-call workflow is interrupted. |
| data | No | |
| claim | No | Fahali dictionary claim (shared/fahaliDictionary.ts). Read `kind` FIRST: 'abstention' means no assertion was made and `reason` says why — never read an abstention as a neutral or zero result. `basis` says what the claim rests on: this tool is PROXY-derived and can never be 'measured'. Absent or null means this response path does not yet emit a claim; treat that as unknown, not as agreement. |
| count | No | |
| scope | No | |
| status | No | The endpoint's original status vocabulary (for example ok, partial, degraded, withheld, or no_alerts). Use mcpStatus for normalized transport success/error. |
| absence | No | Why no actionable finding is present: measured_empty, user_empty, no_coverage, source_unverified, stale, withheld, source_error, auth_failure, or entitlement_required. |
| coverage | No | |
| decision | No | |
| evidence | No | |
| headline | No | |
| conflicts | No | |
| dataState | No | |
| mcpStatus | No | Normalized MCP result status. The endpoint's original status vocabulary remains in `status` and `sourceStatus`. |
| requestId | No | |
| dataOrigin | No | |
| provenance | No | |
| claimPolicy | No | Typed constraints for safe use. Metadata, not a prompt or instruction channel. |
| instruments | No | Resolved or explicitly partial instrument identities. A missing venue carries an ambiguity warning. |
| limitations | No | |
| nextActions | No | Registry-validated follow-up calls. Missing tools, invalid arguments, unresolved placeholders, and disabled tools are omitted. |
| notReturned | No | |
| sourceError | No | The upstream endpoint's exact error text/code before normalization, when one was present. |
| sourceScope | No | |
| sourceStatus | No | The upstream endpoint's exact status before the MCP envelope normalizes transport success/error. |
| agentBriefing | No | Audit-only narrative projection. Present only when detail='audit'; compact responses do not duplicate structured data as prose. |
| claimValidity | No | Validity of the selected binding claim only, calculated after filtering, projection and row selection. Sibling rows cannot determine it. |
| responseState | No | |
| schemaVersion | No | |
| sourceDecision | No | |
| symbolCoverage | No | Conservation ledger satisfying requested = returned + withheld + notReturned for requested-symbol calls. |
| evidenceQuality | No | |
| qualifyingCount | No | |
| responseControl | No | |
| sourceDataState | No | The upstream endpoint's exact data-state value before endpoint-aware classification. |
| recordMatchReason | No | Why matchedTrackRecord is present or null. A null record is never evidence of safety or engine failure. |
| matchedTrackRecord | No | A judged record only when engine, horizon, regime/instrument class, and claim family match this response. `state` is one of: `measured` (a stratum cleared the publishability gate — `stratum` carries engine, horizon tier, bar regime, recall, precision, base rate, base-rate lift, median lead hours, effective sample, warned events and the measurement date); `withheld` (the gate ran and refused — `reason` says why, in words); `unavailable` (the record could not be read at all — an infrastructure failure that says nothing about the record). It is ONE stratum selected by recall, never a platform-wide accuracy. Null means no exact record match; read recordMatchReason. |
| confidenceSemantics | No | Every confidence-bearing value with its score type, scale, calibration status, and probability flag. |
| decisionEligibility | No | Fail-closed binding-authority policy. WITHHELD means source evidence remains available for audit while normalized direction, actionability and execution fields are revoked. |
| directionEligibility | No | Current market-direction eligibility. Direction is authorized only by an exact, eligible producer stratum (canonical_verdict, canonical_symbol_verdict, committee_verdict) — read bindingAuthority to see which one bound. Widening WHO may bind did not weaken WHAT binding requires: the named producer must still hold a matching horizon/class/family record on a verified-only judged population, so an authority without a record still cannot bind. |
| executionEligibility | No | Fail-closed execution boundary. Portfolio monitoring tools always return WITHHELD with MONITOR_ONLY_NO_EXECUTION_AUTHORITY while Fahali has no capital path. |
| monitoringEligibility | No | Current portfolio-monitoring validity based on captured identity, freshness, integrity, and the caller-supplied monitoring policy. ELIGIBLE authorizes observation/delivery only, never financial action. |
| sourceEvidenceQuality | No | |
| currentActionEligibility | No | Current eligibility of an immutable historical portfolio verdict. It never mutates the stored judgment being replayed. |
| sourceConfidenceSemantics | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, yet the description still adds real value: what is returned (proxy reading, raw volumes, net imbalance, detection score, freshness, label-vs-sign conflict) and an explicit scope limit that the measurement is participant-agnostic and does not infer a causal account. Pagination/rate behavior is the only notable omission.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences, front-loaded with the core purpose, then return content, then scope caveat. Nothing is padding, though enumerating returned fields is slightly redundant given an output schema exists.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With a full output schema, rich parameter descriptions, and read-only annotations, the description supplies enough to call it correctly — what it screens for, what comes back, and that it makes no causal/account attribution. Only the missing alternative-tool routing keeps it short of full marks.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the schema itself explains parameters in exceptional depth (including the boolean-like scoring behavior and the $250,000 floor), so the description is not required to compensate. It adds no parameter-level meaning beyond what the schema already carries — correct baseline of 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a concrete verb and resource: 'Find symbols with elevated candle-derived buy-versus-sell volume imbalance.' That is specific enough to distinguish it from the many verdict/forecast siblings, though it never names an alternative tool explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage context is only implied — an agent can infer this is the flow-imbalance screener but is given no 'use this when / use X instead' routing, nor when to prefer it over fahali_get_capital_flow or fahali_get_highest_conviction_signals.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fahali_get_verdict_by_idARead-onlyIdempotent
Replay one immutable verdict by its permanent ID. Returns the exact mandate-aware decision, evidence references, delta, methodology, previous verdict, and integrity hashes recorded at that time. A missing ID returns no_data rather than substituting the latest judgment.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Optional maximum rows per projectable collection. Audit has no MCP projection cap; brief defaults to 3 and standard to 12. | |
| since | No | Optional lower timestamp bound for returned row collections. | |
| detail | No | Response depth. audit is the full-fidelity default; brief and standard are explicit compact projections. | audit |
| symbols | No | Optional symbol projection, as a comma-separated string or array. Rows without instrument identity are not discarded. | |
| verdict_id | Yes | ||
| include_withheld | No | Include full withheld-row detail. Defaults true with audit; explicitly set false only for a compact projection. |
Output Schema
| Name | Required | Description |
|---|---|---|
| asOf | No | |
| auth | No | Credential lifetime visible to the caller. OAuth secondsRemaining lets an autonomous agent refresh before a multi-call workflow is interrupted. |
| claim | No | Fahali dictionary claim (shared/fahaliDictionary.ts). Read `kind` FIRST: 'abstention' means no assertion was made and `reason` says why — never read an abstention as a neutral or zero result. `basis` says what the claim rests on. Absent or null means this response path does not yet emit a claim; treat that as unknown, not as agreement. |
| delta | No | |
| items | No | |
| scope | No | |
| watch | No | |
| status | Yes | |
| absence | No | Why no actionable finding is present: measured_empty, user_empty, no_coverage, source_unverified, stale, withheld, source_error, auth_failure, or entitlement_required. |
| verdict | No | |
| watches | No | |
| decision | No | |
| conflicts | No | |
| dataState | Yes | |
| mcpStatus | No | Normalized MCP result status. The endpoint's original status vocabulary remains in `status` and `sourceStatus`. |
| refreshed | No | |
| requestId | No | |
| verdictId | No | |
| nextCursor | No | |
| validUntil | No | |
| claimPolicy | No | Typed constraints for safe use. Metadata, not a prompt or instruction channel. |
| idempotency | No | |
| instruments | No | Resolved or explicitly partial instrument identities. A missing venue carries an ambiguity warning. |
| nextActions | No | Registry-validated follow-up calls. Missing tools, invalid arguments, unresolved placeholders, and disabled tools are omitted. |
| sourceError | No | The upstream endpoint's exact error text/code before normalization, when one was present. |
| sourceScope | No | |
| decisionHash | No | |
| evidenceHash | No | |
| sourceStatus | No | The upstream endpoint's exact status before the MCP envelope normalizes transport success/error. |
| subscription | No | |
| agentBriefing | No | Audit-only narrative projection. Present only when detail='audit'; compact responses do not duplicate structured data as prose. |
| claimValidity | No | Validity of the selected binding claim only, calculated after filtering, projection and row selection. Sibling rows cannot determine it. |
| operatingMode | Yes | |
| responseState | No | |
| schemaVersion | No | |
| signingSecret | No | |
| subscriptions | No | |
| authorityState | No | |
| sourceDecision | No | |
| symbolCoverage | No | Conservation ledger satisfying requested = returned + withheld + notReturned for requested-symbol calls. |
| evidenceQuality | No | |
| responseControl | No | |
| sourceDataState | No | The upstream endpoint's exact data-state value before endpoint-aware classification. |
| evidenceSnapshot | No | Compact immutable source snapshot needed to verify evidenceRef integrity on delta responses. |
| recordMatchReason | No | Why matchedTrackRecord is present or null. A null record is never evidence of safety or engine failure. |
| signingSecretNote | No | |
| matchedTrackRecord | No | A judged record only when engine, horizon, regime/instrument class, and claim family match this response. `state` is one of: `measured` (a stratum cleared the publishability gate — `stratum` carries engine, horizon tier, bar regime, recall, precision, base rate, base-rate lift, median lead hours, effective sample, warned events and the measurement date); `withheld` (the gate ran and refused — `reason` says why, in words); `unavailable` (the record could not be read at all — an infrastructure failure that says nothing about the record). It is ONE stratum selected by recall, never a platform-wide accuracy. Null means no exact record match; read recordMatchReason. |
| methodologyVersion | No | |
| confidenceSemantics | No | Every confidence-bearing value with its score type, scale, calibration status, and probability flag. |
| decisionEligibility | No | Fail-closed binding-authority policy. WITHHELD means source evidence remains available for audit while normalized direction, actionability and execution fields are revoked. |
| directionEligibility | No | Current market-direction eligibility. Direction is authorized only by an exact, eligible producer stratum (canonical_verdict, canonical_symbol_verdict, committee_verdict) — read bindingAuthority to see which one bound. Widening WHO may bind did not weaken WHAT binding requires: the named producer must still hold a matching horizon/class/family record on a verified-only judged population, so an authority without a record still cannot bind. |
| executionEligibility | No | Fail-closed execution boundary. Portfolio monitoring tools always return WITHHELD with MONITOR_ONLY_NO_EXECUTION_AUTHORITY while Fahali has no capital path. |
| legacyFieldSemantics | Yes | |
| outputClassification | Yes | |
| monitoringEligibility | No | Current portfolio-monitoring validity based on captured identity, freshness, integrity, and the caller-supplied monitoring policy. ELIGIBLE authorizes observation/delivery only, never financial action. |
| sourceEvidenceQuality | No | |
| currentActionEligibility | No | Current eligibility of an immutable historical portfolio verdict. It never mutates the stored judgment being replayed. |
| sourceConfidenceSemantics | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover readOnly/idempotent/non-destructive, so the bar is lower. The description adds real value: it enumerates returned artifacts (evidence refs, delta, methodology, integrity hashes) and, critically, states a missing ID yields no_data rather than substituting latest — a non-obvious behavioral guarantee.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences, front-loaded with the core action, then return contents, then the missing-ID edge case. Zero waste.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists so return values needn't be explained, yet the description still summarizes them helpfully, and it flags the no_data edge case. Adequate for an idempotent read-by-ID tool; only the absence of explicit alternative-routing keeps it from a 5.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 83%, so the schema documents most parameters (limit, detail, include_withheld, etc.). The description only reinforces the 'permanent ID' nature of verdict_id and adds no format or usage nuance beyond what the schema provides. Baseline 3 fits.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource: replay one immutable verdict by its permanent ID. The singular, ID-keyed nature clearly distinguishes it from list-oriented siblings like fahali_get_verdict_history, though no sibling is named explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Implied use case is retrieving a known past verdict by ID, and the no_data-on-missing behavior is useful. But it never states when to prefer this over get_verdict_history or the latest-judgment siblings, so routing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fahali_get_verdict_historyARead-onlyIdempotent
Query immutable portfolio verdict history by watch, symbol, time, or cursor. Use as_of to reconstruct what Fahali knew before a later market move. Every row binds the decision, evidence revision, mandate, methodology version, prior verdict, and content hash; empty history means no recorded judgment, not agreement.
| Name | Required | Description | Default |
|---|---|---|---|
| as_of | No | ||
| limit | No | ||
| since | No | ||
| cursor | No | ||
| detail | No | Response depth. audit is the full-fidelity default; brief and standard are explicit compact projections. | audit |
| symbol | No | ||
| symbols | No | Optional symbol projection, as a comma-separated string or array. Rows without instrument identity are not discarded. | |
| watch_id | No | ||
| include_withheld | No | Include full withheld-row detail. Defaults true with audit; explicitly set false only for a compact projection. |
Output Schema
| Name | Required | Description |
|---|---|---|
| asOf | No | |
| auth | No | Credential lifetime visible to the caller. OAuth secondsRemaining lets an autonomous agent refresh before a multi-call workflow is interrupted. |
| claim | No | Fahali dictionary claim (shared/fahaliDictionary.ts). Read `kind` FIRST: 'abstention' means no assertion was made and `reason` says why — never read an abstention as a neutral or zero result. `basis` says what the claim rests on. Absent or null means this response path does not yet emit a claim; treat that as unknown, not as agreement. |
| delta | No | |
| items | No | |
| scope | No | |
| watch | No | |
| status | Yes | |
| absence | No | Why no actionable finding is present: measured_empty, user_empty, no_coverage, source_unverified, stale, withheld, source_error, auth_failure, or entitlement_required. |
| verdict | No | |
| watches | No | |
| decision | No | |
| conflicts | No | |
| dataState | Yes | |
| mcpStatus | No | Normalized MCP result status. The endpoint's original status vocabulary remains in `status` and `sourceStatus`. |
| refreshed | No | |
| requestId | No | |
| verdictId | No | |
| nextCursor | No | |
| validUntil | No | |
| claimPolicy | No | Typed constraints for safe use. Metadata, not a prompt or instruction channel. |
| idempotency | No | |
| instruments | No | Resolved or explicitly partial instrument identities. A missing venue carries an ambiguity warning. |
| nextActions | No | Registry-validated follow-up calls. Missing tools, invalid arguments, unresolved placeholders, and disabled tools are omitted. |
| sourceError | No | The upstream endpoint's exact error text/code before normalization, when one was present. |
| sourceScope | No | |
| decisionHash | No | |
| evidenceHash | No | |
| sourceStatus | No | The upstream endpoint's exact status before the MCP envelope normalizes transport success/error. |
| subscription | No | |
| agentBriefing | No | Audit-only narrative projection. Present only when detail='audit'; compact responses do not duplicate structured data as prose. |
| claimValidity | No | Validity of the selected binding claim only, calculated after filtering, projection and row selection. Sibling rows cannot determine it. |
| operatingMode | Yes | |
| responseState | No | |
| schemaVersion | No | |
| signingSecret | No | |
| subscriptions | No | |
| authorityState | No | |
| sourceDecision | No | |
| symbolCoverage | No | Conservation ledger satisfying requested = returned + withheld + notReturned for requested-symbol calls. |
| evidenceQuality | No | |
| responseControl | No | |
| sourceDataState | No | The upstream endpoint's exact data-state value before endpoint-aware classification. |
| evidenceSnapshot | No | Compact immutable source snapshot needed to verify evidenceRef integrity on delta responses. |
| recordMatchReason | No | Why matchedTrackRecord is present or null. A null record is never evidence of safety or engine failure. |
| signingSecretNote | No | |
| matchedTrackRecord | No | A judged record only when engine, horizon, regime/instrument class, and claim family match this response. `state` is one of: `measured` (a stratum cleared the publishability gate — `stratum` carries engine, horizon tier, bar regime, recall, precision, base rate, base-rate lift, median lead hours, effective sample, warned events and the measurement date); `withheld` (the gate ran and refused — `reason` says why, in words); `unavailable` (the record could not be read at all — an infrastructure failure that says nothing about the record). It is ONE stratum selected by recall, never a platform-wide accuracy. Null means no exact record match; read recordMatchReason. |
| methodologyVersion | No | |
| confidenceSemantics | No | Every confidence-bearing value with its score type, scale, calibration status, and probability flag. |
| decisionEligibility | No | Fail-closed binding-authority policy. WITHHELD means source evidence remains available for audit while normalized direction, actionability and execution fields are revoked. |
| directionEligibility | No | Current market-direction eligibility. Direction is authorized only by an exact, eligible producer stratum (canonical_verdict, canonical_symbol_verdict, committee_verdict) — read bindingAuthority to see which one bound. Widening WHO may bind did not weaken WHAT binding requires: the named producer must still hold a matching horizon/class/family record on a verified-only judged population, so an authority without a record still cannot bind. |
| executionEligibility | No | Fail-closed execution boundary. Portfolio monitoring tools always return WITHHELD with MONITOR_ONLY_NO_EXECUTION_AUTHORITY while Fahali has no capital path. |
| legacyFieldSemantics | Yes | |
| outputClassification | Yes | |
| monitoringEligibility | No | Current portfolio-monitoring validity based on captured identity, freshness, integrity, and the caller-supplied monitoring policy. ELIGIBLE authorizes observation/delivery only, never financial action. |
| sourceEvidenceQuality | No | |
| currentActionEligibility | No | Current eligibility of an immutable historical portfolio verdict. It never mutates the stored judgment being replayed. |
| sourceConfidenceSemantics | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only, idempotent and non-destructive, so the added value is real: it discloses immutability, enumerates what each row binds (decision, evidence revision, mandate, methodology version, prior verdict, content hash), and — most usefully — that empty history means 'no recorded judgment, not agreement.' That caveat prevents a false-negative reading. Not disclosed: row ordering and how cursor pagination behaves, though both parameters exist.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, no filler, with purpose first, then the as_of use case, then row semantics and the empty-history caveat. Dense but every clause carries information; the clause listing all six bound fields is the only place it runs long.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return-shape explanation is unnecessary, and the description covers purpose, temporal semantics, and the misleading-empty-result case. Remaining gaps are ordering/cursor behavior and the limit default — minor for a zero-required-parameter read tool but relevant to correct pagination.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 33% (detail, symbols, include_withheld are documented inline), so the description must compensate. It does add genuine meaning for as_of (point-in-time reconstruction) and names the watch/symbol/time/cursor axes, but limit, since and watch_id receive no explanation beyond their type/format, leaving several params under-specified across both fields.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
A specific verb (query) and resource (immutable portfolio verdict history), with the filter axes named: watch, symbol, time, cursor. It is clearly not a live-verdict tool, but it never names the nearest siblings (fahali_get_verdict_by_id, fahali_get_watch_delta, fahali_get_portfolio_decision), so the boundary is inferred rather than stated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
"Use as_of to reconstruct what Fahali knew before a later market move" gives one concrete use case and implicitly motivates history over current state. There are no when-not conditions and no pointer to the by-id or delta alternatives, so selection among the many verdict-related siblings is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fahali_get_visual_intelligenceARead-onlyIdempotent
Graph-ready instrument clusters derived from current detection activity. Visual intensity and proximity are display rankings, not conviction, capital flow, causality, or direction. Use market verdict to obtain a claim and the glossary for field meanings.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Optional maximum rows per projectable collection. Audit has no MCP projection cap; brief defaults to 3 and standard to 12. | |
| since | No | Optional lower timestamp bound for returned row collections. | |
| detail | No | Response depth. audit is the full-fidelity default; brief and standard are explicit compact projections. | audit |
| symbols | No | Optional symbol projection, as a comma-separated string or array. Rows without instrument identity are not discarded. | |
| include_withheld | No | Include full withheld-row detail. Defaults true with audit; explicitly set false only for a compact projection. |
Output Schema
| Name | Required | Description |
|---|---|---|
| asOf | No | |
| auth | No | Credential lifetime visible to the caller. OAuth secondsRemaining lets an autonomous agent refresh before a multi-call workflow is interrupted. |
| claim | No | Fahali dictionary claim (shared/fahaliDictionary.ts). Read `kind` FIRST: 'abstention' means no assertion was made and `reason` says why — never read an abstention as a neutral or zero result. `basis` says what the claim rests on: this tool is PROXY-derived and can never be 'measured'. Absent or null means this response path does not yet emit a claim; treat that as unknown, not as agreement. |
| flows | No | |
| nodes | No | |
| scope | No | |
| state | No | |
| status | No | The endpoint's original status vocabulary (for example ok, partial, degraded, withheld, or no_alerts). Use mcpStatus for normalized transport success/error. |
| vortex | No | |
| absence | No | Why no actionable finding is present: measured_empty, user_empty, no_coverage, source_unverified, stale, withheld, source_error, auth_failure, or entitlement_required. |
| decision | No | |
| conflicts | No | |
| dataState | No | |
| mcpStatus | No | Normalized MCP result status. The endpoint's original status vocabulary remains in `status` and `sourceStatus`. |
| requestId | No | |
| timestamp | No | |
| dataOrigin | No | |
| disclaimer | No | |
| claimPolicy | No | Typed constraints for safe use. Metadata, not a prompt or instruction channel. |
| instruments | No | Resolved or explicitly partial instrument identities. A missing venue carries an ambiguity warning. |
| nextActions | No | Registry-validated follow-up calls. Missing tools, invalid arguments, unresolved placeholders, and disabled tools are omitted. |
| sourceError | No | The upstream endpoint's exact error text/code before normalization, when one was present. |
| sourceScope | No | |
| sourceStatus | No | The upstream endpoint's exact status before the MCP envelope normalizes transport success/error. |
| agentBriefing | No | Audit-only narrative projection. Present only when detail='audit'; compact responses do not duplicate structured data as prose. |
| claimValidity | No | Validity of the selected binding claim only, calculated after filtering, projection and row selection. Sibling rows cannot determine it. |
| marketContext | No | |
| responseState | No | |
| schemaVersion | No | |
| sourceDecision | No | |
| symbolCoverage | No | Conservation ledger satisfying requested = returned + withheld + notReturned for requested-symbol calls. |
| evidenceQuality | No | |
| responseControl | No | |
| sourceDataState | No | The upstream endpoint's exact data-state value before endpoint-aware classification. |
| recordMatchReason | No | Why matchedTrackRecord is present or null. A null record is never evidence of safety or engine failure. |
| matchedTrackRecord | No | A judged record only when engine, horizon, regime/instrument class, and claim family match this response. `state` is one of: `measured` (a stratum cleared the publishability gate — `stratum` carries engine, horizon tier, bar regime, recall, precision, base rate, base-rate lift, median lead hours, effective sample, warned events and the measurement date); `withheld` (the gate ran and refused — `reason` says why, in words); `unavailable` (the record could not be read at all — an infrastructure failure that says nothing about the record). It is ONE stratum selected by recall, never a platform-wide accuracy. Null means no exact record match; read recordMatchReason. |
| confidenceSemantics | No | Every confidence-bearing value with its score type, scale, calibration status, and probability flag. |
| decisionEligibility | No | Fail-closed binding-authority policy. WITHHELD means source evidence remains available for audit while normalized direction, actionability and execution fields are revoked. |
| directionEligibility | No | Current market-direction eligibility. Direction is authorized only by an exact, eligible producer stratum (canonical_verdict, canonical_symbol_verdict, committee_verdict) — read bindingAuthority to see which one bound. Widening WHO may bind did not weaken WHAT binding requires: the named producer must still hold a matching horizon/class/family record on a verified-only judged population, so an authority without a record still cannot bind. |
| executionEligibility | No | Fail-closed execution boundary. Portfolio monitoring tools always return WITHHELD with MONITOR_ONLY_NO_EXECUTION_AUTHORITY while Fahali has no capital path. |
| monitoringEligibility | No | Current portfolio-monitoring validity based on captured identity, freshness, integrity, and the caller-supplied monitoring policy. ELIGIBLE authorizes observation/delivery only, never financial action. |
| sourceEvidenceQuality | No | |
| currentActionEligibility | No | Current eligibility of an immutable historical portfolio verdict. It never mutates the stored judgment being replayed. |
| sourceConfidenceSemantics | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (read-only, idempotent, non-destructive, open-world), and the description adds important interpretive context: visual intensity and proximity are display rankings, not conviction, capital flow, causality, or direction. This is valuable behavioral guidance beyond the annotations, though it does not discuss auth, rate limits, or response shape.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, each with a distinct job: state the output, constrain interpretation, and point to companion resources. It is front-loaded and free of repetition or filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, annotations covering safety, and full schema description coverage, the description is largely complete. It adds the critical caveat about display rankings and companion-tool references, though it could better explain when this tool should be selected relative to similar detection or market tools.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the input schema already documents all five parameters, including limit, detail, symbols, since, and include_withheld. The description adds no parameter-specific meaning, so the baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states the resource and source clearly: graph-ready instrument clusters derived from current detection activity. It also distinguishes the output from conviction-style signals by calling intensity/proximity display rankings, though it does not explicitly contrast with sibling tools like detection activity or market snapshot.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives implied usage through the caveat that the output is a visual/display ranking, and it explicitly redirects claim-seeking to market verdict and field meanings to the glossary. However, it does not clearly state when to choose this tool over siblings such as fahali_get_detection_activity or fahali_get_market_snapshot.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fahali_get_watch_deltaA
Return only what changed for a persistent monitor-only watch: escalation label, risk band, direction, evidence coverage, threshold crossings, new evidence, and previous/current immutable verdict IDs. Defaults to a fresh evaluation. An unchanged result is explicit and never interpreted as market safety or permission to trade.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Optional maximum rows per projectable collection. Audit has no MCP projection cap; brief defaults to 3 and standard to 12. | |
| since | No | Optional lower timestamp bound for returned row collections. | |
| detail | No | Response depth. audit is the full-fidelity default; brief and standard are explicit compact projections. | audit |
| refresh | No | True re-evaluates and may persist a new verdict (requires write:portfolio). False compares stored verdicts only (read:portfolio). | |
| symbols | No | Optional symbol projection, as a comma-separated string or array. Rows without instrument identity are not discarded. | |
| watch_id | Yes | ||
| include_withheld | No | Include full withheld-row detail. Defaults true with audit; explicitly set false only for a compact projection. |
Output Schema
| Name | Required | Description |
|---|---|---|
| asOf | No | |
| auth | No | Credential lifetime visible to the caller. OAuth secondsRemaining lets an autonomous agent refresh before a multi-call workflow is interrupted. |
| claim | No | Fahali dictionary claim (shared/fahaliDictionary.ts). Read `kind` FIRST: 'abstention' means no assertion was made and `reason` says why — never read an abstention as a neutral or zero result. `basis` says what the claim rests on. Absent or null means this response path does not yet emit a claim; treat that as unknown, not as agreement. |
| delta | No | |
| items | No | |
| scope | No | |
| watch | No | |
| status | Yes | |
| absence | No | Why no actionable finding is present: measured_empty, user_empty, no_coverage, source_unverified, stale, withheld, source_error, auth_failure, or entitlement_required. |
| verdict | No | |
| watches | No | |
| decision | No | |
| conflicts | No | |
| dataState | Yes | |
| mcpStatus | No | Normalized MCP result status. The endpoint's original status vocabulary remains in `status` and `sourceStatus`. |
| refreshed | No | |
| requestId | No | |
| verdictId | No | |
| nextCursor | No | |
| validUntil | No | |
| claimPolicy | No | Typed constraints for safe use. Metadata, not a prompt or instruction channel. |
| idempotency | No | |
| instruments | No | Resolved or explicitly partial instrument identities. A missing venue carries an ambiguity warning. |
| nextActions | No | Registry-validated follow-up calls. Missing tools, invalid arguments, unresolved placeholders, and disabled tools are omitted. |
| sourceError | No | The upstream endpoint's exact error text/code before normalization, when one was present. |
| sourceScope | No | |
| decisionHash | No | |
| evidenceHash | No | |
| sourceStatus | No | The upstream endpoint's exact status before the MCP envelope normalizes transport success/error. |
| subscription | No | |
| agentBriefing | No | Audit-only narrative projection. Present only when detail='audit'; compact responses do not duplicate structured data as prose. |
| claimValidity | No | Validity of the selected binding claim only, calculated after filtering, projection and row selection. Sibling rows cannot determine it. |
| operatingMode | Yes | |
| responseState | No | |
| schemaVersion | No | |
| signingSecret | No | |
| subscriptions | No | |
| authorityState | No | |
| sourceDecision | No | |
| symbolCoverage | No | Conservation ledger satisfying requested = returned + withheld + notReturned for requested-symbol calls. |
| evidenceQuality | No | |
| responseControl | No | |
| sourceDataState | No | The upstream endpoint's exact data-state value before endpoint-aware classification. |
| evidenceSnapshot | No | Compact immutable source snapshot needed to verify evidenceRef integrity on delta responses. |
| recordMatchReason | No | Why matchedTrackRecord is present or null. A null record is never evidence of safety or engine failure. |
| signingSecretNote | No | |
| matchedTrackRecord | No | A judged record only when engine, horizon, regime/instrument class, and claim family match this response. `state` is one of: `measured` (a stratum cleared the publishability gate — `stratum` carries engine, horizon tier, bar regime, recall, precision, base rate, base-rate lift, median lead hours, effective sample, warned events and the measurement date); `withheld` (the gate ran and refused — `reason` says why, in words); `unavailable` (the record could not be read at all — an infrastructure failure that says nothing about the record). It is ONE stratum selected by recall, never a platform-wide accuracy. Null means no exact record match; read recordMatchReason. |
| methodologyVersion | No | |
| confidenceSemantics | No | Every confidence-bearing value with its score type, scale, calibration status, and probability flag. |
| decisionEligibility | No | Fail-closed binding-authority policy. WITHHELD means source evidence remains available for audit while normalized direction, actionability and execution fields are revoked. |
| directionEligibility | No | Current market-direction eligibility. Direction is authorized only by an exact, eligible producer stratum (canonical_verdict, canonical_symbol_verdict, committee_verdict) — read bindingAuthority to see which one bound. Widening WHO may bind did not weaken WHAT binding requires: the named producer must still hold a matching horizon/class/family record on a verified-only judged population, so an authority without a record still cannot bind. |
| executionEligibility | No | Fail-closed execution boundary. Portfolio monitoring tools always return WITHHELD with MONITOR_ONLY_NO_EXECUTION_AUTHORITY while Fahali has no capital path. |
| legacyFieldSemantics | Yes | |
| outputClassification | Yes | |
| monitoringEligibility | No | Current portfolio-monitoring validity based on captured identity, freshness, integrity, and the caller-supplied monitoring policy. ELIGIBLE authorizes observation/delivery only, never financial action. |
| sourceEvidenceQuality | No | |
| currentActionEligibility | No | Current eligibility of an immutable historical portfolio verdict. It never mutates the stored judgment being replayed. |
| sourceConfidenceSemantics | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, openWorldHint=true, and idempotentHint=false, so the agent knows this is not a pure read. The description adds a genuine interpretive caveat that annotations cannot convey: an unchanged result is explicit and must not be read as market safety or trading permission. It stops short of disclosing the write side effect (a new verdict may be persisted) or the write:portfolio requirement, both of which live only in the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the core verb and returned fields, with the caution placed last. The field enumeration is dense but each item earns its place by defining the delta payload; no filler or restated title.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present and 86% schema coverage, the description need not explain return structure, and it correctly focuses on the delta semantics and the unchanged-result caveat. The remaining gap is routing guidance against the many sibling verdict/decision tools.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 86%, so the schema already documents limit, since, detail, refresh, symbols, and include_withheld thoroughly. The only parameter-adjacent statement in the description, 'Defaults to a fresh evaluation,' restates the refresh default already given in the schema, adding no new syntax or behavior detail.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Return only what changed for a persistent monitor-only watch') and enumerates exactly which fields constitute the delta: escalation label, risk band, direction, evidence coverage, threshold crossings, new evidence, and verdict IDs. This distinguishes it from adjacent siblings like fahali_get_verdict_history or fahali_get_portfolio_decision without needing to name them.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied — poll an existing watch for changes — and the note that it 'Defaults to a fresh evaluation' clarifies the default mode. However, it never states when to choose this over siblings such as fahali_get_portfolio_decision (full verdict) or fahali_get_verdict_history, nor any exclusion or precondition.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fahali_list_agent_sessionsBRead-onlyIdempotent
List all sessions for the current agent. Returns session metadata including first seen, last active, memory count, and active status.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Optional maximum rows per projectable collection. Audit has no MCP projection cap; brief defaults to 3 and standard to 12. | |
| since | No | Optional lower timestamp bound for returned row collections. | |
| detail | No | Response depth. audit is the full-fidelity default; brief and standard are explicit compact projections. | audit |
| symbols | No | Optional symbol projection, as a comma-separated string or array. Rows without instrument identity are not discarded. | |
| include_withheld | No | Include full withheld-row detail. Defaults true with audit; explicitly set false only for a compact projection. |
Output Schema
| Name | Required | Description |
|---|---|---|
| asOf | No | |
| auth | No | Credential lifetime visible to the caller. OAuth secondsRemaining lets an autonomous agent refresh before a multi-call workflow is interrupted. |
| claim | No | Fahali dictionary claim (shared/fahaliDictionary.ts). Read `kind` FIRST: 'abstention' means no assertion was made and `reason` says why — never read an abstention as a neutral or zero result. `basis` says what the claim rests on. Absent or null means this response path does not yet emit a claim; treat that as unknown, not as agreement. |
| scope | No | |
| status | No | The endpoint's original status vocabulary (for example ok, partial, degraded, withheld, or no_alerts). Use mcpStatus for normalized transport success/error. |
| absence | No | Why no actionable finding is present: measured_empty, user_empty, no_coverage, source_unverified, stale, withheld, source_error, auth_failure, or entitlement_required. |
| decision | No | |
| sessions | No | |
| conflicts | No | |
| dataState | No | |
| mcpStatus | No | Normalized MCP result status. The endpoint's original status vocabulary remains in `status` and `sourceStatus`. |
| requestId | No | |
| claimPolicy | No | Typed constraints for safe use. Metadata, not a prompt or instruction channel. |
| instruments | No | Resolved or explicitly partial instrument identities. A missing venue carries an ambiguity warning. |
| nextActions | No | Registry-validated follow-up calls. Missing tools, invalid arguments, unresolved placeholders, and disabled tools are omitted. |
| sourceError | No | The upstream endpoint's exact error text/code before normalization, when one was present. |
| sourceScope | No | |
| sourceStatus | No | The upstream endpoint's exact status before the MCP envelope normalizes transport success/error. |
| agentBriefing | No | Audit-only narrative projection. Present only when detail='audit'; compact responses do not duplicate structured data as prose. |
| claimValidity | No | Validity of the selected binding claim only, calculated after filtering, projection and row selection. Sibling rows cannot determine it. |
| responseState | No | |
| schemaVersion | No | |
| sourceDecision | No | |
| symbolCoverage | No | Conservation ledger satisfying requested = returned + withheld + notReturned for requested-symbol calls. |
| evidenceQuality | No | |
| responseControl | No | |
| sourceDataState | No | The upstream endpoint's exact data-state value before endpoint-aware classification. |
| recordMatchReason | No | Why matchedTrackRecord is present or null. A null record is never evidence of safety or engine failure. |
| matchedTrackRecord | No | A judged record only when engine, horizon, regime/instrument class, and claim family match this response. `state` is one of: `measured` (a stratum cleared the publishability gate — `stratum` carries engine, horizon tier, bar regime, recall, precision, base rate, base-rate lift, median lead hours, effective sample, warned events and the measurement date); `withheld` (the gate ran and refused — `reason` says why, in words); `unavailable` (the record could not be read at all — an infrastructure failure that says nothing about the record). It is ONE stratum selected by recall, never a platform-wide accuracy. Null means no exact record match; read recordMatchReason. |
| confidenceSemantics | No | Every confidence-bearing value with its score type, scale, calibration status, and probability flag. |
| decisionEligibility | No | Fail-closed binding-authority policy. WITHHELD means source evidence remains available for audit while normalized direction, actionability and execution fields are revoked. |
| directionEligibility | No | Current market-direction eligibility. Direction is authorized only by an exact, eligible producer stratum (canonical_verdict, canonical_symbol_verdict, committee_verdict) — read bindingAuthority to see which one bound. Widening WHO may bind did not weaken WHAT binding requires: the named producer must still hold a matching horizon/class/family record on a verified-only judged population, so an authority without a record still cannot bind. |
| executionEligibility | No | Fail-closed execution boundary. Portfolio monitoring tools always return WITHHELD with MONITOR_ONLY_NO_EXECUTION_AUTHORITY while Fahali has no capital path. |
| monitoringEligibility | No | Current portfolio-monitoring validity based on captured identity, freshness, integrity, and the caller-supplied monitoring policy. ELIGIBLE authorizes observation/delivery only, never financial action. |
| sourceEvidenceQuality | No | |
| currentActionEligibility | No | Current eligibility of an immutable historical portfolio verdict. It never mutates the stored judgment being replayed. |
| sourceConfidenceSemantics | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false, and openWorldHint=false, so the safety profile is fully covered. The description adds the returned field set (first seen, last active, memory count, active status), which is genuine value, but says nothing about scoping to 'the current agent' (identity/auth), result ordering, or volume/pagination behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences with no wasted phrasing, and the core action is front-loaded. The second sentence is a useful enumeration rather than filler, though it could have been used for scoping or usage context instead.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists and annotations cover the safety profile, so the description needn't explain return formats or side effects. What's left thin is the 'current agent' scoping and how the audit/brief/standard projections change the result, but those are largely handled by the schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and every parameter (limit, since, detail, symbols, include_withheld) is documented in the schema, so the baseline is 3. The description contributes nothing about limit, since, or the detail projections, which matters here because 'detail' and 'include_withheld' interact in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clear verb+resource: 'List all sessions for the current agent', plus the specific metadata fields returned. It does not need to distinguish itself from a near-identical sibling since no other session-listing tool exists, though it also doesn't mention the closely related memory tools (fahali_search_memories, fahali_save_memory) that work on the same session data.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives no guidance on when to call this versus alternatives such as fahali_search_memories or fahali_list_resources. It also doesn't say when you'd want a compact projection versus the audit default, so the agent must infer invocation context entirely.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fahali_list_connected_accountsARead-onlyIdempotent
List the authenticated user's connected accounts before requesting portfolio analysis. Returns provider, display name, connection state, last sync, equity, currency, and position count. Broker account numbers, credentials, user identifiers, and provider metadata are never returned. No accounts is an explicit no_data state, not a portfolio all-clear.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Optional maximum rows per projectable collection. Audit has no MCP projection cap; brief defaults to 3 and standard to 12. | |
| since | No | Optional lower timestamp bound for returned row collections. | |
| detail | No | Response depth. audit is the full-fidelity default; brief and standard are explicit compact projections. | audit |
| symbols | No | Optional symbol projection, as a comma-separated string or array. Rows without instrument identity are not discarded. | |
| include_withheld | No | Include full withheld-row detail. Defaults true with audit; explicitly set false only for a compact projection. |
Output Schema
| Name | Required | Description |
|---|---|---|
| asOf | No | |
| auth | No | Credential lifetime visible to the caller. OAuth secondsRemaining lets an autonomous agent refresh before a multi-call workflow is interrupted. |
| claim | No | Fahali dictionary claim (shared/fahaliDictionary.ts). Read `kind` FIRST: 'abstention' means no assertion was made and `reason` says why — never read an abstention as a neutral or zero result. `basis` says what the claim rests on. Absent or null means this response path does not yet emit a claim; treat that as unknown, not as agreement. |
| count | Yes | |
| scope | No | |
| reason | No | |
| status | Yes | |
| absence | No | Why no actionable finding is present: measured_empty, user_empty, no_coverage, source_unverified, stale, withheld, source_error, auth_failure, or entitlement_required. |
| accounts | Yes | |
| decision | No | |
| conflicts | No | |
| dataState | Yes | |
| mcpStatus | No | Normalized MCP result status. The endpoint's original status vocabulary remains in `status` and `sourceStatus`. |
| requestId | No | |
| claimPolicy | No | Typed constraints for safe use. Metadata, not a prompt or instruction channel. |
| instruments | No | Resolved or explicitly partial instrument identities. A missing venue carries an ambiguity warning. |
| nextActions | No | Registry-validated follow-up calls. Missing tools, invalid arguments, unresolved placeholders, and disabled tools are omitted. |
| sourceError | No | The upstream endpoint's exact error text/code before normalization, when one was present. |
| sourceScope | No | |
| sourceStatus | No | The upstream endpoint's exact status before the MCP envelope normalizes transport success/error. |
| agentBriefing | No | Audit-only narrative projection. Present only when detail='audit'; compact responses do not duplicate structured data as prose. |
| claimValidity | No | Validity of the selected binding claim only, calculated after filtering, projection and row selection. Sibling rows cannot determine it. |
| responseState | No | |
| schemaVersion | No | |
| sourceDecision | No | |
| symbolCoverage | No | Conservation ledger satisfying requested = returned + withheld + notReturned for requested-symbol calls. |
| evidenceQuality | No | |
| responseControl | No | |
| sourceDataState | No | The upstream endpoint's exact data-state value before endpoint-aware classification. |
| recordMatchReason | No | Why matchedTrackRecord is present or null. A null record is never evidence of safety or engine failure. |
| matchedTrackRecord | No | A judged record only when engine, horizon, regime/instrument class, and claim family match this response. `state` is one of: `measured` (a stratum cleared the publishability gate — `stratum` carries engine, horizon tier, bar regime, recall, precision, base rate, base-rate lift, median lead hours, effective sample, warned events and the measurement date); `withheld` (the gate ran and refused — `reason` says why, in words); `unavailable` (the record could not be read at all — an infrastructure failure that says nothing about the record). It is ONE stratum selected by recall, never a platform-wide accuracy. Null means no exact record match; read recordMatchReason. |
| confidenceSemantics | No | Every confidence-bearing value with its score type, scale, calibration status, and probability flag. |
| decisionEligibility | No | Fail-closed binding-authority policy. WITHHELD means source evidence remains available for audit while normalized direction, actionability and execution fields are revoked. |
| directionEligibility | No | Current market-direction eligibility. Direction is authorized only by an exact, eligible producer stratum (canonical_verdict, canonical_symbol_verdict, committee_verdict) — read bindingAuthority to see which one bound. Widening WHO may bind did not weaken WHAT binding requires: the named producer must still hold a matching horizon/class/family record on a verified-only judged population, so an authority without a record still cannot bind. |
| executionEligibility | No | Fail-closed execution boundary. Portfolio monitoring tools always return WITHHELD with MONITOR_ONLY_NO_EXECUTION_AUTHORITY while Fahali has no capital path. |
| monitoringEligibility | No | Current portfolio-monitoring validity based on captured identity, freshness, integrity, and the caller-supplied monitoring policy. ELIGIBLE authorizes observation/delivery only, never financial action. |
| sourceEvidenceQuality | No | |
| currentActionEligibility | No | Current eligibility of an immutable historical portfolio verdict. It never mutates the stored judgment being replayed. |
| sourceConfidenceSemantics | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive, closed-world), so the description earns credit for the extra context it supplies: the privacy guarantee that account numbers, credentials, and user identifiers are never returned, plus the empty-result semantics. What's missing is any note on pagination or projection behavior driven by the detail/limit parameters.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, each carrying distinct information: purpose plus workflow placement, return shape, and then two behavioral caveats. Nothing is repeated and the most decision-relevant content is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present and full parameter documentation, the description covers the remaining burden well: workflow ordering, privacy boundaries, and the no_data state. It could say slightly more about what the agent should do after receiving no_data, but nothing needed to call the tool correctly is absent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with limit, since, detail, symbols, and include_withheld all documented in the schema, including the brief/standard/audit tiers. The description mentions none of these controls and adds no syntax or format detail, so it does not improve on the schema here — the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List the authenticated user's connected accounts') and immediately identifies the return payload (provider, display name, connection state, last sync, equity, currency, position count). This clearly separates it from the analysis-oriented siblings like fahali_analyze_custom_portfolio or fahali_get_portfolio_metrics.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'before requesting portfolio analysis' gives an explicit ordering cue that tells the agent where this tool sits in a workflow. It stops short of naming a concrete alternative tool or stating when-not-to-call, so it is clear context but not full routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fahali_list_portfolio_watchesARead-onlyIdempotent
List the caller's persistent portfolio watches, including mandate, thresholds, source, status, and latest verdict ID. Use this before asking the user to recreate a watch. A missing list means no watch exists; it is not a calm-market reading.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| since | No | Optional lower timestamp bound for returned row collections. | |
| detail | No | Response depth. audit is the full-fidelity default; brief and standard are explicit compact projections. | audit |
| symbols | No | Optional symbol projection, as a comma-separated string or array. Rows without instrument identity are not discarded. | |
| include_withheld | No | Include full withheld-row detail. Defaults true with audit; explicitly set false only for a compact projection. |
Output Schema
| Name | Required | Description |
|---|---|---|
| asOf | No | |
| auth | No | Credential lifetime visible to the caller. OAuth secondsRemaining lets an autonomous agent refresh before a multi-call workflow is interrupted. |
| claim | No | Fahali dictionary claim (shared/fahaliDictionary.ts). Read `kind` FIRST: 'abstention' means no assertion was made and `reason` says why — never read an abstention as a neutral or zero result. `basis` says what the claim rests on. Absent or null means this response path does not yet emit a claim; treat that as unknown, not as agreement. |
| delta | No | |
| items | No | |
| scope | No | |
| watch | No | |
| status | Yes | |
| absence | No | Why no actionable finding is present: measured_empty, user_empty, no_coverage, source_unverified, stale, withheld, source_error, auth_failure, or entitlement_required. |
| verdict | No | |
| watches | No | |
| decision | No | |
| conflicts | No | |
| dataState | Yes | |
| mcpStatus | No | Normalized MCP result status. The endpoint's original status vocabulary remains in `status` and `sourceStatus`. |
| refreshed | No | |
| requestId | No | |
| verdictId | No | |
| nextCursor | No | |
| validUntil | No | |
| claimPolicy | No | Typed constraints for safe use. Metadata, not a prompt or instruction channel. |
| idempotency | No | |
| instruments | No | Resolved or explicitly partial instrument identities. A missing venue carries an ambiguity warning. |
| nextActions | No | Registry-validated follow-up calls. Missing tools, invalid arguments, unresolved placeholders, and disabled tools are omitted. |
| sourceError | No | The upstream endpoint's exact error text/code before normalization, when one was present. |
| sourceScope | No | |
| decisionHash | No | |
| evidenceHash | No | |
| sourceStatus | No | The upstream endpoint's exact status before the MCP envelope normalizes transport success/error. |
| subscription | No | |
| agentBriefing | No | Audit-only narrative projection. Present only when detail='audit'; compact responses do not duplicate structured data as prose. |
| claimValidity | No | Validity of the selected binding claim only, calculated after filtering, projection and row selection. Sibling rows cannot determine it. |
| operatingMode | Yes | |
| responseState | No | |
| schemaVersion | No | |
| signingSecret | No | |
| subscriptions | No | |
| authorityState | No | |
| sourceDecision | No | |
| symbolCoverage | No | Conservation ledger satisfying requested = returned + withheld + notReturned for requested-symbol calls. |
| evidenceQuality | No | |
| responseControl | No | |
| sourceDataState | No | The upstream endpoint's exact data-state value before endpoint-aware classification. |
| evidenceSnapshot | No | Compact immutable source snapshot needed to verify evidenceRef integrity on delta responses. |
| recordMatchReason | No | Why matchedTrackRecord is present or null. A null record is never evidence of safety or engine failure. |
| signingSecretNote | No | |
| matchedTrackRecord | No | A judged record only when engine, horizon, regime/instrument class, and claim family match this response. `state` is one of: `measured` (a stratum cleared the publishability gate — `stratum` carries engine, horizon tier, bar regime, recall, precision, base rate, base-rate lift, median lead hours, effective sample, warned events and the measurement date); `withheld` (the gate ran and refused — `reason` says why, in words); `unavailable` (the record could not be read at all — an infrastructure failure that says nothing about the record). It is ONE stratum selected by recall, never a platform-wide accuracy. Null means no exact record match; read recordMatchReason. |
| methodologyVersion | No | |
| confidenceSemantics | No | Every confidence-bearing value with its score type, scale, calibration status, and probability flag. |
| decisionEligibility | No | Fail-closed binding-authority policy. WITHHELD means source evidence remains available for audit while normalized direction, actionability and execution fields are revoked. |
| directionEligibility | No | Current market-direction eligibility. Direction is authorized only by an exact, eligible producer stratum (canonical_verdict, canonical_symbol_verdict, committee_verdict) — read bindingAuthority to see which one bound. Widening WHO may bind did not weaken WHAT binding requires: the named producer must still hold a matching horizon/class/family record on a verified-only judged population, so an authority without a record still cannot bind. |
| executionEligibility | No | Fail-closed execution boundary. Portfolio monitoring tools always return WITHHELD with MONITOR_ONLY_NO_EXECUTION_AUTHORITY while Fahali has no capital path. |
| legacyFieldSemantics | Yes | |
| outputClassification | Yes | |
| monitoringEligibility | No | Current portfolio-monitoring validity based on captured identity, freshness, integrity, and the caller-supplied monitoring policy. ELIGIBLE authorizes observation/delivery only, never financial action. |
| sourceEvidenceQuality | No | |
| currentActionEligibility | No | Current eligibility of an immutable historical portfolio verdict. It never mutates the stored judgment being replayed. |
| sourceConfidenceSemantics | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish read-only, idempotent, non-destructive behavior, so the description is free to add interpretation semantics instead of repeating them. The line "A missing list means no watch exists; it is not a calm-market reading" is a genuinely useful, non-obvious guard against misreading an empty response. It does not address ordering or pagination beyond the schema's limit.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences: the first states scope and payload, the second the usage trigger, the third the empty-result caveat. Nothing is repeated from annotations and the most decision-relevant content is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, the description needn't explain return values, and the read-only annotations cover the safety profile; the description correctly focuses on purpose and result interpretation. A note on whether the caller's watches span symbols/accounts by default would close the remaining gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 80%, so the schema itself carries the parameter burden and baseline 3 applies. The description adds nothing about limit, since, symbols, or the brief/standard/audit projection tradeoff, leaving those entirely to the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("List the caller's persistent portfolio watches") and enumerates the returned fields (mandate, thresholds, source, status, latest verdict ID). This distinguishes it cleanly from the sibling mutators fahali_watch_portfolio and fahali_update_portfolio_watch, and from fahali_list_risk_subscriptions.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
"Use this before asking the user to recreate a watch" gives an explicit precondition for calling it, and the empty-result caveat tells the agent what not to conclude. It never names a specific alternative sibling (e.g. get_watch_delta for change history), so it stops short of full when/when-not routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fahali_list_resourcesARead-onlyIdempotent
List every readable Fahali resource, derived from the live API router rather than a hand-maintained list. Each entry gives its path, parameters, and the gates it enforces, so you see what a route requires before calling. Excluded routes are returned with reasons. Discover here, then call fahali_fetch_resource. Purpose-built tools stay better when one covers your question.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Optional maximum rows per projectable collection. Audit has no MCP projection cap; brief defaults to 3 and standard to 12. | |
| since | No | Optional lower timestamp bound for returned row collections. | |
| detail | No | Response depth. audit is the full-fidelity default; brief and standard are explicit compact projections. | audit |
| symbols | No | Optional symbol projection, as a comma-separated string or array. Rows without instrument identity are not discarded. | |
| include_withheld | No | Include full withheld-row detail. Defaults true with audit; explicitly set false only for a compact projection. |
Output Schema
| Name | Required | Description |
|---|---|---|
| asOf | No | |
| auth | No | Credential lifetime visible to the caller. OAuth secondsRemaining lets an autonomous agent refresh before a multi-call workflow is interrupted. |
| basis | No | |
| claim | No | Fahali dictionary claim (shared/fahaliDictionary.ts). Read `kind` FIRST: 'abstention' means no assertion was made and `reason` says why — never read an abstention as a neutral or zero result. `basis` says what the claim rests on. Absent or null means this response path does not yet emit a claim; treat that as unknown, not as agreement. |
| scope | No | |
| counts | No | |
| status | No | The endpoint's original status vocabulary (for example ok, partial, degraded, withheld, or no_alerts). Use mcpStatus for normalized transport success/error. |
| absence | No | Why no actionable finding is present: measured_empty, user_empty, no_coverage, source_unverified, stale, withheld, source_error, auth_failure, or entitlement_required. |
| decision | No | |
| excluded | No | |
| conflicts | No | |
| dataState | No | |
| mcpStatus | No | Normalized MCP result status. The endpoint's original status vocabulary remains in `status` and `sourceStatus`. |
| requestId | No | |
| resources | No | |
| claimPolicy | No | Typed constraints for safe use. Metadata, not a prompt or instruction channel. |
| instruments | No | Resolved or explicitly partial instrument identities. A missing venue carries an ambiguity warning. |
| nextActions | No | Registry-validated follow-up calls. Missing tools, invalid arguments, unresolved placeholders, and disabled tools are omitted. |
| sourceError | No | The upstream endpoint's exact error text/code before normalization, when one was present. |
| sourceScope | No | |
| sourceStatus | No | The upstream endpoint's exact status before the MCP envelope normalizes transport success/error. |
| agentBriefing | No | Audit-only narrative projection. Present only when detail='audit'; compact responses do not duplicate structured data as prose. |
| claimValidity | No | Validity of the selected binding claim only, calculated after filtering, projection and row selection. Sibling rows cannot determine it. |
| responseState | No | |
| schemaVersion | No | |
| sourceDecision | No | |
| symbolCoverage | No | Conservation ledger satisfying requested = returned + withheld + notReturned for requested-symbol calls. |
| evidenceQuality | No | |
| responseControl | No | |
| sourceDataState | No | The upstream endpoint's exact data-state value before endpoint-aware classification. |
| recordMatchReason | No | Why matchedTrackRecord is present or null. A null record is never evidence of safety or engine failure. |
| matchedTrackRecord | No | A judged record only when engine, horizon, regime/instrument class, and claim family match this response. `state` is one of: `measured` (a stratum cleared the publishability gate — `stratum` carries engine, horizon tier, bar regime, recall, precision, base rate, base-rate lift, median lead hours, effective sample, warned events and the measurement date); `withheld` (the gate ran and refused — `reason` says why, in words); `unavailable` (the record could not be read at all — an infrastructure failure that says nothing about the record). It is ONE stratum selected by recall, never a platform-wide accuracy. Null means no exact record match; read recordMatchReason. |
| confidenceSemantics | No | Every confidence-bearing value with its score type, scale, calibration status, and probability flag. |
| decisionEligibility | No | Fail-closed binding-authority policy. WITHHELD means source evidence remains available for audit while normalized direction, actionability and execution fields are revoked. |
| directionEligibility | No | Current market-direction eligibility. Direction is authorized only by an exact, eligible producer stratum (canonical_verdict, canonical_symbol_verdict, committee_verdict) — read bindingAuthority to see which one bound. Widening WHO may bind did not weaken WHAT binding requires: the named producer must still hold a matching horizon/class/family record on a verified-only judged population, so an authority without a record still cannot bind. |
| executionEligibility | No | Fail-closed execution boundary. Portfolio monitoring tools always return WITHHELD with MONITOR_ONLY_NO_EXECUTION_AUTHORITY while Fahali has no capital path. |
| monitoringEligibility | No | Current portfolio-monitoring validity based on captured identity, freshness, integrity, and the caller-supplied monitoring policy. ELIGIBLE authorizes observation/delivery only, never financial action. |
| sourceEvidenceQuality | No | |
| currentActionEligibility | No | Current eligibility of an immutable historical portfolio verdict. It never mutates the stored judgment being replayed. |
| sourceConfidenceSemantics | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, openWorld and non-destructive, so the safety profile is covered. The description adds real context beyond that: entries carry path, parameters and enforced gates, excluded routes are returned with reasons, and the catalog is live/router-derived rather than static.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Five short sentences with the core purpose front-loaded and the discovery workflow trailing. Nothing is redundant, though the final sentence about purpose-built tools is slightly clipped in phrasing.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema and full annotation coverage, the description is adequate on the discovery side. However, a zero-required-parameter tool whose five optional parameters read like generic row-projection controls is left unexplained, so an agent cannot tell what limit/since/symbols actually do to a list of routes.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so each of the five parameters is already documented in the schema; baseline 3 applies. The description adds nothing about how limit, since, detail, symbols or include_withheld shape a resource listing — notably the schema's phrasing about "projectable collections" and "rows without instrument identity" is not reconciled with a tool that lists routes.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb + resource ("List every readable Fahali resource") plus a distinguishing detail: the list is derived from the live API router rather than hand-maintained. It explicitly separates itself from fahali_fetch_resource and from the many purpose-built getters in the sibling set.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
"Discover here, then call fahali_fetch_resource" gives a clear two-step workflow, and "Purpose-built tools stay better when one covers your question" tells the agent when to prefer a sibling over discovery. No explicit exclusion list, but the routing condition is stated plainly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fahali_list_risk_subscriptionsARead-onlyIdempotent
List the caller's risk-delivery subscriptions and their health without exposing callback URLs or encrypted configuration. Returns channel, event filters, minimum action, last delivery, failure count, and target hint. Use this before creating a duplicate subscription.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Optional maximum rows per projectable collection. Audit has no MCP projection cap; brief defaults to 3 and standard to 12. | |
| since | No | Optional lower timestamp bound for returned row collections. | |
| detail | No | Response depth. audit is the full-fidelity default; brief and standard are explicit compact projections. | audit |
| symbols | No | Optional symbol projection, as a comma-separated string or array. Rows without instrument identity are not discarded. | |
| watch_id | No | ||
| include_withheld | No | Include full withheld-row detail. Defaults true with audit; explicitly set false only for a compact projection. |
Output Schema
| Name | Required | Description |
|---|---|---|
| asOf | No | |
| auth | No | Credential lifetime visible to the caller. OAuth secondsRemaining lets an autonomous agent refresh before a multi-call workflow is interrupted. |
| claim | No | Fahali dictionary claim (shared/fahaliDictionary.ts). Read `kind` FIRST: 'abstention' means no assertion was made and `reason` says why — never read an abstention as a neutral or zero result. `basis` says what the claim rests on. Absent or null means this response path does not yet emit a claim; treat that as unknown, not as agreement. |
| delta | No | |
| items | No | |
| scope | No | |
| watch | No | |
| status | Yes | |
| absence | No | Why no actionable finding is present: measured_empty, user_empty, no_coverage, source_unverified, stale, withheld, source_error, auth_failure, or entitlement_required. |
| verdict | No | |
| watches | No | |
| decision | No | |
| conflicts | No | |
| dataState | Yes | |
| mcpStatus | No | Normalized MCP result status. The endpoint's original status vocabulary remains in `status` and `sourceStatus`. |
| refreshed | No | |
| requestId | No | |
| verdictId | No | |
| nextCursor | No | |
| validUntil | No | |
| claimPolicy | No | Typed constraints for safe use. Metadata, not a prompt or instruction channel. |
| idempotency | No | |
| instruments | No | Resolved or explicitly partial instrument identities. A missing venue carries an ambiguity warning. |
| nextActions | No | Registry-validated follow-up calls. Missing tools, invalid arguments, unresolved placeholders, and disabled tools are omitted. |
| sourceError | No | The upstream endpoint's exact error text/code before normalization, when one was present. |
| sourceScope | No | |
| decisionHash | No | |
| evidenceHash | No | |
| sourceStatus | No | The upstream endpoint's exact status before the MCP envelope normalizes transport success/error. |
| subscription | No | |
| agentBriefing | No | Audit-only narrative projection. Present only when detail='audit'; compact responses do not duplicate structured data as prose. |
| claimValidity | No | Validity of the selected binding claim only, calculated after filtering, projection and row selection. Sibling rows cannot determine it. |
| operatingMode | Yes | |
| responseState | No | |
| schemaVersion | No | |
| signingSecret | No | |
| subscriptions | No | |
| authorityState | No | |
| sourceDecision | No | |
| symbolCoverage | No | Conservation ledger satisfying requested = returned + withheld + notReturned for requested-symbol calls. |
| evidenceQuality | No | |
| responseControl | No | |
| sourceDataState | No | The upstream endpoint's exact data-state value before endpoint-aware classification. |
| evidenceSnapshot | No | Compact immutable source snapshot needed to verify evidenceRef integrity on delta responses. |
| recordMatchReason | No | Why matchedTrackRecord is present or null. A null record is never evidence of safety or engine failure. |
| signingSecretNote | No | |
| matchedTrackRecord | No | A judged record only when engine, horizon, regime/instrument class, and claim family match this response. `state` is one of: `measured` (a stratum cleared the publishability gate — `stratum` carries engine, horizon tier, bar regime, recall, precision, base rate, base-rate lift, median lead hours, effective sample, warned events and the measurement date); `withheld` (the gate ran and refused — `reason` says why, in words); `unavailable` (the record could not be read at all — an infrastructure failure that says nothing about the record). It is ONE stratum selected by recall, never a platform-wide accuracy. Null means no exact record match; read recordMatchReason. |
| methodologyVersion | No | |
| confidenceSemantics | No | Every confidence-bearing value with its score type, scale, calibration status, and probability flag. |
| decisionEligibility | No | Fail-closed binding-authority policy. WITHHELD means source evidence remains available for audit while normalized direction, actionability and execution fields are revoked. |
| directionEligibility | No | Current market-direction eligibility. Direction is authorized only by an exact, eligible producer stratum (canonical_verdict, canonical_symbol_verdict, committee_verdict) — read bindingAuthority to see which one bound. Widening WHO may bind did not weaken WHAT binding requires: the named producer must still hold a matching horizon/class/family record on a verified-only judged population, so an authority without a record still cannot bind. |
| executionEligibility | No | Fail-closed execution boundary. Portfolio monitoring tools always return WITHHELD with MONITOR_ONLY_NO_EXECUTION_AUTHORITY while Fahali has no capital path. |
| legacyFieldSemantics | Yes | |
| outputClassification | Yes | |
| monitoringEligibility | No | Current portfolio-monitoring validity based on captured identity, freshness, integrity, and the caller-supplied monitoring policy. ELIGIBLE authorizes observation/delivery only, never financial action. |
| sourceEvidenceQuality | No | |
| currentActionEligibility | No | Current eligibility of an immutable historical portfolio verdict. It never mutates the stored judgment being replayed. |
| sourceConfidenceSemantics | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive, closed-world, so the safety profile is covered. The description adds genuinely non-obvious context: callback URLs and encrypted configuration are deliberately withheld, and health signals (last delivery, failure count) are included. It does not mention pagination behavior for the 'limit' cap, which is the main remaining gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with the core action and the security caveat. The middle sentence enumerating returned fields is mildly redundant given an output schema exists, but it is compact and readable rather than padded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, the description need not explain return values, and with all parameters optional and 83% schema-documented, it need not re-document them. What it must convey — read-only scoping to the caller, withheld sensitive fields, and the deduplication use case — is all present.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 83%, above the threshold where the schema is expected to carry parameter meaning, and indeed the description names none of the six parameters (limit, since, detail, symbols, watch_id, include_withheld). The return-field list it does provide is not parameter guidance, so baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List the caller's risk-delivery subscriptions and their health') with explicit scope limited to the caller. It implicitly separates itself from the write siblings (fahali_subscribe_risk, fahali_update_subscription, fahali_unsubscribe_risk) by positioning the call as a pre-creation check, so an agent can pick it without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Use this before creating a duplicate subscription' gives a concrete triggering condition tied to a named sibling activity. It lacks an explicit when-not clause (e.g., use fahali_get_realtime_alerts for live deliveries instead), so it stops short of full routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fahali_resolve_instrumentARead-onlyIdempotent
Resolve a ticker to canonical identity: canonicalId, displayName, assetClass, venue, quote currency, session. Call it when a response returns resolutionState 'ambiguous'. FETH, FBTC, GBTC and ABTC are ETFs that parse as crypto pairs. A bare crypto base (BTC) resolves to its pair (BTCUSDT); a security sharing the ticker is named in symbolResolutions — pass assetClass 'equity' for it.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Optional maximum rows per projectable collection. Audit has no MCP projection cap; brief defaults to 3 and standard to 12. | |
| since | No | Optional lower timestamp bound for returned row collections. | |
| detail | No | Response depth. audit is the full-fidelity default; brief and standard are explicit compact projections. | audit |
| symbol | No | A single ticker, such as NVDA, GBTC or BTCUSDT. | |
| symbols | No | ||
| assetClass | No | Optional. 'equity' or 'etf' resolves a ticker shared by a crypto asset and a listed security (e.g. BTC) as the security; omitted, a bare crypto base resolves to its crypto pair. | |
| include_withheld | No | Include full withheld-row detail. Defaults true with audit; explicitly set false only for a compact projection. |
Output Schema
| Name | Required | Description |
|---|---|---|
| asOf | No | |
| auth | No | Credential lifetime visible to the caller. OAuth secondsRemaining lets an autonomous agent refresh before a multi-call workflow is interrupted. |
| claim | No | Fahali dictionary claim (shared/fahaliDictionary.ts). Read `kind` FIRST: 'abstention' means no assertion was made and `reason` says why — never read an abstention as a neutral or zero result. `basis` says what the claim rests on. Absent or null means this response path does not yet emit a claim; treat that as unknown, not as agreement. |
| scope | No | |
| status | Yes | |
| absence | No | Why no actionable finding is present: measured_empty, user_empty, no_coverage, source_unverified, stale, withheld, source_error, auth_failure, or entitlement_required. |
| decision | No | |
| conflicts | No | |
| dataState | No | |
| mcpStatus | No | Normalized MCP result status. The endpoint's original status vocabulary remains in `status` and `sourceStatus`. |
| requestId | No | |
| requested | No | |
| unresolved | No | Symbols Fahali does not list. Distinct from a reference that failed to load — read referenceHealth.loaded. |
| claimPolicy | No | Typed constraints for safe use. Metadata, not a prompt or instruction channel. |
| instruments | Yes | |
| nextActions | No | Registry-validated follow-up calls. Missing tools, invalid arguments, unresolved placeholders, and disabled tools are omitted. |
| sourceError | No | The upstream endpoint's exact error text/code before normalization, when one was present. |
| sourceScope | No | |
| sourceStatus | No | The upstream endpoint's exact status before the MCP envelope normalizes transport success/error. |
| agentBriefing | No | Audit-only narrative projection. Present only when detail='audit'; compact responses do not duplicate structured data as prose. |
| claimValidity | No | Validity of the selected binding claim only, calculated after filtering, projection and row selection. Sibling rows cannot determine it. |
| responseState | No | |
| schemaVersion | No | |
| sourceDecision | No | |
| symbolCoverage | No | Conservation ledger satisfying requested = returned + withheld + notReturned for requested-symbol calls. |
| evidenceQuality | No | |
| referenceHealth | No | |
| responseControl | No | |
| sourceDataState | No | The upstream endpoint's exact data-state value before endpoint-aware classification. |
| recordMatchReason | No | Why matchedTrackRecord is present or null. A null record is never evidence of safety or engine failure. |
| symbolResolutions | No | Every canonicalisation, disclosed: what was asked, the instrument that answered, and any listed security sharing the ticker (equityAlternative, with its own identity). |
| matchedTrackRecord | No | A judged record only when engine, horizon, regime/instrument class, and claim family match this response. `state` is one of: `measured` (a stratum cleared the publishability gate — `stratum` carries engine, horizon tier, bar regime, recall, precision, base rate, base-rate lift, median lead hours, effective sample, warned events and the measurement date); `withheld` (the gate ran and refused — `reason` says why, in words); `unavailable` (the record could not be read at all — an infrastructure failure that says nothing about the record). It is ONE stratum selected by recall, never a platform-wide accuracy. Null means no exact record match; read recordMatchReason. |
| confidenceSemantics | No | Every confidence-bearing value with its score type, scale, calibration status, and probability flag. |
| decisionEligibility | No | Fail-closed binding-authority policy. WITHHELD means source evidence remains available for audit while normalized direction, actionability and execution fields are revoked. |
| directionEligibility | No | Current market-direction eligibility. Direction is authorized only by an exact, eligible producer stratum (canonical_verdict, canonical_symbol_verdict, committee_verdict) — read bindingAuthority to see which one bound. Widening WHO may bind did not weaken WHAT binding requires: the named producer must still hold a matching horizon/class/family record on a verified-only judged population, so an authority without a record still cannot bind. |
| executionEligibility | No | Fail-closed execution boundary. Portfolio monitoring tools always return WITHHELD with MONITOR_ONLY_NO_EXECUTION_AUTHORITY while Fahali has no capital path. |
| monitoringEligibility | No | Current portfolio-monitoring validity based on captured identity, freshness, integrity, and the caller-supplied monitoring policy. ELIGIBLE authorizes observation/delivery only, never financial action. |
| sourceEvidenceQuality | No | |
| currentActionEligibility | No | Current eligibility of an immutable historical portfolio verdict. It never mutates the stored judgment being replayed. |
| sourceConfidenceSemantics | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover safety (readOnly, idempotent, non-destructive, openWorld), so the bar is lower; the description still adds real domain behavior: ambiguous tickers surface a symbolResolutions field, bare crypto bases resolve to their pair, and specific ETF tickers (FETH, FBTC, GBTC, ABTC) parse as crypto pairs. It does not explain what the collection params (limit/since/detail) mean in the context of a resolver, which is the remaining gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the purpose and return fields, then the trigger, then the two edge cases. Dense but every sentence carries information; only the ticker-list sentence is slightly packed.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Output schema and annotations relieve it of explaining returns and safety, and it covers the main ambiguity case well. However, for a 7-parameter tool it never mentions batch resolution via `symbols` (up to 100 tickers) or how the audit/brief/standard projections relate to a resolution response, leaving a notable behavioral blind spot.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 86%, so the schema already documents assetClass's enum and resolution semantics almost verbatim; the description largely restates that rather than adding syntax or edge cases. The batch-capable `symbols` parameter is never addressed, and limit/since/detail get no tool-specific meaning in the description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb+resource ('Resolve a ticker to canonical identity') followed by the exact fields returned (canonicalId, displayName, assetClass, venue, quote currency, session). No sibling tool in the list performs symbol resolution, and the description makes that unique role unmistakable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit trigger — 'Call it when a response returns resolutionState ambiguous' — plus a concrete disambiguation recipe (pass assetClass 'equity' when a security shares the ticker). It stops short of stating when not to call (e.g. unambiguous tickers), but the condition is clear enough to act on.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fahali_run_shock_testARead-onlyIdempotent
Apply a sized scenario to connected or supplied positions and report capital impact by holding. This is a deterministic shock unless simulations and probabilities are explicitly returned; null simulations are not hidden Monte Carlo. Supply concrete symbols and signed moves.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Optional maximum rows per projectable collection. Audit has no MCP projection cap; brief defaults to 3 and standard to 12. | |
| since | No | Optional lower timestamp bound for returned row collections. | |
| detail | No | Response depth. audit is the full-fidelity default; brief and standard are explicit compact projections. | audit |
| shocks | No | Preferred deterministic form. Structured shocks override scenario parsing; every item is reported as measured, withheld, or not instrumented. | |
| horizon | No | Optional scenario horizon context. | |
| symbols | No | Optional symbol projection, as a comma-separated string or array. Rows without instrument identity are not discarded. | |
| scenario | No | Backward-compatible natural language scenario. Compound example: 'Nasdaq falls 12%, Bitcoin falls 20%, volatility doubles, and correlations converge toward 0.85.' Every clause is returned; unsupported factor maths is explicit. | |
| shockPct | No | Deprecated signed single-shock compatibility input. Prefer shocks[].movePct. | |
| positions | No | Optional custom positions. If omitted, uses connected accounts. | |
| shockSymbol | No | Deprecated single-shock compatibility input. Prefer shocks[]. | |
| include_withheld | No | Include full withheld-row detail. Defaults true with audit; explicitly set false only for a compact projection. |
Output Schema
| Name | Required | Description |
|---|---|---|
| asOf | No | |
| auth | No | Credential lifetime visible to the caller. OAuth secondsRemaining lets an autonomous agent refresh before a multi-call workflow is interrupted. |
| mode | No | |
| note | No | |
| claim | No | Fahali dictionary claim (shared/fahaliDictionary.ts). Read `kind` FIRST: 'abstention' means no assertion was made and `reason` says why — never read an abstention as a neutral or zero result. `basis` says what the claim rests on. Absent or null means this response path does not yet emit a claim; treat that as unknown, not as agreement. |
| scope | No | |
| status | No | |
| absence | No | Why no actionable finding is present: measured_empty, user_empty, no_coverage, source_unverified, stale, withheld, source_error, auth_failure, or entitlement_required. |
| decision | No | |
| conflicts | No | |
| dataState | No | |
| mcpStatus | No | Normalized MCP result status. The endpoint's original status vocabulary remains in `status` and `sourceStatus`. |
| requestId | No | |
| timestamp | No | |
| worstCase | No | |
| claimPolicy | No | Typed constraints for safe use. Metadata, not a prompt or instruction channel. |
| instruments | No | Resolved or explicitly partial instrument identities. A missing venue carries an ambiguity warning. |
| nextActions | No | Registry-validated follow-up calls. Missing tools, invalid arguments, unresolved placeholders, and disabled tools are omitted. |
| simulations | No | |
| sourceError | No | The upstream endpoint's exact error text/code before normalization, when one was present. |
| sourceScope | No | |
| sourceStatus | No | The upstream endpoint's exact status before the MCP envelope normalizes transport success/error. |
| agentBriefing | No | Audit-only narrative projection. Present only when detail='audit'; compact responses do not duplicate structured data as prose. |
| capitalAtRisk | No | |
| claimValidity | No | Validity of the selected binding claim only, calculated after filtering, projection and row selection. Sibling rows cannot determine it. |
| responseState | No | |
| schemaVersion | No | |
| shockCoverage | No | |
| compoundResult | No | |
| portfolioValue | No | |
| requestedShock | No | Compatibility alias populated only for a single instrument shock. Compound requests are never collapsed to the first clause. |
| sourceDecision | No | |
| symbolCoverage | No | Conservation ledger satisfying requested = returned + withheld + notReturned for requested-symbol calls. |
| evidenceQuality | No | |
| requestedShocks | No | |
| responseControl | No | |
| sourceDataState | No | The upstream endpoint's exact data-state value before endpoint-aware classification. |
| capitalAtRiskNote | No | |
| portfolioCoverage | No | |
| recordMatchReason | No | Why matchedTrackRecord is present or null. A null record is never evidence of safety or engine failure. |
| requestedScenario | No | |
| matchedTrackRecord | No | A judged record only when engine, horizon, regime/instrument class, and claim family match this response. `state` is one of: `measured` (a stratum cleared the publishability gate — `stratum` carries engine, horizon tier, bar regime, recall, precision, base rate, base-rate lift, median lead hours, effective sample, warned events and the measurement date); `withheld` (the gate ran and refused — `reason` says why, in words); `unavailable` (the record could not be read at all — an infrastructure failure that says nothing about the record). It is ONE stratum selected by recall, never a platform-wide accuracy. Null means no exact record match; read recordMatchReason. |
| confidenceSemantics | No | Every confidence-bearing value with its score type, scale, calibration status, and probability flag. |
| decisionEligibility | No | Fail-closed binding-authority policy. WITHHELD means source evidence remains available for audit while normalized direction, actionability and execution fields are revoked. |
| directionEligibility | No | Current market-direction eligibility. Direction is authorized only by an exact, eligible producer stratum (canonical_verdict, canonical_symbol_verdict, committee_verdict) — read bindingAuthority to see which one bound. Widening WHO may bind did not weaken WHAT binding requires: the named producer must still hold a matching horizon/class/family record on a verified-only judged population, so an authority without a record still cannot bind. |
| executionEligibility | No | Fail-closed execution boundary. Portfolio monitoring tools always return WITHHELD with MONITOR_ONLY_NO_EXECUTION_AUTHORITY while Fahali has no capital path. |
| portfolioValueMetric | No | |
| monitoringEligibility | No | Current portfolio-monitoring validity based on captured identity, freshness, integrity, and the caller-supplied monitoring policy. ELIGIBLE authorizes observation/delivery only, never financial action. |
| sourceEvidenceQuality | No | |
| recentRiskObservations | No | |
| currentActionEligibility | No | Current eligibility of an immutable historical portfolio verdict. It never mutates the stored judgment being replayed. |
| sourceConfidenceSemantics | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover safety (readOnly, idempotent, non-destructive), yet the description adds real context: the result is a deterministic shock and null simulations are not hidden Monte Carlo, which prevents a serious misinterpretation of output. It stops short of covering auth needs, coverage limits, or what happens when a symbol is uninstrumented.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with what the tool does, followed by the determinism caveat and the input hint. No filler, though the determinism sentence is dense and could be split for faster parsing.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With 11 parameters, an output schema, and rich annotations, the description's job is mainly to frame the operation, which it does. It does not explain the precedence among shocks, scenario, and the deprecated shockPct/shockSymbol inputs, but the schema carries that detail explicitly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents shocks, scenario, deprecated compatibility inputs, positions side semantics, and detail levels. The description only echoes the 'signed moves / concrete symbols' idea that movePct and instrument already state, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: apply a sized scenario to positions and report capital impact by holding. It also disambiguates the analytic style (deterministic shock, not Monte Carlo). It does not, however, contrast itself with close siblings such as fahali_analyze_custom_portfolio or fahali_get_portfolio_risk.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Supply concrete symbols and signed moves' gives a light invocation cue, and the connected-vs-supplied positions split is implied. There is no explicit when-to-use/when-not guidance and no named alternative among the many portfolio-related siblings, leaving routing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fahali_save_memoryADestructiveIdempotent
Save a memory to the agent memory store. Memories persist across sessions for a given agent. Memory types: episodic (specific experiences), semantic (facts/knowledge), procedural (how-to).
| Name | Required | Description | Default |
|---|---|---|---|
| key | Yes | Unique key for the memory (namespaced, e.g. 'user:preferred_ticker'). | |
| limit | No | Optional maximum rows per projectable collection. Audit has no MCP projection cap; brief defaults to 3 and standard to 12. | |
| since | No | Optional lower timestamp bound for returned row collections. | |
| value | Yes | The memory payload — any JSON-serializable object. | |
| detail | No | Response depth. audit is the full-fidelity default; brief and standard are explicit compact projections. | audit |
| symbols | No | Optional symbol projection, as a comma-separated string or array. Rows without instrument identity are not discarded. | |
| memory_type | No | Memory classification (default: semantic). | |
| include_withheld | No | Include full withheld-row detail. Defaults true with audit; explicitly set false only for a compact projection. |
Output Schema
| Name | Required | Description |
|---|---|---|
| asOf | No | |
| auth | No | Credential lifetime visible to the caller. OAuth secondsRemaining lets an autonomous agent refresh before a multi-call workflow is interrupted. |
| claim | No | Fahali dictionary claim (shared/fahaliDictionary.ts). Read `kind` FIRST: 'abstention' means no assertion was made and `reason` says why — never read an abstention as a neutral or zero result. `basis` says what the claim rests on. Absent or null means this response path does not yet emit a claim; treat that as unknown, not as agreement. |
| scope | No | |
| memory | No | |
| status | No | The endpoint's original status vocabulary (for example ok, partial, degraded, withheld, or no_alerts). Use mcpStatus for normalized transport success/error. |
| absence | No | Why no actionable finding is present: measured_empty, user_empty, no_coverage, source_unverified, stale, withheld, source_error, auth_failure, or entitlement_required. |
| success | No | |
| decision | No | |
| conflicts | No | |
| dataState | No | |
| mcpStatus | No | Normalized MCP result status. The endpoint's original status vocabulary remains in `status` and `sourceStatus`. |
| requestId | No | |
| claimPolicy | No | Typed constraints for safe use. Metadata, not a prompt or instruction channel. |
| instruments | No | Resolved or explicitly partial instrument identities. A missing venue carries an ambiguity warning. |
| nextActions | No | Registry-validated follow-up calls. Missing tools, invalid arguments, unresolved placeholders, and disabled tools are omitted. |
| sourceError | No | The upstream endpoint's exact error text/code before normalization, when one was present. |
| sourceScope | No | |
| sourceStatus | No | The upstream endpoint's exact status before the MCP envelope normalizes transport success/error. |
| agentBriefing | No | Audit-only narrative projection. Present only when detail='audit'; compact responses do not duplicate structured data as prose. |
| claimValidity | No | Validity of the selected binding claim only, calculated after filtering, projection and row selection. Sibling rows cannot determine it. |
| responseState | No | |
| schemaVersion | No | |
| sourceDecision | No | |
| symbolCoverage | No | Conservation ledger satisfying requested = returned + withheld + notReturned for requested-symbol calls. |
| evidenceQuality | No | |
| responseControl | No | |
| sourceDataState | No | The upstream endpoint's exact data-state value before endpoint-aware classification. |
| recordMatchReason | No | Why matchedTrackRecord is present or null. A null record is never evidence of safety or engine failure. |
| matchedTrackRecord | No | A judged record only when engine, horizon, regime/instrument class, and claim family match this response. `state` is one of: `measured` (a stratum cleared the publishability gate — `stratum` carries engine, horizon tier, bar regime, recall, precision, base rate, base-rate lift, median lead hours, effective sample, warned events and the measurement date); `withheld` (the gate ran and refused — `reason` says why, in words); `unavailable` (the record could not be read at all — an infrastructure failure that says nothing about the record). It is ONE stratum selected by recall, never a platform-wide accuracy. Null means no exact record match; read recordMatchReason. |
| confidenceSemantics | No | Every confidence-bearing value with its score type, scale, calibration status, and probability flag. |
| decisionEligibility | No | Fail-closed binding-authority policy. WITHHELD means source evidence remains available for audit while normalized direction, actionability and execution fields are revoked. |
| directionEligibility | No | Current market-direction eligibility. Direction is authorized only by an exact, eligible producer stratum (canonical_verdict, canonical_symbol_verdict, committee_verdict) — read bindingAuthority to see which one bound. Widening WHO may bind did not weaken WHAT binding requires: the named producer must still hold a matching horizon/class/family record on a verified-only judged population, so an authority without a record still cannot bind. |
| executionEligibility | No | Fail-closed execution boundary. Portfolio monitoring tools always return WITHHELD with MONITOR_ONLY_NO_EXECUTION_AUTHORITY while Fahali has no capital path. |
| monitoringEligibility | No | Current portfolio-monitoring validity based on captured identity, freshness, integrity, and the caller-supplied monitoring policy. ELIGIBLE authorizes observation/delivery only, never financial action. |
| sourceEvidenceQuality | No | |
| currentActionEligibility | No | Current eligibility of an immutable historical portfolio verdict. It never mutates the stored judgment being replayed. |
| sourceConfidenceSemantics | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare that the tool is destructive, idempotent, and not read-only. The description adds useful context about persistence and memory categories, but it does not explain overwrite behavior or what is destroyed when saving an existing key, which is important for a destructive mutation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three short sentences with the core action and persistence behavior front-loaded. The memory-type definitions are compact and directly useful, with no wasted text.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has a rich schema, an output schema, and annotations covering mutation safety. The description covers the core purpose and memory classification, though it omits overwrite semantics for an existing key, which would be useful given the destructive annotation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so parameter meanings are already documented in the schema. The description briefly mentions memory types, but it adds little beyond the schema's own enum descriptions for memory_type and the other parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: saving a memory to the agent memory store, with persistence across sessions and memory-type classification. It is clear what the tool does, though it does not explicitly contrast itself with sibling retrieval tools like fahali_search_memories.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage by explaining that memories persist across sessions and by defining memory types, which helps choose a memory_type. However, it gives no explicit guidance on when to use this tool versus alternatives, nor does it state any exclusions or prerequisites.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fahali_search_memoriesARead-onlyIdempotent
Semantic search across agent memories. Returns memories matching the search query using vector similarity (when available) or text ILIKE fallback.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum results (default 10, max 50). | |
| query | Yes | Search query to match against memory keys and values. | |
| since | No | Optional lower timestamp bound for returned row collections. | |
| detail | No | Response depth. audit is the full-fidelity default; brief and standard are explicit compact projections. | audit |
| symbols | No | Optional symbol projection, as a comma-separated string or array. Rows without instrument identity are not discarded. | |
| include_withheld | No | Include full withheld-row detail. Defaults true with audit; explicitly set false only for a compact projection. |
Output Schema
| Name | Required | Description |
|---|---|---|
| asOf | No | |
| auth | No | Credential lifetime visible to the caller. OAuth secondsRemaining lets an autonomous agent refresh before a multi-call workflow is interrupted. |
| claim | No | Fahali dictionary claim (shared/fahaliDictionary.ts). Read `kind` FIRST: 'abstention' means no assertion was made and `reason` says why — never read an abstention as a neutral or zero result. `basis` says what the claim rests on. Absent or null means this response path does not yet emit a claim; treat that as unknown, not as agreement. |
| scope | No | |
| status | No | The endpoint's original status vocabulary (for example ok, partial, degraded, withheld, or no_alerts). Use mcpStatus for normalized transport success/error. |
| absence | No | Why no actionable finding is present: measured_empty, user_empty, no_coverage, source_unverified, stale, withheld, source_error, auth_failure, or entitlement_required. |
| decision | No | |
| memories | No | |
| conflicts | No | |
| dataState | No | |
| mcpStatus | No | Normalized MCP result status. The endpoint's original status vocabulary remains in `status` and `sourceStatus`. |
| requestId | No | |
| claimPolicy | No | Typed constraints for safe use. Metadata, not a prompt or instruction channel. |
| instruments | No | Resolved or explicitly partial instrument identities. A missing venue carries an ambiguity warning. |
| nextActions | No | Registry-validated follow-up calls. Missing tools, invalid arguments, unresolved placeholders, and disabled tools are omitted. |
| sourceError | No | The upstream endpoint's exact error text/code before normalization, when one was present. |
| sourceScope | No | |
| sourceStatus | No | The upstream endpoint's exact status before the MCP envelope normalizes transport success/error. |
| agentBriefing | No | Audit-only narrative projection. Present only when detail='audit'; compact responses do not duplicate structured data as prose. |
| claimValidity | No | Validity of the selected binding claim only, calculated after filtering, projection and row selection. Sibling rows cannot determine it. |
| responseState | No | |
| schemaVersion | No | |
| sourceDecision | No | |
| symbolCoverage | No | Conservation ledger satisfying requested = returned + withheld + notReturned for requested-symbol calls. |
| evidenceQuality | No | |
| responseControl | No | |
| sourceDataState | No | The upstream endpoint's exact data-state value before endpoint-aware classification. |
| recordMatchReason | No | Why matchedTrackRecord is present or null. A null record is never evidence of safety or engine failure. |
| matchedTrackRecord | No | A judged record only when engine, horizon, regime/instrument class, and claim family match this response. `state` is one of: `measured` (a stratum cleared the publishability gate — `stratum` carries engine, horizon tier, bar regime, recall, precision, base rate, base-rate lift, median lead hours, effective sample, warned events and the measurement date); `withheld` (the gate ran and refused — `reason` says why, in words); `unavailable` (the record could not be read at all — an infrastructure failure that says nothing about the record). It is ONE stratum selected by recall, never a platform-wide accuracy. Null means no exact record match; read recordMatchReason. |
| confidenceSemantics | No | Every confidence-bearing value with its score type, scale, calibration status, and probability flag. |
| decisionEligibility | No | Fail-closed binding-authority policy. WITHHELD means source evidence remains available for audit while normalized direction, actionability and execution fields are revoked. |
| directionEligibility | No | Current market-direction eligibility. Direction is authorized only by an exact, eligible producer stratum (canonical_verdict, canonical_symbol_verdict, committee_verdict) — read bindingAuthority to see which one bound. Widening WHO may bind did not weaken WHAT binding requires: the named producer must still hold a matching horizon/class/family record on a verified-only judged population, so an authority without a record still cannot bind. |
| executionEligibility | No | Fail-closed execution boundary. Portfolio monitoring tools always return WITHHELD with MONITOR_ONLY_NO_EXECUTION_AUTHORITY while Fahali has no capital path. |
| monitoringEligibility | No | Current portfolio-monitoring validity based on captured identity, freshness, integrity, and the caller-supplied monitoring policy. ELIGIBLE authorizes observation/delivery only, never financial action. |
| sourceEvidenceQuality | No | |
| currentActionEligibility | No | Current eligibility of an immutable historical portfolio verdict. It never mutates the stored judgment being replayed. |
| sourceConfidenceSemantics | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so the safety profile is covered. The description adds real value by disclosing the dual retrieval path (vector similarity when available, ILIKE text fallback), which warns that result quality/ranking may vary — but it says nothing about ordering, scoring, or empty-result behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, purpose first and return-behavior second, with zero filler. Each sentence contributes distinct information the schema does not carry.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need no explanation, and the schema fully documents all parameters. What's missing is routing guidance relative to sibling memory tools; otherwise the definition is sufficient to call the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all six parameters including the detail enum and include_withheld default are already documented in the schema; baseline 3 applies. The description adds only that the query matches memories, without clarifying limit/since/detail interactions beyond what the schema states.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Semantic search across agent memories') and specifies the retrieval mechanism, so the agent knows this is a read/search operation rather than a write. It doesn't name or contrast with the obvious sibling fahali_save_memory or other memory-reading tools, but the purpose is unambiguous on its own.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: an agent can infer 'use this to find memories' but the description never says when to search versus when to list sessions or fetch a resource, nor any prerequisites. No exclusions or alternative-routing guidance is offered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fahali_subscribe_riskAIdempotent
Idempotently deliver monitor-only observations and risk alerts through a signed webhook, agent callback, Slack, Teams, account email, or registered push device. Delivery policy structurally prohibits personalized recommendations, portfolio actions, orders, and execution. A generated signing secret is recoverable only through the exact authenticated idempotent request; a changed request requires a new key.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Optional maximum rows per projectable collection. Audit has no MCP projection cap; brief defaults to 3 and standard to 12. | |
| since | No | Optional lower timestamp bound for returned row collections. | |
| detail | No | Response depth. audit is the full-fidelity default; brief and standard are explicit compact projections. | audit |
| events | No | ||
| channel | Yes | ||
| symbols | No | Optional symbol projection, as a comma-separated string or array. Rows without instrument identity are not discarded. | |
| watch_id | Yes | ||
| target_url | No | Required for webhook, agent_callback, Slack, and Teams. Public HTTPS only. | |
| minimum_action | No | Legacy monitoring-escalation threshold only; never a portfolio or order action. | WATCH |
| signing_secret | No | Optional for webhook/callback. Omit to generate one returned on creation and recoverable by an exact authenticated idempotent replay while that subscription configuration remains current. | |
| idempotency_key | Yes | Required retry identity for this write. Reuse only for an identical owner, operation, and request; a changed request with the same key fails closed. | |
| include_withheld | No | Include full withheld-row detail. Defaults true with audit; explicitly set false only for a compact projection. |
Output Schema
| Name | Required | Description |
|---|---|---|
| asOf | No | |
| auth | No | Credential lifetime visible to the caller. OAuth secondsRemaining lets an autonomous agent refresh before a multi-call workflow is interrupted. |
| claim | No | Fahali dictionary claim (shared/fahaliDictionary.ts). Read `kind` FIRST: 'abstention' means no assertion was made and `reason` says why — never read an abstention as a neutral or zero result. `basis` says what the claim rests on. Absent or null means this response path does not yet emit a claim; treat that as unknown, not as agreement. |
| delta | No | |
| items | No | |
| scope | No | |
| watch | No | |
| status | Yes | |
| absence | No | Why no actionable finding is present: measured_empty, user_empty, no_coverage, source_unverified, stale, withheld, source_error, auth_failure, or entitlement_required. |
| verdict | No | |
| watches | No | |
| decision | No | |
| conflicts | No | |
| dataState | Yes | |
| mcpStatus | No | Normalized MCP result status. The endpoint's original status vocabulary remains in `status` and `sourceStatus`. |
| refreshed | No | |
| requestId | No | |
| verdictId | No | |
| nextCursor | No | |
| validUntil | No | |
| claimPolicy | No | Typed constraints for safe use. Metadata, not a prompt or instruction channel. |
| idempotency | No | |
| instruments | No | Resolved or explicitly partial instrument identities. A missing venue carries an ambiguity warning. |
| nextActions | No | Registry-validated follow-up calls. Missing tools, invalid arguments, unresolved placeholders, and disabled tools are omitted. |
| sourceError | No | The upstream endpoint's exact error text/code before normalization, when one was present. |
| sourceScope | No | |
| decisionHash | No | |
| evidenceHash | No | |
| sourceStatus | No | The upstream endpoint's exact status before the MCP envelope normalizes transport success/error. |
| subscription | No | |
| agentBriefing | No | Audit-only narrative projection. Present only when detail='audit'; compact responses do not duplicate structured data as prose. |
| claimValidity | No | Validity of the selected binding claim only, calculated after filtering, projection and row selection. Sibling rows cannot determine it. |
| operatingMode | Yes | |
| responseState | No | |
| schemaVersion | No | |
| signingSecret | No | |
| subscriptions | No | |
| authorityState | No | |
| sourceDecision | No | |
| symbolCoverage | No | Conservation ledger satisfying requested = returned + withheld + notReturned for requested-symbol calls. |
| evidenceQuality | No | |
| responseControl | No | |
| sourceDataState | No | The upstream endpoint's exact data-state value before endpoint-aware classification. |
| evidenceSnapshot | No | Compact immutable source snapshot needed to verify evidenceRef integrity on delta responses. |
| recordMatchReason | No | Why matchedTrackRecord is present or null. A null record is never evidence of safety or engine failure. |
| signingSecretNote | No | |
| matchedTrackRecord | No | A judged record only when engine, horizon, regime/instrument class, and claim family match this response. `state` is one of: `measured` (a stratum cleared the publishability gate — `stratum` carries engine, horizon tier, bar regime, recall, precision, base rate, base-rate lift, median lead hours, effective sample, warned events and the measurement date); `withheld` (the gate ran and refused — `reason` says why, in words); `unavailable` (the record could not be read at all — an infrastructure failure that says nothing about the record). It is ONE stratum selected by recall, never a platform-wide accuracy. Null means no exact record match; read recordMatchReason. |
| methodologyVersion | No | |
| confidenceSemantics | No | Every confidence-bearing value with its score type, scale, calibration status, and probability flag. |
| decisionEligibility | No | Fail-closed binding-authority policy. WITHHELD means source evidence remains available for audit while normalized direction, actionability and execution fields are revoked. |
| directionEligibility | No | Current market-direction eligibility. Direction is authorized only by an exact, eligible producer stratum (canonical_verdict, canonical_symbol_verdict, committee_verdict) — read bindingAuthority to see which one bound. Widening WHO may bind did not weaken WHAT binding requires: the named producer must still hold a matching horizon/class/family record on a verified-only judged population, so an authority without a record still cannot bind. |
| executionEligibility | No | Fail-closed execution boundary. Portfolio monitoring tools always return WITHHELD with MONITOR_ONLY_NO_EXECUTION_AUTHORITY while Fahali has no capital path. |
| legacyFieldSemantics | Yes | |
| outputClassification | Yes | |
| monitoringEligibility | No | Current portfolio-monitoring validity based on captured identity, freshness, integrity, and the caller-supplied monitoring policy. ELIGIBLE authorizes observation/delivery only, never financial action. |
| sourceEvidenceQuality | No | |
| currentActionEligibility | No | Current eligibility of an immutable historical portfolio verdict. It never mutates the stored judgment being replayed. |
| sourceConfidenceSemantics | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare idempotentHint=true, destructiveHint=false, and openWorldHint=true, so the description's job is to add beyond that. It does: a structural policy guarantee that no recommendations, portfolio actions, orders, or execution flow through this channel, plus the rule that a generated signing secret survives only an exact authenticated replay and is lost on any changed request. Remaining gaps are rate limits and delivery retry behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three front-loaded sentences: what it delivers, what it will never deliver, and the secret/idempotency consequence. Dense but no filler; the middle policy sentence is arguably defensive boilerplate rather than operational guidance.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return shape need not be explained, and the schema carries the channel-conditional target_url requirement. With 12 parameters and 3 enums, the description covers the operation and its key invariant (idempotency key identity) adequately; only the required watch_id/channel pairing and the events filter are left entirely to the schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 75%, which already documents target_url HTTPS rules, idempotency-key reuse semantics, detail levels, and signing_secret generation. The description restates the signing-secret recovery rule and the fail-closed idempotency behavior, but adds no new syntax or constraint beyond the schema, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States the operation (idempotent delivery of monitor-only observations and risk alerts) and enumerates every supported channel, so the agent knows exactly what gets created. It does not distinguish itself from closely related siblings such as fahali_create_alert, fahali_update_subscription, or fahali_get_realtime_alerts, which is the only thing keeping it from a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the channel list and the policy statement (this is the setup path for pushed risk notifications), and the secret-recovery sentence hints at the replay use case. However, there is no explicit when-to-use versus fahali_create_alert or fahali_update_subscription, and no stated when-not-to-use conditions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fahali_unsubscribe_riskADestructiveIdempotent
Idempotently disable a monitor-only risk subscription. New queueing and retries stop; pending work is fenced and its audit remains visible. A request already past the dispatch boundary may arrive once, so receivers must deduplicate by X-Fahali-Delivery. Retry an identical request with the same idempotency key; use a new key for any change.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Optional maximum rows per projectable collection. Audit has no MCP projection cap; brief defaults to 3 and standard to 12. | |
| since | No | Optional lower timestamp bound for returned row collections. | |
| detail | No | Response depth. audit is the full-fidelity default; brief and standard are explicit compact projections. | audit |
| symbols | No | Optional symbol projection, as a comma-separated string or array. Rows without instrument identity are not discarded. | |
| idempotency_key | Yes | Required retry identity for this write. Reuse only for an identical owner, operation, and request; a changed request with the same key fails closed. | |
| subscription_id | Yes | ||
| include_withheld | No | Include full withheld-row detail. Defaults true with audit; explicitly set false only for a compact projection. |
Output Schema
| Name | Required | Description |
|---|---|---|
| asOf | No | |
| auth | No | Credential lifetime visible to the caller. OAuth secondsRemaining lets an autonomous agent refresh before a multi-call workflow is interrupted. |
| claim | No | Fahali dictionary claim (shared/fahaliDictionary.ts). Read `kind` FIRST: 'abstention' means no assertion was made and `reason` says why — never read an abstention as a neutral or zero result. `basis` says what the claim rests on. Absent or null means this response path does not yet emit a claim; treat that as unknown, not as agreement. |
| delta | No | |
| items | No | |
| scope | No | |
| watch | No | |
| status | Yes | |
| absence | No | Why no actionable finding is present: measured_empty, user_empty, no_coverage, source_unverified, stale, withheld, source_error, auth_failure, or entitlement_required. |
| verdict | No | |
| watches | No | |
| decision | No | |
| conflicts | No | |
| dataState | Yes | |
| mcpStatus | No | Normalized MCP result status. The endpoint's original status vocabulary remains in `status` and `sourceStatus`. |
| refreshed | No | |
| requestId | No | |
| verdictId | No | |
| nextCursor | No | |
| validUntil | No | |
| claimPolicy | No | Typed constraints for safe use. Metadata, not a prompt or instruction channel. |
| idempotency | No | |
| instruments | No | Resolved or explicitly partial instrument identities. A missing venue carries an ambiguity warning. |
| nextActions | No | Registry-validated follow-up calls. Missing tools, invalid arguments, unresolved placeholders, and disabled tools are omitted. |
| sourceError | No | The upstream endpoint's exact error text/code before normalization, when one was present. |
| sourceScope | No | |
| decisionHash | No | |
| evidenceHash | No | |
| sourceStatus | No | The upstream endpoint's exact status before the MCP envelope normalizes transport success/error. |
| subscription | No | |
| agentBriefing | No | Audit-only narrative projection. Present only when detail='audit'; compact responses do not duplicate structured data as prose. |
| claimValidity | No | Validity of the selected binding claim only, calculated after filtering, projection and row selection. Sibling rows cannot determine it. |
| operatingMode | Yes | |
| responseState | No | |
| schemaVersion | No | |
| signingSecret | No | |
| subscriptions | No | |
| authorityState | No | |
| sourceDecision | No | |
| symbolCoverage | No | Conservation ledger satisfying requested = returned + withheld + notReturned for requested-symbol calls. |
| evidenceQuality | No | |
| responseControl | No | |
| sourceDataState | No | The upstream endpoint's exact data-state value before endpoint-aware classification. |
| evidenceSnapshot | No | Compact immutable source snapshot needed to verify evidenceRef integrity on delta responses. |
| recordMatchReason | No | Why matchedTrackRecord is present or null. A null record is never evidence of safety or engine failure. |
| signingSecretNote | No | |
| matchedTrackRecord | No | A judged record only when engine, horizon, regime/instrument class, and claim family match this response. `state` is one of: `measured` (a stratum cleared the publishability gate — `stratum` carries engine, horizon tier, bar regime, recall, precision, base rate, base-rate lift, median lead hours, effective sample, warned events and the measurement date); `withheld` (the gate ran and refused — `reason` says why, in words); `unavailable` (the record could not be read at all — an infrastructure failure that says nothing about the record). It is ONE stratum selected by recall, never a platform-wide accuracy. Null means no exact record match; read recordMatchReason. |
| methodologyVersion | No | |
| confidenceSemantics | No | Every confidence-bearing value with its score type, scale, calibration status, and probability flag. |
| decisionEligibility | No | Fail-closed binding-authority policy. WITHHELD means source evidence remains available for audit while normalized direction, actionability and execution fields are revoked. |
| directionEligibility | No | Current market-direction eligibility. Direction is authorized only by an exact, eligible producer stratum (canonical_verdict, canonical_symbol_verdict, committee_verdict) — read bindingAuthority to see which one bound. Widening WHO may bind did not weaken WHAT binding requires: the named producer must still hold a matching horizon/class/family record on a verified-only judged population, so an authority without a record still cannot bind. |
| executionEligibility | No | Fail-closed execution boundary. Portfolio monitoring tools always return WITHHELD with MONITOR_ONLY_NO_EXECUTION_AUTHORITY while Fahali has no capital path. |
| legacyFieldSemantics | Yes | |
| outputClassification | Yes | |
| monitoringEligibility | No | Current portfolio-monitoring validity based on captured identity, freshness, integrity, and the caller-supplied monitoring policy. ELIGIBLE authorizes observation/delivery only, never financial action. |
| sourceEvidenceQuality | No | |
| currentActionEligibility | No | Current eligibility of an immutable historical portfolio verdict. It never mutates the stored judgment being replayed. |
| sourceConfidenceSemantics | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and idempotentHint=true, so the bar is lower, yet the description still adds real substance: new queueing/retries cease, pending work is fenced, the audit trail stays visible, and an in-flight request may arrive once requiring dedup by X-Fahali-Delivery. That is exactly the at-least-once plus partial-failure detail an agent needs before calling a destructive write.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four sentences, front-loaded with the action and its effect before the delivery and retry caveats, with essentially no filler. It is dense with domain jargon ('fenced', 'dispatch boundary') but each clause carries distinct behavioral information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive, open-world write with seven parameters and an output schema present, the definition covers what stops, what survives, what can slip through, and how to retry safely. Nothing an agent needs to call it correctly is missing, and return-value explanation is correctly left to the output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 86%, so the baseline is 3 and the schema already documents limit, since, detail, symbols and include_withheld. The description still adds meaning for idempotency_key beyond the schema's wording by framing reuse around 'identical request' and warning that a changed payload with the same key fails closed, though it says nothing about subscription_id or the projection parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource — 'Idempotently disable a monitor-only risk subscription' — and the qualifier 'monitor-only' narrows the scope precisely. Reading the name and this sentence is enough to distinguish it from fahali_subscribe_risk and fahali_update_subscription without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives solid operational guidance for retries ('retry an identical request with the same idempotency key; use a new key for any change') and receiver-side dedup, but never states when to choose this over the sibling fahali_update_subscription or fahali_list_risk_subscriptions. Usage is implied by the verb rather than contrasted with alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fahali_update_portfolio_watchADestructiveIdempotent
Idempotently update a persistent monitor-only, long-only watch's positions, connected-account scope, mandate, thresholds, interval, or status. Any short leg, hedge, negative exposure, or can_short=true request fails closed. Fahali never acquires recommendation, portfolio-action, order, or execution authority.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | ||
| limit | No | Optional maximum rows per projectable collection. Audit has no MCP projection cap; brief defaults to 3 and standard to 12. | |
| since | No | Optional lower timestamp bound for returned row collections. | |
| detail | No | Response depth. audit is the full-fidelity default; brief and standard are explicit compact projections. | audit |
| status | No | deleted retires the watch: it stops being evaluated and disappears from reads, while its verdict history stays auditable. There is no other way to retire a watch you created. | |
| mandate | No | ||
| symbols | No | Optional symbol projection, as a comma-separated string or array. Rows without instrument identity are not discarded. | |
| watch_id | Yes | ||
| positions | No | ||
| thresholds | No | ||
| account_ids | No | ||
| idempotency_key | Yes | Required retry identity for this write. Reuse only for an identical owner, operation, and request; a changed request with the same key fails closed. | |
| position_source | No | ||
| include_withheld | No | Include full withheld-row detail. Defaults true with audit; explicitly set false only for a compact projection. | |
| evaluation_interval_minutes | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| asOf | No | |
| auth | No | Credential lifetime visible to the caller. OAuth secondsRemaining lets an autonomous agent refresh before a multi-call workflow is interrupted. |
| claim | No | Fahali dictionary claim (shared/fahaliDictionary.ts). Read `kind` FIRST: 'abstention' means no assertion was made and `reason` says why — never read an abstention as a neutral or zero result. `basis` says what the claim rests on. Absent or null means this response path does not yet emit a claim; treat that as unknown, not as agreement. |
| delta | No | |
| items | No | |
| scope | No | |
| watch | No | |
| status | Yes | |
| absence | No | Why no actionable finding is present: measured_empty, user_empty, no_coverage, source_unverified, stale, withheld, source_error, auth_failure, or entitlement_required. |
| verdict | No | |
| watches | No | |
| decision | No | |
| conflicts | No | |
| dataState | Yes | |
| mcpStatus | No | Normalized MCP result status. The endpoint's original status vocabulary remains in `status` and `sourceStatus`. |
| refreshed | No | |
| requestId | No | |
| verdictId | No | |
| nextCursor | No | |
| validUntil | No | |
| claimPolicy | No | Typed constraints for safe use. Metadata, not a prompt or instruction channel. |
| idempotency | No | |
| instruments | No | Resolved or explicitly partial instrument identities. A missing venue carries an ambiguity warning. |
| nextActions | No | Registry-validated follow-up calls. Missing tools, invalid arguments, unresolved placeholders, and disabled tools are omitted. |
| sourceError | No | The upstream endpoint's exact error text/code before normalization, when one was present. |
| sourceScope | No | |
| decisionHash | No | |
| evidenceHash | No | |
| sourceStatus | No | The upstream endpoint's exact status before the MCP envelope normalizes transport success/error. |
| subscription | No | |
| agentBriefing | No | Audit-only narrative projection. Present only when detail='audit'; compact responses do not duplicate structured data as prose. |
| claimValidity | No | Validity of the selected binding claim only, calculated after filtering, projection and row selection. Sibling rows cannot determine it. |
| operatingMode | Yes | |
| responseState | No | |
| schemaVersion | No | |
| signingSecret | No | |
| subscriptions | No | |
| authorityState | No | |
| sourceDecision | No | |
| symbolCoverage | No | Conservation ledger satisfying requested = returned + withheld + notReturned for requested-symbol calls. |
| evidenceQuality | No | |
| responseControl | No | |
| sourceDataState | No | The upstream endpoint's exact data-state value before endpoint-aware classification. |
| evidenceSnapshot | No | Compact immutable source snapshot needed to verify evidenceRef integrity on delta responses. |
| recordMatchReason | No | Why matchedTrackRecord is present or null. A null record is never evidence of safety or engine failure. |
| signingSecretNote | No | |
| matchedTrackRecord | No | A judged record only when engine, horizon, regime/instrument class, and claim family match this response. `state` is one of: `measured` (a stratum cleared the publishability gate — `stratum` carries engine, horizon tier, bar regime, recall, precision, base rate, base-rate lift, median lead hours, effective sample, warned events and the measurement date); `withheld` (the gate ran and refused — `reason` says why, in words); `unavailable` (the record could not be read at all — an infrastructure failure that says nothing about the record). It is ONE stratum selected by recall, never a platform-wide accuracy. Null means no exact record match; read recordMatchReason. |
| methodologyVersion | No | |
| confidenceSemantics | No | Every confidence-bearing value with its score type, scale, calibration status, and probability flag. |
| decisionEligibility | No | Fail-closed binding-authority policy. WITHHELD means source evidence remains available for audit while normalized direction, actionability and execution fields are revoked. |
| directionEligibility | No | Current market-direction eligibility. Direction is authorized only by an exact, eligible producer stratum (canonical_verdict, canonical_symbol_verdict, committee_verdict) — read bindingAuthority to see which one bound. Widening WHO may bind did not weaken WHAT binding requires: the named producer must still hold a matching horizon/class/family record on a verified-only judged population, so an authority without a record still cannot bind. |
| executionEligibility | No | Fail-closed execution boundary. Portfolio monitoring tools always return WITHHELD with MONITOR_ONLY_NO_EXECUTION_AUTHORITY while Fahali has no capital path. |
| legacyFieldSemantics | Yes | |
| outputClassification | Yes | |
| monitoringEligibility | No | Current portfolio-monitoring validity based on captured identity, freshness, integrity, and the caller-supplied monitoring policy. ELIGIBLE authorizes observation/delivery only, never financial action. |
| sourceEvidenceQuality | No | |
| currentActionEligibility | No | Current eligibility of an immutable historical portfolio verdict. It never mutates the stored judgment being replayed. |
| sourceConfidenceSemantics | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructiveHint=true and idempotentHint=true, so the bar is lower; the description still adds real context by stating the fail-closed rules (short legs, hedges, negative exposure, can_short=true) and disclaiming recommendation/order/execution authority. It stops short of saying what state is lost if a field is omitted or what happens to prior positions on update.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences, front-loaded with the action and the constrained field set, with the safety constraint and authority disclaimer following in a logical order. Every clause carries weight; nothing is padded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need no explanation, and the destructive/retire semantics are documented in the schema for status. However, for a 15-parameter destructive update the description never states whether omitted fields are preserved or replaced (merge vs. full-replace semantics), which is the single most consequential unknown for an agent calling it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 47% across 15 parameters, so the description carries partial compensation; it enumerates the updatable field groups but adds no syntax or format detail beyond what the schema already states (e.g., the can_short 'must remain false' constraint is duplicated from the schema). Parameters like detail, limit, since, symbols, position_source, and include_withheld are left entirely to the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb plus enumerated resource fields ('positions, connected-account scope, mandate, thresholds, interval, or status'), which tells an agent exactly what can be mutated. It doesn't name the sibling it complements (fahali_watch_portfolio for creation, fahali_list_portfolio_watches for reads), so the boundary is inferable rather than stated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the objects it updates (an existing watch identified by watch_id) and by the fail-closed constraints, but there is no explicit 'use this when you need to change an existing watch, create with fahali_watch_portfolio instead' routing. No exclusions or prerequisite conditions are given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fahali_update_subscriptionADestructiveIdempotent
Idempotently change a monitor-only risk subscription's active/paused status, event filters, escalation threshold, or delivery target. Updating a webhook target rotates its signing secret once per idempotency key. Stored targets remain encrypted and no recommendation/order authority is introduced.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Optional maximum rows per projectable collection. Audit has no MCP projection cap; brief defaults to 3 and standard to 12. | |
| since | No | Optional lower timestamp bound for returned row collections. | |
| detail | No | Response depth. audit is the full-fidelity default; brief and standard are explicit compact projections. | audit |
| events | No | ||
| status | No | ||
| symbols | No | Optional symbol projection, as a comma-separated string or array. Rows without instrument identity are not discarded. | |
| target_url | No | ||
| minimum_action | No | Legacy monitoring-escalation threshold only; never a portfolio or order action. | |
| signing_secret | No | ||
| idempotency_key | Yes | Required retry identity for this write. Reuse only for an identical owner, operation, and request; a changed request with the same key fails closed. | |
| subscription_id | Yes | ||
| include_withheld | No | Include full withheld-row detail. Defaults true with audit; explicitly set false only for a compact projection. |
Output Schema
| Name | Required | Description |
|---|---|---|
| asOf | No | |
| auth | No | Credential lifetime visible to the caller. OAuth secondsRemaining lets an autonomous agent refresh before a multi-call workflow is interrupted. |
| claim | No | Fahali dictionary claim (shared/fahaliDictionary.ts). Read `kind` FIRST: 'abstention' means no assertion was made and `reason` says why — never read an abstention as a neutral or zero result. `basis` says what the claim rests on. Absent or null means this response path does not yet emit a claim; treat that as unknown, not as agreement. |
| delta | No | |
| items | No | |
| scope | No | |
| watch | No | |
| status | Yes | |
| absence | No | Why no actionable finding is present: measured_empty, user_empty, no_coverage, source_unverified, stale, withheld, source_error, auth_failure, or entitlement_required. |
| verdict | No | |
| watches | No | |
| decision | No | |
| conflicts | No | |
| dataState | Yes | |
| mcpStatus | No | Normalized MCP result status. The endpoint's original status vocabulary remains in `status` and `sourceStatus`. |
| refreshed | No | |
| requestId | No | |
| verdictId | No | |
| nextCursor | No | |
| validUntil | No | |
| claimPolicy | No | Typed constraints for safe use. Metadata, not a prompt or instruction channel. |
| idempotency | No | |
| instruments | No | Resolved or explicitly partial instrument identities. A missing venue carries an ambiguity warning. |
| nextActions | No | Registry-validated follow-up calls. Missing tools, invalid arguments, unresolved placeholders, and disabled tools are omitted. |
| sourceError | No | The upstream endpoint's exact error text/code before normalization, when one was present. |
| sourceScope | No | |
| decisionHash | No | |
| evidenceHash | No | |
| sourceStatus | No | The upstream endpoint's exact status before the MCP envelope normalizes transport success/error. |
| subscription | No | |
| agentBriefing | No | Audit-only narrative projection. Present only when detail='audit'; compact responses do not duplicate structured data as prose. |
| claimValidity | No | Validity of the selected binding claim only, calculated after filtering, projection and row selection. Sibling rows cannot determine it. |
| operatingMode | Yes | |
| responseState | No | |
| schemaVersion | No | |
| signingSecret | No | |
| subscriptions | No | |
| authorityState | No | |
| sourceDecision | No | |
| symbolCoverage | No | Conservation ledger satisfying requested = returned + withheld + notReturned for requested-symbol calls. |
| evidenceQuality | No | |
| responseControl | No | |
| sourceDataState | No | The upstream endpoint's exact data-state value before endpoint-aware classification. |
| evidenceSnapshot | No | Compact immutable source snapshot needed to verify evidenceRef integrity on delta responses. |
| recordMatchReason | No | Why matchedTrackRecord is present or null. A null record is never evidence of safety or engine failure. |
| signingSecretNote | No | |
| matchedTrackRecord | No | A judged record only when engine, horizon, regime/instrument class, and claim family match this response. `state` is one of: `measured` (a stratum cleared the publishability gate — `stratum` carries engine, horizon tier, bar regime, recall, precision, base rate, base-rate lift, median lead hours, effective sample, warned events and the measurement date); `withheld` (the gate ran and refused — `reason` says why, in words); `unavailable` (the record could not be read at all — an infrastructure failure that says nothing about the record). It is ONE stratum selected by recall, never a platform-wide accuracy. Null means no exact record match; read recordMatchReason. |
| methodologyVersion | No | |
| confidenceSemantics | No | Every confidence-bearing value with its score type, scale, calibration status, and probability flag. |
| decisionEligibility | No | Fail-closed binding-authority policy. WITHHELD means source evidence remains available for audit while normalized direction, actionability and execution fields are revoked. |
| directionEligibility | No | Current market-direction eligibility. Direction is authorized only by an exact, eligible producer stratum (canonical_verdict, canonical_symbol_verdict, committee_verdict) — read bindingAuthority to see which one bound. Widening WHO may bind did not weaken WHAT binding requires: the named producer must still hold a matching horizon/class/family record on a verified-only judged population, so an authority without a record still cannot bind. |
| executionEligibility | No | Fail-closed execution boundary. Portfolio monitoring tools always return WITHHELD with MONITOR_ONLY_NO_EXECUTION_AUTHORITY while Fahali has no capital path. |
| legacyFieldSemantics | Yes | |
| outputClassification | Yes | |
| monitoringEligibility | No | Current portfolio-monitoring validity based on captured identity, freshness, integrity, and the caller-supplied monitoring policy. ELIGIBLE authorizes observation/delivery only, never financial action. |
| sourceEvidenceQuality | No | |
| currentActionEligibility | No | Current eligibility of an immutable historical portfolio verdict. It never mutates the stored judgment being replayed. |
| sourceConfidenceSemantics | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, idempotentHint=true, and openWorldHint=true, so safety is partly covered; the description adds important non-obvious traits — per-key secret rotation, encryption at rest, and the absence of recommendation/order authority. It does not detail reversibility of a paused state or failure modes beyond the idempotency note.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three dense sentences, front-loaded with the operation and its mutable surface, with side effects (secret rotation, encryption, no trading authority) following. No filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present and return values handled there, the description covers the mutation surface and its notable side effects. Minor gap: the compaction/projection parameters (detail, limit, include_withheld) interact with this write's response but aren't tied to the behavior described.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Adds real meaning beyond the 58%-covered schema: it ties target_url to signing-secret rotation ('rotates its signing secret once per idempotency key'), clarifies encryption of stored targets, and frames minimum_action as a monitoring threshold, not an order action. The observation/projection params (limit, since, detail) are left to their schema descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (idempotently change) against a specific resource (monitor-only risk subscription) and enumerates the mutable fields: status, event filters, escalation threshold, delivery target. This clearly separates it from fahali_subscribe_risk, fahali_unsubscribe_risk, and fahali_list_risk_subscriptions.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The scoping phrase 'monitor-only risk subscription' implies this is the edit path for an existing subscription, but the description never names the alternatives (subscribe_risk, unsubscribe_risk, update_portfolio_watch) or states when-not-to-use. Usage is implied rather than explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fahali_watch_portfolioAIdempotent
Create a durable, monitor-only, long-only portfolio watch from supplied positions or the caller's connected accounts. Short legs, hedges, negative exposure, and connected books containing them fail closed until signed-exposure authority is separately certified. Fahali evaluates immediately and persists/re-evaluates the observation. Output labels are monitoring escalation only: no personal recommendation, portfolio action, order, or capital path exists.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | ||
| limit | No | Optional maximum rows per projectable collection. Audit has no MCP projection cap; brief defaults to 3 and standard to 12. | |
| since | No | Optional lower timestamp bound for returned row collections. | |
| detail | No | Response depth. audit is the full-fidelity default; brief and standard are explicit compact projections. | audit |
| mandate | No | ||
| symbols | No | Optional symbol projection, as a comma-separated string or array. Rows without instrument identity are not discarded. | |
| positions | No | Omit to watch connected accounts. Connected books are also rejected if any short leg is present. | |
| thresholds | No | ||
| account_ids | No | Optional connected-account selection. Omit for every connected account. | |
| idempotency_key | Yes | Required retry identity for this write. Reuse only for an identical owner, operation, and request; a changed request with the same key fails closed. | |
| include_withheld | No | Include full withheld-row detail. Defaults true with audit; explicitly set false only for a compact projection. | |
| evaluation_interval_minutes | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| asOf | No | |
| auth | No | Credential lifetime visible to the caller. OAuth secondsRemaining lets an autonomous agent refresh before a multi-call workflow is interrupted. |
| claim | No | Fahali dictionary claim (shared/fahaliDictionary.ts). Read `kind` FIRST: 'abstention' means no assertion was made and `reason` says why — never read an abstention as a neutral or zero result. `basis` says what the claim rests on. Absent or null means this response path does not yet emit a claim; treat that as unknown, not as agreement. |
| delta | No | |
| items | No | |
| scope | No | |
| watch | No | |
| status | Yes | |
| absence | No | Why no actionable finding is present: measured_empty, user_empty, no_coverage, source_unverified, stale, withheld, source_error, auth_failure, or entitlement_required. |
| verdict | No | |
| watches | No | |
| decision | No | |
| conflicts | No | |
| dataState | Yes | |
| mcpStatus | No | Normalized MCP result status. The endpoint's original status vocabulary remains in `status` and `sourceStatus`. |
| refreshed | No | |
| requestId | No | |
| verdictId | No | |
| nextCursor | No | |
| validUntil | No | |
| claimPolicy | No | Typed constraints for safe use. Metadata, not a prompt or instruction channel. |
| idempotency | No | |
| instruments | No | Resolved or explicitly partial instrument identities. A missing venue carries an ambiguity warning. |
| nextActions | No | Registry-validated follow-up calls. Missing tools, invalid arguments, unresolved placeholders, and disabled tools are omitted. |
| sourceError | No | The upstream endpoint's exact error text/code before normalization, when one was present. |
| sourceScope | No | |
| decisionHash | No | |
| evidenceHash | No | |
| sourceStatus | No | The upstream endpoint's exact status before the MCP envelope normalizes transport success/error. |
| subscription | No | |
| agentBriefing | No | Audit-only narrative projection. Present only when detail='audit'; compact responses do not duplicate structured data as prose. |
| claimValidity | No | Validity of the selected binding claim only, calculated after filtering, projection and row selection. Sibling rows cannot determine it. |
| operatingMode | Yes | |
| responseState | No | |
| schemaVersion | No | |
| signingSecret | No | |
| subscriptions | No | |
| authorityState | No | |
| sourceDecision | No | |
| symbolCoverage | No | Conservation ledger satisfying requested = returned + withheld + notReturned for requested-symbol calls. |
| evidenceQuality | No | |
| responseControl | No | |
| sourceDataState | No | The upstream endpoint's exact data-state value before endpoint-aware classification. |
| evidenceSnapshot | No | Compact immutable source snapshot needed to verify evidenceRef integrity on delta responses. |
| recordMatchReason | No | Why matchedTrackRecord is present or null. A null record is never evidence of safety or engine failure. |
| signingSecretNote | No | |
| matchedTrackRecord | No | A judged record only when engine, horizon, regime/instrument class, and claim family match this response. `state` is one of: `measured` (a stratum cleared the publishability gate — `stratum` carries engine, horizon tier, bar regime, recall, precision, base rate, base-rate lift, median lead hours, effective sample, warned events and the measurement date); `withheld` (the gate ran and refused — `reason` says why, in words); `unavailable` (the record could not be read at all — an infrastructure failure that says nothing about the record). It is ONE stratum selected by recall, never a platform-wide accuracy. Null means no exact record match; read recordMatchReason. |
| methodologyVersion | No | |
| confidenceSemantics | No | Every confidence-bearing value with its score type, scale, calibration status, and probability flag. |
| decisionEligibility | No | Fail-closed binding-authority policy. WITHHELD means source evidence remains available for audit while normalized direction, actionability and execution fields are revoked. |
| directionEligibility | No | Current market-direction eligibility. Direction is authorized only by an exact, eligible producer stratum (canonical_verdict, canonical_symbol_verdict, committee_verdict) — read bindingAuthority to see which one bound. Widening WHO may bind did not weaken WHAT binding requires: the named producer must still hold a matching horizon/class/family record on a verified-only judged population, so an authority without a record still cannot bind. |
| executionEligibility | No | Fail-closed execution boundary. Portfolio monitoring tools always return WITHHELD with MONITOR_ONLY_NO_EXECUTION_AUTHORITY while Fahali has no capital path. |
| legacyFieldSemantics | Yes | |
| outputClassification | Yes | |
| monitoringEligibility | No | Current portfolio-monitoring validity based on captured identity, freshness, integrity, and the caller-supplied monitoring policy. ELIGIBLE authorizes observation/delivery only, never financial action. |
| sourceEvidenceQuality | No | |
| currentActionEligibility | No | Current eligibility of an immutable historical portfolio verdict. It never mutates the stored judgment being replayed. |
| sourceConfidenceSemantics | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare write/idempotent/non-destructive/openWorld; the description adds the important traits: durable persistence, immediate evaluation plus re-evaluation, fail-closed rejection of short/hedged books, and the guarantee that outputs are escalation labels with no order or capital path. Consistent with readOnlyHint=false. It does not mention auth needs, rate limits, or what happens on idempotency-key conflict (that is left to the schema).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four tight sentences that front-load the action and scope, then constraints, then output semantics. Slightly jargon-heavy ('signed-exposure authority', 'projectable collection'), but every sentence carries information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists so return values need not be spelled out, and the description covers the key gates (long-only, durability, monitoring-only output). For a 12-parameter write with nested mandate/thresholds it leaves the mandate and threshold objects entirely to the schema, which is acceptable but not exhaustive.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 67% and the schema already explains idempotency_key, positions.side, mandate.can_short, include_withheld, and symbols in detail. The description only adds the positions-vs-connected-accounts dichotomy, which the schema's positions description also covers, so baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Create a durable, monitor-only, long-only portfolio watch from supplied positions or the caller's connected accounts.' That is clearly distinct from one-shot analysis siblings like fahali_analyze_custom_portfolio and from fahali_update_portfolio_watch, but the description never names those siblings, so the differentiation is inferential.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives a strong when-not condition (short legs, hedges, negative exposure fail closed until signed-exposure authority is certified) and implies durable/persistent monitoring is the use case. However, no alternative tool is named and there is no explicit guidance on when to pick this over fahali_analyze_custom_portfolio or fahali_get_portfolio_risk.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
64 tool updates
v1.28.1- Added
fahali_acknowledge_incident - Changed
fahali_analyze_custom_portfolio6 fields changed- added
Input schema / properties / detailAdded value: +{ + "default": "audit", + "description": "Response depth. audit is the full-fidelity default; brief and standard are explicit compact projections.", + "enum": [ + "brief", + "standard", + "audit" + ], + "type": "string" +} - added
Input schema / properties / include_withheldAdded value: +{ + "default": true, + "description": "Include full withheld-row detail. Defaults true with audit; explicitly set false only for a compact projection.", + "type": "boolean" +} - added
Input schema / properties / limitAdded value: +{ + "description": "Optional maximum rows per projectable collection. Audit has no MCP projection cap; brief defaults to 3 and standard to 12.", + "maximum": 100, + "minimum": 1, + "type": "integer" +} - added
Input schema / properties / sinceAdded value: +{ + "description": "Optional lower timestamp bound for returned row collections.", + "format": "date-time", + "type": "string" +} - changed
Input schema / properties / symbols / descriptionPrevious value: -"Alternative to positions: comma-separated symbol names (each assumed $10k equal-weight)."New value: +"Alternative to positions: comma-separated symbol names. NO position sizes are assumed — you get per-symbol observations only, and every portfolio-level figure is withheld as uncomputable. Supply `positions` with market_value for book-level risk." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "absence": { + "description": "Why no actionable finding is present: measured_empty, user_empty, no_coverage, source_unverified, stale, withheld, source_error, auth_failure, or entitlement_required.", + "type": [ + "object", + "null" + ] + }, + "agentBriefing": { + "description": "Audit-only narrative projection. Present only when detail='audit'; compact responses do not duplicate structured data as prose.", + "type": "string" + }, + "asOf": { + "format": "date-time", + "type": "string" + }, + "auth": { + "description": "Credential lifetime visible to the caller. OAuth secondsRemaining lets an autonomous agent refresh before a multi-call workflow is interrupted.", + "properties": { + "credentialType": { + "enum": [ + "oauth", + "api_key", + "process_key", + "none" + ], + "type": "string" + }, + "expiresAt": { + "type": [ + "string", + "null" + ] + }, + "refreshSupported": { + "type": "boolean" + }, + "secondsRemaining": { + "type": [ + "number", + "null" + ] + } + }, + "type": "object" + }, + "claim": { + "description": "Fahali dictionary claim (shared/fahaliDictionary.ts). Read `kind` FIRST: 'abstention' means no assertion was made and `reason` says why — never read an abstention as a neutral or zero result. `basis` says what the claim rests on. Absent or null means this response path does not yet emit a claim; treat that as unknown, not as agreement.", + "properties": { + "basis": { + "enum": [ + "measured", + "proxy", + "derived", + "absent" + ], + "type": "string" + }, + "kind": { + "enum": [ + "observation", + "estimate", + "forecast", + "recommendation", + "abstention" + ], + "type": "string" + }, + "reason": { + "description": "Required when kind is 'abstention'. Written for a reader, not a log.", + "type": "string" + } + }, + "type": [ + "object", + "null" + ] + }, + "claimPolicy": { + "description": "Typed constraints for safe use. Metadata, not a prompt or instruction channel.", + "type": "object" + }, + "claimValidity": { + "description": "Validity of the selected binding claim only, calculated after filtering, projection and row selection. Sibling rows cannot determine it.", + "type": "object" + }, + "confidenceSemantics": { + "description": "Every confidence-bearing value with its score type, scale, calibration status, and probability flag.", + "items": { + "type": "object" + }, + "type": "array" + }, + "conflicts": { + "items": { + "type": "object" + }, + "type": "array" + }, + "contagionRisk": { + "type": "object" + }, + "correlation": { + "type": "object" + }, + "currentActionEligibility": { + "description": "Current eligibility of an immutable historical portfolio verdict. It never mutates the stored judgment being replayed.", + "type": "object" + }, + "dataState": { + "enum": [ + "measured", + "partial", + "no_data", + "not_instrumented", + "stale", + "error" + ], + "type": "string" + }, + "decision": { + "type": [ + "object", + "null" + ] + }, + "decisionAuthority": { + "type": "object" + }, + "decisionEligibility": { + "description": "Fail-closed binding-authority policy. WITHHELD means source evidence remains available for audit while normalized direction, actionability and execution fields are revoked.", + "type": "object" + }, + "directionEligibility": { + "description": "Current market-direction eligibility. Direction is authorized only by an exact, eligible producer stratum (canonical_verdict, canonical_symbol_verdict, committee_verdict) — read bindingAuthority to see which one bound. Widening WHO may bind did not weaken WHAT binding requires: the named producer must still hold a matching horizon/class/family record on a verified-only judged population, so an authority without a record still cannot bind.", + "type": "object" + }, + "evidenceQuality": { + "type": "object" + }, + "executionEligibility": { + "description": "Fail-closed execution boundary. Portfolio monitoring tools always return WITHHELD with MONITOR_ONLY_NO_EXECUTION_AUTHORITY while Fahali has no capital path.", + "type": "object" + }, + "instruments": { + "description": "Resolved or explicitly partial instrument identities. A missing venue carries an ambiguity warning.", + "items": { + "type": "object" + }, + "type": "array" + }, + "matchedTrackRecord": { + "description": "A judged record only when engine, horizon, regime/instrument class, and claim family match this response. `state` is one of: `measured` (a stratum cleared the publishability gate — `stratum` carries engine, horizon tier, bar regime, recall, precision, base rate, base-rate lift, median lead hours, effective sample, warned events and the measurement date); `withheld` (the gate ran and refused — `reason` says why, in words); `unavailable` (the record could not be read at all — an infrastructure failure that says nothing about the record). It is ONE stratum selected by recall, never a platform-wide accuracy. Null means no exact record match; read recordMatchReason.", + "properties": { + "dataAsOf": { + "description": "When the record was computed. A figure without this reads as current forever.", + "type": "string" + }, + "reason": { + "description": "Present on `withheld` and `unavailable`: why there is no figure.", + "type": "string" + }, + "state": { + "enum": [ + "measured", + "withheld", + "unavailable" + ], + "type": "string" + }, + "stratum": { + "description": "Present only on `measured`. Precision must never be quoted without recall.", + "properties": { + "barRegime": { + "type": "string" + }, + "baseRatePct": { + "type": "number" + }, + "claimFamily": { + "description": "What this precision is ABOUT: `directional` (price moved the way the stratum said) or `magnitude` (a move exceeded the judge bar, carrying no direction). Never infer a direction from a `magnitude` row.", + "type": "string" + }, + "claimMeans": { + "description": "The record endpoint's own sentence explaining the claim family. Quote it beside any precision figure.", + "type": "string" + }, + "effectiveSample": { + "type": "number" + }, + "engine": { + "type": "string" + }, + "horizonTier": { + "type": "string" + }, + "leadMedianHours": { + "type": "number" + }, + "measuredOn": { + "type": "string" + }, + "precisionPct": { + "description": "Share of its warnings that held. Never quotable alone.", + "type": "number" + }, + "recallPct": { + "description": "Share of qualifying events this stratum warned on — the half a buyer is exposed to.", + "type": "number" + }, + "warnedEvents": { + "type": "number" + } + }, + "type": "object" + } + }, + "required": [ + "state" + ], + "type": [ + "object", + "null" + ] + }, + "mcpStatus": { + "description": "Normalized MCP result status. The endpoint's original status vocabulary remains in `status` and `sourceStatus`.", + "enum": [ + "ok", + "error" + ], + "type": "string" + }, + "monitoringEligibility": { + "description": "Current portfolio-monitoring validity based on captured identity, freshness, integrity, and the caller-supplied monitoring policy. ELIGIBLE authorizes observation/delivery only, never financial action.", + "type": "object" + }, + "nextActions": { + "description": "Registry-validated follow-up calls. Missing tools, invalid arguments, unresolved placeholders, and disabled tools are omitted.", + "items": { + "properties": { + "args": { + "additionalProperties": { + "type": "string" + }, + "type": "object" + }, + "requiredTier": { + "type": "string" + }, + "tool": { + "type": "string" + }, + "why": { + "type": "string" + } + }, + "required": [ + "tool", + "why" + ], + "type": "object" + }, + "type": "array" + }, + "portfolio": { + "properties": { + "cashBalance": { + "type": [ + "number", + "null" + ] + }, + "expectedDrawdownPct": { + "type": [ + "number", + "null" + ] + }, + "expectedShortfall95": { + "description": "Expected shortfall at 95% in currency, positive for a loss. Reported in dollars as well as percent because the percent field is rounded at 0.01pp.", + "type": [ + "number", + "null" + ] + }, + "expectedShortfallAttribution": { + "description": "Which holdings the expected shortfall is attributable to. Contributions are SIGNED, so a hedge that pays in the tail reports a negative number; componentSumDollars equals the reported expected shortfall exactly. Null when the figures are null.", + "type": [ + "object", + "null" + ] + }, + "fullyHedged": { + "type": [ + "boolean", + "null" + ] + }, + "grossExposure": { + "type": [ + "number", + "null" + ] + }, + "grossExposureMetric": { + "type": "object" + }, + "leverage": { + "type": [ + "number", + "null" + ] + }, + "netExposure": { + "type": [ + "number", + "null" + ] + }, + "overallRiskLevel": { + "type": [ + "string", + "null" + ] + }, + "overallRiskScore": { + "description": "0-1 scale; null without sized exposure and measured evidence.", + "type": [ + "number", + "null" + ] + }, + "riskMetricsBasis": { + "type": "object" + }, + "totalValue": { + "type": [ + "number", + "null" + ] + }, + "totalValueMetric": { + "type": "object" + }, + "valueAtRisk95": { + "type": [ + "number", + "null" + ] + }, + "varBacktest": { + "description": "Out-of-sample coverage test of the VaR quantile (Kupiec + Christoffersen), with the sample size stated. 'not_rejected' means the sample did not contradict the model, never that it is correct. Tests the quantile only, not expected shortfall.", + "type": [ + "object", + "null" + ] + } + }, + "type": "object" + }, + "positions": { + "items": { + "properties": { + "authorityReconciliation": { + "description": "Canonical-symbol direction plus explicitly withheld stateless portfolio actionability and non-binding compatibility monitoring.", + "type": "object" + }, + "correlationBasis": { + "type": "object" + }, + "correlationToPortfolio": { + "description": "Always null: the artifact has pair correlations but not the variances/covariances required for corr(asset, portfolio return).", + "type": "null" + }, + "correlationToPortfolioUnavailableReason": { + "type": "string" + }, + "recommendation": { + "description": "Deprecated compatibility monitoring label; never a direction or authorized action.", + "properties": { + "action": { + "enum": [ + "hold", + "watch", + "reduce" + ], + "type": "string" + }, + "binding": { + "enum": [ + false + ], + "type": "boolean" + }, + "deprecatedSemantics": { + "enum": [ + "monitoring_priority_only" + ], + "type": "string" + }, + "directional": { + "enum": [ + false + ], + "type": "boolean" + }, + "rationale": { + "type": "string" + } + }, + "type": [ + "object", + "null" + ] + }, + "riskObservation": { + "type": "object" + }, + "riskScore": { + "type": [ + "number", + "null" + ] + }, + "symbol": { + "type": "string" + }, + "weightedMeanPeerCorrelation": { + "description": "Mean of measured pairwise Pearson correlations to requested peers, gross-weighted when position sizes are supplied; not corr(asset, portfolio return).", + "type": [ + "number", + "null" + ] + } + }, + "type": "object" + }, + "type": "array" + }, + "recordMatchReason": { + "description": "Why matchedTrackRecord is present or null. A null record is never evidence of safety or engine failure.", + "type": "string" + }, + "requestId": { + "type": "string" + }, + "responseControl": { + "type": "object" + }, + "responseState": { + "enum": [ + "OK_WITH_FINDINGS", + "OK_NO_FINDINGS", + "PARTIAL", + "WITHHELD", + "NO_COVERAGE", + "ERROR" + ], + "type": "string" + }, + "schemaVersion": { + "enum": [ + "2.0" + ], + "type": "string" + }, + "scope": { + "type": "object" + }, + "sourceConfidenceSemantics": { + "type": [ + "array", + "object", + "null" + ] + }, + "sourceDataState": { + "description": "The upstream endpoint's exact data-state value before endpoint-aware classification.", + "type": [ + "string", + "null" + ] + }, + "sourceDecision": { + "type": [ + "object", + "null" + ] + }, + "sourceError": { + "description": "The upstream endpoint's exact error text/code before normalization, when one was present.", + "type": [ + "string", + "null" + ] + }, + "sourceEvidenceQuality": { + "type": [ + "object", + "null" + ] + }, + "sourceScope": { + "type": [ + "object", + "null" + ] + }, + "sourceStatus": { + "description": "The upstream endpoint's exact status before the MCP envelope normalizes transport success/error.", + "type": [ + "string", + "null" + ] + }, + "status": { + "description": "The endpoint's original status vocabulary (for example ok, partial, degraded, withheld, or no_alerts). Use mcpStatus for normalized transport success/error.", + "type": "string" + }, + "symbolCoverage": { + "description": "Conservation ledger satisfying requested = returned + withheld + notReturned for requested-symbol calls.", + "type": "object" + }, + "timestamp": { + "type": [ + "string", + "integer", + "number" + ] + } + }, + "type": "object" +}
- Added
fahali_create_alert - Added
fahali_daily_brief - Added
fahali_fact_check_narrative - Added
fahali_fetch_resource - Removed
fahali_get_72h_forecast - Added
fahali_get_active_incidents - Added
fahali_get_bundle - Added
fahali_get_capabilities - Added
fahali_get_capital_flow - Changed
fahali_get_case_studies6 fields changed- added
Input schema / properties / detailAdded value: +{ + "default": "audit", + "description": "Response depth. audit is the full-fidelity default; brief and standard are explicit compact projections.", + "enum": [ + "brief", + "standard", + "audit" + ], + "type": "string" +} - added
Input schema / properties / include_withheldAdded value: +{ + "default": true, + "description": "Include full withheld-row detail. Defaults true with audit; explicitly set false only for a compact projection.", + "type": "boolean" +} - added
Input schema / properties / limitAdded value: +{ + "description": "Optional maximum rows per projectable collection. Audit has no MCP projection cap; brief defaults to 3 and standard to 12.", + "maximum": 100, + "minimum": 1, + "type": "integer" +} - added
Input schema / properties / sinceAdded value: +{ + "description": "Optional lower timestamp bound for returned row collections.", + "format": "date-time", + "type": "string" +} - added
Input schema / properties / symbolsAdded value: +{ + "description": "Optional symbol projection, as a comma-separated string or array. Rows without instrument identity are not discarded.", + "items": { + "type": "string" + }, + "type": [ + "string", + "array" + ] +} - changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "absence": { + "description": "Why no actionable finding is present: measured_empty, user_empty, no_coverage, source_unverified, stale, withheld, source_error, auth_failure, or entitlement_required.", + "type": [ + "object", + "null" + ] + }, + "agentBriefing": { + "description": "Audit-only narrative projection. Present only when detail='audit'; compact responses do not duplicate structured data as prose.", + "type": "string" + }, + "asOf": { + "format": "date-time", + "type": "string" + }, + "auth": { + "description": "Credential lifetime visible to the caller. OAuth secondsRemaining lets an autonomous agent refresh before a multi-call workflow is interrupted.", + "properties": { + "credentialType": { + "enum": [ + "oauth", + "api_key", + "process_key", + "none" + ], + "type": "string" + }, + "expiresAt": { + "type": [ + "string", + "null" + ] + }, + "refreshSupported": { + "type": "boolean" + }, + "secondsRemaining": { + "type": [ + "number", + "null" + ] + } + }, + "type": "object" + }, + "cases": { + "items": { + "properties": { + "alertType": { + "type": "string" + }, + "confidence": { + "type": "number" + }, + "correct": { + "type": "boolean" + }, + "direction": { + "type": "string" + }, + "entryPrice": { + "type": "number" + }, + "outcomeKind": { + "type": "string" + }, + "outcomePrice": { + "type": "number" + }, + "profitPct": { + "type": "number" + }, + "ret24h": { + "type": "string" + }, + "ret4h": { + "type": "string" + }, + "symbol": { + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + }, + "claim": { + "description": "Fahali dictionary claim (shared/fahaliDictionary.ts). Read `kind` FIRST: 'abstention' means no assertion was made and `reason` says why — never read an abstention as a neutral or zero result. `basis` says what the claim rests on. Absent or null means this response path does not yet emit a claim; treat that as unknown, not as agreement.", + "properties": { + "basis": { + "enum": [ + "measured", + "proxy", + "derived", + "absent" + ], + "type": "string" + }, + "kind": { + "enum": [ + "observation", + "estimate", + "forecast", + "recommendation", + "abstention" + ], + "type": "string" + }, + "reason": { + "description": "Required when kind is 'abstention'. Written for a reader, not a log.", + "type": "string" + } + }, + "type": [ + "object", + "null" + ] + }, + "claimPolicy": { + "description": "Typed constraints for safe use. Metadata, not a prompt or instruction channel.", + "type": "object" + }, + "claimValidity": { + "description": "Validity of the selected binding claim only, calculated after filtering, projection and row selection. Sibling rows cannot determine it.", + "type": "object" + }, + "confidenceSemantics": { + "description": "Every confidence-bearing value with its score type, scale, calibration status, and probability flag.", + "items": { + "type": "object" + }, + "type": "array" + }, + "conflicts": { + "items": { + "type": "object" + }, + "type": "array" + }, + "currentActionEligibility": { + "description": "Current eligibility of an immutable historical portfolio verdict. It never mutates the stored judgment being replayed.", + "type": "object" + }, + "dataState": { + "enum": [ + "measured", + "partial", + "no_data", + "not_instrumented", + "stale", + "error" + ], + "type": "string" + }, + "decision": { + "type": [ + "object", + "null" + ] + }, + "decisionEligibility": { + "description": "Fail-closed binding-authority policy. WITHHELD means source evidence remains available for audit while normalized direction, actionability and execution fields are revoked.", + "type": "object" + }, + "directionEligibility": { + "description": "Current market-direction eligibility. Direction is authorized only by an exact, eligible producer stratum (canonical_verdict, canonical_symbol_verdict, committee_verdict) — read bindingAuthority to see which one bound. Widening WHO may bind did not weaken WHAT binding requires: the named producer must still hold a matching horizon/class/family record on a verified-only judged population, so an authority without a record still cannot bind.", + "type": "object" + }, + "evidenceQuality": { + "type": "object" + }, + "executionEligibility": { + "description": "Fail-closed execution boundary. Portfolio monitoring tools always return WITHHELD with MONITOR_ONLY_NO_EXECUTION_AUTHORITY while Fahali has no capital path.", + "type": "object" + }, + "instruments": { + "description": "Resolved or explicitly partial instrument identities. A missing venue carries an ambiguity warning.", + "items": { + "type": "object" + }, + "type": "array" + }, + "matchedTrackRecord": { + "description": "A judged record only when engine, horizon, regime/instrument class, and claim family match this response. `state` is one of: `measured` (a stratum cleared the publishability gate — `stratum` carries engine, horizon tier, bar regime, recall, precision, base rate, base-rate lift, median lead hours, effective sample, warned events and the measurement date); `withheld` (the gate ran and refused — `reason` says why, in words); `unavailable` (the record could not be read at all — an infrastructure failure that says nothing about the record). It is ONE stratum selected by recall, never a platform-wide accuracy. Null means no exact record match; read recordMatchReason.", + "properties": { + "dataAsOf": { + "description": "When the record was computed. A figure without this reads as current forever.", + "type": "string" + }, + "reason": { + "description": "Present on `withheld` and `unavailable`: why there is no figure.", + "type": "string" + }, + "state": { + "enum": [ + "measured", + "withheld", + "unavailable" + ], + "type": "string" + }, + "stratum": { + "description": "Present only on `measured`. Precision must never be quoted without recall.", + "properties": { + "barRegime": { + "type": "string" + }, + "baseRatePct": { + "type": "number" + }, + "claimFamily": { + "description": "What this precision is ABOUT: `directional` (price moved the way the stratum said) or `magnitude` (a move exceeded the judge bar, carrying no direction). Never infer a direction from a `magnitude` row.", + "type": "string" + }, + "claimMeans": { + "description": "The record endpoint's own sentence explaining the claim family. Quote it beside any precision figure.", + "type": "string" + }, + "effectiveSample": { + "type": "number" + }, + "engine": { + "type": "string" + }, + "horizonTier": { + "type": "string" + }, + "leadMedianHours": { + "type": "number" + }, + "measuredOn": { + "type": "string" + }, + "precisionPct": { + "description": "Share of its warnings that held. Never quotable alone.", + "type": "number" + }, + "recallPct": { + "description": "Share of qualifying events this stratum warned on — the half a buyer is exposed to.", + "type": "number" + }, + "warnedEvents": { + "type": "number" + } + }, + "type": "object" + } + }, + "required": [ + "state" + ], + "type": [ + "object", + "null" + ] + }, + "mcpStatus": { + "description": "Normalized MCP result status. The endpoint's original status vocabulary remains in `status` and `sourceStatus`.", + "enum": [ + "ok", + "error" + ], + "type": "string" + }, + "monitoringEligibility": { + "description": "Current portfolio-monitoring validity based on captured identity, freshness, integrity, and the caller-supplied monitoring policy. ELIGIBLE authorizes observation/delivery only, never financial action.", + "type": "object" + }, + "nextActions": { + "description": "Registry-validated follow-up calls. Missing tools, invalid arguments, unresolved placeholders, and disabled tools are omitted.", + "items": { + "properties": { + "args": { + "additionalProperties": { + "type": "string" + }, + "type": "object" + }, + "requiredTier": { + "type": "string" + }, + "tool": { + "type": "string" + }, + "why": { + "type": "string" + } + }, + "required": [ + "tool", + "why" + ], + "type": "object" + }, + "type": "array" + }, + "recordMatchReason": { + "description": "Why matchedTrackRecord is present or null. A null record is never evidence of safety or engine failure.", + "type": "string" + }, + "requestId": { + "type": "string" + }, + "responseControl": { + "type": "object" + }, + "responseState": { + "enum": [ + "OK_WITH_FINDINGS", + "OK_NO_FINDINGS", + "PARTIAL", + "WITHHELD", + "NO_COVERAGE", + "ERROR" + ], + "type": "string" + }, + "schemaVersion": { + "enum": [ + "2.0" + ], + "type": "string" + }, + "scope": { + "type": "object" + }, + "sourceConfidenceSemantics": { + "type": [ + "array", + "object", + "null" + ] + }, + "sourceDataState": { + "description": "The upstream endpoint's exact data-state value before endpoint-aware classification.", + "type": [ + "string", + "null" + ] + }, + "sourceDecision": { + "type": [ + "object", + "null" + ] + }, + "sourceError": { + "description": "The upstream endpoint's exact error text/code before normalization, when one was present.", + "type": [ + "string", + "null" + ] + }, + "sourceEvidenceQuality": { + "type": [ + "object", + "null" + ] + }, + "sourceScope": { + "type": [ + "object", + "null" + ] + }, + "sourceStatus": { + "description": "The upstream endpoint's exact status before the MCP envelope normalizes transport success/error.", + "type": [ + "string", + "null" + ] + }, + "status": { + "description": "The endpoint's original status vocabulary (for example ok, partial, degraded, withheld, or no_alerts). Use mcpStatus for normalized transport success/error.", + "type": "string" + }, + "symbolCoverage": { + "description": "Conservation ledger satisfying requested = returned + withheld + notReturned for requested-symbol calls.", + "type": "object" + }, + "total": { + "type": "integer" + } + }, + "type": "object" +}
- Changed
fahali_get_contagion_map6 fields changed- added
Input schema / properties / detailAdded value: +{ + "default": "audit", + "description": "Response depth. audit is the full-fidelity default; brief and standard are explicit compact projections.", + "enum": [ + "brief", + "standard", + "audit" + ], + "type": "string" +} - added
Input schema / properties / include_withheldAdded value: +{ + "default": true, + "description": "Include full withheld-row detail. Defaults true with audit; explicitly set false only for a compact projection.", + "type": "boolean" +} - added
Input schema / properties / limitAdded value: +{ + "description": "Optional maximum rows per projectable collection. Audit has no MCP projection cap; brief defaults to 3 and standard to 12.", + "maximum": 100, + "minimum": 1, + "type": "integer" +} - added
Input schema / properties / sinceAdded value: +{ + "description": "Optional lower timestamp bound for returned row collections.", + "format": "date-time", + "type": "string" +} - added
Input schema / properties / symbolsAdded value: +{ + "description": "Optional symbol projection, as a comma-separated string or array. Rows without instrument identity are not discarded.", + "items": { + "type": "string" + }, + "type": [ + "string", + "array" + ] +} - changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "absence": { + "description": "Why no actionable finding is present: measured_empty, user_empty, no_coverage, source_unverified, stale, withheld, source_error, auth_failure, or entitlement_required.", + "type": [ + "object", + "null" + ] + }, + "agentBriefing": { + "description": "Audit-only narrative projection. Present only when detail='audit'; compact responses do not duplicate structured data as prose.", + "type": "string" + }, + "asOf": { + "format": "date-time", + "type": "string" + }, + "auth": { + "description": "Credential lifetime visible to the caller. OAuth secondsRemaining lets an autonomous agent refresh before a multi-call workflow is interrupted.", + "properties": { + "credentialType": { + "enum": [ + "oauth", + "api_key", + "process_key", + "none" + ], + "type": "string" + }, + "expiresAt": { + "type": [ + "string", + "null" + ] + }, + "refreshSupported": { + "type": "boolean" + }, + "secondsRemaining": { + "type": [ + "number", + "null" + ] + } + }, + "type": "object" + }, + "claim": { + "type": [ + "object", + "null" + ] + }, + "claimPolicy": { + "description": "Typed constraints for safe use. Metadata, not a prompt or instruction channel.", + "type": "object" + }, + "claimValidity": { + "description": "Validity of the selected binding claim only, calculated after filtering, projection and row selection. Sibling rows cannot determine it.", + "type": "object" + }, + "clusters": { + "items": { + "properties": { + "edgeCount": { + "type": "integer" + }, + "leadOutDegree": { + "type": "integer" + }, + "leadSymbol": { + "description": "Present only when stored edge orientation clears the out-degree margin; not a causal lead claim.", + "type": "string" + }, + "riskLevel": { + "type": "string" + }, + "runnerUpOutDegree": { + "type": "integer" + }, + "symbols": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "type": "object" + }, + "type": "array" + }, + "confidenceSemantics": { + "description": "Every confidence-bearing value with its score type, scale, calibration status, and probability flag.", + "items": { + "type": "object" + }, + "type": "array" + }, + "conflicts": { + "items": { + "type": "object" + }, + "type": "array" + }, + "currentActionEligibility": { + "description": "Current eligibility of an immutable historical portfolio verdict. It never mutates the stored judgment being replayed.", + "type": "object" + }, + "dataState": { + "enum": [ + "measured", + "partial", + "no_data", + "error" + ], + "type": "string" + }, + "decision": { + "type": [ + "object", + "null" + ] + }, + "decisionEligibility": { + "description": "Fail-closed binding-authority policy. WITHHELD means source evidence remains available for audit while normalized direction, actionability and execution fields are revoked.", + "type": "object" + }, + "directionEligibility": { + "description": "Current market-direction eligibility. Direction is authorized only by an exact, eligible producer stratum (canonical_verdict, canonical_symbol_verdict, committee_verdict) — read bindingAuthority to see which one bound. Widening WHO may bind did not weaken WHAT binding requires: the named producer must still hold a matching horizon/class/family record on a verified-only judged population, so an authority without a record still cannot bind.", + "type": "object" + }, + "edges": { + "items": { + "properties": { + "confidence": { + "description": "Compatibility alias of strength; not a calibrated probability.", + "type": "number" + }, + "correlation": { + "description": "Compatibility alias of strength; this is lower-tail dependence, not ordinary Pearson correlation.", + "type": "number" + }, + "evidenceStrength": { + "enum": [ + "thin", + "repeated" + ], + "type": "string" + }, + "lagHours": { + "description": "Measured transmission lag in hours from the directed lead-lag graph, present only when this pair was measured there; null otherwise. Temporal precedence, not causation.", + "type": [ + "number", + "null" + ] + }, + "leadAsymmetry": { + "description": "Lead-lag asymmetry in units of its own standard error. Higher means the ordering is better separated from noise.", + "type": [ + "number", + "null" + ] + }, + "leadSymbol": { + "description": "The end measured to move FIRST. This is temporal precedence and NOT causation: the leader may not be moving the follower at all, and both may be following a third instrument this graph never sees. Present only alongside a non-null lagHours; unrelated to the source/target orientation, which is the producer row order.", + "type": [ + "string", + "null" + ] + }, + "sampleSize": { + "description": "Pair recurrence count in the one-hour scan window, not estimator observations.", + "type": "integer" + }, + "severity": { + "description": "Published band; high/extreme requires at least six recurrences.", + "enum": [ + "low", + "moderate", + "high", + "extreme" + ], + "type": "string" + }, + "severityGateApplied": { + "type": "boolean" + }, + "source": { + "type": "string" + }, + "strength": { + "description": "Latest lower-tail-dependence coefficient after the materiality gate.", + "type": "number" + }, + "strengthSeverity": { + "description": "Coefficient-only band before recurrence publication gating.", + "enum": [ + "low", + "moderate", + "high", + "extreme" + ], + "type": "string" + }, + "target": { + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + }, + "error": { + "type": "string" + }, + "evidenceQuality": { + "type": "object" + }, + "executionEligibility": { + "description": "Fail-closed execution boundary. Portfolio monitoring tools always return WITHHELD with MONITOR_ONLY_NO_EXECUTION_AUTHORITY while Fahali has no capital path.", + "type": "object" + }, + "instruments": { + "description": "Resolved or explicitly partial instrument identities. A missing venue carries an ambiguity warning.", + "items": { + "type": "object" + }, + "type": "array" + }, + "matchedTrackRecord": { + "description": "A judged record only when engine, horizon, regime/instrument class, and claim family match this response. `state` is one of: `measured` (a stratum cleared the publishability gate — `stratum` carries engine, horizon tier, bar regime, recall, precision, base rate, base-rate lift, median lead hours, effective sample, warned events and the measurement date); `withheld` (the gate ran and refused — `reason` says why, in words); `unavailable` (the record could not be read at all — an infrastructure failure that says nothing about the record). It is ONE stratum selected by recall, never a platform-wide accuracy. Null means no exact record match; read recordMatchReason.", + "properties": { + "dataAsOf": { + "description": "When the record was computed. A figure without this reads as current forever.", + "type": "string" + }, + "reason": { + "description": "Present on `withheld` and `unavailable`: why there is no figure.", + "type": "string" + }, + "state": { + "enum": [ + "measured", + "withheld", + "unavailable" + ], + "type": "string" + }, + "stratum": { + "description": "Present only on `measured`. Precision must never be quoted without recall.", + "properties": { + "barRegime": { + "type": "string" + }, + "baseRatePct": { + "type": "number" + }, + "claimFamily": { + "description": "What this precision is ABOUT: `directional` (price moved the way the stratum said) or `magnitude` (a move exceeded the judge bar, carrying no direction). Never infer a direction from a `magnitude` row.", + "type": "string" + }, + "claimMeans": { + "description": "The record endpoint's own sentence explaining the claim family. Quote it beside any precision figure.", + "type": "string" + }, + "effectiveSample": { + "type": "number" + }, + "engine": { + "type": "string" + }, + "horizonTier": { + "type": "string" + }, + "leadMedianHours": { + "type": "number" + }, + "measuredOn": { + "type": "string" + }, + "precisionPct": { + "description": "Share of its warnings that held. Never quotable alone.", + "type": "number" + }, + "recallPct": { + "description": "Share of qualifying events this stratum warned on — the half a buyer is exposed to.", + "type": "number" + }, + "warnedEvents": { + "type": "number" + } + }, + "type": "object" + } + }, + "required": [ + "state" + ], + "type": [ + "object", + "null" + ] + }, + "mcpStatus": { + "description": "Normalized MCP result status. The endpoint's original status vocabulary remains in `status` and `sourceStatus`.", + "enum": [ + "ok", + "error" + ], + "type": "string" + }, + "measurement": { + "type": "object" + }, + "message": { + "type": "string" + }, + "monitoringEligibility": { + "description": "Current portfolio-monitoring validity based on captured identity, freshness, integrity, and the caller-supplied monitoring policy. ELIGIBLE authorizes observation/delivery only, never financial action.", + "type": "object" + }, + "nextActions": { + "description": "Registry-validated follow-up calls. Missing tools, invalid arguments, unresolved placeholders, and disabled tools are omitted.", + "items": { + "properties": { + "args": { + "additionalProperties": { + "type": "string" + }, + "type": "object" + }, + "requiredTier": { + "type": "string" + }, + "tool": { + "type": "string" + }, + "why": { + "type": "string" + } + }, + "required": [ + "tool", + "why" + ], + "type": "object" + }, + "type": "array" + }, + "nodes": { + "items": { + "properties": { + "canonicalInstrumentId": { + "description": "Stable underlying key (BTC, ETH, NVDA...) — quoted-pair variants of the same asset share one identity", + "type": [ + "string", + "null" + ] + }, + "confidence": { + "description": "Detector strength on a 0-1 scale; not a calibrated probability.", + "type": "number" + }, + "riskLevel": { + "type": "string" + }, + "riskScore": { + "type": "number" + }, + "symbol": { + "type": "string" + }, + "underlyingId": { + "description": "Alias of canonicalInstrumentId", + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + "type": "array" + }, + "propagation": { + "description": "Where stress starts, where it travels next, and when it arrives. Null when the lead-lag producer has not written it yet — which is NOT the same as an empty origins array, which means the graph was read and no symbol cleared the bar.", + "properties": { + "minOriginEdges": { + "description": "Distinct-follower bar an origin must clear. Below it a ratio cannot tell one edge from a hundred.", + "type": "integer" + }, + "origins": { + "items": { + "properties": { + "arrivals": { + "items": { + "properties": { + "agreesWithDirect": { + "description": "False where a composed estimate contradicts a directly measured edge between the same pair.", + "type": [ + "boolean", + "null" + ] + }, + "arrivalHours": { + "description": "Cumulative tested lag along the earliest-arrival path.", + "type": "number" + }, + "basis": { + "description": "measured = one directed edge tested at this lag. composed = a multi-hop sum that was never tested as a whole; lead-lag is not transitive.", + "enum": [ + "measured", + "composed" + ], + "type": "string" + }, + "directLagHours": { + "type": [ + "number", + "null" + ] + }, + "lagOffGrid": { + "description": "True when arrivalHours is not one of the lags the producer tested.", + "type": "boolean" + }, + "path": { + "items": { + "type": "string" + }, + "type": "array" + }, + "symbol": { + "type": "string" + }, + "weakestAsymmetry": { + "description": "MINIMUM asymmetry along the path, never the mean — a chain is as strong as its weakest link.", + "type": "number" + } + }, + "type": "object" + }, + "type": "array" + }, + "downstreamCount": { + "type": "integer" + }, + "inDegree": { + "type": "integer" + }, + "origin": { + "type": "string" + }, + "originationScore": { + "description": "(out-asymmetry minus in-asymmetry) over their sum, in [-1, 1]. Null when the symbol has no edges at all, never 0.0 — a refusal is not a balanced score.", + "type": [ + "number", + "null" + ] + }, + "outDegree": { + "type": "integer" + } + }, + "type": "object" + }, + "type": "array" + }, + "reason": { + "type": [ + "string", + "null" + ] + }, + "symbolsInGraph": { + "type": "integer" + }, + "symbolsWithMeasuredScore": { + "type": "integer" + }, + "symbolsWithoutEdges": { + "type": "integer" + } + }, + "type": [ + "object", + "null" + ] + }, + "provenance": { + "type": "object" + }, + "recordMatchReason": { + "description": "Why matchedTrackRecord is present or null. A null record is never evidence of safety or engine failure.", + "type": "string" + }, + "requestId": { + "type": "string" + }, + "responseControl": { + "type": "object" + }, + "responseState": { + "enum": [ + "OK_WITH_FINDINGS", + "PARTIAL", + "OK_NO_FINDINGS", + "ERROR" + ], + "type": "string" + }, + "schemaVersion": { + "enum": [ + "2.0" + ], + "type": "string" + }, + "scope": { + "type": "object" + }, + "sourceConfidenceSemantics": { + "type": [ + "array", + "object", + "null" + ] + }, + "sourceDataState": { + "description": "The upstream endpoint's exact data-state value before endpoint-aware classification.", + "type": [ + "string", + "null" + ] + }, + "sourceDecision": { + "type": [ + "object", + "null" + ] + }, + "sourceError": { + "description": "The upstream endpoint's exact error text/code before normalization, when one was present.", + "type": [ + "string", + "null" + ] + }, + "sourceEvidenceQuality": { + "type": [ + "object", + "null" + ] + }, + "sourceScope": { + "type": [ + "object", + "null" + ] + }, + "sourceStatus": { + "description": "The upstream endpoint's exact status before the MCP envelope normalizes transport success/error.", + "type": [ + "string", + "null" + ] + }, + "status": { + "enum": [ + "ok", + "partial", + "error" + ], + "type": "string" + }, + "symbolCoverage": { + "description": "Conservation ledger satisfying requested = returned + withheld + notReturned for requested-symbol calls.", + "type": "object" + }, + "symbolsEligible": { + "description": "Symbols eligible for the lead-lag pass. The graph covers a SUBSET; publishing the origins without this implies universe-wide coverage.", + "type": [ + "integer", + "null" + ] + } + }, + "type": "object" +}
- Changed
fahali_get_correlation_matrix6 fields changed- added
Input schema / properties / detailAdded value: +{ + "default": "audit", + "description": "Response depth. audit is the full-fidelity default; brief and standard are explicit compact projections.", + "enum": [ + "brief", + "standard", + "audit" + ], + "type": "string" +} - added
Input schema / properties / include_withheldAdded value: +{ + "default": true, + "description": "Include full withheld-row detail. Defaults true with audit; explicitly set false only for a compact projection.", + "type": "boolean" +} - added
Input schema / properties / limitAdded value: +{ + "description": "Optional maximum rows per projectable collection. Audit has no MCP projection cap; brief defaults to 3 and standard to 12.", + "maximum": 100, + "minimum": 1, + "type": "integer" +} - added
Input schema / properties / sinceAdded value: +{ + "description": "Optional lower timestamp bound for returned row collections.", + "format": "date-time", + "type": "string" +} - added
Input schema / properties / symbolsAdded value: +{ + "description": "Optional requested book. Omit for Fahali's fixed six-asset reference set.", + "oneOf": [ + { + "description": "Comma-separated symbols.", + "type": "string" + }, + { + "items": { + "type": "string" + }, + "maxItems": 50, + "minItems": 2, + "type": "array" + } + ] +} - changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "absence": { + "description": "Why no actionable finding is present: measured_empty, user_empty, no_coverage, source_unverified, stale, withheld, source_error, auth_failure, or entitlement_required.", + "type": [ + "object", + "null" + ] + }, + "agentBriefing": { + "description": "Audit-only narrative projection. Present only when detail='audit'; compact responses do not duplicate structured data as prose.", + "type": "string" + }, + "artifactStatus": { + "enum": [ + "measured", + "unavailable" + ], + "type": "string" + }, + "asOf": { + "type": [ + "string", + "null" + ] + }, + "auth": { + "description": "Credential lifetime visible to the caller. OAuth secondsRemaining lets an autonomous agent refresh before a multi-call workflow is interrupted.", + "properties": { + "credentialType": { + "enum": [ + "oauth", + "api_key", + "process_key", + "none" + ], + "type": "string" + }, + "expiresAt": { + "type": [ + "string", + "null" + ] + }, + "refreshSupported": { + "type": "boolean" + }, + "secondsRemaining": { + "type": [ + "number", + "null" + ] + } + }, + "type": "object" + }, + "basis": { + "type": [ + "object", + "null" + ] + }, + "claim": { + "type": [ + "object", + "null" + ] + }, + "claimPolicy": { + "description": "Typed constraints for safe use. Metadata, not a prompt or instruction channel.", + "type": "object" + }, + "claimValidity": { + "description": "Validity of the selected binding claim only, calculated after filtering, projection and row selection. Sibling rows cannot determine it.", + "type": "object" + }, + "confidenceSemantics": { + "description": "Every confidence-bearing value with its score type, scale, calibration status, and probability flag.", + "items": { + "type": "object" + }, + "type": "array" + }, + "conflicts": { + "items": { + "type": "object" + }, + "type": "array" + }, + "coverage": { + "items": { + "items": { + "type": [ + "number", + "null" + ] + }, + "type": "array" + }, + "type": "array" + }, + "currentActionEligibility": { + "description": "Current eligibility of an immutable historical portfolio verdict. It never mutates the stored judgment being replayed.", + "type": "object" + }, + "dataState": { + "enum": [ + "measured", + "partial", + "no_data", + "stale", + "error" + ], + "type": "string" + }, + "decision": { + "type": [ + "object", + "null" + ] + }, + "decisionEligibility": { + "description": "Fail-closed binding-authority policy. WITHHELD means source evidence remains available for audit while normalized direction, actionability and execution fields are revoked.", + "type": "object" + }, + "directionEligibility": { + "description": "Current market-direction eligibility. Direction is authorized only by an exact, eligible producer stratum (canonical_verdict, canonical_symbol_verdict, committee_verdict) — read bindingAuthority to see which one bound. Widening WHO may bind did not weaken WHAT binding requires: the named producer must still hold a matching horizon/class/family record on a verified-only judged population, so an authority without a record still cannot bind.", + "type": "object" + }, + "error": { + "description": "Machine-readable error code on invalid_request, query_failed, invalid_artifact, or transport failures.", + "type": "string" + }, + "evidenceQuality": { + "type": "object" + }, + "executionEligibility": { + "description": "Fail-closed execution boundary. Portfolio monitoring tools always return WITHHELD with MONITOR_ONLY_NO_EXECUTION_AUTHORITY while Fahali has no capital path.", + "type": "object" + }, + "instruments": { + "description": "Resolved or explicitly partial instrument identities. A missing venue carries an ambiguity warning.", + "items": { + "type": "object" + }, + "type": "array" + }, + "interpretation": { + "type": "string" + }, + "matchedTrackRecord": { + "description": "A judged record only when engine, horizon, regime/instrument class, and claim family match this response. `state` is one of: `measured` (a stratum cleared the publishability gate — `stratum` carries engine, horizon tier, bar regime, recall, precision, base rate, base-rate lift, median lead hours, effective sample, warned events and the measurement date); `withheld` (the gate ran and refused — `reason` says why, in words); `unavailable` (the record could not be read at all — an infrastructure failure that says nothing about the record). It is ONE stratum selected by recall, never a platform-wide accuracy. Null means no exact record match; read recordMatchReason.", + "properties": { + "dataAsOf": { + "description": "When the record was computed. A figure without this reads as current forever.", + "type": "string" + }, + "reason": { + "description": "Present on `withheld` and `unavailable`: why there is no figure.", + "type": "string" + }, + "state": { + "enum": [ + "measured", + "withheld", + "unavailable" + ], + "type": "string" + }, + "stratum": { + "description": "Present only on `measured`. Precision must never be quoted without recall.", + "properties": { + "barRegime": { + "type": "string" + }, + "baseRatePct": { + "type": "number" + }, + "claimFamily": { + "description": "What this precision is ABOUT: `directional` (price moved the way the stratum said) or `magnitude` (a move exceeded the judge bar, carrying no direction). Never infer a direction from a `magnitude` row.", + "type": "string" + }, + "claimMeans": { + "description": "The record endpoint's own sentence explaining the claim family. Quote it beside any precision figure.", + "type": "string" + }, + "effectiveSample": { + "type": "number" + }, + "engine": { + "type": "string" + }, + "horizonTier": { + "type": "string" + }, + "leadMedianHours": { + "type": "number" + }, + "measuredOn": { + "type": "string" + }, + "precisionPct": { + "description": "Share of its warnings that held. Never quotable alone.", + "type": "number" + }, + "recallPct": { + "description": "Share of qualifying events this stratum warned on — the half a buyer is exposed to.", + "type": "number" + }, + "warnedEvents": { + "type": "number" + } + }, + "type": "object" + } + }, + "required": [ + "state" + ], + "type": [ + "object", + "null" + ] + }, + "matrix": { + "items": { + "items": { + "type": [ + "number", + "null" + ] + }, + "type": "array" + }, + "type": "array" + }, + "mcpStatus": { + "description": "Normalized MCP result status. The endpoint's original status vocabulary remains in `status` and `sourceStatus`.", + "enum": [ + "ok", + "error" + ], + "type": "string" + }, + "message": { + "description": "Source-preserved explanation of the unavailable artifact state; never replace it with a calm-market inference.", + "type": "string" + }, + "monitoringEligibility": { + "description": "Current portfolio-monitoring validity based on captured identity, freshness, integrity, and the caller-supplied monitoring policy. ELIGIBLE authorizes observation/delivery only, never financial action.", + "type": "object" + }, + "nextActions": { + "description": "Registry-validated follow-up calls. Missing tools, invalid arguments, unresolved placeholders, and disabled tools are omitted.", + "items": { + "properties": { + "args": { + "additionalProperties": { + "type": "string" + }, + "type": "object" + }, + "requiredTier": { + "type": "string" + }, + "tool": { + "type": "string" + }, + "why": { + "type": "string" + } + }, + "required": [ + "tool", + "why" + ], + "type": "object" + }, + "type": "array" + }, + "observations": { + "items": { + "items": { + "type": [ + "integer", + "null" + ] + }, + "type": "array" + }, + "type": "array" + }, + "perSymbol": { + "items": { + "type": "object" + }, + "type": "array" + }, + "policies": { + "items": { + "items": { + "type": [ + "string", + "null" + ] + }, + "type": "array" + }, + "type": "array" + }, + "reason": { + "description": "Why the canonical covariance artifact was unavailable. Present with every unavailable artifact response.", + "enum": [ + "invalid_request", + "not_found", + "query_failed", + "stale", + "invalid_artifact" + ], + "type": "string" + }, + "recordMatchReason": { + "description": "Why matchedTrackRecord is present or null. A null record is never evidence of safety or engine failure.", + "type": "string" + }, + "requestId": { + "type": "string" + }, + "requestedCoverage": { + "type": "object" + }, + "responseControl": { + "type": "object" + }, + "responseState": { + "enum": [ + "OK_WITH_FINDINGS", + "PARTIAL", + "OK_NO_FINDINGS", + "WITHHELD", + "ERROR" + ], + "type": "string" + }, + "schemaVersion": { + "enum": [ + "2.0" + ], + "type": "string" + }, + "scope": { + "type": "object" + }, + "sourceConfidenceSemantics": { + "type": [ + "array", + "object", + "null" + ] + }, + "sourceDataState": { + "description": "The upstream endpoint's exact data-state value before endpoint-aware classification.", + "type": [ + "string", + "null" + ] + }, + "sourceDecision": { + "type": [ + "object", + "null" + ] + }, + "sourceError": { + "description": "The upstream endpoint's exact error text/code before normalization, when one was present.", + "type": [ + "string", + "null" + ] + }, + "sourceEvidenceQuality": { + "type": [ + "object", + "null" + ] + }, + "sourceScope": { + "type": [ + "object", + "null" + ] + }, + "sourceStatus": { + "description": "The upstream endpoint's exact status before the MCP envelope normalizes transport success/error.", + "type": [ + "string", + "null" + ] + }, + "status": { + "enum": [ + "ok", + "partial", + "withheld", + "error" + ], + "type": "string" + }, + "symbolCoverage": { + "description": "Conservation ledger satisfying requested = returned + withheld + notReturned for requested-symbol calls.", + "type": "object" + }, + "symbols": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "type": "object" +}
- Removed
fahali_get_dark_pool_activity - Added
fahali_get_detection_activity - Added
fahali_get_engine_board - Changed
fahali_get_engine_status6 fields changed- added
Input schema / properties / detailAdded value: +{ + "default": "audit", + "description": "Response depth. audit is the full-fidelity default; brief and standard are explicit compact projections.", + "enum": [ + "brief", + "standard", + "audit" + ], + "type": "string" +} - added
Input schema / properties / include_withheldAdded value: +{ + "default": true, + "description": "Include full withheld-row detail. Defaults true with audit; explicitly set false only for a compact projection.", + "type": "boolean" +} - added
Input schema / properties / limitAdded value: +{ + "description": "Optional maximum rows per projectable collection. Audit has no MCP projection cap; brief defaults to 3 and standard to 12.", + "maximum": 100, + "minimum": 1, + "type": "integer" +} - added
Input schema / properties / sinceAdded value: +{ + "description": "Optional lower timestamp bound for returned row collections.", + "format": "date-time", + "type": "string" +} - added
Input schema / properties / symbolsAdded value: +{ + "description": "Optional symbol projection, as a comma-separated string or array. Rows without instrument identity are not discarded.", + "items": { + "type": "string" + }, + "type": [ + "string", + "array" + ] +} - changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "absence": { + "description": "Why no actionable finding is present: measured_empty, user_empty, no_coverage, source_unverified, stale, withheld, source_error, auth_failure, or entitlement_required.", + "type": [ + "object", + "null" + ] + }, + "agentBriefing": { + "description": "Audit-only narrative projection. Present only when detail='audit'; compact responses do not duplicate structured data as prose.", + "type": "string" + }, + "agent_authored_excluded": { + "properties": { + "alerts_7d": { + "type": [ + "integer", + "null" + ] + }, + "distinct_types_7d": { + "type": [ + "integer", + "null" + ] + }, + "note": { + "type": "string" + } + }, + "type": "object" + }, + "asOf": { + "format": "date-time", + "type": "string" + }, + "asof": { + "format": "date-time", + "type": "string" + }, + "attribution": { + "properties": { + "alert_types_known": { + "type": "integer" + }, + "alerts_7d_attributed": { + "type": [ + "integer", + "null" + ] + }, + "alerts_7d_mixed_bucket": { + "type": [ + "integer", + "null" + ] + }, + "alerts_7d_total": { + "type": [ + "integer", + "null" + ] + }, + "alerts_7d_unattributed": { + "type": [ + "integer", + "null" + ] + }, + "no_alerts_in_window": { + "type": [ + "boolean", + "null" + ] + }, + "note": { + "type": "string" + }, + "unattributed_pct": { + "type": [ + "number", + "null" + ] + } + }, + "type": "object" + }, + "auth": { + "description": "Credential lifetime visible to the caller. OAuth secondsRemaining lets an autonomous agent refresh before a multi-call workflow is interrupted.", + "properties": { + "credentialType": { + "enum": [ + "oauth", + "api_key", + "process_key", + "none" + ], + "type": "string" + }, + "expiresAt": { + "type": [ + "string", + "null" + ] + }, + "refreshSupported": { + "type": "boolean" + }, + "secondsRemaining": { + "type": [ + "number", + "null" + ] + } + }, + "type": "object" + }, + "authority": { + "description": "Distinct authorities for engine identity, compute liveness, and publication diagnostics.", + "type": "object" + }, + "claim": { + "description": "Fahali dictionary claim (shared/fahaliDictionary.ts). Read `kind` FIRST: 'abstention' means no assertion was made and `reason` says why — never read an abstention as a neutral or zero result. `basis` says what the claim rests on. Absent or null means this response path does not yet emit a claim; treat that as unknown, not as agreement.", + "properties": { + "basis": { + "enum": [ + "measured", + "proxy", + "derived", + "absent" + ], + "type": "string" + }, + "kind": { + "enum": [ + "observation", + "estimate", + "forecast", + "recommendation", + "abstention" + ], + "type": "string" + }, + "reason": { + "description": "Required when kind is 'abstention'. Written for a reader, not a log.", + "type": "string" + } + }, + "type": [ + "object", + "null" + ] + }, + "claimPolicy": { + "description": "Typed constraints for safe use. Metadata, not a prompt or instruction channel.", + "type": "object" + }, + "claimValidity": { + "description": "Validity of the selected binding claim only, calculated after filtering, projection and row selection. Sibling rows cannot determine it.", + "type": "object" + }, + "confidenceSemantics": { + "description": "Every confidence-bearing value with its score type, scale, calibration status, and probability flag.", + "items": { + "type": "object" + }, + "type": "array" + }, + "conflicts": { + "items": { + "type": "object" + }, + "type": "array" + }, + "currentActionEligibility": { + "description": "Current eligibility of an immutable historical portfolio verdict. It never mutates the stored judgment being replayed.", + "type": "object" + }, + "dataState": { + "enum": [ + "measured", + "partial", + "no_data", + "not_instrumented", + "stale", + "error" + ], + "type": "string" + }, + "data_state": { + "enum": [ + "measured", + "partial", + "no_data", + "error" + ], + "type": "string" + }, + "decision": { + "type": [ + "object", + "null" + ] + }, + "decisionEligibility": { + "description": "Fail-closed binding-authority policy. WITHHELD means source evidence remains available for audit while normalized direction, actionability and execution fields are revoked.", + "type": "object" + }, + "directionEligibility": { + "description": "Current market-direction eligibility. Direction is authorized only by an exact, eligible producer stratum (canonical_verdict, canonical_symbol_verdict, committee_verdict) — read bindingAuthority to see which one bound. Widening WHO may bind did not weaken WHAT binding requires: the named producer must still hold a matching horizon/class/family record on a verified-only judged population, so an authority without a record still cannot bind.", + "type": "object" + }, + "engines": { + "items": { + "properties": { + "compute": { + "type": "object" + }, + "count_1h": { + "description": "Null when the judgment window is unavailable or incomplete; zero only after a complete empty window.", + "type": [ + "integer", + "null" + ] + }, + "count_24h": { + "description": "Null when the judgment window is unavailable or incomplete; zero only after a complete empty window.", + "type": [ + "integer", + "null" + ] + }, + "count_7d": { + "description": "Null when the judgment window is unavailable or incomplete; zero only after a complete empty window.", + "type": [ + "integer", + "null" + ] + }, + "data_state": { + "type": "string" + }, + "interpretation": { + "type": "string" + }, + "judgment": { + "properties": { + "data_state": { + "type": "string" + }, + "last_registered_at": { + "type": [ + "string", + "null" + ] + }, + "last_resolved_at": { + "type": [ + "string", + "null" + ] + }, + "registrations_1h": { + "type": [ + "integer", + "null" + ] + }, + "registrations_24h": { + "type": [ + "integer", + "null" + ] + }, + "registrations_7d": { + "type": [ + "integer", + "null" + ] + }, + "resolutions_24h": { + "type": [ + "integer", + "null" + ] + }, + "resolutions_7d": { + "type": [ + "integer", + "null" + ] + } + }, + "type": "object" + }, + "key": { + "type": "string" + }, + "last_fired": { + "type": [ + "string", + "null" + ] + }, + "name": { + "type": "string" + }, + "publication": { + "properties": { + "alerts_1h": { + "type": [ + "integer", + "null" + ] + }, + "alerts_24h": { + "type": [ + "integer", + "null" + ] + }, + "alerts_7d": { + "type": [ + "integer", + "null" + ] + }, + "attribution": { + "type": "string" + }, + "data_state": { + "type": "string" + }, + "last_published_at": { + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + "status": { + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + }, + "evidenceQuality": { + "type": "object" + }, + "executionEligibility": { + "description": "Fail-closed execution boundary. Portfolio monitoring tools always return WITHHELD with MONITOR_ONLY_NO_EXECUTION_AUTHORITY while Fahali has no capital path.", + "type": "object" + }, + "instruments": { + "description": "Resolved or explicitly partial instrument identities. A missing venue carries an ambiguity warning.", + "items": { + "type": "object" + }, + "type": "array" + }, + "market_context": { + "type": "object" + }, + "matchedTrackRecord": { + "description": "A judged record only when engine, horizon, regime/instrument class, and claim family match this response. `state` is one of: `measured` (a stratum cleared the publishability gate — `stratum` carries engine, horizon tier, bar regime, recall, precision, base rate, base-rate lift, median lead hours, effective sample, warned events and the measurement date); `withheld` (the gate ran and refused — `reason` says why, in words); `unavailable` (the record could not be read at all — an infrastructure failure that says nothing about the record). It is ONE stratum selected by recall, never a platform-wide accuracy. Null means no exact record match; read recordMatchReason.", + "properties": { + "dataAsOf": { + "description": "When the record was computed. A figure without this reads as current forever.", + "type": "string" + }, + "reason": { + "description": "Present on `withheld` and `unavailable`: why there is no figure.", + "type": "string" + }, + "state": { + "enum": [ + "measured", + "withheld", + "unavailable" + ], + "type": "string" + }, + "stratum": { + "description": "Present only on `measured`. Precision must never be quoted without recall.", + "properties": { + "barRegime": { + "type": "string" + }, + "baseRatePct": { + "type": "number" + }, + "claimFamily": { + "description": "What this precision is ABOUT: `directional` (price moved the way the stratum said) or `magnitude` (a move exceeded the judge bar, carrying no direction). Never infer a direction from a `magnitude` row.", + "type": "string" + }, + "claimMeans": { + "description": "The record endpoint's own sentence explaining the claim family. Quote it beside any precision figure.", + "type": "string" + }, + "effectiveSample": { + "type": "number" + }, + "engine": { + "type": "string" + }, + "horizonTier": { + "type": "string" + }, + "leadMedianHours": { + "type": "number" + }, + "measuredOn": { + "type": "string" + }, + "precisionPct": { + "description": "Share of its warnings that held. Never quotable alone.", + "type": "number" + }, + "recallPct": { + "description": "Share of qualifying events this stratum warned on — the half a buyer is exposed to.", + "type": "number" + }, + "warnedEvents": { + "type": "number" + } + }, + "type": "object" + } + }, + "required": [ + "state" + ], + "type": [ + "object", + "null" + ] + }, + "mcpStatus": { + "description": "Normalized MCP result status. The endpoint's original status vocabulary remains in `status` and `sourceStatus`.", + "enum": [ + "ok", + "error" + ], + "type": "string" + }, + "measured_window": { + "description": "Scheduled-rollup coverage, producer freshness, probe failures and count reliability.", + "type": "object" + }, + "monitoringEligibility": { + "description": "Current portfolio-monitoring validity based on captured identity, freshness, integrity, and the caller-supplied monitoring policy. ELIGIBLE authorizes observation/delivery only, never financial action.", + "type": "object" + }, + "nextActions": { + "description": "Registry-validated follow-up calls. Missing tools, invalid arguments, unresolved placeholders, and disabled tools are omitted.", + "items": { + "properties": { + "args": { + "additionalProperties": { + "type": "string" + }, + "type": "object" + }, + "requiredTier": { + "type": "string" + }, + "tool": { + "type": "string" + }, + "why": { + "type": "string" + } + }, + "required": [ + "tool", + "why" + ], + "type": "object" + }, + "type": "array" + }, + "probe_errors": { + "items": { + "type": "object" + }, + "type": "array" + }, + "recordMatchReason": { + "description": "Why matchedTrackRecord is present or null. A null record is never evidence of safety or engine failure.", + "type": "string" + }, + "registry": { + "description": "Generated cross-repository registry digest and heartbeat-contract validation state.", + "type": "object" + }, + "requestId": { + "type": "string" + }, + "responseControl": { + "type": "object" + }, + "responseState": { + "enum": [ + "OK_WITH_FINDINGS", + "OK_NO_FINDINGS", + "PARTIAL", + "WITHHELD", + "NO_COVERAGE", + "ERROR" + ], + "type": "string" + }, + "schemaVersion": { + "enum": [ + "2.0" + ], + "type": "string" + }, + "scope": { + "type": "object" + }, + "sourceConfidenceSemantics": { + "type": [ + "array", + "object", + "null" + ] + }, + "sourceDataState": { + "description": "The upstream endpoint's exact data-state value before endpoint-aware classification.", + "type": [ + "string", + "null" + ] + }, + "sourceDecision": { + "type": [ + "object", + "null" + ] + }, + "sourceError": { + "description": "The upstream endpoint's exact error text/code before normalization, when one was present.", + "type": [ + "string", + "null" + ] + }, + "sourceEvidenceQuality": { + "type": [ + "object", + "null" + ] + }, + "sourceScope": { + "type": [ + "object", + "null" + ] + }, + "sourceStatus": { + "description": "The upstream endpoint's exact status before the MCP envelope normalizes transport success/error.", + "type": [ + "string", + "null" + ] + }, + "status": { + "enum": [ + "ok", + "partial", + "error" + ], + "type": "string" + }, + "symbolCoverage": { + "description": "Conservation ledger satisfying requested = returned + withheld + notReturned for requested-symbol calls.", + "type": "object" + }, + "unmapped_alert_types": { + "items": { + "type": "object" + }, + "type": [ + "array", + "null" + ] + }, + "unmatched_subsystem_heartbeats": { + "items": { + "type": "object" + }, + "type": "array" + } + }, + "type": "object" +}
- Added
fahali_get_evidence - Added
fahali_get_fall_warnings - Changed
fahali_get_flash_crash_risk6 fields changed- added
Input schema / properties / detailAdded value: +{ + "default": "audit", + "description": "Response depth. audit is the full-fidelity default; brief and standard are explicit compact projections.", + "enum": [ + "brief", + "standard", + "audit" + ], + "type": "string" +} - added
Input schema / properties / include_withheldAdded value: +{ + "default": true, + "description": "Include full withheld-row detail. Defaults true with audit; explicitly set false only for a compact projection.", + "type": "boolean" +} - added
Input schema / properties / limitAdded value: +{ + "description": "Optional maximum rows per projectable collection. Audit has no MCP projection cap; brief defaults to 3 and standard to 12.", + "maximum": 100, + "minimum": 1, + "type": "integer" +} - added
Input schema / properties / sinceAdded value: +{ + "description": "Optional lower timestamp bound for returned row collections.", + "format": "date-time", + "type": "string" +} - added
Input schema / properties / symbolsAdded value: +{ + "description": "Optional symbol projection, as a comma-separated string or array. Rows without instrument identity are not discarded.", + "items": { + "type": "string" + }, + "type": [ + "string", + "array" + ] +} - changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "absence": { + "description": "Why no actionable finding is present: measured_empty, user_empty, no_coverage, source_unverified, stale, withheld, source_error, auth_failure, or entitlement_required.", + "type": [ + "object", + "null" + ] + }, + "agentBriefing": { + "description": "Audit-only narrative projection. Present only when detail='audit'; compact responses do not duplicate structured data as prose.", + "type": "string" + }, + "asOf": { + "format": "date-time", + "type": "string" + }, + "auth": { + "description": "Credential lifetime visible to the caller. OAuth secondsRemaining lets an autonomous agent refresh before a multi-call workflow is interrupted.", + "properties": { + "credentialType": { + "enum": [ + "oauth", + "api_key", + "process_key", + "none" + ], + "type": "string" + }, + "expiresAt": { + "type": [ + "string", + "null" + ] + }, + "refreshSupported": { + "type": "boolean" + }, + "secondsRemaining": { + "type": [ + "number", + "null" + ] + } + }, + "type": "object" + }, + "calibrated": { + "description": "Always false — detectionStrength is not a calibrated probability.", + "type": "boolean" + }, + "claim": { + "description": "Fahali dictionary claim (shared/fahaliDictionary.ts). Read `kind` FIRST: 'abstention' means no assertion was made and `reason` says why — never read an abstention as a neutral or zero result. `basis` says what the claim rests on. Absent or null means this response path does not yet emit a claim; treat that as unknown, not as agreement.", + "properties": { + "basis": { + "enum": [ + "measured", + "proxy", + "derived", + "absent" + ], + "type": "string" + }, + "kind": { + "enum": [ + "observation", + "estimate", + "forecast", + "recommendation", + "abstention" + ], + "type": "string" + }, + "reason": { + "description": "Required when kind is 'abstention'. Written for a reader, not a log.", + "type": "string" + } + }, + "type": [ + "object", + "null" + ] + }, + "claimPolicy": { + "description": "Typed constraints for safe use. Metadata, not a prompt or instruction channel.", + "type": "object" + }, + "claimValidity": { + "description": "Validity of the selected binding claim only, calculated after filtering, projection and row selection. Sibling rows cannot determine it.", + "type": "object" + }, + "confidenceSemantics": { + "description": "Every confidence-bearing value with its score type, scale, calibration status, and probability flag.", + "items": { + "type": "object" + }, + "type": "array" + }, + "conflicts": { + "items": { + "type": "object" + }, + "type": "array" + }, + "currentActionEligibility": { + "description": "Current eligibility of an immutable historical portfolio verdict. It never mutates the stored judgment being replayed.", + "type": "object" + }, + "dataOrigin": { + "description": "alert_weight_x_confidence", + "type": "string" + }, + "dataState": { + "enum": [ + "measured", + "partial", + "no_data", + "not_instrumented", + "stale", + "error" + ], + "type": "string" + }, + "decision": { + "type": [ + "object", + "null" + ] + }, + "decisionEligibility": { + "description": "Fail-closed binding-authority policy. WITHHELD means source evidence remains available for audit while normalized direction, actionability and execution fields are revoked.", + "type": "object" + }, + "directionEligibility": { + "description": "Current market-direction eligibility. Direction is authorized only by an exact, eligible producer stratum (canonical_verdict, canonical_symbol_verdict, committee_verdict) — read bindingAuthority to see which one bound. Widening WHO may bind did not weaken WHAT binding requires: the named producer must still hold a matching horizon/class/family record on a verified-only judged population, so an authority without a record still cannot bind.", + "type": "object" + }, + "disclaimer": { + "type": "string" + }, + "evidenceQuality": { + "type": "object" + }, + "executionEligibility": { + "description": "Fail-closed execution boundary. Portfolio monitoring tools always return WITHHELD with MONITOR_ONLY_NO_EXECUTION_AUTHORITY while Fahali has no capital path.", + "type": "object" + }, + "instruments": { + "description": "Resolved instrument identities carried across from the api-server (every top name here is typically a leveraged/inverse product — read identity before reading direction).", + "items": { + "type": "object" + }, + "type": "array" + }, + "matchedTrackRecord": { + "description": "A judged record only when engine, horizon, regime/instrument class, and claim family match this response. `state` is one of: `measured` (a stratum cleared the publishability gate — `stratum` carries engine, horizon tier, bar regime, recall, precision, base rate, base-rate lift, median lead hours, effective sample, warned events and the measurement date); `withheld` (the gate ran and refused — `reason` says why, in words); `unavailable` (the record could not be read at all — an infrastructure failure that says nothing about the record). It is ONE stratum selected by recall, never a platform-wide accuracy. Null means no exact record match; read recordMatchReason.", + "properties": { + "dataAsOf": { + "description": "When the record was computed. A figure without this reads as current forever.", + "type": "string" + }, + "reason": { + "description": "Present on `withheld` and `unavailable`: why there is no figure.", + "type": "string" + }, + "state": { + "enum": [ + "measured", + "withheld", + "unavailable" + ], + "type": "string" + }, + "stratum": { + "description": "Present only on `measured`. Precision must never be quoted without recall.", + "properties": { + "barRegime": { + "type": "string" + }, + "baseRatePct": { + "type": "number" + }, + "claimFamily": { + "description": "What this precision is ABOUT: `directional` (price moved the way the stratum said) or `magnitude` (a move exceeded the judge bar, carrying no direction). Never infer a direction from a `magnitude` row.", + "type": "string" + }, + "claimMeans": { + "description": "The record endpoint's own sentence explaining the claim family. Quote it beside any precision figure.", + "type": "string" + }, + "effectiveSample": { + "type": "number" + }, + "engine": { + "type": "string" + }, + "horizonTier": { + "type": "string" + }, + "leadMedianHours": { + "type": "number" + }, + "measuredOn": { + "type": "string" + }, + "precisionPct": { + "description": "Share of its warnings that held. Never quotable alone.", + "type": "number" + }, + "recallPct": { + "description": "Share of qualifying events this stratum warned on — the half a buyer is exposed to.", + "type": "number" + }, + "warnedEvents": { + "type": "number" + } + }, + "type": "object" + } + }, + "required": [ + "state" + ], + "type": [ + "object", + "null" + ] + }, + "mcpStatus": { + "description": "Normalized MCP result status. The endpoint's original status vocabulary remains in `status` and `sourceStatus`.", + "enum": [ + "ok", + "error" + ], + "type": "string" + }, + "monitoringEligibility": { + "description": "Current portfolio-monitoring validity based on captured identity, freshness, integrity, and the caller-supplied monitoring policy. ELIGIBLE authorizes observation/delivery only, never financial action.", + "type": "object" + }, + "nextActions": { + "description": "Registry-validated follow-up calls. Missing tools, invalid arguments, unresolved placeholders, and disabled tools are omitted.", + "items": { + "properties": { + "args": { + "additionalProperties": { + "type": "string" + }, + "type": "object" + }, + "requiredTier": { + "type": "string" + }, + "tool": { + "type": "string" + }, + "why": { + "type": "string" + } + }, + "required": [ + "tool", + "why" + ], + "type": "object" + }, + "type": "array" + }, + "recordMatchReason": { + "description": "Why matchedTrackRecord is present or null. A null record is never evidence of safety or engine failure.", + "type": "string" + }, + "requestId": { + "type": "string" + }, + "responseControl": { + "type": "object" + }, + "responseState": { + "enum": [ + "OK_WITH_FINDINGS", + "OK_NO_FINDINGS", + "PARTIAL", + "WITHHELD", + "NO_COVERAGE", + "ERROR" + ], + "type": "string" + }, + "schemaVersion": { + "enum": [ + "2.0" + ], + "type": "string" + }, + "scope": { + "type": "object" + }, + "signals": { + "items": { + "properties": { + "detectionStrength": { + "description": "0-1 UNCALIBRATED signal strength (risk_weight × confidence), NOT P(crash).", + "type": "number" + }, + "detectionStrengthPct": { + "type": "number" + }, + "precursorType": { + "type": [ + "string", + "null" + ] + }, + "severity": { + "type": "string" + }, + "symbol": { + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + }, + "sourceConfidenceSemantics": { + "type": [ + "array", + "object", + "null" + ] + }, + "sourceDataState": { + "description": "The upstream endpoint's exact data-state value before endpoint-aware classification.", + "type": [ + "string", + "null" + ] + }, + "sourceDecision": { + "type": [ + "object", + "null" + ] + }, + "sourceError": { + "description": "The upstream endpoint's exact error text/code before normalization, when one was present.", + "type": [ + "string", + "null" + ] + }, + "sourceEvidenceQuality": { + "type": [ + "object", + "null" + ] + }, + "sourceScope": { + "type": [ + "object", + "null" + ] + }, + "sourceStatus": { + "description": "The upstream endpoint's exact status before the MCP envelope normalizes transport success/error.", + "type": [ + "string", + "null" + ] + }, + "status": { + "type": "string" + }, + "summary": { + "properties": { + "note": { + "type": [ + "string", + "null" + ] + }, + "precursorConcentrationPct": { + "type": [ + "number", + "null" + ] + }, + "topDetectionStrengthPct": { + "type": [ + "number", + "null" + ] + }, + "topSymbol": { + "description": "Null whenever the leader is not separated from second place — the name is withheld and the tie size is reported instead.", + "type": [ + "string", + "null" + ] + }, + "topSymbolTiedCount": { + "description": "How many symbols share the top detection strength when topSymbol is withheld.", + "type": [ + "integer", + "null" + ] + }, + "topSymbolWithheld": { + "description": "True when no single leader could be named.", + "type": [ + "boolean", + "null" + ] + } + }, + "type": "object" + }, + "symbolCoverage": { + "description": "Conservation ledger satisfying requested = returned + withheld + notReturned for requested-symbol calls.", + "type": "object" + }, + "timestamp": { + "type": [ + "string", + "integer", + "number" + ] + } + }, + "type": "object" +}
- Added
fahali_get_forecast - Changed
fahali_get_highest_conviction_signals6 fields changed- added
Input schema / properties / detailAdded value: +{ + "default": "audit", + "description": "Response depth. audit is the full-fidelity default; brief and standard are explicit compact projections.", + "enum": [ + "brief", + "standard", + "audit" + ], + "type": "string" +} - added
Input schema / properties / include_withheldAdded value: +{ + "default": true, + "description": "Include full withheld-row detail. Defaults true with audit; explicitly set false only for a compact projection.", + "type": "boolean" +} - added
Input schema / properties / limitAdded value: +{ + "description": "Optional maximum rows per projectable collection. Audit has no MCP projection cap; brief defaults to 3 and standard to 12.", + "maximum": 100, + "minimum": 1, + "type": "integer" +} - added
Input schema / properties / sinceAdded value: +{ + "description": "Optional lower timestamp bound for returned row collections.", + "format": "date-time", + "type": "string" +} - added
Input schema / properties / symbolsAdded value: +{ + "description": "Optional symbol projection, as a comma-separated string or array. Rows without instrument identity are not discarded.", + "items": { + "type": "string" + }, + "type": [ + "string", + "array" + ] +} - changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "absence": { + "description": "Why no actionable finding is present: measured_empty, user_empty, no_coverage, source_unverified, stale, withheld, source_error, auth_failure, or entitlement_required.", + "type": [ + "object", + "null" + ] + }, + "agentBriefing": { + "description": "Audit-only narrative projection. Present only when detail='audit'; compact responses do not duplicate structured data as prose.", + "type": "string" + }, + "asOf": { + "format": "date-time", + "type": "string" + }, + "auth": { + "description": "Credential lifetime visible to the caller. OAuth secondsRemaining lets an autonomous agent refresh before a multi-call workflow is interrupted.", + "properties": { + "credentialType": { + "enum": [ + "oauth", + "api_key", + "process_key", + "none" + ], + "type": "string" + }, + "expiresAt": { + "type": [ + "string", + "null" + ] + }, + "refreshSupported": { + "type": "boolean" + }, + "secondsRemaining": { + "type": [ + "number", + "null" + ] + } + }, + "type": "object" + }, + "claim": { + "description": "Fahali dictionary claim (shared/fahaliDictionary.ts). Read `kind` FIRST: 'abstention' means no assertion was made and `reason` says why — never read an abstention as a neutral or zero result. `basis` says what the claim rests on. Absent or null means this response path does not yet emit a claim; treat that as unknown, not as agreement.", + "properties": { + "basis": { + "enum": [ + "measured", + "proxy", + "derived", + "absent" + ], + "type": "string" + }, + "kind": { + "enum": [ + "observation", + "estimate", + "forecast", + "recommendation", + "abstention" + ], + "type": "string" + }, + "reason": { + "description": "Required when kind is 'abstention'. Written for a reader, not a log.", + "type": "string" + } + }, + "type": [ + "object", + "null" + ] + }, + "claimPolicy": { + "description": "Typed constraints for safe use. Metadata, not a prompt or instruction channel.", + "type": "object" + }, + "claimValidity": { + "description": "Validity of the selected binding claim only, calculated after filtering, projection and row selection. Sibling rows cannot determine it.", + "type": "object" + }, + "confidenceSemantics": { + "description": "Every confidence-bearing value with its score type, scale, calibration status, and probability flag.", + "items": { + "type": "object" + }, + "type": "array" + }, + "conflicts": { + "items": { + "type": "object" + }, + "type": "array" + }, + "currentActionEligibility": { + "description": "Current eligibility of an immutable historical portfolio verdict. It never mutates the stored judgment being replayed.", + "type": "object" + }, + "dataState": { + "enum": [ + "measured", + "partial", + "no_data", + "not_instrumented", + "stale", + "error" + ], + "type": "string" + }, + "decision": { + "type": [ + "object", + "null" + ] + }, + "decisionAuthority": { + "description": "Declares this endpoint an evidence ranking and points to canonical_verdict/fahali_get_market_decision as the sole binding direction authority.", + "type": "object" + }, + "decisionEligibility": { + "description": "Fail-closed binding-authority policy. WITHHELD means source evidence remains available for audit while normalized direction, actionability and execution fields are revoked.", + "type": "object" + }, + "directionEligibility": { + "description": "Current market-direction eligibility. Direction is authorized only by an exact, eligible producer stratum (canonical_verdict, canonical_symbol_verdict, committee_verdict) — read bindingAuthority to see which one bound. Widening WHO may bind did not weaken WHAT binding requires: the named producer must still hold a matching horizon/class/family record on a verified-only judged population, so an authority without a record still cannot bind.", + "type": "object" + }, + "evidenceQuality": { + "type": "object" + }, + "executionEligibility": { + "description": "Fail-closed execution boundary. Portfolio monitoring tools always return WITHHELD with MONITOR_ONLY_NO_EXECUTION_AUTHORITY while Fahali has no capital path.", + "type": "object" + }, + "guardrailBlockedCount": { + "description": "Verdicts blocked by the Guardrail Agent this cycle (blocked verdicts are never served)", + "type": "integer" + }, + "instruments": { + "description": "Resolved or explicitly partial instrument identities. A missing venue carries an ambiguity warning.", + "items": { + "type": "object" + }, + "type": "array" + }, + "items": { + "items": { + "properties": { + "action": { + "enum": [ + "buy", + "sell", + "neutral" + ], + "type": "string" + }, + "bindingAuthority": { + "enum": [ + "canonical_verdict" + ], + "type": "string" + }, + "bindingDirection": { + "description": "This evidence-ranking endpoint does not emit the binding direction.", + "type": "null" + }, + "committeeCounts": { + "type": "object" + }, + "committeeDirectionalState": { + "enum": [ + "EVIDENCE_AVAILABLE", + "WITHHELD" + ], + "type": "string" + }, + "committeeEvidenceDirection": { + "description": "Exact committee evidence direction when its publication gate clears. Never the binding market direction.", + "type": [ + "string", + "null" + ] + }, + "concurrentAlertFamilies": { + "description": "CONTEXT, NEVER CONVICTION: count of distinct alert families that co-fired on this symbol (measured 2026-08-05 to be shared-input redundancy, not independent consensus). Ranking runs on forecast-tier evidence, not this number. Formerly named engineCount — that name misled agents into treating it as a conviction score.", + "type": "integer" + }, + "direction": { + "description": "Retired ambiguous compatibility field. Always null so it cannot shadow canonical_verdict.", + "type": "null" + }, + "directionRole": { + "enum": [ + "committee_evidence_non_binding" + ], + "type": "string" + }, + "directionalConviction": { + "description": "Share of reporting committee engines that agree; non-binding.", + "type": [ + "number", + "null" + ] + }, + "directionalState": { + "enum": [ + "EVIDENCE_AVAILABLE", + "WITHHELD" + ], + "type": "string" + }, + "directionalWithheldReason": { + "type": [ + "string", + "null" + ] + }, + "engines": { + "description": "Canonical engine keys from the live registry", + "items": { + "type": "string" + }, + "type": "array" + }, + "lastTs": { + "format": "date-time", + "type": "string" + }, + "riskConviction": { + "description": "Ordinal stress/setup strength, not a probability and not a direction.", + "type": [ + "number", + "null" + ] + }, + "severity": { + "enum": [ + "EXTREME", + "HIGH", + "ELEVATED", + "WATCH" + ], + "type": "string" + }, + "symbol": { + "type": "string" + }, + "topType": { + "type": "string" + }, + "why": { + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + }, + "matchedTrackRecord": { + "description": "A judged record only when engine, horizon, regime/instrument class, and claim family match this response. `state` is one of: `measured` (a stratum cleared the publishability gate — `stratum` carries engine, horizon tier, bar regime, recall, precision, base rate, base-rate lift, median lead hours, effective sample, warned events and the measurement date); `withheld` (the gate ran and refused — `reason` says why, in words); `unavailable` (the record could not be read at all — an infrastructure failure that says nothing about the record). It is ONE stratum selected by recall, never a platform-wide accuracy. Null means no exact record match; read recordMatchReason.", + "properties": { + "dataAsOf": { + "description": "When the record was computed. A figure without this reads as current forever.", + "type": "string" + }, + "reason": { + "description": "Present on `withheld` and `unavailable`: why there is no figure.", + "type": "string" + }, + "state": { + "enum": [ + "measured", + "withheld", + "unavailable" + ], + "type": "string" + }, + "stratum": { + "description": "Present only on `measured`. Precision must never be quoted without recall.", + "properties": { + "barRegime": { + "type": "string" + }, + "baseRatePct": { + "type": "number" + }, + "claimFamily": { + "description": "What this precision is ABOUT: `directional` (price moved the way the stratum said) or `magnitude` (a move exceeded the judge bar, carrying no direction). Never infer a direction from a `magnitude` row.", + "type": "string" + }, + "claimMeans": { + "description": "The record endpoint's own sentence explaining the claim family. Quote it beside any precision figure.", + "type": "string" + }, + "effectiveSample": { + "type": "number" + }, + "engine": { + "type": "string" + }, + "horizonTier": { + "type": "string" + }, + "leadMedianHours": { + "type": "number" + }, + "measuredOn": { + "type": "string" + }, + "precisionPct": { + "description": "Share of its warnings that held. Never quotable alone.", + "type": "number" + }, + "recallPct": { + "description": "Share of qualifying events this stratum warned on — the half a buyer is exposed to.", + "type": "number" + }, + "warnedEvents": { + "type": "number" + } + }, + "type": "object" + } + }, + "required": [ + "state" + ], + "type": [ + "object", + "null" + ] + }, + "mcpStatus": { + "description": "Normalized MCP result status. The endpoint's original status vocabulary remains in `status` and `sourceStatus`.", + "enum": [ + "ok", + "error" + ], + "type": "string" + }, + "monitoringEligibility": { + "description": "Current portfolio-monitoring validity based on captured identity, freshness, integrity, and the caller-supplied monitoring policy. ELIGIBLE authorizes observation/delivery only, never financial action.", + "type": "object" + }, + "nextActions": { + "description": "Registry-validated follow-up calls. Missing tools, invalid arguments, unresolved placeholders, and disabled tools are omitted.", + "items": { + "properties": { + "args": { + "additionalProperties": { + "type": "string" + }, + "type": "object" + }, + "requiredTier": { + "type": "string" + }, + "tool": { + "type": "string" + }, + "why": { + "type": "string" + } + }, + "required": [ + "tool", + "why" + ], + "type": "object" + }, + "type": "array" + }, + "provenance": { + "description": "Data provenance for each response field — engine count and names are measured, action direction is a proxy derived from alert direction signals.", + "properties": { + "action": { + "enum": [ + "proxy" + ], + "type": "string" + }, + "engineCount": { + "enum": [ + "measured" + ], + "type": "string" + }, + "engines": { + "enum": [ + "measured" + ], + "type": "string" + }, + "severity": { + "enum": [ + "measured" + ], + "type": "string" + }, + "why": { + "enum": [ + "measured" + ], + "type": "string" + } + }, + "type": "object" + }, + "recordMatchReason": { + "description": "Why matchedTrackRecord is present or null. A null record is never evidence of safety or engine failure.", + "type": "string" + }, + "requestId": { + "type": "string" + }, + "responseControl": { + "type": "object" + }, + "responseState": { + "enum": [ + "OK_WITH_FINDINGS", + "OK_NO_FINDINGS", + "PARTIAL", + "WITHHELD", + "NO_COVERAGE", + "ERROR" + ], + "type": "string" + }, + "schemaVersion": { + "enum": [ + "2.0" + ], + "type": "string" + }, + "scope": { + "type": "object" + }, + "sourceConfidenceSemantics": { + "type": [ + "array", + "object", + "null" + ] + }, + "sourceDataState": { + "description": "The upstream endpoint's exact data-state value before endpoint-aware classification.", + "type": [ + "string", + "null" + ] + }, + "sourceDecision": { + "type": [ + "object", + "null" + ] + }, + "sourceError": { + "description": "The upstream endpoint's exact error text/code before normalization, when one was present.", + "type": [ + "string", + "null" + ] + }, + "sourceEvidenceQuality": { + "type": [ + "object", + "null" + ] + }, + "sourceScope": { + "type": [ + "object", + "null" + ] + }, + "sourceStatus": { + "description": "The upstream endpoint's exact status before the MCP envelope normalizes transport success/error.", + "type": [ + "string", + "null" + ] + }, + "status": { + "description": "The endpoint's original status vocabulary (for example ok, partial, degraded, withheld, or no_alerts). Use mcpStatus for normalized transport success/error.", + "type": "string" + }, + "symbolCoverage": { + "description": "Conservation ledger satisfying requested = returned + withheld + notReturned for requested-symbol calls.", + "type": "object" + }, + "verdicts": { + "description": "Full non-binding Master Analyst committee products. Each includes the complete canonical-roster evidence snapshot and detection-service runtime telemetry; use the canonical verdict for the authoritative direction.", + "items": { + "description": "Full non-binding committee evidence product. It preserves membership, dissent, evidence, limitations, actions, invalidation, confidence components, provenance, and engine telemetry; only the canonical arbiter publishes the binding market direction.", + "properties": { + "actionOptions": { + "items": { + "properties": { + "action": { + "type": "string" + }, + "rationale": { + "type": "string" + }, + "riskLevel": { + "enum": [ + "low", + "moderate", + "high" + ], + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + }, + "agentsAgreeing": { + "items": { + "type": "string" + }, + "type": "array" + }, + "agentsAgreeingCount": { + "type": "integer" + }, + "agentsDisagreeing": { + "items": { + "type": "string" + }, + "type": "array" + }, + "agentsDisagreeingCount": { + "type": "integer" + }, + "agentsSilent": { + "items": { + "type": "string" + }, + "type": "array" + }, + "agentsSilentCount": { + "type": "integer" + }, + "assetClass": { + "type": "string" + }, + "bindingAuthority": { + "enum": [ + "canonical_verdict", + null + ], + "type": [ + "string", + "null" + ] + }, + "bindingDirection": { + "type": "null" + }, + "committee": { + "description": "Committee evidence census. It is an input to the canonical arbiter, never a second binding direction authority.", + "properties": { + "abstained": { + "items": { + "type": "string" + }, + "type": [ + "array", + "null" + ] + }, + "abstained_unavailable_reason": { + "type": [ + "string", + "null" + ] + }, + "agreeing": { + "items": { + "type": "string" + }, + "type": "array" + }, + "disagreeing": { + "items": { + "type": "string" + }, + "type": "array" + }, + "dissent_evidence": { + "items": { + "properties": { + "dataStatus": { + "type": "string" + }, + "direction": { + "enum": [ + "bullish", + "bearish", + "neutral", + "directionless" + ], + "type": "string" + }, + "engine": { + "type": "string" + }, + "magnitude": { + "type": [ + "number", + "null" + ] + }, + "observation": { + "type": [ + "string", + "null" + ] + }, + "timeframe": { + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + }, + "minority": { + "items": { + "type": "string" + }, + "type": "array" + }, + "no_read": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "type": "object" + }, + "committeeEvidenceDirection": { + "description": "Explicit non-binding committee direction on the evidence-ranking projection.", + "type": [ + "string", + "null" + ] + }, + "confidence": { + "maximum": 1, + "minimum": 0, + "type": "number" + }, + "confidenceBreakdown": { + "properties": { + "directionalConsensus": { + "type": "number" + }, + "evidenceQuality": { + "type": "number" + }, + "historicalAccuracy": { + "type": "number" + } + }, + "type": "object" + }, + "confidenceScale": { + "type": "string" + }, + "contributingEvidenceIds": { + "items": { + "type": "string" + }, + "type": "array" + }, + "dataQualityWarning": { + "type": [ + "string", + "null" + ] + }, + "direction": { + "description": "Committee evidence lean only. Reconcile through the canonical verdict before acting.", + "type": [ + "string", + "null" + ] + }, + "directionRole": { + "enum": [ + "committee_evidence_non_binding", + null + ], + "type": [ + "string", + "null" + ] + }, + "engineIntelligence": { + "description": "Complete canonical-roster current-decision evidence snapshot. Every roster entry is emitted, including no_current_finding, stale, and source_unavailable states; this is evidence telemetry, not a worker heartbeat.", + "properties": { + "asOf": { + "format": "date-time", + "type": "string" + }, + "coverage": { + "properties": { + "complete": { + "enum": [ + true + ], + "type": "boolean" + }, + "completeMeaning": { + "enum": [ + "all_canonical_roster_entries_emitted" + ], + "type": "string" + }, + "emittedEngines": { + "description": "Roster entries emitted in this response.", + "minimum": 0, + "type": "integer" + }, + "expectedEngines": { + "description": "Live canonical-roster size at response time.", + "minimum": 0, + "type": "integer" + }, + "noCurrentFinding": { + "type": "integer" + }, + "reporting": { + "type": "integer" + }, + "sourceUnavailable": { + "type": "integer" + }, + "stale": { + "type": "integer" + } + }, + "type": "object" + }, + "engines": { + "description": "One row for each canonical specialist; quiet engines remain explicit rows.", + "items": { + "properties": { + "asOf": { + "format": "date-time", + "type": [ + "string", + "null" + ] + }, + "contract": { + "properties": { + "failureBehavior": { + "type": "string" + }, + "inputRequirements": { + "items": { + "type": "string" + }, + "type": "array" + }, + "maxStalenessMs": { + "type": "number" + }, + "missingDataBehavior": { + "type": "string" + }, + "outputContract": { + "properties": { + "confidenceScale": { + "type": "string" + }, + "fields": { + "items": { + "type": "string" + }, + "type": "array" + }, + "provenanceDefaults": { + "additionalProperties": { + "type": "string" + }, + "type": "object" + } + }, + "type": "object" + } + }, + "type": "object" + }, + "currentDirections": { + "items": { + "enum": [ + "bullish", + "bearish", + "neutral" + ], + "type": "string" + }, + "type": "array" + }, + "display": { + "properties": { + "description": { + "type": "string" + }, + "desk": { + "type": "string" + }, + "directionality": { + "enum": [ + "DIRECTIONAL", + "DIRECTIONLESS" + ], + "type": "string" + }, + "name": { + "type": "string" + }, + "observes": { + "type": "string" + }, + "proxy": { + "type": "boolean" + } + }, + "type": "object" + }, + "eligibleToVote": { + "description": "Whether this specialist may contribute a directional vote; it does not make the committee binding.", + "type": "boolean" + }, + "engineKey": { + "type": "string" + }, + "evidencePackets": { + "description": "Every active packet held for this engine and symbol; projectionApplied is false.", + "items": { + "description": "Unprojected current evidence packet. contributingRawSignals, missingSignals, limitations, provenance, freshness, and engine execution state travel with the observation.", + "properties": { + "agentError": { + "type": "string" + }, + "agentStatus": { + "enum": [ + "healthy", + "degraded", + "failed" + ], + "type": "string" + }, + "agentVersion": { + "type": "string" + }, + "assetClass": { + "enum": [ + "crypto", + "equity", + "fx", + "commodity", + "unknown" + ], + "type": "string" + }, + "canonicalEngineKey": { + "type": "string" + }, + "confidence": { + "maximum": 1, + "minimum": 0, + "type": "number" + }, + "confidenceComponents": { + "additionalProperties": { + "type": "number" + }, + "type": "object" + }, + "confidenceScale": { + "enum": [ + "raw_model_output", + "calibrated", + "ensemble_agreement", + "historical_accuracy", + "proxy_confidence", + "null" + ], + "type": "string" + }, + "contributingRawSignals": { + "description": "Raw measurements contributing to this packet; audit output does not cap this collection.", + "items": { + "properties": { + "description": { + "type": "string" + }, + "source": { + "type": "string" + }, + "value": { + "type": [ + "number", + "string", + "boolean" + ] + } + }, + "type": "object" + }, + "type": "array" + }, + "dataOrigin": { + "type": "string" + }, + "dataStatus": { + "enum": [ + "measured", + "proxy", + "synthetic", + "stale", + "missing", + "unavailable" + ], + "type": "string" + }, + "direction": { + "enum": [ + "bullish", + "bearish", + "neutral", + "directionless" + ], + "type": "string" + }, + "evidenceId": { + "type": "string" + }, + "exchange": { + "type": "string" + }, + "expiresAt": { + "format": "date-time", + "type": "string" + }, + "isSynthetic": { + "type": "boolean" + }, + "limitations": { + "items": { + "type": "string" + }, + "type": "array" + }, + "magnitude": { + "type": [ + "number", + "null" + ] + }, + "missingSignals": { + "items": { + "type": "string" + }, + "type": "array" + }, + "phenomenon": { + "type": "string" + }, + "phenomenonCategory": { + "type": "string" + }, + "processingTimeMs": { + "type": "number" + }, + "recommendedConsumerAction": { + "enum": [ + "alert", + "monitor", + "investigate", + "ignore", + "cross_reference", + "escalate" + ], + "type": "string" + }, + "symbol": { + "type": "string" + }, + "syntheticFields": { + "items": { + "type": "string" + }, + "type": "array" + }, + "timeframe": { + "type": "string" + }, + "timestamp": { + "format": "date-time", + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + }, + "freshness": { + "properties": { + "ageMs": { + "type": [ + "number", + "null" + ] + }, + "latestExpiresAt": { + "format": "date-time", + "type": [ + "string", + "null" + ] + }, + "maxStalenessMs": { + "type": "number" + }, + "status": { + "enum": [ + "fresh", + "stale", + "unreported" + ], + "type": "string" + } + }, + "type": "object" + }, + "observation": { + "properties": { + "confidence": { + "type": "number" + }, + "confidenceScale": { + "type": "string" + }, + "direction": { + "enum": [ + "bullish", + "bearish", + "neutral", + "directionless" + ], + "type": "string" + }, + "evidenceId": { + "type": "string" + }, + "phenomenon": { + "type": "string" + }, + "phenomenonCategory": { + "type": "string" + }, + "recommendedConsumerAction": { + "type": "string" + } + }, + "type": [ + "object", + "null" + ] + }, + "operationalStatus": { + "enum": [ + "reporting", + "no_current_finding", + "source_unavailable", + "stale" + ], + "type": "string" + }, + "provenance": { + "properties": { + "contributingRawSignalCount": { + "type": "integer" + }, + "dataOrigins": { + "items": { + "type": "string" + }, + "type": "array" + }, + "dataStatuses": { + "items": { + "type": "string" + }, + "type": "array" + }, + "evidenceIds": { + "items": { + "type": "string" + }, + "type": "array" + }, + "projectionApplied": { + "enum": [ + false + ], + "type": "boolean" + }, + "returnedPacketCount": { + "type": "integer" + } + }, + "type": "object" + }, + "readState": { + "enum": [ + "signal", + "observation", + "no_current_finding", + "source_unavailable" + ], + "type": "string" + } + }, + "type": "object" + }, + "minItems": 1, + "type": "array" + }, + "interpretation": { + "properties": { + "directionPolicy": { + "type": "string" + }, + "evidenceScope": { + "enum": [ + "all_active_packets_currently_held_on_evidence_bus" + ], + "type": "string" + }, + "heartbeatMeasured": { + "enum": [ + false + ], + "type": "boolean" + }, + "scope": { + "enum": [ + "current_decision_evidence" + ], + "type": "string" + }, + "silenceMeaning": { + "type": "string" + }, + "upstreamCompleteness": { + "enum": [ + "not_asserted" + ], + "type": "string" + } + }, + "type": "object" + }, + "schemaVersion": { + "enum": [ + "engine-intelligence-snapshot.v1" + ], + "type": "string" + }, + "symbol": { + "type": "string" + } + }, + "type": "object" + }, + "engineRuntimeTelemetry": { + "description": "Per-scan runtime telemetry from the detection service. A measured snapshot carries the complete canonical lifecycle roster, explicit provider and operational coverage, and lossless provider states; a retired or absent roster row is never described as running. Stale retains the complete last snapshot for diagnosis; unavailable and invalid remain distinct.", + "properties": { + "ageSeconds": { + "type": [ + "number", + "null" + ] + }, + "asOf": { + "format": "date-time", + "type": [ + "string", + "null" + ] + }, + "maxAgeSeconds": { + "description": "Configured maximum age for a runtime snapshot to remain measured; default 300 seconds, aligned to the production scan SLA.", + "type": "number" + }, + "reason": { + "type": [ + "string", + "null" + ] + }, + "snapshot": { + "additionalProperties": true, + "description": "Unprojected producer snapshot. Its per-engine rows carry cadence, cache, timeout, error, not-loaded, and no-finding execution states when telemetry is measured.", + "type": [ + "object", + "null" + ] + }, + "source": { + "enum": [ + "fahali:engine-telemetry:v1" + ], + "type": "string" + }, + "status": { + "enum": [ + "measured", + "stale", + "unavailable", + "invalid" + ], + "type": "string" + } + }, + "type": "object" + }, + "evidence": { + "properties": { + "measured": { + "items": { + "type": "string" + }, + "type": "array" + }, + "missing": { + "items": { + "type": "string" + }, + "type": "array" + }, + "proxy": { + "items": { + "type": "string" + }, + "type": "array" + }, + "synthetic": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "type": "object" + }, + "guardrail": { + "properties": { + "annotations": { + "items": { + "type": "string" + }, + "type": "array" + }, + "passed": { + "type": "boolean" + } + }, + "type": "object" + }, + "headline": { + "type": "string" + }, + "invalidationConditions": { + "items": { + "properties": { + "condition": { + "type": "string" + }, + "probability": { + "enum": [ + "low", + "moderate", + "high" + ], + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + }, + "monitoringWindow": { + "type": "string" + }, + "narrative": { + "type": "string" + }, + "neutralReportingCount": { + "type": "integer" + }, + "portfolioImpact": { + "type": "object" + }, + "provenanceHash": { + "type": "string" + }, + "replayUrl": { + "type": "string" + }, + "reportingCount": { + "type": "integer" + }, + "severity": { + "enum": [ + "critical", + "high", + "medium", + "low", + "noise" + ], + "type": "string" + }, + "severityReason": { + "type": "string" + }, + "symbol": { + "type": "string" + }, + "timestamp": { + "format": "date-time", + "type": "string" + }, + "totalAgentsWithSignal": { + "type": "integer" + }, + "verdictId": { + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + } + }, + "type": "object" +}
- Added
fahali_get_incident_timeline - Removed
fahali_get_institutional_risk_score - Added
fahali_get_lead_time - Added
fahali_get_market_briefing - Added
fahali_get_market_decision - Added
fahali_get_market_mood - Changed
fahali_get_market_regime6 fields changed- added
Input schema / properties / detailAdded value: +{ + "default": "audit", + "description": "Response depth. audit is the full-fidelity default; brief and standard are explicit compact projections.", + "enum": [ + "brief", + "standard", + "audit" + ], + "type": "string" +} - added
Input schema / properties / include_withheldAdded value: +{ + "default": true, + "description": "Include full withheld-row detail. Defaults true with audit; explicitly set false only for a compact projection.", + "type": "boolean" +} - added
Input schema / properties / limitAdded value: +{ + "description": "Optional maximum rows per projectable collection. Audit has no MCP projection cap; brief defaults to 3 and standard to 12.", + "maximum": 100, + "minimum": 1, + "type": "integer" +} - added
Input schema / properties / sinceAdded value: +{ + "description": "Optional lower timestamp bound for returned row collections.", + "format": "date-time", + "type": "string" +} - added
Input schema / properties / symbolsAdded value: +{ + "description": "Optional symbol projection, as a comma-separated string or array. Rows without instrument identity are not discarded.", + "items": { + "type": "string" + }, + "type": [ + "string", + "array" + ] +} - changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "absence": { + "description": "Why no actionable finding is present: measured_empty, user_empty, no_coverage, source_unverified, stale, withheld, source_error, auth_failure, or entitlement_required.", + "type": [ + "object", + "null" + ] + }, + "agentBriefing": { + "description": "Audit-only narrative projection. Present only when detail='audit'; compact responses do not duplicate structured data as prose.", + "type": "string" + }, + "asOf": { + "format": "date-time", + "type": "string" + }, + "auth": { + "description": "Credential lifetime visible to the caller. OAuth secondsRemaining lets an autonomous agent refresh before a multi-call workflow is interrupted.", + "properties": { + "credentialType": { + "enum": [ + "oauth", + "api_key", + "process_key", + "none" + ], + "type": "string" + }, + "expiresAt": { + "type": [ + "string", + "null" + ] + }, + "refreshSupported": { + "type": "boolean" + }, + "secondsRemaining": { + "type": [ + "number", + "null" + ] + } + }, + "type": "object" + }, + "claim": { + "description": "Fahali dictionary claim (shared/fahaliDictionary.ts). Read `kind` FIRST: 'abstention' means no assertion was made and `reason` says why — never read an abstention as a neutral or zero result. `basis` says what the claim rests on. Absent or null means this response path does not yet emit a claim; treat that as unknown, not as agreement.", + "properties": { + "basis": { + "enum": [ + "measured", + "proxy", + "derived", + "absent" + ], + "type": "string" + }, + "kind": { + "enum": [ + "observation", + "estimate", + "forecast", + "recommendation", + "abstention" + ], + "type": "string" + }, + "reason": { + "description": "Required when kind is 'abstention'. Written for a reader, not a log.", + "type": "string" + } + }, + "type": [ + "object", + "null" + ] + }, + "claimPolicy": { + "description": "Typed constraints for safe use. Metadata, not a prompt or instruction channel.", + "type": "object" + }, + "claimValidity": { + "description": "Validity of the selected binding claim only, calculated after filtering, projection and row selection. Sibling rows cannot determine it.", + "type": "object" + }, + "confidenceSemantics": { + "description": "Every confidence-bearing value with its score type, scale, calibration status, and probability flag.", + "items": { + "type": "object" + }, + "type": "array" + }, + "conflicts": { + "items": { + "type": "object" + }, + "type": "array" + }, + "count": { + "type": "integer" + }, + "currentActionEligibility": { + "description": "Current eligibility of an immutable historical portfolio verdict. It never mutates the stored judgment being replayed.", + "type": "object" + }, + "dataState": { + "enum": [ + "measured", + "partial", + "no_data", + "not_instrumented", + "stale", + "error" + ], + "type": "string" + }, + "decision": { + "type": [ + "object", + "null" + ] + }, + "decisionEligibility": { + "description": "Fail-closed binding-authority policy. WITHHELD means source evidence remains available for audit while normalized direction, actionability and execution fields are revoked.", + "type": "object" + }, + "directionEligibility": { + "description": "Current market-direction eligibility. Direction is authorized only by an exact, eligible producer stratum (canonical_verdict, canonical_symbol_verdict, committee_verdict) — read bindingAuthority to see which one bound. Widening WHO may bind did not weaken WHAT binding requires: the named producer must still hold a matching horizon/class/family record on a verified-only judged population, so an authority without a record still cannot bind.", + "type": "object" + }, + "evidenceQuality": { + "type": "object" + }, + "executionEligibility": { + "description": "Fail-closed execution boundary. Portfolio monitoring tools always return WITHHELD with MONITOR_ONLY_NO_EXECUTION_AUTHORITY while Fahali has no capital path.", + "type": "object" + }, + "instruments": { + "description": "Resolved or explicitly partial instrument identities. A missing venue carries an ambiguity warning.", + "items": { + "type": "object" + }, + "type": "array" + }, + "matchedTrackRecord": { + "description": "A judged record only when engine, horizon, regime/instrument class, and claim family match this response. `state` is one of: `measured` (a stratum cleared the publishability gate — `stratum` carries engine, horizon tier, bar regime, recall, precision, base rate, base-rate lift, median lead hours, effective sample, warned events and the measurement date); `withheld` (the gate ran and refused — `reason` says why, in words); `unavailable` (the record could not be read at all — an infrastructure failure that says nothing about the record). It is ONE stratum selected by recall, never a platform-wide accuracy. Null means no exact record match; read recordMatchReason.", + "properties": { + "dataAsOf": { + "description": "When the record was computed. A figure without this reads as current forever.", + "type": "string" + }, + "reason": { + "description": "Present on `withheld` and `unavailable`: why there is no figure.", + "type": "string" + }, + "state": { + "enum": [ + "measured", + "withheld", + "unavailable" + ], + "type": "string" + }, + "stratum": { + "description": "Present only on `measured`. Precision must never be quoted without recall.", + "properties": { + "barRegime": { + "type": "string" + }, + "baseRatePct": { + "type": "number" + }, + "claimFamily": { + "description": "What this precision is ABOUT: `directional` (price moved the way the stratum said) or `magnitude` (a move exceeded the judge bar, carrying no direction). Never infer a direction from a `magnitude` row.", + "type": "string" + }, + "claimMeans": { + "description": "The record endpoint's own sentence explaining the claim family. Quote it beside any precision figure.", + "type": "string" + }, + "effectiveSample": { + "type": "number" + }, + "engine": { + "type": "string" + }, + "horizonTier": { + "type": "string" + }, + "leadMedianHours": { + "type": "number" + }, + "measuredOn": { + "type": "string" + }, + "precisionPct": { + "description": "Share of its warnings that held. Never quotable alone.", + "type": "number" + }, + "recallPct": { + "description": "Share of qualifying events this stratum warned on — the half a buyer is exposed to.", + "type": "number" + }, + "warnedEvents": { + "type": "number" + } + }, + "type": "object" + } + }, + "required": [ + "state" + ], + "type": [ + "object", + "null" + ] + }, + "mcpStatus": { + "description": "Normalized MCP result status. The endpoint's original status vocabulary remains in `status` and `sourceStatus`.", + "enum": [ + "ok", + "error" + ], + "type": "string" + }, + "monitoringEligibility": { + "description": "Current portfolio-monitoring validity based on captured identity, freshness, integrity, and the caller-supplied monitoring policy. ELIGIBLE authorizes observation/delivery only, never financial action.", + "type": "object" + }, + "nextActions": { + "description": "Registry-validated follow-up calls. Missing tools, invalid arguments, unresolved placeholders, and disabled tools are omitted.", + "items": { + "properties": { + "args": { + "additionalProperties": { + "type": "string" + }, + "type": "object" + }, + "requiredTier": { + "type": "string" + }, + "tool": { + "type": "string" + }, + "why": { + "type": "string" + } + }, + "required": [ + "tool", + "why" + ], + "type": "object" + }, + "type": "array" + }, + "recordMatchReason": { + "description": "Why matchedTrackRecord is present or null. A null record is never evidence of safety or engine failure.", + "type": "string" + }, + "regimes": { + "items": { + "properties": { + "declaredRegimeValues": { + "items": { + "type": "string" + }, + "type": "array" + }, + "producerConfidence": { + "description": "Reported 1.0 on every row measured over 7 days. Published so its constancy is visible; it is not a calibrated confidence and must not rank or gate anything.", + "type": [ + "number", + "null" + ] + }, + "producerTrendLabel": { + "description": "The raw string the producer emitted, kept for audit. Not a measurement.", + "type": [ + "string", + "null" + ] + }, + "regime": { + "description": "The producer's four regimes (SPECTRA_MARKET_REGIME_DETECTOR.py). This previously declared 'neutral' and 'high_vol', two names the producer has never emitted, while the two it actually emits most were undeclared: over 30 days 917 of 1,346 readings (68.1%) carried a label this contract did not list.", + "enum": [ + "bullish", + "bearish", + "neutral_range_bound", + "high_volatility", + null + ], + "type": [ + "string", + "null" + ] + }, + "regimeIsDeclared": { + "description": "False when the producer emits a label outside the declared set, rather than passing it through as if declared.", + "type": "boolean" + }, + "return": { + "type": "number" + }, + "trend": { + "description": "Always null: WITHHELD, not absent. The producer derives this word from trendStrength with a +/-0.02 bar while the largest observed |trendStrength| is 0.0012, so 'up' and 'down' are unreachable and the label was the constant 'sideways' on 1,346 of 1,346 readings - including every bearish and bullish one. Read trendStrength.", + "type": "null" + }, + "trendStrength": { + "description": "Normalised slope per period as a fraction of price - the real varying measurement the withheld word was meant to summarise.", + "type": [ + "number", + "null" + ] + }, + "trendWithheldReason": { + "type": "string" + }, + "volatility": { + "type": [ + "string", + "number", + "null" + ] + } + }, + "type": "object" + }, + "type": "array" + }, + "requestId": { + "type": "string" + }, + "responseControl": { + "type": "object" + }, + "responseState": { + "enum": [ + "OK_WITH_FINDINGS", + "OK_NO_FINDINGS", + "PARTIAL", + "WITHHELD", + "NO_COVERAGE", + "ERROR" + ], + "type": "string" + }, + "schemaVersion": { + "enum": [ + "2.0" + ], + "type": "string" + }, + "scope": { + "type": "object" + }, + "sourceConfidenceSemantics": { + "type": [ + "array", + "object", + "null" + ] + }, + "sourceDataState": { + "description": "The upstream endpoint's exact data-state value before endpoint-aware classification.", + "type": [ + "string", + "null" + ] + }, + "sourceDecision": { + "type": [ + "object", + "null" + ] + }, + "sourceError": { + "description": "The upstream endpoint's exact error text/code before normalization, when one was present.", + "type": [ + "string", + "null" + ] + }, + "sourceEvidenceQuality": { + "type": [ + "object", + "null" + ] + }, + "sourceScope": { + "type": [ + "object", + "null" + ] + }, + "sourceStatus": { + "description": "The upstream endpoint's exact status before the MCP envelope normalizes transport success/error.", + "type": [ + "string", + "null" + ] + }, + "status": { + "description": "The endpoint's original status vocabulary (for example ok, partial, degraded, withheld, or no_alerts). Use mcpStatus for normalized transport success/error.", + "type": "string" + }, + "symbolCoverage": { + "description": "Conservation ledger satisfying requested = returned + withheld + notReturned for requested-symbol calls.", + "type": "object" + }, + "timestamp": { + "description": "Observation timestamp. Current API responses use ISO-8601; integer epoch values remain accepted for compatibility with older persisted rows.", + "format": "date-time", + "type": [ + "string", + "integer" + ] + } + }, + "type": "object" +}
- Added
fahali_get_market_risk_score - Changed
fahali_get_market_sentiment10 fields changed- added
Input schema / properties / detailAdded value: +{ + "default": "audit", + "description": "Response depth. audit is the full-fidelity default; brief and standard are explicit compact projections.", + "enum": [ + "brief", + "standard", + "audit" + ], + "type": "string" +} - added
Input schema / properties / include_withheldAdded value: +{ + "default": true, + "description": "Include full withheld-row detail. Defaults true with audit; explicitly set false only for a compact projection.", + "type": "boolean" +} - added
Input schema / properties / limit / defaultAdded value: +200 - changed
Input schema / properties / limit / descriptionPrevious value: -"Maximum number of sentiment entries to return (default 20)."New value: +"Maximum rows per source. Omit for the maximum 200 live alerts plus 200 judged outcomes; the merged history is never re-truncated." - added
Input schema / properties / limit / maximumAdded value: +200 - added
Input schema / properties / limit / minimumAdded value: +1 - changed
Input schema / properties / limit / typePrevious value: -"number"New value: +"integer" - added
Input schema / properties / sinceAdded value: +{ + "description": "Optional lower timestamp bound for returned row collections.", + "format": "date-time", + "type": "string" +} - added
Input schema / properties / symbolsAdded value: +{ + "description": "Optional symbol projection, as a comma-separated string or array. Rows without instrument identity are not discarded.", + "items": { + "type": "string" + }, + "type": [ + "string", + "array" + ] +} - changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "absence": { + "description": "Why no actionable finding is present: measured_empty, user_empty, no_coverage, source_unverified, stale, withheld, source_error, auth_failure, or entitlement_required.", + "type": [ + "object", + "null" + ] + }, + "agentBriefing": { + "description": "Audit-only narrative projection. Present only when detail='audit'; compact responses do not duplicate structured data as prose.", + "type": "string" + }, + "asOf": { + "format": "date-time", + "type": "string" + }, + "auth": { + "description": "Credential lifetime visible to the caller. OAuth secondsRemaining lets an autonomous agent refresh before a multi-call workflow is interrupted.", + "properties": { + "credentialType": { + "enum": [ + "oauth", + "api_key", + "process_key", + "none" + ], + "type": "string" + }, + "expiresAt": { + "type": [ + "string", + "null" + ] + }, + "refreshSupported": { + "type": "boolean" + }, + "secondsRemaining": { + "type": [ + "number", + "null" + ] + } + }, + "type": "object" + }, + "claim": { + "description": "Fahali dictionary claim (shared/fahaliDictionary.ts). Read `kind` FIRST: 'abstention' means no assertion was made and `reason` says why — never read an abstention as a neutral or zero result. `basis` says what the claim rests on. Absent or null means this response path does not yet emit a claim; treat that as unknown, not as agreement.", + "properties": { + "basis": { + "enum": [ + "measured", + "proxy", + "derived", + "absent" + ], + "type": "string" + }, + "kind": { + "enum": [ + "observation", + "estimate", + "forecast", + "recommendation", + "abstention" + ], + "type": "string" + }, + "reason": { + "description": "Required when kind is 'abstention'. Written for a reader, not a log.", + "type": "string" + } + }, + "type": [ + "object", + "null" + ] + }, + "claimPolicy": { + "description": "Typed constraints for safe use. Metadata, not a prompt or instruction channel.", + "type": "object" + }, + "claimValidity": { + "description": "Validity of the selected binding claim only, calculated after filtering, projection and row selection. Sibling rows cannot determine it.", + "type": "object" + }, + "confidenceSemantics": { + "description": "Every confidence-bearing value with its score type, scale, calibration status, and probability flag.", + "items": { + "type": "object" + }, + "type": "array" + }, + "conflicts": { + "items": { + "type": "object" + }, + "type": "array" + }, + "count": { + "type": "integer" + }, + "currentActionEligibility": { + "description": "Current eligibility of an immutable historical portfolio verdict. It never mutates the stored judgment being replayed.", + "type": "object" + }, + "dataState": { + "enum": [ + "measured", + "partial", + "no_data", + "error" + ], + "type": "string" + }, + "decision": { + "type": [ + "object", + "null" + ] + }, + "decisionEligibility": { + "description": "Fail-closed binding-authority policy. WITHHELD means source evidence remains available for audit while normalized direction, actionability and execution fields are revoked.", + "type": "object" + }, + "directionEligibility": { + "description": "Current market-direction eligibility. Direction is authorized only by an exact, eligible producer stratum (canonical_verdict, canonical_symbol_verdict, committee_verdict) — read bindingAuthority to see which one bound. Widening WHO may bind did not weaken WHAT binding requires: the named producer must still hold a matching horizon/class/family record on a verified-only judged population, so an authority without a record still cannot bind.", + "type": "object" + }, + "evidenceQuality": { + "type": "object" + }, + "executionEligibility": { + "description": "Fail-closed execution boundary. Portfolio monitoring tools always return WITHHELD with MONITOR_ONLY_NO_EXECUTION_AUTHORITY while Fahali has no capital path.", + "type": "object" + }, + "history": { + "items": { + "properties": { + "claimId": { + "type": "string" + }, + "confidence": { + "type": [ + "number", + "null" + ] + }, + "correct": { + "type": [ + "boolean", + "null" + ] + }, + "dataOrigin": { + "type": "string" + }, + "direction": { + "type": [ + "string", + "null" + ] + }, + "id": { + "type": "string" + }, + "newsCount": { + "type": [ + "number", + "null" + ] + }, + "recordKind": { + "description": "Lifecycle state, derived per row — never assumed. judged_outcome: a verdict exists. resolved_unjudged: the horizon passed and the judge abstained (chop below the noise floor, or a claim it cannot score) — an outcome, not a verdict. registered_claim: registered, not yet resolved. Until 2026-09-03 every outcome row was labelled judged_outcome unconditionally, while zero sentiment rows in 7 days were judged.", + "enum": [ + "live_alert", + "judged_outcome", + "resolved_unjudged", + "registered_claim" + ], + "type": "string" + }, + "resolvedAt": { + "type": [ + "string", + "null" + ] + }, + "sentimentScore": { + "type": [ + "number", + "null" + ] + }, + "source": { + "type": "string" + }, + "symbol": { + "type": [ + "string", + "null" + ] + }, + "timestamp": { + "type": [ + "string", + "integer", + "number" + ] + } + }, + "type": "object" + }, + "type": "array" + }, + "historyComplete": { + "description": "True only when both source probes completed and neither exceeded its per-source limit.", + "type": "boolean" + }, + "instrumentation": { + "type": "object" + }, + "instruments": { + "description": "Resolved or explicitly partial instrument identities. A missing venue carries an ambiguity warning.", + "items": { + "type": "object" + }, + "type": "array" + }, + "matchedTrackRecord": { + "description": "A judged record only when engine, horizon, regime/instrument class, and claim family match this response. `state` is one of: `measured` (a stratum cleared the publishability gate — `stratum` carries engine, horizon tier, bar regime, recall, precision, base rate, base-rate lift, median lead hours, effective sample, warned events and the measurement date); `withheld` (the gate ran and refused — `reason` says why, in words); `unavailable` (the record could not be read at all — an infrastructure failure that says nothing about the record). It is ONE stratum selected by recall, never a platform-wide accuracy. Null means no exact record match; read recordMatchReason.", + "properties": { + "dataAsOf": { + "description": "When the record was computed. A figure without this reads as current forever.", + "type": "string" + }, + "reason": { + "description": "Present on `withheld` and `unavailable`: why there is no figure.", + "type": "string" + }, + "state": { + "enum": [ + "measured", + "withheld", + "unavailable" + ], + "type": "string" + }, + "stratum": { + "description": "Present only on `measured`. Precision must never be quoted without recall.", + "properties": { + "barRegime": { + "type": "string" + }, + "baseRatePct": { + "type": "number" + }, + "claimFamily": { + "description": "What this precision is ABOUT: `directional` (price moved the way the stratum said) or `magnitude` (a move exceeded the judge bar, carrying no direction). Never infer a direction from a `magnitude` row.", + "type": "string" + }, + "claimMeans": { + "description": "The record endpoint's own sentence explaining the claim family. Quote it beside any precision figure.", + "type": "string" + }, + "effectiveSample": { + "type": "number" + }, + "engine": { + "type": "string" + }, + "horizonTier": { + "type": "string" + }, + "leadMedianHours": { + "type": "number" + }, + "measuredOn": { + "type": "string" + }, + "precisionPct": { + "description": "Share of its warnings that held. Never quotable alone.", + "type": "number" + }, + "recallPct": { + "description": "Share of qualifying events this stratum warned on — the half a buyer is exposed to.", + "type": "number" + }, + "warnedEvents": { + "type": "number" + } + }, + "type": "object" + } + }, + "required": [ + "state" + ], + "type": [ + "object", + "null" + ] + }, + "mcpStatus": { + "description": "Normalized MCP result status. The endpoint's original status vocabulary remains in `status` and `sourceStatus`.", + "enum": [ + "ok", + "error" + ], + "type": "string" + }, + "measuredWindow": { + "type": "string" + }, + "monitoringEligibility": { + "description": "Current portfolio-monitoring validity based on captured identity, freshness, integrity, and the caller-supplied monitoring policy. ELIGIBLE authorizes observation/delivery only, never financial action.", + "type": "object" + }, + "nextActions": { + "description": "Registry-validated follow-up calls. Missing tools, invalid arguments, unresolved placeholders, and disabled tools are omitted.", + "items": { + "properties": { + "args": { + "additionalProperties": { + "type": "string" + }, + "type": "object" + }, + "requiredTier": { + "type": "string" + }, + "tool": { + "type": "string" + }, + "why": { + "type": "string" + } + }, + "required": [ + "tool", + "why" + ], + "type": "object" + }, + "type": "array" + }, + "probeErrors": { + "items": { + "type": "object" + }, + "type": "array" + }, + "projection": { + "description": "Requested and effective per-source limit; the default is the maximum admitted window.", + "type": "object" + }, + "recordMatchReason": { + "description": "Why matchedTrackRecord is present or null. A null record is never evidence of safety or engine failure.", + "type": "string" + }, + "requestId": { + "type": "string" + }, + "requested": { + "items": { + "type": "string" + }, + "type": [ + "array", + "null" + ] + }, + "responseControl": { + "type": "object" + }, + "responseState": { + "type": "string" + }, + "schemaVersion": { + "enum": [ + "2.0" + ], + "type": "string" + }, + "scope": { + "type": "object" + }, + "sourceConfidenceSemantics": { + "type": [ + "array", + "object", + "null" + ] + }, + "sourceCoverage": { + "description": "Per-source probe state, returned rows, proven lower-bound availability, projection count, and completeness.", + "type": "object" + }, + "sourceDataState": { + "description": "The upstream endpoint's exact data-state value before endpoint-aware classification.", + "type": [ + "string", + "null" + ] + }, + "sourceDecision": { + "type": [ + "object", + "null" + ] + }, + "sourceError": { + "description": "The upstream endpoint's exact error text/code before normalization, when one was present.", + "type": [ + "string", + "null" + ] + }, + "sourceEvidenceQuality": { + "type": [ + "object", + "null" + ] + }, + "sourceHistory": { + "description": "Unprojected lifecycle streams. Observations and judgments remain distinct even when they share a claimId.", + "properties": { + "judgedOutcomes": { + "items": { + "type": "object" + }, + "type": "array" + }, + "liveAlerts": { + "items": { + "type": "object" + }, + "type": "array" + } + }, + "type": "object" + }, + "sourceScope": { + "type": [ + "object", + "null" + ] + }, + "sourceStatus": { + "description": "The upstream endpoint's exact status before the MCP envelope normalizes transport success/error.", + "type": [ + "string", + "null" + ] + }, + "status": { + "type": "string" + }, + "symbolCoverage": { + "description": "Conservation ledger satisfying requested = returned + withheld + notReturned for requested-symbol calls.", + "type": "object" + } + }, + "type": "object" +}
- Changed
fahali_get_market_snapshot10 fields changed- added
Input schema / properties / detailAdded value: +{ + "default": "audit", + "description": "Response depth. audit is the full-fidelity default; brief and standard are explicit compact projections.", + "enum": [ + "brief", + "standard", + "audit" + ], + "type": "string" +} - added
Input schema / properties / include_withheldAdded value: +{ + "default": true, + "description": "Include full withheld-row detail. Defaults true with audit; explicitly set false only for a compact projection.", + "type": "boolean" +} - changed
Input schema / properties / limit / descriptionPrevious value: -"Max assets to return (default 50, max 800)"New value: +"Optional maximum assets to return. Omitting it returns everything this snapshot holds — which is the full Binance USDT book plus a configured US watchlist, NOT every instrument Fahali monitors. Max 800." - added
Input schema / properties / limit / maximumAdded value: +800 - added
Input schema / properties / limit / minimumAdded value: +1 - changed
Input schema / properties / limit / typePrevious value: -"number"New value: +"integer" - added
Input schema / properties / sinceAdded value: +{ + "description": "Optional lower timestamp bound for returned row collections.", + "format": "date-time", + "type": "string" +} - changed
Input schema / properties / sort_by / descriptionPrevious value: -"Sort field (default symbol)"New value: +"Sort field (default symbol). `volume` ranks only rows whose source publishes a volume; rows without one follow in symbol order and are counted in `ordering.rowsUnranked` — their position is not a statement about turnover." - added
Input schema / properties / symbolsAdded value: +{ + "description": "Optional symbol projection, as a comma-separated string or array. Rows without instrument identity are not discarded.", + "items": { + "type": "string" + }, + "type": [ + "string", + "array" + ] +} - changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "absence": { + "description": "Why no actionable finding is present: measured_empty, user_empty, no_coverage, source_unverified, stale, withheld, source_error, auth_failure, or entitlement_required.", + "type": [ + "object", + "null" + ] + }, + "agentBriefing": { + "description": "Audit-only narrative projection. Present only when detail='audit'; compact responses do not duplicate structured data as prose.", + "type": "string" + }, + "asOf": { + "format": "date-time", + "type": "string" + }, + "assets": { + "items": { + "properties": { + "assetClass": { + "type": "string" + }, + "canonicalInstrumentId": { + "description": "Stable underlying key (BTC, ETH, NVDA...) — quoted-pair variants of the same asset share one identity", + "type": [ + "string", + "null" + ] + }, + "changePct": { + "type": "number" + }, + "price": { + "type": "number" + }, + "symbol": { + "type": "string" + }, + "underlying": { + "type": "string" + }, + "underlyingId": { + "description": "Alias of canonicalInstrumentId", + "type": [ + "string", + "null" + ] + }, + "venue": { + "type": "string" + }, + "volume": { + "type": "number" + } + }, + "type": "object" + }, + "type": "array" + }, + "auth": { + "description": "Credential lifetime visible to the caller. OAuth secondsRemaining lets an autonomous agent refresh before a multi-call workflow is interrupted.", + "properties": { + "credentialType": { + "enum": [ + "oauth", + "api_key", + "process_key", + "none" + ], + "type": "string" + }, + "expiresAt": { + "type": [ + "string", + "null" + ] + }, + "refreshSupported": { + "type": "boolean" + }, + "secondsRemaining": { + "type": [ + "number", + "null" + ] + } + }, + "type": "object" + }, + "claim": { + "description": "Fahali dictionary claim (shared/fahaliDictionary.ts). Read `kind` FIRST: 'abstention' means no assertion was made and `reason` says why — never read an abstention as a neutral or zero result. `basis` says what the claim rests on. Absent or null means this response path does not yet emit a claim; treat that as unknown, not as agreement.", + "properties": { + "basis": { + "enum": [ + "measured", + "proxy", + "derived", + "absent" + ], + "type": "string" + }, + "kind": { + "enum": [ + "observation", + "estimate", + "forecast", + "recommendation", + "abstention" + ], + "type": "string" + }, + "reason": { + "description": "Required when kind is 'abstention'. Written for a reader, not a log.", + "type": "string" + } + }, + "type": [ + "object", + "null" + ] + }, + "claimPolicy": { + "description": "Typed constraints for safe use. Metadata, not a prompt or instruction channel.", + "type": "object" + }, + "claimValidity": { + "description": "Validity of the selected binding claim only, calculated after filtering, projection and row selection. Sibling rows cannot determine it.", + "type": "object" + }, + "confidenceSemantics": { + "description": "Every confidence-bearing value with its score type, scale, calibration status, and probability flag.", + "items": { + "type": "object" + }, + "type": "array" + }, + "conflicts": { + "items": { + "type": "object" + }, + "type": "array" + }, + "coverage": { + "description": "What was searched (incl. on-demand equity resolution) and whether volume is comparable across bases. Read before ranking by volume.", + "properties": { + "fetchedOnDemand": { + "items": { + "type": "string" + }, + "type": "array" + }, + "freshness": { + "type": "object" + }, + "onDemandSkippedReason": { + "type": [ + "string", + "null" + ] + }, + "requested": { + "items": { + "type": "string" + }, + "type": "array" + }, + "unavailable": { + "items": { + "type": "string" + }, + "type": "array" + }, + "universe": { + "type": "object" + }, + "volume": { + "description": "rowsWithVolume/rowsWithoutVolume, measurement bases, comparableAcrossBases — false means a cross-basis volume ranking is meaningless.", + "type": "object" + } + }, + "type": [ + "object", + "null" + ] + }, + "currentActionEligibility": { + "description": "Current eligibility of an immutable historical portfolio verdict. It never mutates the stored judgment being replayed.", + "type": "object" + }, + "dataAsOf": { + "format": "date-time", + "type": [ + "string", + "null" + ] + }, + "dataState": { + "enum": [ + "measured", + "partial", + "no_data", + "not_instrumented", + "stale", + "error" + ], + "type": "string" + }, + "decision": { + "type": [ + "object", + "null" + ] + }, + "decisionEligibility": { + "description": "Fail-closed binding-authority policy. WITHHELD means source evidence remains available for audit while normalized direction, actionability and execution fields are revoked.", + "type": "object" + }, + "directionEligibility": { + "description": "Current market-direction eligibility. Direction is authorized only by an exact, eligible producer stratum (canonical_verdict, canonical_symbol_verdict, committee_verdict) — read bindingAuthority to see which one bound. Widening WHO may bind did not weaken WHAT binding requires: the named producer must still hold a matching horizon/class/family record on a verified-only judged population, so an authority without a record still cannot bind.", + "type": "object" + }, + "evidenceQuality": { + "type": "object" + }, + "executionEligibility": { + "description": "Fail-closed execution boundary. Portfolio monitoring tools always return WITHHELD with MONITOR_ONLY_NO_EXECUTION_AUTHORITY while Fahali has no capital path.", + "type": "object" + }, + "indices": { + "items": { + "properties": { + "changePct": { + "type": "number" + }, + "name": { + "type": "string" + }, + "price": { + "type": "number" + } + }, + "type": "object" + }, + "type": "array" + }, + "instruments": { + "description": "Resolved or explicitly partial instrument identities. A missing venue carries an ambiguity warning.", + "items": { + "type": "object" + }, + "type": "array" + }, + "matchedTrackRecord": { + "description": "A judged record only when engine, horizon, regime/instrument class, and claim family match this response. `state` is one of: `measured` (a stratum cleared the publishability gate — `stratum` carries engine, horizon tier, bar regime, recall, precision, base rate, base-rate lift, median lead hours, effective sample, warned events and the measurement date); `withheld` (the gate ran and refused — `reason` says why, in words); `unavailable` (the record could not be read at all — an infrastructure failure that says nothing about the record). It is ONE stratum selected by recall, never a platform-wide accuracy. Null means no exact record match; read recordMatchReason.", + "properties": { + "dataAsOf": { + "description": "When the record was computed. A figure without this reads as current forever.", + "type": "string" + }, + "reason": { + "description": "Present on `withheld` and `unavailable`: why there is no figure.", + "type": "string" + }, + "state": { + "enum": [ + "measured", + "withheld", + "unavailable" + ], + "type": "string" + }, + "stratum": { + "description": "Present only on `measured`. Precision must never be quoted without recall.", + "properties": { + "barRegime": { + "type": "string" + }, + "baseRatePct": { + "type": "number" + }, + "claimFamily": { + "description": "What this precision is ABOUT: `directional` (price moved the way the stratum said) or `magnitude` (a move exceeded the judge bar, carrying no direction). Never infer a direction from a `magnitude` row.", + "type": "string" + }, + "claimMeans": { + "description": "The record endpoint's own sentence explaining the claim family. Quote it beside any precision figure.", + "type": "string" + }, + "effectiveSample": { + "type": "number" + }, + "engine": { + "type": "string" + }, + "horizonTier": { + "type": "string" + }, + "leadMedianHours": { + "type": "number" + }, + "measuredOn": { + "type": "string" + }, + "precisionPct": { + "description": "Share of its warnings that held. Never quotable alone.", + "type": "number" + }, + "recallPct": { + "description": "Share of qualifying events this stratum warned on — the half a buyer is exposed to.", + "type": "number" + }, + "warnedEvents": { + "type": "number" + } + }, + "type": "object" + } + }, + "required": [ + "state" + ], + "type": [ + "object", + "null" + ] + }, + "mcpStatus": { + "description": "Normalized MCP result status. The endpoint's original status vocabulary remains in `status` and `sourceStatus`.", + "enum": [ + "ok", + "error" + ], + "type": "string" + }, + "monitoringEligibility": { + "description": "Current portfolio-monitoring validity based on captured identity, freshness, integrity, and the caller-supplied monitoring policy. ELIGIBLE authorizes observation/delivery only, never financial action.", + "type": "object" + }, + "nextActions": { + "description": "Registry-validated follow-up calls. Missing tools, invalid arguments, unresolved placeholders, and disabled tools are omitted.", + "items": { + "properties": { + "args": { + "additionalProperties": { + "type": "string" + }, + "type": "object" + }, + "requiredTier": { + "type": "string" + }, + "tool": { + "type": "string" + }, + "why": { + "type": "string" + } + }, + "required": [ + "tool", + "why" + ], + "type": "object" + }, + "type": "array" + }, + "ordering": { + "description": "How the rows were ordered and which rows the sort key could actually rank.", + "properties": { + "field": { + "enum": [ + "symbol", + "change", + "volume" + ], + "type": "string" + }, + "note": { + "type": [ + "string", + "null" + ] + }, + "rowsRanked": { + "type": "integer" + }, + "rowsUnranked": { + "type": "integer" + } + }, + "type": [ + "object", + "null" + ] + }, + "recordMatchReason": { + "description": "Why matchedTrackRecord is present or null. A null record is never evidence of safety or engine failure.", + "type": "string" + }, + "requestId": { + "type": "string" + }, + "responseControl": { + "type": "object" + }, + "responseState": { + "enum": [ + "OK_WITH_FINDINGS", + "OK_NO_FINDINGS", + "PARTIAL", + "WITHHELD", + "NO_COVERAGE", + "ERROR" + ], + "type": "string" + }, + "schemaVersion": { + "enum": [ + "2.0" + ], + "type": "string" + }, + "scope": { + "type": "object" + }, + "sourceConfidenceSemantics": { + "type": [ + "array", + "object", + "null" + ] + }, + "sourceDataState": { + "description": "The upstream endpoint's exact data-state value before endpoint-aware classification.", + "type": [ + "string", + "null" + ] + }, + "sourceDecision": { + "type": [ + "object", + "null" + ] + }, + "sourceError": { + "description": "The upstream endpoint's exact error text/code before normalization, when one was present.", + "type": [ + "string", + "null" + ] + }, + "sourceEvidenceQuality": { + "type": [ + "object", + "null" + ] + }, + "sourceScope": { + "type": [ + "object", + "null" + ] + }, + "sourceStatus": { + "description": "The upstream endpoint's exact status before the MCP envelope normalizes transport success/error.", + "type": [ + "string", + "null" + ] + }, + "sources": { + "description": "Per-source read states (alpaca/coingecko/binance), each measured/pending/not_instrumented — never inferred.", + "type": [ + "object", + "null" + ] + }, + "status": { + "description": "The endpoint's original status vocabulary (for example ok, partial, degraded, withheld, or no_alerts). Use mcpStatus for normalized transport success/error.", + "type": "string" + }, + "symbolCoverage": { + "description": "Conservation ledger satisfying requested = returned + withheld + notReturned for requested-symbol calls.", + "type": "object" + }, + "timestamp": { + "type": [ + "string", + "integer", + "number" + ] + }, + "total": { + "type": "integer" + } + }, + "type": "object" +}
- Changed
fahali_get_market_verdict6 fields changed- added
Input schema / properties / detailAdded value: +{ + "default": "audit", + "description": "Response depth. audit is the full-fidelity default; brief and standard are explicit compact projections.", + "enum": [ + "brief", + "standard", + "audit" + ], + "type": "string" +} - changed
Input schema / properties / includeContagion / descriptionPrevious value: -"If true, enriches response with contagion risk from tail_dependence engine. Contagion enrichment requires Elite tier."New value: +"If true, enriches the response with downside co-movement (the hidden correlation chain) from the tail_dependence engine. Chain enrichment requires Elite tier." - added
Input schema / properties / include_withheldAdded value: +{ + "default": true, + "description": "Include full withheld-row detail. Defaults true with audit; explicitly set false only for a compact projection.", + "type": "boolean" +} - added
Input schema / properties / limitAdded value: +{ + "description": "Optional maximum rows per projectable collection. Audit has no MCP projection cap; brief defaults to 3 and standard to 12.", + "maximum": 100, + "minimum": 1, + "type": "integer" +} - added
Input schema / properties / sinceAdded value: +{ + "description": "Optional lower timestamp bound for returned row collections.", + "format": "date-time", + "type": "string" +} - changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "absence": { + "description": "Why no actionable finding is present: measured_empty, user_empty, no_coverage, source_unverified, stale, withheld, source_error, auth_failure, or entitlement_required.", + "type": [ + "object", + "null" + ] + }, + "agentBriefing": { + "description": "Audit-only narrative projection. Present only when detail='audit'; compact responses do not duplicate structured data as prose.", + "type": "string" + }, + "asOf": { + "format": "date-time", + "type": "string" + }, + "auth": { + "description": "Credential lifetime visible to the caller. OAuth secondsRemaining lets an autonomous agent refresh before a multi-call workflow is interrupted.", + "properties": { + "credentialType": { + "enum": [ + "oauth", + "api_key", + "process_key", + "none" + ], + "type": "string" + }, + "expiresAt": { + "type": [ + "string", + "null" + ] + }, + "refreshSupported": { + "type": "boolean" + }, + "secondsRemaining": { + "type": [ + "number", + "null" + ] + } + }, + "type": "object" + }, + "claim": { + "description": "Fahali dictionary claim (shared/fahaliDictionary.ts). Read `kind` FIRST: 'abstention' means no assertion was made and `reason` says why — never read an abstention as a neutral or zero result. `basis` says what the claim rests on. Absent or null means this response path does not yet emit a claim; treat that as unknown, not as agreement.", + "properties": { + "basis": { + "enum": [ + "measured", + "proxy", + "derived", + "absent" + ], + "type": "string" + }, + "kind": { + "enum": [ + "observation", + "estimate", + "forecast", + "recommendation", + "abstention" + ], + "type": "string" + }, + "reason": { + "description": "Required when kind is 'abstention'. Written for a reader, not a log.", + "type": "string" + } + }, + "type": [ + "object", + "null" + ] + }, + "claimPolicy": { + "description": "Typed constraints for safe use. Metadata, not a prompt or instruction channel.", + "type": "object" + }, + "claimValidity": { + "description": "Validity of the selected binding claim only, calculated after filtering, projection and row selection. Sibling rows cannot determine it.", + "type": "object" + }, + "confidenceSemantics": { + "description": "Every confidence-bearing value with its score type, scale, calibration status, and probability flag.", + "items": { + "type": "object" + }, + "type": "array" + }, + "conflicts": { + "items": { + "type": "object" + }, + "type": "array" + }, + "count": { + "type": "integer" + }, + "currentActionEligibility": { + "description": "Current eligibility of an immutable historical portfolio verdict. It never mutates the stored judgment being replayed.", + "type": "object" + }, + "data": { + "items": { + "properties": { + "canonical": { + "description": "Complete canonical arbiter verdict and sole binding market-direction authority. Null means the arbiter returned no eligible authority and MUST remain a withheld/no-read state; it is never neutral direction. When present it carries the full committee evidence product, the current canonical-roster evidence rows, runtime telemetry, forecast distribution, record, conflict resolution, invalidation, and policy version.", + "properties": { + "agreement": { + "properties": { + "agreeing": { + "type": "integer" + }, + "ofDirectional": { + "type": "integer" + }, + "pct": { + "type": [ + "number", + "null" + ] + } + }, + "type": "object" + }, + "agreementPct": { + "description": "Compatibility alias of agreement.pct.", + "type": [ + "number", + "null" + ] + }, + "committee": { + "description": "Complete committee input carried into the canonical verdict for reconciliation. Committee membership and its raw verdict are evidence; the enclosing canonical verdict remains the sole market-direction authority.", + "properties": { + "agreeing": { + "items": { + "type": "string" + }, + "type": "array" + }, + "disagreeing": { + "items": { + "type": "string" + }, + "type": "array" + }, + "engineIntelligence": { + "description": "Complete canonical-roster current-decision evidence snapshot. Every roster entry is emitted, including no_current_finding, stale, and source_unavailable states; this is evidence telemetry, not a worker heartbeat.", + "properties": { + "asOf": { + "format": "date-time", + "type": "string" + }, + "coverage": { + "properties": { + "complete": { + "enum": [ + true + ], + "type": "boolean" + }, + "completeMeaning": { + "enum": [ + "all_canonical_roster_entries_emitted" + ], + "type": "string" + }, + "emittedEngines": { + "description": "Roster entries emitted in this response.", + "minimum": 0, + "type": "integer" + }, + "expectedEngines": { + "description": "Live canonical-roster size at response time.", + "minimum": 0, + "type": "integer" + }, + "noCurrentFinding": { + "type": "integer" + }, + "reporting": { + "type": "integer" + }, + "sourceUnavailable": { + "type": "integer" + }, + "stale": { + "type": "integer" + } + }, + "type": "object" + }, + "engines": { + "description": "One row for each canonical specialist; quiet engines remain explicit rows.", + "items": { + "properties": { + "asOf": { + "format": "date-time", + "type": [ + "string", + "null" + ] + }, + "contract": { + "properties": { + "failureBehavior": { + "type": "string" + }, + "inputRequirements": { + "items": { + "type": "string" + }, + "type": "array" + }, + "maxStalenessMs": { + "type": "number" + }, + "missingDataBehavior": { + "type": "string" + }, + "outputContract": { + "properties": { + "confidenceScale": { + "type": "string" + }, + "fields": { + "items": { + "type": "string" + }, + "type": "array" + }, + "provenanceDefaults": { + "additionalProperties": { + "type": "string" + }, + "type": "object" + } + }, + "type": "object" + } + }, + "type": "object" + }, + "currentDirections": { + "items": { + "enum": [ + "bullish", + "bearish", + "neutral" + ], + "type": "string" + }, + "type": "array" + }, + "display": { + "properties": { + "description": { + "type": "string" + }, + "desk": { + "type": "string" + }, + "directionality": { + "enum": [ + "DIRECTIONAL", + "DIRECTIONLESS" + ], + "type": "string" + }, + "name": { + "type": "string" + }, + "observes": { + "type": "string" + }, + "proxy": { + "type": "boolean" + } + }, + "type": "object" + }, + "eligibleToVote": { + "description": "Whether this specialist may contribute a directional vote; it does not make the committee binding.", + "type": "boolean" + }, + "engineKey": { + "type": "string" + }, + "evidencePackets": { + "description": "Every active packet held for this engine and symbol; projectionApplied is false.", + "items": { + "description": "Unprojected current evidence packet. contributingRawSignals, missingSignals, limitations, provenance, freshness, and engine execution state travel with the observation.", + "properties": { + "agentError": { + "type": "string" + }, + "agentStatus": { + "enum": [ + "healthy", + "degraded", + "failed" + ], + "type": "string" + }, + "agentVersion": { + "type": "string" + }, + "assetClass": { + "enum": [ + "crypto", + "equity", + "fx", + "commodity", + "unknown" + ], + "type": "string" + }, + "canonicalEngineKey": { + "type": "string" + }, + "confidence": { + "maximum": 1, + "minimum": 0, + "type": "number" + }, + "confidenceComponents": { + "additionalProperties": { + "type": "number" + }, + "type": "object" + }, + "confidenceScale": { + "enum": [ + "raw_model_output", + "calibrated", + "ensemble_agreement", + "historical_accuracy", + "proxy_confidence", + "null" + ], + "type": "string" + }, + "contributingRawSignals": { + "description": "Raw measurements contributing to this packet; audit output does not cap this collection.", + "items": { + "properties": { + "description": { + "type": "string" + }, + "source": { + "type": "string" + }, + "value": { + "type": [ + "number", + "string", + "boolean" + ] + } + }, + "type": "object" + }, + "type": "array" + }, + "dataOrigin": { + "type": "string" + }, + "dataStatus": { + "enum": [ + "measured", + "proxy", + "synthetic", + "stale", + "missing", + "unavailable" + ], + "type": "string" + }, + "direction": { + "enum": [ + "bullish", + "bearish", + "neutral", + "directionless" + ], + "type": "string" + }, + "evidenceId": { + "type": "string" + }, + "exchange": { + "type": "string" + }, + "expiresAt": { + "format": "date-time", + "type": "string" + }, + "isSynthetic": { + "type": "boolean" + }, + "limitations": { + "items": { + "type": "string" + }, + "type": "array" + }, + "magnitude": { + "type": [ + "number", + "null" + ] + }, + "missingSignals": { + "items": { + "type": "string" + }, + "type": "array" + }, + "phenomenon": { + "type": "string" + }, + "phenomenonCategory": { + "type": "string" + }, + "processingTimeMs": { + "type": "number" + }, + "recommendedConsumerAction": { + "enum": [ + "alert", + "monitor", + "investigate", + "ignore", + "cross_reference", + "escalate" + ], + "type": "string" + }, + "symbol": { + "type": "string" + }, + "syntheticFields": { + "items": { + "type": "string" + }, + "type": "array" + }, + "timeframe": { + "type": "string" + }, + "timestamp": { + "format": "date-time", + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + }, + "freshness": { + "properties": { + "ageMs": { + "type": [ + "number", + "null" + ] + }, + "latestExpiresAt": { + "format": "date-time", + "type": [ + "string", + "null" + ] + }, + "maxStalenessMs": { + "type": "number" + }, + "status": { + "enum": [ + "fresh", + "stale", + "unreported" + ], + "type": "string" + } + }, + "type": "object" + }, + "observation": { + "properties": { + "confidence": { + "type": "number" + }, + "confidenceScale": { + "type": "string" + }, + "direction": { + "enum": [ + "bullish", + "bearish", + "neutral", + "directionless" + ], + "type": "string" + }, + "evidenceId": { + "type": "string" + }, + "phenomenon": { + "type": "string" + }, + "phenomenonCategory": { + "type": "string" + }, + "recommendedConsumerAction": { + "type": "string" + } + }, + "type": [ + "object", + "null" + ] + }, + "operationalStatus": { + "enum": [ + "reporting", + "no_current_finding", + "source_unavailable", + "stale" + ], + "type": "string" + }, + "provenance": { + "properties": { + "contributingRawSignalCount": { + "type": "integer" + }, + "dataOrigins": { + "items": { + "type": "string" + }, + "type": "array" + }, + "dataStatuses": { + "items": { + "type": "string" + }, + "type": "array" + }, + "evidenceIds": { + "items": { + "type": "string" + }, + "type": "array" + }, + "projectionApplied": { + "enum": [ + false + ], + "type": "boolean" + }, + "returnedPacketCount": { + "type": "integer" + } + }, + "type": "object" + }, + "readState": { + "enum": [ + "signal", + "observation", + "no_current_finding", + "source_unavailable" + ], + "type": "string" + } + }, + "type": "object" + }, + "minItems": 1, + "type": "array" + }, + "interpretation": { + "properties": { + "directionPolicy": { + "type": "string" + }, + "evidenceScope": { + "enum": [ + "all_active_packets_currently_held_on_evidence_bus" + ], + "type": "string" + }, + "heartbeatMeasured": { + "enum": [ + false + ], + "type": "boolean" + }, + "scope": { + "enum": [ + "current_decision_evidence" + ], + "type": "string" + }, + "silenceMeaning": { + "type": "string" + }, + "upstreamCompleteness": { + "enum": [ + "not_asserted" + ], + "type": "string" + } + }, + "type": "object" + }, + "schemaVersion": { + "enum": [ + "engine-intelligence-snapshot.v1" + ], + "type": "string" + }, + "symbol": { + "type": "string" + } + }, + "type": "object" + }, + "engineRuntimeTelemetry": { + "description": "Per-scan runtime telemetry from the detection service. A measured snapshot carries the complete canonical lifecycle roster, explicit provider and operational coverage, and lossless provider states; a retired or absent roster row is never described as running. Stale retains the complete last snapshot for diagnosis; unavailable and invalid remain distinct.", + "properties": { + "ageSeconds": { + "type": [ + "number", + "null" + ] + }, + "asOf": { + "format": "date-time", + "type": [ + "string", + "null" + ] + }, + "maxAgeSeconds": { + "description": "Configured maximum age for a runtime snapshot to remain measured; default 300 seconds, aligned to the production scan SLA.", + "type": "number" + }, + "reason": { + "type": [ + "string", + "null" + ] + }, + "snapshot": { + "additionalProperties": true, + "description": "Unprojected producer snapshot. Its per-engine rows carry cadence, cache, timeout, error, not-loaded, and no-finding execution states when telemetry is measured.", + "type": [ + "object", + "null" + ] + }, + "source": { + "enum": [ + "fahali:engine-telemetry:v1" + ], + "type": "string" + }, + "status": { + "enum": [ + "measured", + "stale", + "unavailable", + "invalid" + ], + "type": "string" + } + }, + "type": "object" + }, + "silent": { + "items": { + "type": "string" + }, + "type": "array" + }, + "verdict": { + "description": "Full non-binding committee evidence product. It preserves membership, dissent, evidence, limitations, actions, invalidation, confidence components, provenance, and engine telemetry; only the canonical arbiter publishes the binding market direction.", + "properties": { + "actionOptions": { + "items": { + "properties": { + "action": { + "type": "string" + }, + "rationale": { + "type": "string" + }, + "riskLevel": { + "enum": [ + "low", + "moderate", + "high" + ], + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + }, + "agentsAgreeing": { + "items": { + "type": "string" + }, + "type": "array" + }, + "agentsAgreeingCount": { + "type": "integer" + }, + "agentsDisagreeing": { + "items": { + "type": "string" + }, + "type": "array" + }, + "agentsDisagreeingCount": { + "type": "integer" + }, + "agentsSilent": { + "items": { + "type": "string" + }, + "type": "array" + }, + "agentsSilentCount": { + "type": "integer" + }, + "assetClass": { + "type": "string" + }, + "bindingAuthority": { + "enum": [ + "canonical_verdict", + null + ], + "type": [ + "string", + "null" + ] + }, + "bindingDirection": { + "type": "null" + }, + "committee": { + "description": "Committee evidence census. It is an input to the canonical arbiter, never a second binding direction authority.", + "properties": { + "abstained": { + "items": { + "type": "string" + }, + "type": [ + "array", + "null" + ] + }, + "abstained_unavailable_reason": { + "type": [ + "string", + "null" + ] + }, + "agreeing": { + "items": { + "type": "string" + }, + "type": "array" + }, + "disagreeing": { + "items": { + "type": "string" + }, + "type": "array" + }, + "dissent_evidence": { + "items": { + "properties": { + "dataStatus": { + "type": "string" + }, + "direction": { + "enum": [ + "bullish", + "bearish", + "neutral", + "directionless" + ], + "type": "string" + }, + "engine": { + "type": "string" + }, + "magnitude": { + "type": [ + "number", + "null" + ] + }, + "observation": { + "type": [ + "string", + "null" + ] + }, + "timeframe": { + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + }, + "minority": { + "items": { + "type": "string" + }, + "type": "array" + }, + "no_read": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "type": "object" + }, + "committeeEvidenceDirection": { + "description": "Explicit non-binding committee direction on the evidence-ranking projection.", + "type": [ + "string", + "null" + ] + }, + "confidence": { + "maximum": 1, + "minimum": 0, + "type": "number" + }, + "confidenceBreakdown": { + "properties": { + "directionalConsensus": { + "type": "number" + }, + "evidenceQuality": { + "type": "number" + }, + "historicalAccuracy": { + "type": "number" + } + }, + "type": "object" + }, + "confidenceScale": { + "type": "string" + }, + "contributingEvidenceIds": { + "items": { + "type": "string" + }, + "type": "array" + }, + "dataQualityWarning": { + "type": [ + "string", + "null" + ] + }, + "direction": { + "description": "Committee evidence lean only. Reconcile through the canonical verdict before acting.", + "type": [ + "string", + "null" + ] + }, + "directionRole": { + "enum": [ + "committee_evidence_non_binding", + null + ], + "type": [ + "string", + "null" + ] + }, + "engineIntelligence": { + "description": "Complete canonical-roster current-decision evidence snapshot. Every roster entry is emitted, including no_current_finding, stale, and source_unavailable states; this is evidence telemetry, not a worker heartbeat.", + "properties": { + "asOf": { + "format": "date-time", + "type": "string" + }, + "coverage": { + "properties": { + "complete": { + "enum": [ + true + ], + "type": "boolean" + }, + "completeMeaning": { + "enum": [ + "all_canonical_roster_entries_emitted" + ], + "type": "string" + }, + "emittedEngines": { + "description": "Roster entries emitted in this response.", + "minimum": 0, + "type": "integer" + }, + "expectedEngines": { + "description": "Live canonical-roster size at response time.", + "minimum": 0, + "type": "integer" + }, + "noCurrentFinding": { + "type": "integer" + }, + "reporting": { + "type": "integer" + }, + "sourceUnavailable": { + "type": "integer" + }, + "stale": { + "type": "integer" + } + }, + "type": "object" + }, + "engines": { + "description": "One row for each canonical specialist; quiet engines remain explicit rows.", + "items": { + "properties": { + "asOf": { + "format": "date-time", + "type": [ + "string", + "null" + ] + }, + "contract": { + "properties": { + "failureBehavior": { + "type": "string" + }, + "inputRequirements": { + "items": { + "type": "string" + }, + "type": "array" + }, + "maxStalenessMs": { + "type": "number" + }, + "missingDataBehavior": { + "type": "string" + }, + "outputContract": { + "properties": { + "confidenceScale": { + "type": "string" + }, + "fields": { + "items": { + "type": "string" + }, + "type": "array" + }, + "provenanceDefaults": { + "additionalProperties": { + "type": "string" + }, + "type": "object" + } + }, + "type": "object" + } + }, + "type": "object" + }, + "currentDirections": { + "items": { + "enum": [ + "bullish", + "bearish", + "neutral" + ], + "type": "string" + }, + "type": "array" + }, + "display": { + "properties": { + "description": { + "type": "string" + }, + "desk": { + "type": "string" + }, + "directionality": { + "enum": [ + "DIRECTIONAL", + "DIRECTIONLESS" + ], + "type": "string" + }, + "name": { + "type": "string" + }, + "observes": { + "type": "string" + }, + "proxy": { + "type": "boolean" + } + }, + "type": "object" + }, + "eligibleToVote": { + "description": "Whether this specialist may contribute a directional vote; it does not make the committee binding.", + "type": "boolean" + }, + "engineKey": { + "type": "string" + }, + "evidencePackets": { + "description": "Every active packet held for this engine and symbol; projectionApplied is false.", + "items": { + "description": "Unprojected current evidence packet. contributingRawSignals, missingSignals, limitations, provenance, freshness, and engine execution state travel with the observation.", + "properties": { + "agentError": { + "type": "string" + }, + "agentStatus": { + "enum": [ + "healthy", + "degraded", + "failed" + ], + "type": "string" + }, + "agentVersion": { + "type": "string" + }, + "assetClass": { + "enum": [ + "crypto", + "equity", + "fx", + "commodity", + "unknown" + ], + "type": "string" + }, + "canonicalEngineKey": { + "type": "string" + }, + "confidence": { + "maximum": 1, + "minimum": 0, + "type": "number" + }, + "confidenceComponents": { + "additionalProperties": { + "type": "number" + }, + "type": "object" + }, + "confidenceScale": { + "enum": [ + "raw_model_output", + "calibrated", + "ensemble_agreement", + "historical_accuracy", + "proxy_confidence", + "null" + ], + "type": "string" + }, + "contributingRawSignals": { + "description": "Raw measurements contributing to this packet; audit output does not cap this collection.", + "items": { + "properties": { + "description": { + "type": "string" + }, + "source": { + "type": "string" + }, + "value": { + "type": [ + "number", + "string", + "boolean" + ] + } + }, + "type": "object" + }, + "type": "array" + }, + "dataOrigin": { + "type": "string" + }, + "dataStatus": { + "enum": [ + "measured", + "proxy", + "synthetic", + "stale", + "missing", + "unavailable" + ], + "type": "string" + }, + "direction": { + "enum": [ + "bullish", + "bearish", + "neutral", + "directionless" + ], + "type": "string" + }, + "evidenceId": { + "type": "string" + }, + "exchange": { + "type": "string" + }, + "expiresAt": { + "format": "date-time", + "type": "string" + }, + "isSynthetic": { + "type": "boolean" + }, + "limitations": { + "items": { + "type": "string" + }, + "type": "array" + }, + "magnitude": { + "type": [ + "number", + "null" + ] + }, + "missingSignals": { + "items": { + "type": "string" + }, + "type": "array" + }, + "phenomenon": { + "type": "string" + }, + "phenomenonCategory": { + "type": "string" + }, + "processingTimeMs": { + "type": "number" + }, + "recommendedConsumerAction": { + "enum": [ + "alert", + "monitor", + "investigate", + "ignore", + "cross_reference", + "escalate" + ], + "type": "string" + }, + "symbol": { + "type": "string" + }, + "syntheticFields": { + "items": { + "type": "string" + }, + "type": "array" + }, + "timeframe": { + "type": "string" + }, + "timestamp": { + "format": "date-time", + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + }, + "freshness": { + "properties": { + "ageMs": { + "type": [ + "number", + "null" + ] + }, + "latestExpiresAt": { + "format": "date-time", + "type": [ + "string", + "null" + ] + }, + "maxStalenessMs": { + "type": "number" + }, + "status": { + "enum": [ + "fresh", + "stale", + "unreported" + ], + "type": "string" + } + }, + "type": "object" + }, + "observation": { + "properties": { + "confidence": { + "type": "number" + }, + "confidenceScale": { + "type": "string" + }, + "direction": { + "enum": [ + "bullish", + "bearish", + "neutral", + "directionless" + ], + "type": "string" + }, + "evidenceId": { + "type": "string" + }, + "phenomenon": { + "type": "string" + }, + "phenomenonCategory": { + "type": "string" + }, + "recommendedConsumerAction": { + "type": "string" + } + }, + "type": [ + "object", + "null" + ] + }, + "operationalStatus": { + "enum": [ + "reporting", + "no_current_finding", + "source_unavailable", + "stale" + ], + "type": "string" + }, + "provenance": { + "properties": { + "contributingRawSignalCount": { + "type": "integer" + }, + "dataOrigins": { + "items": { + "type": "string" + }, + "type": "array" + }, + "dataStatuses": { + "items": { + "type": "string" + }, + "type": "array" + }, + "evidenceIds": { + "items": { + "type": "string" + }, + "type": "array" + }, + "projectionApplied": { + "enum": [ + false + ], + "type": "boolean" + }, + "returnedPacketCount": { + "type": "integer" + } + }, + "type": "object" + }, + "readState": { + "enum": [ + "signal", + "observation", + "no_current_finding", + "source_unavailable" + ], + "type": "string" + } + }, + "type": "object" + }, + "minItems": 1, + "type": "array" + }, + "interpretation": { + "properties": { + "directionPolicy": { + "type": "string" + }, + "evidenceScope": { + "enum": [ + "all_active_packets_currently_held_on_evidence_bus" + ], + "type": "string" + }, + "heartbeatMeasured": { + "enum": [ + false + ], + "type": "boolean" + }, + "scope": { + "enum": [ + "current_decision_evidence" + ], + "type": "string" + }, + "silenceMeaning": { + "type": "string" + }, + "upstreamCompleteness": { + "enum": [ + "not_asserted" + ], + "type": "string" + } + }, + "type": "object" + }, + "schemaVersion": { + "enum": [ + "engine-intelligence-snapshot.v1" + ], + "type": "string" + }, + "symbol": { + "type": "string" + } + }, + "type": "object" + }, + "engineRuntimeTelemetry": { + "description": "Per-scan runtime telemetry from the detection service. A measured snapshot carries the complete canonical lifecycle roster, explicit provider and operational coverage, and lossless provider states; a retired or absent roster row is never described as running. Stale retains the complete last snapshot for diagnosis; unavailable and invalid remain distinct.", + "properties": { + "ageSeconds": { + "type": [ + "number", + "null" + ] + }, + "asOf": { + "format": "date-time", + "type": [ + "string", + "null" + ] + }, + "maxAgeSeconds": { + "description": "Configured maximum age for a runtime snapshot to remain measured; default 300 seconds, aligned to the production scan SLA.", + "type": "number" + }, + "reason": { + "type": [ + "string", + "null" + ] + }, + "snapshot": { + "additionalProperties": true, + "description": "Unprojected producer snapshot. Its per-engine rows carry cadence, cache, timeout, error, not-loaded, and no-finding execution states when telemetry is measured.", + "type": [ + "object", + "null" + ] + }, + "source": { + "enum": [ + "fahali:engine-telemetry:v1" + ], + "type": "string" + }, + "status": { + "enum": [ + "measured", + "stale", + "unavailable", + "invalid" + ], + "type": "string" + } + }, + "type": "object" + }, + "evidence": { + "properties": { + "measured": { + "items": { + "type": "string" + }, + "type": "array" + }, + "missing": { + "items": { + "type": "string" + }, + "type": "array" + }, + "proxy": { + "items": { + "type": "string" + }, + "type": "array" + }, + "synthetic": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "type": "object" + }, + "guardrail": { + "properties": { + "annotations": { + "items": { + "type": "string" + }, + "type": "array" + }, + "passed": { + "type": "boolean" + } + }, + "type": "object" + }, + "headline": { + "type": "string" + }, + "invalidationConditions": { + "items": { + "properties": { + "condition": { + "type": "string" + }, + "probability": { + "enum": [ + "low", + "moderate", + "high" + ], + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + }, + "monitoringWindow": { + "type": "string" + }, + "narrative": { + "type": "string" + }, + "neutralReportingCount": { + "type": "integer" + }, + "portfolioImpact": { + "type": "object" + }, + "provenanceHash": { + "type": "string" + }, + "replayUrl": { + "type": "string" + }, + "reportingCount": { + "type": "integer" + }, + "severity": { + "enum": [ + "critical", + "high", + "medium", + "low", + "noise" + ], + "type": "string" + }, + "severityReason": { + "type": "string" + }, + "symbol": { + "type": "string" + }, + "timestamp": { + "format": "date-time", + "type": "string" + }, + "totalAgentsWithSignal": { + "type": "integer" + }, + "verdictId": { + "type": "string" + } + }, + "type": "object" + } + }, + "type": "object" + }, + "compositeConfidencePct": { + "description": "Canonical arbiter confidence on a 0-100 scale. This is the only confidence that may authorize or gate the binding market decision.", + "maximum": 100, + "minimum": 0, + "type": [ + "number", + "null" + ] + }, + "conflict": { + "description": "Compatibility alias of conflictDetail.present.", + "type": "boolean" + }, + "conflictDetail": { + "description": "Canonical arbitration result when committee evidence and forecast disagree; committee input is not independently binding.", + "properties": { + "note": { + "type": [ + "string", + "null" + ] + }, + "present": { + "type": "boolean" + } + }, + "type": "object" + }, + "coverage": { + "description": "Compatibility label on the MCP route; coverageDetail carries the structured source value.", + "type": [ + "string", + "object" + ] + }, + "coverageDetail": { + "properties": { + "label": { + "type": "string" + }, + "reporting": { + "type": "integer" + }, + "totalEngines": { + "type": "integer" + } + }, + "type": "object" + }, + "cta": { + "properties": { + "action": { + "enum": [ + "alert_risk", + "review_exposure", + "watchlist", + "wait_for_evidence" + ], + "type": "string" + }, + "label": { + "type": "string" + } + }, + "type": "object" + }, + "direction": { + "enum": [ + "DOWNSIDE_SKEW", + "UPSIDE_SKEW", + "RANGE_BOUND", + "MIXED", + "INSUFFICIENT_EVIDENCE" + ], + "type": "string" + }, + "expectedMovePct": { + "type": [ + "number", + "null" + ] + }, + "expectedRangePct": { + "properties": { + "high": { + "type": [ + "number", + "null" + ] + }, + "low": { + "type": [ + "number", + "null" + ] + } + }, + "type": [ + "object", + "null" + ] + }, + "explanation": { + "type": "string" + }, + "headline": { + "type": "string" + }, + "horizon": { + "enum": [ + "72h" + ], + "type": "string" + }, + "invalidation": { + "items": { + "type": "object" + }, + "type": [ + "array", + "null" + ] + }, + "participation": { + "properties": { + "directional": { + "type": "integer" + }, + "ofReporting": { + "type": "integer" + } + }, + "type": "object" + }, + "policyVersion": { + "type": "string" + }, + "portfolio": { + "properties": { + "capitalAtRiskUsd": { + "type": [ + "number", + "null" + ] + }, + "holdsSymbol": { + "type": "boolean" + } + }, + "type": [ + "object", + "null" + ] + }, + "probabilities": { + "properties": { + "downside": { + "type": "number" + }, + "rangeBound": { + "type": "number" + }, + "upside": { + "type": "number" + } + }, + "type": [ + "object", + "null" + ] + }, + "record": { + "properties": { + "directional": { + "properties": { + "total": { + "type": "integer" + }, + "wins": { + "type": "integer" + } + }, + "type": "object" + }, + "engineFlags": { + "properties": { + "total": { + "type": "integer" + }, + "wins": { + "type": "integer" + } + }, + "type": "object" + }, + "forecast72h": { + "properties": { + "accruing": { + "type": "boolean" + }, + "total": { + "type": "integer" + }, + "wins": { + "type": "integer" + } + }, + "type": "object" + } + }, + "type": "object" + }, + "recordStatedInExplanation": { + "type": "boolean" + }, + "reliability": { + "enum": [ + "UNVALIDATED", + "LOW", + "MEDIUM", + "HIGH" + ], + "type": "string" + }, + "state": { + "enum": [ + "NORMAL", + "WATCH", + "DEFEND", + "WITHHOLD" + ], + "type": "string" + }, + "symbol": { + "type": "string" + }, + "thresholds": { + "properties": { + "downsideBelowPct": { + "type": "number" + }, + "upsideAbovePct": { + "type": "number" + } + }, + "type": [ + "object", + "null" + ] + } + }, + "type": [ + "object", + "null" + ] + }, + "masterAgentEvidence": { + "description": "Preserved agent_verdict evidence for audit and compatibility. Its direction, confidence, and expected move are non-binding inputs; they never replace, authorize, or gate the canonical verdict.", + "properties": { + "abstainReason": { + "type": [ + "string", + "null" + ] + }, + "actionability": { + "enum": [ + "ACTIONABLE", + "ABSTAIN", + null + ], + "type": [ + "string", + "null" + ] + }, + "confidence": { + "description": "Confidence in the master-agent evidence synthesis. It is not decision confidence.", + "maximum": 1, + "minimum": 0, + "type": [ + "number", + "null" + ] + }, + "direction": { + "description": "Legacy master-agent evidence lean only; never the binding market direction.", + "enum": [ + "bullish", + "bearish", + "neutral", + "unknown", + null + ], + "type": [ + "string", + "null" + ] + }, + "expectedMovePct": { + "description": "Legacy evidence estimate only; the canonical arbiter owns the binding expected move.", + "type": [ + "number", + "null" + ] + }, + "forecastHorizon": { + "type": [ + "string", + "null" + ] + }, + "producer": { + "enum": [ + "agent_verdict" + ], + "type": "string" + }, + "role": { + "enum": [ + "evidence_non_binding" + ], + "type": "string" + }, + "severity": { + "type": [ + "string", + "null" + ] + }, + "uncertainty": { + "type": [ + "number", + "null" + ] + }, + "urgencyScore": { + "type": [ + "number", + "null" + ] + } + }, + "type": [ + "object", + "null" + ] + }, + "provenance": { + "properties": { + "engineNames": { + "items": { + "type": "string" + }, + "type": "array" + }, + "integrity": { + "properties": { + "alg": { + "type": "string" + }, + "hash": { + "type": "string" + }, + "hashedAt": { + "format": "date-time", + "type": "string" + } + }, + "type": "object" + }, + "walkForwardValidated": { + "type": "boolean" + } + }, + "type": "object" + }, + "reasoning": { + "properties": { + "conflictScore": { + "type": "number" + }, + "missingSignals": { + "items": { + "type": "string" + }, + "type": "array" + }, + "steps": { + "items": { + "type": "string" + }, + "type": "array" + }, + "toolsUsed": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "type": "object" + }, + "symbol": { + "type": "string" + }, + "timestamp": { + "type": [ + "string", + "integer", + "number" + ] + }, + "verdict": { + "description": "Compatibility decision block. Direction and bindingConfidence belong to the canonical arbiter; legacy confidence and any masterAgentEvidence remain non-binding evidence.", + "properties": { + "abstainReason": { + "description": "Present only when actionability is ABSTAIN. Plain-language explanation of why no directional call is being made — distinguishes a measured range-bound read from missing or conflicting evidence.", + "type": "string" + }, + "actionability": { + "description": "Gate on this before treating a verdict as a reason to act. ACTIONABLE means a directional call is on the table: a bullish/bearish read that cleared the 25% confidence floor. ABSTAIN means there is no directional call, for one of two reasons named in abstainReason — (a) the read was directional but below the floor, so its label was withheld and direction reads neutral by policy, or (b) no direction was reached at all: range-bound, insufficient evidence, or signals in conflict. Widened 2026-08-14: case (b) previously fell through to ACTIONABLE by default, so verdicts whose own arbiter reported INSUFFICIENT_EVIDENCE reached agents marked actionable. ABSTAIN is never a default — every verdict is decided.", + "enum": [ + "ACTIONABLE", + "ABSTAIN" + ], + "type": "string" + }, + "bindingConfidence": { + "description": "Canonical arbiter confidence normalized to 0-1. This is the only decision confidence; null means no canonical confidence was available.", + "maximum": 1, + "minimum": 0, + "type": [ + "number", + "null" + ] + }, + "bindingConfidenceProducer": { + "description": "canonical_verdict when bindingConfidence is present; null when the sole direction authority returned no read.", + "enum": [ + "canonical_verdict", + null + ], + "type": [ + "string", + "null" + ] + }, + "confidence": { + "description": "Legacy agent_verdict evidence confidence retained for compatibility. It is non-binding and is never decision confidence.", + "maximum": 1, + "minimum": 0, + "type": "number" + }, + "confidenceProducer": { + "description": "Producer of the legacy confidence field; an evidence producer, not a direction authority.", + "enum": [ + "agent_verdict" + ], + "type": "string" + }, + "confidenceRole": { + "description": "Declares that confidence is compatibility evidence and cannot authorize or gate the decision.", + "enum": [ + "legacy_master_evidence_non_binding" + ], + "type": "string" + }, + "direction": { + "description": "Served market direction after canonical arbitration and its confidence gate. No agent or committee evidence may replace it.", + "enum": [ + "bullish", + "bearish", + "neutral", + "unknown" + ], + "type": "string" + }, + "expectedMovePct": { + "description": "Signed expected move, percent. ALWAYS null when actionability is ABSTAIN — a signed move sitting beside a withheld direction is a directional claim the verdict declined to make, and it is the only concrete figure in the block, so an agent reads it as the call. Live 2026-08-14: NVO and META shipped +10 next to direction 'neutral'.", + "type": [ + "number", + "null" + ] + }, + "forecastHorizon": { + "type": "string" + }, + "masterAgentEvidence": { + "description": "Preserved agent_verdict evidence for audit and compatibility. Its direction, confidence, and expected move are non-binding inputs; they never replace, authorize, or gate the canonical verdict.", + "properties": { + "abstainReason": { + "type": [ + "string", + "null" + ] + }, + "actionability": { + "enum": [ + "ACTIONABLE", + "ABSTAIN", + null + ], + "type": [ + "string", + "null" + ] + }, + "confidence": { + "description": "Confidence in the master-agent evidence synthesis. It is not decision confidence.", + "maximum": 1, + "minimum": 0, + "type": [ + "number", + "null" + ] + }, + "direction": { + "description": "Legacy master-agent evidence lean only; never the binding market direction.", + "enum": [ + "bullish", + "bearish", + "neutral", + "unknown", + null + ], + "type": [ + "string", + "null" + ] + }, + "expectedMovePct": { + "description": "Legacy evidence estimate only; the canonical arbiter owns the binding expected move.", + "type": [ + "number", + "null" + ] + }, + "forecastHorizon": { + "type": [ + "string", + "null" + ] + }, + "producer": { + "enum": [ + "agent_verdict" + ], + "type": "string" + }, + "role": { + "enum": [ + "evidence_non_binding" + ], + "type": "string" + }, + "severity": { + "type": [ + "string", + "null" + ] + }, + "uncertainty": { + "type": [ + "number", + "null" + ] + }, + "urgencyScore": { + "type": [ + "number", + "null" + ] + } + }, + "type": [ + "object", + "null" + ] + }, + "severity": { + "type": "string" + }, + "uncertainty": { + "type": "number" + }, + "urgencyScore": { + "description": "Rescaled urgency evidence when the source produced it. Null is the honest value for a withheld/no-read verdict; it must never be filled with zero.", + "type": [ + "number", + "null" + ] + } + }, + "required": [ + "direction", + "confidence", + "uncertainty" + ], + "type": "object" + } + }, + "type": "object" + }, + "type": "array" + }, + "dataState": { + "enum": [ + "measured", + "partial", + "no_data", + "not_instrumented", + "stale", + "error" + ], + "type": "string" + }, + "decision": { + "type": [ + "object", + "null" + ] + }, + "decisionEligibility": { + "description": "Fail-closed binding-authority policy. WITHHELD means source evidence remains available for audit while normalized direction, actionability and execution fields are revoked.", + "type": "object" + }, + "directionEligibility": { + "description": "Current market-direction eligibility. Direction is authorized only by an exact, eligible producer stratum (canonical_verdict, canonical_symbol_verdict, committee_verdict) — read bindingAuthority to see which one bound. Widening WHO may bind did not weaken WHAT binding requires: the named producer must still hold a matching horizon/class/family record on a verified-only judged population, so an authority without a record still cannot bind.", + "type": "object" + }, + "evidenceQuality": { + "type": "object" + }, + "executionEligibility": { + "description": "Fail-closed execution boundary. Portfolio monitoring tools always return WITHHELD with MONITOR_ONLY_NO_EXECUTION_AUTHORITY while Fahali has no capital path.", + "type": "object" + }, + "instruments": { + "description": "Resolved or explicitly partial instrument identities. A missing venue carries an ambiguity warning.", + "items": { + "type": "object" + }, + "type": "array" + }, + "matchedTrackRecord": { + "description": "A judged record only when engine, horizon, regime/instrument class, and claim family match this response. `state` is one of: `measured` (a stratum cleared the publishability gate — `stratum` carries engine, horizon tier, bar regime, recall, precision, base rate, base-rate lift, median lead hours, effective sample, warned events and the measurement date); `withheld` (the gate ran and refused — `reason` says why, in words); `unavailable` (the record could not be read at all — an infrastructure failure that says nothing about the record). It is ONE stratum selected by recall, never a platform-wide accuracy. Null means no exact record match; read recordMatchReason.", + "properties": { + "dataAsOf": { + "description": "When the record was computed. A figure without this reads as current forever.", + "type": "string" + }, + "reason": { + "description": "Present on `withheld` and `unavailable`: why there is no figure.", + "type": "string" + }, + "state": { + "enum": [ + "measured", + "withheld", + "unavailable" + ], + "type": "string" + }, + "stratum": { + "description": "Present only on `measured`. Precision must never be quoted without recall.", + "properties": { + "barRegime": { + "type": "string" + }, + "baseRatePct": { + "type": "number" + }, + "claimFamily": { + "description": "What this precision is ABOUT: `directional` (price moved the way the stratum said) or `magnitude` (a move exceeded the judge bar, carrying no direction). Never infer a direction from a `magnitude` row.", + "type": "string" + }, + "claimMeans": { + "description": "The record endpoint's own sentence explaining the claim family. Quote it beside any precision figure.", + "type": "string" + }, + "effectiveSample": { + "type": "number" + }, + "engine": { + "type": "string" + }, + "horizonTier": { + "type": "string" + }, + "leadMedianHours": { + "type": "number" + }, + "measuredOn": { + "type": "string" + }, + "precisionPct": { + "description": "Share of its warnings that held. Never quotable alone.", + "type": "number" + }, + "recallPct": { + "description": "Share of qualifying events this stratum warned on — the half a buyer is exposed to.", + "type": "number" + }, + "warnedEvents": { + "type": "number" + } + }, + "type": "object" + } + }, + "required": [ + "state" + ], + "type": [ + "object", + "null" + ] + }, + "mcpStatus": { + "description": "Normalized MCP result status. The endpoint's original status vocabulary remains in `status` and `sourceStatus`.", + "enum": [ + "ok", + "error" + ], + "type": "string" + }, + "monitoringEligibility": { + "description": "Current portfolio-monitoring validity based on captured identity, freshness, integrity, and the caller-supplied monitoring policy. ELIGIBLE authorizes observation/delivery only, never financial action.", + "type": "object" + }, + "nextActions": { + "description": "Registry-validated follow-up calls. Missing tools, invalid arguments, unresolved placeholders, and disabled tools are omitted.", + "items": { + "properties": { + "args": { + "additionalProperties": { + "type": "string" + }, + "type": "object" + }, + "requiredTier": { + "type": "string" + }, + "tool": { + "type": "string" + }, + "why": { + "type": "string" + } + }, + "required": [ + "tool", + "why" + ], + "type": "object" + }, + "type": "array" + }, + "notReturned": { + "description": "Every requested symbol without a judged verdict row. Fresh/stale runtime telemetry remains attached when available; no engine evidence is promoted into a binding direction.", + "items": { + "properties": { + "bindingDecision": { + "description": "Explicit authority boundary for a requested symbol with no judged verdict row. Runtime evidence may still be present, but it cannot become a fallback direction.", + "properties": { + "direction": { + "type": "null" + }, + "producer": { + "enum": [ + "canonical_verdict" + ], + "type": "string" + }, + "reason": { + "type": "string" + }, + "state": { + "type": "null" + }, + "status": { + "enum": [ + "withheld" + ], + "type": "string" + } + }, + "type": "object" + }, + "engineRuntimeTelemetry": { + "description": "Per-scan runtime telemetry from the detection service. A measured snapshot carries the complete canonical lifecycle roster, explicit provider and operational coverage, and lossless provider states; a retired or absent roster row is never described as running. Stale retains the complete last snapshot for diagnosis; unavailable and invalid remain distinct.", + "properties": { + "ageSeconds": { + "type": [ + "number", + "null" + ] + }, + "asOf": { + "format": "date-time", + "type": [ + "string", + "null" + ] + }, + "maxAgeSeconds": { + "description": "Configured maximum age for a runtime snapshot to remain measured; default 300 seconds, aligned to the production scan SLA.", + "type": "number" + }, + "reason": { + "type": [ + "string", + "null" + ] + }, + "snapshot": { + "additionalProperties": true, + "description": "Unprojected producer snapshot. Its per-engine rows carry cadence, cache, timeout, error, not-loaded, and no-finding execution states when telemetry is measured.", + "type": [ + "object", + "null" + ] + }, + "source": { + "enum": [ + "fahali:engine-telemetry:v1" + ], + "type": "string" + }, + "status": { + "enum": [ + "measured", + "stale", + "unavailable", + "invalid" + ], + "type": "string" + } + }, + "type": [ + "object", + "null" + ] + }, + "reason": { + "type": "string" + }, + "symbol": { + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + }, + "provenanceRoot": { + "description": "SHA-256 over the per-item integrity hashes. Verifies this response wasn't altered after receipt (recompute to check). NOT a cryptographic attestation — key-signed receipts are on the roadmap.", + "type": "string" + }, + "recordMatchReason": { + "description": "Why matchedTrackRecord is present or null. A null record is never evidence of safety or engine failure.", + "type": "string" + }, + "requestId": { + "type": "string" + }, + "requestedCoverage": { + "properties": { + "bySymbol": { + "additionalProperties": { + "properties": { + "bindingDecision": { + "description": "Explicit authority boundary for a requested symbol with no judged verdict row. Runtime evidence may still be present, but it cannot become a fallback direction.", + "properties": { + "direction": { + "type": "null" + }, + "producer": { + "enum": [ + "canonical_verdict" + ], + "type": "string" + }, + "reason": { + "type": "string" + }, + "state": { + "type": "null" + }, + "status": { + "enum": [ + "withheld" + ], + "type": "string" + } + }, + "type": "object" + }, + "engineRuntimeTelemetry": { + "description": "Per-scan runtime telemetry from the detection service. A measured snapshot carries the complete canonical lifecycle roster, explicit provider and operational coverage, and lossless provider states; a retired or absent roster row is never described as running. Stale retains the complete last snapshot for diagnosis; unavailable and invalid remain distinct.", + "properties": { + "ageSeconds": { + "type": [ + "number", + "null" + ] + }, + "asOf": { + "format": "date-time", + "type": [ + "string", + "null" + ] + }, + "maxAgeSeconds": { + "description": "Configured maximum age for a runtime snapshot to remain measured; default 300 seconds, aligned to the production scan SLA.", + "type": "number" + }, + "reason": { + "type": [ + "string", + "null" + ] + }, + "snapshot": { + "additionalProperties": true, + "description": "Unprojected producer snapshot. Its per-engine rows carry cadence, cache, timeout, error, not-loaded, and no-finding execution states when telemetry is measured.", + "type": [ + "object", + "null" + ] + }, + "source": { + "enum": [ + "fahali:engine-telemetry:v1" + ], + "type": "string" + }, + "status": { + "enum": [ + "measured", + "stale", + "unavailable", + "invalid" + ], + "type": "string" + } + }, + "type": [ + "object", + "null" + ] + }, + "reason": { + "type": "string" + }, + "state": { + "enum": [ + "returned", + "not_returned" + ], + "type": "string" + } + }, + "type": "object" + }, + "type": "object" + }, + "complete": { + "description": "True when every requested symbol is explicitly accounted for as returned or not_returned; it is not a claim that every symbol has a verdict.", + "type": "boolean" + }, + "notReturnedCount": { + "type": "integer" + }, + "requestedCount": { + "type": "integer" + }, + "returnedCount": { + "type": "integer" + } + }, + "type": [ + "object", + "null" + ] + }, + "responseControl": { + "type": "object" + }, + "responseState": { + "enum": [ + "OK_WITH_FINDINGS", + "OK_NO_FINDINGS", + "PARTIAL", + "WITHHELD", + "NO_COVERAGE", + "ERROR" + ], + "type": "string" + }, + "schemaVersion": { + "type": "string" + }, + "scope": { + "type": "object" + }, + "sourceConfidenceSemantics": { + "type": [ + "array", + "object", + "null" + ] + }, + "sourceDataState": { + "description": "The upstream endpoint's exact data-state value before endpoint-aware classification.", + "type": [ + "string", + "null" + ] + }, + "sourceDecision": { + "type": [ + "object", + "null" + ] + }, + "sourceError": { + "description": "The upstream endpoint's exact error text/code before normalization, when one was present.", + "type": [ + "string", + "null" + ] + }, + "sourceEvidenceQuality": { + "type": [ + "object", + "null" + ] + }, + "sourceScope": { + "type": [ + "object", + "null" + ] + }, + "sourceStatus": { + "description": "The upstream endpoint's exact status before the MCP envelope normalizes transport success/error.", + "type": [ + "string", + "null" + ] + }, + "status": { + "description": "The endpoint's original status vocabulary (for example ok, partial, degraded, withheld, or no_alerts). Use mcpStatus for normalized transport success/error.", + "type": "string" + }, + "symbolCoverage": { + "description": "Conservation ledger satisfying requested = returned + withheld + notReturned for requested-symbol calls.", + "type": "object" + }, + "updatedAt": { + "format": "date-time", + "type": "string" + } + }, + "type": "object" +}
- Added
fahali_get_microstructure_proxy - Added
fahali_get_portfolio_decision - Changed
fahali_get_portfolio_metrics6 fields changed- added
Input schema / properties / detailAdded value: +{ + "default": "audit", + "description": "Response depth. audit is the full-fidelity default; brief and standard are explicit compact projections.", + "enum": [ + "brief", + "standard", + "audit" + ], + "type": "string" +} - added
Input schema / properties / include_withheldAdded value: +{ + "default": true, + "description": "Include full withheld-row detail. Defaults true with audit; explicitly set false only for a compact projection.", + "type": "boolean" +} - added
Input schema / properties / limitAdded value: +{ + "description": "Optional maximum rows per projectable collection. Audit has no MCP projection cap; brief defaults to 3 and standard to 12.", + "maximum": 100, + "minimum": 1, + "type": "integer" +} - added
Input schema / properties / sinceAdded value: +{ + "description": "Optional lower timestamp bound for returned row collections.", + "format": "date-time", + "type": "string" +} - added
Input schema / properties / symbolsAdded value: +{ + "description": "Optional symbol projection, as a comma-separated string or array. Rows without instrument identity are not discarded.", + "items": { + "type": "string" + }, + "type": [ + "string", + "array" + ] +} - changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "absence": { + "description": "Why no actionable finding is present: measured_empty, user_empty, no_coverage, source_unverified, stale, withheld, source_error, auth_failure, or entitlement_required.", + "type": [ + "object", + "null" + ] + }, + "agentBriefing": { + "description": "Audit-only narrative projection. Present only when detail='audit'; compact responses do not duplicate structured data as prose.", + "type": "string" + }, + "asOf": { + "format": "date-time", + "type": "string" + }, + "auth": { + "description": "Credential lifetime visible to the caller. OAuth secondsRemaining lets an autonomous agent refresh before a multi-call workflow is interrupted.", + "properties": { + "credentialType": { + "enum": [ + "oauth", + "api_key", + "process_key", + "none" + ], + "type": "string" + }, + "expiresAt": { + "type": [ + "string", + "null" + ] + }, + "refreshSupported": { + "type": "boolean" + }, + "secondsRemaining": { + "type": [ + "number", + "null" + ] + } + }, + "type": "object" + }, + "cascadeRisk": { + "description": "0-1 cascade risk from crash/liquidation signal confidences. NULL when no crash/liquidation signals exist in the window — null means 'not computed', never 'calm' (see cascadeRiskReason).", + "type": [ + "number", + "null" + ] + }, + "cascadeRiskReason": { + "description": "Why cascadeRisk is null (present only when it is).", + "type": "string" + }, + "claim": { + "description": "Fahali dictionary claim (shared/fahaliDictionary.ts). Read `kind` FIRST: 'abstention' means no assertion was made and `reason` says why — never read an abstention as a neutral or zero result. `basis` says what the claim rests on. Absent or null means this response path does not yet emit a claim; treat that as unknown, not as agreement.", + "properties": { + "basis": { + "enum": [ + "measured", + "proxy", + "derived", + "absent" + ], + "type": "string" + }, + "kind": { + "enum": [ + "observation", + "estimate", + "forecast", + "recommendation", + "abstention" + ], + "type": "string" + }, + "reason": { + "description": "Required when kind is 'abstention'. Written for a reader, not a log.", + "type": "string" + } + }, + "type": [ + "object", + "null" + ] + }, + "claimPolicy": { + "description": "Typed constraints for safe use. Metadata, not a prompt or instruction channel.", + "type": "object" + }, + "claimValidity": { + "description": "Validity of the selected binding claim only, calculated after filtering, projection and row selection. Sibling rows cannot determine it.", + "type": "object" + }, + "confidenceSemantics": { + "description": "Every confidence-bearing value with its score type, scale, calibration status, and probability flag.", + "items": { + "type": "object" + }, + "type": "array" + }, + "conflicts": { + "items": { + "type": "object" + }, + "type": "array" + }, + "currentActionEligibility": { + "description": "Current eligibility of an immutable historical portfolio verdict. It never mutates the stored judgment being replayed.", + "type": "object" + }, + "dataState": { + "enum": [ + "measured", + "partial", + "no_data", + "not_instrumented", + "stale", + "error" + ], + "type": "string" + }, + "decision": { + "type": [ + "object", + "null" + ] + }, + "decisionEligibility": { + "description": "Fail-closed binding-authority policy. WITHHELD means source evidence remains available for audit while normalized direction, actionability and execution fields are revoked.", + "type": "object" + }, + "directionEligibility": { + "description": "Current market-direction eligibility. Direction is authorized only by an exact, eligible producer stratum (canonical_verdict, canonical_symbol_verdict, committee_verdict) — read bindingAuthority to see which one bound. Widening WHO may bind did not weaken WHAT binding requires: the named producer must still hold a matching horizon/class/family record on a verified-only judged population, so an authority without a record still cannot bind.", + "type": "object" + }, + "evidenceQuality": { + "type": "object" + }, + "executionEligibility": { + "description": "Fail-closed execution boundary. Portfolio monitoring tools always return WITHHELD with MONITOR_ONLY_NO_EXECUTION_AUTHORITY while Fahali has no capital path.", + "type": "object" + }, + "instruments": { + "description": "Resolved or explicitly partial instrument identities. A missing venue carries an ambiguity warning.", + "items": { + "type": "object" + }, + "type": "array" + }, + "liquidityStress": { + "description": "0-1 from liquidity/funding signals. NULL when no liquidity signals exist in the window — null means 'not computed', never 'calm' (see liquidityStressReason).", + "type": [ + "number", + "null" + ] + }, + "liquidityStressReason": { + "description": "Why liquidityStress is null (present only when it is).", + "type": "string" + }, + "matchedTrackRecord": { + "description": "A judged record only when engine, horizon, regime/instrument class, and claim family match this response. `state` is one of: `measured` (a stratum cleared the publishability gate — `stratum` carries engine, horizon tier, bar regime, recall, precision, base rate, base-rate lift, median lead hours, effective sample, warned events and the measurement date); `withheld` (the gate ran and refused — `reason` says why, in words); `unavailable` (the record could not be read at all — an infrastructure failure that says nothing about the record). It is ONE stratum selected by recall, never a platform-wide accuracy. Null means no exact record match; read recordMatchReason.", + "properties": { + "dataAsOf": { + "description": "When the record was computed. A figure without this reads as current forever.", + "type": "string" + }, + "reason": { + "description": "Present on `withheld` and `unavailable`: why there is no figure.", + "type": "string" + }, + "state": { + "enum": [ + "measured", + "withheld", + "unavailable" + ], + "type": "string" + }, + "stratum": { + "description": "Present only on `measured`. Precision must never be quoted without recall.", + "properties": { + "barRegime": { + "type": "string" + }, + "baseRatePct": { + "type": "number" + }, + "claimFamily": { + "description": "What this precision is ABOUT: `directional` (price moved the way the stratum said) or `magnitude` (a move exceeded the judge bar, carrying no direction). Never infer a direction from a `magnitude` row.", + "type": "string" + }, + "claimMeans": { + "description": "The record endpoint's own sentence explaining the claim family. Quote it beside any precision figure.", + "type": "string" + }, + "effectiveSample": { + "type": "number" + }, + "engine": { + "type": "string" + }, + "horizonTier": { + "type": "string" + }, + "leadMedianHours": { + "type": "number" + }, + "measuredOn": { + "type": "string" + }, + "precisionPct": { + "description": "Share of its warnings that held. Never quotable alone.", + "type": "number" + }, + "recallPct": { + "description": "Share of qualifying events this stratum warned on — the half a buyer is exposed to.", + "type": "number" + }, + "warnedEvents": { + "type": "number" + } + }, + "type": "object" + } + }, + "required": [ + "state" + ], + "type": [ + "object", + "null" + ] + }, + "mcpStatus": { + "description": "Normalized MCP result status. The endpoint's original status vocabulary remains in `status` and `sourceStatus`.", + "enum": [ + "ok", + "error" + ], + "type": "string" + }, + "monitoringEligibility": { + "description": "Current portfolio-monitoring validity based on captured identity, freshness, integrity, and the caller-supplied monitoring policy. ELIGIBLE authorizes observation/delivery only, never financial action.", + "type": "object" + }, + "nextActions": { + "description": "Registry-validated follow-up calls. Missing tools, invalid arguments, unresolved placeholders, and disabled tools are omitted.", + "items": { + "properties": { + "args": { + "additionalProperties": { + "type": "string" + }, + "type": "object" + }, + "requiredTier": { + "type": "string" + }, + "tool": { + "type": "string" + }, + "why": { + "type": "string" + } + }, + "required": [ + "tool", + "why" + ], + "type": "object" + }, + "type": "array" + }, + "recordMatchReason": { + "description": "Why matchedTrackRecord is present or null. A null record is never evidence of safety or engine failure.", + "type": "string" + }, + "requestId": { + "type": "string" + }, + "responseControl": { + "type": "object" + }, + "responseState": { + "enum": [ + "OK_WITH_FINDINGS", + "OK_NO_FINDINGS", + "PARTIAL", + "WITHHELD", + "NO_COVERAGE", + "ERROR" + ], + "type": "string" + }, + "schemaVersion": { + "enum": [ + "2.0" + ], + "type": "string" + }, + "scope": { + "type": "object" + }, + "sentimentMomentum": { + "description": "-1..1 net signal direction. NULL when no sentiment-tagged signals exist in the window — a null here is 'no view measured', never a claimed balance (see sentimentMomentumReason).", + "type": [ + "number", + "null" + ] + }, + "sentimentMomentumReason": { + "description": "Why sentimentMomentum is null (present only when it is).", + "type": "string" + }, + "signalCount": { + "description": "Number of alert/institutional-signal rows the metrics were computed over. 0 means the feed was empty and every metric is null.", + "type": "integer" + }, + "signalStressLevel": { + "description": "0-1 from leverage/derivative signal confidences. NULL when no leverage/derivative signals exist in the window — null means 'not computed', never 'calm' (see signalStressLevelReason).", + "type": [ + "number", + "null" + ] + }, + "signalStressLevelReason": { + "description": "Why signalStressLevel is null (present only when it is).", + "type": "string" + }, + "sourceConfidenceSemantics": { + "type": [ + "array", + "object", + "null" + ] + }, + "sourceDataState": { + "description": "The upstream endpoint's exact data-state value before endpoint-aware classification.", + "type": [ + "string", + "null" + ] + }, + "sourceDecision": { + "type": [ + "object", + "null" + ] + }, + "sourceError": { + "description": "The upstream endpoint's exact error text/code before normalization, when one was present.", + "type": [ + "string", + "null" + ] + }, + "sourceEvidenceQuality": { + "type": [ + "object", + "null" + ] + }, + "sourceScope": { + "type": [ + "object", + "null" + ] + }, + "sourceStatus": { + "description": "The upstream endpoint's exact status before the MCP envelope normalizes transport success/error.", + "type": [ + "string", + "null" + ] + }, + "status": { + "description": "The endpoint's original status vocabulary (for example ok, partial, degraded, withheld, or no_alerts). Use mcpStatus for normalized transport success/error.", + "type": "string" + }, + "symbolCoverage": { + "description": "Conservation ledger satisfying requested = returned + withheld + notReturned for requested-symbol calls.", + "type": "object" + }, + "timestamp": { + "type": [ + "string", + "integer", + "number" + ] + } + }, + "type": "object" +}
- Changed
fahali_get_portfolio_risk6 fields changed- added
Input schema / properties / detailAdded value: +{ + "default": "audit", + "description": "Response depth. audit is the full-fidelity default; brief and standard are explicit compact projections.", + "enum": [ + "brief", + "standard", + "audit" + ], + "type": "string" +} - added
Input schema / properties / include_withheldAdded value: +{ + "default": true, + "description": "Include full withheld-row detail. Defaults true with audit; explicitly set false only for a compact projection.", + "type": "boolean" +} - added
Input schema / properties / limitAdded value: +{ + "description": "Optional maximum rows per projectable collection. Audit has no MCP projection cap; brief defaults to 3 and standard to 12.", + "maximum": 100, + "minimum": 1, + "type": "integer" +} - added
Input schema / properties / sinceAdded value: +{ + "description": "Optional lower timestamp bound for returned row collections.", + "format": "date-time", + "type": "string" +} - added
Input schema / properties / symbolsAdded value: +{ + "description": "Optional symbol projection, as a comma-separated string or array. Rows without instrument identity are not discarded.", + "items": { + "type": "string" + }, + "type": [ + "string", + "array" + ] +} - changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "absence": { + "description": "Why no actionable finding is present: measured_empty, user_empty, no_coverage, source_unverified, stale, withheld, source_error, auth_failure, or entitlement_required.", + "type": [ + "object", + "null" + ] + }, + "agentBriefing": { + "description": "Audit-only narrative projection. Present only when detail='audit'; compact responses do not duplicate structured data as prose.", + "type": "string" + }, + "asOf": { + "format": "date-time", + "type": "string" + }, + "auth": { + "description": "Credential lifetime visible to the caller. OAuth secondsRemaining lets an autonomous agent refresh before a multi-call workflow is interrupted.", + "properties": { + "credentialType": { + "enum": [ + "oauth", + "api_key", + "process_key", + "none" + ], + "type": "string" + }, + "expiresAt": { + "type": [ + "string", + "null" + ] + }, + "refreshSupported": { + "type": "boolean" + }, + "secondsRemaining": { + "type": [ + "number", + "null" + ] + } + }, + "type": "object" + }, + "claim": { + "description": "Fahali dictionary claim (shared/fahaliDictionary.ts). Read `kind` FIRST: 'abstention' means no assertion was made and `reason` says why — never read an abstention as a neutral or zero result. `basis` says what the claim rests on. Absent or null means this response path does not yet emit a claim; treat that as unknown, not as agreement.", + "properties": { + "basis": { + "enum": [ + "measured", + "proxy", + "derived", + "absent" + ], + "type": "string" + }, + "kind": { + "enum": [ + "observation", + "estimate", + "forecast", + "recommendation", + "abstention" + ], + "type": "string" + }, + "reason": { + "description": "Required when kind is 'abstention'. Written for a reader, not a log.", + "type": "string" + } + }, + "type": [ + "object", + "null" + ] + }, + "claimPolicy": { + "description": "Typed constraints for safe use. Metadata, not a prompt or instruction channel.", + "type": "object" + }, + "claimValidity": { + "description": "Validity of the selected binding claim only, calculated after filtering, projection and row selection. Sibling rows cannot determine it.", + "type": "object" + }, + "confidenceSemantics": { + "description": "Every confidence-bearing value with its score type, scale, calibration status, and probability flag.", + "items": { + "type": "object" + }, + "type": "array" + }, + "conflicts": { + "items": { + "type": "object" + }, + "type": "array" + }, + "contagionRisk": { + "type": "object" + }, + "correlation": { + "type": "object" + }, + "currentActionEligibility": { + "description": "Current eligibility of an immutable historical portfolio verdict. It never mutates the stored judgment being replayed.", + "type": "object" + }, + "dataState": { + "enum": [ + "measured", + "partial", + "no_data", + "not_instrumented", + "stale", + "error" + ], + "type": "string" + }, + "decision": { + "type": [ + "object", + "null" + ] + }, + "decisionAuthority": { + "type": "object" + }, + "decisionEligibility": { + "description": "Fail-closed binding-authority policy. WITHHELD means source evidence remains available for audit while normalized direction, actionability and execution fields are revoked.", + "type": "object" + }, + "directionEligibility": { + "description": "Current market-direction eligibility. Direction is authorized only by an exact, eligible producer stratum (canonical_verdict, canonical_symbol_verdict, committee_verdict) — read bindingAuthority to see which one bound. Widening WHO may bind did not weaken WHAT binding requires: the named producer must still hold a matching horizon/class/family record on a verified-only judged population, so an authority without a record still cannot bind.", + "type": "object" + }, + "evidenceQuality": { + "type": "object" + }, + "executionEligibility": { + "description": "Fail-closed execution boundary. Portfolio monitoring tools always return WITHHELD with MONITOR_ONLY_NO_EXECUTION_AUTHORITY while Fahali has no capital path.", + "type": "object" + }, + "instruments": { + "description": "Resolved or explicitly partial instrument identities. A missing venue carries an ambiguity warning.", + "items": { + "type": "object" + }, + "type": "array" + }, + "matchedTrackRecord": { + "description": "A judged record only when engine, horizon, regime/instrument class, and claim family match this response. `state` is one of: `measured` (a stratum cleared the publishability gate — `stratum` carries engine, horizon tier, bar regime, recall, precision, base rate, base-rate lift, median lead hours, effective sample, warned events and the measurement date); `withheld` (the gate ran and refused — `reason` says why, in words); `unavailable` (the record could not be read at all — an infrastructure failure that says nothing about the record). It is ONE stratum selected by recall, never a platform-wide accuracy. Null means no exact record match; read recordMatchReason.", + "properties": { + "dataAsOf": { + "description": "When the record was computed. A figure without this reads as current forever.", + "type": "string" + }, + "reason": { + "description": "Present on `withheld` and `unavailable`: why there is no figure.", + "type": "string" + }, + "state": { + "enum": [ + "measured", + "withheld", + "unavailable" + ], + "type": "string" + }, + "stratum": { + "description": "Present only on `measured`. Precision must never be quoted without recall.", + "properties": { + "barRegime": { + "type": "string" + }, + "baseRatePct": { + "type": "number" + }, + "claimFamily": { + "description": "What this precision is ABOUT: `directional` (price moved the way the stratum said) or `magnitude` (a move exceeded the judge bar, carrying no direction). Never infer a direction from a `magnitude` row.", + "type": "string" + }, + "claimMeans": { + "description": "The record endpoint's own sentence explaining the claim family. Quote it beside any precision figure.", + "type": "string" + }, + "effectiveSample": { + "type": "number" + }, + "engine": { + "type": "string" + }, + "horizonTier": { + "type": "string" + }, + "leadMedianHours": { + "type": "number" + }, + "measuredOn": { + "type": "string" + }, + "precisionPct": { + "description": "Share of its warnings that held. Never quotable alone.", + "type": "number" + }, + "recallPct": { + "description": "Share of qualifying events this stratum warned on — the half a buyer is exposed to.", + "type": "number" + }, + "warnedEvents": { + "type": "number" + } + }, + "type": "object" + } + }, + "required": [ + "state" + ], + "type": [ + "object", + "null" + ] + }, + "mcpStatus": { + "description": "Normalized MCP result status. The endpoint's original status vocabulary remains in `status` and `sourceStatus`.", + "enum": [ + "ok", + "error" + ], + "type": "string" + }, + "monitoringEligibility": { + "description": "Current portfolio-monitoring validity based on captured identity, freshness, integrity, and the caller-supplied monitoring policy. ELIGIBLE authorizes observation/delivery only, never financial action.", + "type": "object" + }, + "nextActions": { + "description": "Registry-validated follow-up calls. Missing tools, invalid arguments, unresolved placeholders, and disabled tools are omitted.", + "items": { + "properties": { + "args": { + "additionalProperties": { + "type": "string" + }, + "type": "object" + }, + "requiredTier": { + "type": "string" + }, + "tool": { + "type": "string" + }, + "why": { + "type": "string" + } + }, + "required": [ + "tool", + "why" + ], + "type": "object" + }, + "type": "array" + }, + "portfolio": { + "properties": { + "cashBalance": { + "type": "number" + }, + "expectedDrawdownPct": { + "type": [ + "number", + "null" + ] + }, + "expectedShortfall95": { + "description": "Expected shortfall at 95% in currency, positive for a loss. Reported in dollars as well as percent because the percent field is rounded at 0.01pp.", + "type": [ + "number", + "null" + ] + }, + "expectedShortfallAttribution": { + "description": "Which holdings the expected shortfall is attributable to. Contributions are SIGNED, so a hedge that pays in the tail reports a negative number; componentSumDollars equals the reported expected shortfall exactly. Null when the figures are null.", + "type": [ + "object", + "null" + ] + }, + "grossExposure": { + "type": "number" + }, + "grossExposureMetric": { + "type": "object" + }, + "leverage": { + "type": [ + "number", + "null" + ] + }, + "overallRiskLevel": { + "type": [ + "string", + "null" + ] + }, + "overallRiskScore": { + "description": "0-1 scale; null when detection evidence does not cover the book.", + "type": [ + "number", + "null" + ] + }, + "riskMetricsBasis": { + "type": "object" + }, + "totalValue": { + "type": "number" + }, + "totalValueMetric": { + "type": "object" + }, + "valueAtRisk95": { + "type": [ + "number", + "null" + ] + }, + "varBacktest": { + "description": "Out-of-sample coverage test of the VaR quantile (Kupiec + Christoffersen), with the sample size stated. 'not_rejected' means the sample did not contradict the model, never that it is correct. Tests the quantile only, not expected shortfall.", + "type": [ + "object", + "null" + ] + } + }, + "type": "object" + }, + "positions": { + "items": { + "properties": { + "authorityReconciliation": { + "description": "Canonical-symbol direction plus explicitly withheld stateless portfolio actionability and non-binding compatibility monitoring.", + "type": "object" + }, + "correlationBasis": { + "type": "object" + }, + "correlationToPortfolio": { + "description": "Always null: the artifact has pair correlations but not the variances/covariances required for corr(asset, portfolio return).", + "type": "null" + }, + "correlationToPortfolioUnavailableReason": { + "type": "string" + }, + "recommendation": { + "description": "Deprecated compatibility monitoring label; never a direction or authorized action.", + "properties": { + "action": { + "enum": [ + "hold", + "watch", + "reduce" + ], + "type": "string" + }, + "binding": { + "enum": [ + false + ], + "type": "boolean" + }, + "deprecatedSemantics": { + "enum": [ + "monitoring_priority_only" + ], + "type": "string" + }, + "directional": { + "enum": [ + false + ], + "type": "boolean" + }, + "rationale": { + "type": "string" + } + }, + "type": [ + "object", + "null" + ] + }, + "riskObservation": { + "type": "object" + }, + "riskScore": { + "type": [ + "number", + "null" + ] + }, + "symbol": { + "type": "string" + }, + "weightedMeanPeerCorrelation": { + "description": "Gross-weighted mean of measured pairwise Pearson correlations to peer holdings; not corr(asset, portfolio return).", + "type": [ + "number", + "null" + ] + } + }, + "type": "object" + }, + "type": "array" + }, + "recordMatchReason": { + "description": "Why matchedTrackRecord is present or null. A null record is never evidence of safety or engine failure.", + "type": "string" + }, + "requestId": { + "type": "string" + }, + "responseControl": { + "type": "object" + }, + "responseState": { + "enum": [ + "OK_WITH_FINDINGS", + "OK_NO_FINDINGS", + "PARTIAL", + "WITHHELD", + "NO_COVERAGE", + "ERROR" + ], + "type": "string" + }, + "schemaVersion": { + "enum": [ + "2.0" + ], + "type": "string" + }, + "scope": { + "type": "object" + }, + "sourceConfidenceSemantics": { + "type": [ + "array", + "object", + "null" + ] + }, + "sourceDataState": { + "description": "The upstream endpoint's exact data-state value before endpoint-aware classification.", + "type": [ + "string", + "null" + ] + }, + "sourceDecision": { + "type": [ + "object", + "null" + ] + }, + "sourceError": { + "description": "The upstream endpoint's exact error text/code before normalization, when one was present.", + "type": [ + "string", + "null" + ] + }, + "sourceEvidenceQuality": { + "type": [ + "object", + "null" + ] + }, + "sourceScope": { + "type": [ + "object", + "null" + ] + }, + "sourceStatus": { + "description": "The upstream endpoint's exact status before the MCP envelope normalizes transport success/error.", + "type": [ + "string", + "null" + ] + }, + "status": { + "description": "The endpoint's original status vocabulary (for example ok, partial, degraded, withheld, or no_alerts). Use mcpStatus for normalized transport success/error.", + "type": "string" + }, + "symbolCoverage": { + "description": "Conservation ledger satisfying requested = returned + withheld + notReturned for requested-symbol calls.", + "type": "object" + }, + "timestamp": { + "type": [ + "string", + "integer", + "number" + ] + } + }, + "type": "object" +}
- Changed
fahali_get_realtime_alerts8 fields changed- added
Input schema / properties / alert_typesAdded value: +{ + "description": "Filter to these alert types, comma-separated string or array (max 20). Case-insensitive, e.g. regime_state, momentum_shift, crash_precursor.", + "items": { + "type": "string" + }, + "type": [ + "string", + "array" + ] +} - added
Input schema / properties / detailAdded value: +{ + "default": "audit", + "description": "Response depth. audit is the full-fidelity default; brief and standard are explicit compact projections.", + "enum": [ + "brief", + "standard", + "audit" + ], + "type": "string" +} - added
Input schema / properties / include_withheldAdded value: +{ + "default": true, + "description": "Include full withheld-row detail. Defaults true with audit; explicitly set false only for a compact projection.", + "type": "boolean" +} - added
Input schema / properties / limitAdded value: +{ + "description": "Optional maximum rows per projectable collection. Audit has no MCP projection cap; brief defaults to 3 and standard to 12.", + "maximum": 100, + "minimum": 1, + "type": "integer" +} - added
Input schema / properties / max_rowsAdded value: +{ + "description": "Source-side fetch depth (default 200, ceiling 1000). DISTINCT from the envelope's `limit`, which only projects the rows already returned — raising `limit` cannot reach evidence `max_rows` did not fetch.", + "maximum": 1000, + "minimum": 1, + "type": "integer" +} - added
Input schema / properties / sinceAdded value: +{ + "description": "ISO-8601 lower bound. Defaults to 24h ago; clamped to the 24h window this endpoint serves, and the clamp is reported in coverage.clamps. An unparseable value is REJECTED, never silently defaulted.", + "format": "date-time", + "type": "string" +} - added
Input schema / properties / symbolsAdded value: +{ + "description": "Filter to these instruments, comma-separated string or array (max 50). Applied in SQL at the source, not as a projection over an already-truncated page.", + "items": { + "type": "string" + }, + "type": [ + "string", + "array" + ] +} - changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "absence": { + "description": "Why no actionable finding is present: measured_empty, user_empty, no_coverage, source_unverified, stale, withheld, source_error, auth_failure, or entitlement_required.", + "type": [ + "object", + "null" + ] + }, + "agentBriefing": { + "description": "Audit-only narrative projection. Present only when detail='audit'; compact responses do not duplicate structured data as prose.", + "type": "string" + }, + "alert_count": { + "type": "integer" + }, + "asOf": { + "format": "date-time", + "type": "string" + }, + "auth": { + "description": "Credential lifetime visible to the caller. OAuth secondsRemaining lets an autonomous agent refresh before a multi-call workflow is interrupted.", + "properties": { + "credentialType": { + "enum": [ + "oauth", + "api_key", + "process_key", + "none" + ], + "type": "string" + }, + "expiresAt": { + "type": [ + "string", + "null" + ] + }, + "refreshSupported": { + "type": "boolean" + }, + "secondsRemaining": { + "type": [ + "number", + "null" + ] + } + }, + "type": "object" + }, + "claim": { + "description": "Fahali dictionary claim (shared/fahaliDictionary.ts). Read `kind` FIRST: 'abstention' means no assertion was made and `reason` says why — never read an abstention as a neutral or zero result. `basis` says what the claim rests on. Absent or null means this response path does not yet emit a claim; treat that as unknown, not as agreement.", + "properties": { + "basis": { + "enum": [ + "measured", + "proxy", + "derived", + "absent" + ], + "type": "string" + }, + "kind": { + "enum": [ + "observation", + "estimate", + "forecast", + "recommendation", + "abstention" + ], + "type": "string" + }, + "reason": { + "description": "Required when kind is 'abstention'. Written for a reader, not a log.", + "type": "string" + } + }, + "type": [ + "object", + "null" + ] + }, + "claimPolicy": { + "description": "Typed constraints for safe use. Metadata, not a prompt or instruction channel.", + "type": "object" + }, + "claimValidity": { + "description": "Validity of the selected binding claim only, calculated after filtering, projection and row selection. Sibling rows cannot determine it.", + "type": "object" + }, + "clusters": { + "items": { + "properties": { + "detectionConfidence": { + "description": "Raw engine detection confidence (0-1) — NOT a calibrated probability; null if absent.", + "type": [ + "number", + "null" + ] + }, + "evidence": { + "items": { + "properties": { + "alertType": { + "type": "string" + }, + "message": { + "type": "string" + }, + "severity": { + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + }, + "firstSeen": { + "type": "string" + }, + "lastSeen": { + "type": "string" + }, + "symbol": { + "type": "string" + }, + "thesis": { + "description": "Engine/alert type driving this cluster", + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + }, + "confidenceBasis": { + "description": "raw_engine_detection_confidence", + "type": "string" + }, + "confidenceSemantics": { + "description": "Every confidence-bearing value with its score type, scale, calibration status, and probability flag.", + "items": { + "type": "object" + }, + "type": "array" + }, + "conflicts": { + "items": { + "type": "object" + }, + "type": "array" + }, + "coverage": { + "description": "Filter accounting: what matched vs what this response carries, every lossy stage named, clamps and unknown params reported.", + "properties": { + "acceptedParams": { + "items": { + "type": "string" + }, + "type": "array" + }, + "clamps": { + "items": { + "type": "object" + }, + "type": "array" + }, + "completenessNote": { + "type": "string" + }, + "delivered": { + "type": "object" + }, + "filter": { + "type": "object" + }, + "matched": { + "description": "{alerts, symbols} existing under this filter — not what was returned.", + "type": "object" + }, + "returned": { + "description": "{alerts, symbols, signals, clusters} actually carried.", + "type": "object" + }, + "sourceTruncated": { + "type": "boolean" + }, + "truncations": { + "items": { + "type": "object" + }, + "type": "array" + }, + "unknownParams": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "type": [ + "object", + "null" + ] + }, + "currentActionEligibility": { + "description": "Current eligibility of an immutable historical portfolio verdict. It never mutates the stored judgment being replayed.", + "type": "object" + }, + "dataState": { + "enum": [ + "measured", + "partial", + "no_data", + "not_instrumented", + "stale", + "error" + ], + "type": "string" + }, + "decision": { + "type": [ + "object", + "null" + ] + }, + "decisionEligibility": { + "description": "Fail-closed binding-authority policy. WITHHELD means source evidence remains available for audit while normalized direction, actionability and execution fields are revoked.", + "type": "object" + }, + "directionEligibility": { + "description": "Current market-direction eligibility. Direction is authorized only by an exact, eligible producer stratum (canonical_verdict, canonical_symbol_verdict, committee_verdict) — read bindingAuthority to see which one bound. Widening WHO may bind did not weaken WHAT binding requires: the named producer must still hold a matching horizon/class/family record on a verified-only judged population, so an authority without a record still cannot bind.", + "type": "object" + }, + "evidenceQuality": { + "type": "object" + }, + "executionEligibility": { + "description": "Fail-closed execution boundary. Portfolio monitoring tools always return WITHHELD with MONITOR_ONLY_NO_EXECUTION_AUTHORITY while Fahali has no capital path.", + "type": "object" + }, + "instruments": { + "description": "Resolved or explicitly partial instrument identities. A missing venue carries an ambiguity warning.", + "items": { + "type": "object" + }, + "type": "array" + }, + "matchedTrackRecord": { + "description": "A judged record only when engine, horizon, regime/instrument class, and claim family match this response. `state` is one of: `measured` (a stratum cleared the publishability gate — `stratum` carries engine, horizon tier, bar regime, recall, precision, base rate, base-rate lift, median lead hours, effective sample, warned events and the measurement date); `withheld` (the gate ran and refused — `reason` says why, in words); `unavailable` (the record could not be read at all — an infrastructure failure that says nothing about the record). It is ONE stratum selected by recall, never a platform-wide accuracy. Null means no exact record match; read recordMatchReason.", + "properties": { + "dataAsOf": { + "description": "When the record was computed. A figure without this reads as current forever.", + "type": "string" + }, + "reason": { + "description": "Present on `withheld` and `unavailable`: why there is no figure.", + "type": "string" + }, + "state": { + "enum": [ + "measured", + "withheld", + "unavailable" + ], + "type": "string" + }, + "stratum": { + "description": "Present only on `measured`. Precision must never be quoted without recall.", + "properties": { + "barRegime": { + "type": "string" + }, + "baseRatePct": { + "type": "number" + }, + "claimFamily": { + "description": "What this precision is ABOUT: `directional` (price moved the way the stratum said) or `magnitude` (a move exceeded the judge bar, carrying no direction). Never infer a direction from a `magnitude` row.", + "type": "string" + }, + "claimMeans": { + "description": "The record endpoint's own sentence explaining the claim family. Quote it beside any precision figure.", + "type": "string" + }, + "effectiveSample": { + "type": "number" + }, + "engine": { + "type": "string" + }, + "horizonTier": { + "type": "string" + }, + "leadMedianHours": { + "type": "number" + }, + "measuredOn": { + "type": "string" + }, + "precisionPct": { + "description": "Share of its warnings that held. Never quotable alone.", + "type": "number" + }, + "recallPct": { + "description": "Share of qualifying events this stratum warned on — the half a buyer is exposed to.", + "type": "number" + }, + "warnedEvents": { + "type": "number" + } + }, + "type": "object" + } + }, + "required": [ + "state" + ], + "type": [ + "object", + "null" + ] + }, + "mcpStatus": { + "description": "Normalized MCP result status. The endpoint's original status vocabulary remains in `status` and `sourceStatus`.", + "enum": [ + "ok", + "error" + ], + "type": "string" + }, + "monitoringEligibility": { + "description": "Current portfolio-monitoring validity based on captured identity, freshness, integrity, and the caller-supplied monitoring policy. ELIGIBLE authorizes observation/delivery only, never financial action.", + "type": "object" + }, + "nextActions": { + "description": "Registry-validated follow-up calls. Missing tools, invalid arguments, unresolved placeholders, and disabled tools are omitted.", + "items": { + "properties": { + "args": { + "additionalProperties": { + "type": "string" + }, + "type": "object" + }, + "requiredTier": { + "type": "string" + }, + "tool": { + "type": "string" + }, + "why": { + "type": "string" + } + }, + "required": [ + "tool", + "why" + ], + "type": "object" + }, + "type": "array" + }, + "recordMatchReason": { + "description": "Why matchedTrackRecord is present or null. A null record is never evidence of safety or engine failure.", + "type": "string" + }, + "requestId": { + "type": "string" + }, + "responseControl": { + "type": "object" + }, + "responseState": { + "enum": [ + "OK_WITH_FINDINGS", + "OK_NO_FINDINGS", + "PARTIAL", + "WITHHELD", + "NO_COVERAGE", + "ERROR" + ], + "type": "string" + }, + "schemaVersion": { + "enum": [ + "2.0" + ], + "type": "string" + }, + "scope": { + "type": "object" + }, + "signal_count": { + "type": "integer" + }, + "signals": { + "items": { + "type": "object" + }, + "type": "array" + }, + "sourceConfidenceSemantics": { + "type": [ + "array", + "object", + "null" + ] + }, + "sourceDataState": { + "description": "The upstream endpoint's exact data-state value before endpoint-aware classification.", + "type": [ + "string", + "null" + ] + }, + "sourceDecision": { + "type": [ + "object", + "null" + ] + }, + "sourceError": { + "description": "The upstream endpoint's exact error text/code before normalization, when one was present.", + "type": [ + "string", + "null" + ] + }, + "sourceEvidenceQuality": { + "type": [ + "object", + "null" + ] + }, + "sourceScope": { + "type": [ + "object", + "null" + ] + }, + "sourceStatus": { + "description": "The upstream endpoint's exact status before the MCP envelope normalizes transport success/error.", + "type": [ + "string", + "null" + ] + }, + "status": { + "enum": [ + "ACTIVE", + "MONITORING", + "ERROR" + ], + "type": "string" + }, + "symbolCoverage": { + "description": "Conservation ledger satisfying requested = returned + withheld + notReturned for requested-symbol calls.", + "type": "object" + }, + "timestamp": { + "type": [ + "string", + "integer", + "number" + ] + } + }, + "type": "object" +}
- Added
fahali_get_sector_rotation - Removed
fahali_get_smart_money_dashboard - Added
fahali_get_symbol_decision - Changed
fahali_get_track_record_scorecard6 fields changed- added
Input schema / properties / detailAdded value: +{ + "default": "audit", + "description": "Response depth. audit is the full-fidelity default; brief and standard are explicit compact projections.", + "enum": [ + "brief", + "standard", + "audit" + ], + "type": "string" +} - added
Input schema / properties / include_withheldAdded value: +{ + "default": true, + "description": "Include full withheld-row detail. Defaults true with audit; explicitly set false only for a compact projection.", + "type": "boolean" +} - added
Input schema / properties / limitAdded value: +{ + "description": "Optional maximum rows per projectable collection. Audit has no MCP projection cap; brief defaults to 3 and standard to 12.", + "maximum": 100, + "minimum": 1, + "type": "integer" +} - added
Input schema / properties / sinceAdded value: +{ + "description": "Optional lower timestamp bound for returned row collections.", + "format": "date-time", + "type": "string" +} - added
Input schema / properties / symbolsAdded value: +{ + "description": "Optional symbol projection, as a comma-separated string or array. Rows without instrument identity are not discarded.", + "items": { + "type": "string" + }, + "type": [ + "string", + "array" + ] +} - changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "absence": { + "description": "Why no actionable finding is present: measured_empty, user_empty, no_coverage, source_unverified, stale, withheld, source_error, auth_failure, or entitlement_required.", + "type": [ + "object", + "null" + ] + }, + "agentBriefing": { + "description": "Audit-only narrative projection. Present only when detail='audit'; compact responses do not duplicate structured data as prose.", + "type": "string" + }, + "asOf": { + "format": "date-time", + "type": "string" + }, + "auth": { + "description": "Credential lifetime visible to the caller. OAuth secondsRemaining lets an autonomous agent refresh before a multi-call workflow is interrupted.", + "properties": { + "credentialType": { + "enum": [ + "oauth", + "api_key", + "process_key", + "none" + ], + "type": "string" + }, + "expiresAt": { + "type": [ + "string", + "null" + ] + }, + "refreshSupported": { + "type": "boolean" + }, + "secondsRemaining": { + "type": [ + "number", + "null" + ] + } + }, + "type": "object" + }, + "base_rates": { + "type": "object" + }, + "base_rates_by_horizon": { + "type": "object" + }, + "blended": { + "description": "Components only. `blended_score` is ALWAYS null — a single composite accuracy figure is not a supported claim.", + "properties": { + "blended_score": { + "type": "null" + }, + "directional_accuracy": { + "description": "Verified-only directional component. Null when no identity-valid, final judged rows exist; never coerced to zero.", + "type": [ + "number", + "null" + ] + }, + "magnitude_precision": { + "description": "Verified-only magnitude component. Null when no identity-valid, final judged rows exist; never coerced to zero.", + "type": [ + "number", + "null" + ] + }, + "withheld": { + "type": "object" + } + }, + "type": "object" + }, + "claim": { + "description": "Fahali dictionary claim (shared/fahaliDictionary.ts). Read `kind` FIRST: 'abstention' means no assertion was made and `reason` says why — never read an abstention as a neutral or zero result. `basis` says what the claim rests on. Absent or null means this response path does not yet emit a claim; treat that as unknown, not as agreement.", + "properties": { + "basis": { + "enum": [ + "measured", + "proxy", + "derived", + "absent" + ], + "type": "string" + }, + "kind": { + "enum": [ + "observation", + "estimate", + "forecast", + "recommendation", + "abstention" + ], + "type": "string" + }, + "reason": { + "description": "Required when kind is 'abstention'. Written for a reader, not a log.", + "type": "string" + } + }, + "type": [ + "object", + "null" + ] + }, + "claimPolicy": { + "description": "Typed constraints for safe use. Metadata, not a prompt or instruction channel.", + "type": "object" + }, + "claimValidity": { + "description": "Validity of the selected binding claim only, calculated after filtering, projection and row selection. Sibling rows cannot determine it.", + "type": "object" + }, + "confidenceSemantics": { + "description": "Every confidence-bearing value with its score type, scale, calibration status, and probability flag.", + "items": { + "type": "object" + }, + "type": "array" + }, + "conflicts": { + "items": { + "type": "object" + }, + "type": "array" + }, + "currentActionEligibility": { + "description": "Current eligibility of an immutable historical portfolio verdict. It never mutates the stored judgment being replayed.", + "type": "object" + }, + "dataState": { + "enum": [ + "measured", + "partial", + "no_data", + "not_instrumented", + "stale", + "error" + ], + "type": "string" + }, + "data_window": { + "type": "object" + }, + "decision": { + "type": [ + "object", + "null" + ] + }, + "decisionEligibility": { + "description": "Fail-closed binding-authority policy. WITHHELD means source evidence remains available for audit while normalized direction, actionability and execution fields are revoked.", + "type": "object" + }, + "direction": { + "additionalProperties": { + "properties": { + "accuracy": { + "type": "number" + }, + "baseRate": { + "type": [ + "number", + "null" + ] + }, + "ci95": { + "type": "object" + }, + "effectiveSample": { + "type": [ + "integer", + "null" + ] + }, + "lift": { + "type": [ + "number", + "null" + ] + }, + "publishable": { + "type": "boolean" + }, + "total": { + "type": "integer" + }, + "withheld": { + "type": [ + "object", + "null" + ] + } + }, + "type": "object" + }, + "description": "Map of engine key -> row. Accuracy WITH lift; read `publishable`.", + "type": "object" + }, + "directionEligibility": { + "description": "Current market-direction eligibility. Direction is authorized only by an exact, eligible producer stratum (canonical_verdict, canonical_symbol_verdict, committee_verdict) — read bindingAuthority to see which one bound. Widening WHO may bind did not weaken WHAT binding requires: the named producer must still hold a matching horizon/class/family record on a verified-only judged population, so an authority without a record still cannot bind.", + "type": "object" + }, + "evidenceQuality": { + "type": "object" + }, + "executionEligibility": { + "description": "Fail-closed execution boundary. Portfolio monitoring tools always return WITHHELD with MONITOR_ONLY_NO_EXECUTION_AUTHORITY while Fahali has no capital path.", + "type": "object" + }, + "extreme_events": { + "description": "Same contract as magnitude.", + "type": "object" + }, + "instruments": { + "description": "Resolved or explicitly partial instrument identities. A missing venue carries an ambiguity warning.", + "items": { + "type": "object" + }, + "type": "array" + }, + "magnitude": { + "additionalProperties": { + "properties": { + "baseRate": { + "type": "null" + }, + "ci95": { + "type": "object" + }, + "effectiveSample": { + "type": [ + "integer", + "null" + ] + }, + "lift": { + "type": "null" + }, + "precision": { + "type": "number" + }, + "publishable": { + "type": "boolean" + }, + "total": { + "type": "integer" + }, + "withheld": { + "properties": { + "reason": { + "type": "string" + }, + "requiredMeasurement": { + "type": "string" + } + }, + "type": "object" + } + }, + "type": "object" + }, + "description": "Map of engine key -> row. Precision only; lift and baseRate are ALWAYS null and publishable is ALWAYS false.", + "type": "object" + }, + "matchedTrackRecord": { + "description": "A judged record only when engine, horizon, regime/instrument class, and claim family match this response. `state` is one of: `measured` (a stratum cleared the publishability gate — `stratum` carries engine, horizon tier, bar regime, recall, precision, base rate, base-rate lift, median lead hours, effective sample, warned events and the measurement date); `withheld` (the gate ran and refused — `reason` says why, in words); `unavailable` (the record could not be read at all — an infrastructure failure that says nothing about the record). It is ONE stratum selected by recall, never a platform-wide accuracy. Null means no exact record match; read recordMatchReason.", + "properties": { + "dataAsOf": { + "description": "When the record was computed. A figure without this reads as current forever.", + "type": "string" + }, + "reason": { + "description": "Present on `withheld` and `unavailable`: why there is no figure.", + "type": "string" + }, + "state": { + "enum": [ + "measured", + "withheld", + "unavailable" + ], + "type": "string" + }, + "stratum": { + "description": "Present only on `measured`. Precision must never be quoted without recall.", + "properties": { + "barRegime": { + "type": "string" + }, + "baseRatePct": { + "type": "number" + }, + "claimFamily": { + "description": "What this precision is ABOUT: `directional` (price moved the way the stratum said) or `magnitude` (a move exceeded the judge bar, carrying no direction). Never infer a direction from a `magnitude` row.", + "type": "string" + }, + "claimMeans": { + "description": "The record endpoint's own sentence explaining the claim family. Quote it beside any precision figure.", + "type": "string" + }, + "effectiveSample": { + "type": "number" + }, + "engine": { + "type": "string" + }, + "horizonTier": { + "type": "string" + }, + "leadMedianHours": { + "type": "number" + }, + "measuredOn": { + "type": "string" + }, + "precisionPct": { + "description": "Share of its warnings that held. Never quotable alone.", + "type": "number" + }, + "recallPct": { + "description": "Share of qualifying events this stratum warned on — the half a buyer is exposed to.", + "type": "number" + }, + "warnedEvents": { + "type": "number" + } + }, + "type": "object" + } + }, + "required": [ + "state" + ], + "type": [ + "object", + "null" + ] + }, + "mcpStatus": { + "description": "Normalized MCP result status. The endpoint's original status vocabulary remains in `status` and `sourceStatus`.", + "enum": [ + "ok", + "error" + ], + "type": "string" + }, + "methodology": { + "type": "object" + }, + "monitoringEligibility": { + "description": "Current portfolio-monitoring validity based on captured identity, freshness, integrity, and the caller-supplied monitoring policy. ELIGIBLE authorizes observation/delivery only, never financial action.", + "type": "object" + }, + "nextActions": { + "description": "Registry-validated follow-up calls. Missing tools, invalid arguments, unresolved placeholders, and disabled tools are omitted.", + "items": { + "properties": { + "args": { + "additionalProperties": { + "type": "string" + }, + "type": "object" + }, + "requiredTier": { + "type": "string" + }, + "tool": { + "type": "string" + }, + "why": { + "type": "string" + } + }, + "required": [ + "tool", + "why" + ], + "type": "object" + }, + "type": "array" + }, + "recordMatchReason": { + "description": "Why matchedTrackRecord is present or null. A null record is never evidence of safety or engine failure.", + "type": "string" + }, + "requestId": { + "type": "string" + }, + "responseControl": { + "type": "object" + }, + "responseState": { + "enum": [ + "OK_WITH_FINDINGS", + "OK_NO_FINDINGS", + "PARTIAL", + "WITHHELD", + "NO_COVERAGE", + "ERROR" + ], + "type": "string" + }, + "schemaVersion": { + "enum": [ + "2.0" + ], + "type": "string" + }, + "scope": { + "type": "object" + }, + "sourceConfidenceSemantics": { + "type": [ + "array", + "object", + "null" + ] + }, + "sourceDataState": { + "description": "The upstream endpoint's exact data-state value before endpoint-aware classification.", + "type": [ + "string", + "null" + ] + }, + "sourceDecision": { + "type": [ + "object", + "null" + ] + }, + "sourceError": { + "description": "The upstream endpoint's exact error text/code before normalization, when one was present.", + "type": [ + "string", + "null" + ] + }, + "sourceEvidenceQuality": { + "type": [ + "object", + "null" + ] + }, + "sourceScope": { + "type": [ + "object", + "null" + ] + }, + "sourceStatus": { + "description": "The upstream endpoint's exact status before the MCP envelope normalizes transport success/error.", + "type": [ + "string", + "null" + ] + }, + "status": { + "type": "string" + }, + "symbolCoverage": { + "description": "Conservation ledger satisfying requested = returned + withheld + notReturned for requested-symbol calls.", + "type": "object" + }, + "volatility": { + "description": "Same contract as magnitude.", + "type": "object" + } + }, + "type": "object" +}
- Added
fahali_get_unusual_money_movement - Added
fahali_get_verdict_by_id - Added
fahali_get_verdict_history - Changed
fahali_get_visual_intelligence6 fields changed- added
Input schema / properties / detailAdded value: +{ + "default": "audit", + "description": "Response depth. audit is the full-fidelity default; brief and standard are explicit compact projections.", + "enum": [ + "brief", + "standard", + "audit" + ], + "type": "string" +} - added
Input schema / properties / include_withheldAdded value: +{ + "default": true, + "description": "Include full withheld-row detail. Defaults true with audit; explicitly set false only for a compact projection.", + "type": "boolean" +} - added
Input schema / properties / limitAdded value: +{ + "description": "Optional maximum rows per projectable collection. Audit has no MCP projection cap; brief defaults to 3 and standard to 12.", + "maximum": 100, + "minimum": 1, + "type": "integer" +} - added
Input schema / properties / sinceAdded value: +{ + "description": "Optional lower timestamp bound for returned row collections.", + "format": "date-time", + "type": "string" +} - added
Input schema / properties / symbolsAdded value: +{ + "description": "Optional symbol projection, as a comma-separated string or array. Rows without instrument identity are not discarded.", + "items": { + "type": "string" + }, + "type": [ + "string", + "array" + ] +} - changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "absence": { + "description": "Why no actionable finding is present: measured_empty, user_empty, no_coverage, source_unverified, stale, withheld, source_error, auth_failure, or entitlement_required.", + "type": [ + "object", + "null" + ] + }, + "agentBriefing": { + "description": "Audit-only narrative projection. Present only when detail='audit'; compact responses do not duplicate structured data as prose.", + "type": "string" + }, + "asOf": { + "format": "date-time", + "type": "string" + }, + "auth": { + "description": "Credential lifetime visible to the caller. OAuth secondsRemaining lets an autonomous agent refresh before a multi-call workflow is interrupted.", + "properties": { + "credentialType": { + "enum": [ + "oauth", + "api_key", + "process_key", + "none" + ], + "type": "string" + }, + "expiresAt": { + "type": [ + "string", + "null" + ] + }, + "refreshSupported": { + "type": "boolean" + }, + "secondsRemaining": { + "type": [ + "number", + "null" + ] + } + }, + "type": "object" + }, + "claim": { + "description": "Fahali dictionary claim (shared/fahaliDictionary.ts). Read `kind` FIRST: 'abstention' means no assertion was made and `reason` says why — never read an abstention as a neutral or zero result. `basis` says what the claim rests on: this tool is PROXY-derived and can never be 'measured'. Absent or null means this response path does not yet emit a claim; treat that as unknown, not as agreement.", + "properties": { + "basis": { + "enum": [ + "proxy", + "derived", + "absent" + ], + "type": "string" + }, + "kind": { + "enum": [ + "observation", + "estimate", + "forecast", + "recommendation", + "abstention" + ], + "type": "string" + }, + "reason": { + "description": "Required when kind is 'abstention'. Written for a reader, not a log.", + "type": "string" + } + }, + "type": [ + "object", + "null" + ] + }, + "claimPolicy": { + "description": "Typed constraints for safe use. Metadata, not a prompt or instruction channel.", + "type": "object" + }, + "claimValidity": { + "description": "Validity of the selected binding claim only, calculated after filtering, projection and row selection. Sibling rows cannot determine it.", + "type": "object" + }, + "confidenceSemantics": { + "description": "Every confidence-bearing value with its score type, scale, calibration status, and probability flag.", + "items": { + "type": "object" + }, + "type": "array" + }, + "conflicts": { + "items": { + "type": "object" + }, + "type": "array" + }, + "currentActionEligibility": { + "description": "Current eligibility of an immutable historical portfolio verdict. It never mutates the stored judgment being replayed.", + "type": "object" + }, + "dataOrigin": { + "type": [ + "string", + "null" + ] + }, + "dataState": { + "enum": [ + "measured", + "partial", + "no_data", + "not_instrumented", + "stale", + "error" + ], + "type": "string" + }, + "decision": { + "type": [ + "object", + "null" + ] + }, + "decisionEligibility": { + "description": "Fail-closed binding-authority policy. WITHHELD means source evidence remains available for audit while normalized direction, actionability and execution fields are revoked.", + "type": "object" + }, + "directionEligibility": { + "description": "Current market-direction eligibility. Direction is authorized only by an exact, eligible producer stratum (canonical_verdict, canonical_symbol_verdict, committee_verdict) — read bindingAuthority to see which one bound. Widening WHO may bind did not weaken WHAT binding requires: the named producer must still hold a matching horizon/class/family record on a verified-only judged population, so an authority without a record still cannot bind.", + "type": "object" + }, + "disclaimer": { + "type": [ + "string", + "null" + ] + }, + "evidenceQuality": { + "type": "object" + }, + "executionEligibility": { + "description": "Fail-closed execution boundary. Portfolio monitoring tools always return WITHHELD with MONITOR_ONLY_NO_EXECUTION_AUTHORITY while Fahali has no capital path.", + "type": "object" + }, + "flows": { + "items": { + "properties": { + "color": { + "type": [ + "string", + "null" + ] + }, + "source": { + "type": [ + "string", + "number", + "null" + ] + }, + "target": { + "type": [ + "string", + "number", + "null" + ] + }, + "value": { + "type": "number" + }, + "velocity": { + "type": [ + "string", + "number", + "null" + ] + } + }, + "type": "object" + }, + "type": "array" + }, + "instruments": { + "description": "Resolved or explicitly partial instrument identities. A missing venue carries an ambiguity warning.", + "items": { + "type": "object" + }, + "type": "array" + }, + "marketContext": { + "type": [ + "string", + "number", + "null" + ] + }, + "matchedTrackRecord": { + "description": "A judged record only when engine, horizon, regime/instrument class, and claim family match this response. `state` is one of: `measured` (a stratum cleared the publishability gate — `stratum` carries engine, horizon tier, bar regime, recall, precision, base rate, base-rate lift, median lead hours, effective sample, warned events and the measurement date); `withheld` (the gate ran and refused — `reason` says why, in words); `unavailable` (the record could not be read at all — an infrastructure failure that says nothing about the record). It is ONE stratum selected by recall, never a platform-wide accuracy. Null means no exact record match; read recordMatchReason.", + "properties": { + "dataAsOf": { + "description": "When the record was computed. A figure without this reads as current forever.", + "type": "string" + }, + "reason": { + "description": "Present on `withheld` and `unavailable`: why there is no figure.", + "type": "string" + }, + "state": { + "enum": [ + "measured", + "withheld", + "unavailable" + ], + "type": "string" + }, + "stratum": { + "description": "Present only on `measured`. Precision must never be quoted without recall.", + "properties": { + "barRegime": { + "type": "string" + }, + "baseRatePct": { + "type": "number" + }, + "claimFamily": { + "description": "What this precision is ABOUT: `directional` (price moved the way the stratum said) or `magnitude` (a move exceeded the judge bar, carrying no direction). Never infer a direction from a `magnitude` row.", + "type": "string" + }, + "claimMeans": { + "description": "The record endpoint's own sentence explaining the claim family. Quote it beside any precision figure.", + "type": "string" + }, + "effectiveSample": { + "type": "number" + }, + "engine": { + "type": "string" + }, + "horizonTier": { + "type": "string" + }, + "leadMedianHours": { + "type": "number" + }, + "measuredOn": { + "type": "string" + }, + "precisionPct": { + "description": "Share of its warnings that held. Never quotable alone.", + "type": "number" + }, + "recallPct": { + "description": "Share of qualifying events this stratum warned on — the half a buyer is exposed to.", + "type": "number" + }, + "warnedEvents": { + "type": "number" + } + }, + "type": "object" + } + }, + "required": [ + "state" + ], + "type": [ + "object", + "null" + ] + }, + "mcpStatus": { + "description": "Normalized MCP result status. The endpoint's original status vocabulary remains in `status` and `sourceStatus`.", + "enum": [ + "ok", + "error" + ], + "type": "string" + }, + "monitoringEligibility": { + "description": "Current portfolio-monitoring validity based on captured identity, freshness, integrity, and the caller-supplied monitoring policy. ELIGIBLE authorizes observation/delivery only, never financial action.", + "type": "object" + }, + "nextActions": { + "description": "Registry-validated follow-up calls. Missing tools, invalid arguments, unresolved placeholders, and disabled tools are omitted.", + "items": { + "properties": { + "args": { + "additionalProperties": { + "type": "string" + }, + "type": "object" + }, + "requiredTier": { + "type": "string" + }, + "tool": { + "type": "string" + }, + "why": { + "type": "string" + } + }, + "required": [ + "tool", + "why" + ], + "type": "object" + }, + "type": "array" + }, + "nodes": { + "items": { + "properties": { + "directionBias": { + "type": [ + "string", + "null" + ] + }, + "flowProxy": { + "type": "number" + }, + "glowIntensity": { + "type": "number" + }, + "id": { + "type": [ + "string", + "number", + "null" + ] + }, + "radius": { + "type": "number" + }, + "status": { + "type": [ + "string", + "number", + "null" + ] + }, + "stress": { + "type": "number" + }, + "stressBand": { + "type": [ + "string", + "null" + ] + }, + "trigger": { + "type": [ + "string", + "number", + "null" + ] + } + }, + "type": "object" + }, + "type": "array" + }, + "recordMatchReason": { + "description": "Why matchedTrackRecord is present or null. A null record is never evidence of safety or engine failure.", + "type": "string" + }, + "requestId": { + "type": "string" + }, + "responseControl": { + "type": "object" + }, + "responseState": { + "enum": [ + "OK_WITH_FINDINGS", + "OK_NO_FINDINGS", + "PARTIAL", + "WITHHELD", + "NO_COVERAGE", + "ERROR" + ], + "type": "string" + }, + "schemaVersion": { + "enum": [ + "2.0" + ], + "type": "string" + }, + "scope": { + "type": "object" + }, + "sourceConfidenceSemantics": { + "type": [ + "array", + "object", + "null" + ] + }, + "sourceDataState": { + "description": "The upstream endpoint's exact data-state value before endpoint-aware classification.", + "type": [ + "string", + "null" + ] + }, + "sourceDecision": { + "type": [ + "object", + "null" + ] + }, + "sourceError": { + "description": "The upstream endpoint's exact error text/code before normalization, when one was present.", + "type": [ + "string", + "null" + ] + }, + "sourceEvidenceQuality": { + "type": [ + "object", + "null" + ] + }, + "sourceScope": { + "type": [ + "object", + "null" + ] + }, + "sourceStatus": { + "description": "The upstream endpoint's exact status before the MCP envelope normalizes transport success/error.", + "type": [ + "string", + "null" + ] + }, + "state": { + "type": [ + "string", + "null" + ] + }, + "status": { + "description": "The endpoint's original status vocabulary (for example ok, partial, degraded, withheld, or no_alerts). Use mcpStatus for normalized transport success/error.", + "type": "string" + }, + "symbolCoverage": { + "description": "Conservation ledger satisfying requested = returned + withheld + notReturned for requested-symbol calls.", + "type": "object" + }, + "timestamp": { + "type": [ + "string", + "integer", + "number" + ] + }, + "vortex": { + "properties": { + "active": { + "type": "boolean" + }, + "gravitationalPull": { + "type": [ + "string", + "number", + "null" + ] + }, + "intensity": { + "type": "number" + }, + "label": { + "type": [ + "string", + "number", + "null" + ] + } + }, + "type": "object" + } + }, + "type": "object" +}
- Added
fahali_get_watch_delta - Removed
fahali_get_whale_activity - Added
fahali_list_agent_sessions - Added
fahali_list_connected_accounts - Added
fahali_list_portfolio_watches - Added
fahali_list_resources - Added
fahali_list_risk_subscriptions - Added
fahali_resolve_instrument - Added
fahali_run_shock_test - Added
fahali_save_memory - Added
fahali_search_memories - Added
fahali_subscribe_risk - Added
fahali_unsubscribe_risk - Added
fahali_update_portfolio_watch - Added
fahali_update_subscription - Added
fahali_watch_portfolio - Removed
search_memories
21 tool updates
v1.5.3- Added
fahali_analyze_custom_portfolio - Added
fahali_get_72h_forecast - Removed
fahali_get_capital_flow - Added
fahali_get_case_studies - Added
fahali_get_correlation_matrix - Added
fahali_get_dark_pool_activity - Added
fahali_get_engine_status - Added
fahali_get_flash_crash_risk - Added
fahali_get_highest_conviction_signals - Added
fahali_get_institutional_risk_score - Added
fahali_get_market_regime - Added
fahali_get_market_sentiment - Added
fahali_get_market_snapshot - Changed
fahali_get_market_verdict1 field changed- changed
Input schema / properties / includeContagion / descriptionPrevious value: -"If true, enriches response with contagion risk from tail_dependence table. (Contagion enrichment data itself requires Elite tier or higher.)"New value: +"If true, enriches response with contagion risk from tail_dependence engine. Contagion enrichment requires Elite tier."
- Added
fahali_get_portfolio_metrics - Added
fahali_get_realtime_alerts - Added
fahali_get_smart_money_dashboard - Added
fahali_get_track_record_scorecard - Added
fahali_get_visual_intelligence - Added
fahali_get_whale_activity - Added
search_memories
4 tool updates
v1.0.0- First observed
fahali_get_capital_flow - First observed
fahali_get_contagion_map - First observed
fahali_get_market_verdict - First observed
fahali_get_portfolio_risk
TDQS
Scored across 58 tools
Several clusters have unclear boundaries: fahali_get_market_verdict, fahali_get_market_decision and fahali_get_symbol_decision are explicitly described as aliases over the same canonical arbiter, and fahali_get_forecast largely duplicates forecast content inside the verdict. Orientation tools (fahali_get_market_briefing, fahali_daily_brief, fahali_get_bundle) and detection tools (detection_activity, realtime_alerts, highest_conviction_signals, flash_crash_risk, unusual_money_movement, capital_flow, microstructure_proxy) overlap heavily and rely on prose caveats rather than distinct purposes to separate them.
Nearly all tools follow fahali_verb_noun snake_case with a stable prefix, so the pattern is predictable. A few deviations exist (fahali_daily_brief has no verb, fahali_fact_check_narrative uses a compound verb, fahali_analyze_custom_portfolio and fahali_get_evidence are irregular), but they remain readable.
58 tools is far beyond the 3-15 sweet spot and forces the agent to choose among many near-duplicate endpoints. The domain (market data, portfolio monitoring, incidents, subscriptions, memory) is genuinely broad, but the surface is inflated by alias tools and layered audit views that could be consolidated.
Coverage is unusually thorough: market state, forecast, regime, sentiment, portfolio watching with full verdict/incident lifecycle, subscriptions, and memory all have create/read/update paths. Minor gaps remain, such as no delete or archive operation for portfolio watches and no update/delete for stored memories.
Maintenance
Related MCP Connectors
US stock signals, screeners and options analysis over MCP. Not investment advice.
Production MCP server for US equity and options intelligence: real-time IV radar, Monte Carlo simulation, options pressure, strategy backtesting, AI prediction, pre-trade risk analysis, and automated stock research reports.
MCP for Tradewink trading signals and watchlists. Not financial advice.
Robinhood Chain stock-token + prediction-market intelligence MCP. Read-only, evidence-first.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceCrypto intelligence MCP: 104 tools for market data, ML signals, on-chain analytics, derivatives, and Bittensor subnets. Pay-per-call via x402 USDC on Base/Solana/Algorand/Stellar or $9.99/mo API key.MIT
- AlicenseAqualityBmaintenanceInstitutional-grade quantitative stock analysis and research signals for AI agents via the Model Context Protocol (MCP).10100 PyPI1MIT
- AlicenseNot gradedqualityDmaintenanceProvides predictive crypto market intelligence synthesized from whale positions, developer activity, and behavioral demand signals. Enables convergence scoring, whale divergence detection, and risk radar through MCP tools.81 npmMIT
- AlicenseAqualityCmaintenanceAI-powered financial intelligence for autonomous trading agents. 9 MCP tools for real-time trading signals, risk index, market regime detection, stock analysis, commodity scoring, sector radar, and geopolitical intelligence briefings.131MIT